ZGlmZiAtLWdpdCBhL0NWU1JPT1QvY2hlY2tvdXRsaXN0IGIvQ1ZTUk9PVC9jaGVja291dGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjY1ODMuLjAwMDAwMDAKLS0tIGEvQ1ZTUk9PVC9jaGVja291dGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRoZSAiY2hlY2tvdXRsaXN0IiBmaWxlIGlzIHVzZWQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHZlcnNpb24gY29udHJvbGxlZAotIyBhZG1pbmlzdHJhdGl2ZSBmaWxlcyBpbiAkQ1ZTUk9PVC9DVlNST09ULCBzdWNoIGFzIHRlbXBsYXRlIGZpbGVzLgotIwotIyBUaGUgZmlyc3QgZW50cnkgb24gYSBsaW5lIGlzIGEgZmlsZW5hbWUgd2hpY2ggd2lsbCBiZSBjaGVja2VkIG91dCBmcm9tCi0jIHRoZSBjb3JyZXNwb25kaW5nIFJDUyBmaWxlIGluIHRoZSAkQ1ZTUk9PVC9DVlNST09UIGRpcmVjdG9yeS4KLSMgVGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZSBpcyBhbiBlcnJvciBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgZmlsZSBjYW5ub3QKLSMgYmUgY2hlY2tlZCBvdXQuCi0jCi0jIEZpbGUgZm9ybWF0OgotIwotIwlbPHdoaXRlc3BhY2U+XTxmaWxlbmFtZT48d2hpdGVzcGFjZT48ZXJyb3IgbWVzc2FnZT48ZW5kLW9mLWxpbmU+Ci0jCi0jIGNvbW1lbnQgbGluZXMgYmVnaW4gd2l0aCAnIycKLXBhc3N3ZAotbG9nX2FjY3VtLmNvbmYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DVlNST09UL2NvbW1pdGluZm8gYi9DVlNST09UL2NvbW1pdGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlY2JhNzkuLjAwMDAwMDAKLS0tIGEvQ1ZTUk9PVC9jb21taXRpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBUaGUgImNvbW1pdGluZm8iIGZpbGUgaXMgdXNlZCB0byBjb250cm9sIHByZS1jb21taXQgY2hlY2tzLgotIyBUaGUgZmlsdGVyIG9uIHRoZSByaWdodCBpcyBpbnZva2VkIHdpdGggdGhlIHJlcG9zaXRvcnkgYW5kIGEgbGlzdCAKLSMgb2YgZmlsZXMgdG8gY2hlY2suICBBIG5vbi16ZXJvIGV4aXQgb2YgdGhlIGZpbHRlciBwcm9ncmFtIHdpbGwgCi0jIGNhdXNlIHRoZSBjb21taXQgdG8gYmUgYWJvcnRlZC4KLSMKLSMgVGhlIGZpcnN0IGVudHJ5IG9uIGEgbGluZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB0ZXN0ZWQKLSMgYWdhaW5zdCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlIGNoYW5nZSBpcyBiZWluZyBjb21taXR0ZWQgdG8sIHJlbGF0aXZlCi0jIHRvIHRoZSAkQ1ZTUk9PVC4gIEZvciB0aGUgZmlyc3QgbWF0Y2ggdGhhdCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVtYWluZGVyCi0jIG9mIHRoZSBsaW5lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgdG8gcnVuLgotIwotIyBJZiB0aGUgcmVwb3NpdG9yeSBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGlzCi0jIGZpbGUsIHRoZSAiREVGQVVMVCIgbGluZSBpcyB1c2VkLCBpZiBpdCBpcyBzcGVjaWZpZWQuCi0jCi0jIElmIHRoZSBuYW1lICJBTEwiIGFwcGVhcnMgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gaXQgaXMgYWx3YXlzIHVzZWQKLSMgaW4gYWRkaXRpb24gdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHJlZ2V4IG9yICJERUZBVUxUIi4KLSMgQmVhdXRpZnVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvQ1ZTUk9PVC9kYW1hZ2Vjb250cm9sLWdyb292eS5jb25mIGIvQ1ZTUk9PVC9kYW1hZ2Vjb250cm9sLWdyb292eS5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNmYzYyLi4wMDAwMDAwCi0tLSBhL0NWU1JPT1QvZGFtYWdlY29udHJvbC1ncm9vdnkuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHJvamVjdF9uYW1lOiBHcm9vdnkKLXNjbV9zcGVjOiAiOmV4dDpkY29udHJvbEBsb2NhbGhvc3Q6L2hvbWUvcHJvamVjdHMvZ3Jvb3Z5L3NjbTpncm9vdnkvZ3Jvb3Z5LWNvcmUiCi1idWlsZF9jb21tYW5kX2xpbmU6ICJtYXZlbiBkYyIKLW5hZ19lbWFpbDogZ3Jvb3Z5LWRldkBncm9vdnkuY29kZWhhdXMub3JnCi0uLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DVlNST09UL2RjdHJpZ2dlci5yYiBiL0NWU1JPT1QvZGN0cmlnZ2VyLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU0NWE1Li4wMDAwMDAwCi0tLSBhL0NWU1JPT1QvZGN0cmlnZ2VyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcmVxdWlyZSAneG1scnBjL2NsaWVudCcKLQotdXJsID0gQVJHVlswXQotcHJvamVjdF9uYW1lID0gQVJHVlsxXQotCi1wdXRzICJOdWRnaW5nIERhbWFnZUNvbnRyb2wgb24gI3t1cmx9IHRvIGJ1aWxkIHByb2plY3QgI3twcm9qZWN0X25hbWV9IgotY2xpZW50ID0gWE1MUlBDOjpDbGllbnQubmV3Mih1cmwpCi1idWlsZCA9IGNsaWVudC5wcm94eSgiYnVpbGQiKQotcmVzdWx0ID0gYnVpbGQudHJpZyhwcm9qZWN0X25hbWUsIFRpbWUubm93LnV0Yy5zdHJmdGltZSgiJVklbSVkJUglTSVTIikpCi1wdXRzIHJlc3VsdApkaWZmIC0tZ2l0IGEvQ1ZTUk9PVC9lZGl0aW5mbyBiL0NWU1JPT1QvZWRpdGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODg4NmMuLjAwMDAwMDAKLS0tIGEvQ1ZTUk9PVC9lZGl0aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgVGhlICJlZGl0aW5mbyIgZmlsZSBpcyB1c2VkIHRvIGFsbG93IHZlcmlmaWNhdGlvbiBvZiBsb2dnaW5nCi0jIGluZm9ybWF0aW9uLiAgSXQgd29ya3MgYmVzdCB3aGVuIGEgdGVtcGxhdGUgKGFzIHNwZWNpZmllZCBpbiB0aGUKLSMgcmNzaW5mbyBmaWxlKSBpcyBwcm92aWRlZCBmb3IgdGhlIGxvZ2dpbmcgcHJvY2VkdXJlLiAgR2l2ZW4gYQotIyB0ZW1wbGF0ZSB3aXRoIGxvY2F0aW9ucyBmb3IsIGEgYnVnLWlkIG51bWJlciwgYSBsaXN0IG9mIHBlb3BsZSB3aG8KLSMgcmV2aWV3ZWQgdGhlIGNvZGUgYmVmb3JlIGl0IGNhbiBiZSBjaGVja2VkIGluLCBhbmQgYW4gZXh0ZXJuYWwKLSMgcHJvY2VzcyB0byBjYXRhbG9nIHRoZSBkaWZmZXJlbmNlcyB0aGF0IHdlcmUgY29kZSByZXZpZXdlZCwgdGhlCi0jIGZvbGxvd2luZyB0ZXN0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBjb2RlOgotIwotIyAgIE1ha2luZyBzdXJlIHRoYXQgdGhlIGVudGVyZWQgYnVnLWlkIG51bWJlciBpcyBjb3JyZWN0LgotIyAgIFZhbGlkYXRpbmcgdGhhdCB0aGUgY29kZSB0aGF0IHdhcyByZXZpZXdlZCBpcyBpbmRlZWQgdGhlIGNvZGUgYmVpbmcKLSMgICAgICAgY2hlY2tlZCBpbiAodXNpbmcgdGhlIGJ1Zy1pZCBudW1iZXIgb3IgYSBzZXBlcmF0ZSByZXZpZXcKLSMgICAgICAgbnVtYmVyIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBjb2RlIHNldC4pLgotIwotIyBJZiBhbnkgb2YgdGhlIGFib3ZlIHRlc3QgZmFpbGVkLCB0aGVuIHRoZSBjb21taXQgd291bGQgYmUgYWJvcnRlZC4KLSMKLSMgQWN0aW9ucyBzdWNoIGFzIG1haWxpbmcgYSBjb3B5IG9mIHRoZSByZXBvcnQgdG8gZWFjaCByZXZpZXdlciBhcmUKLSMgYmV0dGVyIGhhbmRsZWQgYnkgYW4gZW50cnkgaW4gdGhlIGxvZ2luZm8gZmlsZS4KLSMKLSMgT25lIHRoaW5nIHRoYXQgc2hvdWxkIGJlIG5vdGVkIGlzIHRoZSB0aGUgQUxMIGtleXdvcmQgaXMgbm90Ci0jIHN1cHBvcnRlZC4gIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBlbnRyeSB0aGF0IG1hdGNoZXMgYSBnaXZlbgotIyByZXBvc2l0b3J5LgpkaWZmIC0tZ2l0IGEvQ1ZTUk9PVC9sb2dfYWNjdW0uY29uZiBiL0NWU1JPT1QvbG9nX2FjY3VtLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDNlYjAuLjAwMDAwMDAKLS0tIGEvQ1ZTUk9PVC9sb2dfYWNjdW0uY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMgVGhlICJsb2dfYWNjdW0uY29uZiIgZmlsZSBvdmVycmlkZXMgdGhlIHRoZSBkZWZhdWx0cyBoYXJkLWNvZGVkIGluCi0jIHRoZSAibG9nX2FjY3VtLnBsIiBzY3JpcHQgYWxsb3dpbmcgYWRtaW5zIHRvIHNldHVwIHRoZSBsb2dfYWNjdW0ucGwKLSMgb25jZSBhcyBleGVjdXRhYmxlLCBidXQgbm90IHdyaXRhYmxlLiAgRWFjaCBwcm9qZWN0IGNhbiB0aGVuIGhhdmUKLSMgaXQncyBvd24gImxvZ19hY2N1bS5jb25mIiB0byBjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGVpciBvd24KLSMgY3ZzIGNvbW1pdCBtZXNzYWdlcy4KLQotCi0jIE1BSUwgVE8KLSMKLSMgV2hlbiBzZXQsIHNwZWNpZmllcyB0aGUgZW1haWwgYWRkcmVzcyhlcykgdG8KLSMgcmVjZWl2ZSBjb21taXQgbWVzc2FnZXMuIFdoZW4gbGVmdCB1bnNldCwgdGhlCi0jIHNjcmlwdCB3aWxsIGF0dGVtcHQgdG8gZ3Vlc3MgdGhlIGNvcnJlY3QKLSMgbWFpbGluZyBsaXN0IHVzaW5nIHRoZSByZXBvc2l0b3J5IG5hbWUgYW5kCi0jIHRoZSBNTElTVEhPU1Qgb3B0aW9uLgotIwotTUFJTF9UTyA9IHNjbUBncm9vdnkuY29kZWhhdXMub3JnCi0KLSMgTUFJTCBGUk9NCi0jCi0jIFdoZW4gc2V0LCBzcGVjaWZpZXMgdGhlIGVtYWlsIGFkZHJlc3MgdGhhdAotIyBhbGwgY29tbWl0IG1lc3NhZ2VzIHdpbGwgYmUgc2VudCBmcm9tLgotIyBWZXJ5IHVzZWZ1bGwgZm9yIHNldHRpbmcgdXAgYSAibm8gcmVwbHkiCi0jIGFkZHJlc3MgZm9yIGNvbW1pdCBtZXNzYWdlcy4KLSMKLSMgV2hlbiBub3Qgc2V0LCB0aGUgc2NyaXB0IHdpbGwgZ3Vlc3MgdGhlIHNlbmRlcidzCi0jIGFkZHJlc3MgYnkgcHJlZml4aW5nIHRoZSBjdnMgdXNlcidzIG5hbWUgdG8gdGhlCi0jIE1MSVNUSE9TVCBvcHRpb24uCi0jCi0jTUFJTF9GUk9NID0gbm9yZXBseUBjb2RlaGF1cy5vcmcKLQotIyBNQUlMIEhPU1QgQUREUkVTUwotIwotIyBUaGUgaG9zdCBhZGRyZXNzIHRvIHVzZSB3aGVuIGd1ZXNzaW5nIGVpdGhlcgotIyB0aGUgVE8gb3IgRlJPTSBhZGRyZXNzZXMuCi0jTUxJU1RIT1NUID0gY29kZWhhdXMub3JnCi0KLSMgWC1TRU5ERVIgRU1BSUwgSEVBREVSCi0jCi0jIFdoZW4gc3BlY2lmaWVkLCBhZGRzIGFuIFgtU2VuZGVyIGhlYWRlciB0byB0aGUKLSMgZW1haWxzIHNlbnQgc28gdGhhdCB1c2VycyBjYW4gdXNlIGl0IHRvIG1vcmUKLSMgZWFzaWx5IGZpbHRlciBvdXQgY3ZzIG1lc3NhZ2VzLiAgVGhpcyBpcyB2ZXJ5Ci0jIG5pY2UgZm9yIHdoZW4gdGhlcmUgaXMgbm8gbWFpbGluZyBsaXN0Ci0jIGRlZGljYXRlZCB0byBjdnMgY29tbWl0IG1lc3NhZ2VzLgotIwotWFNFTkRFUiAgICAgICA9IEdyb292eS1DVlMKLQotIyBSRVBMWS1UTyBFTUFJTCBBRERSRVNTCi0jCi0jIFdoZW4gUkVQTFlUTyBpcyBzZXQgYW4gU01UUCAiUmVwbHktVG8iIGVtYWlsCi0jIGhlYWRlciB3aWxsIGJlIGFkZGVkLiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bAotIyBmb3Iga2VlcGluZyBkZXZlbG9wbWVudCBkaXNjdXNzaW9uIG9uIGEKLSMgZGV2IGxpc3QgZXZlbiB3aGVuIGN2cyBtZXNzYWdlcyBnbyBhIGN2cyBsaXN0LgotIwotUkVQTFlUTyA9IGRldkBncm9vdnkuY29kZWhhdXMub3JnCi0KLSMgU1VCSkVDVCBQUkVGSVgKLSMKLSMgVGhpcyB0ZXh0LCBwbHVzIGEgc3BhY2UsIHdpbGwgYmUgcHJlcGVuZGVkCi0jIHRvIHRoZSBzdWJqZWN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlLgotIyBXaGVuIHRoZSBvcHRpb24gc3BlY2lmaWVkIHdpdGggbm8gdmFsdWUsIG5vCi0jIHByZWZpeCB3aWxsIGJlIHVzZWQuCi0jCi1TVUJKRUNUX1BSRUZJWCA9Ci0KLSMgTUVTU0FHRSBTSVpFIExJTUlUCi0jCi0jIElmIHRoZSBkZWx0YSBpbmZvIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQsIG5vIGRpZmYgd2lsbCBiZQotIyBtYWlsZWQvbG9nZ2VkOyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGlzLCBVUkxzIHBvaW50aW5nCi0jIHRvIHRoZSBjb3JyZXNwb25kaW5nIFZpZXdDVlMgZGlmZnMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBhbmQKLSMgaW5jbHVkZWQgaW4gdGhlIG1haWwvbG9nIG1lc3NhZ2UuCi0jCi0jIDAgPSBubyB0cmVzaG9sZCwgdW5saW1pdGVkIGRpZmZzCi0jIHggPSBtYXhpbXVtIHNpemUgb2YgdGhlIGRpZmYgaW4ga2IKLSMKLSNTSVpFTElNSVQgPSAxMDA7Ci0KLSMgVklFV0NWUyBVUkwKLSMKLSMgU3BlY2lmeSBoZXJlIHRoZSBVUkwgdG8gVmlld0NWUyAod2l0aG91dCB0cmFpbGluZyBzbGFzaCEpCi0jIElmIGxlZnQgdW5zZXQsIHRoZSBzY3JpcHQgd2lsbCBhdHRlbXB0IHRvIGd1ZXNzIHRoZSBjb3JyZWN0Ci0jIHZhbHVlLgotIwotVklFV0NWUyA9ICJodHRwOi8vY3ZzLmdyb292eS5jb2RlaGF1cy5vcmcvZ3Jvb3Z5IjsKZGlmZiAtLWdpdCBhL0NWU1JPT1QvbW9kdWxlcyBiL0NWU1JPT1QvbW9kdWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5ZTllZi4uMDAwMDAwMAotLS0gYS9DVlNST09UL21vZHVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIFRocmVlIGRpZmZlcmVudCBsaW5lIGZvcm1hdHMgYXJlIHZhbGlkOgotIwlrZXkJLWEgICAgYWxpYXNlcy4uLgotIwlrZXkgW29wdGlvbnNdIGRpcmVjdG9yeQotIwlrZXkgW29wdGlvbnNdIGRpcmVjdG9yeSBmaWxlcy4uLgotIwotIyBXaGVyZSAib3B0aW9ucyIgYXJlIGNvbXBvc2VkIG9mOgotIwktaSBwcm9nCQlSdW4gInByb2ciIG9uICJjdnMgY29tbWl0IiBmcm9tIHRvcC1sZXZlbCBvZiBtb2R1bGUuCi0jCS1vIHByb2cJCVJ1biAicHJvZyIgb24gImN2cyBjaGVja291dCIgb2YgbW9kdWxlLgotIwktZSBwcm9nCQlSdW4gInByb2ciIG9uICJjdnMgZXhwb3J0IiBvZiBtb2R1bGUuCi0jCS10IHByb2cJCVJ1biAicHJvZyIgb24gImN2cyBydGFnIiBvZiBtb2R1bGUuCi0jCS11IHByb2cJCVJ1biAicHJvZyIgb24gImN2cyB1cGRhdGUiIG9mIG1vZHVsZS4KLSMJLWQgZGlyCQlQbGFjZSBtb2R1bGUgaW4gZGlyZWN0b3J5ICJkaXIiIGluc3RlYWQgb2YgbW9kdWxlIG5hbWUuCi0jCS1sCQlUb3AtbGV2ZWwgZGlyZWN0b3J5IG9ubHkgLS0gZG8gbm90IHJlY3Vyc2UuCi0jCi0jIE5PVEU6ICBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGUgIlJ1biIgb3B0aW9ucyBhYm92ZSwgeW91J2xsIGhhdmUgdG8KLSMgcmVsZWFzZSBhbmQgcmUtY2hlY2tvdXQgYW55IHdvcmtpbmcgZGlyZWN0b3JpZXMgb2YgdGhlc2UgbW9kdWxlcy4KLSMKLSMgQW5kICJkaXJlY3RvcnkiIGlzIGEgcGF0aCB0byBhIGRpcmVjdG9yeSByZWxhdGl2ZSB0byAkQ1ZTUk9PVC4KLSMKLSMgVGhlICItYSIgb3B0aW9uIHNwZWNpZmllcyBhbiBhbGlhcy4gIEFuIGFsaWFzIGlzIGludGVycHJldGVkIGFzIGlmCi0jIGV2ZXJ5dGhpbmcgb24gdGhlIHJpZ2h0IG9mIHRoZSAiLWEiIGhhZCBiZWVuIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0jCi0jIFlvdSBjYW4gZW5jb2RlIGEgbW9kdWxlIHdpdGhpbiBhIG1vZHVsZSBieSB1c2luZyB0aGUgc3BlY2lhbCAnJicKLSMgY2hhcmFjdGVyIHRvIGludGVycG9zZSBhbm90aGVyIG1vZHVsZSBpbnRvIHRoZSBjdXJyZW50IG1vZHVsZS4gIFRoaXMKLSMgY2FuIGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYSBtb2R1bGUgdGhhdCBjb25zaXN0cyBvZiBtYW55IGRpcmVjdG9yaWVzCi0jIHNwcmVhZCBvdXQgb3ZlciB0aGUgZW50aXJlIHNvdXJjZSByZXBvc2l0b3J5LgpkaWZmIC0tZ2l0IGEvQ1ZTUk9PVC9ub3RpZnkgYi9DVlNST09UL25vdGlmeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhZTZmOS4uMDAwMDAwMAotLS0gYS9DVlNST09UL25vdGlmeQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgVGhlICJub3RpZnkiIGZpbGUgY29udHJvbHMgd2hlcmUgbm90aWZpY2F0aW9ucyBmcm9tIHdhdGNoZXMgc2V0IGJ5Ci0jICJjdnMgd2F0Y2ggYWRkIiBvciAiY3ZzIGVkaXQiIGFyZSBzZW50LiAgVGhlIGZpcnN0IGVudHJ5IG9uIGEgbGluZSBpcwotIyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlCi0jIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvLCByZWxhdGl2ZSB0byB0aGUgJENWU1JPT1QuICBJZiBpdCBtYXRjaGVzLAotIyB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgaXMgYSBmaWx0ZXIgcHJvZ3JhbSB0aGF0IHNob3VsZCBjb250YWluCi0jIG9uZSBvY2N1cnJlbmNlIG9mICVzIGZvciB0aGUgdXNlciB0byBub3RpZnksIGFuZCBpbmZvcm1hdGlvbiBvbiBpdHMKLSMgc3RhbmRhcmQgaW5wdXQuCi0jCi0jICJBTEwiIG9yICJERUZBVUxUIiBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgotIwotIyBGb3IgZXhhbXBsZToKLSNBTEwgbWFpbCAtcyAiQ1ZTIG5vdGlmaWNhdGlvbiIgJXMKZGlmZiAtLWdpdCBhL0NWU1JPT1QvcmNzaW5mbyBiL0NWU1JPT1QvcmNzaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllNTlmNC4uMDAwMDAwMAotLS0gYS9DVlNST09UL3Jjc2luZm8KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRoZSAicmNzaW5mbyIgZmlsZSBpcyB1c2VkIHRvIGNvbnRyb2wgdGVtcGxhdGVzIHdpdGggd2hpY2ggdGhlIGVkaXRvcgotIyBpcyBpbnZva2VkIG9uIGNvbW1pdCBhbmQgaW1wb3J0LgotIwotIyBUaGUgZmlyc3QgZW50cnkgb24gYSBsaW5lIGlzIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIGlzIHRlc3RlZAotIyBhZ2FpbnN0IHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgY2hhbmdlIGlzIGJlaW5nIG1hZGUgdG8sIHJlbGF0aXZlIHRvIHRoZQotIyAkQ1ZTUk9PVC4gIEZvciB0aGUgZmlyc3QgbWF0Y2ggdGhhdCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZQotIyBsaW5lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHRlbXBsYXRlLgotIwotIyBJZiB0aGUgcmVwb3NpdG9yeSBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGlzCi0jIGZpbGUsIHRoZSAiREVGQVVMVCIgbGluZSBpcyB1c2VkLCBpZiBpdCBpcyBzcGVjaWZpZWQuCi0jCi0jIElmIHRoZSBuYW1lICJBTEwiIGFwcGVhcnMgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gaXQgaXMgYWx3YXlzIHVzZWQKLSMgaW4gYWRkaXRpb24gdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHJlZ2V4IG9yICJERUZBVUxUIi4KZGlmZiAtLWdpdCBhL0NWU1JPT1QvdGFnaW5mbyBiL0NWU1JPT1QvdGFnaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0YTQ2ZC4uMDAwMDAwMAotLS0gYS9DVlNST09UL3RhZ2luZm8KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRoZSAidGFnaW5mbyIgZmlsZSBpcyB1c2VkIHRvIGNvbnRyb2wgcHJlLXRhZyBjaGVja3MuCi0jIFRoZSBmaWx0ZXIgb24gdGhlIHJpZ2h0IGlzIGludm9rZWQgd2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLSMKLSMgJDEgLS0gdGFnbmFtZQotIyAkMiAtLSBvcGVyYXRpb24gImFkZCIgZm9yIHRhZywgIm1vdiIgZm9yIHRhZyAtRiwgYW5kICJkZWwiIGZvciB0YWcgLWQKLSMgJDMgLS0gcmVwb3NpdG9yeQotIyAkNC0+ICBmaWxlIHJldmlzaW9uIFtmaWxlIHJldmlzaW9uIC4uLl0KLSMKLSMgQSBub24temVybyBleGl0IG9mIHRoZSBmaWx0ZXIgcHJvZ3JhbSB3aWxsIGNhdXNlIHRoZSB0YWcgdG8gYmUgYWJvcnRlZC4KLSMKLSMgVGhlIGZpcnN0IGVudHJ5IG9uIGEgbGluZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB0ZXN0ZWQKLSMgYWdhaW5zdCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlIGNoYW5nZSBpcyBiZWluZyBjb21taXR0ZWQgdG8sIHJlbGF0aXZlCi0jIHRvIHRoZSAkQ1ZTUk9PVC4gIEZvciB0aGUgZmlyc3QgbWF0Y2ggdGhhdCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVtYWluZGVyCi0jIG9mIHRoZSBsaW5lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgdG8gcnVuLgotIwotIyBJZiB0aGUgcmVwb3NpdG9yeSBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGlzCi0jIGZpbGUsIHRoZSAiREVGQVVMVCIgbGluZSBpcyB1c2VkLCBpZiBpdCBpcyBzcGVjaWZpZWQuCi0jCi0jIElmIHRoZSBuYW1lICJBTEwiIGFwcGVhcnMgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gaXQgaXMgYWx3YXlzIHVzZWQKLSMgaW4gYWRkaXRpb24gdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHJlZ2V4IG9yICJERUZBVUxUIi4KZGlmZiAtLWdpdCBhL0NWU1JPT1QvdmVyaWZ5bXNnIGIvQ1ZTUk9PVC92ZXJpZnltc2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Zjc0N2MuLjAwMDAwMDAKLS0tIGEvQ1ZTUk9PVC92ZXJpZnltc2cKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIFRoZSAidmVyaWZ5bXNnIiBmaWxlIGlzIHVzZWQgdG8gYWxsb3cgdmVyaWZpY2F0aW9uIG9mIGxvZ2dpbmcKLSMgaW5mb3JtYXRpb24uICBJdCB3b3JrcyBiZXN0IHdoZW4gYSB0ZW1wbGF0ZSAoYXMgc3BlY2lmaWVkIGluIHRoZQotIyByY3NpbmZvIGZpbGUpIGlzIHByb3ZpZGVkIGZvciB0aGUgbG9nZ2luZyBwcm9jZWR1cmUuICBHaXZlbiBhCi0jIHRlbXBsYXRlIHdpdGggbG9jYXRpb25zIGZvciwgYSBidWctaWQgbnVtYmVyLCBhIGxpc3Qgb2YgcGVvcGxlIHdobwotIyByZXZpZXdlZCB0aGUgY29kZSBiZWZvcmUgaXQgY2FuIGJlIGNoZWNrZWQgaW4sIGFuZCBhbiBleHRlcm5hbAotIyBwcm9jZXNzIHRvIGNhdGFsb2cgdGhlIGRpZmZlcmVuY2VzIHRoYXQgd2VyZSBjb2RlIHJldmlld2VkLCB0aGUKLSMgZm9sbG93aW5nIHRlc3QgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGNvZGU6Ci0jCi0jICAgTWFraW5nIHN1cmUgdGhhdCB0aGUgZW50ZXJlZCBidWctaWQgbnVtYmVyIGlzIGNvcnJlY3QuCi0jICAgVmFsaWRhdGluZyB0aGF0IHRoZSBjb2RlIHRoYXQgd2FzIHJldmlld2VkIGlzIGluZGVlZCB0aGUgY29kZSBiZWluZwotIyAgICAgICBjaGVja2VkIGluICh1c2luZyB0aGUgYnVnLWlkIG51bWJlciBvciBhIHNlcGVyYXRlIHJldmlldwotIyAgICAgICBudW1iZXIgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIGNvZGUgc2V0LikuCi0jCi0jIElmIGFueSBvZiB0aGUgYWJvdmUgdGVzdCBmYWlsZWQsIHRoZW4gdGhlIGNvbW1pdCB3b3VsZCBiZSBhYm9ydGVkLgotIwotIyBBY3Rpb25zIHN1Y2ggYXMgbWFpbGluZyBhIGNvcHkgb2YgdGhlIHJlcG9ydCB0byBlYWNoIHJldmlld2VyIGFyZQotIyBiZXR0ZXIgaGFuZGxlZCBieSBhbiBlbnRyeSBpbiB0aGUgbG9naW5mbyBmaWxlLgotIwotIyBPbmUgdGhpbmcgdGhhdCBzaG91bGQgYmUgbm90ZWQgaXMgdGhlIHRoZSBBTEwga2V5d29yZCBpcyBub3QKLSMgc3VwcG9ydGVkLiAgVGhlcmUgY2FuIGJlIG9ubHkgb25lIGVudHJ5IHRoYXQgbWF0Y2hlcyBhIGdpdmVuCi0jIHJlcG9zaXRvcnkuCmRpZmYgLS1naXQgYS9ncm9vdnkvLmN2c2lnbm9yZSBiL2dyb292eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ0NGQyLi4wMDAwMDAwCi0tLSBhL2dyb292eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1ncm9vdnkuaW1sCi1ncm9vdnkuaXByCi1ncm9vdnkuaXdzCmRpZmYgLS1naXQgYS9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9SRUFETUUgYi9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDljMjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLVRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGZvciBjb21waWxpbmcgR3Jvb3Z5IHRvIG5hdGl2ZSBjb2RlLgotCi1Hb2FsczoKLSAtIEJldHRlciBwZXJmb3JtYW5jZSAvIHJlZHVjZWQgb3ZlcmhlYWRzIChjcHUsIG1lbW9yeSwgc3RhcnQtdXAgdGltZSkuCi0gLSBBcHBlYWxpbmcgYWx0ZXJuYXRpdmUgdG8gUGVybC9QeXRob24vUnVieS9zaGVsbC1zY3JpcHRzLgotIC0gU2ltcGxlIGluc3RhbGwgKHNyYyB0YXJiYWxsLCBSUE0sIGRwa2csIHdpbmRvd3MgaW5zdGFsbGVyLCBPUy1YIHdoYXRldmVyKS4KLSAtIE5vIEpWTSByZXF1aXJlZC4KLSAtIEFiaWxpdHkgdG8gdXNlIEdyb292eSB0byBhY2Nlc3MgbGVzcyBKYXZhaXNoIGxpYnJhcmllcyAoUE9TSVh5IHN0dWZmLCBNRkMsIC5ORVQpLgotIC0gQWJpbGl0eSB0byB1c2UgR3Jvb3Z5IChhbmQgSmF2YSkgb2JqZWN0cyBmcm9tIG90aGVyIGxhbmd1YWdlcyAoQywgQysrLCBQZXJsLCBQeXRob24sIFJ1YnksIC5ORVQsIGV0YykKLQotV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50LiBJdCdzIGEgcHJvb2Ytb2YtY29uY2VwdC4gSXQgcHJvYmFibHkgd29uJ3Qgd29yay4gQnV0IG1heWJlIGl0IHdpbGwuCi0KLVRoZSBmaXJzdCBhdHRlbXB0IGF0IHRoaXMgcGFja2FnZSB1c2VzIHRoZSBHTlUgR0NKIGNvbXBpbGVyLiBUaGlzIGlzIGJ1aWx0IG9uIHRvcCBvZiBHQ0MgYW5kIGlzIAotYXZhaWxhYmxlIGZvciBVTklYeSBwbGF0Zm9ybXMgKGluY2x1ZGluZyBMaW51eCBhbmQgT1MtWCkgYW5kIFdpbmRvd3MgKHdpdGggQ3lnd2luKS4KLQotVGhlc2UgYXJlIHRoZSBmaXJzdCBzZXQgb2YgZ29hbHMgZm9yIHRoZSBleHBlcmltZW50LiAKLQotCi0KLSoqKiBHb2FsIDEgOiBOYXRpdmUgc3RhbmRhbG9uZSBleGVjdXRhYmxlIG9mIC5ncm9vdnkgZmlsZS4KLVtDb21wbGV0ZV0KLQotVGhlIGV4aXN0aW5nIEdyb292eSBjb21waWxlciAocnVubmluZyBvbiBhIEpWTSkgY2FuIGNvbXBpbGUgLmdyb292eSBmaWxlcyB0byAuY2xhc3MgZmlsZXMuCi1HQ0ogY2FuIHRoZW4gY29tcGlsZSB0aGVzZSAuY2xhc3MgZmlsZXMgdG8gLm8gYmluYXJ5IG9iamVjdHMuCi1HQ0ogY2FuIGxpbmsgdGhlc2Ugb2JqZWN0cyAodG9nZXRoZXIgd2l0aCBhIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSBHcm9vdnkgcnVudGltZSBsaWJyYXJ5KSBpbnRvIGEgCi1uYXRpdmUgZXhlY3V0YWJsZS4KLQotVGhlIGNoYWxsZW5nZSBpcyBidWlsZGluZyB0aGUgbmF0aXZlIHJ1bnRpbWUgbGlicmFyeS4gSW4gcGFydGljdWxhciwgaWRlbnRpZnlpbmcgaWYgdGhlIHJ1bnRpbWUgCi1ieXRlLWNvZGUgZ2VuZXJhdGlvbiwgY3VzdG9tIGNsYXNzLWxvYWRlcnMgYW5kIGR5bmFtaWMgcHJveGllcyB3aWxsIGNhdXNlIHByb2JsZW1zIHdoZW4gbW92ZWQgdG8gCi1uYXRpdmUgY29kZS4KLQotQ2VydGFpbiBmZWF0dXJlcyBvZiB0aGUgR3Jvb3Z5IGxhbmd1YWdlIG1heSBiZSBleGNsdWRlZCB0byBtZWV0IHRoaXMgZ29hbCBhbmQgYSBKVk0gaXMgc3RpbGwgCi1yZXF1aXJlZCBhdCBidWlsZCB0aW1lLiAgCi0KLQotCi0qKiogR29hbCAyIDogTmF0aXZlIEdyb292eSBsaWJyYXJpZXMuCi1bSW4gcHJvZ3Jlc3NdCi0KLUNvbXBpbGUgYSBjb2xsZWN0aW9uIG9mIC5ncm9vdnkgZmlsZXMgaW50byBhIC5zbyB0aGF0IGNhbiBiZSBsaW5rZWQgdG8gZnJvbSBvdGhlciBHcm9vdnkgb3IgbmF0aXZlCi1saWJyYXJpZXMuIAotCi1Qcm92aWRlIHNhbXBsZXMgZm9yIEdyb292eSwgQyBhbmQgQysrIGFwcHMgYWxsIGxpbmtpbmcgdG8gYW5vdGhlciBHcm9vdnkgbGlicmFyeS4KLQotCi0KLSoqKiBHb2FsIDMgOiBOYXRpdmUgLmdyb292eSBjb21waWxlci4KLVtOb3Qgc3RhcnRlZF0KLQotVGhlIGFjdHVhbCBHcm9vdnkgY29tcGlsZXIgc2hvdWxkIGJlIG5hdGl2ZSAoYXMgd2VsbCBhcyB0aGUgcnVudGltZSkgYWxsb3dpbmcgR3Jvb3Z5IHRvIGJlIGRldmVsb3BlZAotZW50aXJlbHkgd2l0aG91dCBhIEpWTSBwcmVzZW50LgotCi0KLQotKioqIEdvYWwgNCA6IFVzYWJsZSB0b29sIHNldC4KLVtJbiBwcm9ncmVzc10KLQotQSBzZXQgb2Ygc2ltcGxlIHdyYXBwZXIgdG9vbHMgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBjb21tb24gZmVhdHVyZXM6Ci0gLSBDb21waWxpbmcgYW5kIGxpbmtpbmcgYSBHcm9vdnkgbGlicmFyeSBvciBzdGFuZGFsb25lIGV4ZWN1dGFibGUuCi0gLSBKSVQgc3R5bGUgaW50ZXJwcmV0ZXIgKGxpa2UgUHl0aG9uKSB0aGF0IHJ1bnMgYSBHcm9vdnkgc2NyaXB0IGRpcmVjdGx5IGJ5IHJlY29tcGlsaW5nIGlmIG5lY2Vzc2FyeS4KLSAtICMhL3Vzci9sb2NhbC9iaW4vZ3Jvb3Z5IHN0eWxlIGRlY2xhcmF0aW9uIGZvciBzY3JpcHRzIGFsbG93aW5nIGRpcmVjdCBpbnZvY2F0aW9uLgotCi0KLQotKioqIEdvYWwgNSA6IFJ1bnRpbWUgaW50ZXJwcmV0ZXIuCi1bTm90IHN0YXJ0ZWRdCi0KLUFsbG93IEdyb292eSBzbmlwcGV0cyB0byBiZSBldmFsdWF0ZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZSAodGhlIGZ1bmN0aW9uYWxpdHkgb2YgR3Jvb3Z5Q2xhc3NMb2FkZXIpLgotVGhpcyBjb3VsZCBnZXQgdHJpY2t5LgotCi0KLQotKioqIEdvYWwgNiA6IENvbXBsZXRlIGxhbmd1YWdlIGZlYXR1cmVzLgotW05vdCBzdGFydGVkXQotCi1HZXQgYWxsIHRoZSB1bml0IHRlc3RzIHJ1bm5pbmcgb24gdGhlIG5hdGl2ZSBHcm9vdnkuIFRoaXMgZXhjbHVkZXMgSmF2YSBzcGVjaWZpYyBleHRyYXMgc3VjaCBhcyBKTVMgCi1hbmQgU2VydmxldHMuCi0KLQotCi0qKiogR29hbCA3IDogSW5zdGFsbGF0aW9uIGJ1bmRsZS4KLVtOb3Qgc3RhcnRlZF0KLQotUHJvdmlkZSBhIFVOSVggaW5zdGFsbGF0aW9uIGJ1bmRsZSB0aGF0IGNvbnRhaW5zIHNjcmlwdHMgYW5kIGluc3RydWN0aW9ucyBmb3IgZ2V0dGluZyBuYXRpdmUgR3Jvb3Z5Ci1ydW5uaW5nIG9uIGEgbWFjaGluZS4KLQotCi0KLSoqKiBHb2FsIDggOiBPcHRpbWl6YXRpb25zLgotW05vdCBzdGFydGVkXQotCi1Qcm9maWxlIGNvZGUgdG8gc2VlIGhvdyBpdCBjYW4gYmUgbWFkZSBzbmFwcGllci4gRXNwZWNpYWxseSBpbXBvcnRhbnQgaXMgdGhlIHN0YXJ0dXAgdGltZS4gQSBwbGFpbgotR0NKIGNvbXBpbGVkIEphdmEgZmlsZSBzdGFydHMgd2l0aGluIDw1MG1zLCB3aGVyZWFzIEdyb292eSBpcyB0YWtpbmcgbXVjaCBsb25nZXIuCi0KLQotCi0qKiogR29hbCA5IDogUHJvdmlkZSBHcm9vdnkgd2l0aCBzaW1wbGUgYWNjZXNzIHRvIG5hdGl2ZSBsaWJyYXJpZXMuCi1bTm90IHN0YXJ0ZWRdCi0KLUV4dGVuZCB0aGUgR3Jvb3Z5IGxpYnJhcnkgYW5kIGJ1aWxkIHRvb2xzIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIGNvZGUgb3V0c2lkZSBvZiBHcm9vdnkvSmF2YSBmcm9tIAotR3Jvb3Z5IGNsYXNzZXMuCi0KLVNvbWV0aGluZyBsaWtlOgotCi1pbXBvcnQgbmN1cnNlcyAvLyB1c2UgbGlibmN1cnNlcy9uY3Vyc2VzLmgKLWNsYXNzIFRoaW5neSB7Ci0gIHZvaWQgZG9TdHVmZihuYW1lKSB7Ci0gICAgbmN1cnNlcy5wcmludHcoIkhlbGxvICR7bmFtZX0iKSAvLyBwcmludCBzdHJpbmcKLSAgICBuY3Vyc2VzLnJlZnJlc2goKSAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgaXQgb24gc2NyZWVuCi0gICAgbmN1cnNlcy5nZXRjaCgpICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBrZXkgcHJlc3MKLSAgfQotfQotCi0KLQotCi0KLQotCi0tIEpvZSBXYWxuZXMgPGpvZUB0aG91Z2h0d29ya3MubmV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvZXhhbXBsZXMvMDAxLXN0YW5kYWxvbmUtZXhlY3V0YWJsZS9SRUFETUUgYi9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9leGFtcGxlcy8wMDEtc3RhbmRhbG9uZS1leGVjdXRhYmxlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmZGQ0ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9leGFtcGxlcy8wMDEtc3RhbmRhbG9uZS1leGVjdXRhYmxlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVJlYWQgUkVBRE1FIGluIHBhcmVudCBkaXJlY3RvcnkgZmlyc3QuIEFuZCByZWFkIHRoZSBSRUFETUUgaW4gdGhlIGdyYW5kLXBhcmVudCBkaXJlY3RvcnkKLWJlZm9yZSB0aGF0ISBTZXJpb3VzbHksIGl0J3MgaW1wb3J0YW50IQotCi0KLQotVGhpcyBkZW1vIHNpbXBseSBjb21waWxlcyBhIHNpbmdsZSBTaW1wbGUuZ3Jvb3Z5IGNsYXNzIGludG8gYSBuYXRpdmUgZXhlY3V0YWJsZSB0aGF0IGNhbgotYmUgaW52b2tlZCB1c2luZyAuL1NpbXBsZQotCi1TdGVwczoKLSAqIFJlYWQgdGhlIG90aGVyIFJFQURNRSBmaWxlcy4KLSAqIC4vYnVpbGQuc2gKLSAqIC4vU2ltcGxlCi0KLQotLSBKb2UgV2FsbmVzIDxqb2VAdGhvdWdodHdvcmtzLm5ldD4KZGlmZiAtLWdpdCBhL2dyb292eS9ncm9vdnktbmF0aXZlL2V4YW1wbGVzLzAwMS1zdGFuZGFsb25lLWV4ZWN1dGFibGUvU2ltcGxlLmdyb292eSBiL2dyb292eS9ncm9vdnktbmF0aXZlL2V4YW1wbGVzLzAwMS1zdGFuZGFsb25lLWV4ZWN1dGFibGUvU2ltcGxlLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3ZTBkMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9leGFtcGxlcy8wMDEtc3RhbmRhbG9uZS1leGVjdXRhYmxlL1NpbXBsZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1jbGFzcyBTaW1wbGUgewotICBkb1NvbWV0aGluZygpIHsKLSAgICBkYXRhID0gWyJuYW1lIjogIkphbWVzIiwgImxvY2F0aW9uIjogIkxvbmRvbiJdCi0gICAgZm9yIChlIGluIGRhdGEpIHsKLSAgICAgIHByaW50bG4oImVudHJ5ICR7ZS5rZXl9IGlzICR7ZS52YWx1ZX0iKQotICAgIH0KLSAgfQotICAKLSAgY2xvc3VyZUV4YW1wbGUoY29sbGVjdGlvbikgewotICAgIGNvbGxlY3Rpb24uZWFjaCB7IHByaW50bG4oInZhbHVlICR7aXR9IikgfQotICB9Ci0gIAotICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLSAgICB2YWx1ZXMgPSBbMSwgMiwgMywgImFiYyIsICJtb28iXQotICAgIGZvbyA9IG5ldyBTaW1wbGUoKQotICAgIGZvby5jbG9zdXJlRXhhbXBsZSh2YWx1ZXMpCi0gICAgZm9vLmRvU29tZXRoaW5nKCkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvZXhhbXBsZXMvMDAxLXN0YW5kYWxvbmUtZXhlY3V0YWJsZS9idWlsZC5zaCBiL2dyb292eS9ncm9vdnktbmF0aXZlL2V4YW1wbGVzLzAwMS1zdGFuZGFsb25lLWV4ZWN1dGFibGUvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2EwYjEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvZXhhbXBsZXMvMDAxLXN0YW5kYWxvbmUtZXhlY3V0YWJsZS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSRHUk9PVllfSE9NRS9iaW4vZ3Jvb3Z5YyBTaW1wbGUuZ3Jvb3Z5Ci1DTEFTU1BBVEg9Li4vLi4vbGliZ3Jvb3Z5L2xpYmdyb292eS5qYXIgZ2NqIC0tbWFpbj1TaW1wbGUgLW8gU2ltcGxlIC1MLi4vLi4vbGliZ3Jvb3Z5IC1sZ3Jvb3Z5ICouY2xhc3MKLXJtIC1yZiAqLmNsYXNzCi0KZGlmZiAtLWdpdCBhL2dyb292eS9ncm9vdnktbmF0aXZlL2V4YW1wbGVzL1JFQURNRSBiL2dyb292eS9ncm9vdnktbmF0aXZlL2V4YW1wbGVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxZGRkYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9leGFtcGxlcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1UaGVzZSBhcmUgdGhlIGV4YW1wbGVzIGZvciBsaWJncm9vdnkuIElmIHlvdSBkb24ndCBrbm93IHdoYXQgSSdtIHRhbGtpbmcgYWJvdXQsIHJlYWQKLXRoZSBSRUFETUUgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0KLUJlZm9yZSBydW5uaW5nIGFueSBvZiB0aGUgZXhhbXBsZXM6Ci0gKiBCdWlsZCBsaWJncm9vdnkgKGluc3RydWN0aW9ucyBpbiBsaWJncm9vdnkgZGlyZWN0b3J5KS4KLSAqIFNldCBHUk9PVllfSE9NRSB0byB3aGVyZXZlciBHcm9vdnkgbWF5IHJlc2lkZS4KLSAqIEFwcGVuZCB0aGUgbGliZ3Jvb3Z5IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggaWYgbm90IGFscmVhZHkgcHJlc2VudC4KLSAgIAotICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSD0kTERfTElCUkFSWV9QQVRIOi9wYXRoL3RvL2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5Ci0KLVRoZSBleGFtcGxlIGRpcmVjdG9yeSBuYW1lcyBhcmUgcHJlZml4ZWQgd2l0aCBhIG51bWJlciBzbyB5b3UgY2FuIHN0ZXAgdGhyb3VnaCB0aGUgCi1leGFtcGxlcyBpbiBhIGxvZ2ljYWwgb3JkZXIuCi0KLQotLSBKb2UgV2FsbmVzIDxqb2VAdGhvdWdodHdvcmtzLm5ldD4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L1JFQURNRSBiL2dyb292eS9ncm9vdnktbmF0aXZlL2xpYmdyb292eS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTRiOWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLVNlZSBSRUFETUUgaW4gcGFyZW50IGRpcmVjdG9yeSBiZWZvcmUgcmVhZGluZyBvbi4KLQotT2theSwgc28gbm93IHlvdSBrbm93IHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQuCi0KLQotCi0qKiogSW50cm9kdWN0aW9uCi0KLWxpYmdyb292eSBpcyB0aGUgY29yZSBuYXRpdmUgR3Jvb3Z5IGxpYnJhcnkgZm9yIHJ1bnRpbWUgdXNlLiBBbnkgR3Jvb3Z5IGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGlzIGxpYnJhcnkgKGFuZCB0aGUgc3RhbmRhcmQgbGliZ2NqIGxpYnJhcmllcykgdG8gcnVuLgotCi1saWJncm9vdnkgb25seSBjb250YWlucyBhIHN1YnNldCBvZiB0aGUgc3RhbmRhcmQgR3Jvb3Z5IGxpYnJhcnkuIEN1cnJlbnRseSBpdCBvbmx5Ci1ydW5zIGJhc2ljIEdyb292eSBzY3JpcHRzLgotCi1Zb3UgbWF5IG5vdGljZSB0aGF0IHRoZXJlIGFyZSBubyBhY3R1YWwgc291cmNlIGZpbGVzIGhlcmUuIFRoaXMgaXMgYmVjYXVzZSBsaWJncm9vdnkKLWlzIGJ1aWx0IGZyb20gdGhlIEphdmEgc291cmNlIGZpbGVzIGZyb20gR3Jvb3Z5LiBUaGUgc291cmNlIGZpbGVzIGZvciB0aGUgSmF2YSBBU00gCi1saWJyYXJ5IGFyZSBhbHNvIHJlcXVpcmVkLgotCi0KLQotKioqIEJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgotCi1UaGlzIGxpYnJhcnkgY3VycmVudGx5IG9ubHkgY29tcGlsZXMgb24gVU5JWC4KLQotWW91IG5lZWQ6Ci0gLSBKREsuCi0gLSBHQ0ouCi0gLSBUaGUgSmF2YSBzb3VyY2UgZm9yIEdyb292eSBhbmQgQVNNLgotIC0gQmFzaC4KLQotRWRpdCBidWlsZC5zaCBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSB2YXJpYWJsZXMgYXQgdGhlIHRvcCBvZiB0aGUgc2NyaXB0LgotCi0uL2J1aWxkLnNoCi0obWF5IHRha2Ugc29tZSB0aW1lIGFuZCBnZW5lcmF0ZSBhIGNvbGxlY3Rpb24gb2Ygd2FybmluZ3MgLSBidXQgaG9wZWZ1bGx5IG5vIGVycm9ycykuCi0KLUlmIGFsbCBnb2VzIHRvIHBsYW4sIHlvdSBzaG91bGQgZW5kIHVwIHdpdGggbGliZ3Jvb3Z5LnNvIGFuZCBsaWJncm9vdnkuamFyIGluIHRoZSBjdXJyZW50Ci1kaXJlY3RvcnkuIAotCi0KLQotKioqIE5vdGVzIG9uIGhvdyB0aGUgbGlicmFyeSBpcyBidWlsdC4KLQotVGhlIHN0cmlwcGVkIGRvd24gbGlicmFyeSBvbmx5IHRyaWVzIHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMgbGlzdGVkIGluIGdyb292eS1zcmMgYW5kIGFzbS1zcmMuCi0KLUNlcnRhaW4gdHdlYWtzIG5lZWRlZCB0byBiZSBtYWRlIHRvIGdldCB0aGUgc291cmNlIHRvIGNvbXBpbGUgYXMgR0NKIG9ubHkgcGFydGlhbGx5IHN1cHBvcnRzIAotdGhlIEoyU0UxLjQgbGlicmFyeS4gUmF0aGVyIHRoYW4gbW9kaWZ5IHRoZSBHcm9vdnkgc291cmNlLCBidWlsZC5zaCBwYXRjaGVzIHRoZSBzb3VyY2UgdXNpbmcKLXBhdGNoLmRpZmYgdG8gZ2V0IHRoZSBjb2RlIHRvIGNvbXBpbGUgKGFsdGhvdWdoIG5vYmJsaW5nIHNvbWUgZmVhdHVyZXMgaW4gZG9pbmcgc28pLgotCi0KLQotKioqIEhvdyB0byB1c2UgdGhlIGxpYnJhcnkuCi0KLUNvbWluZyBzb29uLiBJbiB0aGUgbWVhbiB0aW1lLCBsb29rIGF0IG9uZSBvZiB0aGUgZXhhbXBsZXMuCi0KLQotCi0tIEpvZSBXYWxuZXMgPGpvZUB0aG91Z2h0d29ya3MubmV0PgotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9ncm9vdnktbmF0aXZlL2xpYmdyb292eS9hc20tc3JjIGIvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L2FzbS1zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OWYxMjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L2FzbS1zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1Zpc2l0b3IuamF2YQotb3JnL29iamVjdHdlYi9hc20vQ2xhc3NXcml0ZXIuamF2YQotb3JnL29iamVjdHdlYi9hc20vQ29kZVZpc2l0b3IuamF2YQotb3JnL29iamVjdHdlYi9hc20vQ29uc3RhbnRzLmphdmEKLW9yZy9vYmplY3R3ZWIvYXNtL0NvZGVXcml0ZXIuamF2YQotb3JnL29iamVjdHdlYi9hc20vRWRnZS5qYXZhCi1vcmcvb2JqZWN0d2ViL2FzbS9JdGVtLmphdmEKLW9yZy9vYmplY3R3ZWIvYXNtL0xhYmVsLmphdmEKLW9yZy9vYmplY3R3ZWIvYXNtL1R5cGUuamF2YQotb3JnL29iamVjdHdlYi9hc20vQnl0ZVZlY3Rvci5qYXZhCmRpZmYgLS1naXQgYS9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9saWJncm9vdnkvYnVpbGQuc2ggYi9ncm9vdnkvZ3Jvb3Z5LW5hdGl2ZS9saWJncm9vdnkvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWJlODQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgRW5zdXJlIHRoZXNlIHBhdGhzIGFyZSBjb3JyZWN0Ci0KLSNKQVZBX0hPTUU9L3Vzci9sb2NhbC9qYXZhCi1HUk9PVllfSE9NRT1+L2dyb292eS0xLjAtYmV0YS0yCi1HUk9PVllfU1JDPSRHUk9PVllfSE9NRS9zcmMvbWFpbgotQVNNX1NSQz1+L0FTTS9kZXYvc3JjCi0KLSMgRW5kIG9mIHBhdGhzCi0KLQotCi0KLUJVSUxEX0RJUj1idWlsZAotTElCX05BTUU9Z3Jvb3Z5Ci0KLXJtIC1yZiAkQlVJTERfRElSIGxpYiRMSUJfTkFNRS57amFyLHNvfQotbWtkaXIgLXAgJEJVSUxEX0RJUgotCi1CQVNFX0RJUj1gcHdkYAotY2QgJEJVSUxEX0RJUgotQlVJTERfRElSPWBwd2RgCi1jZCAkQkFTRV9ESVIKLQotIyBDb3B5IG1pbWltdW0gcmVxdWlyZWQgc291cmNlIGZpbGVzIHRvIHRlbXAgZGlyZWN0b3J5Ci0oY2QgJEdST09WWV9TUkMgJiYgY3AgLS1wYXJlbnRzIGBncmVwIC12ICcjJyAkQkFTRV9ESVIvZ3Jvb3Z5LXNyY2AgJEJVSUxEX0RJUikKLShjZCAkQVNNX1NSQyAmJiBjcCAtLXBhcmVudHMgYGdyZXAgLXYgJyMnICRCQVNFX0RJUi9hc20tc3JjYCAkQlVJTERfRElSKQotCi0jIFBhdGNoIHRoZSBzb3VyY2UgZmlsZXMKLXBhdGNoIC0tc2lsZW50IC1mIC1wMCAtZCAkQlVJTERfRElSIDwgcGF0Y2guZGlmZgotCi0jIC5qYXZhIC0+IC5jbGFzcwotZmluZCAkQlVJTERfRElSIC1uYW1lIFwqLmphdmEgfCB4YXJncyBnY2ogLUMKLQotIyAuY2xhc3MgLT4gLmphcgotamFyIC1jZiBsaWIkTElCX05BTUUuamFyIC1DICRCVUlMRF9ESVIgLgotCi0jIC5jbGFzcyAtPiAuc28KLWdjaiAtc2hhcmVkIC1vIGxpYiRMSUJfTkFNRS5zbyBsaWIkTElCX05BTUUuamFyCi0KLSMgY2xlYW4gdXAKLXJtIC1yZiAkQlVJTERfRElSCi0KZGlmZiAtLWdpdCBhL2dyb292eS9ncm9vdnktbmF0aXZlL2xpYmdyb292eS9ncm9vdnktc3JjIGIvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L2dyb292eS1zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzBlOTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L2dyb292eS1zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotZ3Jvb3Z5L2xhbmcvQ2xvc3VyZS5qYXZhCi1ncm9vdnkvbGFuZy9DbG9zdXJlRXhjZXB0aW9uLmphdmEKLWdyb292eS9sYW5nL0dTdHJpbmcuamF2YQotZ3Jvb3Z5L2xhbmcvR3Jvb3Z5Q2xhc3NMb2FkZXIuamF2YQotZ3Jvb3Z5L2xhbmcvR3Jvb3Z5TG9nLmphdmEKLWdyb292eS9sYW5nL0dyb292eU9iamVjdC5qYXZhCi1ncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3RTdXBwb3J0LmphdmEKLWdyb292eS9sYW5nL0dyb292eVNoZWxsLmphdmEKLWdyb292eS9sYW5nL0ludFJhbmdlLmphdmEKLWdyb292eS9sYW5nL01ldGFDbGFzcy5qYXZhCi1ncm9vdnkvbGFuZy9NZXRhQ2xhc3NSZWdpc3RyeS5qYXZhCi1ncm9vdnkvbGFuZy9Ob25FbXB0eVNlcXVlbmNlLmphdmEKLWdyb292eS9sYW5nL09iamVjdFJhbmdlLmphdmEKLWdyb292eS9sYW5nL1JhbmdlLmphdmEKLWdyb292eS9sYW5nL1JlZmVyZW5jZS5qYXZhCi1ncm9vdnkvbGFuZy9TY3JpcHQuamF2YQotZ3Jvb3Z5L2xhbmcvU2NyaXB0Q29udGV4dC5qYXZhCi1ncm9vdnkvbGFuZy9TZXF1ZW5jZS5qYXZhCi1ncm9vdnkvbGFuZy9UdXBsZS5qYXZhCi1ncm9vdnkvdXRpbC9CaXR3aXNlLmphdmEKLWdyb292eS91dGlsL0J1aWxkZXJTdXBwb3J0LmphdmEKLWdyb292eS91dGlsL0Nsb3N1cmVDb21wYXJhdG9yLmphdmEKLWdyb292eS91dGlsL0luZGVudFByaW50ZXIuamF2YQotZ3Jvb3Z5L3V0aWwvTWFwRW50cnkuamF2YQotZ3Jvb3Z5L3V0aWwvTm9kZS5qYXZhCi1ncm9vdnkvdXRpbC9Ob2RlQnVpbGRlci5qYXZhCi1ncm9vdnkvdXRpbC9Ob2RlUHJpbnRlci5qYXZhCi1ncm9vdnkvdXRpbC9PcmRlckJ5LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvR3Jvb3Z5RXhjZXB0aW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0FTVE5vZGUuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NOb2RlLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NvZGVWaXNpdG9yU3VwcG9ydC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db21waWxlVW5pdC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db25zdHJ1Y3Rvck5vZGUuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvRmllbGROb2RlLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0dyb292eUNsYXNzVmlzaXRvci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Hcm9vdnlDb2RlVmlzaXRvci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Jbm5lckNsYXNzTm9kZS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9NZXRhZGF0YU5vZGUuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTWV0aG9kTm9kZS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9NaXhpbk5vZGUuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTW9kdWxlTm9kZS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9QYXJhbWV0ZXIuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvUHJvcGVydHlOb2RlLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQXJndW1lbnRMaXN0RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0FycmF5RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0JpbmFyeUV4cHJlc3Npb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Cb29sZWFuRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0NsYXNzRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nsb3N1cmVFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ29uc3RhbnRFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0V4cHJlc3Npb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9GaWVsZEV4cHJlc3Npb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9HU3RyaW5nRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0xpc3RFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWFwRW50cnlFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWFwRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL01ldGhvZENhbGxFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTmFtZWRBcmd1bWVudExpc3RFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTm90RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvUHJlZml4RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1Byb3BlcnR5RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1JhbmdlRXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1JlZ2V4RXhwcmVzc2lvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1N0YXRpY01ldGhvZENhbGxFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVHVwbGVFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVmFyaWFibGVFeHByZXNzaW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQXNzZXJ0U3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQmxvY2tTdGF0ZW1lbnQuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9CcmVha1N0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0Nhc2VTdGF0ZW1lbnQuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9DYXRjaFN0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0NvbnRpbnVlU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRG9XaGlsZVN0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0VtcHR5U3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0ZvclN0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0lmU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvUmV0dXJuU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3dpdGNoU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvVGhyb3dTdGF0ZW1lbnQuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9UcnlDYXRjaFN0YXRlbWVudC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1doaWxlU3RhdGVtZW50LmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2xhc3NHZW5lcmF0b3IuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DbGFzc0dlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZhcmlhYmxlU2NvcGVDb2RlVmlzaXRvci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NvbXBpbGVyRmFjYWRlLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2VuZXJhdG9yQ29udGV4dC5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGhvZENhbGxlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZhcmlhYmxlLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmVyaWZpZXIuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9WZXJpZmllckNvZGVWaXNpdG9yLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9DbGFzc0V4dGVuZGVyLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kcy5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckV4Y2VwdGlvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckhlbHBlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckludm9jYXRpb25FeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0l0ZXJhdG9yQ2xvc3VyZUFkYXB0ZXIuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZENsb3N1cmUuamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEhlbHBlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTm9TdWNoQ2xhc3NFeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL05vU3VjaE1ldGhvZEV4Y2VwdGlvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTm9TdWNoUHJvcGVydHlFeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvQWJzdHJhY3RUb2tlblN0cmVhbS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Mb29rQWhlYWRFeGhhdXN0aW9uRXhjZXB0aW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1N5bnRheEV4Y2VwdGlvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlblN0cmVhbS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0Fic3RyYWN0Q2hhclN0cmVhbS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9DaGFyU3RyZWFtLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0lucHV0U3RyZWFtQ2hhclN0cmVhbS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlclRva2VuU3RyZWFtLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1VuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJFeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbi5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQVNUQnVpbGRlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQ1NUTm9kZS5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uLmphdmEKLW9yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9QYXJzZXJFeGNlcHRpb24uamF2YQotb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL1BhcnNlci5qYXZhCi1vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9TdHJpbmdDaGFyU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL2dyb292eS9ncm9vdnktbmF0aXZlL2xpYmdyb292eS9wYXRjaC5kaWZmIGIvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L3BhdGNoLmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjBiY2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2dyb292eS1uYXRpdmUvbGliZ3Jvb3Z5L3BhdGNoLmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0tLS0gb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXIuamF2YQkyMDA0LTAxLTA2IDE2OjM3OjQ5LjAwMDAwMDAwMCArMDAwMAotKysrIG9yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VyLmphdmEJMjAwNC0wMS0wNiAxNjozODo0Ni4wMDAwMDAwMDAgKzAwMDAKLUBAIC02Miw4ICs2Miw2IEBACi0gaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLSAKLS1pbXBvcnQgY29tLm1vY2tvYmplY3RzLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0tCi0gLyoqCi0gICogQSBoZWxwZXIgY2xhc3MgdG8gaW52b2tlIG1ldGhvZHMgb3IgZXh0cmFjdCBwcm9wZXJ0aWVzIG9uIGFyYml0cmFyeSBKYXZhIG9iamVjdHMgZHluYW1pY2FsbHkKLSAgKiAKLUBAIC0yNDQsNyArMjQyLDcgQEAKLSAJCQkJCXJldHVybiBtYXRjaGVyLmdyb3VwKCk7Ci0gCQkJCX0KLSAJCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotLQkJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0rCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAJCQkJfQotICAgICAgICAgCX07Ci0gICAgICAgICB9Ci0tLS0gLi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckhlbHBlci5qYXZhLm9yaWcJMjAwNC0wMS0wNiAxNzoxMzo0MS4wMDAwMDAwMDAgKzAwMDAKLSsrKyAuL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySGVscGVyLmphdmEJMjAwNC0wMS0wNiAxNzoxNDoyNC4wMDAwMDAwMDAgKzAwMDAKLUBAIC0xNzAsNyArMTcwLDcgQEAKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hdGNoZXIpIHsKLSAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSAoTWF0Y2hlcikgb2JqZWN0OwotLSAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmZpbmQoKTsKLSsJICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWF0Y2hlci5maW5kKCkiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgb2JqZWN0OwotLS0tIC4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXIuamF2YS5vcmlnCTIwMDQtMDEtMDYgMTc6MTQ6NTIuMDAwMDAwMDAwICswMDAwCi0rKysgLi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlci5qYXZhCTIwMDQtMDEtMDYgMTc6MTc6NDEuMDAwMDAwMDAwICswMDAwCi1AQCAtMjI3LDggKzIyNyw3IEBACi0gCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gCQkJCQlpZiAoZG9uZSkgcmV0dXJuIGZhbHNlOwotIAkJCQkJaWYgKCFmb3VuZCkgewotLQkJCQkJCWZvdW5kID0gbWF0Y2hlci5maW5kKCk7Ci0tCQkJCQkJaWYgKCFmb3VuZCkgZG9uZSA9IHRydWU7Ci0rCQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNYXRjaGVyLmZpbmQoKSIpOwotIAkJCQkJfQotIAkJCQkJcmV0dXJuIGZvdW5kOwotIAkJCQl9Ci1AQCAtMjM5LDcgKzIzOCw3IEBACi0gCQkJCQkJfQotIAkJCQkJfQotIAkJCQkJZm91bmQgPSBmYWxzZTsKLS0JCQkJCXJldHVybiBtYXRjaGVyLmdyb3VwKCk7Ci0rCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1hdGNoZXIuZ3JvdXAoKSIpOwotIAkJCQl9Ci0gCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAJCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotQEAgLTQ4NSw3ICs0ODQsNyBAQAotICAgICAJCXBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodG9TdHJpbmcocmlnaHQpKTsKLSAgICAgCX0KLSAgICAgCVN0cmluZyBzdHJpbmdUb0NvbXBhcmUgPSB0b1N0cmluZyhsZWZ0KTsKLS0gICAgCXJldHVybiBwYXR0ZXJuLm1hdGNoZXIoc3RyaW5nVG9Db21wYXJlKS5tYXRjaGVzKCk7Ci0rCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWF0Y2hlciIpOwotICAgICB9Ci0gCi0gCS8qKgotLS0tIC4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlNZXRob2RzLmphdmEub3JpZwkyMDA0LTAxLTA2IDE3OjE4OjE3LjAwMDAwMDAwMCArMDAwMAotKysrIC4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlNZXRob2RzLmphdmEJMjAwNC0wMS0wNiAxNzoxOTozNi4wMDAwMDAwMDAgKzAwMDAKLUBAIC0yMjEsNyArMjIxLDcgQEAKLSAgICAgfQotIAotICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDYXNlKFBhdHRlcm4gY2FzZVZhbHVlLCBPYmplY3Qgc3dpdGNoVmFsdWUpIHsKLS0gICAgICAgIHJldHVybiBjYXNlVmFsdWUubWF0Y2hlcihzd2l0Y2hWYWx1ZS50b1N0cmluZygpKS5tYXRjaGVzKCk7Ci0rCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWF0Y2hlci5tYXRjaGVzKCkiKTsKLSAgICAgfQotIAotICAgICAvLyBDb2xsZWN0aW9uIGJhc2VkIG1ldGhvZHMKLUBAIC04NTAsOCArODUwLDcgQEAKLSAgICAgfQotIAotICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaW51cyhTdHJpbmcgbGVmdCwgT2JqZWN0IHZhbHVlKSB7Ci0tICAgICAgICBTdHJpbmcgdGV4dCA9IHRvU3RyaW5nKHZhbHVlKTsKLS0gICAgICAgIHJldHVybiBsZWZ0LnJlcGxhY2VGaXJzdCh0ZXh0LCAiIik7Ci0rCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3RyaW5nLnJlcGxhY2VGaXJzdCgpIik7Ci0gICAgIH0KLSAKLSAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbXVsdGlwbHkoU3RyaW5nIHNlbGYsIE51bWJlciBmYWN0b3IpIHsKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvYnVpbGQueG1sIGIvZ3Jvb3Z5L2pzci9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTBkNmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9ImpzciIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPCEtLSAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwdWJsaXNoLmRpciIgdmFsdWU9Ii9ob21lL3Byb2plY3RzL2dyb292eS9wdWJsaWNfaHRtbC9qc3IiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNwZWMud2lraS5kaXIiIHZhbHVlPSJzcGVjL3dpa2kiLz4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICB0YXJnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIAotICAgICAgICAgIGRlcGVuZHM9InB1Ymxpc2giIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJkZWZhdWx0OiBwdWJsaXNoIGRpc3RyaWJ1dGFibGVzIgotICAvPgotICAKLSAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249InJlbW92ZSBhbGwgYnVpbHQgZmlsZXMiPgotICAgIDwhLS13b3JrYXJvdW5kIGZvciBiaXNjdWl0IGxvY2FsIGRpciBpc3N1ZSAtLT4KLSAgICA8ZGVsZXRlIGZpbGU9IlNlYXJjaEFuZFJlcGxhY2UiLz4KLSAgICA8ZGVsZXRlIGZpbGU9IlNlYXJjaEFuZFJlcGxhY2VSZWdleCIvPgotICAgIDxkZWxldGUgZmlsZT0iVGVtcGxhdGVQYWdlLmh0bWwiLz4KLQotICAgIDxhbnQgZGlyPSJzcGVjIiB0YXJnZXQ9ImNsZWFuIi8+IAotICAgIDxhbnQgZGlyPSJpZGVhcy9wYXJzZXJzL2FudGxyIiB0YXJnZXQ9ImNsZWFuIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZG9jIj4KLSAgICA8ZWNobz4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZW5kZXIgc3BlY2lmaWNhdGlvbi4uLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA8L2VjaG8+Ci0gICAgPCEtLXdvcmthcm91bmQgZm9yIGJpc2N1aXQgbG9jYWwgZGlyIGlzc3VlIC0tPgotICAgIDxjb3B5IGZpbGU9InNwZWMvU2VhcmNoQW5kUmVwbGFjZSIgdG9kaXI9Ii4iLz4KLSAgICA8Y29weSBmaWxlPSJzcGVjL1NlYXJjaEFuZFJlcGxhY2VSZWdleCIgdG9kaXI9Ii4iLz4KLSAgICA8Y29weSBmaWxlPSJzcGVjL1RlbXBsYXRlUGFnZS5odG1sIiB0b2Rpcj0iLiIvPgotICAgIDxhbnQgZGlyPSJzcGVjIiB0YXJnZXQ9InJlbmRlciIgaW5oZXJpdEFsbD0iZmFsc2UiLz4KLQotICAgIDxlY2hvPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbmRlciBncmFtbWFyLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDwvZWNobz4KLSAgICA8IS0tIGJyaW5nIGdyYW1tYXIgb3ZlciBmcm9tIGdyb292eS1jb3JlIC0tPgotICAgIDxjb3B5IHRvZGlyPSJpZGVhcy9wYXJzZXJzL2FudGxyL3NyYyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4uL2dyb292eS1jb3JlL3NyYy9tYWluIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovZ3Jvb3Z5LmciLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0KLSAgICA8YW50IGRpcj0iaWRlYXMvcGFyc2Vycy9hbnRsciIgdGFyZ2V0PSJkb2NzIiBpbmhlcml0QWxsPSJmYWxzZSIvPgotCi0KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJkb2MiIGRlc2NyaXB0aW9uPSJwdWJsaXNoIGRpc3RyaWJ1dGFibGVzIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtwdWJsaXNoLmRpcn0vc3BlYyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3BlYy53aWtpLmRpcn0iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHtwdWJsaXNoLmRpcn0vc3BlYyI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImlkZWFzL3BhcnNlcnMvYW50bHIvZG9jLyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ikdyb292eVJlY29nbml6ZXIuaHRtbCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJHcm9vdnlMZXhlci5odG1sIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9SRUFETUUudHh0IGIvZ3Jvb3Z5L2pzci9pZGVhcy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc0YTczLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGlzIGEgcGxhY2UgaG9sZGVyIGZvciBuZXcgaWRlYXMgd2UgbWF5IHdpc2ggdG8gYWRkIHRvIHRoZSBsYW5ndWFnZS4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9idWlsZC54bWwgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNiYmVjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJncm9vdnlwYXJzZXIiIGRlZmF1bHQ9ImRlZmF1bHQiPgotCi0gIDwhLS0gcHJvamVjdCBnZW5lcmF0ZWQgYnkgaHR0cDovL21lZ2cuc2YubmV0IC0tPgotICA8IS0tIGF1dGhvciBKZXJlbXkuUmF5bmVyQGJpZ2Zvb3QuY29tIC0tPgotCi0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPCEtLSAgICAgICAgICAgICAgICAgICBjb21waWxlIHNldHRpbmdzICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kZWJ1ZyIgdmFsdWU9Im9uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uLm51bWJlciIgdmFsdWU9IjAuMC4yIi8+Ci0gIAotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkLnNyYy5kaXIiIHZhbHVlPSJzcmNnZW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InN0YW5kYWxvbmUuZGlyIiB2YWx1ZT0ic3RhbmRhbG9uZSIvPgotICA8cHJvcGVydHkgbmFtZT0ic3RhbmRhbG9uZS53b3JraW5nLmRpciIgdmFsdWU9InRlbXAiLz4KLQotICA8IS0tIFRPRE8gbGltaXQgZXhwb3N1cmUgdG8gZ3Jvb3Z5IGNsYXNzaWMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJncm9vdnkuY2xhc3NpYy5kaXIiIHZhbHVlPSIuLi8uLi8uLi8uLi9ncm9vdnktY29yZS90YXJnZXQvaW5zdGFsbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZ3Jvb3Z5LmNsYXNzaWMubGliLmRpciIgdmFsdWU9IiR7Z3Jvb3Z5LmNsYXNzaWMuZGlyfS9lbWJlZGRhYmxlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJncm9vdnkuY2xhc3NpYy5leHQubGliLmRpciIgdmFsdWU9IiR7Z3Jvb3Z5LmNsYXNzaWMuZGlyfS9saWIiLz4KLQotICA8IS0tIGphdmFkb2MgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiB2YWx1ZT0iZG9jIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLnBhY2thZ2VzIiB2YWx1ZT0ib3JnLioiLz4KLQotICA8IS0tIGp1bml0IHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnNyYy5kaXIiCXZhbHVlPSJ0ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3Rlc3QvY2xhc3NlcyIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5yZXBvcnRzLmRpciIgdmFsdWU9InJlcG9ydHMiLz4KLSAgCi0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPCEtLSAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlcyAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi56aXAiIC8+Ci0gICAgPC9maWxlc2V0PgotCi0gICAgPCEtLSBUT0RPIGxpbWl0IGV4cG9zdXJlIHRvIGdyb292eSBjbGFzc2ljIC0tPgotICAgIDxmaWxlc2V0IGRpcj0iJHtncm9vdnkuY2xhc3NpYy5saWIuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAKLSAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5jbGFzc2VzLmRpcn0iLz4gIAotICAgIDxmaWxlc2V0IGRpcj0iJHtncm9vdnkuY2xhc3NpYy5leHQubGliLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgCi0KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgdGFyZ2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiAKLSAgICAgICAgICBkZXBlbmRzPSJkaXN0IiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVmYXVsdDogYnVpbGQgZXZlcnl0aGluZyIKLSAgLz4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iYWxsIiAKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LGRpc3QiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJidWlsZCBhbmQgdGVzdCBldmVyeXRoaW5nIgotICAvPgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJyZW1vdmUgYWxsIGJ1aWx0IGZpbGVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke3N0YW5kYWxvbmUuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2MuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5lcmF0ZWQuc3JjLmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0iIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgCi0gICAgICAgICAgZGVwZW5kcz0iY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBkaXN0cmlidXRhYmxlcyAoamFycyBldGMpIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIgLz4KLSAgICA8amFyIGphcmZpbGU9IiR7ZGlzdC5kaXJ9L2dyb292eS1qc3ItJHt2ZXJzaW9uLm51bWJlcn0uamFyIgotICAgICAgICAgbWFuaWZlc3Q9IiR7c3JjLmRpcn0vbWFuaWZlc3QudHh0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJnZW5lcmF0ZSIgZGVzY3JpcHRpb249ImdlbmVyYXRlIGRvY3VtZW50YXRpb24iPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotCi0gICAgPGFudGxyIHRhcmdldD0iJHtzcmMuZGlyfS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL2dyb292eS5nIgotICAgICAgICAgICBodG1sPSJ0cnVlIgotICAgICAgICAgICBvdXRwdXRkaXJlY3Rvcnk9IiR7amF2YWRvYy5kaXJ9Ij4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9hbnRscj4KLSAgICA8bW92ZSBmaWxlPSJkb2MvR3Jvb3Z5TGV4ZXIudHh0IiB0b2ZpbGU9ImRvYy9Hcm9vdnlMZXhlci5odG1sIiBmYWlsb25lcnJvcj0iTm8iLz4KLQotICAgIDxjb3B5IHRvZGlyPSIke2dlbmVyYXRlZC5zcmMuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8amF2YWRvYyBzb3VyY2VwYXRoPSIke2dlbmVyYXRlZC5zcmMuZGlyfSIgCi0gICAgICAgICAgICAgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0iIAotICAgICAgICAgICAgIHBhY2thZ2VuYW1lcz0iJHtqYXZhZG9jLnBhY2thZ2VzfSIKLSAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIgotICAgICAgICAgICAgIHVzZT0idHJ1ZSIKLSAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iZ3Jvb3Z5YyIKLSAgICAgICAgICAgICBwcml2YXRlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgCi0gICAgICAgICAgZGVwZW5kcz0idGVzdC1jb21waWxlIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0icnVuIGFsbCB0ZXN0IGNhc2VzIj4KLSAgICA8anVuaXQgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIvPgotICAgICAgPGJhdGNodGVzdD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Quc3JjLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICAgICAgICAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNsYXNzaWMiCi0gICAgICAgICAgZGVwZW5kcz0idGVzdC1jb21waWxlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJydW4gYWxsIHRoZSBjbGFzc2ljIHRlc3QgY2FzZXMiPgotICAgIDxqdW5pdCBoYWx0b25mYWlsdXJlPSJ0cnVlIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+Ci0gICAgICA8YmF0Y2h0ZXN0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovQWxsVGVzdHMuamF2YSIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwcmV0dHktdGVzdCIKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LWNvbXBpbGUiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJIVE1MIG91dHB1dCBvZiB0ZXN0IGNhc2VzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ii8+Ci0gICAgPGp1bml0IGhhbHRvbmZhaWx1cmU9ImZhbHNlIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB1c2VmaWxlPSJ0cnVlIi8+Ci0KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKlRlc3QuamF2YSIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0KLSAgICA8L2p1bml0PgotCi0gICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ii8+Ci0gICAgPC9qdW5pdHJlcG9ydD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzdGFuZGFsb25lIiBkZXBlbmRzPSJkaXN0IiBkZXNjcmlwdGlvbj0ibWVyZ2UgYWxsIGphcnMgdG9nZXRoZXIiPgotICAgIDxta2RpciBkaXI9IiR7c3RhbmRhbG9uZS53b3JraW5nLmRpcn0iLz4KLSAgICA8dW56aXAgZGVzdD0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC91bnppcD4KLSAgICA8Y29weSB0b2Rpcj0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ibGljZW5zZXMiLz4KLSAgICA8L2NvcHk+Ci0gICAgPG1rZGlyIGRpcj0ic3RhbmRhbG9uZSIvPgotICAgIDxqYXIgamFyZmlsZT0ic3RhbmRhbG9uZS9ncm9vdnktanNyLSR7dmVyc2lvbi5udW1iZXJ9LmphciIKLSAgICAgICAgIG1hbmlmZXN0PSIke3NyYy5kaXJ9L21hbmlmZXN0LnR4dCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3N0YW5kYWxvbmUud29ya2luZy5kaXJ9Ii8+Ci0gIDwvamFyPgotICA8ZGVsZXRlIGRpcj0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSIvPgotICA8L3RhcmdldD4KLQotCi0KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImdlbmVyYXRlIHNvdXJjZXMgZnJvbSBhIGdyYW1tYXIgZmlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQuc3JjLmRpcn0vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsciIvPgotICAgIDxhbnRsciB0YXJnZXQ9IiR7c3JjLmRpcn0vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9ncm9vdnkuZyIKLSAgICAgICAgICAgb3V0cHV0ZGlyZWN0b3J5PSIke2dlbmVyYXRlZC5zcmMuZGlyfS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyIj4KLSAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC9hbnRscj4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImdlbmVyYXRlIiBkZXNjcmlwdGlvbj0iY29tcGlsZSBqYXZhIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICA8Y29weSB0b2Rpcj0iJHtnZW5lcmF0ZWQuc3JjLmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ii8+Ci0gICAgPC9jb3B5PgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VuZXJhdGVkLnNyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIAotICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIiAKLSAgICAgICAgICAgZGVidWc9IiR7YnVpbGQuZGVidWd9IiAKLSAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9IiAvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7dGVzdC5zcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iIAotICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAKLSAgICAgICAgICAgZGVidWc9IiR7YnVpbGQuZGVidWd9IiAKLSAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcCAvPgotICAgIDxta2RpciBkaXI9IiR7bGliLmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0gICAgICAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGliL2FudGxyLTIuNy41LmphciBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWIvYW50bHItMi43LjUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1ZTNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWIvYW50bHItMi43LjUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpYi94cHAzLTEuMS4zLjRkX2I0X21pbi5qYXIgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGliL3hwcDMtMS4xLjMuNGRfYjRfbWluLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0ODZjMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGliL3hwcDMtMS4xLjMuNGRfYjRfbWluLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWIveHN0cmVhbS0xLjEuamFyIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpYi94c3RyZWFtLTEuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTdmYTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpYi94c3RyZWFtLTEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGljZW5zZXMvYW50bHIubGljZW5zZS50eHQgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGljZW5zZXMvYW50bHIubGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDU1OTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpY2Vuc2VzL2FudGxyLmxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi1odHRwOi8vd3d3LmFudGxyLm9yZy9saWNlbnNlLmh0bWwKLQotU29mdHdhcmUgTGljZW5zZQotCi1XZSAgcmVzZXJ2ZSBubyBsZWdhbCByaWdodHMgdG8gdGhlIEFOVExSLS1pdCBpcyBmdWxseSBpbiB0aGUgcHVibGljIGRvbWFpbi4gQW4gaW5kaXZpZHVhbCBvciAgY29tcGFueSBtYXkgZG8gd2hhdGV2ZXIgdGhleSB3aXNoIHdpdGggc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgd2l0aCBBTlRMUiBvciB0aGUgY29kZSAgZ2VuZXJhdGVkIGJ5IEFOVExSLCBpbmNsdWRpbmcgdGhlIGluY29ycG9yYXRpb24gb2YgQU5UTFIsIG9yIGl0cyBvdXRwdXQsIGludG8gY29tbWVyaWNhbCBzb2Z0d2FyZS4KLQotV2UgZW5jb3VyYWdlIHVzZXJzIHRvIGRldmVsb3Agc29mdHdhcmUgd2l0aCBBTlRMUi4gSG93ZXZlciwgd2UgZG8gYXNrIHRoYXQgIGNyZWRpdCBpcyBnaXZlbiB0byB1cyBmb3IgZGV2ZWxvcGluZyBBTlRMUi4gQnkgImNyZWRpdCIsIHdlIG1lYW4gdGhhdCBpZiB5b3UgdXNlICBBTlRMUiBvciBpbmNvcnBvcmF0ZSBhbnkgc291cmNlIGNvZGUgaW50byBvbmUgb2YgeW91ciBwcm9ncmFtcyAoY29tbWVyY2lhbCBwcm9kdWN0LCAgcmVzZWFyY2ggcHJvamVjdCwgb3Igb3RoZXJ3aXNlKSB0aGF0IHlvdSBhY2tub3dsZWRnZSB0aGlzIGZhY3Qgc29tZXdoZXJlIGluIHRoZSAgZG9jdW1lbnRhdGlvbiwgcmVzZWFyY2ggcmVwb3J0LCBldGMuLi4gSWYgeW91IGxpa2UgQU5UTFIgYW5kIGhhdmUgZGV2ZWxvcGVkIGEgbmljZSB0b29sIHdpdGggdGhlIG91dHB1dCwgcGxlYXNlIG1lbnRpb24gdGhhdCB5b3UgZGV2ZWxvcGVkIGl0IHVzaW5nIEFOVExSLiBJbiBhZGRpdGlvbiwgd2UgYXNrICB0aGF0IHRoZSBoZWFkZXJzIHJlbWFpbiBpbnRhY3QgaW4gb3VyIHNvdXJjZSBjb2RlLiBBcyBsb25nIGFzIHRoZXNlIGd1aWRlbGluZXMgYXJlIGtlcHQsICB3ZSBleHBlY3QgdG8gY29udGludWUgZW5oYW5jaW5nIHRoaXMgc3lzdGVtIGFuZCBleHBlY3QgdG8gbWFrZSBvdGhlciB0b29scyBhdmFpbGFibGUgYXMgIHRoZXkgYXJlIGNvbXBsZXRlZC4KLQotVGVyZW5jZSBQYXJyCi0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWNlbnNlcy94cHAzLWxpY2Vuc2UudHh0IGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpY2Vuc2VzL3hwcDMtbGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjhlZTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL2xpY2Vuc2VzL3hwcDMtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1JbmRpYW5hIFVuaXZlcnNpdHkgRXh0cmVtZSEgTGFiIFNvZnR3YXJlIExpY2Vuc2UKLQotVmVyc2lvbiAxLjEuMQotCi1Db3B5cmlnaHQgKGMpIDIwMDIgRXh0cmVtZSEgTGFiLCBJbmRpYW5hIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwKLSAgIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBJbmRpYW5hIFVuaXZlcnNpdHkKLSAgRXh0cmVtZSEgTGFiIChodHRwOi8vd3d3LmV4dHJlbWUuaW5kaWFuYS5lZHUvKS4iCi0KLUFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLWlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0KLTQuIFRoZSBuYW1lcyAiSW5kaWFuYSBVbml2ZXJpc3R5IiBhbmQgIkluZGlhbmEgVW5pdmVyaXN0eSBFeHRyZW1lISBMYWIiCi1tdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi1wbGVhc2UgY29udGFjdCBodHRwOi8vd3d3LmV4dHJlbWUuaW5kaWFuYS5lZHUvLgotCi01LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IHVzZSAiSW5kaWFuYSBVbml2ZXJpc3R5IgotbmFtZSBub3IgbWF5ICJJbmRpYW5hIFVuaXZlcmlzdHkiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yCi13cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEluZGlhbmEgVW5pdmVyc2l0eS4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMsIENPUFlSSUdIVCBIT0xERVJTIE9SIElUUyBDT05UUklCVVRPUlMKLUJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWNlbnNlcy94c3RyZWFtLTEuMS1saWNlbnNlLnR4dCBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9saWNlbnNlcy94c3RyZWFtLTEuMS1saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0OGIzZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbGljZW5zZXMveHN0cmVhbS0xLjEtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0oQlNEIFN0eWxlIExpY2Vuc2UpCi0KLUNvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb2UgV2FsbmVzCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi1SZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZgotY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UKLXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi10aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotTmVpdGhlciB0aGUgbmFtZSBvZiBYU3RyZWFtIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi1vciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKLVNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLVRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi1DT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWQotV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFLgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL21pc2MvUkVBRE1FLnR4dCBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWI4NGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL21pc2MvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLT0tPS09LT0tPS0KLU1pc2MgRmlsZXMKLS09LT0tPS09LT0tCi0KLWFudGxyX2dyYW1tYXJfZmlsZXMueG1sIC0gQU5UTFIgc3ludGF4IGNvbG91cmluZyBmb3IgSW50ZWxsaUoKLQotICAgIHB1dCB0aGUgYW50bHJfZ3JhbW1hcl9maWxlcy54bWwgaW4gfi9MaWJyYXJ5L1ByZWZlcmVuY2VzL0ludGVsbGlKIElERUEvZmlsZXR5cGVzICAoTWFjIE9TIFggcGF0aCkKLQotamF2YS5nIC0gdGhlIG9yaWdpbmFsIGdyYW1tYXIgdGhhdCBncm9vdnkuZyBpcyBiYXNlZCB1cG9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL21pc2MvYW50bHJfZ3JhbW1hcl9maWxlcy54bWwgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9hbnRscl9ncmFtbWFyX2ZpbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3MTE4ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9hbnRscl9ncmFtbWFyX2ZpbGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmlsZXR5cGUgYmluYXJ5PSJmYWxzZSIgZGVmYXVsdF9leHRlbnNpb249ImciIGV4dGVuc2lvbnM9ImciIGRlc2NyaXB0aW9uPSJBTlRMUiBHcmFtbWFyIGZpbGVzIiBuYW1lPSJBTlRMUiBHcmFtbWFyIGZpbGVzIj4KLSAgPGhpZ2hsaWdodGluZz4KLSAgICA8b3B0aW9ucz4KLSAgICAgIDxvcHRpb24gbmFtZT0iTElORV9DT01NRU5UIiB2YWx1ZT0iLy8iIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkNPTU1FTlRfU1RBUlQiIHZhbHVlPSIvKiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQ09NTUVOVF9FTkQiIHZhbHVlPSIqLyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSEVYX1BSRUZJWCIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iTlVNX1BPU1RGSVhFUyIgdmFsdWU9IiIgLz4KLSAgICA8L29wdGlvbnM+Ci0gICAgPGtleXdvcmRzIGlnbm9yZV9jYXNlPSJmYWxzZSI+Ci0gICAgICA8a2V5d29yZCBuYW1lPSJjbGFzcyIgLz4KLSAgICAgIDxrZXl3b3JkIG5hbWU9ImV4dGVuZHMiIC8+Ci0gICAgICA8a2V5d29yZCBuYW1lPSJoZWFkZXIiIC8+Ci0gICAgICA8a2V5d29yZCBuYW1lPSJvcHRpb25zIiAvPgotICAgICAgPGtleXdvcmQgbmFtZT0icmV0dXJucyIgLz4KLSAgICA8L2tleXdvcmRzPgotICAgIDxrZXl3b3JkczIgLz4KLSAgICA8a2V5d29yZHMzIC8+Ci0gICAgPGtleXdvcmRzNCAvPgotICA8L2hpZ2hsaWdodGluZz4KLTwvZmlsZXR5cGU+Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL2phdmEuZyBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL2phdmEuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwY2ZmZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9qYXZhLmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMjczICswLDAgQEAKLS8qKiBKYXZhIDEuMyBSZWNvZ25pemVyCi0gKgotICogUnVuICdqYXZhIE1haW4gWy1zaG93dHJlZV0gZGlyZWN0b3J5LWZ1bGwtb2YtamF2YS1maWxlcycKLSAqCi0gKiBbVGhlIC1zaG93dHJlZSBvcHRpb24gcG9wcyB1cCBhIFN3aW5nIGZyYW1lIHRoYXQgc2hvd3MKLSAqICB0aGUgQVNUIGNvbnN0cnVjdGVkIGZyb20gdGhlIHBhcnNlci5dCi0gKgotICogUnVuICdqYXZhIE1haW4gPGRpcmVjdG9yeSBmdWxsIG9mIGphdmEgZmlsZXM+JwotICoKLSAqIENvbnRyaWJ1dGluZyBhdXRob3JzOgotICoJCUpvaG4gTWl0Y2hlbGwJCWpvaG5tQG5vbi5uZXQKLSAqCQlUZXJlbmNlIFBhcnIJCXBhcnJ0QG1hZ2VsYW5nLmNvbQotICoJCUpvaG4gTGlsbGV5CQkJamxpbGxleUBlbXBhdGh5LmNvbQotICoJCVNjb3R0IFN0YW5jaGZpZWxkCXRoZXRpY2tAbWFnZWxhbmcuY29tCi0gKgkJTWFya3VzIE1vaG5lbiAgICAgICBtb2huZW5AaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQotICogICAgICBQZXRlciBXaWxsaWFtcyAgICAgIHBldGUud2lsbGlhbXNAc3VuLmNvbQotICogICAgICBBbGxhbiBKYWNvYnMgICAgICAgIEFsbGFuLkphY29ic0Blbmcuc3VuLmNvbQotICogICAgICBTdGV2ZSBNZXNzaWNrICAgICAgIG1lc3NpY2tAcmVkaGlsbHMuY29tCi0gKiAgICAgIEpvaG4gUHlidXMJCQlqb2huQHB5YnVzLm9yZwotICoKLSAqIFZlcnNpb24gMS4wMCBEZWNlbWJlciA5LCAxOTk3IC0tIGluaXRpYWwgcmVsZWFzZQotICogVmVyc2lvbiAxLjAxIERlY2VtYmVyIDEwLCAxOTk3Ci0gKgkJZml4ZWQgYnVnIGluIG9jdGFsIGRlZiAoMC4uNyBub3QgMC4uOCkKLSAqIFZlcnNpb24gMS4xMCBBdWd1c3QgMTk5OCAocGFycnQpCi0gKgkJYWRkZWQgdHJlZSBjb25zdHJ1Y3Rpb24KLSAqCQlmaXhlZCBkZWZpbml0aW9uIG9mIFdTLGNvbW1lbnRzIGZvciBtYWMscGMsdW5peCBuZXdsaW5lcwotICoJCWFkZGVkIHVuYXJ5IHBsdXMKLSAqIFZlcnNpb24gMS4xMSAoTm92IDIwLCAxOTk4KQotICoJCUFkZGVkICJzaHV0dXAiIG9wdGlvbiB0byB0dXJuIG9mZiBsYXN0IGFtYmlnIHdhcm5pbmcuCi0gKgkJRml4ZWQgaW5uZXIgY2xhc3MgZGVmIHRvIGFsbG93IG5hbWVkIGNsYXNzIGRlZnMgYXMgc3RhdGVtZW50cwotICoJCXN5bmNocm9uaXplZCByZXF1aXJlcyBjb21wb3VuZCBub3Qgc2ltcGxlIHN0YXRlbWVudAotICoJCWFkZCBbXSBhZnRlciBidWlsdEluVHlwZSBET1QgY2xhc3MgaW4gcHJpbWFyeUV4cHJlc3Npb24KLSAqCQkiY29uc3QiIGlzIHJlc2VydmVkIGJ1dCBub3QgdmFsaWQuLnJlbW92ZWQgZnJvbSBtb2RpZmllcnMKLSAqIFZlcnNpb24gMS4xMiAoRmViIDIsIDE5OTkpCi0gKgkJQ2hhbmdlZCBMSVRFUkFMX3h4eCB0byB4eHggaW4gdHJlZSBncmFtbWFyLgotICoJCVVwZGF0ZWQgamF2YS5nIHRvIHVzZSB0b2tlbnMgey4uLn0gbm93IGZvciAyLjYuMCAobmV3IGZlYXR1cmUpLgotICoKLSAqIFZlcnNpb24gMS4xMyAoQXByIDIzLCAxOTk5KQotICoJCURpZG4ndCBoYXZlIChzdGF0KT8gZm9yIGVsc2UgY2xhdXNlIGluIHRyZWUgcGFyc2VyLgotICoJCURpZG4ndCBnZW4gQVNUcyBmb3IgaW50ZXJmYWNlIGV4dGVuZHMuICBVcGRhdGVkIHRyZWUgcGFyc2VyIHRvby4KLSAqCQlVcGRhdGVkIHRvIDIuNi4wLgotICogVmVyc2lvbiAxLjE0IChKdW4gMjAsIDE5OTkpCi0gKgkJQWxsb3dlZCBmaW5hbC9hYnN0cmFjdCBvbiBsb2NhbCBjbGFzc2VzLgotICoJCVJlbW92ZWQgbG9jYWwgaW50ZXJmYWNlcyBmcm9tIG1ldGhvZHMKLSAqCQlQdXQgaW5zdGFuY2VvZiBwcmVjZWRlbmNlIHdoZXJlIGl0IGJlbG9uZ3MuLi5pbiByZWxhdGlvbmFsRXhwcgotICoJCQlJdCBhbHNvIGhhZCBleHByIG5vdCB0eXBlIGFzIGFyZzsgZml4ZWQgaXQuCi0gKgkJTWlzc2luZyAhIG9uIFNFTUkgaW4gY2xhc3NCbG9jawotICoJCWZpeGVkOiAoZXhwcikgKyAic3RyaW5nIiB3YXMgcGFyc2VkIGluY29ycmVjdGx5ICgrIGFzIHVuYXJ5IHBsdXMpLgotICoJCWZpeGVkOiBkaWRuJ3QgbGlrZSBPYmplY3RbXS5jbGFzcyBpbiBwYXJzZXIgb3IgdHJlZSBwYXJzZXIKLSAqIFZlcnNpb24gMS4xNSAoSnVuIDI2LCAxOTk5KQotICoJCVNjcmV3ZWQgdXAgcnVsZSB3aXRoIGluc3RhbmNlb2YgaW4gaXQuIDooICBGaXhlZC4KLSAqCQlUcmVlIHBhcnNlciBkaWRuJ3QgbGlrZSAoZXhwcikuc29tZXRoaW5nOyBmaXhlZC4KLSAqCQlBbGxvd2VkIG11bHRpcGxlIGluaGVyaXRhbmNlIGluIHRyZWUgZ3JhbW1hci4gb29wcy4KLSAqIFZlcnNpb24gMS4xNiAoQXVndXN0IDIyLCAxOTk5KQotICoJCUV4dGVuZGluZyBhbiBpbnRlcmZhY2UgYnVpbHQgYSB3YWNreSB0cmVlOiBoYWQgZXh0cmEgRVhURU5EUy4KLSAqCQlUcmVlIGdyYW1tYXIgZGlkbid0IGFsbG93IG11bHRpcGxlIHN1cGVyaW50ZXJmYWNlcy4KLSAqCQlUcmVlIGdyYW1tYXIgZGlkbid0IGFsbG93IGVtcHR5IHZhciBpbml0aWFsaXplcjoge30KLSAqIFZlcnNpb24gMS4xNyAoT2N0b2JlciAxMiwgMTk5OSkKLSAqCQlFU0MgbGV4ZXIgcnVsZSBhbGxvd2VkIDM5OSBtYXggbm90IDM3NyBtYXguCi0gKgkJamF2YS50cmVlLmcgZGlkbid0IGhhbmRsZSB0aGUgZXhwcmVzc2lvbiBvZiBzeW5jaHJvbml6ZWQKLSAqCQlzdGF0ZW1lbnRzLgotICogVmVyc2lvbiAxLjE4IChBdWd1c3QgMTIsIDIwMDEpCi0gKiAgICAgIAlUZXJlbmNlIHVwZGF0ZWQgdG8gSmF2YSAyIFZlcnNpb24gMS4zIGJ5Ci0gKgkJb2JzZXJ2aW5nL2NvbWJpbmluZyB3b3JrIG9mIEFsbGFuIEphY29icyBhbmQgU3RldmUKLSAqCQlNZXNzaWNrLiAgSGFuZGxlcyAxLjMgc3JjLiAgU3VtbWFyeToKLSAqCQlvICBwcmltYXJ5IGRpZG4ndCBpbmNsdWRlIGJvb2xlYW4uY2xhc3Mga2luZCBvZiB0aGluZwotICogICAgICAJbyAgY29uc3RydWN0b3IgY2FsbHMgcGFyc2VkIGV4cGxpY2l0bHkgbm93OgotICogCQkgICBzZWUgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24KLSAqCQlvICBhZGQgc3RyaWN0ZnAgbW9kaWZpZXIKLSAqICAgICAgCW8gIG1pc3Npbmcgb2JqQmxvY2sgYWZ0ZXIgbmV3IGV4cHJlc3Npb24gaW4gdHJlZSBncmFtbWFyCi0gKgkJbyAgbWVyZ2VkIGxvY2FsIGNsYXNzIGRlZmluaXRpb24gYWx0ZXJuYXRpdmVzLCBtb3ZlZCBhZnRlciBkZWNsYXJhdGlvbgotICoJCW8gIGZpeGVkIHByb2JsZW0gd2l0aCBDbGFzc05hbWUuc3VwZXIuZmllbGQKLSAqICAgICAgCW8gIHJlb3JkZXJlZCBzb21lIGFsdGVybmF0aXZlcyB0byBtYWtlIHRoaW5ncyBtb3JlIGVmZmljaWVudAotICoJCW8gIGxvbmcgYW5kIGRvdWJsZSBjb25zdGFudHMgd2VyZSBub3QgZGlmZmVyZW50aWF0ZWQgZnJvbSBpbnQvZmxvYXQKLSAqCQlvICB3aGl0ZXNwYWNlIHJ1bGUgd2FzIGluZWZmaWNpZW50OiBtYXRjaGVkIG9ubHkgb25lIGNoYXIKLSAqCQlvICBhZGQgYW4gZXhhbXBsZXMgZGlyZWN0b3J5IHdpdGggc29tZSBuYXN0eSAxLjMgY2FzZXMKLSAqCQlvICBtYWRlIE1haW4uamF2YSB1c2UgYnVmZmVyZWQgSU8gYW5kIGEgUmVhZGVyIGZvciBVbmljb2RlIHN1cHBvcnQKLSAqCQlvICBzdXBwb3J0cyBVTklDT0RFPwotICoJCSAgIFVzaW5nIFVuaWNvZGUgY2hhclZvY2FidWxheSBtYWtlcyBjb2RlIGZpbGUgYmlnLCBidXQgb25seQotICoJCSAgIGluIHRoZSBiaXRzZXRzIGF0IHRoZSBlbmQuIEkgbmVlZCB0byBtYWtlIEFOVExSIGdlbmVyYXRlCi0gKgkJICAgdW5pY29kZSBiaXRzZXRzIG1vcmUgZWZmaWNpZW50bHkuCi0gKiBWZXJzaW9uIDEuMTkgKEFwcmlsIDI1LCAyMDAyKQotICoJCVRlcmVuY2UgYWRkZWQgaW4gbmljZSBmaXhlcyBieSBKb2huIFB5YnVzIGNvbmNlcm5pbmcgZmxvYXRpbmcKLSAqCQljb25zdGFudHMgYW5kIHByb2JsZW1zIHdpdGggc3VwZXIoKSBjYWxscy4gIEpvaG4gZGlkIGEgbmljZQotICoJCXJlb3JnIG9mIHRoZSBwcmltYXJ5L3Bvc3RmaXggZXhwcmVzc2lvbiBzdHVmZiB0byByZWFkIGJldHRlcgotICoJCWFuZCBtYWtlcyBmLmcuc3VwZXIoKSBwYXJzZSBwcm9wZXJseSAoaXQgd2FzIE1FVEhPRF9DQUxMIG5vdAotICoJCWEgU1VQRVJfQ1RPUl9DQUxMKS4gIEFsc286Ci0gKgotICoJCW8gICJmaW5hbGx5IiBjbGF1c2Ugd2FzIGEgcm9vdC4uLm1hZGUgaXQgYSBjaGlsZCBvZiAidHJ5IgotICoJCW8gIEFkZGVkIHN0dWZmIGZvciBhc3NlcnRzIHRvbyBmb3IgSmF2YSAxLjQsIGJ1dCAqY29tbWVudGVkIG91dCoKLSAqCQkgICBhcyBpdCBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4KLSAqCi0gKiBWZXJzaW9uIDEuMjAgKE9jdG9iZXIgMjcsIDIwMDIpCi0gKgotICogICAgICBUZXJlbmNlIGVuZGVkIHVwIHJlb3JnaW5nIEpvaG4gUHlidXMnIHN0dWZmIHRvCi0gKiAgICAgIHJlbW92ZSBzb21lIG5vbmRldGVybWluaXNtcyBhbmQgc29tZSBzeW50YWN0aWMgcHJlZGljYXRlcy4KLSAqICAgICAgTm90ZSB0aGF0IHRoZSBncmFtbWFyIGlzIHN0cmljdGVyIG5vdzsgZS5nLiwgdGhpcyguLi4pIG11c3QKLSAqCWJlIHRoZSBmaXJzdCBzdGF0ZW1lbnQuCi0gKgotICogICAgICBUcmluYXJ5ID86IG9wZXJhdG9yIHdhc24ndCB3b3JraW5nIGFzIGFycmF5IG5hbWU6Ci0gKiAgICAgICAgICAoaXNCaWcgPyBiaWdEaWdpdHMgOiBkaWdpdHMpW2ldOwotICoKLSAqICAgICAgQ2hlY2tlZCBwYXJzZXIvdHJlZSBwYXJzZXIgb24gc291cmNlIGZvcgotICogICAgICAgICAgUmVzaW4tMi4wLjUsIGppdmUtMi4xLjEsIGpkayAxLjMuMSwgTHVjZW5lLCBhbnRsciAyLjcuMmE0LAotICoJICAgIGFuZCB0aGUgMTEway1saW5lIGpHdXJ1IHNlcnZlciBzb3VyY2UuCi0gKgotICogVmVyc2lvbiAxLjIxIChPY3RvYmVyIDE3LCAyMDAzKQotICoJRml4ZWQgbG90cyBvZiBwcm9ibGVtcyBpbmNsdWRpbmc6Ci0gKglSYXkgV2FsZGluOiBhZGQgdHlwZURlZmluaXRpb24gdG8gaW50ZXJmYWNlQmxvY2sgaW4gamF2YS50cmVlLmcKLSAqICBIZSBmb3VuZCBhIHByb2JsZW0vZml4IHdpdGggZmxvYXRpbmcgcG9pbnQgdGhhdCBzdGFydCB3aXRoIDAKLSAqICBSYXkgYWxzbyBmaXhlZCBwcm9ibGVtIHRoYXQgKGludC5jbGFzcykgd2FzIG5vdCByZWNvZ25pemVkLgotICogIFRob3JzdGVuIHZhbiBFbGxlbiBub3RpY2VkIHRoYXQgXG4gYXJlIGFsbG93ZWQgaW5jb3JyZWN0bHkgaW4gc3RyaW5ncy4KLSAqICBUSlAgZml4ZWQgQ0hBUl9MSVRFUkFMIGFuYWxvZ291c2x5LgotICoKLSAqIFZlcnNpb24gMS4yMiAoQXByaWwgMTQsIDIwMDQpICAgICAgICAgICAgICAgIAotICogIENoYW5nZWQgdm9jYWIgdG8gYmUgLi5cdUZGRkUgdG8gYXZvaWQgLTEgY2hhci4gcmVtb3ZlZCBkdW1teSBWT0NBQiBydWxlLgotICoKLSAqIFRoaXMgZ3JhbW1hciBpcyBpbiB0aGUgUFVCTElDIERPTUFJTgotICovCi1jbGFzcyBKYXZhUmVjb2duaXplciBleHRlbmRzIFBhcnNlcjsKLW9wdGlvbnMgewotCWsgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR3byB0b2tlbiBsb29rYWhlYWQKLQlleHBvcnRWb2NhYj1KYXZhOyAgICAgICAgICAgICAgICAvLyBDYWxsIGl0cyB2b2NhYnVsYXJ5ICJKYXZhIgotCWNvZGVHZW5NYWtlU3dpdGNoVGhyZXNob2xkID0gMjsgIC8vIFNvbWUgb3B0aW1pemF0aW9ucwotCWNvZGVHZW5CaXRzZXRUZXN0VGhyZXNob2xkID0gMzsKLQlkZWZhdWx0RXJyb3JIYW5kbGVyID0gZmFsc2U7ICAgICAvLyBEb24ndCBnZW5lcmF0ZSBwYXJzZXIgZXJyb3IgaGFuZGxlcnMKLQlidWlsZEFTVCA9IHRydWU7Ci19Ci0KLXRva2VucyB7Ci0JQkxPQ0s7IE1PRElGSUVSUzsgT0JKQkxPQ0s7IFNMSVNUOyBDVE9SX0RFRjsgTUVUSE9EX0RFRjsgVkFSSUFCTEVfREVGOwotCUlOU1RBTkNFX0lOSVQ7IFNUQVRJQ19JTklUOyBUWVBFOyBDTEFTU19ERUY7IElOVEVSRkFDRV9ERUY7Ci0JUEFDS0FHRV9ERUY7IEFSUkFZX0RFQ0xBUkFUT1I7IEVYVEVORFNfQ0xBVVNFOyBJTVBMRU1FTlRTX0NMQVVTRTsKLQlQQVJBTUVURVJTOyBQQVJBTUVURVJfREVGOyBMQUJFTEVEX1NUQVQ7IFRZUEVDQVNUOyBJTkRFWF9PUDsKLQlQT1NUX0lOQzsgUE9TVF9ERUM7IE1FVEhPRF9DQUxMOyBFWFBSOyBBUlJBWV9JTklUOwotCUlNUE9SVDsgVU5BUllfTUlOVVM7IFVOQVJZX1BMVVM7IENBU0VfR1JPVVA7IEVMSVNUOyBGT1JfSU5JVDsgRk9SX0NPTkRJVElPTjsKLQlGT1JfSVRFUkFUT1I7IEVNUFRZX1NUQVQ7IEZJTkFMPSJmaW5hbCI7IEFCU1RSQUNUPSJhYnN0cmFjdCI7Ci0JU1RSSUNURlA9InN0cmljdGZwIjsgU1VQRVJfQ1RPUl9DQUxMOyBDVE9SX0NBTEw7Ci19Ci0KLS8vIENvbXBpbGF0aW9uIFVuaXQ6IEluIEphdmEsIHRoaXMgaXMgYSBzaW5nbGUgZmlsZS4gIFRoaXMgaXMgdGhlIHN0YXJ0Ci0vLyAgIHJ1bGUgZm9yIHRoaXMgcGFyc2VyCi1jb21waWxhdGlvblVuaXQKLQk6CS8vIEEgY29tcGlsYXRpb24gdW5pdCBzdGFydHMgd2l0aCBhbiBvcHRpb25hbCBwYWNrYWdlIGRlZmluaXRpb24KLQkJKAlwYWNrYWdlRGVmaW5pdGlvbgotCQl8CS8qIG5vdGhpbmcgKi8KLQkJKQotCi0JCS8vIE5leHQgd2UgaGF2ZSBhIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgaW1wb3J0IHN0YXRlbWVudHMKLQkJKCBpbXBvcnREZWZpbml0aW9uICkqCi0KLQkJLy8gV3JhcHBpbmcgdGhpbmdzIHVwIHdpdGggYW55IG51bWJlciBvZiBjbGFzcyBvciBpbnRlcmZhY2UKLQkJLy8gICAgZGVmaW5pdGlvbnMKLQkJKCB0eXBlRGVmaW5pdGlvbiApKgotCi0JCUVPRiEKLQk7Ci0KLQotLy8gUGFja2FnZSBzdGF0ZW1lbnQ6ICJwYWNrYWdlIiBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyLgotcGFja2FnZURlZmluaXRpb24KLQlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9IC8vIGxldCBBTlRMUiBoYW5kbGUgZXJyb3JzCi0JOglwOiJwYWNrYWdlIl4geyNwLnNldFR5cGUoUEFDS0FHRV9ERUYpO30gaWRlbnRpZmllciBTRU1JIQotCTsKLQotCi0vLyBJbXBvcnQgc3RhdGVtZW50OiBpbXBvcnQgZm9sbG93ZWQgYnkgYSBwYWNrYWdlIG9yIGNsYXNzIG5hbWUKLWltcG9ydERlZmluaXRpb24KLQlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9Ci0JOglpOiJpbXBvcnQiXiB7I2kuc2V0VHlwZShJTVBPUlQpO30gaWRlbnRpZmllclN0YXIgU0VNSSEKLQk7Ci0KLS8vIEEgdHlwZSBkZWZpbml0aW9uIGluIGEgZmlsZSBpcyBlaXRoZXIgYSBjbGFzcyBvciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLXR5cGVEZWZpbml0aW9uCi0Jb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fQotCToJbTptb2RpZmllcnMhCi0JCSggY2xhc3NEZWZpbml0aW9uWyNtXQotCQl8IGludGVyZmFjZURlZmluaXRpb25bI21dCi0JCSkKLQl8CVNFTUkhCi0JOwotCi0vKiogQSBkZWNsYXJhdGlvbiBpcyB0aGUgY3JlYXRpb24gb2YgYSByZWZlcmVuY2Ugb3IgcHJpbWl0aXZlLXR5cGUgdmFyaWFibGUKLSAqICBDcmVhdGUgYSBzZXBhcmF0ZSBUeXBlL1ZhciB0cmVlIGZvciBlYWNoIHZhciBpbiB0aGUgdmFyIGxpc3QuCi0gKi8KLWRlY2xhcmF0aW9uIQotCToJbTptb2RpZmllcnMgdDp0eXBlU3BlY1tmYWxzZV0gdjp2YXJpYWJsZURlZmluaXRpb25zWyNtLCN0XQotCQl7I2RlY2xhcmF0aW9uID0gI3Y7fQotCTsKLQotLy8gQSB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSB0eXBlIG5hbWUgd2l0aCBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCi0vLyAgICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgotdHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KLQk6IGNsYXNzVHlwZVNwZWNbYWRkSW1hZ05vZGVdCi0JfCBidWlsdEluVHlwZVNwZWNbYWRkSW1hZ05vZGVdCi0JOwotCi0vLyBBIGNsYXNzIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIGNsYXNzIHR5cGUgd2l0aCBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCi0vLyAgICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgotY2xhc3NUeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQotCToJaWRlbnRpZmllciAobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQkJewotCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKLQkJCQkjY2xhc3NUeXBlU3BlYyA9ICMoI1tUWVBFLCJUWVBFIl0sICNjbGFzc1R5cGVTcGVjKTsKLQkJCX0KLQkJfQotCTsKLQotLy8gQSBidWlsdGluIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIGJ1aWx0aW4gdHlwZSB3aXRoIHBvc3NpYmxlIGJyYWNrZXRzCi0vLyBhZnRlcndhcmRzICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgotYnVpbHRJblR5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCi0JOglidWlsdEluVHlwZSAobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQkJewotCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKLQkJCQkjYnVpbHRJblR5cGVTcGVjID0gIygjW1RZUEUsIlRZUEUiXSwgI2J1aWx0SW5UeXBlU3BlYyk7Ci0JCQl9Ci0JCX0KLQk7Ci0KLS8vIEEgdHlwZSBuYW1lLiB3aGljaCBpcyBlaXRoZXIgYSAocG9zc2libHkgcXVhbGlmaWVkKSBjbGFzcyBuYW1lIG9yCi0vLyAgIGEgcHJpbWl0aXZlIChidWlsdGluKSB0eXBlCi10eXBlCi0JOglpZGVudGlmaWVyCi0JfAlidWlsdEluVHlwZQotCTsKLQotLy8gVGhlIHByaW1pdGl2ZSB0eXBlcy4KLWJ1aWx0SW5UeXBlCi0JOgkidm9pZCIKLQl8CSJib29sZWFuIgotCXwJImJ5dGUiCi0JfAkiY2hhciIKLQl8CSJzaG9ydCIKLQl8CSJpbnQiCi0JfAkiZmxvYXQiCi0JfAkibG9uZyIKLQl8CSJkb3VibGUiCi0JOwotCi0vLyBBIChwb3NzaWJseS1xdWFsaWZpZWQpIGphdmEgaWRlbnRpZmllci4gIFdlIHN0YXJ0IHdpdGggdGhlIGZpcnN0IElERU5UCi0vLyAgIGFuZCBleHBhbmQgaXRzIG5hbWUgYnkgYWRkaW5nIGRvdHMgYW5kIGZvbGxvd2luZyBJREVOVFMKLWlkZW50aWZpZXIKLQk6CUlERU5UICAoIERPVF4gSURFTlQgKSoKLQk7Ci0KLWlkZW50aWZpZXJTdGFyCi0JOglJREVOVAotCQkoIERPVF4gSURFTlQgKSoKLQkJKCBET1ReIFNUQVIgICk/Ci0JOwotCi0vLyBBIGxpc3Qgb2YgemVybyBvciBtb3JlIG1vZGlmaWVycy4gIFdlIGNvdWxkIGhhdmUgdXNlZCAobW9kaWZpZXIpKiBpbgotLy8gICBwbGFjZSBvZiBhIGNhbGwgdG8gbW9kaWZpZXJzLCBidXQgSSB0aG91Z2h0IGl0IHdhcyBhIGdvb2QgaWRlYSB0byBrZWVwCi0vLyAgIHRoaXMgcnVsZSBzZXBhcmF0ZSBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgY29sbGVjdGVkIGluIGEgVmVjdG9yIGlmCi0vLyAgIHNvbWVvbmUgc28gZGVzaXJlcwotbW9kaWZpZXJzCi0JOgkoIG1vZGlmaWVyICkqCi0JCXsjbW9kaWZpZXJzID0gIyhbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl0sICNtb2RpZmllcnMpO30KLQk7Ci0KLS8vIG1vZGlmaWVycyBmb3IgSmF2YSBjbGFzc2VzLCBpbnRlcmZhY2VzLCBjbGFzcy9pbnN0YW5jZSB2YXJzIGFuZCBtZXRob2RzCi1tb2RpZmllcgotCToJInByaXZhdGUiCi0JfAkicHVibGljIgotCXwJInByb3RlY3RlZCIKLQl8CSJzdGF0aWMiCi0JfAkidHJhbnNpZW50IgotCXwJImZpbmFsIgotCXwJImFic3RyYWN0IgotCXwJIm5hdGl2ZSIKLQl8CSJ0aHJlYWRzYWZlIgotCXwJInN5bmNocm9uaXplZCIKLS8vCXwJImNvbnN0IgkJCS8vIHJlc2VydmVkIHdvcmQsIGJ1dCBub3QgdmFsaWQKLQl8CSJ2b2xhdGlsZSIKLQl8CSJzdHJpY3RmcCIKLQk7Ci0KLS8vIERlZmluaXRpb24gb2YgYSBKYXZhIGNsYXNzCi1jbGFzc0RlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCi0JOgkiY2xhc3MiIElERU5UCi0JCS8vIGl0IF9taWdodF8gaGF2ZSBhIHN1cGVyY2xhc3MuLi4KLQkJc2M6c3VwZXJDbGFzc0NsYXVzZQotCQkvLyBpdCBtaWdodCBpbXBsZW1lbnQgc29tZSBpbnRlcmZhY2VzLi4uCi0JCWljOmltcGxlbWVudHNDbGF1c2UKLQkJLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBjbGFzcwotCQljYjpjbGFzc0Jsb2NrCi0JCXsjY2xhc3NEZWZpbml0aW9uID0gIygjW0NMQVNTX0RFRiwiQ0xBU1NfREVGIl0sCi0JCQkJCQkJICAgbW9kaWZpZXJzLElERU5ULHNjLGljLGNiKTt9Ci0JOwotCi1zdXBlckNsYXNzQ2xhdXNlIQotCToJKCAiZXh0ZW5kcyIgaWQ6aWRlbnRpZmllciApPwotCQl7I3N1cGVyQ2xhc3NDbGF1c2UgPSAjKCNbRVhURU5EU19DTEFVU0UsIkVYVEVORFNfQ0xBVVNFIl0saWQpO30KLQk7Ci0KLS8vIERlZmluaXRpb24gb2YgYSBKYXZhIEludGVyZmFjZQotaW50ZXJmYWNlRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10KLQk6CSJpbnRlcmZhY2UiIElERU5UCi0JCS8vIGl0IG1pZ2h0IGV4dGVuZCBzb21lIG90aGVyIGludGVyZmFjZXMKLQkJaWU6aW50ZXJmYWNlRXh0ZW5kcwotCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGludGVyZmFjZSAobG9va3MgbGlrZSBhIGNsYXNzLi4uKQotCQljYjpjbGFzc0Jsb2NrCi0JCXsjaW50ZXJmYWNlRGVmaW5pdGlvbiA9ICMoI1tJTlRFUkZBQ0VfREVGLCJJTlRFUkZBQ0VfREVGIl0sCi0JCQkJCQkJCQltb2RpZmllcnMsSURFTlQsaWUsY2IpO30KLQk7Ci0KLQotLy8gVGhpcyBpcyB0aGUgYm9keSBvZiBhIGNsYXNzLiAgWW91IGNhbiBoYXZlIGZpZWxkcyBhbmQgZXh0cmEgc2VtaWNvbG9ucywKLS8vIFRoYXQncyBhYm91dCBpdCAodW50aWwgeW91IHNlZSB3aGF0IGEgZmllbGQgaXMuLi4pCi1jbGFzc0Jsb2NrCi0JOglMQ1VSTFkhCi0JCQkoIGZpZWxkIHwgU0VNSSEgKSoKLQkJUkNVUkxZIQotCQl7I2NsYXNzQmxvY2sgPSAjKFtPQkpCTE9DSywgIk9CSkJMT0NLIl0sICNjbGFzc0Jsb2NrKTt9Ci0JOwotCi0vLyBBbiBpbnRlcmZhY2UgY2FuIGV4dGVuZCBzZXZlcmFsIG90aGVyIGludGVyZmFjZXMuLi4KLWludGVyZmFjZUV4dGVuZHMKLQk6CSgKLQkJZToiZXh0ZW5kcyIhCi0JCWlkZW50aWZpZXIgKCBDT01NQSEgaWRlbnRpZmllciApKgotCQkpPwotCQl7I2ludGVyZmFjZUV4dGVuZHMgPSAjKCNbRVhURU5EU19DTEFVU0UsIkVYVEVORFNfQ0xBVVNFIl0sCi0JCQkJCQkJI2ludGVyZmFjZUV4dGVuZHMpO30KLQk7Ci0KLS8vIEEgY2xhc3MgY2FuIGltcGxlbWVudCBzZXZlcmFsIGludGVyZmFjZXMuLi4KLWltcGxlbWVudHNDbGF1c2UKLQk6CSgKLQkJCWk6ImltcGxlbWVudHMiISBpZGVudGlmaWVyICggQ09NTUEhIGlkZW50aWZpZXIgKSoKLQkJKT8KLQkJeyNpbXBsZW1lbnRzQ2xhdXNlID0gIygjW0lNUExFTUVOVFNfQ0xBVVNFLCJJTVBMRU1FTlRTX0NMQVVTRSJdLAotCQkJCQkJCQkgI2ltcGxlbWVudHNDbGF1c2UpO30KLQk7Ci0KLS8vIE5vdyB0aGUgdmFyaW91cyB0aGluZ3MgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBjbGFzcyBvciBpbnRlcmZhY2UuLi4KLS8vIE5vdGUgdGhhdCBub3QgYWxsIG9mIHRoZXNlIGFyZSByZWFsbHkgdmFsaWQgaW4gYW4gaW50ZXJmYWNlIChjb25zdHJ1Y3RvcnMsCi0vLyAgIGZvciBleGFtcGxlKSwgYW5kIGlmIHRoaXMgZ3JhbW1hciB3ZXJlIHVzZWQgZm9yIGEgY29tcGlsZXIgdGhlcmUgd291bGQKLS8vICAgbmVlZCB0byBiZSBzb21lIHNlbWFudGljIGNoZWNrcyB0byBtYWtlIHN1cmUgd2UncmUgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nLi4uCi1maWVsZCEKLQk6CS8vIG1ldGhvZCwgY29uc3RydWN0b3IsIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uCi0JCW1vZHM6bW9kaWZpZXJzCi0JCSgJaDpjdG9ySGVhZCBzOmNvbnN0cnVjdG9yQm9keSAvLyBjb25zdHJ1Y3RvcgotCQkJeyNmaWVsZCA9ICMoI1tDVE9SX0RFRiwiQ1RPUl9ERUYiXSwgbW9kcywgaCwgcyk7fQotCi0JCXwJY2Q6Y2xhc3NEZWZpbml0aW9uWyNtb2RzXSAgICAgICAvLyBpbm5lciBjbGFzcwotCQkJeyNmaWVsZCA9ICNjZDt9Ci0KLQkJfAlpZDppbnRlcmZhY2VEZWZpbml0aW9uWyNtb2RzXSAgIC8vIGlubmVyIGludGVyZmFjZQotCQkJeyNmaWVsZCA9ICNpZDt9Ci0KLQkJfAl0OnR5cGVTcGVjW2ZhbHNlXSAgLy8gbWV0aG9kIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uKHMpCi0JCQkoCUlERU5UICAvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0KLQkJCQkvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCi0JCQkJTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQotCi0JCQkJcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XQotCi0JCQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcwotCQkJCS8vIGRlY2xhcmVkIHRvIHRocm93Ci0JCQkJKHRjOnRocm93c0NsYXVzZSk/Ci0KLQkJCQkoIHMyOmNvbXBvdW5kU3RhdGVtZW50IHwgU0VNSSApCi0JCQkJeyNmaWVsZCA9ICMoI1tNRVRIT0RfREVGLCJNRVRIT0RfREVGIl0sCi0JCQkJCQkgICAgIG1vZHMsCi0JCQkJCQkJICMoI1tUWVBFLCJUWVBFIl0scnQpLAotCQkJCQkJCSBJREVOVCwKLQkJCQkJCQkgcGFyYW0sCi0JCQkJCQkJIHRjLAotCQkJCQkJCSBzMik7fQotCQkJfAl2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdIFNFTUkKLS8vCQkJCXsjZmllbGQgPSAjKCNbVkFSSUFCTEVfREVGLCJWQVJJQUJMRV9ERUYiXSwgdik7fQotCQkJCXsjZmllbGQgPSAjdjt9Ci0JCQkpCi0JCSkKLQotICAgIC8vICJzdGF0aWMgeyAuLi4gfSIgY2xhc3MgaW5pdGlhbGl6ZXIKLQl8CSJzdGF0aWMiIHMzOmNvbXBvdW5kU3RhdGVtZW50Ci0JCXsjZmllbGQgPSAjKCNbU1RBVElDX0lOSVQsIlNUQVRJQ19JTklUIl0sIHMzKTt9Ci0KLSAgICAvLyAieyAuLi4gfSIgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLQl8CXM0OmNvbXBvdW5kU3RhdGVtZW50Ci0JCXsjZmllbGQgPSAjKCNbSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCJdLCBzNCk7fQotCTsKLQotY29uc3RydWN0b3JCb2R5Ci0gICAgOiAgIGxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKFNMSVNUKTt9Ci0gICAgICAgICAgICAoIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfSA6IGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKT8KLSAgICAgICAgICAgIChzdGF0ZW1lbnQpKgotICAgICAgICBSQ1VSTFkhCi0gICAgOwotCi0vKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCi1leHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotICAgIDogICAidGhpcyIhIGxwMTpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOISBTRU1JIQotCQl7I2xwMS5zZXRUeXBlKENUT1JfQ0FMTCk7fQotICAgIHwgICAic3VwZXIiISBscDI6TFBBUkVOXiBhcmdMaXN0IFJQQVJFTiEgU0VNSSEKLQkJeyNscDIuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KLSAgICA7Ci0KLXZhcmlhYmxlRGVmaW5pdGlvbnNbQVNUIG1vZHMsIEFTVCB0XQotCToJdmFyaWFibGVEZWNsYXJhdG9yW2dldEFTVEZhY3RvcnkoKS5kdXBUcmVlKG1vZHMpLAotCQkJCQkJICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0JCSgJQ09NTUEhCi0JCQl2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCi0JCQkJCQkJICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0JCSkqCi0JOwotCi0vKiogRGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS4gIFRoaXMgY2FuIGJlIGEgY2xhc3MvaW5zdGFuY2UgdmFyaWFibGUsCi0gKiAgIG9yIGEgbG9jYWwgdmFyaWFibGUgaW4gYSBtZXRob2QKLSAqIEl0IGNhbiBhbHNvIGluY2x1ZGUgcG9zc2libGUgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXZhcmlhYmxlRGVjbGFyYXRvciFbQVNUIG1vZHMsIEFTVCB0XQotCToJaWQ6SURFTlQgZDpkZWNsYXJhdG9yQnJhY2tldHNbdF0gdjp2YXJJbml0aWFsaXplcgotCQl7I3ZhcmlhYmxlRGVjbGFyYXRvciA9ICMoI1tWQVJJQUJMRV9ERUYsIlZBUklBQkxFX0RFRiJdLCBtb2RzLCAjKCNbVFlQRSwiVFlQRSJdLGQpLCBpZCwgdik7fQotCTsKLQotZGVjbGFyYXRvckJyYWNrZXRzW0FTVCB0eXBdCi0JOgl7I2RlY2xhcmF0b3JCcmFja2V0cz10eXA7fQotCQkobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQk7Ci0KLXZhckluaXRpYWxpemVyCi0JOgkoIEFTU0lHTl4gaW5pdGlhbGl6ZXIgKT8KLQk7Ci0KLS8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYXJyYXkuCi1hcnJheUluaXRpYWxpemVyCi0JOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBUlJBWV9JTklUKTt9Ci0JCQkoCWluaXRpYWxpemVyCi0JCQkJKAotCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3Ci0JCQkJCS8vICAgICAgICAgICBpbml0aWFsaXplciBvciBzdGFydCB0aGUgb3B0aW9uICcsJyBhdCBlbmQ/Ci0JCQkJCS8vICAgICAgICAgICBBTlRMUiBnZW5lcmF0ZXMgcHJvcGVyIGNvZGUgYnkgbWF0Y2hpbmcKLQkJCQkJLy8JCQkgdGhlIGNvbW1hIGFzIHNvb24gYXMgcG9zc2libGUuCi0JCQkJCW9wdGlvbnMgewotCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJOgotCQkJCQlDT01NQSEgaW5pdGlhbGl6ZXIKLQkJCQkpKgotCQkJCShDT01NQSEpPwotCQkJKT8KLQkJUkNVUkxZIQotCTsKLQotCi0vLyBUaGUgdHdvICJ0aGluZ3MiIHRoYXQgY2FuIGluaXRpYWxpemUgYW4gYXJyYXkgZWxlbWVudCBhcmUgYW4gZXhwcmVzc2lvbgotLy8gICBhbmQgYW5vdGhlciAobmVzdGVkKSBhcnJheSBpbml0aWFsaXplci4KLWluaXRpYWxpemVyCi0JOglleHByZXNzaW9uCi0JfAlhcnJheUluaXRpYWxpemVyCi0JOwotCi0vLyBUaGlzIGlzIHRoZSBoZWFkZXIgb2YgYSBtZXRob2QuICBJdCBpbmNsdWRlcyB0aGUgbmFtZSBhbmQgcGFyYW1ldGVycwotLy8gICBmb3IgdGhlIG1ldGhvZC4KLS8vICAgVGhpcyBhbHNvIHdhdGNoZXMgZm9yIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyBpbiBhICJ0aHJvd3MiIGNsYXVzZS4KLWN0b3JIZWFkCi0JOglJREVOVCAgLy8gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotCi0JCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KLQkJTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQotCi0JCS8vIGdldCB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKLQkJKHRocm93c0NsYXVzZSk/Ci0JOwotCi0vLyBUaGlzIGlzIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyB0aGF0IHRoZSBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKLXRocm93c0NsYXVzZQotCToJInRocm93cyJeIGlkZW50aWZpZXIgKCBDT01NQSEgaWRlbnRpZmllciApKgotCTsKLQotCi0vLyBBIGxpc3Qgb2YgZm9ybWFsIHBhcmFtZXRlcnMKLXBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAotCToJKCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiAoIENPTU1BISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiApKiApPwotCQl7I3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCA9ICMoI1tQQVJBTUVURVJTLCJQQVJBTUVURVJTIl0sCi0JCQkJCQkJCQkjcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KTt9Ci0JOwotCi0vLyBBIGZvcm1hbCBwYXJhbWV0ZXIuCi1wYXJhbWV0ZXJEZWNsYXJhdGlvbiEKLQk6CXBtOnBhcmFtZXRlck1vZGlmaWVyIHQ6dHlwZVNwZWNbZmFsc2VdIGlkOklERU5UCi0JCXBkOmRlY2xhcmF0b3JCcmFja2V0c1sjdF0KLQkJeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoI1tQQVJBTUVURVJfREVGLCJQQVJBTUVURVJfREVGIl0sCi0JCQkJCQkJCQlwbSwgIyhbVFlQRSwiVFlQRSJdLHBkKSwgaWQpO30KLQk7Ci0KLXBhcmFtZXRlck1vZGlmaWVyCi0JOgkoZjoiZmluYWwiKT8KLQkJeyNwYXJhbWV0ZXJNb2RpZmllciA9ICMoI1tNT0RJRklFUlMsIk1PRElGSUVSUyJdLCBmKTt9Ci0JOwotCi0vLyBDb21wb3VuZCBzdGF0ZW1lbnQuICBUaGlzIGlzIHVzZWQgaW4gbWFueSBjb250ZXh0czoKLS8vICAgSW5zaWRlIGEgY2xhc3MgZGVmaW5pdGlvbiBwcmVmaXhlZCB3aXRoICJzdGF0aWMiOgotLy8gICAgICBpdCBpcyBhIGNsYXNzIGluaXRpYWxpemVyCi0vLyAgIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gd2l0aG91dCAic3RhdGljIjoKLS8vICAgICAgaXQgaXMgYW4gaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLS8vICAgQXMgdGhlIGJvZHkgb2YgYSBtZXRob2QKLS8vICAgQXMgYSBjb21wbGV0ZWx5IGluZGVwZGVudCBicmFjZWQgYmxvY2sgb2YgY29kZSBpbnNpZGUgYSBtZXRob2QKLS8vICAgICAgaXQgc3RhcnRzIGEgbmV3IHNjb3BlIGZvciB2YXJpYWJsZSBkZWZpbml0aW9ucwotCi1jb21wb3VuZFN0YXRlbWVudAotCToJbGM6TENVUkxZXiB7I2xjLnNldFR5cGUoU0xJU1QpO30KLQkJCS8vIGluY2x1ZGUgdGhlIChwb3NzaWJseS1lbXB0eSkgbGlzdCBvZiBzdGF0ZW1lbnRzCi0JCQkoc3RhdGVtZW50KSoKLQkJUkNVUkxZIQotCTsKLQotCi1zdGF0ZW1lbnQKLQkvLyBBIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiBjdXJseSBicmFjZXMgLS0gc3RhcnQgYSBuZXcgc2NvcGUhCi0JOgljb21wb3VuZFN0YXRlbWVudAotCi0JLy8gZGVjbGFyYXRpb25zIGFyZSBhbWJpZ3VvdXMgd2l0aCAiSUQgRE9UIiByZWxhdGl2ZSB0byBleHByZXNzaW9uCi0JLy8gc3RhdGVtZW50cy4gIE11c3QgYmFja3RyYWNrIHRvIGJlIHN1cmUuICBDb3VsZCB1c2UgYSBzZW1hbnRpYwotCS8vIHByZWRpY2F0ZSB0byB0ZXN0IHN5bWJvbCB0YWJsZSB0byBzZWUgd2hhdCB0aGUgdHlwZSB3YXMgY29taW5nCi0JLy8gdXAsIGJ1dCB0aGF0J3MgcHJldHR5IGhhcmQgd2l0aG91dCBhIHN5bWJvbCB0YWJsZSA7KQotCXwJKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uIFNFTUkhCi0KLQkvLyBBbiBleHByZXNzaW9uIHN0YXRlbWVudC4gIFRoaXMgY291bGQgYmUgYSBtZXRob2QgY2FsbCwKLQkvLyBhc3NpZ25tZW50IHN0YXRlbWVudCwgb3IgYW55IG90aGVyIGV4cHJlc3Npb24gZXZhbHVhdGVkIGZvcgotCS8vIHNpZGUtZWZmZWN0cy4KLQl8CWV4cHJlc3Npb24gU0VNSSEKLQotCS8vIGNsYXNzIGRlZmluaXRpb24KLQl8CW06bW9kaWZpZXJzISBjbGFzc0RlZmluaXRpb25bI21dCi0KLQkvLyBBdHRhY2ggYSBsYWJlbCB0byB0aGUgZnJvbnQgb2YgYSBzdGF0ZW1lbnQKLQl8CUlERU5UIGM6Q09MT05eIHsjYy5zZXRUeXBlKExBQkVMRURfU1RBVCk7fSBzdGF0ZW1lbnQKLQotCS8vIElmLWVsc2Ugc3RhdGVtZW50Ci0JfAkiaWYiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBzdGF0ZW1lbnQKLQkJKAotCQkJLy8gQ09ORkxJQ1Q6IHRoZSBvbGQgImRhbmdsaW5nLWVsc2UiIHByb2JsZW0uLi4KLQkJCS8vICAgICAgICAgICBBTlRMUiBnZW5lcmF0ZXMgcHJvcGVyIGNvZGUgbWF0Y2hpbmcKLQkJCS8vCQkJIGFzIHNvb24gYXMgcG9zc2libGUuICBIdXNoIHdhcm5pbmcuCi0JCQlvcHRpb25zIHsKLQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQl9Ci0JCToKLQkJCSJlbHNlIiEgc3RhdGVtZW50Ci0JCSk/Ci0KLQkvLyBGb3Igc3RhdGVtZW50Ci0JfAkiZm9yIl4KLQkJCUxQQVJFTiEKLQkJCQlmb3JJbml0IFNFTUkhICAgLy8gaW5pdGlhbGl6ZXIKLQkJCQlmb3JDb25kCVNFTUkhICAgLy8gY29uZGl0aW9uIHRlc3QKLQkJCQlmb3JJdGVyICAgICAgICAgLy8gdXBkYXRlcgotCQkJUlBBUkVOIQotCQkJc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50IHRvIGxvb3Agb3ZlcgotCi0JLy8gV2hpbGUgc3RhdGVtZW50Ci0JfAkid2hpbGUiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBzdGF0ZW1lbnQKLQotCS8vIGRvLXdoaWxlIHN0YXRlbWVudAotCXwJImRvIl4gc3RhdGVtZW50ICJ3aGlsZSIhIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIFNFTUkhCi0KLQkvLyBnZXQgb3V0IG9mIGEgbG9vcCAob3Igc3dpdGNoKQotCXwJImJyZWFrIl4gKElERU5UKT8gU0VNSSEKLQotCS8vIGRvIG5leHQgaXRlcmF0aW9uIG9mIGEgbG9vcAotCXwJImNvbnRpbnVlIl4gKElERU5UKT8gU0VNSSEKLQotCS8vIFJldHVybiBhbiBleHByZXNzaW9uCi0JfAkicmV0dXJuIl4gKGV4cHJlc3Npb24pPyBTRU1JIQotCi0JLy8gc3dpdGNoL2Nhc2Ugc3RhdGVtZW50Ci0JfAkic3dpdGNoIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgTENVUkxZIQotCQkJKCBjYXNlc0dyb3VwICkqCi0JCVJDVVJMWSEKLQotCS8vIGV4Y2VwdGlvbiB0cnktY2F0Y2ggYmxvY2sKLQl8CXRyeUJsb2NrCi0KLQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQl8CSJ0aHJvdyJeIGV4cHJlc3Npb24gU0VNSSEKLQotCS8vIHN5bmNocm9uaXplIGEgc3RhdGVtZW50Ci0JfAkic3luY2hyb25pemVkIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgY29tcG91bmRTdGF0ZW1lbnQKLQotCS8vIGFzc2VydHMgKHVuY29tbWVudCBpZiB5b3Ugd2FudCAxLjQgY29tcGF0aWJpbGl0eSkKLQkvLyB8CSJhc3NlcnQiXiBleHByZXNzaW9uICggQ09MT04hIGV4cHJlc3Npb24gKT8gU0VNSSEKLQotCS8vIGVtcHR5IHN0YXRlbWVudAotCXwJczpTRU1JIHsjcy5zZXRUeXBlKEVNUFRZX1NUQVQpO30KLQk7Ci0KLWNhc2VzR3JvdXAKLQk6CSgJLy8gQ09ORkxJQ1Q6IHRvIHdoaWNoIGNhc2UgZ3JvdXAgZG8gdGhlIHN0YXRlbWVudHMgYmluZD8KLQkJCS8vICAgICAgICAgICBBTlRMUiBnZW5lcmF0ZXMgcHJvcGVyIGNvZGU6IGl0IGdyb3VwcyB0aGUKLQkJCS8vICAgICAgICAgICBtYW55ICJjYXNlIi8iZGVmYXVsdCIgbGFiZWxzIHRvZ2V0aGVyIHRoZW4KLQkJCS8vICAgICAgICAgICBmb2xsb3dzIHRoZW0gd2l0aCB0aGUgc3RhdGVtZW50cwotCQkJb3B0aW9ucyB7Ci0JCQkJZ3JlZWR5ID0gdHJ1ZTsKLQkJCX0KLQkJCToKLQkJCWFDYXNlCi0JCSkrCi0JCWNhc2VTTGlzdAotCQl7I2Nhc2VzR3JvdXAgPSAjKFtDQVNFX0dST1VQLCAiQ0FTRV9HUk9VUCJdLCAjY2FzZXNHcm91cCk7fQotCTsKLQotYUNhc2UKLQk6CSgiY2FzZSJeIGV4cHJlc3Npb24gfCAiZGVmYXVsdCIpIENPTE9OIQotCTsKLQotY2FzZVNMaXN0Ci0JOgkoc3RhdGVtZW50KSoKLQkJeyNjYXNlU0xpc3QgPSAjKCNbU0xJU1QsIlNMSVNUIl0sI2Nhc2VTTGlzdCk7fQotCTsKLQotLy8gVGhlIGluaXRpYWxpemVyIGZvciBhIGZvciBsb29wCi1mb3JJbml0Ci0JCS8vIGlmIGl0IGxvb2tzIGxpa2UgYSBkZWNsYXJhdGlvbiwgaXQgaXMKLQk6CSgJKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uCi0JCS8vIG90aGVyd2lzZSBpdCBjb3VsZCBiZSBhbiBleHByZXNzaW9uIGxpc3QuLi4KLQkJfAlleHByZXNzaW9uTGlzdAotCQkpPwotCQl7I2ZvckluaXQgPSAjKCNbRk9SX0lOSVQsIkZPUl9JTklUIl0sI2ZvckluaXQpO30KLQk7Ci0KLWZvckNvbmQKLQk6CShleHByZXNzaW9uKT8KLQkJeyNmb3JDb25kID0gIygjW0ZPUl9DT05ESVRJT04sIkZPUl9DT05ESVRJT04iXSwjZm9yQ29uZCk7fQotCTsKLQotZm9ySXRlcgotCToJKGV4cHJlc3Npb25MaXN0KT8KLQkJeyNmb3JJdGVyID0gIygjW0ZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIl0sI2Zvckl0ZXIpO30KLQk7Ci0KLS8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawotdHJ5QmxvY2sKLQk6CSJ0cnkiXiBjb21wb3VuZFN0YXRlbWVudAotCQkoaGFuZGxlcikqCi0JCSggZmluYWxseUNsYXVzZSApPwotCTsKLQotZmluYWxseUNsYXVzZQotCToJImZpbmFsbHkiXiBjb21wb3VuZFN0YXRlbWVudAotCTsKLQotLy8gYW4gZXhjZXB0aW9uIGhhbmRsZXIKLWhhbmRsZXIKLQk6CSJjYXRjaCJeIExQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAotCTsKLQotCi0vLyBleHByZXNzaW9ucwotLy8gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlc2UgZXhwcmVzc2lvbnMgZm9sbG93IHRoZSBwYXR0ZXJuCi0vLyAgIHRoaXNMZXZlbEV4cHJlc3Npb24gOgotLy8gICAgICAgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uCi0vLyAgICAgICAgICAgKE9QRVJBVE9SIG5leHRIaWdoZXJQcmVjZWRlbmNlRXhwcmVzc2lvbikqCi0vLyB3aGljaCBpcyBhIHN0YW5kYXJkIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBhIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KLS8vIFRoZSBvcGVyYXRvcnMgaW4gamF2YSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZXM6Ci0vLyAgICBsb3dlc3QgICgxMykgID0gKj0gLz0gJT0gKz0gLT0gPDw9ID4+PSA+Pj49ICY9IF49IHw9Ci0vLyAgICAgICAgICAgICgxMikgID86Ci0vLyAgICAgICAgICAgICgxMSkgIHx8Ci0vLyAgICAgICAgICAgICgxMCkgICYmCi0vLyAgICAgICAgICAgICggOSkgIHwKLS8vICAgICAgICAgICAgKCA4KSAgXgotLy8gICAgICAgICAgICAoIDcpICAmCi0vLyAgICAgICAgICAgICggNikgID09ICE9Ci0vLyAgICAgICAgICAgICggNSkgIDwgPD0gPiA+PQotLy8gICAgICAgICAgICAoIDQpICA8PCA+PgotLy8gICAgICAgICAgICAoIDMpICArKGJpbmFyeSkgLShiaW5hcnkpCi0vLyAgICAgICAgICAgICggMikgICogLyAlCi0vLyAgICAgICAgICAgICggMSkgICsrIC0tICsodW5hcnkpIC0odW5hcnkpICB+ICAhICAodHlwZSkKLS8vICAgICAgICAgICAgICAgICAgW10gICAoKSAobWV0aG9kIGNhbGwpICAuIChkb3QgLS0gaWRlbnRpZmllciBxdWFsaWZpY2F0aW9uKQotLy8gICAgICAgICAgICAgICAgICBuZXcgICAoKSAgKGV4cGxpY2l0IHBhcmVudGhlc2lzKQotLy8KLS8vIHRoZSBsYXN0IHR3byBhcmUgbm90IHVzdWFsbHkgb24gYSBwcmVjZWRlbmNlIGNoYXJ0OyBJIHB1dCB0aGVtIGluCi0vLyB0byBwb2ludCBvdXQgdGhhdCBuZXcgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiAnLicsIHNvIHlvdQotLy8gY2FuIHZhbGlkeSB1c2UKLS8vICAgICBuZXcgRnJhbWUoKS5zaG93KCkKLS8vCi0vLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHByZWNlZGVuY2UgbGV2ZWxzIG1hcCB0byB0aGUgcnVsZXMgYmVsb3cuLi4KLS8vIE9uY2UgeW91IGhhdmUgYSBwcmVjZWRlbmNlIGNoYXJ0LCB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBydWxlcyBhcyBiZWxvdwotLy8gICBpcyB1c3VhbGx5IHZlcnkgc3RyYWlnaHRmb3dhcmQKLQotCi0KLS8vIHRoZSBtb3RoZXIgb2YgYWxsIGV4cHJlc3Npb25zCi1leHByZXNzaW9uCi0JOglhc3NpZ25tZW50RXhwcmVzc2lvbgotCQl7I2V4cHJlc3Npb24gPSAjKCNbRVhQUiwiRVhQUiJdLCNleHByZXNzaW9uKTt9Ci0JOwotCi0KLS8vIFRoaXMgaXMgYSBsaXN0IG9mIGV4cHJlc3Npb25zLgotZXhwcmVzc2lvbkxpc3QKLQk6CWV4cHJlc3Npb24gKENPTU1BISBleHByZXNzaW9uKSoKLQkJeyNleHByZXNzaW9uTGlzdCA9ICMoI1tFTElTVCwiRUxJU1QiXSwgZXhwcmVzc2lvbkxpc3QpO30KLQk7Ci0KLQotLy8gYXNzaWdubWVudCBleHByZXNzaW9uIChsZXZlbCAxMykKLWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JOgljb25kaXRpb25hbEV4cHJlc3Npb24KLQkJKAkoCUFTU0lHTl4KLSAgICAgICAgICAgIHwgICBQTFVTX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBNSU5VU19BU1NJR05eCi0gICAgICAgICAgICB8ICAgU1RBUl9BU1NJR05eCi0gICAgICAgICAgICB8ICAgRElWX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBNT0RfQVNTSUdOXgotICAgICAgICAgICAgfCAgIFNSX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBCU1JfQVNTSUdOXgotICAgICAgICAgICAgfCAgIFNMX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBCQU5EX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBCWE9SX0FTU0lHTl4KLSAgICAgICAgICAgIHwgICBCT1JfQVNTSUdOXgotICAgICAgICAgICAgKQotCQkJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJKT8KLQk7Ci0KLQotLy8gY29uZGl0aW9uYWwgdGVzdCAobGV2ZWwgMTIpCi1jb25kaXRpb25hbEV4cHJlc3Npb24KLQk6CWxvZ2ljYWxPckV4cHJlc3Npb24KLQkJKCBRVUVTVElPTl4gYXNzaWdubWVudEV4cHJlc3Npb24gQ09MT04hIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiApPwotCTsKLQotCi0vLyBsb2dpY2FsIG9yICh8fCkgIChsZXZlbCAxMSkKLWxvZ2ljYWxPckV4cHJlc3Npb24KLQk6CWxvZ2ljYWxBbmRFeHByZXNzaW9uIChMT1JeIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gbG9naWNhbCBhbmQgKCYmKSAgKGxldmVsIDEwKQotbG9naWNhbEFuZEV4cHJlc3Npb24KLQk6CWluY2x1c2l2ZU9yRXhwcmVzc2lvbiAoTEFORF4gaW5jbHVzaXZlT3JFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gYml0d2lzZSBvciBub24tc2hvcnQtY2lyY3VpdGluZyBvciAofCkgIChsZXZlbCA5KQotaW5jbHVzaXZlT3JFeHByZXNzaW9uCi0JOglleGNsdXNpdmVPckV4cHJlc3Npb24gKEJPUl4gZXhjbHVzaXZlT3JFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gZXhjbHVzaXZlIG9yICheKSAgKGxldmVsIDgpCi1leGNsdXNpdmVPckV4cHJlc3Npb24KLQk6CWFuZEV4cHJlc3Npb24gKEJYT1JeIGFuZEV4cHJlc3Npb24pKgotCTsKLQotCi0vLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIGFuZCAoJikgIChsZXZlbCA3KQotYW5kRXhwcmVzc2lvbgotCToJZXF1YWxpdHlFeHByZXNzaW9uIChCQU5EXiBlcXVhbGl0eUV4cHJlc3Npb24pKgotCTsKLQotCi0vLyBlcXVhbGl0eS9pbmVxdWFsaXR5ICg9PS8hPSkgKGxldmVsIDYpCi1lcXVhbGl0eUV4cHJlc3Npb24KLQk6CXJlbGF0aW9uYWxFeHByZXNzaW9uICgoTk9UX0VRVUFMXiB8IEVRVUFMXikgcmVsYXRpb25hbEV4cHJlc3Npb24pKgotCTsKLQotCi0vLyBib29sZWFuIHJlbGF0aW9uYWwgZXhwcmVzc2lvbnMgKGxldmVsIDUpCi1yZWxhdGlvbmFsRXhwcmVzc2lvbgotCToJc2hpZnRFeHByZXNzaW9uCi0JCSgJKAkoCUxUXgotCQkJCXwJR1ReCi0JCQkJfAlMRV4KLQkJCQl8CUdFXgotCQkJCSkKLQkJCQlzaGlmdEV4cHJlc3Npb24KLQkJCSkqCi0JCXwJImluc3RhbmNlb2YiXiB0eXBlU3BlY1t0cnVlXQotCQkpCi0JOwotCi0KLS8vIGJpdCBzaGlmdCBleHByZXNzaW9ucyAobGV2ZWwgNCkKLXNoaWZ0RXhwcmVzc2lvbgotCToJYWRkaXRpdmVFeHByZXNzaW9uICgoU0xeIHwgU1JeIHwgQlNSXikgYWRkaXRpdmVFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gYmluYXJ5IGFkZGl0aW9uL3N1YnRyYWN0aW9uIChsZXZlbCAzKQotYWRkaXRpdmVFeHByZXNzaW9uCi0JOgltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKChQTFVTXiB8IE1JTlVTXikgbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSoKLQk7Ci0KLQotLy8gbXVsdGlwbGljYXRpb24vZGl2aXNpb24vbW9kdWxvIChsZXZlbCAyKQotbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCi0JOgl1bmFyeUV4cHJlc3Npb24gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgdW5hcnlFeHByZXNzaW9uKSoKLQk7Ci0KLXVuYXJ5RXhwcmVzc2lvbgotCToJSU5DXiB1bmFyeUV4cHJlc3Npb24KLQl8CURFQ14gdW5hcnlFeHByZXNzaW9uCi0JfAlNSU5VU14geyNNSU5VUy5zZXRUeXBlKFVOQVJZX01JTlVTKTt9IHVuYXJ5RXhwcmVzc2lvbgotCXwJUExVU14gIHsjUExVUy5zZXRUeXBlKFVOQVJZX1BMVVMpO30gdW5hcnlFeHByZXNzaW9uCi0JfAl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQk7Ci0KLXVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwotCToJQk5PVF4gdW5hcnlFeHByZXNzaW9uCi0JfAlMTk9UXiB1bmFyeUV4cHJlc3Npb24KLQotCQkvLyB1c2UgcHJlZGljYXRlIHRvIHNraXAgY2FzZXMgbGlrZTogKGludC5jbGFzcykKLSAgICB8ICAgKExQQVJFTiBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOKSA9PgotICAgICAgICBscGI6TFBBUkVOXiB7I2xwYi5zZXRUeXBlKFRZUEVDQVNUKTt9IGJ1aWx0SW5UeXBlU3BlY1t0cnVlXSBSUEFSRU4hCi0gICAgICAgIHVuYXJ5RXhwcmVzc2lvbgotCi0gICAgICAgIC8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzLiAgSWYgbm8gb3BlcmF0b3IKLSAgICAgICAgLy8gZm9sbG93cywgaXQncyBhIHR5cGVjYXN0LiAgTm8gc2VtYW50aWMgY2hlY2tpbmcgbmVlZGVkIHRvIHBhcnNlLgotICAgICAgICAvLyBpZiBpdCBfbG9va3NfIGxpa2UgYSBjYXN0LCBpdCBfaXNfIGEgY2FzdDsgZWxzZSBpdCdzIGEgIihleHByKSIKLSAgICB8CShMUEFSRU4gY2xhc3NUeXBlU3BlY1t0cnVlXSBSUEFSRU4gdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKT0+Ci0gICAgICAgIGxwOkxQQVJFTl4geyNscC5zZXRUeXBlKFRZUEVDQVNUKTt9IGNsYXNzVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQotICAgICAgICB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQotICAgIHwJcG9zdGZpeEV4cHJlc3Npb24KLQk7Ci0KLS8vIHF1YWxpZmllZCBuYW1lcywgYXJyYXkgZXhwcmVzc2lvbnMsIG1ldGhvZCBpbnZvY2F0aW9uLCBwb3N0IGluYy9kZWMKLXBvc3RmaXhFeHByZXNzaW9uCi0JOgotICAgIC8qCi0gICAgInRoaXMiISBscDE6TFBBUkVOXiBhcmdMaXN0IFJQQVJFTiEKLQkJeyNscDEuc2V0VHlwZShDVE9SX0NBTEwpO30KLQotICAgIHwgICAic3VwZXIiISBscDI6TFBBUkVOXiBhcmdMaXN0IFJQQVJFTiEKLQkJeyNscDIuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KLSAgICB8Ci0gICAgKi8KLSAgICAgICAgcHJpbWFyeUV4cHJlc3Npb24KLQotCQkoCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgb3B0aW9ucyB7Ci0JCQkJLy8gdGhlIHVzZSBvZiBwb3N0Zml4RXhwcmVzc2lvbiBpbiBTVVBFUl9DVE9SX0NBTEwgYWRkcyBET1QKLQkJCQkvLyB0byB0aGUgbG9va2FoZWFkIHNldCwgYW5kIGdpdmVzIGxvYWRzIG9mIGZhbHNlIG5vbi1kZXQKLQkJCQkvLyB3YXJuaW5ncy4KLQkJCQkvLyBzaHV0IHRoZW0gb2ZmLgotCQkJCWdlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTsKLQkJCX0KLQkJOgkqLwotICAgICAgICAgICAgRE9UXiBJREVOVAotCQkJKAlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQotCQkJCWFyZ0xpc3QKLQkJCQlSUEFSRU4hCi0JCQkpPwotCQl8CURPVF4gInRoaXMiCi0KLQkJfAlET1ReICJzdXBlciIKLSAgICAgICAgICAgICggICAvLyAobmV3IE91dGVyKCkpLnN1cGVyKCkgIChjcmVhdGUgZW5jbG9zaW5nIGluc3RhbmNlKQotICAgICAgICAgICAgICAgIGxwMzpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQotICAgICAgICAgICAgICAgIHsjbHAzLnNldFR5cGUoU1VQRVJfQ1RPUl9DQUxMKTt9Ci0JCQl8ICAgRE9UXiBJREVOVAotICAgICAgICAgICAgICAgICgJbHBzOkxQQVJFTl4geyNscHMuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQotICAgICAgICAgICAgICAgICAgICBhcmdMaXN0Ci0gICAgICAgICAgICAgICAgICAgIFJQQVJFTiEKLSAgICAgICAgICAgICAgICApPwotICAgICAgICAgICAgKQotCQl8CURPVF4gbmV3RXhwcmVzc2lvbgotCQl8CWxiOkxCUkFDS14geyNsYi5zZXRUeXBlKElOREVYX09QKTt9IGV4cHJlc3Npb24gUkJSQUNLIQotCQkpKgotCi0JCSggICAvLyBwb3NzaWJseSBhZGQgb24gYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudC4KLSAgICAgICAgICAgIC8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjawotCQkJaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KLQkgCXwJZGU6REVDXiB7I2RlLnNldFR5cGUoUE9TVF9ERUMpO30KLQkJKT8KLSAJOwotCi0vLyB0aGUgYmFzaWMgZWxlbWVudCBvZiBhbiBleHByZXNzaW9uCi1wcmltYXJ5RXhwcmVzc2lvbgotCToJaWRlbnRQcmltYXJ5ICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6IERPVF4gImNsYXNzIiApPwotICAgIHwgICBjb25zdGFudAotCXwJInRydWUiCi0JfAkiZmFsc2UiCi0JfAkibnVsbCIKLSAgICB8ICAgbmV3RXhwcmVzc2lvbgotCXwJInRoaXMiCi0JfAkic3VwZXIiCi0JfAlMUEFSRU4hIGFzc2lnbm1lbnRFeHByZXNzaW9uIFJQQVJFTiEKLQkJLy8gbG9vayBmb3IgaW50LmNsYXNzIGFuZCBpbnRbXS5jbGFzcwotCXwJYnVpbHRJblR5cGUKLQkJKCBsYnQ6TEJSQUNLXiB7I2xidC5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISApKgotCQlET1ReICJjbGFzcyIKLQk7Ci0KLS8qKiBNYXRjaCBhLCBhLmIuYyByZWZzLCBhLmIuYyguLi4pIHJlZnMsIGEuYi5jW10sIGEuYi5jW10uY2xhc3MsCi0gKiAgYW5kIGEuYi5jLmNsYXNzIHJlZnMuICBBbHNvIHRoaXMoLi4uKSBhbmQgc3VwZXIoLi4uKS4gIE1hdGNoCi0gKiAgdGhpcyBvciBzdXBlci4KLSAqLwotaWRlbnRQcmltYXJ5Ci0JOglJREVOVAotCQkoCi0gICAgICAgICAgICBvcHRpb25zIHsKLQkJCQkvLyAuaWRlbnQgY291bGQgbWF0Y2ggaGVyZSBvciBpbiBwb3N0Zml4RXhwcmVzc2lvbi4KLQkJCQkvLyBXZSBkbyB3YW50IHRvIG1hdGNoIGhlcmUuICBUdXJuIG9mZiB3YXJuaW5nLgotCQkJCWdyZWVkeT10cnVlOwotCQkJfQotCQk6CURPVF4gSURFTlQKLQkJKSoKLQkJKAotICAgICAgICAgICAgb3B0aW9ucyB7Ci0JCQkJLy8gQVJSQVlfREVDTEFSQVRPUiBoZXJlIGNvbmZsaWN0cyB3aXRoIElOREVYX09QIGluCi0JCQkJLy8gcG9zdGZpeEV4cHJlc3Npb24gb24gTEJSQUNLIFJCUkFDSy4KLQkJCQkvLyBXZSB3YW50IHRvIG1hdGNoIFtdIGhlcmUsIHNvIGdyZWVkeS4gIFRoaXMgb3ZlcmNvbWVzCi0gICAgICAgICAgICAgICAgLy8gbGltaXRhdGlvbiBvZiBsaW5lYXIgYXBwcm94aW1hdGUgbG9va2FoZWFkLgotCQkJCWdyZWVkeT10cnVlOwotCQkgICAgfQotCQk6ICAgKCBscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fSBhcmdMaXN0IFJQQVJFTiEgKQotCQl8CSggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6Ci0gICAgICAgICAgICAgIGxiYzpMQlJBQ0teIHsjbGJjLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCi0gICAgICAgICAgICApKwotCQkpPwotICAgIDsKLQotLyoqIG9iamVjdCBpbnN0YW50aWF0aW9uLgotICogIFRyZWVzIGFyZSBidWlsdCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGlucHV0L3RyZWUgcGFpcnM6Ci0gKgotICogIG5ldyBUKCkKLSAqCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICAgVCAtLSAgRUxJU1QKLSAqICAgICAgICAgICB8Ci0gKiAgICAgICAgICBhcmcxIC0tIGFyZzIgLS0gLi4gLS0gYXJnbgotICoKLSAqICBuZXcgaW50W10KLSAqCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgotICoKLSAqICBuZXcgaW50W10gezEsMn0KLSAqCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUiAtLSBBUlJBWV9JTklUCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUiAtLSBFWFBSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgIDIKLSAqCi0gKiAgbmV3IGludFszXQotICogIG5ldwotICogICB8Ci0gKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IKLSAqICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgICBFWFBSCi0gKiAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAzCi0gKgotICogIG5ldyBpbnRbMV1bMl0KLSAqCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgotICogICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgIEFSUkFZX0RFQ0xBUkFUT1IgLS0gRVhQUgotICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICBFWFBSICAgICAgICAgICAgIDEKLSAqICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgICAyCi0gKgotICovCi1uZXdFeHByZXNzaW9uCi0JOgkibmV3Il4gdHlwZQotCQkoCUxQQVJFTiEgYXJnTGlzdCBSUEFSRU4hIChjbGFzc0Jsb2NrKT8KLQotCQkJLy9qYXZhIDEuMQotCQkJLy8gTm90ZTogVGhpcyB3aWxsIGFsbG93IGJhZCBjb25zdHJ1Y3RzIGxpa2UKLQkJCS8vICAgIG5ldyBpbnRbNF1bXVszXSB7ZXhwLGV4cH0uCi0JCQkvLyAgICBUaGVyZSBuZWVkcyB0byBiZSBhIHNlbWFudGljIGNoZWNrIGhlcmUuLi4KLQkJCS8vIHRvIG1ha2Ugc3VyZToKLQkJCS8vICAgYSkgWyBleHByIF0gYW5kIFsgXSBhcmUgbm90IG1peGVkCi0JCQkvLyAgIGIpIFsgZXhwciBdIGFuZCBhbiBpbml0IGFyZSBub3QgdXNlZCB0b2dldGhlcgotCi0JCXwJbmV3QXJyYXlEZWNsYXJhdG9yIChhcnJheUluaXRpYWxpemVyKT8KLQkJKQotCTsKLQotYXJnTGlzdAotCToJKAlleHByZXNzaW9uTGlzdAotCQl8CS8qbm90aGluZyovCi0JCQl7I2FyZ0xpc3QgPSAjW0VMSVNULCJFTElTVCJdO30KLQkJKQotCTsKLQotbmV3QXJyYXlEZWNsYXJhdG9yCi0JOgkoCi0JCQkvLyBDT05GTElDVDoKLQkJCS8vIG5ld0V4cHJlc3Npb24gaXMgYSBwcmltYXJ5RXhwcmVzc2lvbiB3aGljaCBjYW4gYmUKLQkJCS8vIGZvbGxvd2VkIGJ5IGFuIGFycmF5IGluZGV4IHJlZmVyZW5jZS4gIFRoaXMgaXMgb2ssCi0JCQkvLyBhcyB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBzdGF5IGluIHRoaXMgbG9vcCBhcwotCQkJLy8gbG9uZyBhcyBpdCBzZWVzIGFuIExCUkFDSyAocHJvcGVyIGJlaGF2aW9yKQotCQkJb3B0aW9ucyB7Ci0JCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJfQotCQk6Ci0JCQlsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9Ci0JCQkJKGV4cHJlc3Npb24pPwotCQkJUkJSQUNLIQotCQkpKwotCTsKLQotY29uc3RhbnQKLQk6CU5VTV9JTlQKLQl8CUNIQVJfTElURVJBTAotCXwJU1RSSU5HX0xJVEVSQUwKLQl8CU5VTV9GTE9BVAotCXwJTlVNX0xPTkcKLQl8CU5VTV9ET1VCTEUKLQk7Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUaGUgSmF2YSBzY2FubmVyCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIEphdmFMZXhlciBleHRlbmRzIExleGVyOwotCi1vcHRpb25zIHsKLQlleHBvcnRWb2NhYj1KYXZhOyAgICAgIC8vIGNhbGwgdGhlIHZvY2FidWxhcnkgIkphdmEiCi0JdGVzdExpdGVyYWxzPWZhbHNlOyAgICAvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCi0Jaz00OyAgICAgICAgICAgICAgICAgICAvLyBmb3VyIGNoYXJhY3RlcnMgb2YgbG9va2FoZWFkCi0JY2hhclZvY2FidWxhcnk9J1x1MDAwMycuLidcdTdGRkUnOwotCS8vIHdpdGhvdXQgaW5saW5pbmcgc29tZSBiaXRzZXQgdGVzdHMsIGNvdWxkbid0IGRvIHVuaWNvZGU7Ci0JLy8gSSBuZWVkIHRvIG1ha2UgQU5UTFIgZ2VuZXJhdGUgc21hbGxlciBiaXRzZXRzOyBzZWUKLQkvLyBib3R0b20gb2YgSmF2YUxleGVyLmphdmEKLQljb2RlR2VuQml0c2V0VGVzdFRocmVzaG9sZD0yMDsKLX0KLQotCi0KLS8vIE9QRVJBVE9SUwotUVVFU1RJT04JCToJJz8nCQk7Ci1MUEFSRU4JCQk6CScoJwkJOwotUlBBUkVOCQkJOgknKScJCTsKLUxCUkFDSwkJCToJJ1snCQk7Ci1SQlJBQ0sJCQk6CSddJwkJOwotTENVUkxZCQkJOgkneycJCTsKLVJDVVJMWQkJCToJJ30nCQk7Ci1DT0xPTgkJCToJJzonCQk7Ci1DT01NQQkJCToJJywnCQk7Ci0vL0RPVAkJCToJJy4nCQk7Ci1BU1NJR04JCQk6CSc9JwkJOwotRVFVQUwJCQk6CSI9PSIJOwotTE5PVAkJCToJJyEnCQk7Ci1CTk9UCQkJOgknficJCTsKLU5PVF9FUVVBTAkJOgkiIT0iCTsKLURJVgkJCQk6CScvJwkJOwotRElWX0FTU0lHTgkJOgkiLz0iCTsKLVBMVVMJCQk6CScrJwkJOwotUExVU19BU1NJR04JCToJIis9Igk7Ci1JTkMJCQkJOgkiKysiCTsKLU1JTlVTCQkJOgknLScJCTsKLU1JTlVTX0FTU0lHTgk6CSItPSIJOwotREVDCQkJCToJIi0tIgk7Ci1TVEFSCQkJOgknKicJCTsKLVNUQVJfQVNTSUdOCQk6CSIqPSIJOwotTU9ECQkJCToJJyUnCQk7Ci1NT0RfQVNTSUdOCQk6CSIlPSIJOwotU1IJCQkJOgkiPj4iCTsKLVNSX0FTU0lHTgkJOgkiPj49Igk7Ci1CU1IJCQkJOgkiPj4+Igk7Ci1CU1JfQVNTSUdOCQk6CSI+Pj49Igk7Ci1HRQkJCQk6CSI+PSIJOwotR1QJCQkJOgkiPiIJCTsKLVNMCQkJCToJIjw8Igk7Ci1TTF9BU1NJR04JCToJIjw8PSIJOwotTEUJCQkJOgkiPD0iCTsKLUxUCQkJCToJJzwnCQk7Ci1CWE9SCQkJOgknXicJCTsKLUJYT1JfQVNTSUdOCQk6CSJePSIJOwotQk9SCQkJCToJJ3wnCQk7Ci1CT1JfQVNTSUdOCQk6CSJ8PSIJOwotTE9SCQkJCToJInx8Igk7Ci1CQU5ECQkJOgknJicJCTsKLUJBTkRfQVNTSUdOCQk6CSImPSIJOwotTEFORAkJCToJIiYmIgk7Ci1TRU1JCQkJOgknOycJCTsKLQotCi0vLyBXaGl0ZXNwYWNlIC0tIGlnbm9yZWQKLVdTCToJKAknICcKLQkJfAknXHQnCi0JCXwJJ1xmJwotCQkJLy8gaGFuZGxlIG5ld2xpbmVzCi0JCXwJKAlvcHRpb25zIHtnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fQotCQkJOgkiXHJcbiIgIC8vIEV2aWwgRE9TCi0JCQl8CSdccicgICAgLy8gTWFjaW50b3NoCi0JCQl8CSdcbicgICAgLy8gVW5peCAodGhlIHJpZ2h0IHdheSkKLQkJCSkKLQkJCXsgbmV3bGluZSgpOyB9Ci0JCSkrCi0JCXsgX3R0eXBlID0gVG9rZW4uU0tJUDsgfQotCTsKLQotLy8gU2luZ2xlLWxpbmUgY29tbWVudHMKLVNMX0NPTU1FTlQKLQk6CSIvLyIKLQkJKH4oJ1xuJ3wnXHInKSkqICgnXG4nfCdccicoJ1xuJyk/KT8KLQkJeyRzZXRUeXBlKFRva2VuLlNLSVApOyBuZXdsaW5lKCk7fQotCTsKLQotLy8gbXVsdGlwbGUtbGluZSBjb21tZW50cwotTUxfQ09NTUVOVAotCToJIi8qIgotCQkoCS8qCSdccicgJ1xuJyBjYW4gYmUgbWF0Y2hlZCBpbiBvbmUgYWx0ZXJuYXRpdmUgb3IgYnkgbWF0Y2hpbmcKLQkJCQknXHInIGluIG9uZSBpdGVyYXRpb24gYW5kICdcbicgaW4gYW5vdGhlci4gIEkgYW0gdHJ5aW5nIHRvCi0JCQkJaGFuZGxlIGFueSBmbGF2b3Igb2YgbmV3bGluZSB0aGF0IGNvbWVzIGluLCBidXQgdGhlIGxhbmd1YWdlCi0JCQkJdGhhdCBhbGxvd3MgYm90aCAiXHJcbiIgYW5kICJcciIgYW5kICJcbiIgdG8gYWxsIGJlIHZhbGlkCi0JCQkJbmV3bGluZSBpcyBhbWJpZ3VvdXMuICBDb25zZXF1ZW50bHksIHRoZSByZXN1bHRpbmcgZ3JhbW1hcgotCQkJCW11c3QgYmUgYW1iaWd1b3VzLiAgSSdtIHNodXR0aW5nIHRoaXMgd2FybmluZyBvZmYuCi0JCQkgKi8KLQkJCW9wdGlvbnMgewotCQkJCWdlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTsKLQkJCX0KLQkJOgotCQkJeyBMQSgyKSE9Jy8nIH0/ICcqJwotCQl8CSdccicgJ1xuJwkJe25ld2xpbmUoKTt9Ci0JCXwJJ1xyJwkJCXtuZXdsaW5lKCk7fQotCQl8CSdcbicJCQl7bmV3bGluZSgpO30KLQkJfAl+KCcqJ3wnXG4nfCdccicpCi0JCSkqCi0JCSIqLyIKLQkJeyRzZXRUeXBlKFRva2VuLlNLSVApO30KLQk7Ci0KLQotLy8gY2hhcmFjdGVyIGxpdGVyYWxzCi1DSEFSX0xJVEVSQUwKLQk6CSdcJycgKCBFU0MgfCB+KCdcJyd8J1xuJ3wnXHInfCdcXCcpICkgJ1wnJwotCTsKLQotLy8gc3RyaW5nIGxpdGVyYWxzCi1TVFJJTkdfTElURVJBTAotCToJJyInIChFU0N8fignIid8J1xcJ3wnXG4nfCdccicpKSogJyInCi0JOwotCi0KLS8vIGVzY2FwZSBzZXF1ZW5jZSAtLSBub3RlIHRoYXQgdGhpcyBpcyBwcm90ZWN0ZWQ7IGl0IGNhbiBvbmx5IGJlIGNhbGxlZAotLy8gICBmcm9tIGFub3RoZXIgbGV4ZXIgcnVsZSAtLSBpdCB3aWxsIG5vdCBldmVyIGRpcmVjdGx5IHJldHVybiBhIHRva2VuIHRvCi0vLyAgIHRoZSBwYXJzZXIKLS8vIFRoZXJlIGFyZSB2YXJpb3VzIGFtYmlndWl0aWVzIGh1c2hlZCBpbiB0aGlzIHJ1bGUuICBUaGUgb3B0aW9uYWwKLS8vICcwJy4uLic5JyBkaWdpdCBtYXRjaGVzIHNob3VsZCBiZSBtYXRjaGVkIGhlcmUgcmF0aGVyIHRoYW4gbGV0dGluZwotLy8gdGhlbSBnbyBiYWNrIHRvIFNUUklOR19MSVRFUkFMIHRvIGJlIG1hdGNoZWQuICBBTlRMUiBkb2VzIHRoZQotLy8gcmlnaHQgdGhpbmcgYnkgbWF0Y2hpbmcgaW1tZWRpYXRlbHk7IGhlbmNlLCBpdCdzIG9rIHRvIHNodXQgb2ZmCi0vLyB0aGUgRk9MTE9XIGFtYmlnIHdhcm5pbmdzLgotcHJvdGVjdGVkCi1FU0MKLQk6CSdcXCcKLQkJKAknbicKLQkJfAkncicKLQkJfAkndCcKLQkJfAknYicKLQkJfAknZicKLQkJfAknIicKLQkJfAknXCcnCi0JCXwJJ1xcJwotCQl8CSgndScpKyBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQKLQkJfAknMCcuLiczJwotCQkJKAotCQkJCW9wdGlvbnMgewotCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQkJfQotCQkJOgknMCcuLic3JwotCQkJCSgKLQkJCQkJb3B0aW9ucyB7Ci0JCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQk6CScwJy4uJzcnCi0JCQkJKT8KLQkJCSk/Ci0JCXwJJzQnLi4nNycKLQkJCSgKLQkJCQlvcHRpb25zIHsKLQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJCX0KLQkJCToJJzAnLi4nNycKLQkJCSk/Ci0JCSkKLQk7Ci0KLQotLy8gaGV4YWRlY2ltYWwgZGlnaXQgKGFnYWluLCBub3RlIGl0J3MgcHJvdGVjdGVkISkKLXByb3RlY3RlZAotSEVYX0RJR0lUCi0JOgkoJzAnLi4nOSd8J0EnLi4nRid8J2EnLi4nZicpCi0JOwotCi0KLS8vIGFuIGlkZW50aWZpZXIuICBOb3RlIHRoYXQgdGVzdExpdGVyYWxzIGlzIHNldCB0byB0cnVlISAgVGhpcyBtZWFucwotLy8gdGhhdCBhZnRlciB3ZSBtYXRjaCB0aGUgcnVsZSwgd2UgbG9vayBpbiB0aGUgbGl0ZXJhbHMgdGFibGUgdG8gc2VlCi0vLyBpZiBpdCdzIGEgbGl0ZXJhbCBvciByZWFsbHkgYW4gaWRlbnRpZmVyCi1JREVOVAotCW9wdGlvbnMge3Rlc3RMaXRlcmFscz10cnVlO30KLQk6CSgnYScuLid6J3wnQScuLidaJ3wnXyd8JyQnKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknfCckJykqCi0JOwotCi0KLS8vIGEgbnVtZXJpYyBsaXRlcmFsCi1OVU1fSU5UCi0Je2Jvb2xlYW4gaXNEZWNpbWFsPWZhbHNlOyBUb2tlbiB0PW51bGw7fQotICAgIDogICAnLicge190dHlwZSA9IERPVDt9Ci0gICAgICAgICAgICAoCSgnMCcuLic5JykrIChFWFBPTkVOVCk/IChmMTpGTE9BVF9TVUZGSVgge3Q9ZjE7fSk/Ci0gICAgICAgICAgICAgICAgewotCQkJCWlmICh0ICE9IG51bGwgJiYgdC5nZXRUZXh0KCkudG9VcHBlckNhc2UoKS5pbmRleE9mKCdGJyk+PTApIHsKLSAgICAgICAgICAgICAgICAJX3R0eXBlID0gTlVNX0ZMT0FUOwotCQkJCX0KLQkJCQllbHNlIHsKLSAgICAgICAgICAgICAgICAJX3R0eXBlID0gTlVNX0RPVUJMRTsgLy8gYXNzdW1lIGRvdWJsZQotCQkJCX0KLQkJCQl9Ci0gICAgICAgICAgICApPwotCi0JfAkoCScwJyB7aXNEZWNpbWFsID0gdHJ1ZTt9IC8vIHNwZWNpYWwgY2FzZSBmb3IganVzdCAnMCcKLQkJCSgJKCd4J3wnWCcpCi0JCQkJKAkJCQkJCQkJCQkJLy8gaGV4Ci0JCQkJCS8vIHRoZSAnZSd8J0UnIGFuZCBmbG9hdCBzdWZmaXggc3R1ZmYgbG9vawotCQkJCQkvLyBsaWtlIGhleCBkaWdpdHMsIGhlbmNlIHRoZSAoLi4uKSsgZG9lc24ndAotCQkJCQkvLyBrbm93IHdoZW4gdG8gc3RvcDogYW1iaWcuICBBTlRMUiByZXNvbHZlcwotCQkJCQkvLyBpdCBjb3JyZWN0bHkgYnkgbWF0Y2hpbmcgaW1tZWRpYXRlbHkuICBJdAotCQkJCQkvLyBpcyB0aGVyZWZvciBvayB0byBodXNoIHdhcm5pbmcuCi0JCQkJCW9wdGlvbnMgewotCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTsKLQkJCQkJfQotCQkJCToJSEVYX0RJR0lUCi0JCQkJKSsKLQotCQkJfAkvL2Zsb2F0IG9yIGRvdWJsZSB3aXRoIGxlYWRpbmcgemVybwotCQkJCSgoJzAnLi4nOScpKyAoJy4nfEVYUE9ORU5UfEZMT0FUX1NVRkZJWCkpID0+ICgnMCcuLic5JykrCi0KLQkJCXwJKCcwJy4uJzcnKSsJCQkJCQkJCQkvLyBvY3RhbAotCQkJKT8KLQkJfAkoJzEnLi4nOScpICgnMCcuLic5JykqICB7aXNEZWNpbWFsPXRydWU7fQkJLy8gbm9uLXplcm8gZGVjaW1hbAotCQkpCi0JCSgJKCdsJ3wnTCcpIHsgX3R0eXBlID0gTlVNX0xPTkc7IH0KLQotCQkvLyBvbmx5IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGEgZmxvYXQgaWYgbG9va3MgbGlrZSBkZWNpbWFsIHNvIGZhcgotCQl8CXtpc0RlY2ltYWx9PwotICAgICAgICAgICAgKCAgICcuJyAoJzAnLi4nOScpKiAoRVhQT05FTlQpPyAoZjI6RkxPQVRfU1VGRklYIHt0PWYyO30pPwotICAgICAgICAgICAgfCAgIEVYUE9ORU5UIChmMzpGTE9BVF9TVUZGSVgge3Q9ZjM7fSk/Ci0gICAgICAgICAgICB8ICAgZjQ6RkxPQVRfU1VGRklYIHt0PWY0O30KLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLQkJCWlmICh0ICE9IG51bGwgJiYgdC5nZXRUZXh0KCkudG9VcHBlckNhc2UoKSAuaW5kZXhPZignRicpID49IDApIHsKLSAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fRkxPQVQ7Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgIAlfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCi0JCQl9Ci0JCQl9Ci0gICAgICAgICk/Ci0JOwotCi0KLS8vIGEgY291cGxlIHByb3RlY3RlZCBtZXRob2RzIHRvIGFzc2lzdCBpbiBtYXRjaGluZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1wcm90ZWN0ZWQKLUVYUE9ORU5UCi0JOgkoJ2UnfCdFJykgKCcrJ3wnLScpPyAoJzAnLi4nOScpKwotCTsKLQotCi1wcm90ZWN0ZWQKLUZMT0FUX1NVRkZJWAotCToJJ2YnfCdGJ3wnZCd8J0QnCi0JOwotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL21ha2UtYW50bHItcnVudGltZS5zaCBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL21ha2UtYW50bHItcnVudGltZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0MDlhYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9tYWtlLWFudGxyLXJ1bnRpbWUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgc2NyaXB0IHRvIG1ha2UgYSBydW50aW1lIGphciBvdXQgb2YgYW50bHIgZGlzdHJvCi0jCi0jIHVzYWdlOiAgbWFrZS1hbnRsci1ydW50aW1lLnNoCi0jICh3aGVuIGV4ZWN1dGVkIGluIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGFudGxyLTIueC54LmphcgotIyAocG9wcyByZXN1bHQgaW4gYW50bHItcnVudGltZS5qYXIpCi0jCi0jIEBhdXRob3IgIkplcmVteSBSYXluZXIiPGdyb292eUByb3NzLXJheW5lci5jb20+Ci0jIFRoYW5rcyB0byBDaHJpc3RvcGhlciBTY2h1bHR6Ci0KLWphciB4dmYgYW50bHItMi43LjUuamFyCi0KLW1rZGlyIGFudGxyLXJ1bnRpbWUKLW1rZGlyIGFudGxyLXJ1bnRpbWUvYW50bHIKLW1rZGlyIGFudGxyLXJ1bnRpbWUvYW50bHIvY29sbGVjdGlvbnMKLW1rZGlyIGFudGxyLXJ1bnRpbWUvYW50bHIvY29sbGVjdGlvbnMvaW1wbAotbWtkaXIgYW50bHItcnVudGltZS9hbnRsci9kZWJ1ZwotbWtkaXIgYW50bHItcnVudGltZS9hbnRsci9kZWJ1Zy9taXNjCi0KLWNwIGFudGxyL0FOVExSRXhjZXB0aW9uLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0FOVExSSGFzaFN0cmluZy5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9BTlRMUlN0cmluZ0J1ZmZlci5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9BU1RGYWN0b3J5LmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0FTVFBhaXIuY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvQmFzZUFTVC5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9CeXRlQnVmZmVyLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0NoYXJCdWZmZXIuY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvQ2hhckZvcm1hdHRlci5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9DaGFyUXVldWUuY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvQ2hhclNjYW5uZXIuY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvQ2hhclN0cmVhbUV4Y2VwdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9DaGFyU3RyZWFtSU9FeGNlcHRpb24uY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvQ29tbW9uQVNULmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0NvbW1vblRva2VuLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0lucHV0QnVmZmVyLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL0xMa1BhcnNlci5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9MZXhlclNoYXJlZElucHV0U3RhdGUuY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24uY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL05vVmlhYmxlQWx0RXhjZXB0aW9uLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL05vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9QYXJzZXJTaGFyZWRJbnB1dFN0YXRlLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL1BhcnNlci5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9SZWNvZ25pdGlvbkV4Y2VwdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9TZW1hbnRpY0V4Y2VwdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9TdHJpbmdVdGlscy5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9Ub2tlbkJ1ZmZlci5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9Ub2tlblF1ZXVlLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL1Rva2VuU3RyZWFtRXhjZXB0aW9uLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIKLWNwIGFudGxyL1Rva2VuU3RyZWFtSU9FeGNlcHRpb24uY2xhc3MgYW50bHItcnVudGltZS9hbnRscgotY3AgYW50bHIvVG9rZW5TdHJlYW1SZWNvZ25pdGlvbkV4Y2VwdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9Ub2tlblN0cmVhbS5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9Ub2tlbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyCi1jcCBhbnRsci9jb2xsZWN0aW9ucy9BU1RFbnVtZXJhdGlvbi5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2NvbGxlY3Rpb25zCi1jcCBhbnRsci9jb2xsZWN0aW9ucy9BU1QuY2xhc3MgYW50bHItcnVudGltZS9hbnRsci9jb2xsZWN0aW9ucwotY3AgYW50bHIvY29sbGVjdGlvbnMvaW1wbC9BU1RBcnJheS5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2NvbGxlY3Rpb25zL2ltcGwKLWNwIGFudGxyL2NvbGxlY3Rpb25zL2ltcGwvQml0U2V0LmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIvY29sbGVjdGlvbnMvaW1wbAotY3AgYW50bHIvY29sbGVjdGlvbnMvaW1wbC9JbnRSYW5nZS5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2NvbGxlY3Rpb25zL2ltcGwKLWNwIGFudGxyL2NvbGxlY3Rpb25zL2ltcGwvVmVjdG9yLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIvY29sbGVjdGlvbnMvaW1wbAotY3AgYW50bHIvZGVidWcvbWlzYy9BU1RGcmFtZVwkMS5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2RlYnVnL21pc2MKLWNwIGFudGxyL2RlYnVnL21pc2MvQVNURnJhbWVcJE15VHJlZVNlbGVjdGlvbkxpc3RlbmVyLmNsYXNzIGFudGxyLXJ1bnRpbWUvYW50bHIvZGVidWcvbWlzYwotY3AgYW50bHIvZGVidWcvbWlzYy9BU1RGcmFtZS5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2RlYnVnL21pc2MKLWNwIGFudGxyL2RlYnVnL21pc2MvSlRyZWVBU1RNb2RlbC5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2RlYnVnL21pc2MKLWNwIGFudGxyL2RlYnVnL21pc2MvSlRyZWVBU1RQYW5lbC5jbGFzcyBhbnRsci1ydW50aW1lL2FudGxyL2RlYnVnL21pc2MKLQotY2QgYW50bHItcnVudGltZQotamFyIGN2ZiAuLi9hbnRsci1ydW50aW1lLmphciBhbnRscgotY2QgLi4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL3N0dWRtYW5QbHVzR3Jvb3Z5LmcgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9zdHVkbWFuUGx1c0dyb292eS5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNkYWQ2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9taXNjL3N0dWRtYW5QbHVzR3Jvb3Z5LmcKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMwICswLDAgQEAKLWhlYWRlciB7Ci1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQlpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQlpbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0JaW1wb3J0IGFudGxyLklucHV0QnVmZmVyOwotCWltcG9ydCBhbnRsci5MZXhlclNoYXJlZElucHV0U3RhdGU7Ci19Ci0gCi0vKiogSlNSLTI0MSBHcm9vdnkgUmVjb2duaXplcgotICoKLSAqIFJ1biAnamF2YSBNYWluIFstc2hvd3RyZWVdIGRpcmVjdG9yeS1mdWxsLW9mLWdyb292eS1maWxlcycKLSAqCi0gKiBbVGhlIC1zaG93dHJlZSBvcHRpb24gcG9wcyB1cCBhIFN3aW5nIGZyYW1lIHRoYXQgc2hvd3MKLSAqICB0aGUgQVNUIGNvbnN0cnVjdGVkIGZyb20gdGhlIHBhcnNlci5dCi0gKgotICogQ29udHJpYnV0aW5nIGF1dGhvcnM6Ci0gKgkJSm9obiBNaXRjaGVsbAkJam9obm1Abm9uLm5ldAotICoJCVRlcmVuY2UgUGFycgkJcGFycnRAbWFnZWxhbmcuY29tCi0gKgkJSm9obiBMaWxsZXkJCWpsaWxsZXlAZW1wYXRoeS5jb20KLSAqCQlTY290dCBTdGFuY2hmaWVsZAl0aGV0aWNrQG1hZ2VsYW5nLmNvbQotICoJCU1hcmt1cyBNb2huZW4JCW1vaG5lbkBpbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlCi0gKgkJUGV0ZXIgV2lsbGlhbXMJCXBldGUud2lsbGlhbXNAc3VuLmNvbQotICoJCUFsbGFuIEphY29icwkJQWxsYW4uSmFjb2JzQGVuZy5zdW4uY29tCi0gKgkJU3RldmUgTWVzc2ljawkJbWVzc2lja0ByZWRoaWxscy5jb20KLSAqCQlKb2huIFB5YnVzCQlqb2huQHB5YnVzLm9yZwotICoJCUpvaG4gUm9zZQkJcm9zZTAwQG1hYy5jb20KLSAqCQlKZXJlbXkgUmF5bmVyCQlncm9vdnlAcm9zcy1yYXluZXIuY29tCi0gKgotICogVmVyc2lvbiAxLjAwIERlY2VtYmVyIDksIDE5OTcgLS0gaW5pdGlhbCByZWxlYXNlCi0gKiBWZXJzaW9uIDEuMDEgRGVjZW1iZXIgMTAsIDE5OTcKLSAqCQlmaXhlZCBidWcgaW4gb2N0YWwgZGVmICgwLi43IG5vdCAwLi44KQotICogVmVyc2lvbiAxLjEwIEF1Z3VzdCAxOTk4IChwYXJydCkKLSAqCQlhZGRlZCB0cmVlIGNvbnN0cnVjdGlvbgotICoJCWZpeGVkIGRlZmluaXRpb24gb2YgV1MsY29tbWVudHMgZm9yIG1hYyxwYyx1bml4IG5ld2xpbmVzCi0gKgkJYWRkZWQgdW5hcnkgcGx1cwotICogVmVyc2lvbiAxLjExIChOb3YgMjAsIDE5OTgpCi0gKgkJQWRkZWQgInNodXR1cCIgb3B0aW9uIHRvIHR1cm4gb2ZmIGxhc3QgYW1iaWcgd2FybmluZy4KLSAqCQlGaXhlZCBpbm5lciBjbGFzcyBkZWYgdG8gYWxsb3cgbmFtZWQgY2xhc3MgZGVmcyBhcyBzdGF0ZW1lbnRzCi0gKgkJc3luY2hyb25pemVkIHJlcXVpcmVzIGNvbXBvdW5kIG5vdCBzaW1wbGUgc3RhdGVtZW50Ci0gKgkJYWRkIFtdIGFmdGVyIGJ1aWx0SW5UeXBlIERPVCBjbGFzcyBpbiBwcmltYXJ5RXhwcmVzc2lvbgotICoJCSJjb25zdCIgaXMgcmVzZXJ2ZWQgYnV0IG5vdCB2YWxpZC4ucmVtb3ZlZCBmcm9tIG1vZGlmaWVycwotICogVmVyc2lvbiAxLjEyIChGZWIgMiwgMTk5OSkKLSAqCQlDaGFuZ2VkIExJVEVSQUxfeHh4IHRvIHh4eCBpbiB0cmVlIGdyYW1tYXIuCi0gKgkJVXBkYXRlZCBqYXZhLmcgdG8gdXNlIHRva2VucyB7Li4ufSBub3cgZm9yIDIuNi4wIChuZXcgZmVhdHVyZSkuCi0gKgotICogVmVyc2lvbiAxLjEzIChBcHIgMjMsIDE5OTkpCi0gKgkJRGlkbid0IGhhdmUgKHN0YXQpPyBmb3IgZWxzZSBjbGF1c2UgaW4gdHJlZSBwYXJzZXIuCi0gKgkJRGlkbid0IGdlbiBBU1RzIGZvciBpbnRlcmZhY2UgZXh0ZW5kcy4gIFVwZGF0ZWQgdHJlZSBwYXJzZXIgdG9vLgotICoJCVVwZGF0ZWQgdG8gMi42LjAuCi0gKiBWZXJzaW9uIDEuMTQgKEp1biAyMCwgMTk5OSkKLSAqCQlBbGxvd2VkIGZpbmFsL2Fic3RyYWN0IG9uIGxvY2FsIGNsYXNzZXMuCi0gKgkJUmVtb3ZlZCBsb2NhbCBpbnRlcmZhY2VzIGZyb20gbWV0aG9kcwotICoJCVB1dCBpbnN0YW5jZW9mIHByZWNlZGVuY2Ugd2hlcmUgaXQgYmVsb25ncy4uLmluIHJlbGF0aW9uYWxFeHByCi0gKgkJCUl0IGFsc28gaGFkIGV4cHIgbm90IHR5cGUgYXMgYXJnOyBmaXhlZCBpdC4KLSAqCQlNaXNzaW5nICEgb24gU0VNSSBpbiBjbGFzc0Jsb2NrCi0gKgkJZml4ZWQ6IChleHByKSArICJzdHJpbmciIHdhcyBwYXJzZWQgaW5jb3JyZWN0bHkgKCsgYXMgdW5hcnkgcGx1cykuCi0gKgkJZml4ZWQ6IGRpZG4ndCBsaWtlIE9iamVjdFtdLmNsYXNzIGluIHBhcnNlciBvciB0cmVlIHBhcnNlcgotICogVmVyc2lvbiAxLjE1IChKdW4gMjYsIDE5OTkpCi0gKgkJU2NyZXdlZCB1cCBydWxlIHdpdGggaW5zdGFuY2VvZiBpbiBpdC4gOiggIEZpeGVkLgotICoJCVRyZWUgcGFyc2VyIGRpZG4ndCBsaWtlIChleHByKS5zb21ldGhpbmc7IGZpeGVkLgotICoJCUFsbG93ZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaW4gdHJlZSBncmFtbWFyLiBvb3BzLgotICogVmVyc2lvbiAxLjE2IChBdWd1c3QgMjIsIDE5OTkpCi0gKgkJRXh0ZW5kaW5nIGFuIGludGVyZmFjZSBidWlsdCBhIHdhY2t5IHRyZWU6IGhhZCBleHRyYSBFWFRFTkRTLgotICoJCVRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgbXVsdGlwbGUgc3VwZXJpbnRlcmZhY2VzLgotICoJCVRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgZW1wdHkgdmFyIGluaXRpYWxpemVyOiB7fQotICogVmVyc2lvbiAxLjE3IChPY3RvYmVyIDEyLCAxOTk5KQotICoJCUVTQyBsZXhlciBydWxlIGFsbG93ZWQgMzk5IG1heCBub3QgMzc3IG1heC4KLSAqCQlqYXZhLnRyZWUuZyBkaWRuJ3QgaGFuZGxlIHRoZSBleHByZXNzaW9uIG9mIHN5bmNocm9uaXplZAotICoJCXN0YXRlbWVudHMuCi0gKiBWZXJzaW9uIDEuMTggKEF1Z3VzdCAxMiwgMjAwMSkKLSAqCSAgCVRlcmVuY2UgdXBkYXRlZCB0byBKYXZhIDIgVmVyc2lvbiAxLjMgYnkKLSAqCQlvYnNlcnZpbmcvY29tYmluaW5nIHdvcmsgb2YgQWxsYW4gSmFjb2JzIGFuZCBTdGV2ZQotICoJCU1lc3NpY2suICBIYW5kbGVzIDEuMyBzcmMuICBTdW1tYXJ5OgotICoJCW8gIHByaW1hcnkgZGlkbid0IGluY2x1ZGUgYm9vbGVhbi5jbGFzcyBraW5kIG9mIHRoaW5nCi0gKgkgIAlvICBjb25zdHJ1Y3RvciBjYWxscyBwYXJzZWQgZXhwbGljaXRseSBub3c6Ci0gKiAJCSAgIHNlZSBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotICoJCW8gIGFkZCBzdHJpY3RmcCBtb2RpZmllcgotICoJICAJbyAgbWlzc2luZyBvYmpCbG9jayBhZnRlciBuZXcgZXhwcmVzc2lvbiBpbiB0cmVlIGdyYW1tYXIKLSAqCQlvICBtZXJnZWQgbG9jYWwgY2xhc3MgZGVmaW5pdGlvbiBhbHRlcm5hdGl2ZXMsIG1vdmVkIGFmdGVyIGRlY2xhcmF0aW9uCi0gKgkJbyAgZml4ZWQgcHJvYmxlbSB3aXRoIENsYXNzTmFtZS5zdXBlci5maWVsZAotICoJICAJbyAgcmVvcmRlcmVkIHNvbWUgYWx0ZXJuYXRpdmVzIHRvIG1ha2UgdGhpbmdzIG1vcmUgZWZmaWNpZW50Ci0gKgkJbyAgbG9uZyBhbmQgZG91YmxlIGNvbnN0YW50cyB3ZXJlIG5vdCBkaWZmZXJlbnRpYXRlZCBmcm9tIGludC9mbG9hdAotICoJCW8gIHdoaXRlc3BhY2UgcnVsZSB3YXMgaW5lZmZpY2llbnQ6IG1hdGNoZWQgb25seSBvbmUgY2hhcgotICoJCW8gIGFkZCBhbiBleGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCBzb21lIG5hc3R5IDEuMyBjYXNlcwotICoJCW8gIG1hZGUgTWFpbi5qYXZhIHVzZSBidWZmZXJlZCBJTyBhbmQgYSBSZWFkZXIgZm9yIFVuaWNvZGUgc3VwcG9ydAotICoJCW8gIHN1cHBvcnRzIFVOSUNPREU/Ci0gKgkJICAgVXNpbmcgVW5pY29kZSBjaGFyVm9jYWJ1bGF5IG1ha2VzIGNvZGUgZmlsZSBiaWcsIGJ1dCBvbmx5Ci0gKgkJICAgaW4gdGhlIGJpdHNldHMgYXQgdGhlIGVuZC4gSSBuZWVkIHRvIG1ha2UgQU5UTFIgZ2VuZXJhdGUKLSAqCQkgICB1bmljb2RlIGJpdHNldHMgbW9yZSBlZmZpY2llbnRseS4KLSAqIFZlcnNpb24gMS4xOSAoQXByaWwgMjUsIDIwMDIpCi0gKgkJVGVyZW5jZSBhZGRlZCBpbiBuaWNlIGZpeGVzIGJ5IEpvaG4gUHlidXMgY29uY2VybmluZyBmbG9hdGluZwotICoJCWNvbnN0YW50cyBhbmQgcHJvYmxlbXMgd2l0aCBzdXBlcigpIGNhbGxzLiAgSm9obiBkaWQgYSBuaWNlCi0gKgkJcmVvcmcgb2YgdGhlIHByaW1hcnkvcG9zdGZpeCBleHByZXNzaW9uIHN0dWZmIHRvIHJlYWQgYmV0dGVyCi0gKgkJYW5kIG1ha2VzIGYuZy5zdXBlcigpIHBhcnNlIHByb3Blcmx5IChpdCB3YXMgTUVUSE9EX0NBTEwgbm90Ci0gKgkJYSBTVVBFUl9DVE9SX0NBTEwpLiAgQWxzbzoKLSAqCi0gKgkJbyAgImZpbmFsbHkiIGNsYXVzZSB3YXMgYSByb290Li4ubWFkZSBpdCBhIGNoaWxkIG9mICJ0cnkiCi0gKgkJbyAgQWRkZWQgc3R1ZmYgZm9yIGFzc2VydHMgdG9vIGZvciBKYXZhIDEuNCwgYnV0ICpjb21tZW50ZWQgb3V0KgotICoJCSAgIGFzIGl0IGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLgotICoKLSAqIFZlcnNpb24gMS4yMCAoT2N0b2JlciAyNywgMjAwMikKLSAqCi0gKgkgIFRlcmVuY2UgZW5kZWQgdXAgcmVvcmdpbmcgSm9obiBQeWJ1cycgc3R1ZmYgdG8KLSAqCSAgcmVtb3ZlIHNvbWUgbm9uZGV0ZXJtaW5pc21zIGFuZCBzb21lIHN5bnRhY3RpYyBwcmVkaWNhdGVzLgotICoJICBOb3RlIHRoYXQgdGhlIGdyYW1tYXIgaXMgc3RyaWN0ZXIgbm93OyBlLmcuLCB0aGlzKC4uLikgbXVzdAotICoJYmUgdGhlIGZpcnN0IHN0YXRlbWVudC4KLSAqCi0gKgkgIFRyaW5hcnkgPzogb3BlcmF0b3Igd2Fzbid0IHdvcmtpbmcgYXMgYXJyYXkgbmFtZToKLSAqCQkgIChpc0JpZyA/IGJpZ0RpZ2l0cyA6IGRpZ2l0cylbaV07Ci0gKgotICoJICBDaGVja2VkIHBhcnNlci90cmVlIHBhcnNlciBvbiBzb3VyY2UgZm9yCi0gKgkJICBSZXNpbi0yLjAuNSwgaml2ZS0yLjEuMSwgamRrIDEuMy4xLCBMdWNlbmUsIGFudGxyIDIuNy4yYTQsCi0gKgkJYW5kIHRoZSAxMTBrLWxpbmUgakd1cnUgc2VydmVyIHNvdXJjZS4KLSAqCi0gKiBWZXJzaW9uIDEuMjEgKE9jdG9iZXIgMTcsIDIwMDMpCi0gKiAgRml4ZWQgbG90cyBvZiBwcm9ibGVtcyBpbmNsdWRpbmc6Ci0gKiAgUmF5IFdhbGRpbjogYWRkIHR5cGVEZWZpbml0aW9uIHRvIGludGVyZmFjZUJsb2NrIGluIGphdmEudHJlZS5nCi0gKiAgSGUgZm91bmQgYSBwcm9ibGVtL2ZpeCB3aXRoIGZsb2F0aW5nIHBvaW50IHRoYXQgc3RhcnQgd2l0aCAwCi0gKiAgUmF5IGFsc28gZml4ZWQgcHJvYmxlbSB0aGF0IChpbnQuY2xhc3MpIHdhcyBub3QgcmVjb2duaXplZC4KLSAqICBUaG9yc3RlbiB2YW4gRWxsZW4gbm90aWNlZCB0aGF0IFxuIGFyZSBhbGxvd2VkIGluY29ycmVjdGx5IGluIHN0cmluZ3MuCi0gKiAgVEpQIGZpeGVkIENIQVJfTElURVJBTCBhbmFsb2dvdXNseS4KLSAqCi0gKiBWZXJzaW9uIDEuMjEuMiAoTWFyY2gsIDIwMDMpCi0gKgkgIENoYW5nZXMgYnkgTWF0dCBRdWFpbCB0byBzdXBwb3J0IGdlbmVyaWNzIChhcyBwZXIgSkRLMS41L0pTUjE0KQotICoJICBOb3RlczoKLSAqCSAgbyBXZSBvbmx5IGFsbG93IHRoZSAiZXh0ZW5kcyIga2V5d29yZCBhbmQgbm90IHRoZSAiaW1wbGVtZW50cyIKLSAqCQlrZXl3b3JkLCBzaW5jZSB0aGF0cyB3aGF0IEpTUjE0IHNlZW1zIHRvIGltcGx5LgotICoJICBvIFRoYW5rcyB0byBNb250eSBadWtvd3NraSBmb3IgaGlzIGhlbHAgb24gdGhlIGFudGxyLWludGVyZXN0Ci0gKgkJbWFpbCBsaXN0LgotICoJICBvIFRoYW5rcyB0byBBbGFuIEVsaWFzZW4gZm9yIHRlc3RpbmcgdGhlIGdyYW1tYXIgb3ZlciBoaXMKLSAqCQlGaW5rIHNvdXJjZSBiYXNlCi0gKgotICogVmVyc2lvbiAxLjIyIChKdWx5LCAyMDA0KQotICoJICBDaGFuZ2VzIGJ5IE1pY2hhZWwgU3R1ZG1hbiB0byBzdXBwb3J0IEphdmEgMS41IGxhbmd1YWdlIGV4dGVuc2lvbnMKLSAqCSAgTm90ZXM6Ci0gKgkgIG8gQWRkZWQgc3VwcG9ydCBmb3IgYW5ub3RhdGlvbnMgdHlwZXMKLSAqCSAgbyBGaW5pc2hlZCBvZmYgTWF0dCBRdWFpbCdzIGdlbmVyaWNzIGVuaGFuY2VtZW50cyB0byBzdXBwb3J0IGJvdW5kIHR5cGUgYXJndW1lbnRzCi0gKgkgIG8gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGZvciBzdGF0ZW1lbnQgc3ludGF4Ci0gKgkgIG8gQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIGltcG9ydCBzeW50YXgKLSAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBlbnVtIHR5cGVzCi0gKgkgIG8gVGVzdGVkIGFnYWluc3QgSkRLIDEuNSBzb3VyY2UgYmFzZSBhbmQgc291cmNlIGJhc2Ugb2YgamRpZ3JhcGggcHJvamVjdAotICoJICBvIFRoYW5rcyB0byBNYXR0IFF1YWlsIGZvciBkb2luZyB0aGUgaGFyZCBwYXJ0IGJ5IGRvaW5nIG1vc3Qgb2YgdGhlIGdlbmVyaWNzIHdvcmsKLSAqCi0gKiBWZXJzaW9uIDEuMjIuMSAoSnVseSAyOCwgMjAwNCkKLSAqCSAgQnVnL29taXNzaW9uIGZpeGVzIGZvciBKYXZhIDEuNSBsYW5ndWFnZSBzdXBwb3J0Ci0gKgkgIG8gRml4ZWQgdHJlZSBzdHJ1Y3R1cmUgYnVnIHdpdGggY2xhc3NPckludGVyZmFjZSAtIHRoYW5rcyB0byBQaWV0ZXIgVmFuZ29ycHRvIGZvcgotICoJCXNwb3R0aW5nIHRoaXMKLSAqCSAgbyBGaXhlZCBidWcgd2hlcmUgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIFNSIGFuZCBCU1IgdG9rZW5zIHdvdWxkIGNhdXNlIHR5cGUKLSAqCQlwYXJhbWV0ZXJzIHRvIGJlIHJlY29nbmlzZWQgYXMgdHlwZSBhcmd1bWVudHMuCi0gKgkgIG8gRW5hYmxlZCB0eXBlIHBhcmFtZXRlcnMgb24gY29uc3RydWN0b3JzLCBhbm5vdGF0aW9ucyBvbiBlbnVtIGNvbnN0YW50cwotICoJCWFuZCBwYWNrYWdlIGRlZmluaXRpb25zCi0gKgkgIG8gRml4ZWQgcHJvYmxlbXMgd2hlbiBwYXJzaW5nIGlmICgoY2hhci5jbGFzcy5lcXVhbHMoYykpKSB7fSAtIHNvbHV0aW9uIGJ5IE1hdHQgUXVhaWwgYXQgQ2VucXVhCi0gKgotICogVmVyc2lvbiAxLjIyLjIgKEp1bHkgMjgsIDIwMDQpCi0gKgkgIFNsaWdodCByZWZhY3RvcmluZyBvZiBKYXZhIDEuNSBsYW5ndWFnZSBzdXBwb3J0Ci0gKgkgIG8gUmVmYWN0b3JlZCBmb3IvImZvcmVhY2giIHByb2R1Y3Rpb25zIHNvIHRoYXQgb3JpZ2luYWwgbGl0ZXJhbCAiZm9yIiBsaXRlcmFsCi0gKgkgICAgaXMgc3RpbGwgdXNlZCBidXQgdGhlIGZvciBzdWItY2xhdXNlcyB2YXJ5IGJ5IHRva2VuIHR5cGUKLSAqCSAgbyBGaXhlZCBidWcgd2hlcmUgdHlwZSBwYXJhbWV0ZXIgd2FzIG5vdCBpbmNsdWRlZCBpbiBnZW5lcmljIGNvbnN0cnVjdG9yJ3MgYnJhbmNoIG9mIEFTVAotICoKLSAqIFZlcnNpb24gMS4yMi4zIChBdWd1c3QgMjYsIDIwMDQpCi0gKgkgIEJ1ZyBmaXhlcyBhcyBpZGVudGlmaWVkIGJ5IE1pY2hhZWwgU3RhaGw7IGNsZWFuIHVwIG9mIHRhYnMvc3BhY2VzCi0gKiAgICAgICAgYW5kIG90aGVyIHJlZmFjdG9yaW5ncwotICoJICBvIEZpeGVkIHR5cGVQYXJhbWV0ZXJzIG9taXNzaW9uIGluIGlkZW50UHJpbWFyeSBhbmQgbmV3U3RhdGVtZW50Ci0gKgkgIG8gUmVwbGFjZWQgR1QgcmVjb25jaWxsaWF0aW9uIGNvZGUgd2l0aCBzaW1wbGUgc2VtYW50aWMgcHJlZGljYXRlCi0gKgkgIG8gQWRhcHRlZCBlbnVtL2Fzc2VydCBrZXl3b3JkIGNoZWNraW5nIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFN0YWhsJ3MgamF2YTE1IGdyYW1tYXIKLSAqCSAgbyBSZWZhY3RvcmVkIHR5cGVEZWZpbml0aW9uIHByb2R1Y3Rpb24gYW5kIGZpZWxkIHByb2R1Y3Rpb25zIHRvIHJlZHVjZSBkdXBsaWNhdGlvbgotICoKLSAqIFZlcnNpb24gMS4yMi40IChPY3RvYmVyIDIxLCAyMDA0KQotICogICAgU21hbGwgYnV4IGZpeGVzCi0gKiAgICBvIEFkZGVkIHR5cGVBcmd1bWVudHMgdG8gZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24sIGUuZy4gbmV3IDxTdHJpbmc+TXlQYXJhbWV0ZXJpc2VkKCkKLSAqICAgIG8gQWRkZWQgdHlwZUFyZ3VtZW50cyB0byBwb3N0Zml4RXhwcmVzc2lvbiBwcm9kdWN0aW9ucyBmb3IgYW5vbnltb3VzIGlubmVyIGNsYXNzIHN1cGVyCi0gKiAgICAgIGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGUuZy4gbmV3IE91dGVyKCkuPFN0cmluZz5zdXBlcigpCi0gKiAgICBvIEZpeGVkIGJ1ZyBpbiBhcnJheSBkZWNsYXJhdGlvbnMgaWRlbnRpZmllZCBieSBHZW9mZiBSb3kKLSAqCi0gKiBWZXJzaW9uIDEuMjIuNC5nLjEKLSAqICAgIG8gSSBoYXZlIHRha2VuIGphdmEuZyBmb3IgSmF2YTEuNSBmcm9tIE1pY2hhZWwgU3R1ZG1hbiAoMS4yMi40KQotICogICAgICBhbmQgaGF2ZSBhcHBsaWVkIHRoZSBncm9vdnkuZGlmZiBmcm9tIGphdmEuZyAoMS4yMikgYnkgSm9obiBSb3NlCi0gKiAgICAgIGJhY2sgb250byB0aGUgbmV3IHJvb3QgKDEuMjIuNCkgLSBKZXJlbXkgUmF5bmVyIChKYW4gMjAwNSkKLSAqICAgIG8gZm9yIGEgbWFwIG9mIHRoZSB0YXNrIHNlZS4uLiAKLSAqICAgICAgaHR0cDovL2dyb292eS5qYXZhbmljdXMuY29tL2phdmEtZy5wbmcKLSAqCi0gKiBUaGlzIGdyYW1tYXIgaXMgaW4gdGhlIFBVQkxJQyBET01BSU4KLSAqLwotCi1jbGFzcyBHcm9vdnlSZWNvZ25pemVyIGV4dGVuZHMgUGFyc2VyOwotb3B0aW9ucyB7Ci0JayA9IDM7CQkJCQkJCS8vIHRocmVlIHRva2VuIGxvb2thaGVhZAotCWV4cG9ydFZvY2FiPUdyb292eTsJCQkJLy8gQ2FsbCBpdHMgdm9jYWJ1bGFyeSAiR3Jvb3Z5IgotCWNvZGVHZW5NYWtlU3dpdGNoVGhyZXNob2xkID0gMjsJLy8gU29tZSBvcHRpbWl6YXRpb25zCi0JY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQgPSAzOwotCWRlZmF1bHRFcnJvckhhbmRsZXIgPSBmYWxzZTsJLy8gRG9uJ3QgZ2VuZXJhdGUgcGFyc2VyIGVycm9yIGhhbmRsZXJzCi0JYnVpbGRBU1QgPSB0cnVlOwotfQotCi10b2tlbnMgewotCUJMT0NLOyBNT0RJRklFUlM7IE9CSkJMT0NLOyBTTElTVDsgTUVUSE9EX0RFRjsgVkFSSUFCTEVfREVGOwotCUlOU1RBTkNFX0lOSVQ7IFNUQVRJQ19JTklUOyBUWVBFOyBDTEFTU19ERUY7IElOVEVSRkFDRV9ERUY7Ci0JUEFDS0FHRV9ERUY7IEVYVEVORFNfQ0xBVVNFOyBJTVBMRU1FTlRTX0NMQVVTRTsKLQlQQVJBTUVURVJTOyBQQVJBTUVURVJfREVGOyBMQUJFTEVEX1NUQVQ7IFRZUEVDQVNUOyBJTkRFWF9PUDsKLQlQT1NUX0lOQzsgUE9TVF9ERUM7IE1FVEhPRF9DQUxMOyBFWFBSOwotCUlNUE9SVDsgVU5BUllfTUlOVVM7IFVOQVJZX1BMVVM7IENBU0VfR1JPVVA7IEVMSVNUOyBGT1JfSU5JVDsgRk9SX0NPTkRJVElPTjsKLQlGT1JfSVRFUkFUT1I7IEVNUFRZX1NUQVQ7IEZJTkFMPSJmaW5hbCI7IEFCU1RSQUNUPSJhYnN0cmFjdCI7Ci1VTlVTRURfR09UTz0iZ290byI7IFVOVVNFRF9DT05TVD0iY29uc3QiOyBVTlVTRURfRE89ImRvIjsKLQlTVFJJQ1RGUD0ic3RyaWN0ZnAiOyBTVVBFUl9DVE9SX0NBTEw7IENUT1JfQ0FMTDsgQ1RPUl9JREVOVDsgVkFSSUFCTEVfUEFSQU1FVEVSX0RFRjsKLVNUUklOR19DT05TVFJVQ1RPUjsgU1RSSU5HX0NUT1JfTUlERExFOwotQ0xPU0VEX0JMT0NLOyBJTVBMSUNJVF9QQVJBTUVURVJTOyBERUY9ImRlZiI7Ci1TRUxFQ1RfU0xPVDsgUkVGTEVDVF9NRU1CRVI7IERZTkFNSUNfTUVNQkVSOwotTEFCRUxFRF9BUkc7IFNQUkVBRF9BUkc7IE9QVElPTkFMX0FSRzsgU0NPUEVfRVNDQVBFOwotTElTVF9DT05TVFJVQ1RPUjsgTUFQX0NPTlNUUlVDVE9SOwotRk9SX0lOX0lURVJBQkxFOyBSQU5HRV9FWENMVVNJVkU7Ci0JU1RBVElDX0lNUE9SVDsgRU5VTV9ERUY7IEVOVU1fQ09OU1RBTlRfREVGOyBGT1JfRUFDSF9DTEFVU0U7IEFOTk9UQVRJT05fREVGOyBBTk5PVEFUSU9OUzsKLQlBTk5PVEFUSU9OOyBBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSOyBBTk5PVEFUSU9OX0ZJRUxEX0RFRjsgQU5OT1RBVElPTl9BUlJBWV9JTklUOwotCVRZUEVfQVJHVU1FTlRTOyBUWVBFX0FSR1VNRU5UOyBUWVBFX1BBUkFNRVRFUlM7IFRZUEVfUEFSQU1FVEVSOyBXSUxEQ0FSRF9UWVBFOwotCVRZUEVfVVBQRVJfQk9VTkRTOyBUWVBFX0xPV0VSX0JPVU5EUzsKLX0KLQotewotCS8qKiBUaGlzIGZhY3RvcnkgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIHdpcmUgdG9nZXRoZXIgYSBHcm9vdnkgcGFyc2VyIGFuZCBsZXhlci4gKi8KLQlwdWJsaWMgc3RhdGljIEdyb292eVJlY29nbml6ZXIgbWFrZShHcm9vdnlMZXhlciBsZXhlcikgewotCQlHcm9vdnlSZWNvZ25pemVyIHBhcnNlciA9IG5ldyBHcm9vdnlSZWNvZ25pemVyKGxleGVyLnBsdW1iKCkpOwotCQkvLyBUTyBETzogc2V0IHVwIGEgY29tbW9uIGVycm9yLWhhbmRsaW5nIGNvbnRyb2wgYmxvY2ssIHRvIGF2b2lkIGV4Y2Vzc2l2ZSB0YW5nbGUgYmV0d2VlbiB0aGVzZSBndXlzCi0JCXBhcnNlci5sZXhlciA9IGxleGVyOwotCQlsZXhlci5wYXJzZXIgPSBwYXJzZXI7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCS8vIENyZWF0ZSBhIHNjYW5uZXIgdGhhdCByZWFkcyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gcGFzc2VkIHRvIHVzLi4uCi0JcHVibGljIHN0YXRpYyBHcm9vdnlSZWNvZ25pemVyIG1ha2UoSW5wdXRTdHJlYW0gaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KLQlwdWJsaWMgc3RhdGljIEdyb292eVJlY29nbml6ZXIgbWFrZShSZWFkZXIgaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KLQlwdWJsaWMgc3RhdGljIEdyb292eVJlY29nbml6ZXIgbWFrZShJbnB1dEJ1ZmZlciBpbikgeyByZXR1cm4gbWFrZShuZXcgR3Jvb3Z5TGV4ZXIoaW4pKTsgfQotCXB1YmxpYyBzdGF0aWMgR3Jvb3Z5UmVjb2duaXplciBtYWtlKExleGVyU2hhcmVkSW5wdXRTdGF0ZSBpbikgeyByZXR1cm4gbWFrZShuZXcgR3Jvb3Z5TGV4ZXIoaW4pKTsgfQotCi0JR3Jvb3Z5TGV4ZXIgbGV4ZXI7Ci0JcHVibGljIEdyb292eUxleGVyIGdldExleGVyKCkgeyByZXR1cm4gbGV4ZXI7IH0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZikgeyBzdXBlci5zZXRGaWxlbmFtZShmKTsgbGV4ZXIuc2V0RmlsZW5hbWUoZik7IH0KLQotCS8vIHN0dWZmIHRvIGFkanVzdCBBTlRMUidzIHRyYWNpbmcgbWFjaGluZXJ5Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRyYWNpbmcgPSBmYWxzZTsgIC8vIG9ubHkgZWZmZWN0aXZlIGlmIGFudGxyLlRvb2wgaXMgcnVuIHdpdGggLXRyYWNlUGFyc2VyCi0gICAgcHVibGljIHZvaWQgdHJhY2VJbihTdHJpbmcgcm5hbWUpIHRocm93cyBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghR3Jvb3Z5UmVjb2duaXplci50cmFjaW5nKSAgcmV0dXJuOwotICAgICAgICBzdXBlci50cmFjZUluKHJuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJuYW1lKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoIUdyb292eVJlY29nbml6ZXIudHJhY2luZykgIHJldHVybjsKLSAgICAgICAgaWYgKHJldHVybkFTVCAhPSBudWxsKSAgcm5hbWUgKz0gcmV0dXJuQVNULnRvU3RyaW5nTGlzdCgpOwotICAgICAgICBzdXBlci50cmFjZU91dChybmFtZSk7Ci0gICAgfQotCQotCS8vIEVycm9yIGhhbmRsaW5nLiAgVGhpcyBpcyBhIGZ1bm5lbCB0aHJvdWdoIHdoaWNoIHBhcnNlciBlcnJvcnMgZ28sIHdoZW4gdGhlIHBhcnNlciBjYW4gc3VnZ2VzdCBhIHNvbHV0aW9uLgotCXB1YmxpYyB2b2lkIHJlcXVpcmVGYWlsZWQoU3RyaW5nIHByb2JsZW0sIFN0cmluZyBzb2x1dGlvbikgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKLQkJLy8gVE8gRE86IE5lZWRzIG1vcmUgd29yay4KLQkJVG9rZW4gbHQgPSBudWxsOwotCQl0cnkgeyBsdCA9IExUKDEpOyB9Ci0JCWNhdGNoIChUb2tlblN0cmVhbUV4Y2VwdGlvbiBlZSkgeyB9Ci0JCWlmIChsdCA9PSBudWxsKSAgbHQgPSBUb2tlbi5iYWRUb2tlbjsKLQkJdGhyb3cgbmV3IFNlbWFudGljRXhjZXB0aW9uKHByb2JsZW0gKyAiO1xuICAgc29sdXRpb246ICIgKyBzb2x1dGlvbiwKLQkJCQkJCQkJCWdldEZpbGVuYW1lKCksIGx0LmdldExpbmUoKSwgbHQuZ2V0Q29sdW1uKCkpOwotCX0KLQkvLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIG9mIGV4cGVjdGVkIGVycm9yIHN5bmRyb21lcy4KLQlwcml2YXRlIHZvaWQgcmVxdWlyZShib29sZWFuIHosIFN0cmluZyBwcm9ibGVtLCBTdHJpbmcgc29sdXRpb24pIHRocm93cyBTZW1hbnRpY0V4Y2VwdGlvbiB7Ci0JCWlmICgheikgIHJlcXVpcmVGYWlsZWQocHJvYmxlbSwgc29sdXRpb24pOwotCX0KLQotCS8vIFF1ZXJ5IGEgbmFtZSB0b2tlbiB0byBzZWUgaWYgaXQgYmVnaW5zIHdpdGggYSBjYXBpdGFsIGxldHRlci4KLQkvLyBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSAody9vIHN5bWJvbCB0YWJsZSBhY2Nlc3MpIGJldHdlZW4ge1N0cmluZyB4fSBhbmQge3ByaW50bG4geH0uCi0JcHJpdmF0ZSBib29sZWFuIGlzVXBwZXJDYXNlKFRva2VuIHgpIHsKLQkJaWYgKHggPT0gbnVsbCB8fCB4LmdldFR5cGUoKSAhPSBJREVOVCkgIHJldHVybiBmYWxzZTsgIC8vIGNhbm5vdCBoYXBwZW4/Ci0JCVN0cmluZyB4dGV4dCA9IHguZ2V0VGV4dCgpOwotCQlyZXR1cm4gKHh0ZXh0Lmxlbmd0aCgpID4gMCAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoeHRleHQuY2hhckF0KDApKSk7Ci0JfQotCi0JcHJpdmF0ZSBBU1QgY3VycmVudENsYXNzID0gbnVsbDsgIC8vIGN1cnJlbnQgZW5jbG9zaW5nIGNsYXNzIChmb3IgY29uc3RydWN0b3IgcmVjb2duaXRpb24pCi0JLy8gUXVlcnkgYSBuYW1lIHRva2VuIHRvIHNlZSBpZiBpdCBpcyBpZGVudGljYWwgd2l0aCB0aGUgY3VycmVudCBjbGFzcyBuYW1lLgotCS8vIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBjb25zdHJ1Y3RvcnMgZnJvbSBvdGhlciBtZXRob2RzLgotCXByaXZhdGUgYm9vbGVhbiBpc0NvbnN0cnVjdG9ySWRlbnQoVG9rZW4geCkgewotCQlpZiAoY3VycmVudENsYXNzID09IG51bGwpICByZXR1cm4gZmFsc2U7Ci0JCWlmIChjdXJyZW50Q2xhc3MuZ2V0VHlwZSgpICE9IElERU5UKSAgcmV0dXJuIGZhbHNlOyAgLy8gY2Fubm90IGhhcHBlbj8KLQkJU3RyaW5nIGNuYW1lID0gY3VycmVudENsYXNzLmdldFRleHQoKTsKLQotCQlpZiAoeCA9PSBudWxsIHx8IHguZ2V0VHlwZSgpICE9IElERU5UKSAgcmV0dXJuIGZhbHNlOyAgLy8gY2Fubm90IGhhcHBlbj8KLQkJcmV0dXJuIGNuYW1lLmVxdWFscyh4LmdldFRleHQoKSk7Ci0JfQotCi0KLS8qKgotCSAqIENvdW50cyB0aGUgbnVtYmVyIG9mIExUIHNlZW4gaW4gdGhlIHR5cGVBcmd1bWVudHMgcHJvZHVjdGlvbi4KLQkgKiBJdCBpcyB1c2VkIGluIHNlbWFudGljIHByZWRpY2F0ZXMgdG8gZW5zdXJlIHdlIGhhdmUgc2VlbgotCSAqIGVub3VnaCBjbG9zaW5nICc+JyBjaGFyYWN0ZXJzOyB3aGljaCBhY3R1YWxseSBtYXkgaGF2ZSBiZWVuCi0JICogZWl0aGVyIEdULCBTUiBvciBCU1IgdG9rZW5zLgotCSAqLwotCXByaXZhdGUgaW50IGx0Q291bnRlciA9IDA7Ci19Ci0KLS8vIENvbXBpbGF0aW9uIFVuaXQ6IEluIEdyb292eSwgdGhpcyBpcyBhIHNpbmdsZSBmaWxlIG9yIHNjcmlwdC4gVGhpcyBpcyB0aGUgc3RhcnQKLS8vIHJ1bGUgZm9yIHRoaXMgcGFyc2VyCi1jb21waWxhdGlvblVuaXQKLQk6CS8vIEEgY29tcGlsYXRpb24gdW5pdCBzdGFydHMgd2l0aCBhbiBvcHRpb25hbCBwYWNrYWdlIGRlZmluaXRpb24KLQkJKAkoYW5ub3RhdGlvbnMgInBhY2thZ2UiKT0+IHBhY2thZ2VEZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLy8gVGhlIG1haW4gcGFydCBvZiB0aGUgc2NyaXB0IGlzIGEgc2VxdWVuY2Ugb2YgYW55IG51bWJlciBvZiBzdGF0ZW1lbnRzLgotICAgICAgICAgICAgICAgIC8vIFNlbWljb2xvbnMgYW5kL29yIHNpZ25pZmljYW50IG5ld2xpbmVzIHNlcnZlIGFzIHNlcGFyYXRvcnMuCi0gICAgICAgICAgICAgICAgKCBzZXAhIChzdGF0ZW1lbnQpPyApKgotICAgICAgICAgICAgICAgIEVPRiEKLQkJfCAgIChzdGF0ZW1lbnQpPyAoIHNlcCEgKHN0YXRlbWVudCk/ICkqCi0gICAgICAgICAgICBFT0YhCi0JCSkKLQotCQkvLyBOZXh0IHdlIGhhdmUgYSBzZXJpZXMgb2YgemVybyBvciBtb3JlIGltcG9ydCBzdGF0ZW1lbnRzCi0JCS8vIFRPRE8gUkVNT1ZFICggaW1wb3J0RGVmaW5pdGlvbiApKgotCi0JCS8vIFdyYXBwaW5nIHRoaW5ncyB1cCB3aXRoIGFueSBudW1iZXIgb2YgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JCS8vIGRlZmluaXRpb25zCi0JCS8vIFRPRE8gUkVNT1ZFICggdHlwZURlZmluaXRpb24gKSoKLQotCQlFT0YhCi0JOwotCi0vKiogQSBHcm9vdnkgc2NyaXB0IG9yIHNpbXBsZSBleHByZXNzaW9uLiAgQ2FuIGJlIGFueXRoaW5nIGxlZ2FsIGluc2lkZSB7Li4ufS4gKi8KLXNuaXBwZXRVbml0Ci0gICAgOiAgICAgICBibG9ja0JvZHkKLSAgICA7Ci0KLQotLy8gUGFja2FnZSBzdGF0ZW1lbnQ6IG9wdGlvbmFsIGFubm90YXRpb25zIGZvbGxvd2VkIGJ5ICJwYWNrYWdlIiB0aGVuIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIuCi1wYWNrYWdlRGVmaW5pdGlvbgotCS8vVE9ETz8gb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fSAvLyBsZXQgQU5UTFIgaGFuZGxlIGVycm9ycwotCToJYW5ub3RhdGlvbnMgcDoicGFja2FnZSJeIHsjcC5zZXRUeXBlKFBBQ0tBR0VfREVGKTt9IGlkZW50aWZpZXIKLQk7Ci0KLQotLy8gSW1wb3J0IHN0YXRlbWVudDogaW1wb3J0IGZvbGxvd2VkIGJ5IGEgcGFja2FnZSBvciBjbGFzcyBuYW1lCi1pbXBvcnRTdGF0ZW1lbnQKLQkvL1RPRE8/IG9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30KLQl7IGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsgfQotCToJaToiaW1wb3J0Il4geyNpLnNldFR5cGUoSU1QT1JUKTt9ICggInN0YXRpYyIhIHsjaS5zZXRUeXBlKFNUQVRJQ19JTVBPUlQpO30gKT8gaWRlbnRpZmllclN0YXIKLQk7Ci0KLS8vIFRPRE8gUkVNT1ZFCi0vLyBBIHR5cGUgZGVmaW5pdGlvbiBpcyBlaXRoZXIgYSBjbGFzcywgaW50ZXJmYWNlLCBlbnVtIG9yIGFubm90YXRpb24gd2l0aCBwb3NzaWJsZSBhZGRpdGlvbmFsIHNlbWlzLgotLy90eXBlRGVmaW5pdGlvbgotLy8Jb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fQotLy8JOgltOm1vZGlmaWVycyEKLS8vCQl0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtXQotLy8JfAlTRU1JIQotLy8JOwotCi0vLyBBZGRlZCB0aGlzIHByb2R1Y3Rpb24sIGV2ZW4gdGhvdWdoICd0eXBlRGVmaW5pdGlvbicgc2VlbXMgdG8gYmUgb2Jzb2xldGUsCi0vLyBhcyB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgZ3JhbW1hci4KLS8vIFByb3RlY3RlZCB0eXBlIGRlZmluaXRpb25zIHByb2R1Y3Rpb24gZm9yIHJldXNlIGluIG90aGVyIHByb2R1Y3Rpb25zCi1wcm90ZWN0ZWQgdHlwZURlZmluaXRpb25JbnRlcm5hbFtBU1QgbW9kc10KLQk6CWNkOmNsYXNzRGVmaW5pdGlvblsjbW9kc10JCS8vIGlubmVyIGNsYXNzCi0JICB7I3R5cGVEZWZpbml0aW9uSW50ZXJuYWwgPSAjY2Q7fQotCXwJaWQ6aW50ZXJmYWNlRGVmaW5pdGlvblsjbW9kc10JLy8gaW5uZXIgaW50ZXJmYWNlCi0JICB7I3R5cGVEZWZpbml0aW9uSW50ZXJuYWwgPSAjaWQ7fQotCXwJZWQ6ZW51bURlZmluaXRpb25bI21vZHNdCQkvLyBpbm5lciBlbnVtCi0JICB7I3R5cGVEZWZpbml0aW9uSW50ZXJuYWwgPSAjZWQ7fQotCXwJYWQ6YW5ub3RhdGlvbkRlZmluaXRpb25bI21vZHNdCS8vIGlubmVyIGFubm90YXRpb24KLQkgIHsjdHlwZURlZmluaXRpb25JbnRlcm5hbCA9ICNhZDt9Ci0JOwotCi0vKiogQSBkZWNsYXJhdGlvbiBpcyB0aGUgY3JlYXRpb24gb2YgYSByZWZlcmVuY2Ugb3IgcHJpbWl0aXZlLXR5cGUgdmFyaWFibGUsCi0gKiAgb3IgKGlmIGFyZ3VtZW50cyBhcmUgcHJlc2VudCkgb2YgYSBtZXRob2QuCi0gKiAgR2VuZXJpY2FsbHksIHRoaXMgaXMgY2FsbGVkIGEgJ3ZhcmlhYmxlJyBkZWZpbml0aW9uLCBldmVuIGluIHRoZSBjYXNlIG9mIGEgY2xhc3MgZmllbGQgb3IgbWV0aG9kLgotICogIEl0IG1heSBzdGFydCB3aXRoIHRoZSBrZXl3b3JkICJkZWYiIGFuZC9vciBtb2RpZmllcnMuCi0gKiAgSXQgbWF5IGFsc28gc3RhcnQsIG1vcmUgc2ltcGx5LCB3aXRoIGEgY2FwaXRhbGl6ZWQgdHlwZSBuYW1lLgotICogIDxwPgotICogIEFTVCBlZmZlY3Q6IENyZWF0ZSBhIHNlcGFyYXRlIFR5cGUvVmFyIHRyZWUgZm9yIGVhY2ggdmFyIGluIHRoZSB2YXIgbGlzdC4KLSAqICBNdXN0IGJlIGd1YXJkZWQsIGFzIGluIChkZWNsYXJhdGlvblN0YXJ0KSA9PiBkZWNsYXJhdGlvbi4KLSAqLwotZGVjbGFyYXRpb24hCi0gICAgOiAgICAgICBERUYhIG5scyEKLSAgICAgICAgKG06bW9kaWZpZXJzKT8gKHQ6dHlwZVNwZWNbZmFsc2VdKT8gdjp2YXJpYWJsZURlZmluaXRpb25zWyNtLCN0XQotICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3Y7fQotICAgIHwgICBtMjptb2RpZmllcnMgICAodDI6dHlwZVNwZWNbZmFsc2VdKT8gdjI6dmFyaWFibGVEZWZpbml0aW9uc1sjbTIsI3QyXQotICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3YyO30KLSAgICB8ICAgICAgIHQzOnR5cGVTcGVjW2ZhbHNlXSB2Mzp2YXJpYWJsZURlZmluaXRpb25zW251bGwsI3QzXQotICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3YzO30KLSAgICA7Ci0KLS8qKiBBIGRlY2xhcmF0aW9uIHdpdGggb25lIGRlY2xhcmF0b3IgYW5kIG5vIGluaXRpYWxpemF0aW9uLCBsaWtlIGEgcGFyYW1ldGVyRGVjbGFyYXRpb24uICovCi0KLS8qVE9ETyogWWVzLCBhbmQgd2UgbXVzdCBhbHNvIGF1ZGl0IHRoZSB2YXJpb3VzIG9jY3VycmVuY2VzIG9mIHdhcm5pbmcKLXN1cHByZXNzaW9ucyBsaWtlICJvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSIuCi0qLwotCi1zaW5nbGVEZWNsYXJhdGlvbk5vSW5pdCEKLSAgICA6ICAgICAgIERFRiEgbmxzIQotICAgICAgICAobTptb2RpZmllcnMpPyAodDp0eXBlU3BlY1tmYWxzZV0pPyAgdjpzaW5nbGVWYXJpYWJsZVsjbSwjdF0KLSAgICAgICAgeyNzaW5nbGVEZWNsYXJhdGlvbk5vSW5pdCA9ICN2O30KLSAgICB8ICAgbTI6bW9kaWZpZXJzICAgKHQyOnR5cGVTcGVjW2ZhbHNlXSk/IHYyOnNpbmdsZVZhcmlhYmxlWyNtMiwjdDJdCi0gICAgICAgIHsjc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQgPSAjdjI7fQotICAgIHwgICAgICAgdDM6dHlwZVNwZWNbZmFsc2VdIHYzOnNpbmdsZVZhcmlhYmxlW251bGwsI3QzXQotICAgICAgICB7I3NpbmdsZURlY2xhcmF0aW9uTm9Jbml0ID0gI3YzO30KLSAgICA7Ci0KLXNpbmdsZURlY2xhcmF0aW9uCi0gICAgOiAgIHNkOnNpbmdsZURlY2xhcmF0aW9uTm9Jbml0IQotICAgICAgICB7ICNzaW5nbGVEZWNsYXJhdGlvbiA9ICNzZDsgfQotICAgICAgICAgICAgICAgIHZhckluaXRpYWxpemVyCi0gICAgOwotCi0vKiogVXNlZCBvbmx5IGFzIGEgbG9va2FoZWFkIHByZWRpY2F0ZSwgYmVmb3JlIGRpdmluZyBpbiBhbmQgcGFyc2luZyBhIGRlY2xhcmF0aW9uLgotICogIEEgZGVjbGFyYXRpb24gY2FuIGJlIHVuYW1iaWd1b3VzbHkgaW50cm9kdWNlZCB3aXRoICJkZWYiIG9yIGEgbW9kaWZpZXIgdG9rZW4gbGlrZSAiZmluYWwiLgotICogIEl0IG1heSBhbHNvIGJlIGludHJvZHVjZWQgYnkgYSBzaW1wbGUgaWRlbnRpZmllciB3aG9zZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYW4gdXBwZXJjYXNlIGxldHRlciwKLSAqICBhcyBpbiB7U3RyaW5nIHh9LiAgQSBkZWNsYXJhdGlvbiBjYW4gYWxzbyBiZSBpbnRyb2R1Y2VkIHdpdGggYSBidWlsdCBpbiB0eXBlIGxpa2UgJ2ludCcgb3IgJ3ZvaWQnLgotICogIEJyYWNrZXRzIChhcnJheSBhbmQgZ2VuZXJpYykgYXJlIGFsbG93ZWQsIGFzIGluIHtMaXN0W10geH0gb3Ige2ludFtdW10geX0uCi0gKiAgQW55dGhpbmcgZWxzZSBpcyBwYXJzZWQgYXMgYSBzdGF0ZW1lbnQgb2Ygc29tZSBzb3J0IChleHByZXNzaW9uIG9yIGNvbW1hbmQpLgotICogIDxwPgotICogIChJbiB0aGUgYWJzZW5jZSBvZiBleHBsaWNpdCBtZXRob2QtY2FsbCBwYXJlbnMsIHdlIGFzc3VtZSBhIGNhcGl0YWxpemVkIG5hbWUgaXMgYSB0eXBlIG5hbWUuCi0gKiAgWWVzLCB0aGlzIGlzIGEgbGl0dGxlIGhhY2t5LiAgQWx0ZXJuYXRpdmVzIGFyZSB0byBjb21wbGljYXRlIHRoZSBkZWNsYXJhdGlvbiBvciBjb21tYW5kCi0gKiAgc3ludGF4ZXMsIG9yIHRvIGhhdmUgdGhlIHBhcnNlciBxdWVyeSB0aGUgc3ltYm9sIHRhYmxlLiAgUGFyc2UtdGltZSBxdWVyaWVzIGFyZSBldmlsLgotICogIEFuZCB3ZSB3YW50IGJvdGgge1N0cmluZyB4fSBhbmQge3ByaW50bG4geH0uICBTbyB3ZSBuZWVkIGEgc3ludGFjdGljIHJhem9yLWVkZ2UgdG8gc2xpcAotICogIGJldHdlZW4gJ3ByaW50bG4nIGFuZCAnU3RyaW5nJy4pCi0gKiAgCi0gKiAgICpUT0RPKiBUaGUgZGVjbGFyYXRpb25TdGFydCBwcm9kdWN0aW9uIG5lZWRzIHRvIGJlIHN0cmVuZ3RoZW5lZCB0byByZWNvZ25pemUKLSAqICB0aGluZ3MgbGlrZSB7TGlzdDxTdHJpbmc+IGZvb30uCi0gKiAgUmlnaHQgbm93IGl0IG9ubHkga25vd3MgaG93IHRvIHNraXAgc3F1YXJlIGJyYWNrZXRzIGFmdGVyIHRoZSB0eXBlLCBub3QKLSAqICBhbmdsZSBicmFja2V0cy4KLSAqICBUaGlzIHByb2JhYmx5IHR1cm5zIG91dCB0byBiZSB0cmlja3kgYmVjYXVzZSBvZiA+PiB2cy4gPiA+LiDKSWYgc28sCi0gKiAganVzdCBwdXQgYSBUTyBETyBjb21tZW50IGluLgotICogICAKLSAqLwotZGVjbGFyYXRpb25TdGFydCEKLSAgICA6ICAgREVGCi0gICAgfCAgIG1vZGlmaWVyIQotICAgIHwgICAoICAgdXBwZXJDYXNlSWRlbnQhCi0gICAgICAgIHwgICBidWlsdEluVHlwZSEKLSAgICAgICAgKSAoTEJSQUNLIGJhbGFuY2VkVG9rZW5zISBSQlJBQ0spKiAoSURFTlQgfCAiaXQiKQotICAgIDsKLQotLyoqIFVzZWQgb25seSBhcyBhIGxvb2thaGVhZCBwcmVkaWNhdGUgZm9yIG5lc3RlZCB0eXBlIGRlY2xhcmF0aW9ucy4gKi8KLQotLypUT0RPKiBUaGUgbG9va2FoZWFkIGluIHR5cGVEZWNsYXJhdGlvblN0YXJ0IG5lZWRzIHRvIHNraXAgYW5ub3RhdGlvbnMsIG5vdAotanVzdCBzdG9wIGF0ICdAJywgYmVjYXVzZSB2YXJpYWJsZSBhbmQgbWV0aG9kIGRlY2xhcmF0aW9ucyBjYW4gYWxzbyBiZQotYW5ub3RhdGVkLgotPiB0eXBlRGVjbGFyYXRpb25TdGFydCEKLT4gyiDKIDogyiAobW9kaWZpZXIhKSogKCJjbGFzcyIgfCAiaW50ZXJmYWNlIiB8ICJlbnVtIiB8IEFUICkKLVMuQi4gc29tZXRoaW5nIGxpa2UKLT4gyiDKIDogyiAobW9kaWZpZXIhIHwgYW5ub3RhdGlvblRva2VucyEpKiAoImNsYXNzIiB8ICJpbnRlcmZhY2UiIHwKLT4gImVudW0iICkKLShBbmQgbWF5YmUgQGludGVyZmFjZSwgaWYgSmF2YSA1IGFsbG93cyBuZXN0ZWQgYW5ub3RhdGlvbiB0eXBlcz8gykRvbid0Ci1rbm93IG9mZmhhbmQuKQotV2hlcmUgYW5ub3RhdGlvblRva2VucyBjYW4gYmUgYSBxdWljayBwYXJlbi1za2lwcGVyLCBhcyBpbiBvdGhlcgotcGxhY2VzOiDKJ0AnIGlkZW50ICcoJyBiYWxhbmNlZFRva2VucyAnKScuCi0qLwotCi10eXBlRGVjbGFyYXRpb25TdGFydCEKLSAgICA6ICAgKG1vZGlmaWVyISkqICgiY2xhc3MiIHwgImludGVyZmFjZSIgfCAiZW51bSIgfCBBVCApCi0gICAgOwotCi0vKiogQW4gSURFTlQgdG9rZW4gd2hvc2Ugc3BlbGxpbmcgaXMgcmVxdWlyZWQgdG8gc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLgotICogIEluIHRoZSBjYXNlIG9mIGEgc2ltcGxlIHN0YXRlbWVudCB7VXBwZXJJRCBuYW1lfSB0aGUgaWRlbnRpZmllciBpcyB0YWtlbiB0byBiZSBhIHR5cGUgbmFtZSwgbm90IGEgY29tbWFuZCBuYW1lLgotICovCi11cHBlckNhc2VJZGVudAotICAgIDogICB7aXNVcHBlckNhc2UoTFQoMSkpfT8KLSAgICAgICAgICAgICAgICBJREVOVAotICAgIDsKLQotLy8gQSB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSB0eXBlIG5hbWUgd2l0aCBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCi0vLyAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLS8vIFNldCBhZGRJbWFnTm9kZSB0cnVlIGZvciB0eXBlcyBpbnNpZGUgZXhwcmVzc2lvbnMsIG5vdCBkZWNsYXJhdGlvbnMuCi10eXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQotCTogY2xhc3NUeXBlU3BlY1thZGRJbWFnTm9kZV0KLQl8CWJ1aWx0SW5UeXBlU3BlY1thZGRJbWFnTm9kZV0KLQk7Ci0KLS8vVE9ETyAtIFVSR0VOVCAtIGNoZWNrIHRoYXQgJ2FycmF5T3JUeXBlQXJncycgaXMgb2sgaW5zdGVhZCBvZiAnQVJSQVlfREVDTEFSQVRPUicKLS8vIGFsc28gY2hlY2sgdGhhdCAnY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdJyBpcyBhIHN1aXRhYmxlIHN1YnN0aXR1dGlvbiBmb3IgJ2lkZW50aWZpZXInCi0KLS8vIEEgY2xhc3MgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgY2xhc3MgdHlwZSB3aXRoIGVpdGhlcjoKLS8vIC0gcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcwotLy8gICAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLS8vIC0gZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBhZnRlcgotY2xhc3NUeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQotCToJdDpjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KLQkJKCAgIGF0YTphcnJheU9yVHlwZUFyZ3NbI3RdICApPwotCQl7Ci0JCQlpZiAoI2F0YSAhPSBudWxsKSAgI2NsYXNzVHlwZVNwZWMgPSAjYXRhOwotCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKLQkJCQkjY2xhc3NUeXBlU3BlYyA9ICMoI1tUWVBFLCJUWVBFIl0sICNjbGFzc1R5cGVTcGVjKTsKLQkJCX0KLQkJfQotCTsKLQotLy8gQSBub24tYnVpbHQgaW4gdHlwZSBuYW1lLCB3aXRoIHBvc3NpYmxlIHR5cGUgcGFyYW1ldGVycwotY2xhc3NPckludGVyZmFjZVR5cGVbYm9vbGVhbiBhZGRJbWFnTm9kZV0KLQk6CUlERU5UXiAodHlwZUFyZ3VtZW50cyk/Ci0JCShvcHRpb25ze2dyZWVkeT10cnVlO306IC8vIG1hdGNoIGFzIG1hbnkgYXMgcG9zc2libGUKLQkJCURPVF4KLQkJCUlERU5UICh0eXBlQXJndW1lbnRzKT8KLQkJKSoKLQkJewotCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKLQkJCQkjY2xhc3NPckludGVyZmFjZVR5cGUgPSAjKCNbVFlQRSwiVFlQRSJdLCAjY2xhc3NPckludGVyZmFjZVR5cGUpOwotCQkJfQotCQl9Ci0JOwotCi0vLyBBIHNwZWNpYWxpc2VkIGZvcm0gb2YgdHlwZVNwZWMgd2hlcmUgYnVpbHQgaW4gdHlwZXMgbXVzdCBiZSBhcnJheXMKLXR5cGVBcmd1bWVudFNwZWMKLQk6CWNsYXNzVHlwZVNwZWNbdHJ1ZV0KLQl8CWJ1aWx0SW5UeXBlQXJyYXlTcGVjW3RydWVdCi0JOwotCi0vLyBBIGdlbmVyaWMgdHlwZSBhcmd1bWVudCBpcyBhIGNsYXNzIHR5cGUsIGEgcG9zc2libHkgYm91bmRlZCB3aWxkY2FyZCB0eXBlIG9yIGEgYnVpbHQtaW4gdHlwZSBhcnJheQotdHlwZUFyZ3VtZW50Ci0JOgkoCXR5cGVBcmd1bWVudFNwZWMKLQkJfAl3aWxkY2FyZFR5cGUKLQkJKQotCQl7I3R5cGVBcmd1bWVudCA9ICMoI1tUWVBFX0FSR1VNRU5ULCJUWVBFX0FSR1VNRU5UIl0sICN0eXBlQXJndW1lbnQpO30KLQk7Ci0KLS8vIFdpbGRjYXJkIHR5cGUgaW5kaWNhdGluZyBhbGwgdHlwZXMgKHdpdGggcG9zc2libGUgY29uc3RyYWludCkKLXdpbGRjYXJkVHlwZQotCToJcTpRVUVTVElPTl4geyNxLnNldFR5cGUoV0lMRENBUkRfVFlQRSk7fQotCQkoKCJleHRlbmRzIiB8ICJzdXBlciIpPT4gdHlwZUFyZ3VtZW50Qm91bmRzKT8KLQk7Ci0KLS8vIFR5cGUgYXJndW1lbnRzIHRvIGEgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUKLXR5cGVBcmd1bWVudHMKLXtpbnQgY3VycmVudEx0TGV2ZWwgPSAwO30KLQk6Ci0JCXtjdXJyZW50THRMZXZlbCA9IGx0Q291bnRlcjt9Ci0JCUxUISB7bHRDb3VudGVyKys7fQotCQl0eXBlQXJndW1lbnQKLQkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQotCQkJe2lucHV0U3RhdGUuZ3Vlc3NpbmcgIT0wIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbCArIDF9PwotCQkJQ09NTUEhIHR5cGVBcmd1bWVudAotCQkpKgotCi0JCSgJLy8gdHVybiB3YXJuaW5nIG9mZiBzaW5jZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGNvZGUsCi0JCQkvLyBwbHVzIHdlIGhhdmUgb3VyIHNlbWFudGljIHByZWRpY2F0ZSBiZWxvdwotCQkJb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKLQkJCXR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKLQkJKT8KLQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBnb2JibGVkIHVwIGVub3VnaCAnPicgY2hhcmFjdGVycwotCQkvLyBpZiB3ZSBhcmUgYXQgdGhlICJ0b3AgbGV2ZWwiIG9mIG5lc3RlZCB0eXBlQXJndW1lbnQgcHJvZHVjdGlvbnMKLQkJeyhjdXJyZW50THRMZXZlbCAhPSAwKSB8fCBsdENvdW50ZXIgPT0gY3VycmVudEx0TGV2ZWx9PwotCi0JCXsjdHlwZUFyZ3VtZW50cyA9ICMoI1tUWVBFX0FSR1VNRU5UUywgIlRZUEVfQVJHVU1FTlRTIl0sICN0eXBlQXJndW1lbnRzKTt9Ci0JOwotCi0vLyB0aGlzIGdvYmJsZXMgdXAgKnNvbWUqIGFtb3VudCBvZiAnPicgY2hhcmFjdGVycywgYW5kIGNvdW50cyBob3cgbWFueQotLy8gaXQgZ29iYmxlZC4KLXByb3RlY3RlZCB0eXBlQXJndW1lbnRzT3JQYXJhbWV0ZXJzRW5kCi0JOglHVCEge2x0Q291bnRlci09MTt9Ci0JfAlTUiEge2x0Q291bnRlci09Mjt9Ci0JfAlCU1IhIHtsdENvdW50ZXItPTM7fQotCTsKLQotLy8gUmVzdHJpY3Rpb24gb24gd2lsZGNhcmQgdHlwZXMgYmFzZWQgb24gc3VwZXIgY2xhc3Mgb3IgZGVycml2ZWQgY2xhc3MKLXR5cGVBcmd1bWVudEJvdW5kcwotCXtib29sZWFuIGlzVXBwZXJCb3VuZHMgPSBmYWxzZTt9Ci0JOgotCQkoICJleHRlbmRzIiEge2lzVXBwZXJCb3VuZHM9dHJ1ZTt9IHwgInN1cGVyIiEgKSBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KLQkJewotCQkJaWYgKGlzVXBwZXJCb3VuZHMpCi0JCQl7Ci0JCQkJI3R5cGVBcmd1bWVudEJvdW5kcyA9ICMoI1tUWVBFX1VQUEVSX0JPVU5EUywiVFlQRV9VUFBFUl9CT1VORFMiXSwgI3R5cGVBcmd1bWVudEJvdW5kcyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJI3R5cGVBcmd1bWVudEJvdW5kcyA9ICMoI1tUWVBFX0xPV0VSX0JPVU5EUywiVFlQRV9MT1dFUl9CT1VORFMiXSwgI3R5cGVBcmd1bWVudEJvdW5kcyk7Ci0JCQl9Ci0JCX0KLQk7Ci0KLS8vVE9ETyAtIGNoZWNrIHRoYXQgYXJyYXlPclR5cGVBcmdzIGlzIHN1aXRhYmxlIGhlcmUKLS8vIEEgYnVpbHRpbiB0eXBlIGFycmF5IHNwZWNpZmljYXRpb24gaXMgYSBidWlsdGluIHR5cGUgd2l0aCBicmFja2V0cyBhZnRlcndhcmRzCi1idWlsdEluVHlwZUFycmF5U3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQotCToJdDpidWlsdEluVHlwZQotCQkoICAgYXRhOmFycmF5T3JUeXBlQXJnc1sjdF0gICkrCi0JCXsKLQkJCWlmICgjYXRhICE9IG51bGwpICAjYnVpbHRJblR5cGVBcnJheVNwZWMgPSAjYXRhOwotCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKLQkJCQkjYnVpbHRJblR5cGVBcnJheVNwZWMgPSAjKCNbVFlQRSwiVFlQRSJdLCAjYnVpbHRJblR5cGVBcnJheVNwZWMpOwotCQkJfQotCQl9Ci0JOwotCi0vL1RPRE8gLSBjaGVjayB0aGF0IGFycmF5T3JUeXBlQXJncyBpcyBzdWl0YWJsZSBoZXJlCi0vLyBBIGJ1aWx0aW4gdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgYnVpbHRpbiB0eXBlIHdpdGggcG9zc2libGUgYnJhY2tldHMKLS8vIGFmdGVyd2FyZHMgKHdoaWNoIHdvdWxkIG1ha2UgaXQgYW4gYXJyYXkgdHlwZSkuCi1idWlsdEluVHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KLQk6CXQ6YnVpbHRJblR5cGUKLQkJKCAgIGF0YTphcnJheU9yVHlwZUFyZ3NbI3RdICApKgotCQl7Ci0JCQlpZiAoI2F0YSAhPSBudWxsKSAgI2J1aWx0SW5UeXBlU3BlYyA9ICNhdGE7Ci0JCQlpZiAoIGFkZEltYWdOb2RlICkgewotCQkJCSNidWlsdEluVHlwZVNwZWMgPSAjKCNbVFlQRSwiVFlQRSJdLCAjYnVpbHRJblR5cGVTcGVjKTsKLQkJCX0KLQkJfQotCTsKLQotLy8gQSB0eXBlIG5hbWUuIHdoaWNoIGlzIGVpdGhlciBhIChwb3NzaWJseSBxdWFsaWZpZWQgYW5kIHBhcmFtZXRlcml6ZWQpCi0vLyBjbGFzcyBuYW1lIG9yIGEgcHJpbWl0aXZlIChidWlsdGluKSB0eXBlCi10eXBlCi0JOgljbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KLQl8CWJ1aWx0SW5UeXBlCi0JOwotCi0vLyBUaGUgcHJpbWl0aXZlIHR5cGVzLgotYnVpbHRJblR5cGUKLQk6CSJ2b2lkIgotCXwJImJvb2xlYW4iCi0JfAkiYnl0ZSIKLQl8CSJjaGFyIgotCXwJInNob3J0IgotCXwJImludCIKLQl8CSJmbG9hdCIKLQl8CSJsb25nIgotCXwJImRvdWJsZSIKLSAgICB8ICAgImFueSIKLSAgICAvLyBQUk9QT1NFOiAgQWRkICJsaXN0IiwgIm1hcCIsICJjbG9zdXJlIj8/Ci0JOwotCi0vLyBBIChwb3NzaWJseS1xdWFsaWZpZWQpIGphdmEgaWRlbnRpZmllci4gV2Ugc3RhcnQgd2l0aCB0aGUgZmlyc3QgSURFTlQKLS8vIGFuZCBleHBhbmQgaXRzIG5hbWUgYnkgYWRkaW5nIGRvdHMgYW5kIGZvbGxvd2luZyBJREVOVFMKLWlkZW50aWZpZXIKLSAgICA6ICAgICAgIElERU5UCi0gICAgICAgICggICBvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBET1ReIG5scyEgSURFTlQgKSoKLSAgICA7Ci0KLWlkZW50aWZpZXJTdGFyCi0gICAgOiAgICAgICBJREVOVAotICAgICAgICAoICAgb3B0aW9ucyB7IGdyZWVkeSA9IHRydWU7IH0gOgotICAgICAgICAgICAgICAgICAgICAgICAgRE9UXiAgbmxzISBJREVOVCApKgotICAgICAgICAoICAgRE9UXiAgbmxzISBTVEFSCi0gICAgICAgIHwgICAiYXMiXiBubHMhIElERU5UCi0gICAgICAgICk/Ci0gICAgOwotCi0vLyBBIGxpc3Qgb2YgemVybyBvciBtb3JlIG1vZGlmaWVycy4gV2UgY291bGQgaGF2ZSB1c2VkIChtb2RpZmllcikqIGluCi0vLyBwbGFjZSBvZiBhIGNhbGwgdG8gbW9kaWZpZXJzLCBidXQgSSB0aG91Z2h0IGl0IHdhcyBhIGdvb2QgaWRlYSB0byBrZWVwCi0vLyB0aGlzIHJ1bGUgc2VwYXJhdGUgc28gdGhleSBjYW4gZWFzaWx5IGJlIGNvbGxlY3RlZCBpbiBhIFZlY3RvciBpZgotLy8gc29tZW9uZSBzbyBkZXNpcmVzCi1tb2RpZmllcnMKLQk6Ci0JCSgKLQkJCS8vaHVzaCB3YXJuaW5ncyBzaW5jZSB0aGUgc2VtYW50aWMgY2hlY2sgZm9yICJAaW50ZXJmYWNlIiBzb2x2ZXMgdGhlIG5vbi1kZXRlcm1pbmlzbQotCQkJb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKLQotCQkJbW9kaWZpZXIgbmxzIQotCQkJfAotCQkJLy9TZW1hbnRpYyBjaGVjayB0aGF0IHdlIGFyZW4ndCBtYXRjaGluZyBAaW50ZXJmYWNlIGFzIHRoaXMgaXMgbm90IGFuIGFubm90YXRpb24KLQkJCS8vQSBuaWNlciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSBuaWNlCi0JCQl7TEEoMSk9PUFUICYmICFMVCgyKS5nZXRUZXh0KCkuZXF1YWxzKCJpbnRlcmZhY2UiKX0/IGFubm90YXRpb24gbmxzIQotICAgICAgICApKwotCi0JCXsjbW9kaWZpZXJzID0gIyhbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl0sICNtb2RpZmllcnMpO30KLQk7Ci0KLS8vIG1vZGlmaWVycyBmb3IgSmF2YSBjbGFzc2VzLCBpbnRlcmZhY2VzLCBjbGFzcy9pbnN0YW5jZSB2YXJzIGFuZCBtZXRob2RzCi1tb2RpZmllcgotCToJInByaXZhdGUiCi0JfAkicHVibGljIgotCXwJInByb3RlY3RlZCIKLQl8CSJzdGF0aWMiCi0JfAkidHJhbnNpZW50IgotCXwJImZpbmFsIgotCXwJImFic3RyYWN0IgotCXwJIm5hdGl2ZSIKLQl8CSJ0aHJlYWRzYWZlIgotCXwJInN5bmNocm9uaXplZCIKLQl8CSJ2b2xhdGlsZSIKLQl8CSJzdHJpY3RmcCIKLQk7Ci0KLWFubm90YXRpb24hCi0JOglBVCEgaTppZGVudGlmaWVyICggTFBBUkVOISAoIGFyZ3M6YW5ub3RhdGlvbkFyZ3VtZW50cyApPyBSUEFSRU4hICk/Ci0JCXsjYW5ub3RhdGlvbiA9ICMoI1tBTk5PVEFUSU9OLCJBTk5PVEFUSU9OIl0sIGksIGFyZ3MpO30KLQk7Ci0KLWFubm90YXRpb25zCi0gICAgOiAgIChhbm5vdGF0aW9uIG5scyEpKgotCQl7I2Fubm90YXRpb25zID0gIyhbQU5OT1RBVElPTlMsICJBTk5PVEFUSU9OUyJdLCAjYW5ub3RhdGlvbnMpO30KLSAgICA7Ci0KLWFubm90YXRpb25Bcmd1bWVudHMKLQk6CWFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyIHwgYW5udG90YXRpb25NZW1iZXJWYWx1ZVBhaXJzCi0JOwotCi1hbm50b3RhdGlvbk1lbWJlclZhbHVlUGFpcnMKLQk6CWFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIgKCBDT01NQSEgYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciApKgotCTsKLQotYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciEKLQk6CWk6SURFTlQgQVNTSUdOISB2OmFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyCi0JCXsjYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciA9ICMoI1tBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSLCJBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSIl0sIGksIHYpO30KLQk7Ci0KLWFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyCi0JOgotCQljb25kaXRpb25hbEV4cHJlc3Npb24gfCBhbm5vdGF0aW9uIG5scyF8IGFubm90YXRpb25NZW1iZXJBcnJheUluaXRpYWxpemVyCi0JOwotCi0vLyBUaGlzIGlzIGFuIGluaXRpYWxpemVyIHVzZWQgdG8gc2V0IHVwIGFuIGFubm90YXRpb24gbWVtYmVyIGFycmF5LgotYW5ub3RhdGlvbk1lbWJlckFycmF5SW5pdGlhbGl6ZXIKLQk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKEFOTk9UQVRJT05fQVJSQVlfSU5JVCk7fQotCQkJKAlhbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCi0JCQkJKAotCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3Ci0JCQkJCS8vIGluaXRpYWxpemVyIG9yIHN0YXJ0IHRoZSBvcHRpb24gJywnIGF0IGVuZD8KLQkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCi0JCQkJCS8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCQkJCQlvcHRpb25zIHsKLQkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCToKLQkJCQkJQ09NTUEhIGFubm90YXRpb25NZW1iZXJBcnJheVZhbHVlSW5pdGlhbGl6ZXIKLQkJCQkpKgotCQkJCShDT01NQSEpPwotCQkJKT8KLQkJUkNVUkxZIQotCTsKLQotLy8gVGhlIHR3byB0aGluZ3MgdGhhdCBjYW4gaW5pdGlhbGl6ZSBhbiBhbm5vdGF0aW9uIGFycmF5IGVsZW1lbnQgYXJlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbgotLy8gYW5kIGFuIGFubm90YXRpb24gKG5lc3RlZCBhbm5vdGF0aW9uIGFycmF5IGluaXRpYWxpc2VycyBhcmUgbm90IHZhbGlkKQotYW5ub3RhdGlvbk1lbWJlckFycmF5VmFsdWVJbml0aWFsaXplcgotCToJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JfAlhbm5vdGF0aW9uIG5scyEKLQk7Ci0KLXN1cGVyQ2xhc3NDbGF1c2UhCi0JOgkoICJleHRlbmRzIiBjOmNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSApPwotCQl7I3N1cGVyQ2xhc3NDbGF1c2UgPSAjKCNbRVhURU5EU19DTEFVU0UsIkVYVEVORFNfQ0xBVVNFIl0sYyk7fQotCTsKLQotLy8gRGVmaW5pdGlvbiBvZiBhIEphdmEgY2xhc3MKLWNsYXNzRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10KLSAgICAgICAgeyBBU1QgcHJldkN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzczsgfQotCToJImNsYXNzIiBJREVOVCBubHMhCi0gICAgICAgIHsgY3VycmVudENsYXNzID0gI0lERU5UOyB9Ci0JCS8vIGl0IF9taWdodF8gaGF2ZSB0eXBlIHBhcmFtYXRlcnMKLQkJKHRwOnR5cGVQYXJhbWV0ZXJzKT8KLQkJLy8gaXQgX21pZ2h0XyBoYXZlIGEgc3VwZXJjbGFzcy4uLgotCQlzYzpzdXBlckNsYXNzQ2xhdXNlCi0JCS8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KLQkJaWM6aW1wbGVtZW50c0NsYXVzZQotCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGNsYXNzCi0JCWNiOmNsYXNzQmxvY2sKLQkJeyNjbGFzc0RlZmluaXRpb24gPSAjKCNbQ0xBU1NfREVGLCJDTEFTU19ERUYiXSwKLQkJCQkJCQkJbW9kaWZpZXJzLElERU5ULHRwLHNjLGljLGNiKTt9Ci0gICAgICAgIHsgY3VycmVudENsYXNzID0gcHJldkN1cnJlbnRDbGFzczsgfQotCTsKLQotLy9UT0RPIC0gd2hlcmUgaGFzIHN1cGVyQ2xhc3NDbGF1c2UhIHByb2R1Y3Rpb24gZ29uZT8/PwotCi0vLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBJbnRlcmZhY2UKLWludGVyZmFjZURlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCi0JOgkiaW50ZXJmYWNlIiBJREVOVCBubHMhCi0JCS8vIGl0IF9taWdodF8gaGF2ZSB0eXBlIHBhcmFtYXRlcnMKLQkJKHRwOnR5cGVQYXJhbWV0ZXJzKT8KLQkJLy8gaXQgbWlnaHQgZXh0ZW5kIHNvbWUgb3RoZXIgaW50ZXJmYWNlcwotCQlpZTppbnRlcmZhY2VFeHRlbmRzCi0JCS8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgaW50ZXJmYWNlIChsb29rcyBsaWtlIGEgY2xhc3MuLi4pCi0JCWliOmludGVyZmFjZUJsb2NrCi0JCXsjaW50ZXJmYWNlRGVmaW5pdGlvbiA9ICMoI1tJTlRFUkZBQ0VfREVGLCJJTlRFUkZBQ0VfREVGIl0sCi0JCQkJCQkJCQltb2RpZmllcnMsSURFTlQsdHAsaWUsaWIpO30KLQk7Ci0KLWVudW1EZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXQotCToJImVudW0iIElERU5UCi0JCS8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KLQkJaWM6aW1wbGVtZW50c0NsYXVzZQotCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGVudW0KLQkJZWI6ZW51bUJsb2NrCi0JCXsjZW51bURlZmluaXRpb24gPSAjKCNbRU5VTV9ERUYsIkVOVU1fREVGIl0sCi0JCQkJCQkJCW1vZGlmaWVycyxJREVOVCxpYyxlYik7fQotCTsKLQotYW5ub3RhdGlvbkRlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCi0JOglBVCAiaW50ZXJmYWNlIiBJREVOVAotCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGFubm90YXRpb24KLQkJYWI6YW5ub3RhdGlvbkJsb2NrCi0JCXsjYW5ub3RhdGlvbkRlZmluaXRpb24gPSAjKCNbQU5OT1RBVElPTl9ERUYsIkFOTk9UQVRJT05fREVGIl0sCi0JCQkJCQkJCQltb2RpZmllcnMsSURFTlQsYWIpO30KLQk7Ci0KLXR5cGVQYXJhbWV0ZXJzCi17aW50IGN1cnJlbnRMdExldmVsID0gMDt9Ci0JOgotCQl7Y3VycmVudEx0TGV2ZWwgPSBsdENvdW50ZXI7fQotCQlMVCEge2x0Q291bnRlcisrO30KLQkJdHlwZVBhcmFtZXRlciAoQ09NTUEhIHR5cGVQYXJhbWV0ZXIpKgotCQkodHlwZUFyZ3VtZW50c09yUGFyYW1ldGVyc0VuZCk/Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgZ29iYmxlZCB1cCBlbm91Z2ggJz4nIGNoYXJhY3RlcnMKLQkJLy8gaWYgd2UgYXJlIGF0IHRoZSAidG9wIGxldmVsIiBvZiBuZXN0ZWQgdHlwZUFyZ3VtZW50IHByb2R1Y3Rpb25zCi0JCXsoY3VycmVudEx0TGV2ZWwgIT0gMCkgfHwgbHRDb3VudGVyID09IGN1cnJlbnRMdExldmVsfT8KLQotCQl7I3R5cGVQYXJhbWV0ZXJzID0gIygjW1RZUEVfUEFSQU1FVEVSUywgIlRZUEVfUEFSQU1FVEVSUyJdLCAjdHlwZVBhcmFtZXRlcnMpO30KLQk7Ci0KLXR5cGVQYXJhbWV0ZXIKLQk6Ci0JCS8vIEknbSBwcmV0dHkgc3VyZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IHRoaW5nIGhlcmU6Ci0JCShpZDpJREVOVCkgKCBvcHRpb25ze2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9OiB0eXBlUGFyYW1ldGVyQm91bmRzICk/Ci0JCXsjdHlwZVBhcmFtZXRlciA9ICMoI1tUWVBFX1BBUkFNRVRFUiwiVFlQRV9QQVJBTUVURVIiXSwgI3R5cGVQYXJhbWV0ZXIpO30KLQk7Ci0KLXR5cGVQYXJhbWV0ZXJCb3VuZHMKLQk6Ci0JCSJleHRlbmRzIiEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdCi0JCShCQU5EISBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0pKgotCQl7I3R5cGVQYXJhbWV0ZXJCb3VuZHMgPSAjKCNbVFlQRV9VUFBFUl9CT1VORFMsIlRZUEVfVVBQRVJfQk9VTkRTIl0sICN0eXBlUGFyYW1ldGVyQm91bmRzKTt9Ci0JOwotCi0vLyBUaGlzIGlzIHRoZSBib2R5IG9mIGEgY2xhc3MuIFlvdSBjYW4gaGF2ZSBjbGFzc0ZpZWxkcyBhbmQgZXh0cmEgc2VtaWNvbG9ucy4KLWNsYXNzQmxvY2sKLQk6CUxDVVJMWSEKLSAgICAgICAgICAgICggY2xhc3NGaWVsZCApPyAoIHNlcCEgKCBjbGFzc0ZpZWxkICk/ICkqCi0JCVJDVVJMWSEKLQkJeyNjbGFzc0Jsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjY2xhc3NCbG9jayk7fQotCTsKLQotLy8gVGhpcyBpcyB0aGUgYm9keSBvZiBhbiBpbnRlcmZhY2UuIFlvdSBjYW4gaGF2ZSBpbnRlcmZhY2VGaWVsZCBhbmQgZXh0cmEgc2VtaWNvbG9ucy4KLWludGVyZmFjZUJsb2NrCi0JOglMQ1VSTFkhCi0gICAgICAgICAgICAoIGludGVyZmFjZUZpZWxkICk/ICggc2VwISAoIGludGVyZmFjZUZpZWxkICk/ICkqCi0JCVJDVVJMWSEKLQkJeyNpbnRlcmZhY2VCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2ludGVyZmFjZUJsb2NrKTt9Ci0JOwotCQotLy8gVGhpcyBpcyB0aGUgYm9keSBvZiBhbiBhbm5vdGF0aW9uLiBZb3UgY2FuIGhhdmUgYW5ub3RhdGlvbiBmaWVsZHMgYW5kIGV4dHJhIHNlbWljb2xvbnMsCi0vLyBUaGF0J3MgYWJvdXQgaXQgKHVudGlsIHlvdSBzZWUgd2hhdCBhbiBhbm5vYXRpb24gZmllbGQgaXMuLi4pCi1hbm5vdGF0aW9uQmxvY2sKLQk6CUxDVVJMWSEKLSAgICAgICAgICAgICggYW5ub3RhdGlvbkZpZWxkICk/ICggc2VwISAoIGFubm90YXRpb25GaWVsZCApPyApKgotCQlSQ1VSTFkhCi0JCXsjYW5ub3RhdGlvbkJsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjYW5ub3RhdGlvbkJsb2NrKTt9Ci0JOwotCi0vLyBUaGlzIGlzIHRoZSBib2R5IG9mIGFuIGVudW0uIFlvdSBjYW4gaGF2ZSB6ZXJvIG9yIG1vcmUgZW51bSBjb25zdGFudHMKLS8vIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgZmllbGRzIGxpa2UgYSByZWd1bGFyIGNsYXNzCi1lbnVtQmxvY2sKLQk6CUxDVVJMWSEKLQkJCSggZW51bUNvbnN0YW50ICggb3B0aW9uc3tncmVlZHk9dHJ1ZTt9OiBDT01NQSEgZW51bUNvbnN0YW50ICkqICggQ09NTUEhICk/ICk/Ci0JCQkoIFNFTUkhICggY2xhc3NGaWVsZCB8IFNFTUkhICkqICk/Ci0JCVJDVVJMWSEKLQkJeyNlbnVtQmxvY2sgPSAjKFtPQkpCTE9DSywgIk9CSkJMT0NLIl0sICNlbnVtQmxvY2spO30KLQk7Ci0KLS8vIEFuIGFubm90YXRpb24gZmllbGQKLWFubm90YXRpb25GaWVsZCEKLQk6CW1vZHM6bW9kaWZpZXJzCi0JCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KLQkJCXsjYW5ub3RhdGlvbkZpZWxkID0gI3RkO30KLQkJfAl0OnR5cGVTcGVjW2ZhbHNlXQkJLy8gYW5ub3RhdGlvbiBmaWVsZAotCQkJKAlpOklERU5UCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCi0JCQkJTFBBUkVOISBSUEFSRU4hCi0KLQkJCQkvKk9CUyogcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSAqT0JTKi8KLQotCQkJCSggImRlZmF1bHQiIGFtdmk6YW5ub3RhdGlvbk1lbWJlclZhbHVlSW5pdGlhbGl6ZXIgKT8KLQotCQkJCVNFTUkKLQkJCQl7I2Fubm90YXRpb25GaWVsZCA9Ci0JCQkJCSMoI1tBTk5PVEFUSU9OX0ZJRUxEX0RFRiwiQU5OT1RBVElPTl9GSUVMRF9ERUYiXSwKLQkJCQkJCSBtb2RzLAotCQkJCQkJICMoI1tUWVBFLCJUWVBFIl0sdCksCi0JCQkJCQkgaSxhbXZpCi0JCQkJCQkgKTt9Ci0JCQl8CXY6dmFyaWFibGVEZWZpbml0aW9uc1sjbW9kcywjdF0gU0VNSQkvLyB2YXJpYWJsZQotCQkJCXsjYW5ub3RhdGlvbkZpZWxkID0gI3Y7fQotCQkJKQotCQkpCi0JOwotCi0vL0FuIGVudW0gY29uc3RhbnQgbWF5IGhhdmUgb3B0aW9uYWwgcGFyYW1ldGVycyBhbmQgbWF5IGhhdmUgYQotLy9hIGNsYXNzIGJvZHkKLWVudW1Db25zdGFudCEKLQk6CWFuOmFubm90YXRpb25zCi0JCWk6SURFTlQKLQkJKAlMUEFSRU4hCi0JCQlhOmFyZ0xpc3QKLQkJCVJQQVJFTiEKLQkJKT8KLQkJKCBiOmVudW1Db25zdGFudEJsb2NrICk/Ci0JCXsjZW51bUNvbnN0YW50ID0gIyhbRU5VTV9DT05TVEFOVF9ERUYsICJFTlVNX0NPTlNUQU5UX0RFRiJdLCBhbiwgaSwgYSwgYik7fQotCTsKLQotLy9UaGUgY2xhc3MtbGlrZSBib2R5IG9mIGFuIGVudW0gY29uc3RhbnQKLWVudW1Db25zdGFudEJsb2NrCi0JOglMQ1VSTFkhCi0JCSggZW51bUNvbnN0YW50RmllbGQgfCBTRU1JISApKgotCQlSQ1VSTFkhCi0JCXsjZW51bUNvbnN0YW50QmxvY2sgPSAjKFtPQkpCTE9DSywgIk9CSkJMT0NLIl0sICNlbnVtQ29uc3RhbnRCbG9jayk7fQotCTsKLQotLy9BbiBlbnVtIGNvbnN0YW50IGZpZWxkIGlzIGp1c3QgbGlrZSBhIGNsYXNzIGZpZWxkIGJ1dCB3aXRob3V0Ci0vL3RoZSBwb3NpYmlsaXR5IG9mIGEgY29uc3RydWN0b3IgZGVmaW5pdGlvbiBvciBhIHN0YXRpYyBpbml0aWFsaXplcgotCi0vLyBUT0RPIC0gbWF5YmUgYWxsb3cgJ2RlY2xhcmF0aW9uJyBwcm9kdWN0aW9uIHdpdGhpbiB0aGlzIHByb2R1Y3Rpb24sIAotLy8gYnV0IGhvdyB0byBkaXNhbGxvdyBjb25zdHJ1Y3RvcnMgYW5kIHN0YXRpYyBpbml0aWFsaXplcnMuLi4KLWVudW1Db25zdGFudEZpZWxkIQotCToJbW9kczptb2RpZmllcnMKLQkJKAl0ZDp0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtb2RzXQotCQkJeyNlbnVtQ29uc3RhbnRGaWVsZCA9ICN0ZDt9Ci0JfAkvLyBBIGdlbmVyaWMgbWV0aG9kIGhhcyB0aGUgdHlwZVBhcmFtZXRlcnMgYmVmb3JlIHRoZSByZXR1cm4gdHlwZS4KLQkJCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLCBidXQgdGhpcyBwcm9kdWN0aW9uCi0JCQkvLyBhbGxvd3MgaXQsIGEgc2VtYW50aWMgY2hlY2sgY291bGQgYmUgdXNlZCBpZiB5b3Ugd2FudGVkLgotCQkJKHRwOnR5cGVQYXJhbWV0ZXJzKT8gdDp0eXBlU3BlY1tmYWxzZV0JCS8vIG1ldGhvZCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbihzKQotCQkJKAlJREVOVAkJCQkJCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLQotCQkJCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KLQkJCQlMUEFSRU4hIHBhcmFtOnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCi0KLQkvKk9CUyoJCQlydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdICpPQlMqLwotCi0JCQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcwotCQkJCS8vIGRlY2xhcmVkIHRvIHRocm93Ci0JCQkJKHRjOnRocm93c0NsYXVzZSk/Ci0KLQkJCQkoIHMyOmNvbXBvdW5kU3RhdGVtZW50IHwgU0VNSSApCi0JCQkgLy8gVE9ETyAtIHZlcmlmeSB0aGF0ICd0JyBpcyB1c2VmdWwvY29ycmVjdCBoZXJlLCB1c2VkIHRvIGJlICdydCcKLQkJCQl7I2VudW1Db25zdGFudEZpZWxkID0gIygjW01FVEhPRF9ERUYsIk1FVEhPRF9ERUYiXSwKLQkJCQkJCQkgbW9kcywKLQkJCQkJCQkgdHAsCi0JCQkJCQkJICMoI1tUWVBFLCJUWVBFIl0sdCksCi0JCQkJCQkJIElERU5ULAotCQkJCQkJCSBwYXJhbSwKLQkJCQkJCQkgdGMsCi0JCQkJCQkJIHMyKTt9Ci0JCQkKLQkJCSB8CXY6dmFyaWFibGVEZWZpbml0aW9uc1sjbW9kcywjdF0gU0VNSQotCQkJCXsjZW51bUNvbnN0YW50RmllbGQgPSAjdjt9Ci0JCQkpCi0JCSkKLQotCS8vICJ7IC4uLiB9IiBpbnN0YW5jZSBpbml0aWFsaXplcgotCXwJczQ6Y29tcG91bmRTdGF0ZW1lbnQKLQkJeyNlbnVtQ29uc3RhbnRGaWVsZCA9ICMoI1tJTlNUQU5DRV9JTklULCJJTlNUQU5DRV9JTklUIl0sIHM0KTt9Ci0JOwotCi0vLyBBbiBpbnRlcmZhY2UgY2FuIGV4dGVuZCBzZXZlcmFsIG90aGVyIGludGVyZmFjZXMuLi4KLWludGVyZmFjZUV4dGVuZHMKLQk6CSgKLQkJZToiZXh0ZW5kcyIhIG5scyEKLQkJY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICggQ09NTUEhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICkqIG5scyEKLQkJKT8KLQkJeyNpbnRlcmZhY2VFeHRlbmRzID0gIygjW0VYVEVORFNfQ0xBVVNFLCJFWFRFTkRTX0NMQVVTRSJdLAotCQkJCQkJCQkjaW50ZXJmYWNlRXh0ZW5kcyk7fQotCTsKLQotLy8gQSBjbGFzcyBjYW4gaW1wbGVtZW50IHNldmVyYWwgaW50ZXJmYWNlcy4uLgotaW1wbGVtZW50c0NsYXVzZQotCToJKAotCQkJaToiaW1wbGVtZW50cyIhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICggQ09NTUEhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICkqIG5scyEKLQkJKT8KLQkJeyNpbXBsZW1lbnRzQ2xhdXNlID0gIygjW0lNUExFTUVOVFNfQ0xBVVNFLCJJTVBMRU1FTlRTX0NMQVVTRSJdLAotCQkJCQkJCQkgI2ltcGxlbWVudHNDbGF1c2UpO30KLQk7Ci0KLS8vIE5vdyB0aGUgdmFyaW91cyB0aGluZ3MgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBjbGFzcwotY2xhc3NGaWVsZCEKLQk6CS8vIG1ldGhvZCwgY29uc3RydWN0b3IsIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uCi0JCShkZWNsYXJhdGlvblN0YXJ0KT0+Ci0gICAgICAgIGQ6ZGVjbGFyYXRpb24KLSAgICAgICAgeyNjbGFzc0ZpZWxkID0gI2Q7fQotICAgIHwKLSAgICAgICAgLy9UT0RPIC0gdW5pZnkgdHlwZURlY2xhcmF0aW9uIGFuZCB0eXBlRGVmaW5pdGlvbkludGVybmFsIG5hbWVzCi0gICAgICAgIC8vIHR5cGUgZGVjbGFyYXRpb24KLSAgICAgICAgKHR5cGVEZWNsYXJhdGlvblN0YXJ0KT0+Ci0gICAgICAgICggbW9kczptb2RpZmllcnMgKT8KLQkJKAl0ZDp0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtb2RzXQotCQkJeyNjbGFzc0ZpZWxkID0gI3RkO30KLQkJKQotCi0JLy8gInN0YXRpYyB7IC4uLiB9IiBjbGFzcyBpbml0aWFsaXplcgotCXwJInN0YXRpYyIgczM6Y29tcG91bmRTdGF0ZW1lbnQKLQkJeyNjbGFzc0ZpZWxkID0gIygjW1NUQVRJQ19JTklULCJTVEFUSUNfSU5JVCJdLCBzMyk7fQotCi0JLy8gInsgLi4uIH0iIGluc3RhbmNlIGluaXRpYWxpemVyCi0JfAlzNDpjb21wb3VuZFN0YXRlbWVudAotCQl7I2NsYXNzRmllbGQgPSAjKCNbSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCJdLCBzNCk7fQotCTsKLQotLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGludGVyZmFjZQotaW50ZXJmYWNlRmllbGQhCi0JOgkvLyBtZXRob2QsIGNvbnN0cnVjdG9yLCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbgotICAgICAgICAoZGVjbGFyYXRpb25TdGFydCk9PgotICAgICAgICBkOmRlY2xhcmF0aW9uCi0gICAgICAgIHsjaW50ZXJmYWNlRmllbGQgPSAjZDt9Ci0gICAgfAotICAgICAgICAvL1RPRE8gLSB1bmlmeSB0eXBlRGVjbGFyYXRpb24gYW5kIHR5cGVEZWZpbml0aW9uSW50ZXJuYWwgbmFtZXMKLSAgICAgICAgLy8gdHlwZSBkZWNsYXJhdGlvbgotICAgICAgICAodHlwZURlY2xhcmF0aW9uU3RhcnQpPT4KLSAgICAgICAgKCBtb2RzOm1vZGlmaWVycyApPwotCi0JCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KLQkJCXsjaW50ZXJmYWNlRmllbGQgPSAjdGQ7fQotCQkpCi0JOwotCi1jb25zdHJ1Y3RvckJvZHkKLQk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKFNMSVNUKTt9IG5scyEKLSAgICAgICAgKCAgIChleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbikgPT4gICAvLyBKYXZhIGNvbXBhdGliaWxpdHkgaGFjawotICAgICAgICAgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIChzZXAhIGJsb2NrQm9keSk/Ci0gICAgICAgICAgICB8ICAgYmxvY2tCb2R5Ci0gICAgICAgICkKLSAgICAgICAgUkNVUkxZIQotICAgIDsKLQotCi0vKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCi1leHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotICAgICAgICB7Ym9vbGVhbiB6ejsgLyppZ25vcmVkKi8gfQotCToJKHR5cGVBcmd1bWVudHMpPwotCQkoCSJ0aGlzIiEgbHAxOkxQQVJFTl4geno9YXJnTGlzdCBSUEFSRU4hCi0JCQl7I2xwMS5zZXRUeXBlKENUT1JfQ0FMTCk7fQotCQl8CSJzdXBlciIhIGxwMjpMUEFSRU5eIHp6PWFyZ0xpc3QgUlBBUkVOIQotCQkJeyNscDIuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KLQkJKQotCTsKLQotLyoqIFRoZSB0YWlsIG9mIGEgZGVjbGFyYXRpb24uCi0gICogRWl0aGVyIHYxLCB2MiwgLi4uICh3aXRoIHBvc3NpYmxlIGluaXRpYWxpemVycykgb3IgZWxzZSBtKGFyZ3Mpe2JvZHl9LgotICAqIFRoZSB0d28gYXJndW1lbnRzIGFyZSB0aGUgbW9kaWZpZXIgbGlzdCAoaWYgYW55KSBhbmQgdGhlIGRlY2xhcmF0aW9uIGhlYWQgKGlmIGFueSkuCi0gICogVGhlIGRlY2xhcmF0aW9uIGhlYWQgaXMgdGhlIHZhcmlhYmxlIHR5cGUsIG9yIChmb3IgYSBtZXRob2QpIHRoZSByZXR1cm4gdHlwZS4KLSAgKiBJZiBpdCBpcyBtaXNzaW5nLCB0aGVuIHRoZSB2YXJpYWJsZSB0eXBlIGlzIHRha2VuIGZyb20gaXRzIGluaXRpYWxpemVyIChpZiB0aGVyZSBpcyBvbmUpLgotICAqIE90aGVyd2lzZSwgdGhlIHZhcmlhYmxlIHR5cGUgZGVmYXVsdHMgdG8gJ2FueScuCi0gICogREVDSURFOiAgTWV0aG9kIHJldHVybiB0eXBlcyBkZWZhdWx0IHRvIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgYm9keSwgYXMgYW4gZXhwcmVzc2lvbi4KLSAgKi8KLXZhcmlhYmxlRGVmaW5pdGlvbnNbQVNUIG1vZHMsIEFTVCB0XQotICAgIDogICAgICAgdmFyaWFibGVEZWNsYXJhdG9yW2dldEFTVEZhY3RvcnkoKS5kdXBUcmVlKG1vZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0gICAgICAgICggICAgICAgQ09NTUEhIG5scyEKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcltnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZShtb2RzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCi0gICAgICAgICkqCi0gICAgfAotICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJzZXIgYWxsb3dzIGEgbWV0aG9kIGRlZmluaXRpb24gYW55d2hlcmUgYSB2YXJpYWJsZSBkZWZpbml0aW9uIGlzIGFjY2VwdGVkLgotCi0gICAgICAgICggICBpZDpJREVOVAotICAgICAgICB8ICAgcWlkOlNUUklOR19MSVRFUkFMICAgICAgICAgIHsjcWlkLnNldFR5cGUoSURFTlQpO30gIC8vIHVzZSBmb3Igb3BlcmF0b3IgZGVmaW50aW9ucywgZXRjLgotICAgICAgICApCi0KLSAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCi0gICAgICAgICAgICAgICAgTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QhIFJQQVJFTiEKLQotICAgICAgICAgICAgICAgIC8qT0JTKnJ0OmRlY2xhcmF0b3JCcmFja2V0c1sjdF0qLwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcwotICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHRvIHRocm93Ci0gICAgICAgICggICAgICAgdGM6dGhyb3dzQ2xhdXNlISAgKT8KLQotICAgICAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgYm9keSBpcyBhbiBvcGVuIGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gYnV0LCBpdCBtYXkgaGF2ZSBhbiBvcHRpb25hbCBjb25zdHJ1Y3RvciBjYWxsIChmb3IgY29uc3RydWN0b3JzIG9ubHkpCi0gICAgICAgICgKLSAgICAgICAgICAgIHtpc0NvbnN0cnVjdG9ySWRlbnQoaWQpfT8KLSAgICAgICAgICAgIHsjaWQuc2V0VHlwZShDVE9SX0lERU5UKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYjpjb25zdHJ1Y3RvckJvZHkhCi0gICAgICAgIHwgICAgICAgbWI6b3BlbkJsb2NrIQotICAgICAgICB8ICAgLypvciBub3RoaW5nIGF0IGFsbCovCi0gICAgICAgICkKLSAgICAgICAgeyAgIGlmICgjY2IgIT0gbnVsbCkgICAjbWIgPSAjY2I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoI3FpZCAhPSBudWxsKSAgI2lkID0gI3FpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICN2YXJpYWJsZURlZmluaXRpb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygjW01FVEhPRF9ERUYsIk1FVEhPRF9ERUYiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RzLCAjKCNbVFlQRSwiVFlQRSJdLHQpLCBpZCwgcGFyYW0sIHRjLCBtYik7Ci0gICAgICAgIH0KLSAgICA7Ci0KLQotLyoqIERlY2xhcmF0aW9uIG9mIGEgdmFyaWFibGUuIFRoaXMgY2FuIGJlIGEgY2xhc3MvaW5zdGFuY2UgdmFyaWFibGUsCi0gKiAgb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIG1ldGhvZAotICogIEl0IGNhbiBhbHNvIGluY2x1ZGUgcG9zc2libGUgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXZhcmlhYmxlRGVjbGFyYXRvciFbQVNUIG1vZHMsIEFTVCB0XQotICAgIDoKLSAgICAgICAgICAgICAgICBpZDp2YXJpYWJsZU5hbWUKLSAgICAgICAgICAgICAgICAvKk9CUypkOmRlY2xhcmF0b3JCcmFja2V0c1t0XSovCi0gICAgICAgICAgICAgICAgdjp2YXJJbml0aWFsaXplcgotICAgICAgICB7I3ZhcmlhYmxlRGVjbGFyYXRvciA9ICMoI1tWQVJJQUJMRV9ERUYsIlZBUklBQkxFX0RFRiJdLCBtb2RzLCAjKCNbVFlQRSwiVFlQRSJdLHQpLCBpZCwgdik7fQotICAgIDsKLQotLyoqIFVzZWQgaW4gY2FzZXMgd2hlcmUgYSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSBjb21tYXMsIG9yIGVuZHMgd2l0aCB0aGUgImluIiBvcGVyYXRvciBpbnN0ZWFkIG9mICc9Jy4gKi8KLXNpbmdsZVZhcmlhYmxlIVtBU1QgbW9kcywgQVNUIHRdCi0gICAgICAgIDoKLSAgICAgICAgICAgICAgICBpZDp2YXJpYWJsZU5hbWUKLSAgICAgICAgICAgICAgICB7I3NpbmdsZVZhcmlhYmxlID0gIygjW1ZBUklBQkxFX0RFRiwiVkFSSUFCTEVfREVGIl0sIG1vZHMsICMoI1tUWVBFLCJUWVBFIl0sdCksIGlkKTt9Ci0gICAgICAgIDsKLQotdmFyaWFibGVOYW1lCi0gICAgICAgIDogICAoSURFTlQgfCAiaXQiKQotICAgICAgICA7Ci0KLS8qT0JTKgotZGVjbGFyYXRvckJyYWNrZXRzW0FTVCB0eXBdCi0JOgl7I2RlY2xhcmF0b3JCcmFja2V0cz10eXA7fQotCQkobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKLQk7Ci0qT0JTKi8KLQotdmFySW5pdGlhbGl6ZXIKLQk6CSggQVNTSUdOXiBubHMhIGluaXRpYWxpemVyICk/Ci0JOwotCi0vKk9CUyoKLS8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYXJyYXkuCi1hcnJheUluaXRpYWxpemVyCi0JOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBUlJBWV9JTklUKTt9Ci0JCQkoCWluaXRpYWxpemVyCi0JCQkJKAotCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3Ci0JCQkJCS8vIGluaXRpYWxpemVyIG9yIHN0YXJ0IHRoZSBvcHRpb24gJywnIGF0IGVuZD8KLQkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCi0JCQkJCS8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCQkJCQlvcHRpb25zIHsKLQkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCToKLQkJCQkJQ09NTUEhIGluaXRpYWxpemVyCi0JCQkJKSoKLQkJCQkoQ09NTUEhKT8KLQkJCSk/Ci0JCVJDVVJMWSEKLQk7Ci0qT0JTKi8KLQotLy8gVGhlIHR3byAidGhpbmdzIiB0aGF0IGNhbiBpbml0aWFsaXplIGFuIGFycmF5IGVsZW1lbnQgYXJlIGFuIGV4cHJlc3Npb24KLS8vIGFuZCBhbm90aGVyIChuZXN0ZWQpIGFycmF5IGluaXRpYWxpemVyLgotaW5pdGlhbGl6ZXIKLQk6CWV4cHJlc3Npb24KLS8qT0JTKiAgLy8gVXNlIFsuLi5dIGZvciBpbml0aWFsaXppbmcgYWxsIHNvcnRzIG9mIHNlcXVlbmNlcywgaW5jbHVkaW5nIGFycmF5cy4KLQl8CWFycmF5SW5pdGlhbGl6ZXIKLSpPQlMqLwotCTsKLQotLypPQlM/Pz8KLS8vIFRoaXMgaXMgdGhlIGhlYWRlciBvZiBhIG1ldGhvZC4gSXQgaW5jbHVkZXMgdGhlIG5hbWUgYW5kIHBhcmFtZXRlcnMKLS8vIGZvciB0aGUgbWV0aG9kLgotLy8gVGhpcyBhbHNvIHdhdGNoZXMgZm9yIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyBpbiBhICJ0aHJvd3MiIGNsYXVzZS4KLWN0b3JIZWFkCi0JOglJREVOVCAvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0KLQkJLy8gcGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgotCQlMUEFSRU4hIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCi0KLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdwotCQkodGhyb3dzQ2xhdXNlKT8KLQk7Ci0qT0JTKi8KLQotLy8gVGhpcyBpcyBhIGxpc3Qgb2YgZXhjZXB0aW9uIGNsYXNzZXMgdGhhdCB0aGUgbWV0aG9kIGlzIGRlY2xhcmVkIHRvIHRocm93Ci10aHJvd3NDbGF1c2UKLQk6CSJ0aHJvd3MiXiBubHMhIGlkZW50aWZpZXIgKCBDT01NQSEgbmxzISBpZGVudGlmaWVyICkqIG5scyEKLQk7Ci0KLS8vIEEgbGlzdCBvZiBmb3JtYWwgcGFyYW1ldGVycwotLy8JIFplcm8gb3IgbW9yZSBwYXJhbWV0ZXJzCi0vLwkgSWYgYSBwYXJhbWV0ZXIgaXMgdmFyaWFibGUgbGVuZ3RoIChlLmcuIFN0cmluZy4uLiBteUFyZykgaXQgaXMgdGhlIHJpZ2h0LW1vc3QgcGFyYW1ldGVyCi1wYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QKLQkvLyBUaGUgc2VtYW50aWMgY2hlY2sgaW4gKCAuLi4uICkqIGJsb2NrIGlzIGZsYWdnZWQgYXMgc3VwZXJmbHVvdXMsIGFuZCBzZWVtcyBzdXBlcmZsdW91cyBidXQKLQkvLyBpcyB0aGUgb25seSB3YXkgSSBjb3VsZCBtYWtlIHRoaXMgd29yay4gSWYgbXkgdW5kZXJzdGFuZGluZyBpcyBjb3JyZWN0IHRoaXMgaXMgYSBrbm93biBidWcKLQk6CSgJKCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiApPT4gcGFyYW1ldGVyRGVjbGFyYXRpb24KLQkJCSggb3B0aW9ucyB7d2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTt9IDogKCBDT01NQSEgbmxzISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiApID0+IENPTU1BISBubHMhIHBhcmFtZXRlckRlY2xhcmF0aW9uICkqCi0JCQkoIENPTU1BISBubHMhIHZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24gKT8KLQkJfAotCQkJdmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJEZWNsYXJhdGlvbgotCQkpPwotCQl7I3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCA9ICMoI1tQQVJBTUVURVJTLCJQQVJBTUVURVJTIl0sCi0JCQkJCQkJCQkjcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KTt9Ci0JOwotCi0vLyBBIGZvcm1hbCBwYXJhbWV0ZXIuCi1wYXJhbWV0ZXJEZWNsYXJhdGlvbiEKLSAgICAgICAgOiAgICAgICAoImRlZiIhKT8gIC8vIHVzZWxlc3MgYnV0IHBlcm1pdHRlZCBmb3Igc3ltbWV0cnkKLSAgICAgICAgICAgICAgICBwbTpwYXJhbWV0ZXJNb2RpZmllciAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiB0OnR5cGVTcGVjW2ZhbHNlXSk/IGlkOnBhcmFtZXRlcklkZW50Ci0gICAgICAgICAgICAgICAgLypPQlMqcGQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSovCi0gICAgICAgICAgICAgICAgeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoI1tQQVJBTUVURVJfREVGLCJQQVJBTUVURVJfREVGIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbSwgIyhbVFlQRSwiVFlQRSJdLHQpLCBpZCk7fQotICAgICAgICA7Ci0KLS8vIFRPRE8gLSBwb3NzaWJseSBhZGQgbmxzISBzb21ld2hlcmUgd2l0aGluIHZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24KLXZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24hCi0JOglwbTpwYXJhbWV0ZXJNb2RpZmllciB0OnR5cGVTcGVjW2ZhbHNlXSBUUklQTEVfRE9UISBpZDpJREVOVAotCQkvKk9CUyogcGQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSovCi0JCXsjdmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoI1tWQVJJQUJMRV9QQVJBTUVURVJfREVGLCJWQVJJQUJMRV9QQVJBTUVURVJfREVGIl0sCi0JCQkJCQkJCQkJCQlwbSwgIyhbVFlQRSwiVFlQRSJdLHQpLCBpZCk7fQotCTsKLQotcGFyYW1ldGVyTW9kaWZpZXIKLQkvL2ZpbmFsIGNhbiBhcHBlYXIgYW1vbmdzdCBhbm5vdGF0aW9ucyBpbiBhbnkgb3JkZXIgLSBncmVlZGlseSBjb25zdW1lIGFueSBwcmVjZWRpbmcKLQkvL2Fubm90YXRpb25zIHRvIHNodXQgbm9uZC1ldGVybWluaXNtIHdhcm5pbmdzIG9mZgotCToJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fSA6IGFubm90YXRpb24gbmxzISkqIChmOiJmaW5hbCIpPyAoYW5ub3RhdGlvbiBubHMhKSoKLQkJeyNwYXJhbWV0ZXJNb2RpZmllciA9ICMoI1tNT0RJRklFUlMsIk1PRElGSUVSUyJdLCAjcGFyYW1ldGVyTW9kaWZpZXIpO30KLQk7Ci0KLWNsb3N1cmVQYXJhbWV0ZXJzCi0gICAgICAgIDogICAoY2xvc3VyZVBhcmFtZXRlciAoQ09NTUEhIG5scyEgY2xvc3VyZVBhcmFtZXRlcikqIG5scyEpPyBCT1IhCi0gICAgICAgICAgICAgICAgeyNjbG9zdXJlUGFyYW1ldGVycyA9ICMoI1tQQVJBTUVURVJTLCJQQVJBTUVURVJTIl0sICNjbG9zdXJlUGFyYW1ldGVycyk7fQotICAgICAgICB8ICAgTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOISBCT1IhCi0gICAgICAgICAgICAgICAgLy8gWWVzLCB5b3UgY2FuIGhhdmUgYSBmdWxsIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBsaXN0LgotICAgICAgICAgICAgICAgIC8vIFllcywgeW91IG11c3QgcGFyZW50aGVzaXplIGl0IChhcyBmb3IgYSBuYW1lZCBtZXRob2QpIHVubGVzcyBpdCdzIHJlYWxseSwgcmVhbGx5IHNpbXBsZS4KLSAgICAgICAgOwotCi1jbG9zdXJlUGFyYW1ldGVyc1N0YXJ0IQotICAgICAgICA6ICAgQk9SCi0gICAgICAgIHwgICAgICAgcGFyYW1ldGVySWRlbnQhIG5scyEgKEJPUiB8IENPTU1BKQotICAgICAgICB8ICAgTFBBUkVOIGJhbGFuY2VkVG9rZW5zISBSUEFSRU4gbmxzISBCT1IKLSAgICAgICAgOwotCi0vKiogU2ltcGxlIG5hbWVzLCBhcyBpbiB7eHwuLi59LCBhcmUgY29tcGxldGVseSBlcXVpdmFsZW50IHRvIHsoZGVmIHgpfC4uLn0uICBCdWlsZCB0aGUgcmlnaHQgQVNULiAqLwotY2xvc3VyZVBhcmFtZXRlciEKLSAgICAgICAgOiAgIHBhcmFtZXRlcklkZW50IQotICAgICAgICAgICAgICAgIHsjY2xvc3VyZVBhcmFtZXRlciA9ICMoI1tQQVJBTUVURVJfREVGLCJQQVJBTUVURVJfREVGIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygjW01PRElGSUVSUywiTU9ESUZJRVJTIl0pLCAjKFtUWVBFLCJUWVBFIl0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjbG9zdXJlUGFyYW1ldGVyKTt9Ci0gICAgICAgIDsKLQotLyoqIEEgZm9ybWFsIHBhcmFtZXRlciBuYW1lIGNhbiBiZSBkZWNvcmF0ZWQgd2l0aCB0aGUgb3B0aW9uYWxpdHkgb3BlcmF0b3IsIG1lYW5pbmcgdGhhdAotICogIHRoZSBhcmd1bWVudCBjYW4gYmUgb21pdHRlZCBieSB0aGUgY2FsbGVyLgotICogIChUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY3JlYXRpbmcgYSBuZXcgd3JhcHBlciBvdmVybG9hZGluZyB0aGF0Ci0gKiAgcGFzc2VzIHRoZSBhcHByb3ByaWF0ZSBudWxsIHZhbHVlIGluIHBsYWNlIG9mIHRoZSBtaXNzaW5nIGFyZ3VtZW50LikKLSAqICA8cD4KLSAqICBBIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZSBjYW4gYmUgZGVjb3JhdGVkIHdpdGggYSBzcHJlYWQgb3BlcmF0b3IgZigqeCksCi0gKiAgd2hpY2ggbWVhbnMgdGhlIG5hbWUgd2lsbCBiZSBib3VuZCB0byBhIGxpc3Qgb2YgYXJndW1lbnQgdmFsdWVzLgotICogIFRoaXMgc3ByZWFkIGFyZ3VtZW50IG11c3QgYmUgdGhlIGxhc3QgYXJndW1lbnQsIGV4Y2VwdCBwZXJoYXBzIGZvcgotICogIGEgTWFwIGFyZ3VtZW50ICh3aGljaCBtYXkgYWxzbyBiZSBzcHJlYWQpLCBhbmQgZXhjZXB0IHBlcmhhcHMgZm9yCi0gKiAgYSBmaW5hbCBDbG9zdXJlIGFyZ3VtZW50LiAgVGhlIE1hcCBhbmQgQ2xvc3VyZSBwYXJhbWV0ZXJzIG11c3QgYmUKLSAqICBleHBsaWNpdGx5IHR5cGVkLCBpbiBvcmRlciB0byBwcm92aWRlIGEgY2xlYXIgYmFzaXMgZm9yIGRpdmlkaW5nCi0gKiAgaW5jb21pbmcgYXJndW1lbnRzIGludG8gdW5sYWJlbGVkLCBsYWJlbGVkLCBhbmQgY2xvc3VyZSBjYXRlZ29yaWVzLgotICogIDxwPgotICogIEV4YW1wbGVzOgotICogICAgeygqYWwpIHwgYWx9KDAsMSwyKSAgPT09ICBbMCwxLDJdCi0gKiAgICB7KCphbCkgfCBhbH0oMCxhOjEsYjoyKSAgPT09ICBbMCxbYToxLGI6Ml1dCi0gKiAgICB7KCphbCkgfCBhbH0oMCl7c30gID09PSAgWzAse3N9XQotICogICAgeygqYWwsQ2xvc3VyZSBjKSB8IGFsfSgwKXtzfSAgPT09ICBbMF0KLSAqICAgIHsoKmFsLE1hcCBtKSB8IGFsfSgwLGE6MSxiOjIpICA9PT0gIFswXQotICogICAgeygqYWwsTWFwIG0pIHwgbX0oMCkgID09PSAgWzpdCi0gKi8KLXBhcmFtZXRlcklkZW50Ci0gICAgICAgIDogICAoICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgeygqeSl8eX0oMSwyLDMpICA9PT0gIFsxLDIsM10KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwOlNUQVJeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX0FSRyk7fQotICAgICAgICAgICAgICAgIHwgICAvLyBPcHRpb25hbC1udWxsIG9wZXJhdG9yOiAgeyg/eCw/eSl8W3gseV19KDEpICA9PT0gIFsxLG51bGxdCi0gICAgICAgICAgICAgICAgICAgICAgICBvcDpRVUVTVElPTl4gICAgICAgICAgICAgICAgICAgIHsjb3Auc2V0VHlwZShPUFRJT05BTF9BUkcpO30KLSAgICAgICAgICAgICAgICApPwotICAgICAgICAgICAgICAgICggICBJREVOVAotICAgICAgICAgICAgICAgIHwgICAiaXQiICAgICAgICAgICAgICAgIC8vIGFsbG93IGtleXdvcmQgIml0IiwgYnV0IG9ubHkgYXMgYSBtZXRob2Qgb3IgY2xvc3VyZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICApCi0gICAgICAgIDsKLQotLy8gQ29tcG91bmQgc3RhdGVtZW50LiBUaGlzIGlzIHVzZWQgaW4gbWFueSBjb250ZXh0czoKLS8vIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gcHJlZml4ZWQgd2l0aCAic3RhdGljIjoKLS8vIGl0IGlzIGEgY2xhc3MgaW5pdGlhbGl6ZXIKLS8vIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gd2l0aG91dCAic3RhdGljIjoKLS8vIGl0IGlzIGFuIGluc3RhbmNlIGluaXRpYWxpemVyCi0vLyBBcyB0aGUgYm9keSBvZiBhIG1ldGhvZAotLy8gQXMgYSBjb21wbGV0ZWx5IGluZGVwZGVudCBicmFjZWQgYmxvY2sgb2YgY29kZSBpbnNpZGUgYSBtZXRob2QKLS8vIGl0IHN0YXJ0cyBhIG5ldyBzY29wZSBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMKLS8vIEluIEdyb292eSwgdGhpcyBpcyBjYWxsZWQgYW4gIm9wZW4gYmxvY2siLiAgSXQgY2Fubm90IGhhdmUgY2xvc3VyZSBhcmd1bWVudHMuCi0KLWNvbXBvdW5kU3RhdGVtZW50Ci0JOglvcGVuQmxvY2sKLQk7Ci0KLS8qKiBBbiBvcGVuIGJsb2NrIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgY2xvc3VyZSBhcmd1bWVudHMuICovCi1vcGVuQmxvY2sKLSAgICAgICAgOiAgICAgICBsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShTTElTVCk7fSAgIC8vIEFTVCB0eXBlIG9mIFNMSVNUIG1lYW5zICJuZXZlciBnb25uYSBiZSBhIGNsb3N1cmUiCi0gICAgICAgICAgICAgICAgYmxvY2tCb2R5Ci0gICAgICAgICAgICAgICAgUkNVUkxZIQotICAgICAgICA7Ci0KLS8qKiBBIGJsb2NrIGJvZHkgaXMgZWl0aGVyIGEgc2luZ2xlIGV4cHJlc3Npb24sIHdpdGggbm8gYWRkaXRpb25hbCBuZXdsaW5lcyBvciBzZXBhcmF0b3JzLAotICAqIG9yIGVsc2UgdGhlIHVzdWFsIHBhcmFkZSBvZiB6ZXJvIG9yIG1vcmUgc3RhdGVtZW50cy4KLSAgKi8KLWJsb2NrQm9keQotICAgICAgICA6ICAgLy8gQWxsb3cgYWxtb3N0IGFueSBleHByZXNzaW9uLCBhcyBsb25nIGFzIGl0IHN0YW5kcyBjb21wbGV0ZWx5IGFsb25lIGluIHRoZSBibG9jay4KLSAgICAgICAgICAgICAgICAvLyBUaGUgZXhwcmVzc2lvbiBtdXN0IG5vdCBjb250YWluIGxpbmUgYnJlYWtzIG91dHNpZGUgb2YgcGFyZW50aGVzZXMuCi0gICAgICAgICAgICAgICAgLy8gREVDSURFOiBJbGxlZ2FsaXR5IG9mIGxpbmUgYnJlYWtzLiAgRm9yY2VzIGNvZGVycyB0byBwbGFjZSB0aGUgUkNVUkxZIHJpZ2h0IGFmdGVyIHRoZSBleHByZXNzaW9uOiAgezErMX0uCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYWtlcyBleHByZXNzaW9uLWJlYXJpbmcgYmxvY2tzIGxvb2sgbW9yZSBkaXN0aW5jdC4KLSAgICAgICAgICAgICAgICAoYmFsYW5jZWRUb2tlbnNOb1NlcCAoUkNVUkxZIHwgRU9GKSkgPT4gKGFzc2lnbm1lbnRFeHByZXNzaW9uIChSQ1VSTFkgfCBFT0YpKSA9PiBleHByZXNzaW9uTm90Qk9SCi0KLSAgICAgICAgfCAgICAgICAvLyBpbmNsdWRlIHRoZSAocG9zc2libHktZW1wdHkpIGxpc3Qgb2Ygc3RhdGVtZW50cwotICAgICAgICAgICAgICAgIChzdGF0ZW1lbnQpPyAoc2VwISAoc3RhdGVtZW50KT8pKgotICAgICAgICA7Ci0KLS8vIFNwZWNpYWwgcmVzdHJpY3Rpb246ICBMb2dpY2FsIE9SIGV4cHJlc3Npb25zIGNhbm5vdCBvY2N1ciBhdCBzdGF0ZW1lbnQgbGV2ZWwsIG5vdCBldmVuIGFzIHthLi4ufGIuLi59LgotLy8gVGhpcyByZXN0cmljdGlvbiBoZWxwcyBwcm9ncmFtbWVycyBhdm9pZCBpbmFkdmVydGFudGx5IGNyZWF0aW5nIGNsb3N1cmUgYXJndW1lbnRzLgotLy8gTm90ZSBwZXJuaWNpb3VzIGNhc2UgIzE6ICB7aXR8MX0uICBEb2VzIHRoaXMgbWVhbiBzZXQgdGhlIGxvdy1vcmRlciBiaXQgb2YgdGhlIGFyZ3VtZW50LCBvciByZXR1cm4gY29uc3RhbnQgMT8KLS8vIE5vdGUgcGVybmljaW91cyBjYXNlICMyOiAge3h4fDF9LiAgRG9lcyB0aGlzIG1lYW4gYWRkIHRoZSBsb3ctb3JkZXIgYml0IGludG8geHgsIG9yIHJldHVybiBjb25zdGFudCAxPwotLy8gSW4gYm90aCBjYXNlcywgdGhlIGJhciBpcyAiZWFnZXJseSIgdGFrZW4gdG8gYmUgYSBjbG9zdXJlIGFyZ3VtZW50IGRlbGltaXRlci4KLWV4cHJlc3Npb25Ob3RCT1IKLSAgICAgICAgOiAgIGU6ZXhwcmVzc2lvbgotICAgICAgICAgICAgICAgIHtyZXF1aXJlKCNlLmdldFR5cGUoKSAhPSBCT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIGluIGJsb2NrOyBjYW5ub3QgYmUgb2YgdGhlIGZvcm0gYXxiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY2xvc2UgdGhlIGV4cHJlc3Npb24gcGFyZW50aGVzZXMgKGF8YikiKTt9Ci0gICAgICAgIDsKLQotLyoqIEEgYmxvY2sgd2hpY2ggaXMga25vd24gdG8gYmUgYSBjbG9zdXJlLCBldmVuIGlmIGl0IGhhcyBubyBhcHBhcmVudCBhcmd1bWVudHMuCi0gKi8KLWNsb3NlZEJsb2NrCi0gICAgICAgIDogICAgICAgbGM6TENVUkxZXiB7I2xjLnNldFR5cGUoQ0xPU0VEX0JMT0NLKTt9Ci0gICAgICAgICAgICAgICAgKCAoIG5scyBjbG9zdXJlUGFyYW1ldGVyc1N0YXJ0ICkgPT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5scyEgY2xvc3VyZVBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFBhcmFtZXRlcnMgIC8vIGltcGxpY2l0IHtpdHwuLi59IG9yIHs/bm9uYW1lfC4uLn0KLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgYmxvY2tCb2R5Ci0gICAgICAgICAgICAgICAgUkNVUkxZIQotICAgICAgICA7Ci0KLS8qKiBBIGJsb2NrIGluc2lkZSBhbiBleHByZXNzaW9uIGlzIGFzc3VtZWQgdG8gYmUgYSBjbG9zdXJlLCB1bmxlc3MgaXQgaXMgZG91YmxlIGJyYWNlZC4KLSAqICBERUNJREU6IFBST1BPU0FMOiBEb3VibGUgYnJhY2luZyBhbHdheXMgZm9yY2VzIGFuIG9wZW4gYmxvY2suCi0gKiAgVGhpcyBzeW50YXggaXMgdXNlZnVsIGZvciBwYXNzaW5nIG9uIGEgcHJlLWV4aXN0aW5nIGNsb3N1cmUgdG8gYSBjYWxsLCByYXRoZXIgdGhhbiBidWlsZGluZyBhbm90aGVyLgotICogIEV4YW1wbGU6ICA8Y29kZT5kZWYgZm9yRWFjaFR3aWNlKENsb3N1cmUgeSkgeyBmb3JFYWNoe3t5fX07IGZvckVhY2h7e3l9fSB9PC9jb2RlPgotICogIEluIHRoZSBhYnNlbmNlIG9mIGRvdWJsZSBicmFjaW5nLCB0aGUgYmxvY2sgbWF5IGFsd2F5cyBiZSBpbnRlcnByZXRlZCBhcyBhIGNsb3N1cmUsCi0gKiAgZXZlbiB0aG91Z2ggaXRzIHN5bnRhY3RpYyBjb250ZXh0IG1heSByZXF1aXJlIHRoYXQgdGhlIGNsb3N1cmUgYmUgaW1tZWRpYXRlbHkgaW52b2tlZC4KLSAqLwotZXhwcmVzc2lvbkJsb2NrCi0gICAgICAgIDogICAoTENVUkxZIExDVVJMWSBiYWxhbmNlZFRva2VucyBSQ1VSTFkgUkNVUkxZKSA9PgotICAgICAgICAgICAgICAgIExDVVJMWSEgb3BlbkJsb2NrIFJDVVJMWSEKLSAgICAgICAgfCAgIGNsb3NlZEJsb2NrCi0gICAgICAgIDsKLQotLyoqIEFuIGFwcGVuZGVkIGJsb2NrIGZvbGxvd3MgYSBtZXRob2QgbmFtZSBvciBtZXRob2QgYXJndW1lbnQgbGlzdC4KLSAqICBJdCBpcyBvcHRpb25hbGx5IGxhYmVsZWQuICBERUNJREU6ICBBIGdvb2QgcnVsZT8KLSAqLwotYXBwZW5kZWRCbG9jawotICAgICAgICA6Ci0gICAgICAgIC8qCi0gICAgICAgICAgICAoSURFTlQgQ09MT04gbmxzIExDVVJMWSk9PgotICAgICAgICAgICAgICAgIElERU5UIGM6Q09MT05eIHsjYy5zZXRUeXBlKExBQkVMRURfQVJHKTt9IG5scyEKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uQmxvY2sKLSAgICAgICAgfAotICAgICAgICAqLwotICAgICAgICAgICAgICAgIGV4cHJlc3Npb25CbG9jawotICAgICAgICA7Ci0KLS8qKiBBIGJsb2NrIGtub3duIHRvIGJlIGEgY2xvc3VyZSwgYnV0IHdoaWNoIG9taXRzIGl0cyBhcmd1bWVudHMsIGlzIGdpdmVuIHRoaXMgcGxhY2Vob2xkZXIuCi0gKiAgQSBzdWJzZXF1ZW50IHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIGlmIHRoZXJlIGlzIGFuIGltcGxpY2l0ICdpdCcgcGFyYW1ldGVyLAotICogIG9yIGlmIHRoZSBwYXJhbWV0ZXIgbGlzdCBzaG91bGQgYmUgZW1wdHkuCi0gKi8KLWltcGxpY2l0UGFyYW1ldGVycwotICAgICAgICA6ICAgeyAgICNpbXBsaWNpdFBhcmFtZXRlcnMgPSAjKCNbSU1QTElDSVRfUEFSQU1FVEVSUywiSU1QTElDSVRfUEFSQU1FVEVSUyJdKTsgIH0KLSAgICAgICAgOwotCi0vKiogQSBzdWItYmxvY2sgb2YgYSBibG9jayBjYW4gYmUgZWl0aGVyIG9wZW4gb3IgY2xvc2VkLgotICogIEl0IGlzIGNsb3NlZCBpZiBhbmQgb25seSBpZiB0aGVyZSBhcmUgZXhwbGljaXQgY2xvc3VyZSBhcmd1bWVudHMuCi0gKiAgQ29tcGFyZSB0aGlzIHRvIGEgYmxvY2sgd2hpY2ggaXMgYXBwZW5kZWQgdG8gYSBtZXRob2QgY2FsbCwKLSAqICB3aGljaCBpcyBnaXZlbiBjbG9zdXJlIGFyZ3VtZW50cywgZXZlbiBpZiB0aGV5IGFyZSBub3QgZXhwbGljaXQgaW4gdGhlIGNvZGUuCi0gKi8KLW9wZW5PckNsb3NlZEJsb2NrCi0gICAgICAgIDogICAoTENVUkxZIG5scyBjbG9zdXJlUGFyYW1ldGVyc1N0YXJ0ICkgPT4KLSAgICAgICAgICAgICAgICBjbG9zZWRCbG9jawotICAgICAgICB8ICAgICAgIG9wZW5CbG9jawotICAgICAgICA7Ci0KLXN0YXRlbWVudAotCS8vIEEgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIGN1cmx5IGJyYWNlcyAtLSBzdGFydCBhIG5ldyBzY29wZSEKLQkvLyBGcmVlLWZsb2F0aW5nIGJsb2NrcyBtdXN0IGJlIGxhYmVsZWQgb3IgZG91YmxlLWJyYWNlZCwgdG8gZGVmZW5kIGFnYWluc3QgdHlwb3MuCi0gICAgICAgIDogICAgICAgKExDVVJMWSBMQ1VSTFkgYmFsYW5jZWRUb2tlbnMgUkNVUkxZIFJDVVJMWSkgPT4KLSAgICAgICAgICAgICAgICBMQ1VSTFkhIG9wZW5PckNsb3NlZEJsb2NrIFJDVVJMWSEKLSAgICAgICAgfCAgICAgICBjb21wb3VuZFN0YXRlbWVudAotCQl7cmVxdWlyZShmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFtYmlndW91cyBmcmVlLWZsb2F0aW5nIGJsb2NrIGhlYWR7Li4ufSBuZWVkcyBjb250ZXh0IHRvIGRldGVybWluZSBpZiBpdCdzIG9wZW4gb3IgY2xvc2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cnJvdW5kIHsuLi59IHdpdGggZXh0cmEgYnJhY2VzIHt7Li4ufX0gb3IgdXNlIGl0IGFzIGEgY2xvc3VyZSBpbiBhbiBleHByZXNzaW9uIHg9ey4uLn0iKTt9Ci0KLQkvLyBkZWNsYXJhdGlvbnMgYXJlIGFtYmlndW91cyB3aXRoICJJRCBET1QiIHJlbGF0aXZlIHRvIGV4cHJlc3Npb24KLQkvLyBzdGF0ZW1lbnRzLiBNdXN0IGJhY2t0cmFjayB0byBiZSBzdXJlLiBDb3VsZCB1c2UgYSBzZW1hbnRpYwotCS8vIHByZWRpY2F0ZSB0byB0ZXN0IHN5bWJvbCB0YWJsZSB0byBzZWUgd2hhdCB0aGUgdHlwZSB3YXMgY29taW5nCi0JLy8gdXAsIGJ1dCB0aGF0J3MgcHJldHR5IGhhcmQgd2l0aG91dCBhIHN5bWJvbCB0YWJsZSA7KQotCXwJKGRlY2xhcmF0aW9uU3RhcnQpPT4gCi0gICAgICAgICAgICAgICAgZGVjbGFyYXRpb24KLQotCS8vIEFuIGV4cHJlc3Npb24gc3RhdGVtZW50LiBUaGlzIGNvdWxkIGJlIGEgbWV0aG9kIGNhbGwsCi0JLy8gYXNzaWdubWVudCBzdGF0ZW1lbnQsIG9yIGFueSBvdGhlciBleHByZXNzaW9uIGV2YWx1YXRlZCBmb3IKLQkvLyBzaWRlLWVmZmVjdHMuCi0JfAlleHByZXNzaW9uU3RhdGVtZW50IAotCi0JLy9UT0RPOiB3aGF0IGFib3VyIGludGVyZmFjZXMsIGVudW1zIGFuZCBhbm5vdGF0aW9ucwotCS8vIGNsYXNzIGRlZmluaXRpb24KLQl8CShtOm1vZGlmaWVycyEpPyBjbGFzc0RlZmluaXRpb25bI21dCi0KLQkvLyBBdHRhY2ggYSBsYWJlbCB0byB0aGUgZnJvbnQgb2YgYSBzdGF0ZW1lbnQKLSAgICAgICAgLy8gVGhpcyBibG9jayBpcyBleGVjdXRlZCBmb3IgZWZmZWN0LCB1bmxlc3MgaXQgaGFzIGFuIGV4cGxpY2l0IGNsb3N1cmUgYXJndW1lbnQuCi0gICAgICAgIHwgICAgICAgSURFTlQgYzpDT0xPTl4geyNjLnNldFR5cGUoTEFCRUxFRF9TVEFUKTt9Ci0gICAgICAgICAgICAgICAgKCAgIChMQ1VSTFkpID0+IG9wZW5PckNsb3NlZEJsb2NrCi0gICAgICAgICAgICAgICAgfCAgIHN0YXRlbWVudAotICAgICAgICAgICAgICAgICkKLQotCS8vIElmLWVsc2Ugc3RhdGVtZW50Ci0gICAgICAgIC8vIE5vdGU6ICBUaGVyZSBpcyBubyBubHMgbmV4dCB0byBlaXRoZXIgcGFyZW4sIGV2ZW4gdGhvdWdoIGl0IHdvdWxkIGJlIGluY3JlYXNlIGNvbXBhdGliaWxpdHkKLSAgICAgICAgLy8gd2l0aCB2YXJpb3VzIHN0eWxlcyBvZiBKYXZhIGluZGVudGluZy4gIFRoZSAiaWYiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgY29uc3RyYWludHMgb24gd2hpdGUKLSAgICAgICAgLy8gc3BhY2UgYXMgYSBtZXRob2QgY2FsbCBzdGF0ZW1lbnQgbGlrZSAiaWZsaWtlbWV0aG9kIChhcmdzKSB7IGJvZHkgfSIuICBCeSByZXN0cmljdGluZwotICAgICAgICAvLyBuZXdsaW5lcyBpbiBib3RoIGNvbnN0cnVjdHMgaW4gc2ltaWxhciB3YXlzLCB3ZSBtYWtlIEdyb292eSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQsCi0gICAgICAgIC8vIGF0IGEgbWlub3IgY29zdCB0byBjb21wYXRpYmlsaXR5IHdpdGggSmF2YS4KLSAgICAgICAgfCAgICAgICAiaWYiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wYXRpYmxlQm9keVN0YXRlbWVudAotICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTkZMSUNUOiB0aGUgb2xkICJkYW5nbGluZy1lbHNlIiBwcm9ibGVtLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIG1hdGNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYXMgc29vbiBhcyBwb3NzaWJsZS4gIEh1c2ggd2FybmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICAgICAgKHNlcCEpPyAgLy8gYWxsb3cgU0VNSSBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgImVsc2UiISBubHMhIGNvbXBhdGlibGVCb2R5U3RhdGVtZW50Ci0gICAgICAgICAgICAgICAgKT8KLQotCS8vIEZvciBzdGF0ZW1lbnQKLQl8CWZvclN0YXRlbWVudAotCi0JLy8gV2hpbGUgc3RhdGVtZW50Ci0JfAkid2hpbGUiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wYXRpYmxlQm9keVN0YXRlbWVudAotCi0JLypPQlMqIG5vIGRvLXdoaWxlIHN0YXRlbWVudCBpbiBHcm9vdnkgKHRvbyBhbWJpZ3VvdXMpCi0JLy8gZG8td2hpbGUgc3RhdGVtZW50Ci0JfAkiZG8iXiBzdGF0ZW1lbnQgIndoaWxlIiEgTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgU0VNSSEKLQkqT0JTKi8KLQkvLyBXaXRoIHN0YXRlbWVudAotICAgICAgICAvLyAoVGhpcyBpcyB0aGUgR3Jvb3Z5IHNjb3BlLXNoaWZ0IG1lY2hhbmlzbSwgdXNlZCBmb3IgYnVpbGRlcnMuKQotICAgICAgICB8ICAgICAgICJ3aXRoIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgY29tcG91bmRTdGF0ZW1lbnQKLSAgICAgICAgCi0gICAgICAgIC8vIFNwbGljZSBzdGF0ZW1lbnQsIG1lYW5pbmdmdWwgb25seSBpbnNpZGUgYSAid2l0aCIgZXhwcmVzc2lvbi4KLSAgICAgICAgLy8gUFJPUE9TRUQsIERFQ0lERS4gIFByZXZlbnRzIHRoZSBuYW1lc3BhY2UgcG9sbHV0aW9uIG9mIGEgInRleHQiIG1ldGhvZCBvciBzb21lIHN1Y2guCi0gICAgICAgIHwgICBzcDpTVEFSXiBubHMhICAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX0FSRyk7fQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb25TdGF0ZW1lbnQKLSAgICAgICAgLy8gRXhhbXBsZTogIHdpdGgoaHRtbGJ1aWxkZXIpIHsgaGVhZHt9IGJvZHl7ICoic29tZSB0ZXh0IiB9IH0KLSAgICAgICAgLy8gRXF1aXZhbGVudCB0bzogIHsgaHRtbGJ1aWxkZXIuaGVhZHt9IGh0bWxidWlsZGVyLmJvZHl7IChodG1sYnVpbGRlciBhcyBDb2xsZWN0aW9uKS5hZGQoInNvbWUgdGV4dCIpIH0gfQotCi0gICAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQuICBDYW4gYmUgdXNlZCBpbiBhbnkgc2NvcGUuICBIYXMgImltcG9ydCB4IGFzIHkiIGFsc28uCi0gICAgICAgIHwgICBpbXBvcnRTdGF0ZW1lbnQKLQotCS8vIHN3aXRjaC9jYXNlIHN0YXRlbWVudAotCXwJInN3aXRjaCJeIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIExDVVJMWSEKLQkJCSggY2FzZXNHcm91cCApKgotCQlSQ1VSTFkhCi0KLQkvLyBleGNlcHRpb24gdHJ5LWNhdGNoIGJsb2NrCi0JfAl0cnlCbG9jawotCi0JLy8gc3luY2hyb25pemUgYSBzdGF0ZW1lbnQKLQl8CSJzeW5jaHJvbml6ZWQiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAotCi0KLQkvKk9CUyoKLQkvLyBlbXB0eSBzdGF0ZW1lbnQKLQl8CXM6U0VNSSB7I3Muc2V0VHlwZShFTVBUWV9TVEFUKTt9Ci0JKk9CUyovCi0KLQkvLyBOT1RFOiBzb21lIGFsdGVybmF0aW9ucyBoYXZlIGJlZW4gbW92ZWQgdG8gJ2JyYW5jaEV4cHJlc3Npb24nCi0JOwotCi1mb3JTdGF0ZW1lbnQKLQk6CWY6ImZvciJeCi0JCUxQQVJFTiEKLQkJCSgJKGZvckluaXQgU0VNSSk9PnRyYWRpdGlvbmFsRm9yQ2xhdXNlCi0JCQkvLyAqT0JTKiAKLQkJCS8vIFRoZXJlJ3Mgbm8gbmVlZCBhdCBhbGwgZm9yIHNxdWVlemluZyBpbiB0aGUgbmV3IEphdmEgNSAiZm9yIgotICAvLyBzeW50YXgsIHNpbmNlIEdyb292eSdzIGlzIGEgc3VpdGFibGUgYWx0ZXJuYXRpdmUuCi0JCSAvLyB8CShwYXJhbWV0ZXJEZWNsYXJhdGlvbiBDT0xPTik9PiBmb3JFYWNoQ2xhdXNlCi0JICAvLyAqT0JTKgotCQkJfCAgICAgICAvLyB0aGUgY29hc3QgaXMgY2xlYXI7IGl0J3MgYSBtb2Rlcm4gR3Jvb3Z5IGZvciBzdGF0ZW1lbnQKLQkJCQlmb3JJbkNsYXVzZQotCQkJKQotCQlSUEFSRU4hCi0JCWNvbXBhdGlibGVCb2R5U3RhdGVtZW50CQkJCQkgLy8gc3RhdGVtZW50IHRvIGxvb3Agb3ZlcgotCTsKLQotdHJhZGl0aW9uYWxGb3JDbGF1c2UKLQk6Ci0JCWZvckluaXQgU0VNSSEJLy8gaW5pdGlhbGl6ZXIKLQkJZm9yQ29uZCBTRU1JIQkvLyBjb25kaXRpb24gdGVzdAotCQlmb3JJdGVyCQkJLy8gdXBkYXRlcgotCTsKLQotLypPQlMqCi1mb3JFYWNoQ2xhdXNlCi0JOgotCQlwOnBhcmFtZXRlckRlY2xhcmF0aW9uIENPTE9OISBleHByZXNzaW9uCi0JCXsjZm9yRWFjaENsYXVzZSA9ICMoI1tGT1JfRUFDSF9DTEFVU0UsIkZPUl9FQUNIX0NMQVVTRSJdLCAjZm9yRWFjaENsYXVzZSk7fQotCTsKLSpPQlMqLwotCi1mb3JJbkNsYXVzZQotICAgICAgICA6ICAgICAgICggICAoZGVjbGFyYXRpb25TdGFydCk9PgotICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQKLSAgICAgICAgICAgICAgICB8ICAgSURFTlQKLSAgICAgICAgICAgICAgICB8ICAgIml0IgotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBpOiJpbiJeICAgICAgICAgeyNpLnNldFR5cGUoRk9SX0lOX0lURVJBQkxFKTt9Ci0gICAgICAgICAgICAgICAgc2hpZnRFeHByZXNzaW9uCi0gICAgICAgIDsKLQotLyoqIEluIEphdmEsICJpZiIsICJ3aGlsZSIsIGFuZCAiZm9yIiBzdGF0ZW1lbnRzIGNhbiB0YWtlIHJhbmRvbSwgbm9uLWJyYWNlZCBzdGF0ZW1lbnRzIGFzIHRoZWlyIGJvZGllcy4KLSAqICBTdXBwb3J0IHRoaXMgcHJhY3RpY2UsIGV2ZW4gdGhvdWdoIGl0IGlzbid0IHZlcnkgR3Jvb3Z5LgotICovCi1jb21wYXRpYmxlQm9keVN0YXRlbWVudAotICAgICAgICA6ICAgKExDVVJMWSk9PgotICAgICAgICAgICAgICAgIGNvbXBvdW5kU3RhdGVtZW50Ci0gICAgICAgIHwKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQKLSAgICAgICAgOwotCi0vKiBUT0RPIC0gUVVFU1RJT04gLSB3aHkgZG8gd2UgdXNlICdhc3NpZ25tZW50RXhwcmVzc2lvbicgaW5zdGVhZCBvZiAnZXhwcmVzc2lvbicgaW5zaWRlIGVhY2ggYnJhbmNoRXhwcmVzc2lvbiBwcm9kdWN0aW9uICovCi0vKiogSW4gR3Jvb3Z5LCByZXR1cm4sIGJyZWFrLCBjb250aW51ZSwgdGhyb3csIGFuZCBhc3NlcnQgY2FuIGJlIHVzZWQgaW4gYW55IGV4cHJlc3Npb24gY29udGV4dC4KLSAqICBFeGFtcGxlOiAgcHJpbnRsbiAoeCB8fCByZXR1cm4pOyAgcHJpbnRsbiBhc3NlcnQgeCwgIndvbid0IHByaW50IGEgZmFsc2UgdmFsdWUhIgotICogIElmIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbWlzc2luZywgaXRzIHZhbHVlIGlzIHZvaWQgKHRoaXMgY29lcmNlcyB0byBudWxsIHdoZW4gYSB2YWx1ZSBpcyByZXF1aXJlZCkuCi0gKi8KLWJyYW5jaEV4cHJlc3Npb24KLSAgICAgICAgOgotICAgICAgICAvLyBSZXR1cm4gYW4gZXhwcmVzc2lvbgotICAgICAgICAgICAgICAgICJyZXR1cm4iXiAoYXNzaWdubWVudEV4cHJlc3Npb24pPwotCi0gICAgICAgIC8vIGJyZWFrOiAgZ2V0IG91dCBvZiBhIGxvb3AsIG9yIHN3aXRjaCwgb3IgbWV0aG9kIGNhbGwKLSAgICAgICAgLy8gY29udGludWU6ICBkbyBuZXh0IGl0ZXJhdGlvbiBvZiBhIGxvb3AsIG9yIGxlYXZlIGEgY2xvc3VyZQotICAgICAgICB8ICAgICAgICgiYnJlYWsiXiB8ICJjb250aW51ZSJeKQotICAgICAgICAgICAgICAgICggICBJREVOVAotICAgICAgICAgICAgICAgICAgICAgICAgKCAgIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPTiEgYXNzaWdubWVudEV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgICk/Ci0gICAgICAgICAgICAgICAgKT8KLQotICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgfCAgICAgICAidGhyb3ciXiBhc3NpZ25tZW50RXhwcmVzc2lvbiEKLQotCi0JLy8gVE9ETyAtIGRlY2lkZSBvbiBkZWZpbml0aXZlICdhc3NlcnQnIHN0YXRlbWVudCBpbiBncm9vdnkgKDEuNCBhbmR8b3IgZ3Jvb3Z5KQotCS8vIGFzc2VydHMKLQkvLyAxLjQrIC4uLgotCS8vICAgICAgfAkiYXNzZXJ0Il4gZXhwcmVzc2lvbiAoIENPTE9OISBleHByZXNzaW9uICk/Ci0JCi0JLy8gZ3Jvb3Z5IGFzc2VydGlvbi4uLgotICAgICAgICB8ICAgICAgICJhc3NlcnQiXiBhc3NpZ25tZW50RXhwcmVzc2lvbgotICAgICAgICAgICAgICAgICggICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BISBhc3NpZ25tZW50RXhwcmVzc2lvbgotICAgICAgICAgICAgICAgICk/Ci0JCi0KLSAgICAgICAgLy8gTm90ZTogIFRoZSBjb2xvbiBpcyB0b28gc3BlY2lhbCBpbiBHcm9vdnk7IHdlIG1vZGlmeSB0aGUgRk9SIGFuZCBBU1NFUlQgc3ludGF4IHRvIGRpc3BlbnNlIHdpdGggaXQuCi0gICAgICAgIDsKLQotCi0vKiogQW55IHN0YXRlbWVudCB3aGljaCBiZWdpbnMgd2l0aCBhbiBleHByZXNzaW9uLCBjYWxsZWQgdGhlICJoZWFkIi4KLSAqICBUaGUgaGVhZCBjYW4gYmUgZm9sbG93ZWQgYnkgY29tbWFuZCBhcmd1bWVudHM6ICB7eC55IGEsYn0sIHt4W3ldIGEsYn0sIGV2ZW4ge2YoeCkgeX0uCi0gKiAgT3IsIHRoZSBoZWFkIGNhbiBiZSBmb2xsb3dlZCBieSBhbiBhc3NpZ25tZW50IG9wZXJhdG9yOiAge3gueSA9IHp9LCB7eC55W2FdICsrfSwge3gueShhKSArPSB6fSwgZXRjLgotICogIFRvIGNhdGNoIHNpbXBsZSBlcnJvcnMsIGV4cHJlc3Npb25zIGF0IHN0YXRlbWVudCBsZXZlbCBoYXZlIGEgbGltaXRlZCBzZXQgb2Ygc3ludGF4ZXMuCi0gKiAgRm9yIGV4YW1wbGUsIHtwcmludCB4OyAreX0gaXMgYSBzeW50YXggZXJyb3IuICAoSmF2YSBkb2VzIHRoaXMgdHJpY2sgYWxzby4pCi0gKiAgSWYgeW91IHJlYWxseSB3YW50IHNvbWV0aGluZyB3ZWlyZCwgd3JhcCBpdCBpbiBwYXJlbnRoZXNlcyBvciBjdXJseSBicmFjZXMuCi0gKi8KLS8vICBpZChhKSwgeC5pZChhKSwgKHgpLmlkKGEpLCBldGMuOyBpZHsuLi59LCB4Lmlkey4uLn0sICh4KS5pZHsuLi59LCBldGMuCi1leHByZXNzaW9uU3RhdGVtZW50Ci0gICAgICAgICAgICAgICAgeyBib29sZWFuIGVuZEJyYWNrZXRzID0gZmFsc2U7IH0KLSAgICAgICAgOiAgIGVuZEJyYWNrZXRzPQotICAgICAgICAgICAgICAgIGhlYWQ6cGF0aEV4cHJlc3Npb24hCi0gICAgICAgICAgICAgICAgKCAgICAgICB7IWVuZEJyYWNrZXRzfT8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcmd1bWVudHNbI2hlYWRdCi0gICAgICAgICAgICAgICAgfCAgIGFzc2lnbm1lbnRUYWlsWyNoZWFkXQotICAgICAgICAgICAgICAgIHwgICB7I2V4cHJlc3Npb25TdGF0ZW1lbnQgPSAjaGVhZDt9ICAvLyBubyBjb21tYW5kIGFyZ3VtZW50cwotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICB7ICAgLy8gRG8gYW4gZXJyb3IgY2hlY2sgb24gdGhlIGZvbGxvd2luZyB0b2tlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoTEEoMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkNVUkxZOiBjYXNlIFJCUkFDSzogY2FzZSBSUEFSRU46IGNhc2UgU0VNSTogY2FzZSBOTFM6IGNhc2UgRU9GOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBmb2xsb3dlZCBieSBnYXJiYWdlIGluIGYuLi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudGhlc2l6ZSBjb3JyZWN0IGFyZ3VtZW50IGxpc3QgZiguLi4pIG9yIHdob2xlIGV4cHJlc3Npb24gKGYoKS4uLikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIHwKLSAgICAgICAgICAgICAgICAvLyBQcmVmaXggaW5jcmVtZW50OyBhIHNwZWNpYWwgY2FzZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAoSU5DXiB8IERFQ14pIGVuZEJyYWNrZXRzPXBhdGhFeHByZXNzaW9uCi0gICAgICAgIHwKLSAgICAgICAgICAgICAgICBicmFuY2hFeHByZXNzaW9uCi0gICAgICAgIDsKLQotY2FzZXNHcm91cAotCToJKAkvLyBDT05GTElDVDogdG8gd2hpY2ggY2FzZSBncm91cCBkbyB0aGUgc3RhdGVtZW50cyBiaW5kPwotCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlOiBpdCBncm91cHMgdGhlCi0JCQkvLyBtYW55ICJjYXNlIi8iZGVmYXVsdCIgbGFiZWxzIHRvZ2V0aGVyIHRoZW4KLQkJCS8vIGZvbGxvd3MgdGhlbSB3aXRoIHRoZSBzdGF0ZW1lbnRzCi0JCQlvcHRpb25zIHsKLQkJCQlncmVlZHkgPSB0cnVlOwotCQkJfQotCQkJOgotCQkJYUNhc2UKLQkJKSsKLQkJY2FzZVNMaXN0Ci0JCXsjY2FzZXNHcm91cCA9ICMoW0NBU0VfR1JPVVAsICJDQVNFX0dST1VQIl0sICNjYXNlc0dyb3VwKTt9Ci0JOwotCi1hQ2FzZQotCToJKCJjYXNlIl4gZXhwcmVzc2lvbiB8ICJkZWZhdWx0IikgQ09MT04hIG5scyEKLQk7Ci0KLWNhc2VTTGlzdAotCToJc3RhdGVtZW50IChzZXAhIChzdGF0ZW1lbnQpPykqCi0JCXsjY2FzZVNMaXN0ID0gIygjW1NMSVNULCJTTElTVCJdLCNjYXNlU0xpc3QpO30KLQk7Ci0KLS8vIFRoZSBpbml0aWFsaXplciBmb3IgYSBmb3IgbG9vcAotLy8gVGhlIGNvbnRyb2xFeHByZXNzaW9uTGlzdCBwcm9kdWN0aW9uIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBhcyBhIHBvc3NpYmlsaXR5Ci1mb3JJbml0Ci0gICAgICAgIDogICAgICAgKGNvbnRyb2xFeHByZXNzaW9uTGlzdCk/Ci0gICAgICAgICAgICAgICAgeyNmb3JJbml0ID0gIygjW0ZPUl9JTklULCJGT1JfSU5JVCJdLCNmb3JJbml0KTt9Ci0gICAgICAgIDsKLQotZm9yQ29uZAotCToJKGV4cHJlc3Npb24pPwotCQl7I2ZvckNvbmQgPSAjKCNbRk9SX0NPTkRJVElPTiwiRk9SX0NPTkRJVElPTiJdLCNmb3JDb25kKTt9Ci0JOwotCi1mb3JJdGVyCi0JOgkoY29udHJvbEV4cHJlc3Npb25MaXN0KT8KLQkJeyNmb3JJdGVyID0gIygjW0ZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIl0sI2Zvckl0ZXIpO30KLQk7Ci0KLS8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawotdHJ5QmxvY2sKLSAgICAgICAgOiAgICAgICAidHJ5Il4gY29tcG91bmRTdGF0ZW1lbnQKLSAgICAgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiAgbmxzISBoYW5kbGVyKSoKLSAgICAgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiAgbmxzISBmaW5hbGx5Q2xhdXNlKT8KLSAgICAgICAgOwotCi1maW5hbGx5Q2xhdXNlCi0JOgkiZmluYWxseSJeIGNvbXBvdW5kU3RhdGVtZW50Ci0JOwotCi0vLyBhbiBleGNlcHRpb24gaGFuZGxlcgotaGFuZGxlcgotCToJImNhdGNoIl4gTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiBSUEFSRU4hIGNvbXBvdW5kU3RhdGVtZW50Ci0JOwotCi0KLWFzc2lnbm1lbnRUYWlsW0FTVCBoZWFkXQotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgeyNhc3NpZ25tZW50VGFpbCA9IGhlYWQ7fQotICAgICAgICAgICAgICAgICggICBBU1NJR05eCi0gICAgICAgICAgICAgICAgfCAgIFBMVVNfQVNTSUdOXgotICAgICAgICAgICAgICAgIHwgICBNSU5VU19BU1NJR05eCi0gICAgICAgICAgICAgICAgfCAgIFNUQVJfQVNTSUdOXgotICAgICAgICAgICAgICAgIHwgICBESVZfQVNTSUdOXgotICAgICAgICAgICAgICAgIHwgICBNT0RfQVNTSUdOXgotICAgICAgICAgICAgICAgIHwgICBTUl9BU1NJR05eCi0gICAgICAgICAgICAgICAgfCAgIEJTUl9BU1NJR05eCi0gICAgICAgICAgICAgICAgfCAgIFNMX0FTU0lHTl4KLSAgICAgICAgICAgICAgICB8ICAgQkFORF9BU1NJR05eCi0gICAgICAgICAgICAgICAgfCAgIEJYT1JfQVNTSUdOXgotICAgICAgICAgICAgICAgIHwgICBCT1JfQVNTSUdOXgotICAgICAgICAgICAgICAgIC8vfCAgIFVTRVJPUF8xM14gIC8vREVDSURFOiBUaGlzIGlzIGhvdyB1c2VyLWRlZmluZSBvcHMgd291bGQgc2hvdyB1cC4KLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgbmxzIQotICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRFeHByZXNzaW9uCi0gICAgICAgIHwKLSAgICAgICAgICAgICAgICB7I2Fzc2lnbm1lbnRUYWlsID0gaGVhZDt9Ci0gICAgICAgICAgICAgICAgaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KLSAgICAgICAgfAotICAgICAgICAgICAgICAgIHsjYXNzaWdubWVudFRhaWwgPSBoZWFkO30KLSAgICAgICAgICAgICAgICBkZTpERUNeIHsjZGUuc2V0VHlwZShQT1NUX0RFQyk7fQotICAgICAgICA7Ci0KLS8qKiBBIG1lbWJlciBuYW1lICh4LnkpIG9yIGVsZW1lbnQgbmFtZSAoeFt5XSkgY2FuIHNlcnZlIGFzIGEgY29tbWFuZCBuYW1lLAotICogIHdoaWNoIG1heSBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgYXJndW1lbnRzLgotICovCi1jb21tYW5kQXJndW1lbnRzW0FTVCBoZWFkXQotICAgICAgICA6ICAgeyAgICNjb21tYW5kQXJndW1lbnRzID0gaGVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoTEEoMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUExVUzogY2FzZSBNSU5VUzogY2FzZSBJTkM6IGNhc2UgREVDOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSOiBjYXNlIERJVjogY2FzZSBNT0Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNSOiBjYXNlIEJTUjogY2FzZSBTTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkFORDogY2FzZSBCWE9SOiBjYXNlIEJPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhcmJhZ2UgaW5maXggb3IgcHJlZml4IG9wZXJhdG9yIGFmdGVyIGNvbW1hbmQgbmFtZSBmICt4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50aGVzaXplIGVpdGhlciB0aGUgd2hvbGUgZXhwcmVzc2lvbiAoZit4KSBvciB0aGUgY29tbWFuZCBhcmd1bWVudHMgZigreCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiAob3B0aW9ucyB7IGdyZWVkeT10cnVlOyB9IDogQ09NTUEhIG5scyEgZXhwcmVzc2lvbikqCi0gICAgICAgICAgICAgICAgLy8gcHJpbnRsbiAyKzIgLy9CQUQKLSAgICAgICAgICAgICAgICAvLyBwcmludGxuKDIrMikgLy9PSwotICAgICAgICAgICAgICAgIC8vIHByaW50bG4gKDIpKzIgLy9CQUQKLSAgICAgICAgICAgICAgICAvLyBwcmludGxuKCgyKSsyKSAvL09LCi0gICAgICAgICAgICAgICAgLy8gKHByaW50bG4oMikrMikgLy9PSwotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgKDIpLCAyIC8vQkFECi0gICAgICAgICAgICAgICAgLy8gY29tcGFyZSggKDIpLCAyICkgLy9PSwotICAgICAgICAgICAgICAgIC8vIGZvby5iYXIgYmF6e2JhdH0sIGJhbmd7Ym96fSAvL09LPyEKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1QgaGVhZGlkID0gZ2V0QVNURmFjdG9yeSgpLmR1cCgjaGVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaWQuc2V0VHlwZShNRVRIT0RfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaWQuc2V0VGV4dCgiPGNvbW1hbmQ+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAjY29tbWFuZEFyZ3VtZW50cyA9ICMoaGVhZGlkLCAjY29tbWFuZEFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICA7Ci0KLWFzc2lnbm1lbnRPcAotICAgICAgICA6Ci0gICAgICAgICggICBBU1NJR05eCi0gICAgICAgIHwgICBQTFVTX0FTU0lHTl4KLSAgICAgICAgfCAgIE1JTlVTX0FTU0lHTl4KLSAgICAgICAgfCAgIFNUQVJfQVNTSUdOXgotICAgICAgICB8ICAgRElWX0FTU0lHTl4KLSAgICAgICAgfCAgIE1PRF9BU1NJR05eCi0gICAgICAgIHwgICBTUl9BU1NJR05eCi0gICAgICAgIHwgICBCU1JfQVNTSUdOXgotICAgICAgICB8ICAgU0xfQVNTSUdOXgotICAgICAgICB8ICAgQkFORF9BU1NJR05eCi0gICAgICAgIHwgICBCWE9SX0FTU0lHTl4KLSAgICAgICAgfCAgIEJPUl9BU1NJR05eCi0gICAgICAgICkKLSAgICAgICAgOwotCi0vLyBleHByZXNzaW9ucwotLy8gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlc2UgZXhwcmVzc2lvbnMgZm9sbG93IHRoZSBwYXR0ZXJuCi0vLyAgIHRoaXNMZXZlbEV4cHJlc3Npb24gOgotLy8JICAgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uCi0vLwkJICAgKE9QRVJBVE9SIG5leHRIaWdoZXJQcmVjZWRlbmNlRXhwcmVzc2lvbikqCi0vLyB3aGljaCBpcyBhIHN0YW5kYXJkIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBhIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KLS8vIFRoZSBvcGVyYXRvcnMgaW4gamF2YSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZXM6Ci0vLwlsb3dlc3QgICgxMykgID0gKj0gLz0gJT0gKz0gLT0gPDw9ID4+PSA+Pj49ICY9IF49IHw9Ci0vLwkJCSgxMikgID86Ci0vLwkJCSgxMSkgIHx8Ci0vLwkJCSgxMCkgICYmCi0vLwkJCSggOSkgIHwKLS8vCQkJKCA4KSAgXgotLy8JCQkoIDcpICAmCi0vLwkJCSggNikgID09ICE9Ci0vLwkJCSggNSkgIDwgPD0gPiA+PQotLy8JCQkoIDQpICA8PCA+PgotLy8JCQkoIDMpICArKGJpbmFyeSkgLShiaW5hcnkpCi0vLwkJCSggMikgICogLyAlCi0vLwkJCSggMSkgICsrIC0tICsodW5hcnkpIC0odW5hcnkpICB+ICAhICAodHlwZSkKLS8vCQkJCSAgW10gICAoKSAobWV0aG9kIGNhbGwpICAuIChkb3QgLS0gaWRlbnRpZmllciBxdWFsaWZpY2F0aW9uKQotLy8JCQkJICBuZXcgICAoKSAgKGV4cGxpY2l0IHBhcmVudGhlc2lzKQotLy8KLS8vIHRoZSBsYXN0IHR3byBhcmUgbm90IHVzdWFsbHkgb24gYSBwcmVjZWRlbmNlIGNoYXJ0OyBJIHB1dCB0aGVtIGluCi0vLyB0byBwb2ludCBvdXQgdGhhdCBuZXcgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiAnLicsIHNvIHlvdQotLy8gY2FuIHZhbGlkeSB1c2UKLS8vCSBuZXcgRnJhbWUoKS5zaG93KCkKLS8vCi0vLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHByZWNlZGVuY2UgbGV2ZWxzIG1hcCB0byB0aGUgcnVsZXMgYmVsb3cuLi4KLS8vIE9uY2UgeW91IGhhdmUgYSBwcmVjZWRlbmNlIGNoYXJ0LCB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBydWxlcyBhcyBiZWxvdwotLy8gICBpcyB1c3VhbGx5IHZlcnkgc3RyYWlnaHRmb3dhcmQKLQotCi0KLS8vIHRoZSBtb3RoZXIgb2YgYWxsIGV4cHJlc3Npb25zCi0vLyBUaGlzIG5vbnRlcm1pbmFsIGlzIG5vdCB1c2VkIGZvciBleHByZXNzaW9uIHN0YXRlbWVudHMsIHdoaWNoIGhhdmUgYSBtb3JlIHJlc3RyaWN0ZWQgc3ludGF4Ci0vLyBkdWUgdG8gcG9zc2libGUgYW1iaWd1aXRpZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzdGF0ZW1lbnRzLiAgVGhpcyBub250ZXJtaW5hbCBpcyB1c2VkIG9ubHkKLS8vIGluIGNvbnRleHRzIHdoZXJlIHdlIGtub3cgd2UgaGF2ZSBhbiBleHByZXNzaW9uLiAgSXQgYWxsb3dzIGdlbmVyYWwgSmF2YS10eXBlIGV4cHJlc3Npb25zLgotZXhwcmVzc2lvbgotICAgICAgICA6ICAgKGRlY2xhcmF0aW9uU3RhcnQpPT4gc2luZ2xlRGVjbGFyYXRpb24KLSAgICAgICAgfCAgIGJyYW5jaEV4cHJlc3Npb24KLSAgICAgICAgfCAgICAgICBhc3NpZ25tZW50RXhwcmVzc2lvbgotICAgICAgICAgICAgICAgIHsjZXhwcmVzc2lvbiA9ICMoI1tFWFBSLCJFWFBSIl0sI2V4cHJlc3Npb24pO30KLSAgICAgICAgOwotLy8gVGhpcyBpcyBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCi1jb250cm9sRXhwcmVzc2lvbkxpc3QKLSAgICAgICAgOiAgICAgICBjb250cm9sRXhwcmVzc2lvbiAoQ09NTUEhIG5scyEgY29udHJvbEV4cHJlc3Npb24pKgotICAgICAgICAgICAgICAgIHsjY29udHJvbEV4cHJlc3Npb25MaXN0ID0gIygjW0VMSVNULCJFTElTVCJdLCBjb250cm9sRXhwcmVzc2lvbkxpc3QpO30KLSAgICAgICAgOwotCi0vKiogVXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaW4gYSBmZXcgcGxhY2VzIHdoZXJlCi0gKiAgSmF2YSBleHByZXNpb24gc3RhdGVtZW50cyBhbmQgZGVjbGFyYXRpb25zIGFyZSByZXF1aXJlZC4KLSAqLwotY29udHJvbEV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICB7Ym9vbGVhbiB6ejsgLyppZ25vcmUqLyB9Ci0gICAgICAgIDogICAgICAgLy8gaWYgaXQgbG9va3MgbGlrZSBhIGRlY2xhcmF0aW9uLCBpdCBpcwotICAgICAgICAgICAgICAgIChkZWNsYXJhdGlvblN0YXJ0KT0+IHNpbmdsZURlY2xhcmF0aW9uCi0gICAgICAgIHwgICAvLyBvdGhlcndpc2UgaXQncyBhIHBsYWluIHN0YXRlbWVudCBleHByZXNzaW9uCi0gICAgICAgICAgICAgICAgeno9aGVhZDpwYXRoRXhwcmVzc2lvbiEKLSAgICAgICAgICAgICAgICAoICAgICAgIGFzc2lnbm1lbnRUYWlsWyNoZWFkXQotICAgICAgICAgICAgICAgIHwgICB7I2NvbnRyb2xFeHByZXNzaW9uID0gI2hlYWQ7fSAgLy8gbm8gY29tbWFuZCBzeW50YXggaW4gdGhpcyBjb250ZXh0Ci0gICAgICAgICAgICAgICAgKQotICAgICAgICB8Ci0gICAgICAgICAgICAgICAgLy8gUHJlZml4IGluY3JlbWVudDsgYSBzcGVjaWFsIGNhc2Ugb2YgYXNzaWdubWVudCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgKElOQ14gfCBERUNeKSB6ej1wYXRoRXhwcmVzc2lvbgotICAgICAgICA7Ci0KLS8qKiBBICJwYXRoIGV4cHJlc3Npb24iIGlzIGEgbmFtZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdmFsdWUsIGFzc2lnbmVkIHRvLCBvciBjYWxsZWQuCi0gKiAgVXNlcyBpbmNsdWRlIGFzc2lnbm1lbnQgdGFyZ2V0cywgY29tbWFuZHMsIGFuZCB0eXBlcyBpbiBkZWNsYXJhdGlvbnMuCi0gKiAgSXQgaXMgY2FsbGVkIGEgInBhdGgiIGJlY2F1c2UgaXQgbG9va3MgbGlrZSBhIGxpbmVhciBwYXRoIHRocm91Z2ggYSBkYXRhIHN0cnVjdHVyZS4KLSAqICBFeGFtcGxlOiAgYS5iW25dLmMoeCkuZHtzfQotICogIChDb21wYXJlIHRvIGEgQyBsdmFsdWUsIG9yIExlZnRIYW5kU2lkZSBpbiB0aGUgSkxTIHNlY3Rpb24gMTUuMjYuKQotICogIEdlbmVyYWwgZXhwcmVzc2lvbnMgYXJlIGJ1aWx0IHVwIGZyb20gcGF0aCBleHByZXNzaW9ucywgdXNpbmcgb3BlcmF0b3JzIGxpa2UgJysnIGFuZCAnPScuCi0gKiAgTm90ZTogIEEgcGF0aCBleHByZXNzaW9uIGNhbm5vdCBiZWdpbiB3aXRoIGEgYmxvY2sgb3IgY2xvc3VyZS4KLSAqLwotcGF0aEV4cHJlc3Npb24KLXJldHVybnMgW2Jvb2xlYW4gZW5kQnJhY2tldHMgPSBmYWxzZV0KLSAgICAgICAgOiAgIHBlOnByaW1hcnlFeHByZXNzaW9uIQotICAgICAgICAgICAgICAgIGVuZEJyYWNrZXRzPQotICAgICAgICAgICAgICAgIHBhdGhFeHByZXNzaW9uVGFpbFsjcGVdCi0gICAgICAgIDsKLQotcGF0aEV4cHJlc3Npb25UYWlsW0FTVCByZXN1bHRdCi1yZXR1cm5zIFtib29sZWFuIGVuZEJyYWNrZXRzID0gZmFsc2VdCi0gICAgICAgIDoKLSAgICAgICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjYW4gdGhlbiBiZSBmb2xsb3dlZCBieSBhIGNoYWluIG9mIC5pZCwgKGEpLCBbYV0sIGFuZCB7Li4ufQotICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgb2YgdGhpcyBjaGFpbiBpcyBncmVlZHkuICBGb3IgZXhhbXBsZSwgYSBwYXRoRXhwcmVzc2lvbiBtYXkgYmUgYSBjb21tYW5kIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2VkIGJ5IGEgY29tbWFuZCBhcmd1bWVudCwgYnV0IHRoYXQgY29tbWFuZCBhcmd1bWVudCBjYW5ub3QgYmVnaW4gd2l0aCBhbiBMUEFSRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBpcyBncmVlZGlseSBhdHRhY2hlZCB0byB0aGUgcGF0aEV4cHJlc3Npb24gYXMgYSBtZXRob2QgYXJndW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kQnJhY2tldHM9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZTpwYXRoRWxlbWVudFtyZXN1bHRdIQotICAgICAgICAgICAgICAgICAgICAgICAgeyByZXN1bHQgPSAjcGU7IH0KLSAgICAgICAgICAgICAgICApKgotICAgICAgICAgICAgICAgIHsgICAjcGF0aEV4cHJlc3Npb25UYWlsID0gcmVzdWx0OyAgfQotICAgICAgICA7Ci0KLXBhdGhFeHByZXNzaW9uRnJvbUJyYWNrZXRzCi0gICAgICAgICAgICAgICAge2Jvb2xlYW4geno7IC8qaWdub3JlKi8gfQotICAgICAgICA6ICAgcGU6ZXhwcmVzc2lvbkJsb2NrIQotICAgICAgICAgICAgICAgIHp6PXBhdGhFeHByZXNzaW9uVGFpbFsjcGVdCi0gICAgICAgIHwgICBwZTI6bGlzdE9yTWFwQ29uc3RydWN0b3JFeHByZXNzaW9uIQotICAgICAgICAgICAgICAgIHp6PXBhdGhFeHByZXNzaW9uVGFpbFsjcGUyXQotICAgICAgICA7Ci0KLXBhdGhFbGVtZW50W0FTVCBwcmVmaXhdCi1yZXR1cm5zIFtib29sZWFuIGVuZEJyYWNrZXRzID0gZmFsc2VdCi0gICAgICAgICAgICAgICAge2Jvb2xlYW4geno7IC8qaWdub3JlKi8gfQotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgeyAgICNwYXRoRWxlbWVudCA9IHByZWZpeDsgIH0KLSAgICAgICAgICAgICAgICAvLyBTdHVmZiB3aGljaCBjYW4gcHJlY2VkZSBhIERPVDoKLSAgICAgICAgICAgICAgICAoICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgeCoueSAgPT09ICB4Py5jb2xsZWN0e2l0Lnl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDpTVEFSXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNzcC5zZXRUeXBlKFNQUkVBRF9BUkcpO30KLSAgICAgICAgICAgICAgICB8ICAgLy8gT3B0aW9uYWwtbnVsbCBvcGVyYXRvcjogIHg/LnkgID09PSAoeD09bnVsbCk/bnVsbDp4LnkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wOlFVRVNUSU9OXiAgICAgICAgICAgICAgICAgICAgeyNvcC5zZXRUeXBlKE9QVElPTkFMX0FSRyk7fQotICAgICAgICAgICAgICAgICk/Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGFsbC1wb3dlcmZ1bCBkb3QuCi0gICAgICAgICAgICAgICAgRE9UXiBubHMhIG5hbWVQYXJ0Ci0gICAgICAgICAgICAgICAgeyAgIGVuZEJyYWNrZXRzID0gZmFsc2U7IH0KLSAgICAgICAgfAotICAgICAgICAgICAgICAgIG1jYTptZXRob2RDYWxsQXJnc1twcmVmaXhdCi0gICAgICAgICAgICAgICAgeyAgICNwYXRoRWxlbWVudCA9ICNtY2E7IGVuZEJyYWNrZXRzID0gdHJ1ZTsgIH0KLSAgICAgICAgfAotICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgc2VsZWN0aW9uIGlzIGFsd2F5cyBhbiBvcHRpb24sIHRvby4KLSAgICAgICAgICAgICAgICAvLyBJbiBHcm9vdnksIHRoZSBzdHVmZiBiZXR3ZWVuIGJyYWNrZXRzIGlzIGEgZ2VuZXJhbCBhcmd1bWVudCBsaXN0LAotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBicmFja2V0IG9wZXJhdG9yIGlzIHRyYW5zZm9ybWVkIGludG8gYSBtZXRob2QgY2FsbC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBhbHNvIGJlIGEgZGVjbGFyYXRpb24gaGVhZDsgc3F1YXJlIGJyYWNrZXRzIGFyZSB1c2VkIHRvIHBhcmFtZXRlcml6ZSBhcnJheSB0eXBlcy4KLSAgICAgICAgICAgICAgICBhdGE6YXJyYXlPclR5cGVBcmdzW3ByZWZpeF0KLSAgICAgICAgICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gI2F0YTsgZW5kQnJhY2tldHMgPSBmYWxzZTsgIH0KLQotLypOWUkqCi0gICAgICAgIHwgICAgICAgRE9UXiBubHMhICJ0aGlzIgotCi0gICAgICAgIHwgICAgICAgRE9UXiBubHMhICJzdXBlciIKLSAgICAgICAgICAgICAgICAoICAgLy8gKG5ldyBPdXRlcigpKS5zdXBlcigpICAoY3JlYXRlIGVuY2xvc2luZyBpbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwMzpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQotICAgICAgICAgICAgICAgICAgICAgICAgeyNscDMuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KLSAgICAgICAgICAgICAgICB8ICAgRE9UXiBJREVOVAotICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICBscHM6TFBBUkVOXiB7I2xwcy5zZXRUeXBlKE1FVEhPRF9DQUxMKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBBUkVOIQotICAgICAgICAgICAgICAgICAgICAgICAgKT8KLSAgICAgICAgICAgICAgICApCi0gICAgICAgIHwgICAgICAgRE9UXiBubHMhIG5ld0V4cHJlc3Npb24KLSpOWUkqLwotICAgICAgICA7Ci0KLS8qKiBMb29rYWhlYWQgcGF0dGVybiBmb3IgcGF0aEVsZW1lbnQuICovCi1wYXRoRWxlbWVudFN0YXJ0IQotICAgICAgICA6ICAgKExQQVJFTiB8IExCUkFDRSB8IExCUkFDSyB8IERPVCB8IChTVEFSfFFVRVNUSU9OKSBET1QpCi0gICAgICAgIDsKLQotLyoqIFRoaXMgaXMgdGhlIGdyYW1tYXIgZm9yIHdoYXQgY2FuIGZvbGxvdyBhIGRvdDogIHguYSwgeC5AYSwgeC4mYSwgeC4nYScsIGV0Yy4KLSAqICA8cD5UaGUgYWx0ZXJuYXRpdmUgZm9yICJpbiIgaXMgdGhlcmUganVzdCBmb3IgZXJyb3IgcHJvY2Vzc2luZzsgaXQgcmFpc2VzIGFuIGVycm9yLgotICovCi1uYW1lUGFydAotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgKCAgIGFtcDpMQU5EXiAgIHsjYW1wLnNldFR5cGUoUkVGTEVDVF9NRU1CRVIpO30gLy8gZm9vLiZiYXIgcmVmbGVjdHMgdGhlICdiYXInIG1lbWJlciBvZiBmb28KLSAgICAgICAgICAgICAgICB8ICAgICAgIGF0czpBVFNJR05eIHsjYW1wLnNldFR5cGUoU0VMRUNUX1NMT1QpO30gICAgICAgIC8vIGZvby5AYmFyIHNlbGVjdHMgdGhlIGZpZWxkIChvciBhdHRyaWJ1dGUpLCBub3QgcHJvcGVydHkKLSAgICAgICAgICAgICAgICApPwotCi0gICAgICAgICAgICAoICAgSURFTlQKLSAgICAgICAgICAgICAgICB8ICAgc2w6U1RSSU5HX0xJVEVSQUwgeyNzbC5zZXRUeXBlKElERU5UKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb28uJ2JhcicgaXMgaW4gYWxsIHdheXMgc2FtZSBhcyBmb28uYmFyLCBleGNlcHQgdGhhdCBiYXIgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IHNwZWxsaW5nCi0gICAgICAgICAgICAgICAgfCAgIGRuOmR5bmFtaWNNZW1iZXJOYW1lIQotICAgICAgICAgICAgICAgICAgICAgICAgeyAgICNuYW1lUGFydCA9ICMoI1tEWU5BTUlDX01FTUJFUiwgIkRZTkFNSUNfTUVNQkVSIl0sICNkbik7ICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBERUNJREUgUFJPUE9TQUw6ICBmb28uKGJhciksIHguKHA/J2EnOidiJykgbWVhbnMgZHluYW1pYyBsb29rdXAgb24gYSBkeW5hbWljIG5hbWUKLSAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuQmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBST1BPU0FMLCBERUNJREU6ICBJcyB0aGlzIGlubGluZSBmb3JtIG9mIHRoZSAnd2l0aCcgc3RhdGVtZW50IHVzZWZ1bD8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmluaXRpb246ICBhLntmb299ID09PSB7d2l0aChhKSB7Zm9vfX0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBjb3ZlciBzb21lIHBhdGggZXhwcmVzc2lvbiB1c2UtY2FzZXMgcHJldmlvdXNseSBoYW5kbGVkIGJ5IGR5bmFtaWMgc2NvcGluZyAoY2xvc3VyZSBkZWxlZ2F0ZXMpLgotICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgd2l0aCBhIGdvb2QgZGlhZ25vc3RpYyBmcm9tIGEgY29tbW9uIGVycm9yOgotICAgICAgICAgICAgICAgIHwgICAiaW4iICAvLyBwb3N0ZXIgY2hpbGQ7IHRoZSBsZXhlciBtYWtlcyBhbGwga2V5d29yZHMgYWZ0ZXIgZG90IGxvb2sgbGlrZSAiaW4iCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgU3RyaW5nIGt3ZCA9IExUKDEpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIGtleXdvcmQgYWZ0ZXIgZG90IGluIHguIitrd2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHV0IHRoZSBrZXl3b3JkIGluIHF1b3RlcywgYXMgaW4geC4nIitrd2QrIiciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyB0aGUgdXNlciByZWNvdmVyIGZyb20gcnVpbmVkIEphdmEgaWRlbnRpZmllcnMsIGFzIGluIFN5c3RlbS4naW4nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERUNJREU6IFNoYWxsIHdlIGp1c3QgZGVmaW5lIGZvby5pbiB0byBEVFJUIGF1dG9tYWdpY2FsbHksIG9yIGRvIHdlIHdhbnQgdGhlIHN5bnRheCBjaGVjaz8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApCi0KLSAgICAgICAgICAgICAgICAvLyAoTm8sIHguJkB5IGlzIG5vdCBuZWVkZWQ7IGp1c3Qgc2F5IHguJnkgYXMgU2xvdCBvciBzb21lIHN1Y2guKQotICAgICAgICA7Ci0KLS8qKiBJZiBhIGRvdCBpcyBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQgb3IgcXVvdGVkIGV4cHJlc3Npb24sIHRoZSBtZW1iZXIgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHksCi0gKiAgYW5kIHRoZSBtZW1iZXIgc2VsZWN0aW9uIGlzIGRvbmUgb25seSBhdCBydW50aW1lLiAgVGhpcyBmb3JjZXMgYSBzdGF0aWNhbGx5IHVuY2hlY2tlZCBtZW1iZXIgYWNjZXNzLgotICovCi1keW5hbWljTWVtYmVyTmFtZQotICAgICAgICA6ICAgKCAgIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgfCAgIHN0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbgotICAgICAgICAgICAgICAgICkKLSAgICAgICAgeyAgICNkeW5hbWljTWVtYmVyTmFtZSA9ICMoI1tEWU5BTUlDX01FTUJFUiwgIkRZTkFNSUNfTUVNQkVSIl0sICNkeW5hbWljTWVtYmVyTmFtZSk7ICB9Ci0gICAgICAgIDsKLQotLyoqIEFuIGV4cHJlc3Npb24gbWF5IGJlIGZvbGxvd2VkIGJ5IG9uZSBvciBib3RoIG9mICguLi4pIGFuZCB7Li4ufS4KLSAqICBOb3RlOiBJZiBlaXRoZXIgaXMgKC4uLikgb3Igey4uLn0gcHJlc2VudCwgaXQgaXMgYSBtZXRob2QgY2FsbC4KLSAqICBUaGUgey4uLn0gaXMgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCBtYXRjaGVzIGEgZm9ybWFsIG9mIHR5cGUgQ2xvc3VyZS4KLSAqICBJZiB0aGVyZSBpcyBubyBtZXRob2QgbWVtYmVyLCBhIHByb3BlcnR5IChvciBmaWVsZCkgaXMgdXNlZCBpbnN0ZWFkLCBhbmQgbXVzdCBpdHNlbGYgYmUgY2FsbGFibGUuCi0gKiAgPHA+Ci0gKiAgSWYgdGhlIG1ldGhvZENhbGxBcmdzIGFyZSBhYnNlbnQsIGl0IGlzIGEgcHJvcGVydHkgKG9yIGZpZWxkKSByZWZlcmVuY2UsIGlmIHBvc3NpYmxlLgotICogIElmIHRoZXJlIGlzIG5vIHByb3BlcnR5IG9yIGZpZWxkLCBpdCBpcyB0cmVhdGVkIGFzIGEgbWV0aG9kIGNhbGwgKG51bGxhcnkpIGFmdGVyIGFsbC4KLSAqICA8cD4KLSAqICBBcmd1bWVudHMgaW4gdGhlICguLi4pIGNhbiBiZSBsYWJlbGVkLCBhbmQgdGhlIGFwcGVuZGVkIGJsb2NrIGNhbiBiZSBsYWJlbGVkIGFsc28uCi0gKiAgSWYgdGhlcmUgaXMgYSBtaXggb2YgdW5sYWJlbGVkIGFuZCBsYWJlbGVkIGFyZ3VtZW50cywKLSAqICBhbGwgdGhlIGxhYmVsZWQgYXJndW1lbnRzIG11c3QgZm9sbG93IHRoZSB1bmxhYmVsZWQgYXJndW1lbnRzLAotICogIGV4Y2VwdCB0aGF0IHRoZSBjbG9zdXJlIChsYWJlbGVkIG9yIG5vdCkgaXMgYWx3YXlzIGEgc2VwYXJhdGUgZmluYWwgYXJndW1lbnQuCi0gKiAgTGFiZWxlZCBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB1cCBhbmQgcGFzc2VkIGFzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIGEgZm9ybWFsIG9mIHR5cGUgTWFwLgotICogIDxwPgotICogIFRoZXJlZm9yZSwgZih4LHksIGE6cCwgYjpxKSB7c30gaXMgZXF1aXZhbGVudCBpbiBhbGwgd2F5cyB0byBmKHgseSwgW2E6cCxiOnFdLCB7c30pLgotICogIFNwcmVhZCBhcmd1bWVudHMgb2Ygc2VxdWVuY2UgdHlwZSBjb3VudCBhcyB1bmxhYmVsZWQgYXJndW1lbnRzLAotICogIHdoaWxlIHNwcmVhZCBhcmd1bWVudHMgb2YgbWFwIHR5cGUgY291bnQgYXMgbGFiZWxlZCBhcmd1bWVudHMuCi0gKiAgKFRoaXMgZGlzdGluY3Rpb24gbXVzdCBzb21ldGltZXMgYmUgY2hlY2tlZCBkeW5hbWljYWxseS4pCi0gKgotICogIEEgcGxhaW4gdW5sYWJlbGVkIGFyZ3VtZW50IGlzIGFsbG93ZWQgdG8gbWF0Y2ggYSB0cmFpbGluZyBNYXAgb3IgQ2xvc3VyZSBhcmd1bWVudDoKLSAqICBmKHgsIGE6cCkge3N9ICA9PT0gIGYoKlsgeCwgW2E6cF0sIHtzfSBdKQotICogIDxwPgotICogIFJldHVybmVkIEFTVCBpcyBbTUVUSE9EX0NBTEwsIGNhbGxlZSwgRUxJU1Q/LCBDTE9TRURfQkxPQ0s/XS4KLSAqLwotbWV0aG9kQ2FsbEFyZ3NbQVNUIGNhbGxlZV0KLSAgICAgICAge2Jvb2xlYW4geno7IC8qaWdub3JlKi8gfQotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgeyNtZXRob2RDYWxsQXJncyA9IGNhbGxlZTt9Ci0gICAgICAgICAgICAgICAgbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KLSAgICAgICAgICAgICAgICB6ej1hcmdMaXN0Ci0gICAgICAgICAgICAgICAgUlBBUkVOIQotICAgICAgICAgICAgICAgICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6IGFwcGVuZGVkQmxvY2sgKT8gICAgICAgICAgICAgLy8gbWF5YmUgYXBwZW5kIGEgY2xvc3VyZQotICAgICAgICB8Ci0gICAgICAgICAgICAgICAgLy8gZWxzZSB1c2UgYSBjbG9zdXJlIGFsb25lCi0gICAgICAgICAgICAgICAgeyNtZXRob2RDYWxsQXJncyA9IGNhbGxlZTt9Ci0gICAgICAgICAgICAgICAgY2I6YXBwZW5kZWRCbG9jawotICAgICAgICAgICAgICAgIHsgICBBU1QgbGJyYWNlID0gZ2V0QVNURmFjdG9yeSgpLmR1cCgjY2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGJyYWNlLnNldFR5cGUoTUVUSE9EX0NBTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgI21ldGhvZENhbGxBcmdzID0gIyhsYnJhY2UsICNtZXRob2RDYWxsQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICA7Ci0KLS8qKiBBbiBleHByZXNzaW9uIG1heSBiZSBmb2xsb3dlZCBieSBbLi4uXS4KLSAqICBVbmxpa2UgSmF2YSwgdGhlc2UgYnJhY2tldHMgbWF5IGNvbnRhaW4gYSBnZW5lcmFsIGFyZ3VtZW50IGxpc3QsCi0gKiAgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBhcnJheSBlbGVtZW50IG9wZXJhdG9yLCB3aGljaCBjYW4gbWFrZSBvZiBpdCB3aGF0IGl0IHdhbnRzLgotICogIFRoZSBicmFja2V0cyBtYXkgYWxzbyBiZSBlbXB0eSwgYXMgaW4gVFtdLiAgVGhpcyBpcyBob3cgR3Jvb3Z5IG5hbWVzIGFycmF5IHR5cGVzLgotICogIDxwPlJldHVybmVkIEFTVCBpcyBbSU5ERVhfT1AsIGluZGV4ZWUsIEVMSVNUXS4KLSAqCi0gKiAqVE9ETyogKFRoZSBhcnJheU9yVHlwZUFyZ3MgdGhpbmcgaW4gMS40IGdyb292eS5nIGlzIGEgcGxhY2Vob2xkZXIgd2hpY2gKLSAqIGFudGljaXBhdGVzIHRoZSB0cm91YmxlIG9mIGludGVncmF0aW5nIEphdmEgNSB0eXBlIGFyZ3VtZW50cy4pCi0gKi8KLWFycmF5T3JUeXBlQXJnc1tBU1QgaW5kZXhlZV0KLSAgICAgICAge2Jvb2xlYW4geno7IC8qaWdub3JlKi8gfQotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgeyNhcnJheU9yVHlwZUFyZ3MgPSBpbmRleGVlO30KLSAgICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGNvbnZlbmllbnQgdG8gYmUgZ3JlZWR5IGhlcmUsIHRob3VnaCBpdCBkb2Vzbid0IGFmZmVjdCBjb3JyZWN0bmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7IGdyZWVkeSA9IHRydWU7IH0gOgotICAgICAgICAgICAgICAgICAgICAgICAgbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoSU5ERVhfT1ApO30KLSAgICAgICAgICAgICAgICAgICAgICAgIHp6PWFyZ0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIFJCUkFDSyEKLSAgICAgICAgICAgICAgICApKwotICAgICAgICA7Ci0KLQotLy8gYXNzaWdubWVudCBleHByZXNzaW9uIChsZXZlbCAxMykKLWFzc2lnbm1lbnRFeHByZXNzaW9uCi0gICAgICAgIDogICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgKCAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICggICBBU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgUExVU19BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgTUlOVVNfQVNTSUdOXgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFNUQVJfQVNTSUdOXgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgIERJVl9BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgTU9EX0FTU0lHTl4KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICBTUl9BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgQlNSX0FTU0lHTl4KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICBTTF9BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgQkFORF9BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgQlhPUl9BU1NJR05eCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgQk9SX0FTU0lHTl4KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5scyEKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgKT8KLSAgICAgICAgOwotCi0vLyBjb25kaXRpb25hbCB0ZXN0IChsZXZlbCAxMikKLWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIGxvZ2ljYWxPckV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICAoIFFVRVNUSU9OXiBubHMhIGFzc2lnbm1lbnRFeHByZXNzaW9uIENPTE9OISBubHMhIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiApPwotICAgICAgICA7Ci0KLQotLy8gbG9naWNhbCBvciAofHwpICAobGV2ZWwgMTEpCi1sb2dpY2FsT3JFeHByZXNzaW9uCi0gICAgICAgIDogICAgICAgbG9naWNhbEFuZEV4cHJlc3Npb24gKExPUl4gbmxzISBsb2dpY2FsQW5kRXhwcmVzc2lvbikqCi0gICAgICAgIDsKLQotCi0vLyBsb2dpY2FsIGFuZCAoJiYpICAobGV2ZWwgMTApCi1sb2dpY2FsQW5kRXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIGluY2x1c2l2ZU9yRXhwcmVzc2lvbiAoTEFORF4gbmxzISBpbmNsdXNpdmVPckV4cHJlc3Npb24pKgotICAgICAgICA7Ci0KLQotLy8gYml0d2lzZSBvciBub24tc2hvcnQtY2lyY3VpdGluZyBvciAofCkgIChsZXZlbCA5KQotaW5jbHVzaXZlT3JFeHByZXNzaW9uCi0gICAgICAgIDogICAgICAgZXhjbHVzaXZlT3JFeHByZXNzaW9uIChCT1JeIG5scyEgZXhjbHVzaXZlT3JFeHByZXNzaW9uKSoKLSAgICAgICAgOwotCi0KLS8vIGV4Y2x1c2l2ZSBvciAoXikgIChsZXZlbCA4KQotZXhjbHVzaXZlT3JFeHByZXNzaW9uCi0gICAgICAgIDogICAgICAgYW5kRXhwcmVzc2lvbiAoQlhPUl4gbmxzISBhbmRFeHByZXNzaW9uKSoKLSAgICAgICAgOwotCi0KLS8vIGJpdHdpc2Ugb3Igbm9uLXNob3J0LWNpcmN1aXRpbmcgYW5kICgmKSAgKGxldmVsIDcpCi1hbmRFeHByZXNzaW9uCi0gICAgICAgIDogICAgICAgZXF1YWxpdHlFeHByZXNzaW9uIChCQU5EXiBubHMhIGVxdWFsaXR5RXhwcmVzc2lvbikqCi0gICAgICAgIDsKLQotCi0vLyBlcXVhbGl0eS9pbmVxdWFsaXR5ICg9PS8hPSkgKGxldmVsIDYpCi1lcXVhbGl0eUV4cHJlc3Npb24KLSAgICAgICAgOiAgICAgICByZWxhdGlvbmFsRXhwcmVzc2lvbiAoKE5PVF9FUVVBTF4gfCBFUVVBTF4pIG5scyEgcmVsYXRpb25hbEV4cHJlc3Npb24pKgotICAgICAgICA7Ci0KLQotLy8gYm9vbGVhbiByZWxhdGlvbmFsIGV4cHJlc3Npb25zIChsZXZlbCA1KQotcmVsYXRpb25hbEV4cHJlc3Npb24KLSAgICAgICAgOiAgICAgICBzaGlmdEV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICAoICAgICAgICggICAgICAgKCAgICAgICBMVF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBHVF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBMRV4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBHRV4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAiaW4iXgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5scyEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICApPwotICAgICAgICAgICAgICAgIHwgICAgICAgImluc3RhbmNlb2YiXiBubHMhIHR5cGVTcGVjW3RydWVdCi0gICAgICAgICAgICAgICAgfCAgICAgICAiYXMiXiAgICAgICAgIG5scyEgdHlwZVNwZWNbdHJ1ZV0gLy9UTyBETzogUmV3b3JrIHRvIGFsbG93IHR5cGUgZXhwcmVzc2lvbj8KLSAgICAgICAgICAgICAgICApCi0gICAgICAgIDsKLQotCi0KLS8vIGJpdCBzaGlmdCBleHByZXNzaW9ucyAobGV2ZWwgNCkKLXNoaWZ0RXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIGFkZGl0aXZlRXhwcmVzc2lvbgotICAgICAgICAgICAgICAgICggICAoKFNMXiB8IFNSXiB8IEJTUl4pIG5scyEKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICBSQU5HRV9JTkNMVVNJVkVeCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgREVDXiB7I0RFQy5zZXRUeXBlKFJBTkdFX0VYQ0xVU0lWRSk7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERUNJREU6IE1heWJlIHVzZSBhLS1iIHRvIGRlbm90ZSBDL0phdmEtc3R5bGUgaW5kZXggcmFuZ2UgKCJleGNsdXNpdmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpdmVFeHByZXNzaW9uCi0gICAgICAgICAgICAgICAgKSoKLSAgICAgICAgOwotCi0KLS8vIGJpbmFyeSBhZGRpdGlvbi9zdWJ0cmFjdGlvbiAobGV2ZWwgMykKLWFkZGl0aXZlRXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoKFBMVVNeIHwgTUlOVVNeKSBubHMhIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbikqCi0gICAgICAgIDsKLQotCi0vLyBtdWx0aXBsaWNhdGlvbi9kaXZpc2lvbi9tb2R1bG8gKGxldmVsIDIpCi1tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KLSAgICAgICAgOiAgICAgICB1bmFyeUV4cHJlc3Npb24gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgbmxzISB1bmFyeUV4cHJlc3Npb24pKgotICAgICAgICA7Ci0KLXVuYXJ5RXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIElOQ14gbmxzISB1bmFyeUV4cHJlc3Npb24KLSAgICAgICAgfCAgICAgICBERUNeIG5scyEgdW5hcnlFeHByZXNzaW9uCi0gICAgICAgIHwgICAgICAgTUlOVVNeIHsjTUlOVVMuc2V0VHlwZShVTkFSWV9NSU5VUyk7fSBubHMhIHVuYXJ5RXhwcmVzc2lvbgotICAgICAgICB8ICAgICAgIFBMVVNeICB7I1BMVVMuc2V0VHlwZShVTkFSWV9QTFVTKTt9IG5scyEgdW5hcnlFeHByZXNzaW9uCi0gICAgICAgIHwgICAgICAgRE9MTEFSXiAgeyNET0xMQVIuc2V0VHlwZShTQ09QRV9FU0NBUEUpO30gbmxzISB1bmFyeUV4cHJlc3Npb24KLSAgICAgICAgfCAgICAgICB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLSAgICAgICAgOwotCi0vLyBUaGUgU0NPUEVfRVNDQVBFIG9wZXJhdG9yIHBvcHMgaXRzIG9wZXJhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiBhICJ3aXRoIiBibG9jay4KLS8vIElmIG5vdCB3aXRoaW4gYSAid2l0aCIgYmxvY2ssIGl0IHBvcHMgdGhlIG9wZXJhbmQgb3V0IG9mIHRoZSBzdGF0aWMgZ2xvYmFsIHNjb3BlLAotLy8gaW50byB3aGF0ZXZlciBkeW5hbWljICh1bmNoZWNrZWQpIGdsb2JhbCBzY29wZSBpcyBhdmFpbGFibGUgd2hlbiB0aGUgc2NyaXB0IGlzIHJ1biwKLS8vIHJlZ2FyZGxlc3Mgb2YgcGFja2FnZSBhbmQgaW1wb3J0cy4KLS8vIEV4YW1wbGUgb2YgU0NPUEVfRVNDQVBFOiAgZGVmIHg9MTsgd2l0aCAoW3g6Mix5Oi0xXSkgeyBkZWYgeT0zOyBwcmludGxuIFskeCwgeCwgeV0gfSAgPT4gICJbMSwgMiwgM10iCi0KLXVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwotCToJQk5PVF4gbmxzISB1bmFyeUV4cHJlc3Npb24KLQl8CUxOT1ReIG5scyEgdW5hcnlFeHByZXNzaW9uCi0JfAkoCS8vIHN1YnJ1bGUgYWxsb3dzIG9wdGlvbiB0byBzaHV0IG9mZiB3YXJuaW5ncwotCQkJb3B0aW9ucyB7Ci0JCQkJLy8gIihpbnQiIGFtYmlnIHdpdGggcG9zdGZpeEV4cHIgZHVlIHRvIGxhY2sgb2Ygc2VxdWVuY2UKLQkJCQkvLyBpbmZvIGluIGxpbmVhciBhcHByb3hpbWF0ZSBMTChrKS4gSXQncyBvay4gU2h1dCB1cC4KLQkJCQlnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7Ci0JCQl9Ci0JCToJLy8gSWYgdHlwZWNhc3QgaXMgYnVpbHQgaW4gdHlwZSwgbXVzdCBiZSBudW1lcmljIG9wZXJhbmQKLQkJCS8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzCi0JCShMUEFSRU4gYnVpbHRJblR5cGVTcGVjW3RydWVdIFJQQVJFTiB1bmFyeUV4cHJlc3Npb24pPT4KLQkJbHBiOkxQQVJFTl4geyNscGIuc2V0VHlwZShUWVBFQ0FTVCk7fSBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQotCQl1bmFyeUV4cHJlc3Npb24KLQotCQkvLyBIYXZlIHRvIGJhY2t0cmFjayB0byBzZWUgaWYgb3BlcmF0b3IgZm9sbG93cy4gSWYgbm8gb3BlcmF0b3IKLQkJLy8gZm9sbG93cywgaXQncyBhIHR5cGVjYXN0LiBObyBzZW1hbnRpYyBjaGVja2luZyBuZWVkZWQgdG8gcGFyc2UuCi0JCS8vIGlmIGl0IF9sb29rc18gbGlrZSBhIGNhc3QsIGl0IF9pc18gYSBjYXN0OyBlbHNlIGl0J3MgYSAiKGV4cHIpIgotCQkvLyBUTyBETzogIFJld29yayB0aGlzIG1lc3MgZm9yIEdyb292eS4KLQl8CShMUEFSRU4gY2xhc3NUeXBlU3BlY1t0cnVlXSBSUEFSRU4gdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKT0+Ci0JCWxwOkxQQVJFTl4geyNscC5zZXRUeXBlKFRZUEVDQVNUKTt9IGNsYXNzVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQotCQl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQotCXwJcG9zdGZpeEV4cHJlc3Npb24KLQkpCi0JOwotCi0vLyBxdWFsaWZpZWQgbmFtZXMsIGFycmF5IGV4cHJlc3Npb25zLCBtZXRob2QgaW52b2NhdGlvbiwgcG9zdCBpbmMvZGVjCi1wb3N0Zml4RXhwcmVzc2lvbgotCQl7Ym9vbGVhbiB6ejsgLyppZ25vcmVkKi99Ci0JOgotCQkoICAgeno9cGF0aEV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4LCB4LmYsIHgoKSwgeHt9LCBldGMuCi0gICAgICAgICAgICAgICAgfCAgIHBhdGhFeHByZXNzaW9uRnJvbUJyYWNrZXRzICAgICAgICAgIC8vIHtjfSwge2N9KCksIFt4XS5mLCBldGMuCi0gICAgICAgICAgICAgICAgKQotCi0gICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJseSBhZGQgb24gYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudC4KLQkJCS8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjawotCQkJaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KLQkgCXwJZGU6REVDXiB7I2RlLnNldFR5cGUoUE9TVF9ERUMpO30KLQkJKT8KLSAJOwotCi0vLyB0aGUgYmFzaWMgZWxlbWVudCBvZiBhbiBleHByZXNzaW9uCi1wcmltYXJ5RXhwcmVzc2lvbgotICAgICAgICA6ICAgICAgIElERU5UCi0gICAgICAgIC8qT0JTKiAgLy9jbGFzcyBuYW1lcyB3b3JrIGZpbmUgYXMgZXhwcmVzc2lvbnMsIG5vIG5lZWQgZm9yIFQuY2xhc3MgaW4gR3Jvb3Z5Ci0gICAgICAgICAgICAgICAgKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDogRE9UXiAiY2xhc3MiICk/Ci0gICAgICAgICpPQlMqLwotICAgIHwgICBjb25zdGFudAotICAgICAgICB8ICAgICAgICJ0cnVlIgotICAgICAgICB8ICAgICAgICJmYWxzZSIKLSAgICAgICAgfCAgICAgICAibnVsbCIKLSAgICB8ICAgbmV3RXhwcmVzc2lvbgotICAgICAgICB8ICAgICAgICJpdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgb3IgZXhwbGljaXQgY2xvc3VyZSBwYXJhbWV0ZXIgKG9yIG1ldGhvZCBwYXJhbWV0ZXIpCi0gICAgICAgIHwgICAgICAgInRoaXMiCi0gICAgICAgIHwgICAgICAgInN1cGVyIgotICAgICAgICB8ICAgICAgIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhbCBzdHVmZi4uLC4pCi0gICAgICAgIHwgICBzdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb24gICAgICAgICAvLyAiZm9vICRiYXIgYmF6IjsgcHJlc2VudGVkIGFzIG11bHRpcGxlIHRva2VucwotICAgICAgICB8ICAgYnVpbHRJblR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgZXhwcmVzc2lvbnMgd29yayBpbiBHcm9vdnkKLSAgICAgICAgLypPQlMqICAvL2NsYXNzIG5hbWVzIHdvcmsgZmluZSBhcyBleHByZXNzaW9ucwotICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGludC5jbGFzcyBhbmQgaW50W10uY2xhc3MKLSAgICAgICAgfCAgICAgICBidWlsdEluVHlwZQotICAgICAgICAgICAgICAgICggbGJ0OkxCUkFDS14geyNsYnQuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEgKSoKLSAgICAgICAgICAgICAgICBET1ReIG5scyEgImNsYXNzIgotICAgICAgICAqT0JTKi8KLSAgICAgICAgOwotCi1wYXJlbnRoZXNpemVkRXhwcmVzc2lvbgotICAgICAgICA6ICAgbHA6TFBBUkVOXiBleHByZXNzaW9uIFJQQVJFTiEgICAgICAgICAgICAgICAgICAgICAgIHsgI2xwLnNldFR5cGUoRVhQUik7IH0KLSAgICAgICAgOwotCi0vLyBHcm9vdnkgc3ludGF4IGZvciAiJHggJHkiLgotc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uCi0gICAgICAgIDogICBjczpTVFJJTkdfQ1RPUl9TVEFSVAotICAgICAgICAgICAgICAgIHsgI2NzLnNldFR5cGUoU1RSSU5HX0xJVEVSQUwpOyB9Ci0KLSAgICAgICAgICAgICAgICBzdHJpbmdDb25zdHJ1Y3RvclZhbHVlUGFydAotCi0gICAgICAgICAgICAgICAgKCAgIGNtOlNUUklOR19DVE9SX01JRERMRQotICAgICAgICAgICAgICAgICAgICAgICAgeyAjY20uc2V0VHlwZShTVFJJTkdfTElURVJBTCk7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0NvbnN0cnVjdG9yVmFsdWVQYXJ0Ci0gICAgICAgICAgICAgICAgKSoKLQotICAgICAgICAgICAgICAgIGNlOlNUUklOR19DVE9SX0VORAotICAgICAgICAgICAgICAgIHsgI2NlLnNldFR5cGUoU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgI3N0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAjKCNbU1RSSU5HX0NPTlNUUlVDVE9SLCJTVFJJTkdfQ09OU1RSVUNUT1IiXSwgc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIDsKLQotc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKLSAgICAgICAgOiAgIGlkZW50aWZpZXIgICAgICAgICAgLy8gYWthLCBwYXRoRXhwcmVzc2lvbgotICAgICAgICB8ICAgb3BlbkJsb2NrCi0gICAgICAgIDsKLQotLyoqCi0gKiBBIGxpc3QgY29uc3RydWN0b3IgaXMgYSBhcmd1bWVudCBsaXN0IGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cywgd2l0aG91dCBsYWJlbHMuCi0gKiBBbnkgYXJndW1lbnQgY2FuIGJlIGRlY29yYXRlZCB3aXRoIGEgc3ByZWFkIG9yIG9wdGlvbmFsIG9wZXJhdG9yICgqeCwgP3gpLCBidXQgbm90IGEgbGFiZWwgKGE6eCkuCi0gKiBFeGFtcGxlczogIFtdLCBbMV0sIFsxLDJdLCBbMSwqbDEsMl0sIFsqbDEsKmwyXSwgWzEsP3gsMl0uCi0gKiAoVGhlIGwxLCBsMiBtdXN0IGJlIGEgc2VxdWVuY2Ugb3IgbnVsbC4pCi0gKiA8cD4KLSAqIEEgbWFwIGNvbnN0cnVjdG9yIGlzIGFuIGFyZ3VtZW50IGxpc3QgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzLCB3aXRoIGxhYmVscyBldmVyeXdoZXJlLAotICogZXhjZXB0IHBvc3NpYmx5IG9uIHNwcmVhZCBhcmd1bWVudHMsIHdoaWNoIHN0YW5kIGZvciB3aG9sZSBtYXBzIHNwbGljZWQgaW4uCi0gKiBBIGNvbG9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsZWZ0IGJyYWNrZXQgYWxzbyBmb3JjZXMgdGhlIGV4cHJlc3Npb24gdG8gYmUgYSBtYXAgY29uc3RydWN0b3IuCi0gKiBFeGFtcGxlczogWzpdLCBbYToxXSwgWzogYToxXSwgW2E6MSxiOjJdLCBbYToxLCptMSxiOjJdLCBbOiptMSwqbTJdLCBbYToxLHE6P3gsYjoyXSwgW2E6MSxhOip4LGI6Ml0KLSAqIChUaGUgbTEsIG0yIG11c3QgYmUgYSBtYXAgb3IgbnVsbC4pCi0gKiBWYWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGlkZW50aWNhbCBrZXlzIG92ZXJ3cml0ZSBmcm9tIGxlZnQgdG8gcmlnaHQ6Ci0gKiBbYToxLGE6Ml0gID09PSAgW2E6Ml0KLSAqIDxwPgotICogU29tZSBtYWxmb3JtZWQgY29uc3RydWN0b3IgZXhwcmVzc2lvbnMgYXJlIG5vdCBkZXRlY3RlZCBpbiB0aGUgcGFyc2VyLCBidXQgaW4gYSBwb3N0LXBhc3MuCi0gKiBCYWQgZXhhbXBsZXM6IFsxLGI6Ml0sIFthOjEsMl0sIFs6MV0sIFthOjEsP3hdLCBbYToxLCBiOip4XS4KLSAqIChOb3RlIHRoYXQgbWV0aG9kIGNhbGwgYXJndW1lbnRzLCBieSBjb250cmFzdCwgY2FuIGJlIGEgbWl4IG9mIGtleXdvcmRlZCBhbmQgbm9uLWtleXdvcmRlZCBhcmd1bWVudHMuKQotICovCi1saXN0T3JNYXBDb25zdHJ1Y3RvckV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICB7IGJvb2xlYW4gaGFzTGFiZWxzID0gZmFsc2UsIGhhbDsgfQotICAgICAgICA6ICAgbGNvbjpMQlJBQ0teCi0gICAgICAgICAgICAgICAgKCAgQ09MT04hICAgICAgICAgICAgICAgeyBoYXNMYWJlbHMgfD0gdHJ1ZTsgfSAgKT8gIC8vIFs6XSwgWzoqeF0sIFs6KngsKnldIGFyZSBtYXAgY29uc3RydWN0b3JzCi0gICAgICAgICAgICAgICAgaGFsPWFyZ0xpc3QgICAgICAgICAgICAgeyBoYXNMYWJlbHMgfD0gaGFsOyAgfSAgICAgIC8vIGFueSBhcmd1bWVudCBsYWJlbCBpbXBsaWVzIGEgbWFwCi0gICAgICAgICAgICAgICAgUkJSQUNLIQotICAgICAgICAgICAgICAgIHsgICAjbGNvbi5zZXRUeXBlKGhhc0xhYmVscyA/IE1BUF9DT05TVFJVQ1RPUiA6IExJU1RfQ09OU1RSVUNUT1IpOyAgfQotICAgICAgICA7Ci0KLS8qT0JTKgotLyoqIE1hdGNoIGEsIGEuYi5jIHJlZnMsIGEuYi5jKC4uLikgcmVmcywgYS5iLmNbXSwgYS5iLmNbXS5jbGFzcywKLSAqICBhbmQgYS5iLmMuY2xhc3MgcmVmcy4gQWxzbyB0aGlzKC4uLikgYW5kIHN1cGVyKC4uLikuIE1hdGNoCi0gKiAgdGhpcyBvciBzdXBlci4KLSAqLwotLypPQlMqCi1pZGVudFByaW1hcnkKLQk6CSh0YTE6dHlwZUFyZ3VtZW50cyEpPwotCQlJREVOVAotCQkvLyBTeW50YXggZm9yIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggdHlwZSBhcmd1bWVudHMgaXMKLQkJLy8gPFN0cmluZz5mb28oImJsYWgiKQotCQkoCi0JCQlvcHRpb25zIHsKLQkJCQkvLyAuaWRlbnQgY291bGQgbWF0Y2ggaGVyZSBvciBpbiBwb3N0Zml4RXhwcmVzc2lvbi4KLQkJCQkvLyBXZSBkbyB3YW50IHRvIG1hdGNoIGhlcmUuIFR1cm4gb2ZmIHdhcm5pbmcuCi0JCQkJZ3JlZWR5PXRydWU7Ci0JCQkJLy8gVGhpcyB0dXJucyB0aGUgYW1iaWd1aXR5IHdhcm5pbmcgb2YgdGhlIHNlY29uZCBhbHRlcm5hdGl2ZQotCQkJCS8vIG9mZi4gU2VlIGJlbG93LiAoVGhlICJmYWxzZSIgcHJlZGljYXRlIG1ha2VzIGl0IG5vbi1pc3N1ZSkKLQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnPWZhbHNlOwotCQkJfQotCQkJLy8gd2UgaGF2ZSBhIG5ldyBub25kZXRlcm1pbmlzbSBiZWNhdXNlIG9mCi0JCQkvLyB0eXBlQXJndW1lbnRzLi4uIG9ubHkgYSBzeW50YWN0aWMgcHJlZGljYXRlIHdpbGwgaGVscC4uLgotCQkJLy8gVGhlIHByb2JsZW0gaXMgdGhhdCB0aGlzIGxvb3AgaGVyZSBjb25mbGljdHMgd2l0aAotCQkJLy8gRE9UIHR5cGVBcmd1bWVudHMgInN1cGVyIiBpbiBwb3N0Zml4RXhwcmVzc2lvbiAoaz0yKQotCQkJLy8gQSBwcm9wZXIgc29sdXRpb24gd291bGQgcmVxdWlyZSBhIGxvdCBvZiByZWZhY3RvcmluZy4uLgotCQk6CShET1QgKHR5cGVBcmd1bWVudHMpPyBJREVOVCkgPT4KLQkJCQlET1ReICh0YTI6dHlwZUFyZ3VtZW50cyEpPyBJREVOVAotCQl8CXtmYWxzZX0/CS8vIEZJWE1FOiB0aGlzIGlzIHZlcnkgdWdseSBidXQgaXQgc2VlbXMgdG8gd29yay4uLgotCQkJCQkJLy8gdGhpcyB3aWxsIGFsc28gcHJvZHVjZSBhbiBBTlRMUiB3YXJuaW5nIQotCQkJCS8vIFVuZm9ydHVuYXRlbHkgYSBzeW50YWN0aWMgcHJlZGljYXRlIGNhbiBvbmx5IHNlbGVjdCBvbmUgb2YKLQkJCQkvLyBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgb24gdGhlIHNhbWUgbGV2ZWwsIG5vdCBicmVhayBvdXQgb2YKLQkJCQkvLyBhbiBlbmNsb3NpbmcgbG9vcCwgd2hpY2ggaXMgd2h5IHRoaXMgdWdseSBoYWNrIChhIGZha2UKLQkJCQkvLyBlbXB0eSBhbHRlcm5hdGl2ZSB3aXRoIGFsd2F5cy1mYWxzZSBzZW1hbnRpYyBwcmVkaWNhdGUpCi0JCQkJLy8gaXMgbmVjZXNzYXJ5LgotCQkpKgotCQkoCi0JCQlvcHRpb25zIHsKLQkJCQkvLyBBUlJBWV9ERUNMQVJBVE9SIGhlcmUgY29uZmxpY3RzIHdpdGggSU5ERVhfT1AgaW4KLQkJCQkvLyBwb3N0Zml4RXhwcmVzc2lvbiBvbiBMQlJBQ0sgUkJSQUNLLgotCQkJCS8vIFdlIHdhbnQgdG8gbWF0Y2ggW10gaGVyZSwgc28gZ3JlZWR5LiBUaGlzIG92ZXJjb21lcwotCQkJCS8vIGxpbWl0YXRpb24gb2YgbGluZWFyIGFwcHJveGltYXRlIGxvb2thaGVhZC4KLQkJCQlncmVlZHk9dHJ1ZTsKLQkJCX0KLQkJOgkoCWxwOkxQQVJFTl4geyNscC5zZXRUeXBlKE1FVEhPRF9DQUxMKTt9Ci0JCQkJLy8gaWYgdGhlIGlucHV0IGlzIHZhbGlkLCBvbmx5IHRoZSBsYXN0IElERU5UIG1heQotCQkJCS8vIGhhdmUgcHJlY2VkaW5nIHR5cGVBcmd1bWVudHMuLi4gcmF0aGVyIGhhY2t5LCB0aGlzIGlzLi4uCi0JCQkJe2lmICgjdGEyICE9IG51bGwpIGFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgI3RhMik7fQotCQkJCXtpZiAoI3RhMiA9PSBudWxsKSBhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsICN0YTEpO30KLQkJCQlhcmdMaXN0IFJQQVJFTiEKLQkJCSkKLQkJfAkoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOgotCQkJCWxiYzpMQlJBQ0teIHsjbGJjLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCi0JCQkpKwotCQkpPwotCTsKLSpPQlMqLwotCi0vKiogb2JqZWN0IGluc3RhbnRpYXRpb24uCi0gKiAgVHJlZXMgYXJlIGJ1aWx0IGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgaW5wdXQvdHJlZSBwYWlyczoKLSAqCi0gKiAgbmV3IFQoKQotICoKLSAqICBuZXcKLSAqICAgfAotICogICBUIC0tICBFTElTVAotICoJCSAgIHwKLSAqCQkgIGFyZzEgLS0gYXJnMiAtLSAuLiAtLSBhcmduCi0gKgotICogIG5ldyBpbnRbXQotICoKLSAqICBuZXcKLSAqICAgfAotICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCi0gKgotICogIG5ldyBpbnRbXSB7MSwyfQotICoKLSAqICBuZXcKLSAqICAgfAotICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SIC0tIEFSUkFZX0lOSVQKLSAqCQkJCQkJCQkgIHwKLSAqCQkJCQkJCQlFWFBSIC0tIEVYUFIKLSAqCQkJCQkJCQkgIHwJICB8Ci0gKgkJCQkJCQkJICAxCSAgMgotICoKLSAqICBuZXcgaW50WzNdCi0gKiAgbmV3Ci0gKiAgIHwKLSAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgotICoJCQkJfAotICoJCQkgIEVYUFIKLSAqCQkJCXwKLSAqCQkJCTMKLSAqCi0gKiAgbmV3IGludFsxXVsyXQotICoKLSAqICBuZXcKLSAqICAgfAotICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCi0gKgkJCSAgIHwKLSAqCQkgQVJSQVlfREVDTEFSQVRPUiAtLSBFWFBSCi0gKgkJCSAgIHwJCQkgIHwKLSAqCQkJIEVYUFIJCQkgMQotICoJCQkgICB8Ci0gKgkJCSAgIDIKLSAqCi0gKi8KLW5ld0V4cHJlc3Npb24KLQkJe2Jvb2xlYW4geno7IC8qaWdub3JlZCovfQotCToJIm5ldyJeICh0eXBlQXJndW1lbnRzKT8gdHlwZQotCQkoCUxQQVJFTiEgeno9YXJnTGlzdCBSUEFSRU4hIAotCQkJLypUT0RPIC0gTllJKiAoYW5vbnltb3VzSW5uZXJDbGFzc0Jsb2NrKT8gKk5ZSSovCi0KLS8qT0JTKgotCQkJLy9qYXZhIDEuMQotCQkJLy8gTm90ZTogVGhpcyB3aWxsIGFsbG93IGJhZCBjb25zdHJ1Y3RzIGxpa2UKLQkJCS8vCW5ldyBpbnRbNF1bXVszXSB7ZXhwLGV4cH0uCi0JCQkvLwlUaGVyZSBuZWVkcyB0byBiZSBhIHNlbWFudGljIGNoZWNrIGhlcmUuLi4KLQkJCS8vIHRvIG1ha2Ugc3VyZToKLQkJCS8vICAgYSkgWyBleHByIF0gYW5kIFsgXSBhcmUgbm90IG1peGVkCi0JCQkvLyAgIGIpIFsgZXhwciBdIGFuZCBhbiBpbml0IGFyZSBub3QgdXNlZCB0b2dldGhlcgotCi0JCXwJbmV3QXJyYXlEZWNsYXJhdG9yIChhcnJheUluaXRpYWxpemVyKT8KLQkJCS8vIEdyb292eSBkb2VzIG5vdCBzdXBwb3J0IEphdmEgc3ludGF4IGZvciBpbml0aWFsaXplZCBuZXcgYXJyYXlzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHNlcXVlbmNlIGNvbnN0cnVjdG9ycyBpbnN0ZWFkLgotCi0qT0JTKi8KLQkJKQotCS8vIERFQ0lERTogIEtlZXAgJ25ldyB4KCknIHN5bnRheD8KLQk7Ci0KLS8qTllJKgotYW5vbnltb3VzSW5uZXJDbGFzc0Jsb2NrCi0gICAgICAgIDogICBjbGFzc0Jsb2NrCi0gICAgICAgIDsKLSpOWUkqLwotCi1hcmdMaXN0Ci1yZXR1cm5zIFtib29sZWFuIGhhc0xhYmVscyA9IGZhbHNlXQoteyBib29sZWFuIGhsMjsgfQotICAgICAgICA6ICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVscz1hcmd1bWVudAotICAgICAgICAgICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BISBobDI9YXJndW1lbnQgICAgICAgICAgICAgeyBoYXNMYWJlbHMgfD0gaGwyOyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICApKgotICAgICAgICAgICAgICAgICAgICAgICAgeyNhcmdMaXN0ID0gIygjW0VMSVNULCJFTElTVCJdLCBhcmdMaXN0KTt9Ci0gICAgICAgICAgICAgICAgfCAgICAgICAvKm5vdGhpbmcqLwotICAgICAgICAgICAgICAgICAgICAgICAgeyNhcmdMaXN0ID0gI1tFTElTVCwiRUxJU1QiXTt9Ci0gICAgICAgICAgICAgICAgKQotCi0gICAgICAgICAgICAgICAgLy8gREVDSURFOiBBbGxvdyBhbiBleHRyYSB0cmFpbGluZyBjb21tYSwgZm9yIGVhc3kgZWRpdGluZyBvZiBsb25nIGxpc3RzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgYXBwbGllcyB1bmlmb3JtbHkgdG8gW3gseSxdIGFuZCAoeCx5LCkuICBJdCBpcyBpbnNwaXJlZCBieSBKYXZhJ3MgYVtdID0ge3gseSx9LgotICAgICAgICAgICAgICAgICggICBDT01NQSEgICk/Ci0gICAgICAgIDsKLQotLyoqIEEgc2luZ2xlIGFyZ3VtZW50IGluICguLi4pIG9yIFsuLi5dLiAgQ29ycmVzcG9uZHMgdG8gdG8gYSBtZXRob2Qgb3IgY2xvc3VyZSBwYXJhbWV0ZXIuCi0gKiAgTWF5IGJlIGxhYmVsZWQuICBNYXkgYmUgbW9kaWZpZWQgYnkgdGhlIHNwcmVhZCBvciBvcHRpb25hbGl0eSBvcGVyYXRvcnMgKiwgPy4KLSAqLwotYXJndW1lbnQKLXJldHVybnMgW2Jvb2xlYW4gaGFzTGFiZWwgPSBmYWxzZV0KLSAgICAgICAgOgotICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsIGFyZ3VtZW50IGxhYmVsLgotICAgICAgICAgICAgICAgIC8vIFVzYWdlOiAgU3BlY2lmaWVzIGEgbWFwIGtleSwgb3IgYSBrZXl3b3JkZWQgYXJndW1lbnQuCi0gICAgICAgICAgICAgICAgKCAgIChhcmd1bWVudExhYmVsU3RhcnQpID0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudExhYmVsIGM6Q09MT05eICAgICAgICAgICAgICAgICAgeyNjLnNldFR5cGUoTEFCRUxFRF9BUkcpO30KLSAgICAgICAgICAgICAgICApPwotCi0gICAgICAgICAgICAgICAgKCAgICAgICAvLyBTcHJlYWQgb3BlcmF0b3I6ICBmKCpbYSxiLGNdKSAgPT09ICBmKGEsYixjKTsgIGYoMSwqbnVsbCwyKSAgPT09ICBmKDEsMikuCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDpTVEFSXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNzcC5zZXRUeXBlKFNQUkVBRF9BUkcpO30KLSAgICAgICAgICAgICAgICB8ICAgICAgIC8vIE9wdGlvbmFsLW51bGwgb3BlcmF0b3I6ICBmKDEsP3gsMikgID09PSAgKHg9PW51bGwpP2YoMSwyKTpmKDEseCwyKQotICAgICAgICAgICAgICAgICAgICAgICAgb3A6UVVFU1RJT05eICAgICAgICAgICAgICAgICAgICB7I29wLnNldFR5cGUoT1BUSU9OQUxfQVJHKTt9Ci0gICAgICAgICAgICAgICAgKT8KLQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24KLSAgICAgICAgOwotCi0vKiogQSBsYWJlbCBmb3IgYW4gYXJndW1lbnQgaXMgb2YgdGhlIGZvcm0gYTpiLCAnYSc6YiwgImEiOmIsIG9yIChhKTpiLgotICogICAgICBUaGUgbGFiZWxzIGluIChhOmIpLCAoJ2EnOmIpLCBhbmQgKCJhIjpiKSBhcmUgaW4gYWxsIHdheXMgZXF1aXZhbGVudCwKLSAqICAgICAgZXhjZXB0IHRoYXQgdGhlIHF1b3RlcyBhbGxvdyBtb3JlIHNwZWxsaW5ncy4KLSAqICBFcXVpdmFsZW50IGR5bmFtaWNhbGx5IGNvbXB1dGVkIGxhYmVscyBhcmUgKCgnYScpOmIpIGFuZCAoIiR7J2EnfSI6YikKLSAqICBidXQgbm90ICgoYSk6Yikgb3IgIiRhIjpiLCBzaW5jZSB0aGUgbGF0dGVyIGNhc2VzIGV2YWx1YXRlIChhKSBhcyBhIG5vcm1hbCBpZGVudGlmaWVyLgotICogICAgICBCb3R0b20gbGluZTogIElmIHlvdSB3YW50IGEgdHJ1bHkgdmFyaWFibGUgbGFiZWwsIHVzZSBwYXJlbnMgYW5kIHNheSAoKGEpOmIpLgotICovCi1hcmd1bWVudExhYmVsCi0gICAgICAgIDogICBTVFJJTkdfTElURVJBTAotICAgICAgICB8ICAgaWQ6SURFTlQgICAgICAgICAgICAgICAgICAgIHsjaWQuc2V0VHlwZShTVFJJTkdfTElURVJBTCk7fSAgLy8gaWRlbnRpZmllcnMgYXJlIHNlbGYtcXVvdGluZyBpbiB0aGlzIGNvbnRleHQKLSAgICAgICAgfCAgIHN0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIGV4cHJlc3Npb24KLSAgICAgICAgfCAgIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZXhwcmVzc2lvbgotICAgICAgICA7Ci0KLS8qKiBGb3IgbG9va2FoZWFkIG9ubHkuICBGYXN0IGFwcHJveGltYXRlIHBhcnNlIG9mIGEgc3RhdGVtZW50TGFiZWwgZm9sbG93ZWQgYnkgYSBjb2xvbi4gKi8KLWFyZ3VtZW50TGFiZWxTdGFydCEKLSAgICAgICAgOiAgICggSURFTlQgfCBTVFJJTkdfTElURVJBTCB8IChMUEFSRU4gfCBTVFJJTkdfQ1RPUl9TVEFSVCk9PiBiYWxhbmNlZEJyYWNrZXRzICkgQ09MT04KLSAgICAgICAgOwotCi0vKk9CUyoKLW5ld0FycmF5RGVjbGFyYXRvcgotCToJKAotCQkJLy8gQ09ORkxJQ1Q6Ci0JCQkvLyBuZXdFeHByZXNzaW9uIGlzIGEgcHJpbWFyeUV4cHJlc3Npb24gd2hpY2ggY2FuIGJlCi0JCQkvLyBmb2xsb3dlZCBieSBhbiBhcnJheSBpbmRleCByZWZlcmVuY2UuIFRoaXMgaXMgb2ssCi0JCQkvLyBhcyB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBzdGF5IGluIHRoaXMgbG9vcCBhcwotCQkJLy8gbG9uZyBhcyBpdCBzZWVzIGFuIExCUkFDSyAocHJvcGVyIGJlaGF2aW9yKQotCQkJb3B0aW9ucyB7Ci0JCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJfQotCQk6Ci0JCQlsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9Ci0JCQkJKGV4cHJlc3Npb24pPwotCQkJUkJSQUNLIQotCQkpKwotCTsKLSpPQlMqLwotCi1jb25zdGFudAotICAgICAgICA6ICAgICAgIE5VTV9JTlQKLSAgICAgICAgfCAgICAgICBTVFJJTkdfTElURVJBTAotICAgICAgICB8ICAgICAgIE5VTV9GTE9BVAotICAgICAgICB8ICAgICAgIE5VTV9MT05HCi0gICAgICAgIHwgICAgICAgTlVNX0RPVUJMRQotICAgICAgICB8ICAgTlVNX0JJR19JTlQKLSAgICAgICAgfCAgIE5VTV9CSUdfREVDSU1BTAotICAgICAgICA7Ci0KLS8qKiBGYXN0IGxvb2thaGVhZCBhY3Jvc3MgYmFsYW5jZWQgYnJhY2tldHMgb2YgYWxsIHNvcnRzLiAqLwotYmFsYW5jZWRCcmFja2V0cyEKLSAgICAgICAgOiAgIExQQVJFTiBiYWxhbmNlZFRva2VucyBSUEFSRU4KLSAgICAgICAgfCAgIExCUkFDSyBiYWxhbmNlZFRva2VucyBSQlJBQ0sKLSAgICAgICAgfCAgIExDVVJMWSBiYWxhbmNlZFRva2VucyBSQ1VSTFkKLSAgICAgICAgfCAgIFNUUklOR19DVE9SX1NUQVJUIGJhbGFuY2VkVG9rZW5zIFNUUklOR19DVE9SX0VORAotICAgICAgICA7Ci0KLWJhbGFuY2VkVG9rZW5zIQotICAgICAgICA6ICAgKCAgIGJhbGFuY2VkQnJhY2tldHMKLSAgICAgICAgICAgICAgICB8ICAgfihMUEFSRU58TEJSQUNLfExDVVJMWSB8IFNUUklOR19DVE9SX1NUQVJUCi0gICAgICAgICAgICAgICAgICAgICB8UlBBUkVOfFJCUkFDS3xSQ1VSTFkgfCBTVFJJTkdfQ1RPUl9FTkQpCi0gICAgICAgICAgICAgICAgKSoKLSAgICAgICAgOwotCi1iYWxhbmNlZFRva2Vuc05vU2VwIQotICAgICAgICA6ICAgKCAgIGJhbGFuY2VkQnJhY2tldHMKLSAgICAgICAgICAgICAgICB8ICAgfihMUEFSRU58TEJSQUNLfExDVVJMWSB8IFNUUklOR19DVE9SX1NUQVJUCi0gICAgICAgICAgICAgICAgICAgICB8UlBBUkVOfFJCUkFDS3xSQ1VSTFkgfCBTVFJJTkdfQ1RPUl9FTkQgICAgIHwgU0VNSXxOTFMpCi0gICAgICAgICAgICAgICAgKSoKLSAgICAgICAgOwotCi0vKiogQSBzdGF0ZW1lbnQgc2VwYXJhdG9yIGlzIGVpdGhlciBhIHNlbWljb2xvbiBvciBhIHNpZ25pZmljYW50IG5ld2xpbmUuIAotICogIEFueSBudW1iZXIgb2YgYWRkaXRpb25hbCAoaW5zaWduaWZpY2FudCkgbmV3bGluZXMgbWF5IGFjY29tcGFueSBpdC4KLSAqICAoQWxsIHRoZSAnIScgc2lnbnMgc2ltcGx5IHN1cHByZXNzIHRoZSBkZWZhdWx0IEFTVCBidWlsZGluZy4pCi0gKi8KLXNlcCEKLSAgICAgICAgOiAgIFNFTUkhIG5scyEKLSAgICAgICAgfCAgIE5MUyEgICAgICAgICAgICAgICAgLy8gdGhpcyBuZXdsaW5lIGlzIHNpZ25pZmljYW50IQotICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfToKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFTUkhIG5scyEgICAgICAvLyB0aGlzIHN1cGVyZmx1b3VzIHNlbWljb2xvbiBpcyBnb2JibGVkCi0gICAgICAgICAgICAgICAgKT8KLSAgICAgICAgOwotCi0vKiogWmVybyBvciBtb3JlIGluc2lnbmlmaWNhbnQgbmV3bGluZXMsIGFsbCBnb2JibGVkIHVwIGFuZCB0aHJvd24gYXdheS4gKi8KLW5scyEgICAgOgotICAgICAgICAgICAgICAgIChvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH06IE5MUyEpPwotICAgICAgICA7Ci0KLQotLy8gVE8gRE86IGRlY2xhcmF0aW9ucyBpbiBleHByZXNzaW9uIHBvc2l0aW9uCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhlIEdyb292eSBzY2FubmVyCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIEdyb292eUxleGVyIGV4dGVuZHMgTGV4ZXI7Ci0KLW9wdGlvbnMgewotCWV4cG9ydFZvY2FiPUdyb292eTsJCS8vIGNhbGwgdGhlIHZvY2FidWxhcnkgIkdyb292eSIKLQl0ZXN0TGl0ZXJhbHM9ZmFsc2U7CQkvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCi0Jaz00OwkJCQkJLy8gZm91ciBjaGFyYWN0ZXJzIG9mIGxvb2thaGVhZAotCWNoYXJWb2NhYnVsYXJ5PSdcdTAwMDMnLi4nXHVGRkZGJzsKLQkvLyB3aXRob3V0IGlubGluaW5nIHNvbWUgYml0c2V0IHRlc3RzLCBjb3VsZG4ndCBkbyB1bmljb2RlOwotCS8vIEkgbmVlZCB0byBtYWtlIEFOVExSIGdlbmVyYXRlIHNtYWxsZXIgYml0c2V0czsgc2VlCi0JLy8gYm90dG9tIG9mIEdyb292eUxleGVyLmphdmEKLQljb2RlR2VuQml0c2V0VGVzdFRocmVzaG9sZD0yMDsKLX0KLQotewotCS8qKiBmbGFnIGZvciBlbmFibGluZyB0aGUgImFzc2VydCIga2V5d29yZCAqLwotCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRFbmFibGVkID0gdHJ1ZTsKLQkvKiogZmxhZyBmb3IgZW5hYmxpbmcgdGhlICJlbnVtIiBrZXl3b3JkICovCi0JcHJpdmF0ZSBib29sZWFuIGVudW1FbmFibGVkID0gdHJ1ZTsKLQotCS8qKiBFbmFibGUgdGhlICJhc3NlcnQiIGtleXdvcmQgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVBc3NlcnQoYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgYXNzZXJ0RW5hYmxlZCA9IHNob3VsZEVuYWJsZTsgfQotCS8qKiBRdWVyeSB0aGUgImFzc2VydCIga2V5d29yZCBzdGF0ZSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzZXJ0RW5hYmxlZCgpIHsgcmV0dXJuIGFzc2VydEVuYWJsZWQ7IH0KLQkvKiogRW5hYmxlIHRoZSAiZW51bSIga2V5d29yZCAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUVudW0oYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgZW51bUVuYWJsZWQgPSBzaG91bGRFbmFibGU7IH0KLQkvKiogUXVlcnkgdGhlICJlbnVtIiBrZXl3b3JkIHN0YXRlICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnVtRW5hYmxlZCgpIHsgcmV0dXJuIGVudW1FbmFibGVkOyB9Ci0KLQotLyoqIEJ1bXBlZCB3aGVuIGluc2lkZSAnW3hdJyBvciAnKHgpJywgcmVzZXQgaW5zaWRlICd7eH0nLiAgU2VlIE9ORV9OTC4gICovCi0JcHJvdGVjdGVkIGludCBwYXJlbkxldmVsID0gMDsKLQlwcm90ZWN0ZWQgaW50IHN1cHByZXNzTmV3bGluZSA9IDA7ICAvLyBiZSByZWFsbHkgbWVhbiB0byBuZXdsaW5lcyBpbnNpZGUgc3RyaW5ncwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNDU19UUklQTEUgPSAxLCBTQ1NfVkFMID0gMiwgU0NTX0xJVCA9IDQsIFNDU19MSU1JVCA9IDg7Ci0JcHJvdGVjdGVkIGludCBzdHJpbmdDdG9yU3RhdGUgPSAwOyAgLy8gaGFjayBzdHJpbmcgY29uc3RydWN0b3IgYm91bmRhcmllcwotCS8qKiBQdXNoIHBhcmVuTGV2ZWwgaGVyZSBhbmQgcmVzZXQgd2hlbmV2ZXIgaW5zaWRlICd7eH0nLiAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgcGFyZW5MZXZlbFN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5iYWRUb2tlbjsKLQotCXByb3RlY3RlZCB2b2lkIHB1c2hQYXJlbkxldmVsKCkgewotCQlwYXJlbkxldmVsU3RhY2suYWRkKG5ldyBJbnRlZ2VyKHBhcmVuTGV2ZWwqOCArIHN0cmluZ0N0b3JTdGF0ZSkpOwotCQlwYXJlbkxldmVsID0gMDsKLQkJc3RyaW5nQ3RvclN0YXRlID0gMDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcG9wUGFyZW5MZXZlbCgpIHsKLQkJaW50IG5wbCA9IHBhcmVuTGV2ZWxTdGFjay5zaXplKCk7Ci0JCWlmIChucGwgPT0gMCkgIHJldHVybjsKLQkJaW50IGkgPSAoKEludGVnZXIpIHBhcmVuTGV2ZWxTdGFjay5yZW1vdmUoLS1ucGwpKS5pbnRWYWx1ZSgpOwotCQlwYXJlbkxldmVsICAgICAgPSBpIC8gU0NTX0xJTUlUOwotCQlzdHJpbmdDdG9yU3RhdGUgPSBpICUgU0NTX0xJTUlUOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXN0YXJ0U3RyaW5nQ3Rvcihib29sZWFuIGV4cGVjdExpdGVyYWwpIHsKLQkJaWYgKHN0cmluZ0N0b3JTdGF0ZSAhPSAwKSB7Ci0JCQlzdHJpbmdDdG9yU3RhdGUgPSAoZXhwZWN0TGl0ZXJhbD8gU0NTX0xJVDogU0NTX1ZBTCkgKyAoc3RyaW5nQ3RvclN0YXRlICYgU0NTX1RSSVBMRSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld2xpbmVDaGVjaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBwcmVzc05ld2xpbmUgPiAwKSB7Ci0JCQlzdXBwcmVzc05ld2xpbmUgPSAwOwotCQkJcmVxdWlyZShzdXBwcmVzc05ld2xpbmUgPT0gMCwKLQkJCQkiZW5kIG9mIGxpbmUgcmVhY2hlZCB3aXRoaW4gYSBzaW1wbGUgc3RyaW5nICd4JyBvciBcInhcIiIsCi0JCQkJImZvciBtdWx0aS1saW5lIGxpdGVyYWxzLCB1c2UgdHJpcGxlIHF1b3RlcyAnJyd4JycnIG9yIFwiXCJcInhcIlwiXCIiKTsKLQkJfQotCQluZXdsaW5lKCk7Ci0JfQotCQotCS8qKiBUaGlzIGlzIGEgYml0IG9mIHBsdW1iaW5nIHdoaWNoIHJlc3VtZXMgY29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RydWN0b3IgYm9kaWVzLAotCSAqICBhZnRlciBhbiBlbWJlZGRlZCBleHByZXNzaW9uIGhhcyBiZWVuIHBhcnNlZC4KLQkgKiAgVXNhZ2U6ICBuZXcgR3Jvb3Z5UmVjb2duaXplcihuZXcgR3Jvb3Z5TGV4ZXIoaW4pLnBsdW1iKCkpLgotCSAqLwotCXB1YmxpYyBUb2tlblN0cmVhbSBwbHVtYigpIHsKLQkJcmV0dXJuIG5ldyBUb2tlblN0cmVhbSgpIHsKLQkJCXB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24gewotCQkJCWlmIChzdHJpbmdDdG9yU3RhdGUgPj0gU0NTX0xJVCkgewotCQkJCQkvLyBUaGlzIGdvbyBpcyBtb2RlbGVkIHVwb24gdGhlIEFOVExSIGNvZGUgZm9yIG5leHRUb2tlbjoKLQkJCQkJYm9vbGVhbiB0cmlwbGVRdW90ZSA9IChzdHJpbmdDdG9yU3RhdGUgJiBTQ1NfVFJJUExFKSAhPSAwOwotCQkJCQlzdHJpbmdDdG9yU3RhdGUgPSAwOyAgLy8gZ2V0IG91dCBvZiB0aGlzIG1vZGUsIG5vdwotCQkJCQlyZXNldFRleHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1TVFJJTkdfQ1RPUl9FTkQodHJ1ZSwgLypmcm9tU3RhcnQ6Ki9mYWxzZSwgdHJpcGxlUXVvdGUpOwotCQkJCQkJcmV0dXJuIGxhc3RUb2tlbiA9IF9yZXR1cm5Ub2tlbjsKLQkJCQkJfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7Ci0JCQkJCX0gY2F0Y2ggKENoYXJTdHJlYW1FeGNlcHRpb24gY3NlKSB7Ci0JCQkJCQlpZiAoIGNzZSBpbnN0YW5jZW9mIENoYXJTdHJlYW1JT0V4Y2VwdGlvbiApIHsKLQkJCQkJCQl0aHJvdyBuZXcgVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbigoKENoYXJTdHJlYW1JT0V4Y2VwdGlvbiljc2UpLmlvKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRocm93IG5ldyBUb2tlblN0cmVhbUV4Y2VwdGlvbihjc2UuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbGFzdFRva2VuID0gR3Jvb3Z5TGV4ZXIudGhpcy5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyBzdHVmZiB0byBhZGp1c3QgQU5UTFIncyB0cmFjaW5nIG1hY2hpbmVyeQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cmFjaW5nID0gZmFsc2U7ICAvLyBvbmx5IGVmZmVjdGl2ZSBpZiBhbnRsci5Ub29sIGlzIHJ1biB3aXRoIC10cmFjZUxleGVyCi0gICAgcHVibGljIHZvaWQgdHJhY2VJbihTdHJpbmcgcm5hbWUpIHRocm93cyBDaGFyU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFHcm9vdnlMZXhlci50cmFjaW5nKSAgcmV0dXJuOwotICAgICAgICBzdXBlci50cmFjZUluKHJuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJuYW1lKSB0aHJvd3MgQ2hhclN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghR3Jvb3Z5TGV4ZXIudHJhY2luZykgIHJldHVybjsKLSAgICAgICAgaWYgKF9yZXR1cm5Ub2tlbiAhPSBudWxsKSAgcm5hbWUgKz0gdG9rZW5TdHJpbmdPZihfcmV0dXJuVG9rZW4pOwotICAgICAgICBzdXBlci50cmFjZU91dChybmFtZSk7Ci0gICAgfQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIHR0eXBlczsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9rZW5TdHJpbmdPZihUb2tlbiB0KSB7Ci0JCWlmICh0dHlwZXMgPT0gbnVsbCkgewotCQkJamF2YS51dGlsLkhhc2hNYXAgbWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGZpZWxkcyA9IEdyb292eVRva2VuVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpZWxkc1tpXS5nZXRUeXBlKCkgIT0gaW50LmNsYXNzKSAgY29udGludWU7Ci0JCQkJdHJ5IHsKLQkJCQkJbWFwLnB1dChmaWVsZHNbaV0uZ2V0KG51bGwpLCBmaWVsZHNbaV0uZ2V0TmFtZSgpKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGVlKSB7Ci0JCQkJfQotCQkJfQotCQkJdHR5cGVzID0gbWFwOwotCQl9Ci0JCUludGVnZXIgdHQgPSBuZXcgSW50ZWdlcih0LmdldFR5cGUoKSk7Ci0JCU9iamVjdCB0dG4gPSB0dHlwZXMuZ2V0KHR0KTsKLQkJaWYgKHR0biA9PSBudWxsKSAgdHRuID0gIjwiK3R0KyI+IjsKLQkJcmV0dXJuICJbIit0dG4rIixcIiIrdC5nZXRUZXh0KCkrIlwiXSI7Ci0JfQotCi0JcHJvdGVjdGVkIEdyb292eVJlY29nbml6ZXIgcGFyc2VyOyAgLy8gbGl0dGxlLXVzZWQgbGluazsgVE8gRE86IGdldCByaWQgb2YKLQlwcml2YXRlIHZvaWQgcmVxdWlyZShib29sZWFuIHosIFN0cmluZyBwcm9ibGVtLCBTdHJpbmcgc29sdXRpb24pIHRocm93cyBTZW1hbnRpY0V4Y2VwdGlvbiB7Ci0JCS8vIFRPIERPOiBEaXJlY3QgdG8gYSBjb21tb24gZXJyb3IgaGFuZGxlciwgcmF0aGVyIHRoYW4gdGhyb3VnaCB0aGUgcGFyc2VyLgotCQlpZiAoIXopICBwYXJzZXIucmVxdWlyZUZhaWxlZChwcm9ibGVtLCBzb2x1dGlvbik7Ci0JfQotfQotCi0vLyBUTyBETzogIFJlZ2V4cCBvcHMsIHJhbmdlIG9wcywgQm9ybmVvLXN0eWxlIG9wcy4KLQotLyogKlRPRE8qCi1ET1QgKHdpdGggZG91YmxlIGFuZCB0cmlwbGUgZG90KSBpcyBhbiBvcmRpbmFyeSBvcGVyYXRvcgotdG9rZW47IGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjb21tZW50ZWQgb3V0LgotKi8KLQotLy8gT1BFUkFUT1JTCi1RVUVTVElPTgkJOgknPycJCTsKLUxQQVJFTgkJCToJJygnCQl7KytwYXJlbkxldmVsO307Ci1SUEFSRU4JCQk6CScpJwkJey0tcGFyZW5MZXZlbDt9OwotTEJSQUNLCQkJOgknWycJCXsrK3BhcmVuTGV2ZWw7fTsKLVJCUkFDSwkJCToJJ10nCQl7LS1wYXJlbkxldmVsO307Ci1MQ1VSTFkJCQk6CSd7JwkJe3B1c2hQYXJlbkxldmVsKCk7fTsKLVJDVVJMWQkJCToJJ30nCQl7cG9wUGFyZW5MZXZlbCgpOyBpZihzdHJpbmdDdG9yU3RhdGUhPTApIHJlc3RhcnRTdHJpbmdDdG9yKHRydWUpO307Ci1DT0xPTgkJCToJJzonCQk7Ci1DT01NQQkJCToJJywnCQk7Ci1ET1QJCQk6CScuJwkJOwotQVNTSUdOCQkJOgknPScJCTsKLUVRVUFMCQkJOgkiPT0iCTsKLUxOT1QJCQk6CSchJwkJOwotQk5PVAkJCToJJ34nCQk7Ci1OT1RfRVFVQUwJCToJIiE9Igk7Ci1ESVYJCQkJOgknLycJCTsKLURJVl9BU1NJR04JCToJIi89Igk7Ci1QTFVTCQkJOgknKycJCTsKLVBMVVNfQVNTSUdOCQk6CSIrPSIJOwotSU5DCQkJCToJIisrIgk7Ci1NSU5VUwkJCToJJy0nCQk7Ci1NSU5VU19BU1NJR04JOgkiLT0iCTsKLURFQwkJCQk6CSItLSIJOwotU1RBUgkJCToJJyonCQk7Ci1TVEFSX0FTU0lHTgkJOgkiKj0iCTsKLU1PRAkJCQk6CSclJwkJOwotTU9EX0FTU0lHTgkJOgkiJT0iCTsKLVNSCQkJCToJIj4+Igk7Ci1TUl9BU1NJR04JCToJIj4+PSIJOwotQlNSCQkJCToJIj4+PiIJOwotQlNSX0FTU0lHTgkJOgkiPj4+PSIJOwotR0UJCQkJOgkiPj0iCTsKLUdUCQkJCToJIj4iCQk7Ci1TTAkJCQk6CSI8PCIJOwotU0xfQVNTSUdOCQk6CSI8PD0iCTsKLUxFCQkJCToJIjw9Igk7Ci1MVAkJCQk6CSc8JwkJOwotQlhPUgkJCToJJ14nCQk7Ci1CWE9SX0FTU0lHTgkJOgkiXj0iCTsKLUJPUgkJCQk6CSd8JwkJOwotQk9SX0FTU0lHTgkJOgkifD0iCTsKLUxPUgkJCQk6CSJ8fCIJOwotQkFORAkJCToJJyYnCQk7Ci1CQU5EX0FTU0lHTgkJOgkiJj0iCTsKLUxBTkQJCQk6CSImJiIJOwotU0VNSQkJCToJJzsnCQk7Ci1ET0xMQVIgICAgICAgICAgICAgICAgICA6ICAgICAgICckJyAgICAgICAgICAgICA7Ci1SQU5HRV9JTkNMVVNJVkUJCTogICAgICAgIi4uIiAgICA7Ci0KLS8vIFdoaXRlc3BhY2UgLS0gaWdub3JlZAotV1MgICAgICA6ICAgICAgICgKLSAgICAgICAgICAgICAgICBvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH06Ci0gICAgICAgICAgICAgICAgICAgICAgICAnICcKLSAgICAgICAgICAgICAgICB8ICAgICAgICdcdCcKLSAgICAgICAgICAgICAgICB8ICAgICAgICdcZicKLSAgICAgICAgICAgICAgICApKwotICAgICAgICAgICAgICAgIHsgX3R0eXBlID0gVG9rZW4uU0tJUDsgfQotICAgICAgICA7Ci0KLXByb3RlY3RlZAotT05FX05MISA6ICAgICAgIC8vIGhhbmRsZSBuZXdsaW5lcywgd2hpY2ggYXJlIHNpZ25pZmljYW50IGluIEdyb292eQotICAgICAgICAgICAgICAgICggICAgICAgb3B0aW9ucyB7Z2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlO30KLSAgICAgICAgICAgICAgICA6ICAgICAgICJcclxuIiAgLy8gRXZpbCBET1MKLSAgICAgICAgICAgICAgICB8ICAgICAgICdccicgICAgLy8gTWFjaW50b3NoCi0gICAgICAgICAgICAgICAgfCAgICAgICAnXG4nICAgIC8vIFVuaXggKHRoZSByaWdodCB3YXkpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZvciBlcnJvciByZXBvcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVDaGVjaygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgOwotICAgICAgICAKLS8vIEdyb3VwIGFueSBudW1iZXIgb2YgbmV3bGluZXMgKHdpdGggY29tbWVudHMgYW5kIHdoaXRlc3BhY2UpIGludG8gYSBzaW5nbGUgdG9rZW4uCi0vLyBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBwYXJzZXIgbG9va2FoZWFkIHJlcXVpcmVkIHRvIHBhcnNlIGFyb3VuZCBuZXdsaW5lcy4KLS8vIEl0IGlzIGFuIGludmFyaWFudCB0aGF0IHRoZSBwYXJzZXIgbmV2ZXIgc2VlcyBOTFMgdG9rZW5zIGJhY2stdG8tYmFjay4KLU5MUyAgICAgOiAgICAgICAKLSAgICAgICAgICAgICAgICAoICAgICAgIE9ORV9OTAotICAgICAgICAgICAgICAgICAgICAgICAgKFdTIHwgU0xfQ09NTUVOVCB8IE1MX0NPTU1FTlQpKgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGdvYmJsZSwgZ29iYmxlKSoKLSAgICAgICAgICAgICAgICApKwotICAgICAgICAgICAgICAgIC8vIEluc2lkZSAoLi4uKSBhbmQgWy4uLl0gYnV0IG5vdCB7Li4ufSwgaWdub3JlIG5ld2xpbmVzLgotICAgICAgICAgICAgICAgIHsgICBpZiAocGFyZW5MZXZlbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZXRUeXBlKFRva2VuLlNLSVApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNldFRleHQoIjxsaW5ldGVybT4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIDsKLQotLy8gU2luZ2xlLWxpbmUgY29tbWVudHMKLVNMX0NPTU1FTlQKLSAgICAgICAgOiAgICAgICAiLy8iCi0gICAgICAgICAgICAgICAgKH4oJ1xuJ3wnXHInKSkqCi0gICAgICAgICAgICAgICAgeyRzZXRUeXBlKFRva2VuLlNLSVApO30KLSAgICAgICAgICAgICAgICBPTkVfTkwKLSAgICAgICAgOwotCi0vLyBtdWx0aXBsZS1saW5lIGNvbW1lbnRzCi1NTF9DT01NRU5UCi0JOgkiLyoiCi0JCSgJLyoJJ1xyJyAnXG4nIGNhbiBiZSBtYXRjaGVkIGluIG9uZSBhbHRlcm5hdGl2ZSBvciBieSBtYXRjaGluZwotCQkJCSdccicgaW4gb25lIGl0ZXJhdGlvbiBhbmQgJ1xuJyBpbiBhbm90aGVyLiBJIGFtIHRyeWluZyB0bwotCQkJCWhhbmRsZSBhbnkgZmxhdm9yIG9mIG5ld2xpbmUgdGhhdCBjb21lcyBpbiwgYnV0IHRoZSBsYW5ndWFnZQotCQkJCXRoYXQgYWxsb3dzIGJvdGggIlxyXG4iIGFuZCAiXHIiIGFuZCAiXG4iIHRvIGFsbCBiZSB2YWxpZAotCQkJCW5ld2xpbmUgaXMgYW1iaWd1b3VzLiBDb25zZXF1ZW50bHksIHRoZSByZXN1bHRpbmcgZ3JhbW1hcgotCQkJCW11c3QgYmUgYW1iaWd1b3VzLiBJJ20gc2h1dHRpbmcgdGhpcyB3YXJuaW5nIG9mZi4KLQkJCSAqLwotCQkJb3B0aW9ucyB7Ci0JCQkJZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOwotCQkJfQotCQk6Ci0JCQkoICcqJyB+Jy8nICkgPT4gJyonCi0JCXwJJ1xyJyAnXG4nCQl7bmV3bGluZUNoZWNrKCk7fQotCQl8CSdccicJCQl7bmV3bGluZUNoZWNrKCk7fQotCQl8CSdcbicJCQl7bmV3bGluZUNoZWNrKCk7fQotCQl8CX4oJyonfCdcbid8J1xyJykKLQkJKSoKLQkJIiovIgotCQl7JHNldFR5cGUoVG9rZW4uU0tJUCk7fQotCTsKLQotCi0vLyBzdHJpbmcgbGl0ZXJhbHMKLVNUUklOR19MSVRFUkFMCi0gICAgICAgICAgICAgICAge2ludCB0dD0wO30KLSAgICAgICAgOiAgICgiJycnIikgPT4gIC8vLi4uc2h1dCBvZmYgYW1iaWd1aXR5IHdhcm5pbmcKLSAgICAgICAgICAgICAgICAiJycnIiEKLSAgICAgICAgICAgICAgICAoICAgU1RSSU5HX0NIIHwgRVNDIHwgJyInIHwgJyQnCi0gICAgICAgICAgICAgICAgfCAgICAgICAoJ1wnJyAofidcJycgfCAnXCcnIH4nXCcnKSkgPT4gJ1wnJyAgLy8gYWxsb3cgMSBvciAyIGNsb3NlIHF1b3RlcwotICAgICAgICAgICAgICAgICkqCi0gICAgICAgICAgICAgICAgIicnJyIhCi0gICAgICAgIHwgICAgICAgJ1wnJyEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KytzdXBwcmVzc05ld2xpbmU7fQotICAgICAgICAgICAgICAgICggICBTVFJJTkdfQ0ggfCBFU0MgfCAnIicgfCAnJCcgICkqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0tc3VwcHJlc3NOZXdsaW5lO30KLSAgICAgICAgICAgICAgICAnXCcnIQotICAgICAgICB8ICAgKCJcIlwiXCIiKSA9PiAgLy8uLi5zaHV0IG9mZiBhbWJpZ3VpdHkgd2FybmluZwotICAgICAgICAgICAgICAgICJcIlwiXCIiIQotICAgICAgICAgICAgICAgIHR0PVNUUklOR19DVE9SX0VORFt0cnVlLCAvKnRyaXBsZVF1b3RlOiovIHRydWVdCi0gICAgICAgICAgICAgICAgeyRzZXRUeXBlKHR0KTt9Ci0gICAgICAgIHwgICAgICAgJyInIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsrK3N1cHByZXNzTmV3bGluZTt9Ci0gICAgICAgICAgICAgICAgdHQ9U1RSSU5HX0NUT1JfRU5EW3RydWUsIC8qdHJpcGxlUXVvdGU6Ki8gZmFsc2VdCi0gICAgICAgICAgICAgICAgeyRzZXRUeXBlKHR0KTt9Ci0gICAgICAgIDsKLQotcHJvdGVjdGVkCi1TVFJJTkdfQ1RPUl9FTkRbYm9vbGVhbiBmcm9tU3RhcnQsIGJvb2xlYW4gdHJpcGxlUXVvdGVdCi1yZXR1cm5zIFtpbnQgdHQ9U1RSSU5HX0NUT1JfRU5EXQotICAgICAgICA6Ci0gICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7ICBncmVlZHkgPSB0cnVlOyAgfToKLSAgICAgICAgICAgICAgICAgICAgU1RSSU5HX0NIIHwgRVNDIHwgJ1wnJwotICAgICAgICAgICAgICAgIHwgICAoJyInICh+JyInIHwgJyInIH4nIicpKT0+IHt0cmlwbGVRdW90ZX0/ICciJyAgLy8gYWxsb3cgMSBvciAyIGNsb3NlIHF1b3RlcwotICAgICAgICAgICAgICAgICkqCi0gICAgICAgICAgICAgICAgKCAgICAgICAoICAgeyAhdHJpcGxlUXVvdGUgfT8gIlwiIiEKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICB7ICB0cmlwbGVRdW90ZSB9PyAiXCJcIlwiIiEKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21TdGFydCkgICAgICB0dCA9IFNUUklOR19MSVRFUkFMOyAgLy8gcGxhaW4gc3RyaW5nIGxpdGVyYWwhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpcGxlUXVvdGUpICAgICAgIHstLXN1cHByZXNzTmV3bGluZTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgd2l0aCBzdHJpbmcgY29uc3RydWN0b3IhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXNzZXJ0KHN0cmluZ0N0b3JTdGF0ZSA9PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB8ICAgJyQnIQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKCcqJyk/ICgneycgfCBMRVRURVIpKSA9PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGMgPSBMQShrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxjID09ICcqJykgIGxjID0gTEEoKytrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShsYyA9PSAneycgfHwgKGxjICE9ICckJyAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGxjKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBzdHJpbmcgYm9keSBjaGFyYWN0ZXIgYWZ0ZXIgZG9sbGFyIHNpZ24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVpdGhlciBlc2NhcGUgYSBsaXRlcmFsIGRvbGxhciBzaWduIFwiXFwkNVwiIG9yIGJyYWNrZXQgdGhlIHZhbHVlIGV4cHJlc3Npb24gXCIkezV9XCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVzLCBpdCdzIGEgc3RyaW5nIGNvbnN0cnVjdG9yLCBhbmQgd2UndmUgZ290IGEgdmFsdWUgcGFydC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSAoZnJvbVN0YXJ0ID8gU1RSSU5HX0NUT1JfU1RBUlQgOiBTVFJJTkdfQ1RPUl9NSURETEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdDdG9yU3RhdGUgPSBTQ1NfVkFMICsgKHRyaXBsZVF1b3RlPyBTQ1NfVFJJUExFOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgeyAgICRzZXRUeXBlKHR0KTsgIH0KLSAgICAgICAgOwotCi1wcm90ZWN0ZWQKLVNUUklOR19DSAotICAgICAgICA6ICAgfignIid8J1wnJ3wnXFwnfCckJ3wnXG4nfCdccicpCi0gICAgICAgIDsKLQotLy8gZXNjYXBlIHNlcXVlbmNlIC0tIG5vdGUgdGhhdCB0aGlzIGlzIHByb3RlY3RlZDsgaXQgY2FuIG9ubHkgYmUgY2FsbGVkCi0vLyBmcm9tIGFub3RoZXIgbGV4ZXIgcnVsZSAtLSBpdCB3aWxsIG5vdCBldmVyIGRpcmVjdGx5IHJldHVybiBhIHRva2VuIHRvCi0vLyB0aGUgcGFyc2VyCi0vLyBUaGVyZSBhcmUgdmFyaW91cyBhbWJpZ3VpdGllcyBodXNoZWQgaW4gdGhpcyBydWxlLiBUaGUgb3B0aW9uYWwKLS8vICcwJy4uLic5JyBkaWdpdCBtYXRjaGVzIHNob3VsZCBiZSBtYXRjaGVkIGhlcmUgcmF0aGVyIHRoYW4gbGV0dGluZwotLy8gdGhlbSBnbyBiYWNrIHRvIFNUUklOR19MSVRFUkFMIHRvIGJlIG1hdGNoZWQuIEFOVExSIGRvZXMgdGhlCi0vLyByaWdodCB0aGluZyBieSBtYXRjaGluZyBpbW1lZGlhdGVseTsgaGVuY2UsIGl0J3Mgb2sgdG8gc2h1dCBvZmYKLS8vIHRoZSBGT0xMT1cgYW1iaWcgd2FybmluZ3MuCi1wcm90ZWN0ZWQKLUVTQwotCToJJ1xcJyEKLQkJKAknbicgICAgIHskc2V0VGV4dCgiXG4iKTt9Ci0JCXwJJ3InICAgICB7JHNldFRleHQoIlxyIik7fQotCQl8CSd0JyAgICAgeyRzZXRUZXh0KCJcdCIpO30KLQkJfAknYicgICAgIHskc2V0VGV4dCgiXGIiKTt9Ci0JCXwJJ2YnICAgICB7JHNldFRleHQoIlxmIik7fQotCQl8CSciJwotCQl8CSdcJycKLQkJfAknXFwnCi0JCXwJJyQnCS8vZXNjYXBlIEdyb292eSAkIG9wZXJhdG9yIHVuaWZvcm1seSBhbHNvCi0JCXwJKCd1JykrIHskc2V0VGV4dCgiIik7fQotCQkJCQlIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQKLQkJCQkJe2NoYXIgY2ggPSAoY2hhcilJbnRlZ2VyLnBhcnNlSW50KCRnZXRUZXh0LDE2KTsgJHNldFRleHQoY2gpO30KLQkJfAknMCcuLiczJwotCQkJKAotCQkJCW9wdGlvbnMgewotCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQkJfQotCQkJOgknMCcuLic3JwotCQkJCSgKLQkJCQkJb3B0aW9ucyB7Ci0JCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQk6CScwJy4uJzcnCi0JCQkJKT8KLQkJCSk/Ci0JCQkJCXtjaGFyIGNoID0gKGNoYXIpSW50ZWdlci5wYXJzZUludCgkZ2V0VGV4dC5zdWJzdHJpbmcoMSksOCk7ICRzZXRUZXh0KGNoKTt9Ci0JCXwJJzQnLi4nNycKLQkJCSgKLQkJCQlvcHRpb25zIHsKLQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotCQkJCX0KLQkJCToJJzAnLi4nNycKLQkJCSk/Ci0JCQkJe2NoYXIgY2ggPSAoY2hhcilJbnRlZ2VyLnBhcnNlSW50KCRnZXRUZXh0LnN1YnN0cmluZygxKSw4KTsgJHNldFRleHQoY2gpO30KLQkJKQotCXwhICAgICAgJ1xcJyBPTkVfTkwKLSAgICAgICAgfCEgICAgICBPTkVfTkwgICAgICAgICAgeyAkc2V0VGV4dCgnXG4nKTsgfSAgICAgICAgICAgICAvLyBhbHdheXMgbm9ybWFsaXplIHRvIG5ld2xpbmUKLQk7Ci0KLQotLy8gaGV4YWRlY2ltYWwgZGlnaXQgKGFnYWluLCBub3RlIGl0J3MgcHJvdGVjdGVkISkKLXByb3RlY3RlZAotSEVYX0RJR0lUCi0JOgkoJzAnLi4nOSd8J0EnLi4nRid8J2EnLi4nZicpCi0JOwotCi0KLS8vIGEgZHVtbXkgcnVsZSB0byBmb3JjZSB2b2NhYnVsYXJ5IHRvIGJlIGFsbCBjaGFyYWN0ZXJzIChleGNlcHQgc3BlY2lhbAotLy8gb25lcyB0aGF0IEFOVExSIHVzZXMgaW50ZXJuYWxseSAoMCB0byAyKQotcHJvdGVjdGVkCi1WT0NBQgotCToJJ1wzJy4uJ1wzNzcnCi0JOwotCi0KLS8vIGFuIGlkZW50aWZpZXIuIE5vdGUgdGhhdCB0ZXN0TGl0ZXJhbHMgaXMgc2V0IHRvIHRydWUhIFRoaXMgbWVhbnMKLS8vIHRoYXQgYWZ0ZXIgd2UgbWF0Y2ggdGhlIHJ1bGUsIHdlIGxvb2sgaW4gdGhlIGxpdGVyYWxzIHRhYmxlIHRvIHNlZQotLy8gaWYgaXQncyBhIGxpdGVyYWwgb3IgcmVhbGx5IGFuIGlkZW50aWZlcgotSURFTlQKLQlvcHRpb25zIHt0ZXN0TGl0ZXJhbHM9dHJ1ZTt9Ci0JOglMRVRURVIoTEVUVEVSfERJR0lUKSoKLQkJewotCQkJaWYgKHN0cmluZ0N0b3JTdGF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMQSgxKSA9PSAnLicgJiYgTEEoMikgIT0gJyQnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KExBKDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW5vdGhlciBuYW1lIGNvbXBvbmVudCBiZWZvcmUgZ29pbmcgbGl0ZXJhbCBhZ2FpbjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0U3RyaW5nQ3RvcihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gYmFjayB0byB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFN0cmluZ0N0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0dHlwZSA9IHRlc3RMaXRlcmFsc1RhYmxlKElERU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHlwZSAhPSBJREVOVCAmJiBsYXN0VG9rZW4uZ2V0VHlwZSgpID09IERPVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGZldyBrZXl3b3JkcyBjYW4gZm9sbG93IGEgZG90OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTElURVJBTF90aGlzOiBjYXNlIExJVEVSQUxfc3VwZXI6IGNhc2UgTElURVJBTF9jbGFzczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHlwZSA9IExJVEVSQUxfaW47ICAvLyB0aGUgcG9zdGVyIGNoaWxkIGZvciBiYWQgZG90dGVkIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzZXRUeXBlKHR0eXBlKTsKLQotCQkJLy8gY2hlY2sgaWYgImFzc2VydCIga2V5d29yZCBpcyBlbmFibGVkCi0JCQlpZiAoYXNzZXJ0RW5hYmxlZCAmJiAiYXNzZXJ0Ii5lcXVhbHMoJGdldFRleHQpKSB7Ci0JCQkJJHNldFR5cGUoTElURVJBTF9hc3NlcnQpOyAvLyBzZXQgdG9rZW4gdHlwZSBmb3IgdGhlIHJ1bGUgaW4gdGhlIHBhcnNlcgotCQkJfQotCQkJLy8gY2hlY2sgaWYgImVudW0iIGtleXdvcmQgaXMgZW5hYmxlZAotCQkJaWYgKGVudW1FbmFibGVkICYmICJlbnVtIi5lcXVhbHMoJGdldFRleHQpKSB7Ci0JCQkJJHNldFR5cGUoTElURVJBTF9lbnVtKTsgLy8gc2V0IHRva2VuIHR5cGUgZm9yIHRoZSBydWxlIGluIHRoZSBwYXJzZXIKLQkJCX0KLQkJfQotCTsKLQotcHJvdGVjdGVkCi1MRVRURVIKLSAgICAgICAgOiAgICdhJy4uJ3onfCdBJy4uJ1onfCdfJwotICAgICAgICAvLyBUTyBETzogIFJlY29nbml6ZSBhbGwgdGhlIEphdmEgaWRlbnRpZmllciBzdGFydHMgaGVyZSAoZXhjZXB0ICckJykuCi0gICAgICAgIDsKLQotcHJvdGVjdGVkCi1ESUdJVAotICAgICAgICA6ICAgJzAnLi4nOScKLSAgICAgICAgLy8gVE8gRE86ICBSZWNvZ25pemUgYWxsIHRoZSBKYXZhIGlkZW50aWZpZXIgcGFydHMgaGVyZSAoZXhjZXB0ICckJykuCi0gICAgICAgIDsKLQotLy8gYSBudW1lcmljIGxpdGVyYWwKLU5VTV9JTlQKLQl7Ym9vbGVhbiBpc0RlY2ltYWw9ZmFsc2U7IFRva2VuIHQ9bnVsbDt9Ci0JOgotLypPQlMqCi0JCScuJyB7X3R0eXBlID0gRE9UO30KLQkJCSgKLQkJCQkoKCcwJy4uJzknKSsgKEVYUE9ORU5UKT8gKGYxOkZMT0FUX1NVRkZJWCB7dD1mMTt9KT8KLQkJCQl7Ci0JCQkJaWYgKHQgIT0gbnVsbCAmJiB0LmdldFRleHQoKS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ0YnKT49MCkgewotCQkJCQlfdHR5cGUgPSBOVU1fRkxPQVQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCi0JCQkJfQotCQkJCX0pCi0JCQkJfAotCQkJCS8vIEpESyAxLjUgdG9rZW4gZm9yIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMKLQkJCQkoIi4uIiB7X3R0eXBlID0gVFJJUExFX0RPVDt9KQotCQkJKT8KLQl8Ci0qT0JTKi8KLQkvLyBUTyBETzogIFRoaXMgY29tcGxleCBwYXR0ZXJuIHNlZW1zIHdyb25nLiAgVmVyaWZ5IG9yIGZpeC4KLQkoCScwJyB7aXNEZWNpbWFsID0gdHJ1ZTt9IC8vIHNwZWNpYWwgY2FzZSBmb3IganVzdCAnMCcKLQkJCSgJKCd4J3wnWCcpCi0JCQkJKAkJCQkJCQkJCQkJLy8gaGV4Ci0JCQkJCS8vIHRoZSAnZSd8J0UnIGFuZCBmbG9hdCBzdWZmaXggc3R1ZmYgbG9vawotCQkJCQkvLyBsaWtlIGhleCBkaWdpdHMsIGhlbmNlIHRoZSAoLi4uKSsgZG9lc24ndAotCQkJCQkvLyBrbm93IHdoZW4gdG8gc3RvcDogYW1iaWcuIEFOVExSIHJlc29sdmVzCi0JCQkJCS8vIGl0IGNvcnJlY3RseSBieSBtYXRjaGluZyBpbW1lZGlhdGVseS4gSXQKLQkJCQkJLy8gaXMgdGhlcmVmb3Igb2sgdG8gaHVzaCB3YXJuaW5nLgotCQkJCQlvcHRpb25zIHsKLQkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWc9ZmFsc2U7Ci0JCQkJCX0KLQkJCQk6CUhFWF9ESUdJVAotCQkJCSkrCi0KLQkJCXwJLy9mbG9hdCBvciBkb3VibGUgd2l0aCBsZWFkaW5nIHplcm8KLQkJCQkoKCcwJy4uJzknKSsgKCcuJ3xFWFBPTkVOVHxGTE9BVF9TVUZGSVgpKSA9PiAoJzAnLi4nOScpKwotCQkJCXtpc0RlY2ltYWw9dHJ1ZTt9Ci0KLQkJCXwJKCcwJy4uJzcnKSsJCQkJCQkJCQkvLyBvY3RhbAotCQkJKT8KLQkJfAkoJzEnLi4nOScpICgnMCcuLic5JykqICB7aXNEZWNpbWFsPXRydWU7fQkJLy8gbm9uLXplcm8gZGVjaW1hbAotCQkpCi0JCSgJKCdsJ3wnTCcpIHsgX3R0eXBlID0gTlVNX0xPTkc7IH0KLQkJfAlCSUdfU1VGRklYIHsgX3R0eXBlID0gTlVNX0JJR19JTlQ7IH0KLQotCQkvLyBvbmx5IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGEgZmxvYXQgaWYgbG9va3MgbGlrZSBkZWNpbWFsIHNvIGZhcgotCQl8CXtpc0RlY2ltYWx9PwotCQkJKAknLicgKCcwJy4uJzknKSsgKEVYUE9ORU5UKT8gKGYyOkZMT0FUX1NVRkZJWCB7dD1mMjt9IHwgZzI6QklHX1NVRkZJWCB7dD1nMjt9KT8KLQkJCXwJRVhQT05FTlQgKGYzOkZMT0FUX1NVRkZJWCB7dD1mMzt9IHwgZzM6QklHX1NVRkZJWCB7dD1nMzt9KT8KLQkJCXwJZjQ6RkxPQVRfU1VGRklYIHt0PWY0O30KLQkJCSkKLQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR4dCA9ICh0ID09IG51bGwgPyAiIiA6IHQuZ2V0VGV4dCgpLnRvVXBwZXJDYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHh0LmluZGV4T2YoJ0YnKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R0eXBlID0gTlVNX0ZMT0FUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4dC5pbmRleE9mKCdHJykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90dHlwZSA9IE5VTV9CSUdfREVDSU1BTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJKT8KLQk7Ci0KLS8vIEpESyAxLjUgdG9rZW4gZm9yIGFubm90YXRpb25zIGFuZCB0aGVpciBkZWNsYXJhdGlvbnMKLS8vIGFsc28gYSBncm9vdnkgb3BlcmF0b3IgZm9yIGFjdHVhbCBmaWVsZCBhY2Nlc3MgZS5nLiAndGVsc29uLkBhZ2UnIAotQVQKLQk6CSdAJwotCTsKLQotLy8gYSBjb3VwbGUgcHJvdGVjdGVkIG1ldGhvZHMgdG8gYXNzaXN0IGluIG1hdGNoaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLXByb3RlY3RlZAotRVhQT05FTlQKLQk6CSgnZSd8J0UnKSAoJysnfCctJyk/ICgnMCcuLic5JykrCi0JOwotCi0KLXByb3RlY3RlZAotRkxPQVRfU1VGRklYCi0JOgknZid8J0YnfCdkJ3wnRCcKLQk7Ci0KLXByb3RlY3RlZAotQklHX1NVRkZJWAotICAgICAgICA6ICAgICAgICdnJ3wnRycKLSAgICAgICAgOwotCi0vLyBIZXJlJ3MgYSBsaXR0bGUgaGludCBmb3IgeW91LCBFbWFjczoKLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6IGphdmEKLS8vIHRhYi13aWR0aDogNAotLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL21pc2Mvc3luZGlhZy0wLjAuMS5qYXIgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9zeW5kaWFnLTAuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3MzhhYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvbWlzYy9zeW5kaWFnLTAuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9ydW4uc2ggYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvcnVuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQxYTZmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci9ydW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMvYmluL3NoCi0KLWV4cG9ydCBDTEFTU1BBVEg9bGliL2FudGxyLTIuNy40LmphcjpkaXN0L2dyb292eWMtMC4wLjIuamFyCi1qYXZhIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuTWFpbiAtc2hvd3RyZWUgLi4vLi4vLi4vdGNrL3Rlc3QvbWlzYy9IZWxsb1dvcmxkLmdyb292eQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3NyYy9tYW5pZmVzdC50eHQgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvc3JjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZjMzNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvc3JjL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLk1haW4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQWxsVGVzdHMuamF2YSBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMWRhNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCBKYW1lcyBTdHJhY2hhbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBBIHRlc3Qgc3VpdGUgd2hpY2ggcmVjdXJzZXMgdGhyb3VnaCBhbGwgb2YgdGhlIGF2YWlsYWJsZSB0ZXN0IGNhc2UgaW4KLSAqIHRoZSB0ZXN0LW5ldyBhcmVhCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGVTdXBwb3J0IHsKLQotICAgIHN0YXRpYyBTdHJpbmdbXSBleGNsdWRlZFRlc3RzID0gewotCi0gICAgICAgICJMZWZ0U2hpZnRUZXN0Lmdyb292eSIsICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjYW4ndCBwYXJzZSBmb28uYmFyIDw8IHNvbWV0aGluZwotICAgICAgICAiU3RyZWFtaW5nTWFya3VwVGVzdC5ncm9vdnkiLCAgICAgICAgICAgLy8gVE9ETzogY2FuJ3QgcGFyc2UgZm9vLmJhciA8PAotICAgICAgICAiQnVpbGRlclN1cHBvcnRUZXN0Lmdyb292eSIsICAgICAgICAgICAgLy8gVE9ETzogY2FuJ3QgcGFyc2UgZm9vLmJhciA8PAotICAgICAgICAiYnVncy9Gb3JBbmRTcWxCdWcuZ3Jvb3Z5IiwgICAgICAgICAgICAgLy8gVE9ETzogY2FuJ3QgcGFyc2UgZm9vLmJhciA8PAotICAgICAgICAiUHJpbnRUZXN0Lmdyb292eSIsICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2FuJ3QgcGFyc2UgZm9vLmJhciA8PAotICAgICAgICAiR3Jvb3Z5MzA4X0J1Zy5ncm9vdnkiLCAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2FuJ3QgcGFyc2UgZm9vLmJhciA8PAotCi0KLSAgICAgICAgIkVzY2FwZWRVbmljb2RlVGVzdC5ncm9vdnkiLCAgICAgICAgICAgIC8vIFRPRE86IHBhcnNlciB1bmljb2RlIGhhbmRsaW5nCi0KLSAgICAgICAgIkNsb3N1cmVUZXN0Lmdyb292eSIsICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWQgbWV0aG9kIHBvaW50ZXJzIHN5bnRheAotCi0KLSAgICAgICAgLy8gVE9ETzogUGFyc2VyIGRlY2lzaW9ucyB0byBtYWtlCi0gICAgICAgICJEb1doaWxlTG9vcFRlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICAvLyBUT0RPOiBkbyB7IH0gd2hpbGUgKCkgbm90IHN1cHBvcnRlZCB5ZXQKLSAgICAgICAgIkxvb3BCcmVha1Rlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvIHsgfSB3aGlsZSAoKSBub3Qgc3VwcG9ydGVkIHlldAotICAgICAgICAiU2FmZU5hdmlnYXRpb25UZXN0Lmdyb292eSIsICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIHN1cHBvcnQgLT4gc2FmZSBuYXZpZ2F0aW9uIHRva2VuPwotCi0KLSAgICAgICAgLy8gSWdub3JlZCB0ZXN0IGNhc2VzIHdoaWNoIGNhbid0IGVhc2lseSBiZSBydW4gaW4gdGhpcyBoYXJuZXNzCi0gICAgICAgIC8vIGR1ZSB0byBjbGFzc3BhdGggaXNzdWVzCi0gICAgICAgIC8vIChydW4gdGhlbSB3aGVuIHdlIG1pZ3JhdGUgTmV3IEdyb292eSBpbnRvIGdyb292eS9ncm9vdnktY29yZSkKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICJTcWxDb21wbGV0ZVRlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICAgICAgLy8gbm90IGVhc3kgdG8gcnVuIGZyb20gaW4gSURFLi4uCi0gICAgICAgICJTcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkiLCAgLy8gbm90IGVhc3kgdG8gcnVuIGZyb20gaW4gSURFLi4uCi0gICAgICAgICJTcWxXaXRoQnVpbGRlclRlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICAgLy8gbm90IGVhc3kgdG8gcnVuIGZyb20gaW4gSURFLi4uCi0gICAgICAgICJTcWxXaXRoVHlwZWRSZXN1bHRzVGVzdC5ncm9vdnkiLCAgICAgICAgICAgLy8gbm90IGVhc3kgdG8gcnVuIGZyb20gaW4gSURFLi4uCi0gICAgICAgICJTZXJpYWxpemVUZXN0Lmdyb292eSIsICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGVhc3kgdG8gcnVuIGZyb20gaW4gSURFLi4uCi0gICAgICAgICJTdWJzY3JpcHRUZXN0Lmdyb292eSIsCi0gICAgICAgICJDb25zdHJ1Y3RvckJ1Zy5ncm9vdnkiLAotICAgICAgICAiUHJvcGVydHlUZXN0Lmdyb292eSIsCi0gICAgICAgICJQcmludGxuV2l0aE5ld0J1Zy5ncm9vdnkiLAotICAgICAgICAiZG9tL0RPTVRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIlN1cGVyTWV0aG9kMkJ1Zy5ncm9vdnkiLAotICAgICAgICAiU3VwZXJNZXRob2RCdWcuZ3Jvb3Z5IiwKLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIGFkZFRlc3RzKHN1aXRlLCBuZXcgRmlsZSgiLi4vLi4vLi4vLi4vZ3Jvb3Z5LWNvcmUvc3JjL3Rlc3QtbmV3L2dyb292eSIpLCBleGNsdWRlZFRlc3RzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Hcm9vdnlNYWluVGVzdFN1cHBvcnQuamF2YSBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvR3Jvb3Z5TWFpblRlc3RTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDZjNzMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Hcm9vdnlNYWluVGVzdFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICoKLSAqIENvcHlyaWdodCAyMDA0IEphbWVzIFN0cmFjaGFuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgZ3Jvb3Z5LnVpLkdyb292eU1haW47Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5TWFpblRlc3RTdXBwb3J0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBHcm9vdnlNYWluVGVzdFN1cHBvcnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIHRlc3Q6ICIgKyBmdWxsTmFtZSk7Ci0gICAgICAgIEdyb292eU1haW4ubWFpbihuZXcgU3RyaW5nW117ZnVsbE5hbWV9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0dyb292eVJlY29nbml6ZXJUZXN0LmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0dyb292eVJlY29nbml6ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2MwZGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Hcm9vdnlSZWNvZ25pemVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBHcm9vdnlSZWNvZ25pemVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIEdyb292eVJlY29nbml6ZXIgZzsKLQotICAgIHB1YmxpYyBHcm9vdnlSZWNvZ25pemVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihHcm9vdnlSZWNvZ25pemVyVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlcigicHVibGljIGNsYXNzIEZvbyB7fSIpOwotICAgICAgICBHcm9vdnlMZXhlciBsZXhlciA9IG5ldyBHcm9vdnlMZXhlcihyKTsKLSAgICAgICAgZyA9IG5ldyBHcm9vdnlSZWNvZ25pemVyKGxleGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGF0aWF0aW9uKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJncm9vdnkgcmVjb2duaXplciBzaG91bGQgZXhpc3QiLGcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZSgpIHsKLQl0cnkgewotCSAgICBnLmNvbXBpbGF0aW9uVW5pdCgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCX0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZyA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9UZXN0U3VpdGVTdXBwb3J0LmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL1Rlc3RTdWl0ZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0YjRiZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL1Rlc3RTdWl0ZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCBKYW1lcyBTdHJhY2hhbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOwotCi1pbXBvcnQgZ3Jvb3Z5LnVpLkdyb292eU1haW47Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlByb3RlY3RhYmxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYWtpbmcgYSB0ZXN0IHN1aXRlIG9mIGEgZ3JvdXAgb2YgR3Jvb3Z5IHNjcmlwdCBuYW1lcwotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZVN1cHBvcnQgaW1wbGVtZW50cyBUZXN0LCBQcm90ZWN0YWJsZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZnVsbE5hbWU7Ci0KLSAgICBwdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdCh0aGlzKTsKLSAgICAgICAgcmVzdWx0LnJ1blByb3RlY3RlZCh0aGlzLCB0aGlzKTsKLSAgICAgICAgcmVzdWx0LmVuZFRlc3QodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvdGVjdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgdGVzdDogIiArIGZ1bGxOYW1lKTsKLSAgICAgICAgR3Jvb3Z5TWFpbi5tYWluKG5ldyBTdHJpbmdbXXtmdWxsTmFtZX0pOwotCi0gICAgICAgIC8vIFRPRE8gaG93IGRvIHdlIGV4dHJhY3QgYW55IEpVbml0IHRlc3QgZmFpbHVyZXM/Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJ0ZXN0Q2FzZSBmb3I6ICIgKyBmdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBuYW1lZCB0ZXN0IHNjcmlwdHMgd2l0aGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgdG8gdGhlIHN1aXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFRlc3RzKFRlc3RTdWl0ZSBzdWl0ZSwgU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nW10gbmFtZXMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGRpcmVjdG9yeSArIG5hbWU7Ci0KLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUsIGZ1bGxOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzaW5nbGUgdGVzdCBjYXNlIG9yIHJlY3Vyc2VzIGludG8gYSBkaXJlY3RvcnkgYWRkaW5nIGFsbCB0aGUgdGVzdCBjYXNlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRUZXN0cyhUZXN0U3VpdGUgc3VpdGUsIEZpbGUgZmlsZSwgU3RyaW5nW10gZXhjbHVkZWRUZXN0cykgewotICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgY2hpbGQgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICBhZGRUZXN0cyhzdWl0ZSwgY2hpbGQsIGV4Y2x1ZGVkVGVzdHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCJUZXN0Lmdyb292eSIpIHx8IHBhdGguZW5kc1dpdGgoIkJ1Zy5ncm9vdnkiKSApIHsKLSAgICAgICAgICAgICAgICAvLyBsZXRzIGNoZWNrIGl0IGRvZXNuJ3QgZW5kIHdpdGggYW55IG9mIHRoZSBleGNsdWRlZCB0ZXN0cwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZWRUZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZWRUZXN0ID0gZXhjbHVkZWRUZXN0c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoZXhjbHVkZWRUZXN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUsIHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFRlc3QoVGVzdFN1aXRlIHN1aXRlLCBTdHJpbmcgZnVsbE5hbWUpIHsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgR3Jvb3Z5TWFpblRlc3RTdXBwb3J0KGZ1bGxOYW1lKSk7Ci0gICAgICAgIC8qCi0gICAgICAgIFRlc3RTdWl0ZVN1cHBvcnQgY2hpbGRUZXN0ID0gbmV3IFRlc3RTdWl0ZVN1cHBvcnQoKTsKLSAgICAgICAgY2hpbGRUZXN0LmZ1bGxOYW1lID0gZnVsbE5hbWU7Ci0gICAgICAgIFRlc3RTdWl0ZSBjaGlsZFN1aXRlID0gbmV3IFRlc3RTdWl0ZShmdWxsTmFtZSk7Ci0KLSAgICAgICAgY2hpbGRTdWl0ZS5hZGRUZXN0KGNoaWxkVGVzdCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoY2hpbGRTdWl0ZSk7Ci0gICAgICAgICovCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9VYmVyVGVzdHMuamF2YSBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvVWJlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjQxMDYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9VYmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKgotICoKLSAqIENvcHlyaWdodCAyMDA0IEphbWVzIFN0cmFjaGFuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7Ci0KLWltcG9ydCBncm9vdnkudWkuR3Jvb3Z5TWFpbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEEgc2ltcGxlciB0ZXN0IHJ1bm5lciB0byBydW4gbXVsdGlwbGUgdGVzdCBjYXNlcyBzdHJhaWdodCBmcm9tIHRoZSBncm9vdnkgc2NyaXB0cwotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFViZXJUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZVN1cHBvcnQgewotCi0gICAgc3RhdGljIFN0cmluZ1tdIGNsYXNzaWNUZXN0cyA9IHsKLSAgICAgICAgLy8gIkFtYmlndW91c0ludm9jYXRpb25UZXN0Lmdyb292eSIsICAtIHJlcXVpcmVzIGNsYXNzcGF0aCBzdHVmZgotICAgICAgICAiQXNzZXJ0TnVtYmVyVGVzdC5ncm9vdnkiLAotICAgICAgICAiQXNzZXJ0VGVzdC5ncm9vdnkiLAotICAgICAgICAiQmFyLmdyb292eSIsCi0gICAgICAgICJCaW5kaW5nVGVzdC5ncm9vdnkiLAotICAgICAgICAiQm9vbGVhbk9wZXJhdGlvblRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgLy8iQ2FzdFRlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICAgICAgIFRPRE8gcGFyc2VyIGJ1ZzogJHtmb28uY2xhc3N9IGluIEdTdHJpbmdzCi0gICAgICAgICJDaGFpbmVkQXNzaWdubWVudC5ncm9vdnkiLAotICAgICAgICAiQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5IiwKLSAgICAgICAgLy8iQ2xvc3VyZUNsb25lVGVzdC5ncm9vdnkiLCAgICAgICAgICAgIFRPRE8gcGFyc2VyIGJ1ZzogZG9lc24ndCBsaWtlICdpdCAqIGZvbycgZXhwcmVzc2lvbnMKLSAgICAgICAgIkNsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eSIsCi0gICAgICAgICJDb21waWxlckVycm9yVGVzdC5ncm9vdnkiLAotICAgICAgICAiRGF0ZVRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIkZvby5ncm9vdnkiLAotICAgICAgICAiRm9yTG9vcFRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIkZvckxvb3BXaXRoTG9jYWxWYXJpYWJsZXNUZXN0Lmdyb292eSIsCi0gICAgICAgICJHU3RyaW5nVGVzdC5ncm9vdnkiLAotICAgICAgICAiSGVyZWRvY3NUZXN0Lmdyb292eSIsCi0gICAgICAgICJJZkVsc2VDb21wYWN0VGVzdC5ncm9vdnkiLAotICAgICAgICAiSWZFbHNlVGVzdC5ncm9vdnkiLAotICAgICAgICAiSWZUZXN0Lmdyb292eSIsCi0gICAgICAgICJJbXBvcnRUZXN0Lmdyb292eSIsCi0gICAgICAgICJJbnN0YW5jZW9mVGVzdC5ncm9vdnkiLAotICAgICAgICAvLyJMaXN0VGVzdC5ncm9vdnkiLCAgICAgICAgICAgICAgICAgICBUT0RPIHBhcnNlciBidWdzCi0gICAgICAgICJMb2dpY1Rlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIk1ldGhvZENhbGxUZXN0Lmdyb292eSIsCi0gICAgICAgICJNdWx0aWxpbmVTdHJpbmdUZXN0Lmdyb292eSIsCi0gICAgICAgICJNdWx0aXBseURpdmlkZUVxdWFsc1Rlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIk5lZ2F0aW9uVGVzdHMuZ3Jvb3Z5IiwKLSAgICAgICAgLy8gIk9wdGlvbmFsUmV0dXJuVGVzdC5ncm9vdnkiLCAgICAgICAgIFRPRE8gcGFyc2VyIGN1cnJlbnRseSByZXF1aXJlcyBtYW5kYXRvcnkgcmV0dXJuIGZvciBsYXN0IGV4cCA9IGJvb2xlYW5FeHByCi0gICAgICAgIC8vICJQcmltaXRpdmVUeXBlRmllbGRUZXN0Lmdyb292eSIsICAgICBUT0RPIHdoZW4gcGFyc2VyIGNhbiBkbyBjbG9zdXJlIGFyZ3VtZW50cwotICAgICAgICAiUG9zdGZpeFRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIlByaW1pdGl2ZVR5cGVzVGVzdC5ncm9vdnkiLAotICAgICAgICAiUHJlZml4VGVzdC5ncm9vdnkiLAotICAgICAgICAvLyAiUmV0dXJuVGVzdC5ncm9vdnkiLCAgICAgICAgICAgICAgICAgVE9ETyBwYXJzZXIgYnVnCi0gICAgICAgICJSYW5nZVRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIlN0cmluZ09wZXJhdGlvblRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgLy8iU3Vic2NyaXB0VGVzdC5ncm9vdnkiLCAgICAgICAgICAgICAgIFRPRE8gYXJyYXkgaW5pdGlhbGlzZXJzCi0gICAgICAgICJUaHJvd1Rlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIlVuYXJ5TWludXNUZXN0Lmdyb292eSIsCi0gICAgICAgIC8vIldoaWxlTG9vcFRlc3QuZ3Jvb3Z5IiwgICAgICAgICAgICAgICBUT0RPIHBhcnNlciBidWcKLSAgICB9OwotCi0gICAgc3RhdGljIFN0cmluZ1tdIHRja1Rlc3RzID0gewotICAgICAgICAibWlzYy9Bbm5vdGF0aW9uVGVzdC5ncm9vdnkiLAotICAgICAgICAibWlzYy9GaWVsZFByb3BlcnR5TWV0aG9kRGlzYW1iaWd1YXRpb25UZXN0Lmdyb292eSIsCi0gICAgICAgICJtaXNjL1Byb3BlcnR5Q2FsbGVkTmFtZVRlc3QuZ3Jvb3Z5IiwKLSAgICAgICAgIm1pc2MvUHJvcGVydHlUZXN0Lmdyb292eSIsCi0gICAgICAgICJtaXNjL1NhbXBsZVRlc3QuZ3Jvb3Z5IiwKLSAgICB9OwotCi0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgYWRkVGVzdHMoc3VpdGUsICIuLi8uLi8uLi8uLi9ncm9vdnktY29yZS9zcmMvdGVzdC1uZXcvZ3Jvb3Z5LyIsIGNsYXNzaWNUZXN0cyk7Ci0gICAgICAgIGFkZFRlc3RzKHN1aXRlLCAiLi4vLi4vLi4vdGNrL3Rlc3QvIiwgdGNrVGVzdHMpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdHJlZXdhbGtlci9idWlsZC54bWwgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdHJlZXdhbGtlci9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTUwNGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJncm9vdnktdHJlZXdhbGtlciIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0KLSAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiAKLSAgICAgICAgICBkZXBlbmRzPSJnZW5UcmVlV2Fsa2VyIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVmYXVsdDogYnVpbGQgZXZlcnl0aGluZyIgLz4KLQotICA8dGFyZ2V0IG5hbWU9ImdlblRyZWVHcmFtbWFyIiBkZXNjcmlwdGlvbj0icmVnZW5lcmF0ZXMgR3Jvb3Z5UmVjb2duaXplclRyZWUuZyAocmVxdWlyZXMgYW50bHIyLjgueCkiPgotICAgIDxta2RpciBkaXI9ImdlbnNyYyIvPgotICAgIDxjb3B5IGZpbGU9Ii4uLy4uLy4uLy4uLy4uL2dyb292eS1jb3JlL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvZ3Jvb3Z5LmciIHRvZGlyPSJnZW5zcmMiLz4KLQotICAgIDxleGVjIGV4ZWN1dGFibGU9InBhdGNoIj4KLSAgICAgIDxhcmcgdmFsdWU9ImdlbnNyYy9ncm9vdnkuZyIvPgotICAgICAgPGFyZyB2YWx1ZT0idHJlZS5jb25zdHJ1Y3Rpb24ucGF0Y2giLz4KLSAgICA8L2V4ZWM+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9ImFudGxyLlRvb2wiIGRpcj0iZ2Vuc3JjIiBmb3JrPSJ5ZXMiPgotICAgICAgPGFyZyB2YWx1ZT0iLXRyZWUiLz4KLSAgICAgIDxhcmcgdmFsdWU9Imdyb292eS5nIi8+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImxpYi9hbnRsci5qYXIiLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvamF2YT4KLQotICAgIDxjb3B5IGZpbGU9ImdlbnNyYy9Hcm9vdnlSZWNvZ25pemVyVHJlZS5nIiB0b2Rpcj0ic3JjIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZ2VuVHJlZVdhbGtlciIgZGVzY3JpcHRpb249ImdlbmVyYXRlIHRyZWUgd2Fsa2VyIj4KLSAgICA8bWtkaXIgZGlyPSJnZW5zcmMiLz4KLSAgICA8Y29weSBmaWxlPSJzcmMvR3Jvb3Z5UmVjb2duaXplclRyZWUuZyIgdG9kaXI9ImdlbnNyYyIvPgotCi0gICAgPGV4ZWMgZXhlY3V0YWJsZT0icGF0Y2giPgotICAgICAgPGFyZyB2YWx1ZT0iZ2Vuc3JjL0dyb292eVJlY29nbml6ZXJUcmVlLmciLz4KLSAgICAgIDxhcmcgdmFsdWU9InRyZWUuZml4ZXMucGF0Y2giLz4KLSAgICA8L2V4ZWM+Ci0KLSAgICA8amF2YSBjbGFzc25hbWU9ImFudGxyLlRvb2wiIGRpcj0iZ2Vuc3JjIiBmb3JrPSJ5ZXMiPgotICAgICAgPGFyZyB2YWx1ZT0iR3Jvb3Z5UmVjb2duaXplclRyZWUuZyIvPgotICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIvYW50bHIuamFyIi8+Ci0gICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L2phdmE+ICAgIAotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iY2xlYW4gZ2VuZXJhdGVkIGZpbGVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iZ2Vuc3JjIi8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvbGliL2FudGxyLmphciBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL2xpYi9hbnRsci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTVlM2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvbGliL2FudGxyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL3NyYy9Hcm9vdnlSZWNvZ25pemVyVHJlZS5nIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvc3JjL0dyb292eVJlY29nbml6ZXJUcmVlLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzZhNGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvc3JjL0dyb292eVJlY29nbml6ZXJUcmVlLmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYzICswLDAgQEAKLS8vIEFOVExSIGdlbmVyYXRlZCB0cmVlIGdyYW1tYXIKLQotCi0KLQotaGVhZGVyIHsKLX0KLQotY2xhc3MgR3Jvb3Z5UmVjb2duaXplclRyZWUgZXh0ZW5kcyBUcmVlUGFyc2VyOwotb3B0aW9ucyB7Ci0JYnVpbGRBU1QgPSBmYWxzZTsKLX0KLQotCi1jb21waWxhdGlvblVuaXQKLQk6Ci0JKAotCQlwYWNrYWdlRGVmaW5pdGlvbgotCQl8Ci0JCQkoCi0JCQkJc3RhdGVtZW50Ci0JCQkpPwotCSkKLQkoCi0JCSgKLQkJCXN0YXRlbWVudAotCQkpPwotCSkqCi0JOwotCi1zbmlwcGV0VW5pdAotCToKLQlibG9ja0JvZHkKLQk7Ci0KLXBhY2thZ2VEZWZpbml0aW9uCi0JOgotCSMoIAotCQlQQUNLQUdFX0RFRgotCQlhbm5vdGF0aW9uc09wdAotCQlpZGVudGlmaWVyCi0JKQotCTsKLQotaW1wb3J0U3RhdGVtZW50Ci0JOgotCSMoIAotCQkiaW1wb3J0IgotCQlpZGVudGlmaWVyU3RhcgotCSkKLQk7Ci0KLXR5cGVEZWZpbml0aW9uSW50ZXJuYWwKLQk6Ci0JY2xhc3NEZWZpbml0aW9uCi0JfAotCQlpbnRlcmZhY2VEZWZpbml0aW9uCi0JfAotCQllbnVtRGVmaW5pdGlvbgotCXwKLQkJYW5ub3RhdGlvbkRlZmluaXRpb24KLQk7Ci0KLXNpbmdsZURlY2xhcmF0aW9uCi0JOgotCSgKLQkJdmFySW5pdGlhbGl6ZXIKLQkpPwotCTsKLQotdXBwZXJDYXNlSWRlbnQKLQk6Ci0JSURFTlQKLQk7Ci0KLXR5cGVTcGVjCi0JOgotCWNsYXNzVHlwZVNwZWMKLQl8Ci0JCWJ1aWx0SW5UeXBlU3BlYwotCTsKLQotY2xhc3NUeXBlU3BlYwotCToKLQlkZWNsYXJhdG9yQnJhY2tldHMKLQk7Ci0KLWNsYXNzT3JJbnRlcmZhY2VUeXBlMGEKLQk6Ci0JIyggCi0JCUlERU5UCi0JCSgKLQkJCXR5cGVBcmd1bWVudHMKLQkJKT8KLQkpCi0JfAotCQkjKCAKLQkJCURPVAotCQkJY2xhc3NPckludGVyZmFjZVR5cGUwYQotCQkJSURFTlQKLQkJCSgKLQkJCQl0eXBlQXJndW1lbnRzCi0JCQkpPwotCQkpCi0JOwotCi1jbGFzc09ySW50ZXJmYWNlVHlwZQotCToKLQkjKCAKLQkJRE9UCi0JCWNsYXNzT3JJbnRlcmZhY2VUeXBlMGEKLQkJSURFTlQKLQkJKAotCQkJdHlwZUFyZ3VtZW50cwotCQkpPwotCSkKLQl8Ci0JCSMoIAotCQkJSURFTlQKLQkJCSgKLQkJCQl0eXBlQXJndW1lbnRzCi0JCQkpPwotCQkpCi0JOwotCi10eXBlQXJndW1lbnRTcGVjCi0JOgotCWNsYXNzVHlwZVNwZWMKLQl8Ci0JCWJ1aWx0SW5UeXBlQXJyYXlTcGVjCi0JOwotCi10eXBlQXJndW1lbnQKLQk6Ci0JKAotCQl0eXBlQXJndW1lbnRTcGVjCi0JCXwKLQkJCXdpbGRjYXJkVHlwZQotCSkKLQk7Ci0KLXdpbGRjYXJkVHlwZQotCToKLQkjKCAKLQkJV0lMRENBUkRfVFlQRQotCQkoCi0JCQl0eXBlQXJndW1lbnRCb3VuZHMKLQkJKT8KLQkpCi0JOwotCi10eXBlQXJndW1lbnRzCi0JOgotCXR5cGVBcmd1bWVudAotCSgKLQkJdHlwZUFyZ3VtZW50Ci0JKSoKLQkoCi0JCXR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKLQkpPwotCTsKLQotdHlwZUFyZ3VtZW50Qm91bmRzCi0JOgotCWNsYXNzT3JJbnRlcmZhY2VUeXBlCi0JOwotCi1idWlsdEluVHlwZUFycmF5U3BlYwotCToKLQkoCi0JCWRlY2xhcmF0b3JCcmFja2V0cwotCQl8Ci0JKQotCTsKLQotYnVpbHRJblR5cGVTcGVjCi0JOgotCWRlY2xhcmF0b3JCcmFja2V0cwotCTsKLQotdHlwZQotCToKLQljbGFzc09ySW50ZXJmYWNlVHlwZQotCXwKLQkJYnVpbHRJblR5cGUKLQk7Ci0KLWJ1aWx0SW5UeXBlCi0JOgotCSJ2b2lkIgotCXwKLQkJImJvb2xlYW4iCi0JfAotCQkiYnl0ZSIKLQl8Ci0JCSJjaGFyIgotCXwKLQkJInNob3J0IgotCXwKLQkJImludCIKLQl8Ci0JCSJmbG9hdCIKLQl8Ci0JCSJsb25nIgotCXwKLQkJImRvdWJsZSIKLQl8Ci0JCSJhbnkiCi0JOwotCi1pZGVudGlmaWVyMGEKLQk6Ci0JSURFTlQKLQl8Ci0JCSMoIAotCQkJRE9UCi0JCQlpZGVudGlmaWVyMGEKLQkJCUlERU5UCi0JCSkKLQk7Ci0KLWlkZW50aWZpZXIKLQk6Ci0JIyggCi0JCURPVAotCQlpZGVudGlmaWVyMGEKLQkJSURFTlQKLQkpCi0JfAotCQlJREVOVAotCTsKLQotaWRlbnRpZmllclN0YXIwYQotCToKLQlJREVOVAotCXwKLQkJIyggCi0JCQlET1QKLQkJCWlkZW50aWZpZXJTdGFyMGEKLQkJCUlERU5UCi0JCSkKLQk7Ci0KLWlkZW50aWZpZXJTdGFyCi0JOgotCSMoIAotCQlET1QKLQkJIyggCi0JCQlET1QKLQkJCWlkZW50aWZpZXJTdGFyMGEKLQkJCUlERU5UCi0JCSkKLQkJU1RBUgotCSkKLQl8Ci0JCSMoIAotCQkJImFzIgotCQkJIyggCi0JCQkJRE9UCi0JCQkJaWRlbnRpZmllclN0YXIwYQotCQkJCUlERU5UCi0JCQkpCi0JCQlJREVOVAotCQkpCi0JfAotCQkjKCAKLQkJCURPVAotCQkJaWRlbnRpZmllclN0YXIwYQotCQkJSURFTlQKLQkJKQotCXwKLQkJIyggCi0JCQlET1QKLQkJCUlERU5UCi0JCQlTVEFSCi0JCSkKLQl8Ci0JCSMoIAotCQkJImFzIgotCQkJSURFTlQKLQkJCUlERU5UCi0JCSkKLQl8Ci0JCUlERU5UCi0JOwotCi1tb2RpZmllcnNJbnRlcm5hbAotCToKLQkoCi0JCW1vZGlmaWVyCi0JCXwKLQkJCWFubm90YXRpb24KLQkJfAotCSkrCi0JOwotCi1tb2RpZmllcnMKLQk6Ci0JbW9kaWZpZXJzSW50ZXJuYWwKLQk7Ci0KLW1vZGlmaWVyc09wdAotCToKLQkoCi0JCW1vZGlmaWVyc0ludGVybmFsCi0JKT8KLQk7Ci0KLW1vZGlmaWVyCi0JOgotCSJwcml2YXRlIgotCXwKLQkJInB1YmxpYyIKLQl8Ci0JCSJwcm90ZWN0ZWQiCi0JfAotCQkic3RhdGljIgotCXwKLQkJInRyYW5zaWVudCIKLQl8Ci0JCSJmaW5hbCIKLQl8Ci0JCSJhYnN0cmFjdCIKLQl8Ci0JCSJuYXRpdmUiCi0JfAotCQkidGhyZWFkc2FmZSIKLQl8Ci0JCSJzeW5jaHJvbml6ZWQiCi0JfAotCQkidm9sYXRpbGUiCi0JfAotCQkic3RyaWN0ZnAiCi0JOwotCi1hbm5vdGF0aW9uc09wdAotCToKLQkoCi0JCWFubm90YXRpb24KLQkpKgotCTsKLQotYW5ub3RhdGlvbkFyZ3VtZW50cwotCToKLQlhbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgotCXwKLQkJYW5udG90YXRpb25NZW1iZXJWYWx1ZVBhaXJzCi0JOwotCi1hbm50b3RhdGlvbk1lbWJlclZhbHVlUGFpcnMKLQk6Ci0JYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpcgotCSgKLQkJYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpcgotCSkqCi0JOwotCi1hbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgotCToKLQljb25kaXRpb25hbEV4cHJlc3Npb24KLQl8Ci0JCWFubm90YXRpb24KLQk7Ci0KLWFubm90YXRpb25NZW1iZXJBcnJheVZhbHVlSW5pdGlhbGl6ZXIKLQk6Ci0JY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JfAotCQlhbm5vdGF0aW9uCi0JOwotCi10eXBlUGFyYW1ldGVycwotCToKLQl0eXBlUGFyYW1ldGVyCi0JKAotCQl0eXBlUGFyYW1ldGVyCi0JKSoKLQkoCi0JCXR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKLQkpPwotCTsKLQotdHlwZVBhcmFtZXRlcgotCToKLQkoCi0JCUlERU5UCi0JKQotCSgKLQkJdHlwZVBhcmFtZXRlckJvdW5kcwotCSk/Ci0JOwotCi10eXBlUGFyYW1ldGVyQm91bmRzCi0JOgotCWNsYXNzT3JJbnRlcmZhY2VUeXBlCi0JKAotCQljbGFzc09ySW50ZXJmYWNlVHlwZQotCSkqCi0JOwotCi1jbGFzc0Jsb2NrCi0JOgotCSgKLQkJY2xhc3NGaWVsZAotCSk/Ci0JKAotCQkoCi0JCQljbGFzc0ZpZWxkCi0JCSk/Ci0JKSoKLQk7Ci0KLWludGVyZmFjZUJsb2NrCi0JOgotCSgKLQkJaW50ZXJmYWNlRmllbGQKLQkpPwotCSgKLQkJKAotCQkJaW50ZXJmYWNlRmllbGQKLQkJKT8KLQkpKgotCTsKLQotYW5ub3RhdGlvbkJsb2NrCi0JOgotCSgKLQkJYW5ub3RhdGlvbkZpZWxkCi0JKT8KLQkoCi0JCSgKLQkJCWFubm90YXRpb25GaWVsZAotCQkpPwotCSkqCi0JOwotCi1lbnVtQmxvY2sKLQk6Ci0JKAotCQllbnVtQ29uc3RhbnRzCi0JCXwKLQkJCSgKLQkJCQljbGFzc0ZpZWxkCi0JCQkpPwotCSkKLQkoCi0JCSgKLQkJCWNsYXNzRmllbGQKLQkJKT8KLQkpKgotCTsKLQotZW51bUNvbnN0YW50c1N0YXJ0Ci0JOgotCWVudW1Db25zdGFudAotCSgKLQkJQ09NTUEKLQkJfAotCQkJU0VNSQotCQl8Ci0JCQlOTFMKLQkJfAotCQkJUkNVUkxZCi0JKQotCTsKLQotZW51bUNvbnN0YW50cwotCToKLQllbnVtQ29uc3RhbnQKLQkoCi0JCWVudW1Db25zdGFudAotCSkqCi0JOwotCi1lbnVtQ29uc3RhbnRCbG9jawotCToKLQkoCi0JCWVudW1Db25zdGFudEZpZWxkCi0JKT8KLQkoCi0JCSgKLQkJCWVudW1Db25zdGFudEZpZWxkCi0JCSk/Ci0JKSoKLQk7Ci0KLWludGVyZmFjZUV4dGVuZHMKLQk6Ci0JKAotCQljbGFzc09ySW50ZXJmYWNlVHlwZQotCQkoCi0JCQljbGFzc09ySW50ZXJmYWNlVHlwZQotCQkpKgotCSk/Ci0JOwotCi1pbXBsZW1lbnRzQ2xhdXNlCi0JOgotCSgKLQkJY2xhc3NPckludGVyZmFjZVR5cGUKLQkJKAotCQkJY2xhc3NPckludGVyZmFjZVR5cGUKLQkJKSoKLQkpPwotCTsKLQotY29uc3RydWN0b3JCb2R5Ci0JOgotCSMoIAotCQlTTElTVAotCQkoCi0JCQlleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotCQkJKAotCQkJCWJsb2NrQm9keQotCQkJKT8KLQkJCXwKLQkJCQlibG9ja0JvZHkKLQkJKQotCSkKLQk7Ci0KLWV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uCi0JOgotCSMoIAotCQlDVE9SX0NBTEwKLQkJKAotCQkJdHlwZUFyZ3VtZW50cwotCQkpPwotCQlhcmdMaXN0Ci0JKQotCXwKLQkJIyggCi0JCQlTVVBFUl9DVE9SX0NBTEwKLQkJCSgKLQkJCQl0eXBlQXJndW1lbnRzCi0JCQkpPwotCQkJYXJnTGlzdAotCQkpCi0JOwotCi12YXJpYWJsZURlZmluaXRpb25zCi0JOgotCXZhcmlhYmxlRGVjbGFyYXRvcgotCSgKLQkJdmFyaWFibGVEZWNsYXJhdG9yCi0JKSoKLQl8Ci0JCSgKLQkJCUlERU5UCi0JCQl8Ci0JCQkJU1RSSU5HX0xJVEVSQUwKLQkJKQotCTsKLQotY29uc3RydWN0b3JEZWZpbml0aW9uCi0JOgotCUlERU5UCi0JOwotCi12YXJpYWJsZU5hbWUKLQk6Ci0JSURFTlQKLQk7Ci0KLWRlY2xhcmF0b3JCcmFja2V0czBhCi0JOgotCSMoIAotCQlBUlJBWV9ERUNMQVJBVE9SCi0JCWRlY2xhcmF0b3JCcmFja2V0czBhCi0JKQotCXwKLQk7Ci0KLWRlY2xhcmF0b3JCcmFja2V0cwotCToKLQkjKCAKLQkJQVJSQVlfREVDTEFSQVRPUgotCQlkZWNsYXJhdG9yQnJhY2tldHMwYQotCSkKLQl8Ci0JOwotCi12YXJJbml0aWFsaXplcgotCToKLQkjKCAKLQkJQVNTSUdOCi0JCWV4cHJlc3Npb24KLQkpCi0JOwotCi10aHJvd3NDbGF1c2UKLQk6Ci0JIyggCi0JCSJ0aHJvd3MiCi0JCWlkZW50aWZpZXIKLQkJKAotCQkJaWRlbnRpZmllcgotCQkpKgotCSkKLQk7Ci0KLXBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAotCToKLQkoCi0JCXBhcmFtZXRlckRlY2xhcmF0aW9uCi0JCSgKLQkJCXBhcmFtZXRlckRlY2xhcmF0aW9uCi0JCSkqCi0JKT8KLQk7Ci0KLXNpbXBsZVBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAotCToKLQlzaW1wbGVQYXJhbWV0ZXJEZWNsYXJhdGlvbgotCSgKLQkJc2ltcGxlUGFyYW1ldGVyRGVjbGFyYXRpb24KLQkpKgotCTsKLQotcGFyYW1ldGVyTW9kaWZpZXJzT3B0Ci0JOgotCSgKLQkJImZpbmFsIgotCQl8Ci0JCQlhbm5vdGF0aW9uCi0JCXwKLQkpKgotCTsKLQotY2xvc3VyZVBhcmFtZXRlcnNPcHQKLQk6Ci0JcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0Ci0JfAotCQlvbGRDbG9zdXJlUGFyYW1ldGVycwotCXwKLQkJaW1wbGljaXRQYXJhbWV0ZXJzCi0JfAotCTsKLQotb2xkQ2xvc3VyZVBhcmFtZXRlcnMKLQk6Ci0JcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0Ci0JfAotCQlzaW1wbGVQYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QKLQl8Ci0JOwotCi1jb21wb3VuZFN0YXRlbWVudAotCToKLQlvcGVuQmxvY2sKLQk7Ci0KLW9wZW5CbG9jawotCToKLQkjKCAKLQkJU0xJU1QKLQkJYmxvY2tCb2R5Ci0JKQotCTsKLQotYmxvY2tCb2R5Ci0JOgotCSgKLQkJc3RhdGVtZW50Ci0JKT8KLQkoCi0JCSgKLQkJCXN0YXRlbWVudAotCQkpPwotCSkqCi0JOwotCi1jbG9zZWRCbG9jawotCToKLQkjKCAKLQkJQ0xPU0VEX0JMT0NLCi0JCWNsb3N1cmVQYXJhbWV0ZXJzT3B0Ci0JCWJsb2NrQm9keQotCSkKLQk7Ci0KLW9wZW5PckNsb3NlZEJsb2NrCi0JOgotCSMoIAotCQlMQ1VSTFkKLQkJY2xvc3VyZVBhcmFtZXRlcnNPcHQKLQkJYmxvY2tCb2R5Ci0JKQotCTsKLQotc3RhdGVtZW50Ci0JOgotCSgKLQkJb3Blbk9yQ2xvc2VkQmxvY2sKLQkJfAotCQkJc3RhdGVtZW50Ci0JKQotCXwKLQkJZXhwcmVzc2lvblN0YXRlbWVudAotCXwKLQkJdHlwZURlZmluaXRpb25JbnRlcm5hbAotCXwKLQkJZm9yU3RhdGVtZW50Ci0JfAotCQkjKCAKLQkJCSJ3aGlsZSIKLQkJCXN0cmljdENvbnRleHRFeHByZXNzaW9uCi0JCQljb21wYXRpYmxlQm9keVN0YXRlbWVudAotCQkpCi0JfAotCQkjKCAKLQkJCSJ3aXRoIgotCQkJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KLQkJCWNvbXBvdW5kU3RhdGVtZW50Ci0JCSkKLQl8Ci0JCSMoIAotCQkJU1BSRUFEX0FSRwotCQkJZXhwcmVzc2lvblN0YXRlbWVudAotCQkpCi0JfAotCQlpbXBvcnRTdGF0ZW1lbnQKLQl8Ci0JCXRyeUJsb2NrCi0JfAotCQkjKCAKLQkJCSJzeW5jaHJvbml6ZWQiCi0JCQlzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgotCQkJY29tcG91bmRTdGF0ZW1lbnQKLQkJKQotCXwKLQkJYnJhbmNoU3RhdGVtZW50Ci0JfAotCQlkZWNsYXJhdGlvbgotCTsKLQotZm9yU3RhdGVtZW50Ci0JOgotCSMoIAotCQkiZm9yIgotCQkoCi0JCQl0cmFkaXRpb25hbEZvckNsYXVzZQotCQkJfAotCQkJCWZvckluQ2xhdXNlCi0JCSkKLQkJY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQKLQkpCi0JOwotCi10cmFkaXRpb25hbEZvckNsYXVzZQotCToKLQlmb3JJbml0Ci0JZm9yQ29uZAotCWZvckl0ZXIKLQk7Ci0KLWZvckluQ2xhdXNlCi0JOgotCSMoIAotCQkiaW4iCi0JCSgKLQkJCXNpbmdsZURlY2xhcmF0aW9uTm9Jbml0Ci0JCQl8Ci0JCQkJSURFTlQKLQkJKQotCQlzaGlmdEV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCUNPTE9OCi0JCQkoCi0JCQkJc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQKLQkJCQl8Ci0JCQkJCUlERU5UCi0JCQkpCi0JCQlleHByZXNzaW9uCi0JCSkKLQk7Ci0KLWNvbXBhdGlibGVCb2R5U3RhdGVtZW50Ci0JOgotCWNvbXBvdW5kU3RhdGVtZW50Ci0JfAotCQlzdGF0ZW1lbnQKLQk7Ci0KLWJyYW5jaFN0YXRlbWVudAotCToKLQkjKCAKLQkJImJyZWFrIgotCQkoCi0JCQlzdGF0ZW1lbnRMYWJlbFByZWZpeAotCQkpPwotCQkoCi0JCQlleHByZXNzaW9uCi0JCSk/Ci0JKQotCXwKLQkJIyggCi0JCQkiY29udGludWUiCi0JCQkoCi0JCQkJc3RhdGVtZW50TGFiZWxQcmVmaXgKLQkJCSk/Ci0JCQkoCi0JCQkJZXhwcmVzc2lvbgotCQkJKT8KLQkJKQotCXwKLQkJIyggCi0JCQkidGhyb3ciCi0JCQlleHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJImFzc2VydCIKLQkJCWV4cHJlc3Npb24KLQkJCSgKLQkJCQlleHByZXNzaW9uCi0JCQkpPwotCQkpCi0JfAotCQkjKCAKLQkJCSJyZXR1cm4iCi0JCQkoCi0JCQkJZXhwcmVzc2lvbgotCQkJKT8KLQkJKQotCTsKLQotc3RhdGVtZW50TGFiZWxQcmVmaXgKLQk6Ci0JIyggCi0JCUxBQkVMRURfU1RBVAotCQlJREVOVAotCSkKLQk7Ci0KLWV4cHJlc3Npb25TdGF0ZW1lbnQKLQk6Ci0JKAotCQljaGVja1N1c3BpY2lvdXNFeHByZXNzaW9uU3RhdGVtZW50Ci0JKT8KLQlleHByZXNzaW9uCi0JOwotCi1zdXNwaWNpb3VzRXhwcmVzc2lvblN0YXRlbWVudFN0YXJ0Ci0JOgotCSgKLQkJKAotCQkJUExVUwotCQkJfAotCQkJCU1JTlVTCi0JCSkKLQkJfAotCQkJKAotCQkJCUxCUkFDSwotCQkJCXwKLQkJCQkJTFBBUkVOCi0JCQkJfAotCQkJCQlMQ1VSTFkKLQkJCSkKLQkpCi0JOwotCi1jYXNlc0dyb3VwCi0JOgotCSgKLQkJYUNhc2UKLQkpKwotCWNhc2VTTGlzdAotCTsKLQotYUNhc2UKLQk6Ci0JIyggCi0JCSJjYXNlIgotCQlleHByZXNzaW9uCi0JKQotCXwKLQkJKAotCQkJImRlZmF1bHQiCi0JCSkKLQk7Ci0KLWNhc2VTTGlzdAotCToKLQlzdGF0ZW1lbnQKLQkoCi0JCSgKLQkJCXN0YXRlbWVudAotCQkpPwotCSkqCi0JOwotCi1mb3JJbml0Ci0JOgotCWRlY2xhcmF0aW9uCi0JfAotCQkoCi0JCQljb250cm9sRXhwcmVzc2lvbkxpc3QKLQkJKT8KLQk7Ci0KLWZvckNvbmQKLQk6Ci0JKAotCQlzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgotCSk/Ci0JOwotCi1mb3JJdGVyCi0JOgotCSgKLQkJY29udHJvbEV4cHJlc3Npb25MaXN0Ci0JKT8KLQk7Ci0KLXRyeUJsb2NrCi0JOgotCSMoIAotCQkidHJ5IgotCQljb21wb3VuZFN0YXRlbWVudAotCQkoCi0JCQloYW5kbGVyCi0JCSkqCi0JCSgKLQkJCWZpbmFsbHlDbGF1c2UKLQkJKT8KLQkpCi0JOwotCi1maW5hbGx5Q2xhdXNlCi0JOgotCSMoIAotCQkiZmluYWxseSIKLQkJY29tcG91bmRTdGF0ZW1lbnQKLQkpCi0JOwotCi1oYW5kbGVyCi0JOgotCSMoIAotCQkiY2F0Y2giCi0JCXBhcmFtZXRlckRlY2xhcmF0aW9uCi0JCWNvbXBvdW5kU3RhdGVtZW50Ci0JKQotCTsKLQotY29tbWFuZEFyZ3VtZW50cwotCToKLQlleHByZXNzaW9uCi0JKAotCQlleHByZXNzaW9uCi0JKSoKLQk7Ci0KLWV4cHJlc3Npb24KLQk6Ci0JYXNzaWdubWVudEV4cHJlc3Npb24KLQk7Ci0KLWNvbnRyb2xFeHByZXNzaW9uTGlzdAotCToKLQlzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgotCSgKLQkJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KLQkpKgotCTsKLQotcGF0aEVsZW1lbnQKLQk6Ci0JIyggCi0JCVNQUkVBRF9ET1QKLQkJKAotCQkJdHlwZUFyZ3VtZW50cwotCQkpPwotCQluYW1lUGFydAotCSkKLQl8Ci0JCSMoIAotCQkJT1BUSU9OQUxfRE9UCi0JCQkoCi0JCQkJdHlwZUFyZ3VtZW50cwotCQkJKT8KLQkJCW5hbWVQYXJ0Ci0JCSkKLQl8Ci0JCSMoIAotCQkJTUVNQkVSX1BPSU5URVIKLQkJCSgKLQkJCQl0eXBlQXJndW1lbnRzCi0JCQkpPwotCQkJbmFtZVBhcnQKLQkJKQotCXwKLQkJIyggCi0JCQlET1QKLQkJCSgKLQkJCQl0eXBlQXJndW1lbnRzCi0JCQkpPwotCQkJbmFtZVBhcnQKLQkJKQotCXwKLQk7Ci0KLW5hbWVQYXJ0Ci0JOgotCSMoIAotCQlBVAotCQkoCi0JCQlJREVOVAotCQkJfAotCQkJCVNUUklOR19MSVRFUkFMCi0JCQl8Ci0JCQkJb3BlbkJsb2NrCi0JCQl8Ci0JCQkJa2V5d29yZFByb3BlcnR5TmFtZXMKLQkJCXwKLQkJKQotCSkKLQl8Ci0JCSgKLQkJCUlERU5UCi0JCQl8Ci0JCQkJU1RSSU5HX0xJVEVSQUwKLQkJCXwKLQkJCQlvcGVuQmxvY2sKLQkJCXwKLQkJCQlrZXl3b3JkUHJvcGVydHlOYW1lcwotCQkJfAotCQkpCi0JOwotCi1rZXl3b3JkUHJvcGVydHlOYW1lcwotCToKLQkoCi0JCSJjbGFzcyIKLQkJfAotCQkJImluIgotCQl8Ci0JCQkiYXMiCi0JCXwKLQkJCSJkZWYiCi0JCXwKLQkJCSJpZiIKLQkJfAotCQkJImVsc2UiCi0JCXwKLQkJCSJmb3IiCi0JCXwKLQkJCSJ3aGlsZSIKLQkJfAotCQkJImRvIgotCQl8Ci0JCQkic3dpdGNoIgotCQl8Ci0JCQkidHJ5IgotCQl8Ci0JCQkiY2F0Y2giCi0JCXwKLQkJCSJmaW5hbGx5IgotCQl8Ci0JCQlidWlsdEluVHlwZQotCSkKLQk7Ci0KLWR5bmFtaWNNZW1iZXJOYW1lCi0JOgotCSgKLQkJcGFyZW50aGVzaXplZEV4cHJlc3Npb24KLQkJfAotCQkJc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uCi0JKQotCTsKLQotbWV0aG9kQ2FsbEFyZ3MKLQk6Ci0JIyggCi0JCU1FVEhPRF9DQUxMCi0JCWFyZ0xpc3QKLQkpCi0JOwotCi1hcHBlbmRlZEJsb2NrCi0JOgotCWNsb3NlZEJsb2NrCi0JOwotCi1pbmRleFByb3BlcnR5QXJncwotCToKLQkjKCAKLQkJSU5ERVhfT1AKLQkJYXJnTGlzdAotCSkKLQk7Ci0KLWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JOgotCSMoIAotCQlBU1NJR04KLQkJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JKQotCXwKLQkJIyggCi0JCQlQTFVTX0FTU0lHTgotCQkJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCQlhc3NpZ25tZW50RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCU1JTlVTX0FTU0lHTgotCQkJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCQlhc3NpZ25tZW50RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCVNUQVJfQVNTSUdOCi0JCQljb25kaXRpb25hbEV4cHJlc3Npb24KLQkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJRElWX0FTU0lHTgotCQkJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCQlhc3NpZ25tZW50RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCU1PRF9BU1NJR04KLQkJCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCQkJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlTUl9BU1NJR04KLQkJCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCQkJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1JfQVNTSUdOCi0JCQljb25kaXRpb25hbEV4cHJlc3Npb24KLQkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU0xfQVNTSUdOCi0JCQljb25kaXRpb25hbEV4cHJlc3Npb24KLQkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJQkFORF9BU1NJR04KLQkJCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCQkJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCWE9SX0FTU0lHTgotCQkJY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JCQlhc3NpZ25tZW50RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCUJPUl9BU1NJR04KLQkJCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCQkJYXNzaWdubWVudEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlTVEFSX1NUQVJfQVNTSUdOCi0JCQljb25kaXRpb25hbEV4cHJlc3Npb24KLQkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCTsKLQotY29uZGl0aW9uYWxFeHByZXNzaW9uCi0JOgotCSMoIAotCQlRVUVTVElPTgotCQlsb2dpY2FsT3JFeHByZXNzaW9uCi0JCWFzc2lnbm1lbnRFeHByZXNzaW9uCi0JCWNvbmRpdGlvbmFsRXhwcmVzc2lvbgotCSkKLQl8Ci0JCWxvZ2ljYWxPckV4cHJlc3Npb24KLQk7Ci0KLWxvZ2ljYWxPckV4cHJlc3Npb24wYQotCToKLQlsb2dpY2FsQW5kRXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlMT1IKLQkJCWxvZ2ljYWxPckV4cHJlc3Npb24wYQotCQkJbG9naWNhbEFuZEV4cHJlc3Npb24KLQkJKQotCTsKLQotbG9naWNhbE9yRXhwcmVzc2lvbgotCToKLQkjKCAKLQkJTE9SCi0JCWxvZ2ljYWxPckV4cHJlc3Npb24wYQotCQlsb2dpY2FsQW5kRXhwcmVzc2lvbgotCSkKLQl8Ci0JCWxvZ2ljYWxBbmRFeHByZXNzaW9uCi0JOwotCi1sb2dpY2FsQW5kRXhwcmVzc2lvbjBhCi0JOgotCWluY2x1c2l2ZU9yRXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlMQU5ECi0JCQlsb2dpY2FsQW5kRXhwcmVzc2lvbjBhCi0JCQlpbmNsdXNpdmVPckV4cHJlc3Npb24KLQkJKQotCTsKLQotbG9naWNhbEFuZEV4cHJlc3Npb24KLQk6Ci0JIyggCi0JCUxBTkQKLQkJbG9naWNhbEFuZEV4cHJlc3Npb24wYQotCQlpbmNsdXNpdmVPckV4cHJlc3Npb24KLQkpCi0JfAotCQlpbmNsdXNpdmVPckV4cHJlc3Npb24KLQk7Ci0KLWluY2x1c2l2ZU9yRXhwcmVzc2lvbjBhCi0JOgotCWV4Y2x1c2l2ZU9yRXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlCT1IKLQkJCWluY2x1c2l2ZU9yRXhwcmVzc2lvbjBhCi0JCQlleGNsdXNpdmVPckV4cHJlc3Npb24KLQkJKQotCTsKLQotaW5jbHVzaXZlT3JFeHByZXNzaW9uCi0JOgotCSMoIAotCQlCT1IKLQkJaW5jbHVzaXZlT3JFeHByZXNzaW9uMGEKLQkJZXhjbHVzaXZlT3JFeHByZXNzaW9uCi0JKQotCXwKLQkJZXhjbHVzaXZlT3JFeHByZXNzaW9uCi0JOwotCi1leGNsdXNpdmVPckV4cHJlc3Npb24wYQotCToKLQlhbmRFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCUJYT1IKLQkJCWV4Y2x1c2l2ZU9yRXhwcmVzc2lvbjBhCi0JCQlhbmRFeHByZXNzaW9uCi0JCSkKLQk7Ci0KLWV4Y2x1c2l2ZU9yRXhwcmVzc2lvbgotCToKLQkjKCAKLQkJQlhPUgotCQlleGNsdXNpdmVPckV4cHJlc3Npb24wYQotCQlhbmRFeHByZXNzaW9uCi0JKQotCXwKLQkJYW5kRXhwcmVzc2lvbgotCTsKLQotYW5kRXhwcmVzc2lvbjBhCi0JOgotCXJlZ2V4RXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlCQU5ECi0JCQlhbmRFeHByZXNzaW9uMGEKLQkJCXJlZ2V4RXhwcmVzc2lvbgotCQkpCi0JOwotCi1hbmRFeHByZXNzaW9uCi0JOgotCSMoIAotCQlCQU5ECi0JCWFuZEV4cHJlc3Npb24wYQotCQlyZWdleEV4cHJlc3Npb24KLQkpCi0JfAotCQlyZWdleEV4cHJlc3Npb24KLQk7Ci0KLXJlZ2V4RXhwcmVzc2lvbjBhCi0JOgotCWVxdWFsaXR5RXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlSRUdFWF9GSU5ECi0JCQlyZWdleEV4cHJlc3Npb24wYQotCQkJZXF1YWxpdHlFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJUkVHRVhfTUFUQ0gKLQkJCXJlZ2V4RXhwcmVzc2lvbjBiCi0JCQllcXVhbGl0eUV4cHJlc3Npb24KLQkJKQotCTsKLQotcmVnZXhFeHByZXNzaW9uMGIKLQk6Ci0JZXF1YWxpdHlFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVJFR0VYX0ZJTkQKLQkJCXJlZ2V4RXhwcmVzc2lvbjBhCi0JCQllcXVhbGl0eUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSRUdFWF9NQVRDSAotCQkJcmVnZXhFeHByZXNzaW9uMGIKLQkJCWVxdWFsaXR5RXhwcmVzc2lvbgotCQkpCi0JOwotCi1yZWdleEV4cHJlc3Npb24KLQk6Ci0JIyggCi0JCVJFR0VYX0ZJTkQKLQkJcmVnZXhFeHByZXNzaW9uMGEKLQkJZXF1YWxpdHlFeHByZXNzaW9uCi0JKQotCXwKLQkJIyggCi0JCQlSRUdFWF9NQVRDSAotCQkJcmVnZXhFeHByZXNzaW9uMGIKLQkJCWVxdWFsaXR5RXhwcmVzc2lvbgotCQkpCi0JfAotCQllcXVhbGl0eUV4cHJlc3Npb24KLQk7Ci0KLWVxdWFsaXR5RXhwcmVzc2lvbjBhCi0JOgotCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCU5PVF9FUVVBTAotCQkJZXF1YWxpdHlFeHByZXNzaW9uMGEKLQkJCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJRVFVQUwKLQkJCWVxdWFsaXR5RXhwcmVzc2lvbjBiCi0JCQlyZWxhdGlvbmFsRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCUNPTVBBUkVfVE8KLQkJCWVxdWFsaXR5RXhwcmVzc2lvbjBjCi0JCQlyZWxhdGlvbmFsRXhwcmVzc2lvbgotCQkpCi0JOwotCi1lcXVhbGl0eUV4cHJlc3Npb24wYgotCToKLQlyZWxhdGlvbmFsRXhwcmVzc2lvbgotCXwKLQkJIyggCi0JCQlOT1RfRVFVQUwKLQkJCWVxdWFsaXR5RXhwcmVzc2lvbjBhCi0JCQlyZWxhdGlvbmFsRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCUVRVUFMCi0JCQllcXVhbGl0eUV4cHJlc3Npb24wYgotCQkJcmVsYXRpb25hbEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlDT01QQVJFX1RPCi0JCQllcXVhbGl0eUV4cHJlc3Npb24wYwotCQkJcmVsYXRpb25hbEV4cHJlc3Npb24KLQkJKQotCTsKLQotZXF1YWxpdHlFeHByZXNzaW9uMGMKLQk6Ci0JcmVsYXRpb25hbEV4cHJlc3Npb24KLQl8Ci0JCSMoIAotCQkJTk9UX0VRVUFMCi0JCQllcXVhbGl0eUV4cHJlc3Npb24wYQotCQkJcmVsYXRpb25hbEV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlFUVVBTAotCQkJZXF1YWxpdHlFeHByZXNzaW9uMGIKLQkJCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJQ09NUEFSRV9UTwotCQkJZXF1YWxpdHlFeHByZXNzaW9uMGMKLQkJCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JCSkKLQk7Ci0KLWVxdWFsaXR5RXhwcmVzc2lvbgotCToKLQkjKCAKLQkJTk9UX0VRVUFMCi0JCWVxdWFsaXR5RXhwcmVzc2lvbjBhCi0JCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JKQotCXwKLQkJIyggCi0JCQlFUVVBTAotCQkJZXF1YWxpdHlFeHByZXNzaW9uMGIKLQkJCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJQ09NUEFSRV9UTwotCQkJZXF1YWxpdHlFeHByZXNzaW9uMGMKLQkJCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCXJlbGF0aW9uYWxFeHByZXNzaW9uCi0JOwotCi1yZWxhdGlvbmFsRXhwcmVzc2lvbgotCToKLQkjKCAKLQkJTFQKLQkJc2hpZnRFeHByZXNzaW9uCi0JCXNoaWZ0RXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJR1QKLQkJCXNoaWZ0RXhwcmVzc2lvbgotCQkJc2hpZnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJTEUKLQkJCXNoaWZ0RXhwcmVzc2lvbgotCQkJc2hpZnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJR0UKLQkJCXNoaWZ0RXhwcmVzc2lvbgotCQkJc2hpZnRFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJImluIgotCQkJc2hpZnRFeHByZXNzaW9uCi0JCQlzaGlmdEV4cHJlc3Npb24KLQkJKQotCXwKLQkJc2hpZnRFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCSJpbnN0YW5jZW9mIgotCQkJc2hpZnRFeHByZXNzaW9uCi0JCQl0eXBlU3BlYwotCQkpCi0JfAotCQkjKCAKLQkJCSJhcyIKLQkJCXNoaWZ0RXhwcmVzc2lvbgotCQkJdHlwZVNwZWMKLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGEKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGIKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGMKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGQKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGUKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uMGYKLQk6Ci0JYWRkaXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVNMCi0JCQlzaGlmdEV4cHJlc3Npb24wYQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBiCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlCU1IKLQkJCXNoaWZ0RXhwcmVzc2lvbjBjCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9JTkNMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBkCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBlCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlSQU5HRV9FWENMVVNJVkUKLQkJCXNoaWZ0RXhwcmVzc2lvbjBmCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkJKQotCTsKLQotc2hpZnRFeHByZXNzaW9uCi0JOgotCSMoIAotCQlTTAotCQlzaGlmdEV4cHJlc3Npb24wYQotCQlhZGRpdGl2ZUV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCVNSCi0JCQlzaGlmdEV4cHJlc3Npb24wYgotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJQlNSCi0JCQlzaGlmdEV4cHJlc3Npb24wYwotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJUkFOR0VfSU5DTFVTSVZFCi0JCQlzaGlmdEV4cHJlc3Npb24wZAotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJUkFOR0VfRVhDTFVTSVZFCi0JCQlzaGlmdEV4cHJlc3Npb24wZQotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJUkFOR0VfRVhDTFVTSVZFCi0JCQlzaGlmdEV4cHJlc3Npb24wZgotCQkJYWRkaXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCWFkZGl0aXZlRXhwcmVzc2lvbgotCTsKLQotYWRkaXRpdmVFeHByZXNzaW9uMGEKLQk6Ci0JbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCi0JfAotCQkjKCAKLQkJCVBMVVMKLQkJCWFkZGl0aXZlRXhwcmVzc2lvbjBhCi0JCQltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlNSU5VUwotCQkJYWRkaXRpdmVFeHByZXNzaW9uMGIKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgotCQkpCi0JOwotCi1hZGRpdGl2ZUV4cHJlc3Npb24wYgotCToKLQltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KLQl8Ci0JCSMoIAotCQkJUExVUwotCQkJYWRkaXRpdmVFeHByZXNzaW9uMGEKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCU1JTlVTCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24wYgotCQkJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCi0JCSkKLQk7Ci0KLWFkZGl0aXZlRXhwcmVzc2lvbgotCToKLQkjKCAKLQkJUExVUwotCQlhZGRpdGl2ZUV4cHJlc3Npb24wYQotCQltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCU1JTlVTCi0JCQlhZGRpdGl2ZUV4cHJlc3Npb24wYgotCQkJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgotCTsKLQotbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMGEKLQk6Ci0JIyggCi0JCUlOQwotCQlwb3dlckV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCVNUQVIKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBhCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlESVYKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBiCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlNT0QKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBjCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCTsKLQotbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMGIKLQk6Ci0JIyggCi0JCUlOQwotCQlwb3dlckV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCVNUQVIKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBhCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlESVYKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBiCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlNT0QKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBjCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCTsKLQotbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMGMKLQk6Ci0JIyggCi0JCUlOQwotCQlwb3dlckV4cHJlc3Npb24KLQkpCi0JfAotCQkjKCAKLQkJCVNUQVIKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBhCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlESVYKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBiCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlNT0QKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBjCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCTsKLQotbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCi0JOgotCSMoIAotCQlTVEFSCi0JCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjBhCi0JCXBvd2VyRXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJRElWCi0JCQltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24wYgotCQkJcG93ZXJFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJTU9ECi0JCQltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24wYwotCQkJcG93ZXJFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCSMoIAotCQkJU1RBUgotCQkJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMWEKLQkJCXBvd2VyRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCURJVgotCQkJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMWIKLQkJCXBvd2VyRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCU1PRAotCQkJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMWMKLQkJCXBvd2VyRXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCVNUQVIKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjRhCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlESVYKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjRiCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlNT0QKLQkJCW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjRjCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCXwKLQkJIyggCi0JCQlERUMKLQkJCXBvd2VyRXhwcmVzc2lvbgotCQkpCi0JfAotCQlwb3dlckV4cHJlc3Npb24KLQl8Ci0JCSMoIAotCQkJSU5DCi0JCQlwb3dlckV4cHJlc3Npb24KLQkJKQotCTsKLQotcG93ZXJFeHByZXNzaW9uMGEKLQk6Ci0JdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCi0JfAotCQkjKCAKLQkJCVNUQVJfU1RBUgotCQkJcG93ZXJFeHByZXNzaW9uMGEKLQkJCXVuYXJ5RXhwcmVzc2lvbgotCQkpCi0JOwotCi1wb3dlckV4cHJlc3Npb24KLQk6Ci0JIyggCi0JCVNUQVJfU1RBUgotCQlwb3dlckV4cHJlc3Npb24wYQotCQl1bmFyeUV4cHJlc3Npb24KLQkpCi0JfAotCQl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQk7Ci0KLXVuYXJ5RXhwcmVzc2lvbgotCToKLQkjKCAKLQkJREVDCi0JCXVuYXJ5RXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJVU5BUllfTUlOVVMKLQkJCXVuYXJ5RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCVVOQVJZX1BMVVMKLQkJCXVuYXJ5RXhwcmVzc2lvbgotCQkpCi0JfAotCQl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKLQl8Ci0JCSMoIAotCQkJSU5DCi0JCQl1bmFyeUV4cHJlc3Npb24KLQkJKQotCTsKLQotdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCi0JOgotCSMoIAotCQlMTk9UCi0JCXVuYXJ5RXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJTFBBUkVOCi0JCQlidWlsdEluVHlwZVNwZWMKLQkJCXVuYXJ5RXhwcmVzc2lvbgotCQkpCi0JfAotCQkjKCAKLQkJCUxQQVJFTgotCQkJY2xhc3NUeXBlU3BlYwotCQkJdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCi0JCSkKLQl8Ci0JCSMoIAotCQkJQk5PVAotCQkJdW5hcnlFeHByZXNzaW9uCi0JCSkKLQk7Ci0KLXBvc3RmaXhFeHByZXNzaW9uCi0JOgotCSMoIAotCQlQT1NUX0lOQwotCQlwYXRoRXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJUE9TVF9ERUMKLQkJCXBhdGhFeHByZXNzaW9uCi0JCSkKLQl8Ci0JCXBhdGhFeHByZXNzaW9uCi0JOwotCi1wcmltYXJ5RXhwcmVzc2lvbgotCToKLQlJREVOVAotCXwKLQkJY29uc3RhbnQKLQl8Ci0JCW5ld0V4cHJlc3Npb24KLQl8Ci0JCSJ0aGlzIgotCXwKLQkJInN1cGVyIgotCXwKLQkJcGFyZW50aGVzaXplZEV4cHJlc3Npb24KLQl8Ci0JCWNsb3N1cmVDb25zdHJ1Y3RvckV4cHJlc3Npb24KLQl8Ci0JCWxpc3RPck1hcENvbnN0cnVjdG9yRXhwcmVzc2lvbgotCXwKLQkJc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uCi0JfAotCQlzY29wZUVzY2FwZUV4cHJlc3Npb24KLQl8Ci0JCWJ1aWx0SW5UeXBlCi0JOwotCi1wYXJlbnRoZXNpemVkRXhwcmVzc2lvbgotCToKLQlzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgotCTsKLQotc2NvcGVFc2NhcGVFeHByZXNzaW9uCi0JOgotCSMoIAotCQlTQ09QRV9FU0NBUEUKLQkJKAotCQkJSURFTlQKLQkJCXwKLQkJCQlzY29wZUVzY2FwZUV4cHJlc3Npb24KLQkJKQotCSkKLQk7Ci0KLXN0cmljdENvbnRleHRFeHByZXNzaW9uCi0JOgotCSgKLQkJc2luZ2xlRGVjbGFyYXRpb24KLQkJfAotCQkJZXhwcmVzc2lvbgotCQl8Ci0JCQlicmFuY2hTdGF0ZW1lbnQKLQkJfAotCQkJYW5ub3RhdGlvbgotCSkKLQk7Ci0KLWNsb3N1cmVDb25zdHJ1Y3RvckV4cHJlc3Npb24KLQk6Ci0JY2xvc2VkQmxvY2sKLQk7Ci0KLXN0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbgotCToKLQlTVFJJTkdfQ1RPUl9TVEFSVAotCXN0cmluZ0NvbnN0cnVjdG9yVmFsdWVQYXJ0Ci0JKAotCQlTVFJJTkdfQ1RPUl9NSURETEUKLQkJc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKLQkpKgotCVNUUklOR19DVE9SX0VORAotCTsKLQotc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKLQk6Ci0JIyggCi0JCVNQUkVBRF9BUkcKLQkJKAotCQkJaWRlbnRpZmllcgotCQkJfAotCQkJCW9wZW5PckNsb3NlZEJsb2NrCi0JCSkKLQkpCi0JfAotCQkoCi0JCQlpZGVudGlmaWVyCi0JCQl8Ci0JCQkJb3Blbk9yQ2xvc2VkQmxvY2sKLQkJKQotCTsKLQotbGlzdE9yTWFwQ29uc3RydWN0b3JFeHByZXNzaW9uCi0JOgotCUxCUkFDSwotCXwKLQkJIyggCi0JCQlMQlJBQ0sKLQkJCWFyZ0xpc3QKLQkJKQotCTsKLQotbmV3RXhwcmVzc2lvbgotCToKLQkjKCAKLQkJIm5ldyIKLQkJKAotCQkJdHlwZUFyZ3VtZW50cwotCQkpPwotCQl0eXBlCi0JCSgKLQkJCW5ld0FycmF5RGVjbGFyYXRvcgotCQkJfAotCQkpCi0JKQotCTsKLQotYXJnTGlzdAotCToKLQkoCi0JCWFyZ3VtZW50Ci0JCSgKLQkJCWFyZ3VtZW50Ci0JCSkqCi0JCXwKLQkpCi0JOwotCi1hcmd1bWVudAotCToKLQkjKCAKLQkJTEFCRUxFRF9BUkcKLQkJYXJndW1lbnRMYWJlbAotCQlzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgotCSkKLQl8Ci0JCSMoIAotCQkJU1BSRUFEX0FSRwotCQkJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KLQkJKQotCXwKLQkJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KLQk7Ci0KLWFyZ3VtZW50TGFiZWwKLQk6Ci0JSURFTlQKLQl8Ci0JCWtleXdvcmRQcm9wZXJ0eU5hbWVzCi0JfAotCQlwcmltYXJ5RXhwcmVzc2lvbgotCTsKLQotbmV3QXJyYXlEZWNsYXJhdG9yMGEKLQk6Ci0JIyggCi0JCUFSUkFZX0RFQ0xBUkFUT1IKLQkJbmV3QXJyYXlEZWNsYXJhdG9yMGEKLQkJKAotCQkJZXhwcmVzc2lvbgotCQkpPwotCSkKLQl8Ci0JOwotCi1uZXdBcnJheURlY2xhcmF0b3IKLQk6Ci0JIyggCi0JCUFSUkFZX0RFQ0xBUkFUT1IKLQkJbmV3QXJyYXlEZWNsYXJhdG9yMGEKLQkJKAotCQkJZXhwcmVzc2lvbgotCQkpPwotCSkKLQk7Ci0KLWNvbnN0YW50Ci0JOgotCWNvbnN0YW50TnVtYmVyCi0JfAotCQlTVFJJTkdfTElURVJBTAotCXwKLQkJInRydWUiCi0JfAotCQkiZmFsc2UiCi0JfAotCQkibnVsbCIKLQk7Ci0KLWNvbnN0YW50TnVtYmVyCi0JOgotCU5VTV9JTlQKLQl8Ci0JCU5VTV9GTE9BVAotCXwKLQkJTlVNX0xPTkcKLQl8Ci0JCU5VTV9ET1VCTEUKLQl8Ci0JCU5VTV9CSUdfSU5UCi0JfAotCQlOVU1fQklHX0RFQ0lNQUwKLQk7CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdHJlZXdhbGtlci90cmVlLmNvbnN0cnVjdGlvbi5wYXRjaCBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL3RyZWUuY29uc3RydWN0aW9uLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ1NzVkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL3RyZWUuY29uc3RydWN0aW9uLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLUluZGV4OiBncm9vdnkuZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IC9ob21lL3Byb2plY3RzL2dyb292eS9zY20vZ3Jvb3Z5L2dyb292eS1jb3JlL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvZ3Jvb3Z5LmcsdgotcmV0cmlldmluZyByZXZpc2lvbiAxLjI0Ci1kaWZmIC1jIC1yMS4yNCBncm9vdnkuZwotKioqIGdyb292eS5nCTEzIEFwciAyMDA1IDIxOjQ1OjU0IC0wMDAwCTEuMjQKLS0tLSBncm9vdnkuZwkxOSBBcHIgMjAwNSAyMTozMjowNSAtMDAwMAotKioqKioqKioqKioqKioqCi0qKiogMzg3LDM5MyAqKioqCi0gIC8vIFBhY2thZ2Ugc3RhdGVtZW50OiBvcHRpb25hbCBhbm5vdGF0aW9ucyBmb2xsb3dlZCBieSAicGFja2FnZSIgdGhlbiB0aGUgcGFja2FnZSBpZGVudGlmaWVyLgotICBwYWNrYWdlRGVmaW5pdGlvbgotICAgICAgICAgIC8vVE9ETz8gb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fSAvLyBsZXQgQU5UTFIgaGFuZGxlIGVycm9ycwotISAgICAgOiAgIGFubm90YXRpb25zT3B0IHA6InBhY2thZ2UiXiB7I3Auc2V0VHlwZShQQUNLQUdFX0RFRik7fSBpZGVudGlmaWVyCi0gICAgICA7Ci0gIAotICAKLS0tLSAzODcsMzkzIC0tLS0KLSAgLy8gUGFja2FnZSBzdGF0ZW1lbnQ6IG9wdGlvbmFsIGFubm90YXRpb25zIGZvbGxvd2VkIGJ5ICJwYWNrYWdlIiB0aGVuIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIuCi0gIHBhY2thZ2VEZWZpbml0aW9uCi0gICAgICAgICAgLy9UT0RPPyBvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9IC8vIGxldCBBTlRMUiBoYW5kbGUgZXJyb3JzCi0hICAgICA6ICAgYW5ub3RhdGlvbnNPcHQgInBhY2thZ2UiISBeW1BBQ0tBR0VfREVGLCJwYWNrYWdlIl1eIGlkZW50aWZpZXIgCi0gICAgICA7Ci0gIAotICAKLSoqKioqKioqKioqKioqKgotKioqIDYwMiw2MDggKioqKgotICAKLSAgLy8gV2lsZGNhcmQgdHlwZSBpbmRpY2F0aW5nIGFsbCB0eXBlcyAod2l0aCBwb3NzaWJsZSBjb25zdHJhaW50KQotICB3aWxkY2FyZFR5cGUKLSEgICAgIDogICBxOlFVRVNUSU9OXiB7I3Euc2V0VHlwZShXSUxEQ0FSRF9UWVBFKTt9Ci0gICAgICAgICAgKCgiZXh0ZW5kcyIgfCAic3VwZXIiKT0+IHR5cGVBcmd1bWVudEJvdW5kcyk/Ci0gICAgICA7Ci0gIAotLS0tIDYwMiw2MDggLS0tLQotICAKLSAgLy8gV2lsZGNhcmQgdHlwZSBpbmRpY2F0aW5nIGFsbCB0eXBlcyAod2l0aCBwb3NzaWJsZSBjb25zdHJhaW50KQotICB3aWxkY2FyZFR5cGUKLSEgICAgIDogICBRVUVTVElPTiEgXltXSUxEQ0FSRF9UWVBFLCI/Il1eCi0gICAgICAgICAgKCgiZXh0ZW5kcyIgfCAic3VwZXIiKT0+IHR5cGVBcmd1bWVudEJvdW5kcyk/Ci0gICAgICA7Ci0gIAotKioqKioqKioqKioqKioqCi0qKiogODA4LDgxNCAqKioqCi0gIC8qT0JTKgotICAvLyBUaGlzIGlzIGFuIGluaXRpYWxpemVyIHVzZWQgdG8gc2V0IHVwIGFuIGFubm90YXRpb24gbWVtYmVyIGFycmF5LgotICBhbm5vdGF0aW9uTWVtYmVyQXJyYXlJbml0aWFsaXplcgotISAgICAgOiAgIGxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKEFOTk9UQVRJT05fQVJSQVlfSU5JVCk7fQotICAgICAgICAgICggICBhbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCi0gICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgIC8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKLS0tLSA4MDgsODE0IC0tLS0KLSAgLypPQlMqCi0gIC8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYW5ub3RhdGlvbiBtZW1iZXIgYXJyYXkuCi0gIGFubm90YXRpb25NZW1iZXJBcnJheUluaXRpYWxpemVyCi0hICAgICA6ICAgTENVUkxZISBeW0FOTk9UQVRJT05fQVJSQVlfSU5JVCwieyJdXgotICAgICAgICAgICggICBhbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCi0gICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgIC8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKLSoqKioqKioqKioqKioqKgotKioqIDExNDMsMTE0OSAqKioqCi0gICAgICA7Ci0gIAotICBjb25zdHJ1Y3RvckJvZHkKLSEgICAgIDogICBsYzpMQ1VSTFleIG5scyEgICAgICAgICB7I2xjLnNldFR5cGUoU0xJU1QpO30KLSAgICAgICAgICAoICAgKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKSA9PiAgIC8vIEphdmEgY29tcGF0aWJpbGl0eSBoYWNrCi0gICAgICAgICAgICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiAoc2VwISBibG9ja0JvZHlbc2VwVG9rZW5dKT8KLSAgICAgICAgICAgICAgfCAgIGJsb2NrQm9keVtFT0ZdCi0tLS0gMTE0MywxMTQ5IC0tLS0KLSAgICAgIDsKLSAgCi0gIGNvbnN0cnVjdG9yQm9keQotISAgICAgOiAgIExDVVJMWSEgXltTTElTVCwieyJdXiBubHMhICAgICAgICAgCi0gICAgICAgICAgKCAgIChleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbikgPT4gICAvLyBKYXZhIGNvbXBhdGliaWxpdHkgaGFjawotICAgICAgICAgICAgICAgICAgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gKHNlcCEgYmxvY2tCb2R5W3NlcFRva2VuXSk/Ci0gICAgICAgICAgICAgIHwgICBibG9ja0JvZHlbRU9GXQotKioqKioqKioqKioqKioqCi0qKiogMTE1NSwxMTY0ICoqKioKLSAgLyoqIENhdGNoIG9idmlvdXMgY29uc3RydWN0b3IgY2FsbHMsIGJ1dCBub3QgdGhlIGV4cHIuc3VwZXIoLi4uKSBjYWxscyAqLwotICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotICAgICAgOiAgICh0eXBlQXJndW1lbnRzKT8KLSEgICAgICAgICAoICAgInRoaXMiISBscDE6TFBBUkVOXiBhcmdMaXN0IFJQQVJFTiEKLSEgICAgICAgICAgICAgeyNscDEuc2V0VHlwZShDVE9SX0NBTEwpO30KLSEgICAgICAgICB8ICAgInN1cGVyIiEgbHAyOkxQQVJFTl4gYXJnTGlzdCBSUEFSRU4hCi0hICAgICAgICAgICAgIHsjbHAyLnNldFR5cGUoU1VQRVJfQ1RPUl9DQUxMKTt9Ci0gICAgICAgICAgKQotICAgICAgOwotICAKLS0tLSAxMTU1LDExNjIgLS0tLQotICAvKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCi0gIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uCi0gICAgICA6ICAgKHR5cGVBcmd1bWVudHMpPwotISAgICAgICAgICggICAidGhpcyIhIExQQVJFTiEgXltDVE9SX0NBTEwsIigiXV4gYXJnTGlzdCBSUEFSRU4hCi0hICAgICAgICAgfCAgICJzdXBlciIhIExQQVJFTiEgXltTVVBFUl9DVE9SX0NBTEwsIigiXV4gYXJnTGlzdCBSUEFSRU4hCi0gICAgICAgICAgKQotICAgICAgOwotICAKLSoqKioqKioqKioqKioqKgotKioqIDExODIsMTE4NyAqKioqCi0tLS0gMTE4MCwxMTg2IC0tLS0KLSAgCi0gICAgICAgICAgKCAgIGlkOklERU5UCi0gICAgICAgICAgfCAgIHFpZDpTVFJJTkdfTElURVJBTCAgICAgICAgICB7I3FpZC5zZXRUeXBlKElERU5UKTt9ICAvLyB1c2UgZm9yIG9wZXJhdG9yIGRlZmludGlvbnMsIGV0Yy4KLSsgICAgICAgICAgICAgLy90b2RvIEFkZCBeW0lERU5ULD8/Pz9dIHRyZWUgY29uc3RydWN0aW9uIHN5bnRheAotICAgICAgICAgICkKLSAgCi0gICAgICAgICAgLy8gcGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgotKioqKioqKioqKioqKioqCi0qKiogMTI2NywxMjczICoqKioKLSAgICAgICAgICAoCi0gICAgICAgICAgICAgIC8vIEEgZm9sbG93aW5nIGxpc3QgY29uc3RydWN0b3IgbWlnaHQgY29uZmxpY3Qgd2l0aCBpbmRleCBicmFja2V0czsgcHJlZmVyIHRoZSBkZWNsYXJhdG9yLgotICAgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSEgICAgICAgICAgICAgbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCi0gICAgICAgICAgKSoKLSAgICAgIDsKLSAgCi0tLS0gMTI2NiwxMjcyIC0tLS0KLSAgICAgICAgICAoCi0gICAgICAgICAgICAgIC8vIEEgZm9sbG93aW5nIGxpc3QgY29uc3RydWN0b3IgbWlnaHQgY29uZmxpY3Qgd2l0aCBpbmRleCBicmFja2V0czsgcHJlZmVyIHRoZSBkZWNsYXJhdG9yLgotICAgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSEgICAgICAgICAgICAgTEJSQUNLISBeW0FSUkFZX0RFQ0xBUkFUT1IsIigiXV4gUkJSQUNLIQotICAgICAgICAgICkqCi0gICAgICA7Ci0gIAotKioqKioqKioqKioqKioqCi0qKiogMTI4MCwxMjg2ICoqKioKLSAgLypPQlMqCi0gIC8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYXJyYXkuCi0gIGFycmF5SW5pdGlhbGl6ZXIKLSEgICAgIDogICBsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBUlJBWV9JTklUKTt9Ci0gICAgICAgICAgKCAgIGluaXRpYWxpemVyCi0gICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgIC8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKLS0tLSAxMjc5LDEyODUgLS0tLQotICAvKk9CUyoKLSAgLy8gVGhpcyBpcyBhbiBpbml0aWFsaXplciB1c2VkIHRvIHNldCB1cCBhbiBhcnJheS4KLSAgYXJyYXlJbml0aWFsaXplcgotISAgICAgOiAgIExDVVJMWSEgXltBUlJBWV9JTklULCJ7Il1eCi0gICAgICAgICAgKCAgIGluaXRpYWxpemVyCi0gICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgIC8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKLSoqKioqKioqKioqKioqKgotKioqIDE0OTQsMTUwMCAqKioqCi0gIAotICAvKiogQW4gb3BlbiBibG9jayBpcyBub3QgYWxsb3dlZCB0byBoYXZlIGNsb3N1cmUgYXJndW1lbnRzLiAqLwotICBvcGVuQmxvY2sKLSEgICAgIDogICBsYzpMQ1VSTFleIG5scyEgICAgIHsjbGMuc2V0VHlwZShTTElTVCk7fQotICAgICAgICAgIC8vIEFTVCB0eXBlIG9mIFNMSVNUIG1lYW5zICJuZXZlciBnb25uYSBiZSBhIGNsb3N1cmUiCi0gICAgICAgICAgYmxvY2tCb2R5W0VPRl0KLSAgICAgICAgICBSQ1VSTFkhCi0tLS0gMTQ5MywxNDk5IC0tLS0KLSAgCi0gIC8qKiBBbiBvcGVuIGJsb2NrIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgY2xvc3VyZSBhcmd1bWVudHMuICovCi0gIG9wZW5CbG9jawotISAgICAgOiAgIExDVVJMWSEgXltTTElTVCwieyJdXiBubHMhICAgICAKLSAgICAgICAgICAvLyBBU1QgdHlwZSBvZiBTTElTVCBtZWFucyAibmV2ZXIgZ29ubmEgYmUgYSBjbG9zdXJlIgotICAgICAgICAgIGJsb2NrQm9keVtFT0ZdCi0gICAgICAgICAgUkNVUkxZIQotKioqKioqKioqKioqKioqCi0qKiogMTUxMSwxNTE3ICoqKioKLSAgICogIE9ubHkgbGFiZWxlZCwgdW5wYXJhbWV0ZXJpemVkIGJsb2NrcyB3aGljaCBvY2N1ciBkaXJlY3RseSBhcyBzdWJzdGF0ZW1lbnRzIGFyZSBrZXB0IG9wZW4uCi0gICAqLwotICBjbG9zZWRCbG9jawotISAgICAgOiAgIGxjOkxDVVJMWV4gbmxzISAgICAgeyNsYy5zZXRUeXBlKENMT1NFRF9CTE9DSyk7fQotICAgICAgICAgIGNsb3N1cmVQYXJhbWV0ZXJzT3B0W3RydWVdCi0gICAgICAgICAgYmxvY2tCb2R5W0VPRl0KLSAgICAgICAgICBSQ1VSTFkhCi0tLS0gMTUxMCwxNTE2IC0tLS0KLSAgICogIE9ubHkgbGFiZWxlZCwgdW5wYXJhbWV0ZXJpemVkIGJsb2NrcyB3aGljaCBvY2N1ciBkaXJlY3RseSBhcyBzdWJzdGF0ZW1lbnRzIGFyZSBrZXB0IG9wZW4uCi0gICAqLwotICBjbG9zZWRCbG9jawotISAgICAgOiAgIExDVVJMWSEgXltDTE9TRURfQkxPQ0ssInsiXV4gbmxzISAgICAgCi0gICAgICAgICAgY2xvc3VyZVBhcmFtZXRlcnNPcHRbdHJ1ZV0KLSAgICAgICAgICBibG9ja0JvZHlbRU9GXQotICAgICAgICAgIFJDVVJMWSEKLSoqKioqKioqKioqKioqKgotKioqIDE1MzMsMTUzOCAqKioqCi0tLS0gMTUzMiwxNTM4IC0tLS0KLSAgb3Blbk9yQ2xvc2VkQmxvY2sKLSAgICAgIDogICBsYzpMQ1VSTFleIG5scyEKLSAgICAgICAgICBjcDpjbG9zdXJlUGFyYW1ldGVyc09wdFtmYWxzZV0KLSsgICAgICAgICAvLyB0b2RvIHVzZSBeW1NMSVNULD8/P10gb3IgXltDTE9TRURfQkxPQ0ssPz8/XSB0cmVlIGNvbnN0cnVjdGlvbiBzeW50YXgKLSAgICAgICAgICB7ICAgaWYgKCNjcCA9PSBudWxsKSAgICAjbGMuc2V0VHlwZShTTElTVCk7Ci0gICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgI2xjLnNldFR5cGUoQ0xPU0VEX0JMT0NLKTsKLSAgICAgICAgICB9Ci0qKioqKioqKioqKioqKioKLSoqKiAxNjA0LDE2MTAgKioqKgotICAKLSAgICAgIC8vIFNwbGljZSBzdGF0ZW1lbnQsIG1lYW5pbmdmdWwgb25seSBpbnNpZGUgYSAid2l0aCIgZXhwcmVzc2lvbi4KLSAgICAgIC8vIFBST1BPU0VELCBERUNJREUuICBQcmV2ZW50cyB0aGUgbmFtZXNwYWNlIHBvbGx1dGlvbiBvZiBhICJ0ZXh0IiBtZXRob2Qgb3Igc29tZSBzdWNoLgotISAgICAgfCAgIHNwOlNUQVJeIG5scyEgICAgICAgICAgICAgICAgICAgICAgIHsjc3Auc2V0VHlwZShTUFJFQURfQVJHKTt9Ci0gICAgICAgICAgZXhwcmVzc2lvblN0YXRlbWVudFtFT0ZdCi0gICAgICAvLyBFeGFtcGxlOiAgd2l0aChodG1sYnVpbGRlcikgeyBoZWFke30gYm9keXsgKiJzb21lIHRleHQiIH0gfQotICAgICAgLy8gRXF1aXZhbGVudCB0bzogIHsgaHRtbGJ1aWxkZXIuaGVhZHt9IGh0bWxidWlsZGVyLmJvZHl7IChodG1sYnVpbGRlciBhcyBDb2xsZWN0aW9uKS5hZGQoInNvbWUgdGV4dCIpIH0gfQotLS0tIDE2MDQsMTYxMCAtLS0tCi0gIAotICAgICAgLy8gU3BsaWNlIHN0YXRlbWVudCwgbWVhbmluZ2Z1bCBvbmx5IGluc2lkZSBhICJ3aXRoIiBleHByZXNzaW9uLgotICAgICAgLy8gUFJPUE9TRUQsIERFQ0lERS4gIFByZXZlbnRzIHRoZSBuYW1lc3BhY2UgcG9sbHV0aW9uIG9mIGEgInRleHQiIG1ldGhvZCBvciBzb21lIHN1Y2guCi0hICAgICB8ICAgU1RBUiEgXltTUFJFQURfQVJHLCIqIl1eIG5scyEgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGV4cHJlc3Npb25TdGF0ZW1lbnRbRU9GXQotICAgICAgLy8gRXhhbXBsZTogIHdpdGgoaHRtbGJ1aWxkZXIpIHsgaGVhZHt9IGJvZHl7ICoic29tZSB0ZXh0IiB9IH0KLSAgICAgIC8vIEVxdWl2YWxlbnQgdG86ICB7IGh0bWxidWlsZGVyLmhlYWR7fSBodG1sYnVpbGRlci5ib2R5eyAoaHRtbGJ1aWxkZXIgYXMgQ29sbGVjdGlvbikuYWRkKCJzb21lIHRleHQiKSB9IH0KLSoqKioqKioqKioqKioqKgotKioqIDE2MjYsMTYzMiAqKioqCi0gIAotICAgICAgLypPQlMqCi0gICAgICAvLyBlbXB0eSBzdGF0ZW1lbnQKLSEgICAgIHwgICBzOlNFTUkgeyNzLnNldFR5cGUoRU1QVFlfU1RBVCk7fQotICAgICAgKk9CUyovCi0gIAotICAgICAgfCAgIGJyYW5jaFN0YXRlbWVudAotLS0tIDE2MjYsMTYzMiAtLS0tCi0gIAotICAgICAgLypPQlMqCi0gICAgICAvLyBlbXB0eSBzdGF0ZW1lbnQKLSEgICAgIHwgICBTRU1JIF5bRU1QVFlfU1RBVCwiOyJdCi0gICAgICAqT0JTKi8KLSAgCi0gICAgICB8ICAgYnJhbmNoU3RhdGVtZW50Ci0qKioqKioqKioqKioqKioKLSoqKiAxNzM4LDE3NDQgKioqKgotICAvKiogQSBsYWJlbGVkIHN0YXRlbWVudCwgY29uc2lzdGluZyBvZiBhIHZhbmlsbGEgaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLiAqLwotICAvLyBOb3RlOiAgQWx3YXlzIHVzZSB0aGlzIGxvb2thaGVhZCwgdG8ga2VlcCBhbnRsciBmcm9tIHBhbmlja2luZzogKElERU5UIENPTE9OKT0+Ci0gIHN0YXRlbWVudExhYmVsUHJlZml4Ci0hICAgICA6ICAgSURFTlQgYzpDT0xPTl4geyNjLnNldFR5cGUoTEFCRUxFRF9TVEFUKTt9Ci0gICAgICA7Ci0gIAotICAvKiogQW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgY2FuIGJlIGFueSBnZW5lcmFsIGV4cHJlc3Npb24uCi0tLS0gMTczOCwxNzQ0IC0tLS0KLSAgLyoqIEEgbGFiZWxlZCBzdGF0ZW1lbnQsIGNvbnNpc3Rpbmcgb2YgYSB2YW5pbGxhIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYSBjb2xvbi4gKi8KLSAgLy8gTm90ZTogIEFsd2F5cyB1c2UgdGhpcyBsb29rYWhlYWQsIHRvIGtlZXAgYW50bHIgZnJvbSBwYW5pY2tpbmc6IChJREVOVCBDT0xPTik9PgotICBzdGF0ZW1lbnRMYWJlbFByZWZpeAotISAgICAgOiAgIElERU5UIENPTE9OISBeW0xBQkVMRURfU1RBVCwiOiJdXgotICAgICAgOwotICAKLSAgLyoqIEFuIGV4cHJlc3Npb24gc3RhdGVtZW50IGNhbiBiZSBhbnkgZ2VuZXJhbCBleHByZXNzaW9uLgotKioqKioqKioqKioqKioqCi0qKiogMTkxMCwxOTE1ICoqKioKLS0tLSAxOTEwLDE5MTYgLS0tLQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQVNUIGVsaXN0ID0gIygjW0VMSVNULCJFTElTVCJdLCAjY29tbWFuZEFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgIEFTVCBoZWFkaWQgPSBnZXRBU1RGYWN0b3J5KCkuZHVwKCNoZWFkKTsKLSsgICAgICAgICAgICAgLy90b2RvIHBvc3NpYmx5IHVzZSBeW01FVEhPRF9DQUxMLD8/P10gdHJlZSBjb25zdHJ1Y3Rpb24gaGVyZQotICAgICAgICAgICAgICBoZWFkaWQuc2V0VHlwZShNRVRIT0RfQ0FMTCk7Ci0gICAgICAgICAgICAgIGhlYWRpZC5zZXRUZXh0KCI8Y29tbWFuZD4iKTsKLSAgICAgICAgICAgICAgI2NvbW1hbmRBcmd1bWVudHMgPSAjKGhlYWRpZCwgaGVhZCwgZWxpc3QpOwotKioqKioqKioqKioqKioqCi0qKiogMjA0OCwyMDU3ICoqKioKLSAgCi0gICAgICB8ICAgRE9UXiBubHMhICJzdXBlciIKLSAgICAgICAgICAoICAgLy8gKG5ldyBPdXRlcigpKS5zdXBlcigpICAoY3JlYXRlIGVuY2xvc2luZyBpbnN0YW5jZSkKLSEgICAgICAgICAgICAgbHAzOkxQQVJFTl4gYXJnTGlzdCBSUEFSRU4hCi0hICAgICAgICAgICAgIHsjbHAzLnNldFR5cGUoU1VQRVJfQ1RPUl9DQUxMKTt9Ci0gICAgICAgICAgfCAgIERPVF4gSURFTlQKLSEgICAgICAgICAgICAgKCAgIGxwczpMUEFSRU5eIHsjbHBzLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KLSAgICAgICAgICAgICAgICAgIGFyZ0xpc3QKLSAgICAgICAgICAgICAgICAgIFJQQVJFTiEKLSAgICAgICAgICAgICAgKT8KLS0tLSAyMDQ5LDIwNTcgLS0tLQotICAKLSAgICAgIHwgICBET1ReIG5scyEgInN1cGVyIgotICAgICAgICAgICggICAvLyAobmV3IE91dGVyKCkpLnN1cGVyKCkgIChjcmVhdGUgZW5jbG9zaW5nIGluc3RhbmNlKQotISAgICAgICAgICAgICBMUEFSRU4hIF5bU1VQRVJfQ1RPUl9DQUxMLCIoIl1eIGFyZ0xpc3QgUlBBUkVOIQotICAgICAgICAgIHwgICBET1ReIElERU5UCi0hICAgICAgICAgICAgICggICBMUEFSRU4hIF5bTUVUSE9EX0NBTEwsIigiXV4KLSAgICAgICAgICAgICAgICAgIGFyZ0xpc3QKLSAgICAgICAgICAgICAgICAgIFJQQVJFTiEKLSAgICAgICAgICAgICAgKT8KLSoqKioqKioqKioqKioqKgotKioqIDIxNjAsMjE2NiAqKioqCi0gIG1ldGhvZENhbGxBcmdzW0FTVCBjYWxsZWVdCi0gICAgICA6Ci0gICAgICAgICAgeyNtZXRob2RDYWxsQXJncyA9IGNhbGxlZTt9Ci0hICAgICAgICAgbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KLSAgICAgICAgICBhcmdMaXN0Ci0gICAgICAgICAgUlBBUkVOIQotICAgICAgOwotLS0tIDIxNjAsMjE2NiAtLS0tCi0gIG1ldGhvZENhbGxBcmdzW0FTVCBjYWxsZWVdCi0gICAgICA6Ci0gICAgICAgICAgeyNtZXRob2RDYWxsQXJncyA9IGNhbGxlZTt9Ci0hICAgICAgICAgTFBBUkVOISBeW01FVEhPRF9DQUxMLCIoIl1eCi0gICAgICAgICAgYXJnTGlzdAotICAgICAgICAgIFJQQVJFTiEKLSAgICAgIDsKLSoqKioqKioqKioqKioqKgotKioqIDIxOTcsMjIwMyAqKioqCi0gIGluZGV4UHJvcGVydHlBcmdzW0FTVCBpbmRleGVlXQotICAgICAgOgotICAgICAgICAgIHsjaW5kZXhQcm9wZXJ0eUFyZ3MgPSBpbmRleGVlO30KLSEgICAgICAgICBsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShJTkRFWF9PUCk7fQotICAgICAgICAgIGFyZ0xpc3QKLSAgICAgICAgICBSQlJBQ0shCi0gICAgICA7Ci0tLS0gMjE5NywyMjAzIC0tLS0KLSAgaW5kZXhQcm9wZXJ0eUFyZ3NbQVNUIGluZGV4ZWVdCi0gICAgICA6Ci0gICAgICAgICAgeyNpbmRleFByb3BlcnR5QXJncyA9IGluZGV4ZWU7fQotISAgICAgICAgIExCUkFDSyEgXltJTkRFWF9PUCwiKCJdXgotICAgICAgICAgIGFyZ0xpc3QKLSAgICAgICAgICBSQlJBQ0shCi0gICAgICA7Ci0qKioqKioqKioqKioqKioKLSoqKiAyMzAxLDIzMDcgKioqKgotICAgICAgICAgICAgICAoKFNMXiB8IFNSXiB8IEJTUl4pCi0gICAgICAgICAgICAgIHwgICBSQU5HRV9JTkNMVVNJVkVeCi0gICAgICAgICAgICAgIHwgICBSQU5HRV9FWENMVVNJVkVeCi0hICAgICAgICAgICAgIHwgICB0ZDpUUklQTEVfRE9UXiB7I3RkLnNldFR5cGUoUkFOR0VfRVhDTFVTSVZFKTt9IC8qIGJhY2t3YXJkIGNvbXBhdDogRklYTUUgUkVNT1ZFICovCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgbmxzIQotICAgICAgICAgICAgICBhZGRpdGl2ZUV4cHJlc3Npb25bMF0KLS0tLSAyMzAxLDIzMDcgLS0tLQotICAgICAgICAgICAgICAoKFNMXiB8IFNSXiB8IEJTUl4pCi0gICAgICAgICAgICAgIHwgICBSQU5HRV9JTkNMVVNJVkVeCi0gICAgICAgICAgICAgIHwgICBSQU5HRV9FWENMVVNJVkVeCi0hICAgICAgICAgICAgIHwgICBUUklQTEVfRE9UISBeW1JBTkdFX0VYQ0xVU0lWRSwiLi4uIl1eIC8qIGJhY2t3YXJkIGNvbXBhdDogRklYTUUgUkVNT1ZFICovCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgbmxzIQotICAgICAgICAgICAgICBhZGRpdGl2ZUV4cHJlc3Npb25bMF0KLSoqKioqKioqKioqKioqKgotKioqIDIzMjUsMjMzMiAqKioqCi0gIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KLSAgICAgIDogICAgKCBJTkNeIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQotICAgICAgfCAgICAoIERFQ14gbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdICgoU1RBUl4gfCBESVZeIHwgTU9EXiApICBubHMhICBwb3dlckV4cHJlc3Npb25bMF0pKiApCi0hICAgICB8ICAgICggTUlOVVNeIHsjTUlOVVMuc2V0VHlwZShVTkFSWV9NSU5VUyk7fSBubHMhICAgcG93ZXJFeHByZXNzaW9uWzBdICgoU1RBUl4gfCBESVZeIHwgTU9EXiApICBubHMhICBwb3dlckV4cHJlc3Npb25bMF0pKiApCi0hICAgICB8ICAgICggUExVU14geyNQTFVTLnNldFR5cGUoVU5BUllfUExVUyk7fSBubHMhICAgcG93ZXJFeHByZXNzaW9uWzBdICgoU1RBUl4gfCBESVZeIHwgTU9EXiApICBubHMhICBwb3dlckV4cHJlc3Npb25bMF0pKiApCi0gICAgICB8ICAgICggIHBvd2VyRXhwcmVzc2lvbltsY19zdG10XSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQotICAgICAgOwotICAKLS0tLSAyMzI1LDIzMzIgLS0tLQotICBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25baW50IGxjX3N0bXRdCi0gICAgICA6ICAgICggSU5DXiBubHMhICBwb3dlckV4cHJlc3Npb25bMF0gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSkqICkKLSAgICAgIHwgICAgKCBERUNeIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQotISAgICAgfCAgICAoIE1JTlVTISBeW1VOQVJZX01JTlVTLCItIl1eIG5scyEgICBwb3dlckV4cHJlc3Npb25bMF0gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSkqICkKLSEgICAgIHwgICAgKCBQTFVTISBeW1VOQVJZX1BMVVMsIisiXV4gbmxzISAgIHBvd2VyRXhwcmVzc2lvblswXSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQotICAgICAgfCAgICAoICBwb3dlckV4cHJlc3Npb25bbGNfc3RtdF0gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSkqICkKLSAgICAgIDsKLSAgCi0qKioqKioqKioqKioqKioKLSoqKiAyMzM5LDIzNDYgKioqKgotICB1bmFyeUV4cHJlc3Npb25baW50IGxjX3N0bXRdCi0gICAgICA6ICAgSU5DXiBubHMhIHVuYXJ5RXhwcmVzc2lvblswXQotICAgICAgfCAgIERFQ14gbmxzISB1bmFyeUV4cHJlc3Npb25bMF0KLSEgICAgIHwgICBNSU5VU14gICB7I01JTlVTLnNldFR5cGUoVU5BUllfTUlOVVMpO30gICBubHMhIHVuYXJ5RXhwcmVzc2lvblswXQotISAgICAgfCAgIFBMVVNeICAgIHsjUExVUy5zZXRUeXBlKFVOQVJZX1BMVVMpO30gICAgIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdCi0gICAgICB8ICAgdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzW2xjX3N0bXRdCi0gICAgICA7Ci0gIAotLS0tIDIzMzksMjM0NiAtLS0tCi0gIHVuYXJ5RXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KLSAgICAgIDogICBJTkNeIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdCi0gICAgICB8ICAgREVDXiBubHMhIHVuYXJ5RXhwcmVzc2lvblswXQotISAgICAgfCAgIE1JTlVTISAgIF5bVU5BUllfTUlOVVMsIi0iXV4gICBubHMhIHVuYXJ5RXhwcmVzc2lvblswXQotISAgICAgfCAgIFBMVVMhICAgIF5bVU5BUllfUExVUywiKyJdXiAgICAgbmxzISB1bmFyeUV4cHJlc3Npb25bMF0KLSAgICAgIHwgICB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNbbGNfc3RtdF0KLSAgICAgIDsKLSAgCi0qKioqKioqKioqKioqKioKLSoqKiAyMzgyLDIzODkgKioqKgotICAgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSAgICAgICAgICAgICAgLy8gcG9zc2libHkgYWRkIG9uIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQuCi0gICAgICAgICAgICAgIC8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjawotISAgICAgICAgICAgICBpbjpJTkNeIHsjaW4uc2V0VHlwZShQT1NUX0lOQyk7fQotISAgICAgICAgIHwgICBkZTpERUNeIHsjZGUuc2V0VHlwZShQT1NUX0RFQyk7fQotICAgICAgICAgICk/Ci0gICAgICA7Ci0gICAgICAKLS0tLSAyMzgyLDIzODkgLS0tLQotICAgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSAgICAgICAgICAgICAgLy8gcG9zc2libHkgYWRkIG9uIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQuCi0gICAgICAgICAgICAgIC8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjawotISAgICAgICAgICAgICBJTkMhIF5bUE9TVF9JTkMsIisrIl1eCi0hICAgICAgICAgfCAgIERFQyEgXltQT1NUX0RFQywiLS0iXV4KLSAgICAgICAgICApPwotICAgICAgOwotICAgICAgCi0qKioqKioqKioqKioqKioKLSoqKiAyNDIxLDI0MjcgKioqKgotICAgICAgOwotICAKLSAgc2NvcGVFc2NhcGVFeHByZXNzaW9uCi0hICAgICA6ICAgRE9MTEFSXiAgeyNET0xMQVIuc2V0VHlwZShTQ09QRV9FU0NBUEUpO30gKElERU5UIHwgc2NvcGVFc2NhcGVFeHByZXNzaW9uKQotICAgICAgICAgIC8vIFBST1BPU0U6IFRoZSBTQ09QRV9FU0NBUEUgb3BlcmF0b3IgcG9wcyBpdHMgb3BlcmFuZCBvdXQgb2YgdGhlIHNjb3BlIG9mIGEgIndpdGgiIGJsb2NrLgotICAgICAgICAgIC8vIElmIG5vdCB3aXRoaW4gYSAid2l0aCIgYmxvY2ssIGl0IHBvcHMgdGhlIG9wZXJhbmQgb3V0IG9mIHRoZSBzdGF0aWMgZ2xvYmFsIHNjb3BlLAotICAgICAgICAgIC8vIGludG8gd2hhdGV2ZXIgZHluYW1pYyAodW5jaGVja2VkKSBnbG9iYWwgc2NvcGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHNjcmlwdCBpcyBydW4sCi0tLS0gMjQyMSwyNDI3IC0tLS0KLSAgICAgIDsKLSAgCi0gIHNjb3BlRXNjYXBlRXhwcmVzc2lvbgotISAgICAgOiAgIERPTExBUiEgIF5bU0NPUEVfRVNDQVBFLCIkIl1eIChJREVOVCB8IHNjb3BlRXNjYXBlRXhwcmVzc2lvbikKLSAgICAgICAgICAvLyBQUk9QT1NFOiBUaGUgU0NPUEVfRVNDQVBFIG9wZXJhdG9yIHBvcHMgaXRzIG9wZXJhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiBhICJ3aXRoIiBibG9jay4KLSAgICAgICAgICAvLyBJZiBub3Qgd2l0aGluIGEgIndpdGgiIGJsb2NrLCBpdCBwb3BzIHRoZSBvcGVyYW5kIG91dCBvZiB0aGUgc3RhdGljIGdsb2JhbCBzY29wZSwKLSAgICAgICAgICAvLyBpbnRvIHdoYXRldmVyIGR5bmFtaWMgKHVuY2hlY2tlZCkgZ2xvYmFsIHNjb3BlIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBzY3JpcHQgaXMgcnVuLAotKioqKioqKioqKioqKioqCi0qKiogMjQ3MSwyNDc3ICoqKioKLSAgICAgIDoKLSAgICAgICgKLSAgICAgICAgICAvLyBQUk9QT1NFOiBhbGxvdyBzcHJlYWQgbWFya2VycyBvbiBzdHJpbmcgY29uc3RydWN0b3IgYXJndW1lbnRzCi0hICAgICAgICAgc3A6U1RBUl4gICAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX0FSRyk7fQotICAgICAgKT8KLSAgICAgICggICBpZGVudGlmaWVyCi0gICAgICB8ICAgb3Blbk9yQ2xvc2VkQmxvY2sKLS0tLSAyNDcxLDI0NzcgLS0tLQotICAgICAgOgotICAgICAgKAotICAgICAgICAgIC8vIFBST1BPU0U6IGFsbG93IHNwcmVhZCBtYXJrZXJzIG9uIHN0cmluZyBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLSEgICAgICAgICBTVEFSISAgICAgICAgICAgICAgICAgICAgICAgIF5bU1BSRUFEX0FSRywiKiJdXgotICAgICAgKT8KLSAgICAgICggICBpZGVudGlmaWVyCi0gICAgICB8ICAgb3Blbk9yQ2xvc2VkQmxvY2sKLSoqKioqKioqKioqKioqKgotKioqIDI1NDYsMjU1MiAqKioqCi0gICAgICAgICAgICAgICAgICAvLyBsaW1pdGF0aW9uIG9mIGxpbmVhciBhcHByb3hpbWF0ZSBsb29rYWhlYWQuCi0gICAgICAgICAgICAgICAgICBncmVlZHk9dHJ1ZTsKLSAgICAgICAgICAgICAgfQotISAgICAgICAgIDogICAoICAgbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KLSAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbnB1dCBpcyB2YWxpZCwgb25seSB0aGUgbGFzdCBJREVOVCBtYXkKLSAgICAgICAgICAgICAgICAgIC8vIGhhdmUgcHJlY2VkaW5nIHR5cGVBcmd1bWVudHMuLi4gcmF0aGVyIGhhY2t5LCB0aGlzIGlzLi4uCi0gICAgICAgICAgICAgICAgICB7aWYgKCN0YTIgIT0gbnVsbCkgYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCAjdGEyKTt9Ci0tLS0gMjU0NiwyNTUyIC0tLS0KLSAgICAgICAgICAgICAgICAgIC8vIGxpbWl0YXRpb24gb2YgbGluZWFyIGFwcHJveGltYXRlIGxvb2thaGVhZC4KLSAgICAgICAgICAgICAgICAgIGdyZWVkeT10cnVlOwotICAgICAgICAgICAgICB9Ci0hICAgICAgICAgOiAgICggICBMUEFSRU4hIF5bTUVUSE9EX0NBTEwsIigiXV4KLSAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbnB1dCBpcyB2YWxpZCwgb25seSB0aGUgbGFzdCBJREVOVCBtYXkKLSAgICAgICAgICAgICAgICAgIC8vIGhhdmUgcHJlY2VkaW5nIHR5cGVBcmd1bWVudHMuLi4gcmF0aGVyIGhhY2t5LCB0aGlzIGlzLi4uCi0gICAgICAgICAgICAgICAgICB7aWYgKCN0YTIgIT0gbnVsbCkgYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCAjdGEyKTt9Ci0qKioqKioqKioqKioqKioKLSoqKiAyNTU0LDI1NjAgKioqKgotICAgICAgICAgICAgICAgICAgYXJnTGlzdCBSUEFSRU4hCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICB8ICAgKCAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSEgICAgICAgICAgICAgICAgIGxiYzpMQlJBQ0teIHsjbGJjLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCi0gICAgICAgICAgICAgICkrCi0gICAgICAgICAgKT8KLSAgICAgIDsKLS0tLSAyNTU0LDI1NjAgLS0tLQotICAgICAgICAgICAgICAgICAgYXJnTGlzdCBSUEFSRU4hCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICB8ICAgKCAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKLSEgICAgICAgICAgICAgICAgIExCUkFDSyEgXltBUlJBWV9ERUNMQVJBVE9SLCJbIl1eIFJCUkFDSyEKLSAgICAgICAgICAgICAgKSsKLSAgICAgICAgICApPwotICAgICAgOwotKioqKioqKioqKioqKioqCi0qKiogMjY4MCwyNjkxICoqKioKLSAgICAgICAgICAvLyBPcHRpb25hbCBhcmd1bWVudCBsYWJlbC4KLSAgICAgICAgICAvLyBVc2FnZTogIFNwZWNpZmllcyBhIG1hcCBrZXksIG9yIGEga2V5d29yZGVkIGFyZ3VtZW50LgotICAgICAgICAgICggICAoYXJndW1lbnRMYWJlbFN0YXJ0KSA9PgotISAgICAgICAgICAgICBhcmd1bWVudExhYmVsIGM6Q09MT05eICAgICAgICAgIHsjYy5zZXRUeXBlKExBQkVMRURfQVJHKTt9Ci0gIAotICAgICAgICAgICAgICB7ICAgaGFzTGFiZWwgPSB0cnVlOyAgfSAgLy8gc2lnbmFsIHRvIGNhbGxlciB0aGUgcHJlc2VuY2Ugb2YgYSBsYWJlbAotICAKLSAgICAgICAgICB8ICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgZigqW2EsYixjXSkgID09PSAgZihhLGIsYyk7ICBmKDEsKm51bGwsMikgID09PSAgZigxLDIpLgotISAgICAgICAgICAgICBzcDpTVEFSXiAgICAgICAgICAgICAgICAgICAgICAgIHsjc3Auc2V0VHlwZShTUFJFQURfQVJHKTt9Ci0gICAgICAgICAgICAgIC8vIHNwcmVhZCBtYXBzIGFyZSBtYXJrZWQsIGFzIGYoKjptKSBmb3IgZihhOngsIGI6eSkgaWYgbT09W2E6eCwgYjp5XQotICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICBDT0xPTiEgICAgICAgICAgICAgICAgICAgICAgeyNzcC5zZXRUeXBlKFNQUkVBRF9NQVBfQVJHKTt9Ci0tLS0gMjY4MCwyNjkxIC0tLS0KLSAgICAgICAgICAvLyBPcHRpb25hbCBhcmd1bWVudCBsYWJlbC4KLSAgICAgICAgICAvLyBVc2FnZTogIFNwZWNpZmllcyBhIG1hcCBrZXksIG9yIGEga2V5d29yZGVkIGFyZ3VtZW50LgotICAgICAgICAgICggICAoYXJndW1lbnRMYWJlbFN0YXJ0KSA9PgotISAgICAgICAgICAgICBhcmd1bWVudExhYmVsIENPTE9OISAgICAgICAgICBeW0xBQkVMRURfQVJHLCI6Il1eCi0gIAotICAgICAgICAgICAgICB7ICAgaGFzTGFiZWwgPSB0cnVlOyAgfSAgLy8gc2lnbmFsIHRvIGNhbGxlciB0aGUgcHJlc2VuY2Ugb2YgYSBsYWJlbAotICAKLSAgICAgICAgICB8ICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgZigqW2EsYixjXSkgID09PSAgZihhLGIsYyk7ICBmKDEsKm51bGwsMikgID09PSAgZigxLDIpLgotISAgICAgICAgICAgICBTVEFSISAgICAgICAgICAgICAgICAgICAgICAgIF5bU1BSRUFEX0FSRywiKiJdXgotICAgICAgICAgICAgICAvLyBzcHJlYWQgbWFwcyBhcmUgbWFya2VkLCBhcyBmKCo6bSkgZm9yIGYoYTp4LCBiOnkpIGlmIG09PVthOngsIGI6eV0KLSAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgQ09MT04hICAgICAgICAgICAgICAgICAgICAgIHsjc3Auc2V0VHlwZShTUFJFQURfTUFQX0FSRyk7fQotKioqKioqKioqKioqKioqCi0qKiogMjczMywyNzM5ICoqKioKLSAgICAgICAgICAgICAgICAgIHdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIDoKLSEgICAgICAgICAgICAgbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fQotICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25bMF0pPwotICAgICAgICAgICAgICBSQlJBQ0shCi0gICAgICAgICAgKSsKLS0tLSAyNzMzLDI3MzkgLS0tLQotICAgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgOgotISAgICAgICAgICAgICBMQlJBQ0shIF5bQVJSQVlfREVDTEFSQVRPUiwiKCJdXgotICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25bMF0pPwotICAgICAgICAgICAgICBSQlJBQ0shCi0gICAgICAgICAgKSsKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL3RyZWUuZml4ZXMucGF0Y2ggYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYW50bHIvdHJlZXdhbGtlci90cmVlLmZpeGVzLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI0NTQ4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9hbnRsci90cmVld2Fsa2VyL3RyZWUuZml4ZXMucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1JbmRleDogR3Jvb3Z5UmVjb2duaXplclRyZWUuZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkNTIGZpbGU6IC9ob21lL3Byb2plY3RzL2dyb292eS9zY20vZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2FudGxyL3RyZWV3YWxrZXIvc3JjL0dyb292eVJlY29nbml6ZXJUcmVlLmcsdgotcmV0cmlldmluZyByZXZpc2lvbiAxLjEKLWRpZmYgLWMgLXIxLjEgR3Jvb3Z5UmVjb2duaXplclRyZWUuZwotKioqIEdyb292eVJlY29nbml6ZXJUcmVlLmcJMTkgQXByIDIwMDUgMjI6MTQ6MDQgLTAwMDAJMS4xCi0tLS0gR3Jvb3Z5UmVjb2duaXplclRyZWUuZwkxOSBBcHIgMjAwNSAyMjo0Mjo0NyAtMDAwMAotKioqKioqKioqKioqKioqCi0qKiogNjg5LDcwMCAqKioqCi0gIAk7Ci0gIAotICBzdGF0ZW1lbnQKLSEgCToKLSEgCSgKLSEgCQlvcGVuT3JDbG9zZWRCbG9jawotISAJCXwKLSEgCQkJc3RhdGVtZW50Ci0hIAkpCi0gIAl8Ci0gIAkJZXhwcmVzc2lvblN0YXRlbWVudAotICAJfAotLS0tIDY4OSw2OTUgLS0tLQotICAJOwotICAKLSAgc3RhdGVtZW50Ci0hIAk6ICAgb3Blbk9yQ2xvc2VkQmxvY2sKLSAgCXwKLSAgCQlleHByZXNzaW9uU3RhdGVtZW50Ci0gIAl8CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9SRUFETUUudHh0IGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2ZDg1ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQSBKYXZhIDEuNSBwYXJzZXIgCi0KLTI5IE5vdiAyMDA0IC0gTk9URTogVGhpcyB3aWxsIG5vdCBydW4gY29ycmVjdGx5IGF0IG1vbWVudC4uLgotCi0KLWJhc2VkIHVwb24gSkxTdjMgKGRyYWZ0IG9uIHdlYnNpdGUgYXQgTm92MjAwNCkKLQotdXNpbmcgaHR0cDovL2Jwd2ouamF2YW5pY3VzLmNvbSB0b29sa2l0IGZyb20gU3RldmUgTWV0c2tlciAoQXBhY2hlMi4wIGxpY2Vuc2UpCi0KLWJ5IEplcmVteSBSYXluZXIsIE5vdiAyMDA0CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9idWlsZC54bWwgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzdiMDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0icGFyc2VyIiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgY29tcGlsZSBzZXR0aW5ncyAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGVidWciIHZhbHVlPSJvbiIvPgotICAKLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KLSAgCQkKLSAgPCEtLSBqYXZhZG9jIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmRpciIgdmFsdWU9ImRvYyIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5wYWNrYWdlcyIgdmFsdWU9ImNvbS4qIi8+Ci0KLSAgPCEtLSBqdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5zcmMuZGlyIgl2YWx1ZT0idGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS90ZXN0L2NsYXNzZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QucmVwb3J0cy5kaXIiIHZhbHVlPSJyZXBvcnRzIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InN0YW5kYWxvbmUud29ya2luZy5kaXIiIHZhbHVlPSJ0ZW1wIi8+Ci0KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgICBkYXRhdHlwZXMgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KLSAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnppcCIgLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgCi0gIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9Ii8+ICAKLSAgPC9wYXRoPgotICAKLTwhLS0gIDx0YXNrZGVmIG5hbWU9Imdyb292eWMiIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5YyIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIvPiAtLT4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICB0YXJnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIAotICAgICAgICAgIGRlcGVuZHM9InJ1biIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImRlZmF1bHQ6IHJ1biB0aGlzIGdyb292eSBzdHVmZiIKLSAgLz4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iYWxsIiAKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LGRpc3QiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJidWlsZCBhbmQgdGVzdCBldmVyeXRoaW5nIgotICAvPgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJyZW1vdmUgYWxsIGJ1aWx0IGZpbGVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhZG9jLmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgCi0gICAgICAgICAgZGVwZW5kcz0iY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBkaXN0cmlidXRhYmxlcyAoamFycyBldGMpIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIgLz4KLSAgICA8amFyIGphcmZpbGU9IiR7ZGlzdC5kaXJ9L3BhcnNlci5qYXIiIAotICAgICAgICAgbWFuaWZlc3Q9IiR7c3JjLmRpcn0vbWFuaWZlc3QudHh0Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InN0YW5kYWxvbmUiIGRlcGVuZHM9ImRpc3QiIGRlc2NyaXB0aW9uPSJtZXJnZSBhbGwgamFycyB0b2dldGhlciI+Ci0gICAgICA8bWtkaXIgZGlyPSIke3N0YW5kYWxvbmUud29ya2luZy5kaXJ9Ii8+Ci0gICAgICA8dW56aXAgZGVzdD0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L3VuemlwPgotICAgICAgPGNvcHkgdG9kaXI9IiR7c3RhbmRhbG9uZS53b3JraW5nLmRpcn0iPgotICAgICAgICAgIDxmaWxlc2V0IGRpcj0ibGljZW5zZXMiLz4KLSAgICAgIDwvY29weT4KLSAgICAgIDxta2RpciBkaXI9InN0YW5kYWxvbmUiLz4KLSAgICAgIDxqYXIgamFyZmlsZT0ic3RhbmRhbG9uZS9wYXJzZXIuamFyIgotICAgICAgICAgICBtYW5pZmVzdD0iJHtzcmMuZGlyfS9tYW5pZmVzdC50eHQiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3N0YW5kYWxvbmUud29ya2luZy5kaXJ9Ii8+Ci0gICAgPC9qYXI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7c3RhbmRhbG9uZS53b3JraW5nLmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLQotCi0gIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImdlbmVyYXRlIGRvY3VtZW50YXRpb24iPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICAgIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IiAKLSAgICAgICAgICAgICBwYWNrYWdlbmFtZXM9IiR7amF2YWRvYy5wYWNrYWdlc30iCi0gICAgICAgICAgICAgdXNlPSJ0cnVlIgotICAgICAgICAgICAgIHdpbmRvd3RpdGxlPSJwYXJzZXIiCi0gICAgICAgICAgICAgcHJpdmF0ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgYW5kIHJ1biI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJjb20uamF2YW5pY3VzLmJwd2ouUGFyc2VyTWFpbiIKLSAgICAgICAgICBmb3JrPSJ5ZXMiCi0gICAgICAgICAgY2xhc3NwYXRocmVmPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxhcmcgdmFsdWU9InNyYy9jb20vamF2YW5pY3VzL2Jwd2ovUGFyc2VyTWFpbi5qYXZhIi8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImJlYXV0aWZ5IiAKLSAgICAgICAgICBkZXBlbmRzPSJpbml0IiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iYXBwbHkgamFjb2JlIGJlYXV0aWZpZXIgdG8gdGhlIGphdmEgc291cmNlcyI+Ci0gICAgPGFwcGx5IGV4ZWN1dGFibGU9ImphY29iZSI+Ci0gICAgICA8YXJnIHZhbHVlPSItbm9iYWNrdXAiLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1vdmVyd3JpdGUiLz4KLSAgICAgIDxzcmNmaWxlLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXMgPSAiKiovKi5qYXZhIi8+Ci0gICAgPC9hcHBseT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiAKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LWNvbXBpbGUiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJydW4gYWxsIHRlc3QgY2FzZXMiPgotICAgIDxqdW5pdCBoYWx0b25mYWlsdXJlPSJ0cnVlIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+Ci0gICAgICA8YmF0Y2h0ZXN0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgICAgICAgCi0gIDx0YXJnZXQgbmFtZT0icHJldHR5LXRlc3QiIAotICAgICAgICAgIGRlcGVuZHM9InRlc3QtY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249IkhUTUwgb3V0cHV0IG9mIHRlc3QgY2FzZXMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iLz4KLSAgICA8anVuaXQgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZm9yaz0ieWVzIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgdXNlZmlsZT0idHJ1ZSIvPgotCi0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qVGVzdC5jbGFzcyIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0KLSAgICA8L2p1bml0PgotCi0gICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ii8+Ci0gICAgPC9qdW5pdHJlcG9ydD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJjb21waWxlIGphdmEgYW5kIGdyb292eSBzb3VyY2VzIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICA8IS0tIDxncm9vdnljIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiAKLSAgICAgICAgICAgICBzcmNkaXI9IiR7c3JjLmRpcn0iCi0gICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4gICAgICAgICAgCi0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9ncm9vdnljPiAtLT4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiAKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIAotICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIiAKLSAgICAgICAgICAgZGVidWc9IiR7YnVpbGQuZGVidWd9IiAKLSAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRlc3RzIj4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9IiAvPgotICAgIDwhLS0gPGdyb292eWMgZGVzdGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIgCi0gICAgICAgICAgICAgc3JjZGlyPSIke3Rlc3Quc3JjLmRpcn0iCi0gICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4gICAgICAgICAgCi0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9ncm9vdnljPiAtLT4KLSAgICA8amF2YWMgc3JjZGlyPSIke3Rlc3Quc3JjLmRpcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9IiAKLSAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgCi0gICAgICAgICAgIGRlYnVnPSIke2J1aWxkLmRlYnVnfSIgCi0gICAgICAgICAgIGRlcHJlY2F0aW9uPSJvbiIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAgLz4KLSAgICA8bWtkaXIgZGlyPSIke2xpYi5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotICAgICAgIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovbGliL2Jwd2otMS4wLmphciBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL2xpYi9icHdqLTEuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTEwNDkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovbGliL2Jwd2otMS4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL2xpY2Vuc2VzL0xJQ0VOU0UudHh0IGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovbGljZW5zZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDQ3ZmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovbGljZW5zZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotRnJvbTogU3RldmUgTWV0c2tlcgotRGF0ZTogTW9uLCAxNSBOb3YgMjAwNCAxMDoxNzowMyBHTVQKLVN1YmplY3Q6IFJFOiBCUFdKCi0KLUhpIEplcmVteSwKLSAgSSdkIGxvdmUgdG8gc2VlIHRoZSBicHdqIGNvZGUgZ3JvdyBhbmQgZ2V0IHVzZWQgaW4gb3RoZXIgd29yay4KLU15IGludGVudGlvbiBpcyBmb3IgdGhpcyBjb2RlIHRvIGJlIGNvbXBsZXRlbHkgZnJlZS4gSSBhbSBzdXBwb3J0aXZlCi1vZiBhbnkgd29yayB0aGF0IG1vdmVzIGl0IGluIHRoYXQgZGlyZWN0aW9uLiBGb3IgZXhhbXBsZSwgaWYKLXlvdSdkIGxpa2UgdG8gcHJvZHVjZSBhIHZlcnNpb24gb2YgdGhlIGNvZGUgdGhhdCBoYXMgYSBkaWZmZXJlbnQgY29weXJpZ2h0Ci1ub3RpY2UsIEknZCBiZSBoYXBweSB0byBwb3N0IHRoZSByZXZpc2VkIGNvZGUgb24gbXkgc2l0ZS4KLQotPiBTbywgZXZlbiBpZiB5b3UgZHVhbCBsaWNlbnNlIChBcGFjaGUgKyBHUEwpLCBhdCBsZWFzdCBhIHN0YXRlbWVudAotPiBkZWNsYXJpbmcgQXBhY2hlMi4wIGxpY2Vuc2UKLT4gb2YgQlBXSiB3b3VsZCBiZSByZWFsbHkgdXNlZnVsLgotCi1JIGRlY2xhcmUgaXQgbm93LCBpbiB0aGlzIGVtYWlsLCBhbmQgSSdkIGJlIGhhcHB5IHRvIG1ha2Ugc2ltaWxhcgotZGVjbGFyYXRpb25zIGFueXdoZXJlIHlvdSBsaWtlLgotCi0tIFN0ZXZlCi0KLQotCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9KYXZhUGFyc2VyLmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL0phdmFQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExMTUwYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL0phdmFQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NzEgKzAsMCBAQAotLyoKLSAgJElkJAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDQgSmVyZW15IFJheW5lci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgSmVyZW15IFJheW5lciBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgb3Igd2FycmFudGllcyBhYm91dAotICAgdGhlIGZpdG5lc3Mgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZSwKLSAgIGluY2x1ZGluZyB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBtZXJjaGFudGFiaWxpdHkuCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7Ci0KLWltcG9ydCBzam0ucGFyc2UuKjsKLWltcG9ydCBzam0ucGFyc2UudG9rZW5zLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIEphdmEgcGFyc2VyIGFzIHNwZWNpZmllZCBpbiBKTFN2My4KLSAqCi0gKiBAYXV0aG9yIEplcmVteSBSYXluZXIKLSAqCi0gKi8KLWNsYXNzIEphdmFQYXJzZXIgewotCi0gICAgcHVibGljIFBhcnNlciBzdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGF0aW9uVW5pdCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tICB1dGlsaXR5IG1ldGhvZHMgIC0tLS0tLS0tLQotICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgcykgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gYWx0ZXJuYXRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbHRlcm5hdGlvbihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugc2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmFja1NlcXVlbmNlKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIHJlcGV0aXRpb24oUGFyc2VyIHBhcnNlcjEpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXBldGl0aW9uKHBhcnNlcjEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQYXJzZXIgemVyb09yT25lKFBhcnNlciBwYXJzZXIxKSB7Ci0gICAgICAgIHJldHVybiBhbHRlcm5hdGlvbigiemVybyBvciBvbmUiKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IEVtcHR5KCkpCi0gICAgICAgICAgICAgICAgLmFkZChwYXJzZXIxKQotICAgICAgICAgICAgOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQYXJzZXIgb25lT3JNb3JlKFBhcnNlciBwYXJzZXIxKSB7Ci0gICAgICAgIHJldHVybiBzZXF1ZW5jZSgib25lIG9yIG1vcmUgIiArIHBhcnNlcjEuZ2V0TmFtZSgpKQotICAgICAgICAgICAgLmFkZChwYXJzZXIxKQotICAgICAgICAgICAgLmFkZChyZXBldGl0aW9uKHBhcnNlcjEpKTsKLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIEdyYW1tYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIElkZW50aWZpZXI6Ci0gICAgICogICAgICBJREVOVElGSUVSCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpZGVudGlmaWVyKCkgewotICAgICAgICBsb2coImlkZW50aWZpZXIiKTsKLSAgICAgICAgLy9AdG9kbwotICAgICAgICBQYXJzZXIgcCA9IG5ldyBXb3JkKCk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIC8qKiBRdWFsaWZpZWRJZGVudGlmaWVyOgotICAgICAqICAgICAgSWRlbnRpZmllciB7LiBJZGVudGlmaWVyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHF1YWxpZmllZElkZW50aWZpZXIoKSB7Ci0gICAgICAgIGxvZygicXVhbGlmaWVySWRlbnRpZmllciIpOwotICAgICAgICBpZiAocXVhbGlmaWVkSWRlbnRpZmllciAhPSBudWxsKSByZXR1cm4gcXVhbGlmaWVkSWRlbnRpZmllcjsKLSAgICAgICAgcXVhbGlmaWVkSWRlbnRpZmllciA9IHNlcXVlbmNlKCI8cXVhbGlmaWVkSWRlbnRpZmllcj4iKTsKLSAgICAgICAgcXVhbGlmaWVkSWRlbnRpZmllci5hZGQoaWRlbnRpZmllcigpKTsKLSAgICAgICAgcXVhbGlmaWVkSWRlbnRpZmllci5hZGQocmVwZXRpdGlvbigKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxxdWFsaWZpZWRJZGVudGlmaWVyJDE+IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgcmV0dXJuIHF1YWxpZmllZElkZW50aWZpZXI7Ci0gICAgfQotCi0gICAgLyoqIExpdGVyYWw6Ci0gICAgICogICAgICBJbnRlZ2VyTGl0ZXJhbAotICAgICAqICAgICAgRmxvYXRpbmdQb2ludExpdGVyYWwKLSAgICAgKiAgICAgIENoYXJhY3RlckxpdGVyYWwKLSAgICAgKiAgICAgIFN0cmluZ0xpdGVyYWwKLSAgICAgKiAgICAgIEJvb2xlYW5MaXRlcmFsCi0gICAgICogICAgICBOdWxsTGl0ZXJhbAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgbGl0ZXJhbCgpIHsKLSAgICAgICAgbG9nKCJsaXRlcmFsIik7Ci0gICAgICAgIGlmIChsaXRlcmFsICE9IG51bGwpIHJldHVybiBsaXRlcmFsOwotICAgICAgICBsaXRlcmFsID0gYWx0ZXJuYXRpb24oIjxsaXRlcmFsPiIpOwotICAgICAgICBsaXRlcmFsLmFkZChpbnRlZ2VyTGl0ZXJhbCgpKTsKLSAgICAgICAgbGl0ZXJhbC5hZGQoZmxvYXRpbmdQb2ludExpdGVyYWwoKSk7Ci0gICAgICAgIGxpdGVyYWwuYWRkKGNoYXJhY3RlckxpdGVyYWwoKSk7Ci0gICAgICAgIGxpdGVyYWwuYWRkKHN0cmluZ0xpdGVyYWwoKSk7Ci0gICAgICAgIGxpdGVyYWwuYWRkKGJvb2xlYW5MaXRlcmFsKCkpOwotICAgICAgICBsaXRlcmFsLmFkZChudWxsTGl0ZXJhbCgpKTsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqIEV4cHJlc3Npb246Ci0gICAgICogICAgICBFeHByZXNzaW9uMSBbQXNzaWdubWVudE9wZXJhdG9yIEV4cHJlc3Npb24xXQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbigpIHsKLSAgICAgICAgbG9nKCJleHByZXNzaW9uIik7Ci0gICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uOwotICAgICAgICBleHByZXNzaW9uID0gc2VxdWVuY2UoIjxleHByZXNzaW9uPiIpOwotICAgICAgICBleHByZXNzaW9uLmFkZChleHByZXNzaW9uMSgpKTsKLSAgICAgICAgZXhwcmVzc2lvbi5hZGQoemVyb09yT25lKAotICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8ZXhwcmVzc2lvbiQxPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoYXNzaWdubWVudE9wZXJhdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbjEoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLQotICAgIC8qKiBBc3NpZ25tZW50T3BlcmF0b3I6Ci0gICAgICogICAgICA9Ci0gICAgICogICAgICArPQotICAgICAqICAgICAgLT0KLSAgICAgKiAgICAgICo9Ci0gICAgICogICAgICAvPQotICAgICAqICAgICAgJj0KLSAgICAgKiAgICAgIHw9Ci0gICAgICogICAgICBePQotICAgICAqICAgICAgJT0KLSAgICAgKiAgICAgIDw8PQotICAgICAqICAgICAgPj49Ci0gICAgICogICAgICA+Pj49Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBhc3NpZ25tZW50T3BlcmF0b3IoKSB7Ci0gICAgICAgIGxvZygiYXNzaWdubWVudE9wZXJhdG9yIik7Ci0gICAgICAgIGlmIChhc3NpZ25tZW50T3BlcmF0b3IgIT0gbnVsbCkgcmV0dXJuIGFzc2lnbm1lbnRPcGVyYXRvcjsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yID0gYWx0ZXJuYXRpb24oIjxhc3NpZ25tZW50T3BlcmF0b3I+Iik7Ci0gICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCIrPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCItPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCIqPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCIvPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCImPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCJ8PSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCJePSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCIlPSIpKTsKLSAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCI8PD0iKSk7Ci0gICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiPj49IikpOwotICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3IuYWRkKG5ldyBTeW1ib2woIj4+Pj0iKSk7Ci0gICAgICAgIHJldHVybiBhc3NpZ25tZW50T3BlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqIFR5cGU6Ci0gICAgICogICAgICBJZGVudGlmaWVyIFtUeXBlQXJndW1lbnRzXXsgLiAgIElkZW50aWZpZXIgW1R5cGVBcmd1bWVudHNdfSBCcmFja2V0c09wdAotICAgICAqICAgICAgQmFzaWNUeXBlCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB0eXBlKCkgewotICAgICAgICBsb2coInR5cGUiKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7Ci0gICAgICAgIHR5cGUgPSBhbHRlcm5hdGlvbigiPHR5cGU+Iik7Ci0gICAgICAgIHR5cGUuYWRkKHNlcXVlbmNlKCI8dHlwZSQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUodHlwZUFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8dHlwZSQyPiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIi4iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUodHlwZUFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgICAgIC5hZGQoYnJhY2tldHNPcHQoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHR5cGUuYWRkKGJhc2ljVHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqIFR5cGVBcmd1bWVudHM6Ci0gICAgICogICAgICA8IFR5cGVBcmd1bWVudCB7LCBUeXBlQXJndW1lbnR9PgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgdHlwZUFyZ3VtZW50cygpIHsKLSAgICAgICAgbG9nKCJ0eXBlQXJndW1lbnRzIik7Ci0gICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHJldHVybiB0eXBlQXJndW1lbnRzOwotICAgICAgICB0eXBlQXJndW1lbnRzID0gc2VxdWVuY2UoIjx0eXBlQXJndW1lbnRzPiIpOwotICAgICAgICB0eXBlQXJndW1lbnRzLmFkZChuZXcgU3ltYm9sKCI8IikpOwotICAgICAgICB0eXBlQXJndW1lbnRzLmFkZCh0eXBlQXJndW1lbnQoKSk7Ci0gICAgICAgIHR5cGVBcmd1bWVudHMuYWRkKHJlcGV0aXRpb24oCi0gICAgICAgICAgICAgICAgc2VxdWVuY2UoIjx0eXBlQXJndW1lbnRzJDE+IikKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIsIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQodHlwZUFyZ3VtZW50KCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqIFR5cGVBcmd1bWVudDoKLSAgICAgKiAgICAgIFR5cGUKLSAgICAgKiAgICAgID8gWyhleHRlbmRzIHxzdXBlciApIFR5cGVdCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB0eXBlQXJndW1lbnQoKSB7Ci0gICAgICAgIGxvZygidHlwZUFyZ3VtZW50Iik7Ci0gICAgICAgIGlmICh0eXBlQXJndW1lbnQgIT0gbnVsbCkgcmV0dXJuIHR5cGVBcmd1bWVudDsKLSAgICAgICAgdHlwZUFyZ3VtZW50ID0gYWx0ZXJuYXRpb24oIjx0eXBlQXJndW1lbnQ+Iik7Ci0gICAgICAgIHR5cGVBcmd1bWVudC5hZGQodHlwZSgpKTsKLSAgICAgICAgdHlwZUFyZ3VtZW50LmFkZChzZXF1ZW5jZSgiPHR5cGVBcmd1bWVudCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCI/IikpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8dHlwZUFyZ3VtZW50JDI+IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjx0eXBlQXJndW1lbnQkYT4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImV4dGVuZHMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJzdXBlciIpKQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh0eXBlKCkpCi0gICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgICkKLSAgICAgICAgOwotICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50OwotICAgIH0KLQotICAgIC8qKiBSYXdUeXBlOgotICAgICAqICAgICAgSWRlbnRpZmllciB7IC4gICBJZGVudGlmaWVyIH0gQnJhY2tldHNPcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHJhd1R5cGUoKSB7Ci0gICAgICAgIGxvZygicmF3VHlwZSIpOwotICAgICAgICBpZiAocmF3VHlwZSAhPSBudWxsKSByZXR1cm4gcmF3VHlwZTsKLSAgICAgICAgcmF3VHlwZSA9IHNlcXVlbmNlKCI8cmF3VHlwZT4iKTsKLSAgICAgICAgcmF3VHlwZS5hZGQoaWRlbnRpZmllcigpKTsKLSAgICAgICAgcmF3VHlwZS5hZGQocmVwZXRpdGlvbigKLSAgICAgICAgICAgICAgICBzZXF1ZW5jZSgiPHJhd1R5cGUkMT4iKQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIi4iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgcmF3VHlwZS5hZGQoYnJhY2tldHNPcHQoKSk7Ci0gICAgICAgIHJldHVybiByYXdUeXBlOwotICAgIH0KLQotICAgIC8qKiBTdGF0ZW1lbnRFeHByZXNzaW9uOgotICAgICAqICAgICAgRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc3RhdGVtZW50RXhwcmVzc2lvbigpIHsKLSAgICAgICAgbG9nKCJzdGF0ZW1lbnRFeHByZXNzaW9uIik7Ci0gICAgICAgIGlmIChzdGF0ZW1lbnRFeHByZXNzaW9uICE9IG51bGwpIHJldHVybiBzdGF0ZW1lbnRFeHByZXNzaW9uOwotICAgICAgICBzdGF0ZW1lbnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbigpOwotICAgICAgICByZXR1cm4gc3RhdGVtZW50RXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RhbnRFeHByZXNzaW9uOgotICAgICAqICAgICAgRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnRFeHByZXNzaW9uKCkgewotICAgICAgICBsb2coImNvbnN0YW50RXhwcmVzc2lvbiIpOwotICAgICAgICBpZiAoY29uc3RhbnRFeHByZXNzaW9uICE9IG51bGwpIHJldHVybiBjb25zdGFudEV4cHJlc3Npb247Ci0gICAgICAgIGNvbnN0YW50RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIGNvbnN0YW50RXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICAvKiogRXhwcmVzc2lvbjE6Ci0gICAgICogICAgICBFeHByZXNzaW9uMiBbRXhwcmVzc2lvbjFSZXN0XQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbjEoKSB7Ci0gICAgICAgIGxvZygiZXhwcmVzc2lvbjEiKTsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24xICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMTsKLSAgICAgICAgZXhwcmVzc2lvbjEgPSBzZXF1ZW5jZSgiPGV4cHJlc3Npb24xPiIpOwotICAgICAgICBleHByZXNzaW9uMS5hZGQoZXhwcmVzc2lvbjIoKSk7Ci0gICAgICAgIGV4cHJlc3Npb24xLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbjFSZXN0KCkpKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24xOwotICAgIH0KLQotICAgIC8qKiBFeHByZXNzaW9uMVJlc3Q6Ci0gICAgICogICAgICBbID8gICBFeHByZXNzaW9uIDogICBFeHByZXNzaW9uMV0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGV4cHJlc3Npb24xUmVzdCgpIHsKLSAgICAgICAgbG9nKCJleHByZXNzaW9uMVJlc3QiKTsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24xUmVzdCAhPSBudWxsKSByZXR1cm4gZXhwcmVzc2lvbjFSZXN0OwotICAgICAgICBleHByZXNzaW9uMVJlc3QgPSB6ZXJvT3JPbmUoCi0gICAgICAgICAgICBzZXF1ZW5jZSgiPGV4cHJlc3Npb24xUmVzdCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCI/IikpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCI6IikpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uMSgpKQotICAgICAgICApOwotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjFSZXN0OwotICAgIH0KLQotICAgIC8qKiBFeHByZXNzaW9uMiA6Ci0gICAgICogICAgICBFeHByZXNzaW9uMyBbRXhwcmVzc2lvbjJSZXN0XQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbjIoKSB7Ci0gICAgICAgIGxvZygiZXhwcmVzc2lvbjIiKTsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24yICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMjsKLSAgICAgICAgZXhwcmVzc2lvbjIgPSBzZXF1ZW5jZSgiPGV4cHJlc3Npb24yPiIpOwotICAgICAgICBleHByZXNzaW9uMi5hZGQoZXhwcmVzc2lvbjMoKSk7Ci0gICAgICAgIGV4cHJlc3Npb24yLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbjJSZXN0KCkpKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24yOwotICAgIH0KLQotICAgIC8qKiBFeHByZXNzaW9uMlJlc3Q6Ci0gICAgICogICAgICB7SW5maXhvcCBFeHByZXNzaW9uM30KLSAgICAgKiAgICAgIEV4cHJlc3Npb24zIGluc3RhbmNlb2YgVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbjJSZXN0KCkgewotICAgICAgICBsb2coImV4cHJlc3Npb24yUmVzdCIpOwotICAgICAgICBpZiAoZXhwcmVzc2lvbjJSZXN0ICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMlJlc3Q7Ci0gICAgICAgIGV4cHJlc3Npb24yUmVzdCA9IGFsdGVybmF0aW9uKCI8ZXhwcmVzc2lvbjJSZXN0JGE+Iik7Ci0gICAgICAgIGV4cHJlc3Npb24yUmVzdC5hZGQocmVwZXRpdGlvbigKLSAgICAgICAgICAgICAgICBzZXF1ZW5jZSgiPGV4cHJlc3Npb24yUmVzdCQxPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoaW5maXhPcCgpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24zKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgZXhwcmVzc2lvbjJSZXN0LmFkZChzZXF1ZW5jZSgiPGV4cHJlc3Npb24yUmVzdCQyPiIpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uMygpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImluc3RhbmNlb2YiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBleHByZXNzaW9uMlJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIEluZml4b3A6Ci0gICAgICogICAgICB8fAotICAgICAqICAgICAgJiYKLSAgICAgKiAgICAgIHwKLSAgICAgKiAgICAgIF4KLSAgICAgKiAgICAgICYKLSAgICAgKiAgICAgID09Ci0gICAgICogICAgICAhPQotICAgICAqICAgICAgPAotICAgICAqICAgICAgPgotICAgICAqICAgICAgPD0KLSAgICAgKiAgICAgID49Ci0gICAgICogICAgICA8PAotICAgICAqICAgICAgPj4KLSAgICAgKiAgICAgID4+PgotICAgICAqICAgICAgKwotICAgICAqICAgICAgKgotICAgICAqICAgICAgLwotICAgICAqICAgICAgJQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgaW5maXhPcCgpIHsKLSAgICAgICAgbG9nKCJpbmZpeE9wIik7Ci0gICAgICAgIGlmIChpbmZpeE9wICE9IG51bGwpIHJldHVybiBpbmZpeE9wOwotICAgICAgICBpbmZpeE9wID0gYWx0ZXJuYXRpb24oIjxpbmZpeE9wPiIpOwotICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCJ8fCIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiJiYiKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woInwiKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIl4iKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIiYiKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIj09IikpOwotICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCIhPSIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPCIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPiIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPD0iKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIj49IikpOwotICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCI8PCIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPj4iKSk7Ci0gICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIj4+PiIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiKyIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiKiIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiLyIpKTsKLSAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiJSIpKTsKLSAgICAgICAgcmV0dXJuIGluZml4T3A7Ci0gICAgfQotCi0gICAgLyoqIEV4cHJlc3Npb24zOgotICAgICAqICAgICAgUHJlZml4T3AgRXhwcmVzc2lvbjMKLSAgICAgKiAgICAgICggICAoRXhwcnxUeXBlKSApICAgRXhwcmVzc2lvbjMKLSAgICAgKiAgICAgIFByaW1hcnkge1NlbGVjdG9yfSB7UG9zdGZpeE9wfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbjMoKSB7Ci0gICAgICAgIGxvZygiZXhwcmVzc2lvbjMiKTsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24zICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMzsKLSAgICAgICAgZXhwcmVzc2lvbjMgPSBhbHRlcm5hdGlvbigiPGV4cHJlc3Npb24zPiIpOwotICAgICAgICBleHByZXNzaW9uMy5hZGQoc2VxdWVuY2UoIjxleHByZXNzaW9uMyQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChwcmVmaXhPcCgpKQotICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbjMoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIGV4cHJlc3Npb24zLmFkZChzZXF1ZW5jZSgiPGV4cHJlc3Npb24zJDI+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIigiKSkKLSAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8ZXhwcmVzc2lvbjMkYSIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcigpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIpIikpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uMygpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgZXhwcmVzc2lvbjMuYWRkKHNlcXVlbmNlKCI8ZXhwcmVzc2lvbjMkMz4iKQotICAgICAgICAgICAgICAgIC5hZGQocHJpbWFyeSgpKQotICAgICAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihzZWxlY3RvcigpKSkKLSAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24ocG9zdGZpeE9wKCkpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24zOwotICAgIH0KLQotICAgIC8qKiBQcmltYXJ5OgotICAgICAqICAgICAgKCBFeHByZXNzaW9uKQotICAgICAqICAgICAgTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzIChFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4IHx0aGlzIEFyZ3VtZW50cykKLSAgICAgKiAgICAgIHRoaXMgW0FyZ3VtZW50c10KLSAgICAgKiAgICAgIHN1cGVyIFN1cGVyU3VmZml4Ci0gICAgICogICAgICBMaXRlcmFsCi0gICAgICogICAgICBuZXcgQ3JlYXRvcgotICAgICAqICAgICAgSWRlbnRpZmllciB7LiBJZGVudGlmaWVyIH1bIElkZW50aWZpZXJTdWZmaXhdCi0gICAgICogICAgICBCYXNpY1R5cGUgQnJhY2tldHNPcHQuY2xhc3MKLSAgICAgKiAgICAgIHZvaWQuY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHByaW1hcnkoKSB7Ci0gICAgICAgIGxvZygicHJpbWFyeSIpOwotICAgICAgICBpZiAocHJpbWFyeSAhPSBudWxsKSByZXR1cm4gcHJpbWFyeTsKLSAgICAgICAgcHJpbWFyeSA9IGFsdGVybmF0aW9uKCI8cHJpbWFyeT4iKTsKLSAgICAgICAgICAgIC8vICggRXhwcmVzc2lvbikKLSAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIoIikpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIpIikpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy8gTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzIChFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4IHx0aGlzIEFyZ3VtZW50cykKLSAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQyPiIpCi0gICAgICAgICAgICAgICAgLmFkZChub25XaWxkY2FyZFR5cGVBcmd1bWVudHMoKSkKLSAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8cHJpbWFyeSRhPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeCgpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aGlzIikpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vIHRoaXMgW0FyZ3VtZW50c10KLSAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQzPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhpcyIpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvLyBzdXBlciBTdXBlclN1ZmZpeAotICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDQ+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aGlzIikpCi0gICAgICAgICAgICAgICAgLmFkZChzdXBlclN1ZmZpeCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vIExpdGVyYWwKLSAgICAgICAgICAgIHByaW1hcnkuYWRkKGxpdGVyYWwoKSk7Ci0gICAgICAgICAgICAvLyBuZXcgQ3JlYXRvcgotICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDU+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJuZXciKSkKLSAgICAgICAgICAgICAgICAuYWRkKGNyZWF0b3IoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvLyBJZGVudGlmaWVyIHsuIElkZW50aWZpZXIgfVsgSWRlbnRpZmllclN1ZmZpeF0KLSAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQ2PiIpCi0gICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICAgICAgLmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8cHJpbWFyeSQ3PiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGlkZW50aWZpZXJTdWZmaXgoKSkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy8gQmFzaWNUeXBlIEJyYWNrZXRzT3B0LmNsYXNzCi0gICAgICAgICAgICBwcmltYXJ5LmFkZChzZXF1ZW5jZSgiPHByaW1hcnkkOD4iKQotICAgICAgICAgICAgICAgIC5hZGQoYmFzaWNUeXBlKCkpCi0gICAgICAgICAgICAgICAgLmFkZChicmFja2V0c09wdCgpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNsYXNzIikpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy8gdm9pZC5jbGFzcwotICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDk+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ2b2lkIikpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIuIikpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiY2xhc3MiKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBwcmltYXJ5OwotICAgIH0KLQotICAgIC8qKiBJZGVudGlmaWVyU3VmZml4OgotICAgICAqICAgICAgWyAoXSBCcmFja2V0c09wdCAgIC4gY2xhc3MgfCBFeHByZXNzaW9uXSkKLSAgICAgKiAgICAgIEFyZ3VtZW50cwotICAgICAqICAgICAgLiAgIChjbGFzcyB8IEV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24gfHRoaXMgfHN1cGVyIEFyZ3VtZW50cyB8bmV3IFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdIElubmVyQ3JlYXRvciApCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpZGVudGlmaWVyU3VmZml4KCkgewotICAgICAgICBsb2coImlkZW50aWZpZXJTdWZmaXgiKTsKLSAgICAgICAgaWYgKGlkZW50aWZpZXJTdWZmaXggIT0gbnVsbCkgcmV0dXJuIGlkZW50aWZpZXJTdWZmaXg7Ci0gICAgICAgIGlkZW50aWZpZXJTdWZmaXggPSBhbHRlcm5hdGlvbigiPGlkZW50aWZpZXJTdWZmaXg+Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBbIChdIEJyYWNrZXRzT3B0ICAgLiBjbGFzcyB8IEV4cHJlc3Npb25dKQotICAgICAgICAgICAgICAgIGlkZW50aWZpZXJTdWZmaXguYWRkKHNlcXVlbmNlKCI8aWRlbnRpZmllclN1ZmZpeCQxPiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ1snKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjxpZGVudGlmaWVyU3VmZml4JGEiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxpZGVudGlmaWVyU3VmZml4JDE+IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCddJykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYnJhY2tldHNPcHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNsYXNzIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxpZGVudGlmaWVyU3VmZml4JDI+IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgLy8gQXJndW1lbnRzCi0gICAgICAgICAgICAgICAgaWRlbnRpZmllclN1ZmZpeC5hZGQoYXJndW1lbnRzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gLiAgIChjbGFzcyB8IEV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24gfHRoaXMgfHN1cGVyIEFyZ3VtZW50cyB8bmV3IFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdIElubmVyQ3JlYXRvciApCi0gICAgICAgICAgICAgICAgaWRlbnRpZmllclN1ZmZpeC5hZGQoc2VxdWVuY2UoIjxpZGVudGlmaWVyU3VmZml4JDM+IikKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjxpZGVudGlmaWVyeVN1ZmZpeCRhPiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJjbGFzcyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aGlzIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHNlcXVlbmNlKCI8aWRlbnRpZmllclN1ZmZpeCQ0PiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgic3VwZXIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGFyZ3VtZW50cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzZXF1ZW5jZSgiPGlkZW50aWZpZXJTdWZmaXgkNT4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIm5ldyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGlubmVyQ3JlYXRvcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJTdWZmaXg7Ci0gICAgfQotCi0gICAgLyoqIEV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb246Ci0gICAgICogICAgICBOb25XaWxkY2FyZFR5cGVBcmd1bWVudHMgRXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbigpIHsKLSAgICAgICAgbG9nKCJleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uIik7Ci0gICAgICAgIGlmIChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uICE9IG51bGwpIHJldHVybiBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uOwotICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uID0gc2VxdWVuY2UoIjxleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uPiIpOwotICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uLmFkZChub25XaWxkY2FyZFR5cGVBcmd1bWVudHMoKSk7Ci0gICAgICAgIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24uYWRkKGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXgoKSk7Ci0gICAgICAgIHJldHVybiBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBOb25XaWxkY2FyZFR5cGVBcmd1bWVudHM6Ci0gICAgICogICAgICA8IFR5cGVMaXN0PgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgbm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkgewotICAgICAgICBsb2coIm5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cyIpOwotICAgICAgICBpZiAobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzICE9IG51bGwpIHJldHVybiBub25XaWxkY2FyZFR5cGVBcmd1bWVudHM7Ci0gICAgICAgIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cyA9IHNlcXVlbmNlKCI8bm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzPiIpOwotICAgICAgICBub25XaWxkY2FyZFR5cGVBcmd1bWVudHMuYWRkKG5ldyBTeW1ib2woIjwiKSk7Ci0gICAgICAgIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cy5hZGQodHlwZUxpc3QoKSk7Ci0gICAgICAgIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cy5hZGQobmV3IFN5bWJvbCgiPiIpKTsKLSAgICAgICAgcmV0dXJuIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50czsKLSAgICB9Ci0KLSAgICAvKiogRXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeDoKLSAgICAgKiAgICAgIHN1cGVyIFN1cGVyU3VmZml4Ci0gICAgICogICAgICBJZGVudGlmaWVyIEFyZ3VtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeCgpIHsKLSAgICAgICAgbG9nKCJleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4Iik7Ci0gICAgICAgIGlmIChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4ICE9IG51bGwpIHJldHVybiBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4OwotICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4ID0gYWx0ZXJuYXRpb24oIjxleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4JGE+Iik7Ci0gICAgICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4LmFkZChzZXF1ZW5jZSgiPGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXgkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInN1cGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZChzdXBlclN1ZmZpeCgpKSk7Ci0gICAgICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4LmFkZChzZXF1ZW5jZSgiPGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXgkMj4iKQotICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgIC5hZGQoYXJndW1lbnRzKCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeDsKLSAgICB9Ci0KLSAgICAvKiogUHJlZml4T3A6Ci0gICAgICogICAgICArKwotICAgICAqICAgICAgLS0KLSAgICAgKiAgICAgICEKLSAgICAgKiAgICAgIH4KLSAgICAgKiAgICAgICsKLSAgICAgKiAgICAgIC0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHByZWZpeE9wKCkgewotICAgICAgICBsb2coInByZWZpeE9wIik7Ci0gICAgICAgIGlmIChwcmVmaXhPcCAhPSBudWxsKSByZXR1cm4gcHJlZml4T3A7Ci0gICAgICAgIHByZWZpeE9wID0gYWx0ZXJuYXRpb24oIjxwcmVmaXhPcD4iKTsKLSAgICAgICAgcHJlZml4T3AuYWRkKG5ldyBTeW1ib2woIisrIikpOwotICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgiLS0iKSk7Ci0gICAgICAgIHByZWZpeE9wLmFkZChuZXcgU3ltYm9sKCchJykpOwotICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgnficpKTsKLSAgICAgICAgcHJlZml4T3AuYWRkKG5ldyBTeW1ib2woJysnKSk7Ci0gICAgICAgIHByZWZpeE9wLmFkZChuZXcgU3ltYm9sKCctJykpOwotICAgICAgICByZXR1cm4gcHJlZml4T3A7Ci0gICAgfQotCi0gICAgLyoqIFBvc3RmaXhPcDoKLSAgICAgKiAgICAgICsrCi0gICAgICogICAgICAtLQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgcG9zdGZpeE9wKCkgewotICAgICAgICBsb2coInBvc3RmaXhPcCIpOwotICAgICAgICBpZiAocG9zdGZpeE9wICE9IG51bGwpIHJldHVybiBwb3N0Zml4T3A7Ci0gICAgICAgIHBvc3RmaXhPcCA9IGFsdGVybmF0aW9uKCI8cG9zdGZpeE9wPiIpOwotICAgICAgICBwb3N0Zml4T3AuYWRkKG5ldyBTeW1ib2woIisrIikpOwotICAgICAgICBwb3N0Zml4T3AuYWRkKG5ldyBTeW1ib2woIi0tIikpOwotICAgICAgICByZXR1cm4gcG9zdGZpeE9wOwotICAgIH0KLQotICAgIC8qKiBTZWxlY3RvcjoKLSAgICAgKiAgICAgIC4gSWRlbnRpZmllciBbQXJndW1lbnRzXQotICAgICAqICAgICAgLiBFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uCi0gICAgICogICAgICAudGhpcwotICAgICAqICAgICAgLnN1cGVyIFN1cGVyU3VmZml4Ci0gICAgICogICAgICAubmV3IFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdIElubmVyQ3JlYXRvcgotICAgICAqICAgICAgWyBFeHByZXNzaW9uXQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc2VsZWN0b3IoKSB7Ci0gICAgICAgIGxvZygic2VsZWN0b3IiKTsKLSAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHJldHVybiBzZWxlY3RvcjsKLSAgICAgICAgc2VsZWN0b3IgPSBhbHRlcm5hdGlvbigiPHNlbGVjdG9yPiIpOwotICAgICAgICAgICAgc2VsZWN0b3IuYWRkKHNlcXVlbmNlKCI8c2VsZWN0b3IkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQyPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCi0gICAgICAgICAgICAgICAgLmFkZChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uKCkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgc2VsZWN0b3IuYWRkKHNlcXVlbmNlKCI8c2VsZWN0b3IkMz4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInRoaXMiKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQ0PiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgic3VwZXIiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHN1cGVyU3VmZml4KCkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgc2VsZWN0b3IuYWRkKHNlcXVlbmNlKCI8c2VsZWN0b3IkNT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIm5ldyIpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICAgICAuYWRkKGlubmVyQ3JlYXRvcigpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLmFkZChzZXF1ZW5jZSgiPHNlbGVjdG9yJDY+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ1snKSkKLSAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ10nKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKiogU3VwZXJTdWZmaXg6Ci0gICAgICogICAgICBBcmd1bWVudHMKLSAgICAgKiAgICAgIC4gSWRlbnRpZmllciBbQXJndW1lbnRzXQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc3VwZXJTdWZmaXgoKSB7Ci0gICAgICAgIGxvZygic3VwZXJTdWZmaXgiKTsKLSAgICAgICAgaWYgKHN1cGVyU3VmZml4ICE9IG51bGwpIHJldHVybiBzdXBlclN1ZmZpeDsKLSAgICAgICAgc3VwZXJTdWZmaXggPSBhbHRlcm5hdGlvbigiPHN1cGVyU3VmZml4PiIpOwotICAgICAgICAgICAgc3VwZXJTdWZmaXguYWRkKGFyZ3VtZW50cygpKTsKLSAgICAgICAgICAgIHN1cGVyU3VmZml4LmFkZChzZXF1ZW5jZSgiPHN1cGVyU3VmZml4JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhcmd1bWVudHMoKSkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gc3VwZXJTdWZmaXg7Ci0gICAgfQotCi0gICAgLyoqIEJhc2ljVHlwZToKLSAgICAgKiAgICAgIGJ5dGUKLSAgICAgKiAgICAgIHNob3J0Ci0gICAgICogICAgICBjaGFyCi0gICAgICogICAgICBpbnQKLSAgICAgKiAgICAgIGxvbmcKLSAgICAgKiAgICAgIGZsb2F0Ci0gICAgICogICAgICBkb3VibGUKLSAgICAgKiAgICAgIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGJhc2ljVHlwZSgpIHsKLSAgICAgICAgbG9nKCJiYXNpY1R5cGUiKTsKLSAgICAgICAgaWYgKGJhc2ljVHlwZSAhPSBudWxsKSByZXR1cm4gYmFzaWNUeXBlOwotICAgICAgICBiYXNpY1R5cGUgPSBhbHRlcm5hdGlvbigiPGJhc2ljVHlwZT4iKTsKLSAgICAgICAgICAgIGJhc2ljVHlwZS5hZGQobmV3IExpdGVyYWwoImJ5dGUiKSk7Ci0gICAgICAgICAgICBiYXNpY1R5cGUuYWRkKG5ldyBMaXRlcmFsKCJzaG9ydCIpKTsKLSAgICAgICAgICAgIGJhc2ljVHlwZS5hZGQobmV3IExpdGVyYWwoImNoYXIiKSk7Ci0gICAgICAgICAgICBiYXNpY1R5cGUuYWRkKG5ldyBMaXRlcmFsKCJpbnQiKSk7Ci0gICAgICAgICAgICBiYXNpY1R5cGUuYWRkKG5ldyBMaXRlcmFsKCJsb25nIikpOwotICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgiZmxvYXQiKSk7Ci0gICAgICAgICAgICBiYXNpY1R5cGUuYWRkKG5ldyBMaXRlcmFsKCJkb3VibGUiKSk7Ci0gICAgICAgICAgICBiYXNpY1R5cGUuYWRkKG5ldyBMaXRlcmFsKCJib29sZWFuIikpOwotICAgICAgICByZXR1cm4gYmFzaWNUeXBlOwotICAgIH0KLQotICAgIC8qKiBBcmd1bWVudHNPcHQ6Ci0gICAgICogICAgICBbIEFyZ3VtZW50cyBdCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBhcmd1bWVudHNPcHQoKSB7Ci0gICAgICAgIGxvZygiYXJndW1lbnRzT3B0Iik7Ci0gICAgICAgIGlmIChhcmd1bWVudHNPcHQgIT0gbnVsbCkgcmV0dXJuIGFyZ3VtZW50c09wdDsKLSAgICAgICAgYXJndW1lbnRzT3B0ID0gemVyb09yT25lKGFyZ3VtZW50cygpKTsKLSAgICAgICAgcmV0dXJuIGFyZ3VtZW50c09wdDsKLSAgICB9Ci0KLSAgICAvKiogQXJndW1lbnRzOgotICAgICAqICAgICAgKCBbRXhwcmVzc2lvbiB7LCBFeHByZXNzaW9uIH1dKQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYXJndW1lbnRzKCkgewotICAgICAgICBsb2coImFyZ3VtZW50cyIpOwotICAgICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHJldHVybiBhcmd1bWVudHM7Ci0gICAgICAgIGFyZ3VtZW50cyA9IHNlcXVlbmNlKCI8YXJndW1lbnRzPiIpOwotICAgICAgICAgICAgYXJndW1lbnRzLmFkZChuZXcgU3ltYm9sKCcoJykpOwotICAgICAgICAgICAgYXJndW1lbnRzLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxhcmd1bWVudHMkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPGFyZ3VtZW50cyQyPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICBhcmd1bWVudHMuYWRkKG5ldyBTeW1ib2woJyknKSk7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqIEJyYWNrZXRzT3B0OgotICAgICAqICAgICAge1tdfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYnJhY2tldHNPcHQoKSB7Ci0gICAgICAgIGxvZygiYnJhY2tldHNPcHQiKTsKLSAgICAgICAgaWYgKGJyYWNrZXRzT3B0ICE9IG51bGwpIHJldHVybiBicmFja2V0c09wdDsKLSAgICAgICAgYnJhY2tldHNPcHQgPSByZXBldGl0aW9uKHNlcXVlbmNlKCI8YnJhY2tldHNPcHQkMT4iKQotICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCdbJykpCi0gICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ10nKSkKLSAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGJyYWNrZXRzT3B0OwotICAgIH0KLQotICAgIC8qKiBDcmVhdG9yOgotICAgICAqICAgICAgW05vbldpbGRjYXJkVHlwZUFyZ3VtZW50c10gQ3JlYXRlZE5hbWUgKCBBcnJheUNyZWF0b3JSZXN0ICB8IENsYXNzQ3JlYXRvclJlc3QgKQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY3JlYXRvcigpIHsKLSAgICAgICAgbG9nKCJjcmVhdG9yIik7Ci0gICAgICAgIGlmIChjcmVhdG9yICE9IG51bGwpIHJldHVybiBjcmVhdG9yOwotICAgICAgICBjcmVhdG9yID0gc2VxdWVuY2UoIjxjcmVhdG9yPiIpOwotICAgICAgICAgICAgY3JlYXRvci5hZGQoemVyb09yT25lKG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpKSk7Ci0gICAgICAgICAgICBjcmVhdG9yLmFkZChjcmVhdGVkTmFtZSgpKTsKLSAgICAgICAgICAgIGNyZWF0b3IuYWRkKGFsdGVybmF0aW9uKCI8Y3JlYXRvciRhPiIpCi0gICAgICAgICAgICAgICAgLmFkZChhcnJheUNyZWF0b3JSZXN0KCkpCi0gICAgICAgICAgICAgICAgLmFkZChjbGFzc0NyZWF0b3JSZXN0KCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gY3JlYXRvcjsKLSAgICB9Ci0KLSAgICAvKiogQ3JlYXRlZE5hbWU6Ci0gICAgICogICAgICBJZGVudGlmaWVyIFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdIHsuIElkZW50aWZpZXIgW05vbldpbGRjYXJkVHlwZUFyZ3VtZW50c119Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBjcmVhdGVkTmFtZSgpIHsKLSAgICAgICAgbG9nKCJjcmVhdGVkTmFtZSIpOwotICAgICAgICBpZiAoY3JlYXRlZE5hbWUgIT0gbnVsbCkgcmV0dXJuIGNyZWF0ZWROYW1lOwotICAgICAgICBjcmVhdGVkTmFtZSA9IHNlcXVlbmNlKCI8Y3JlYXRlZE5hbWU+Iik7Ci0gICAgICAgICAgICBjcmVhdGVkTmFtZS5hZGQoaWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIGNyZWF0ZWROYW1lLmFkZCh6ZXJvT3JPbmUobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpKTsKLSAgICAgICAgICAgIGNyZWF0ZWROYW1lLmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8Y3JlYXRlZE5hbWUkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQotICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gY3JlYXRlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIElubmVyQ3JlYXRvcjoKLSAgICAgKiAgICAgIElkZW50aWZpZXIgQ2xhc3NDcmVhdG9yUmVzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgaW5uZXJDcmVhdG9yKCkgewotICAgICAgICBsb2coImlubmVyQ3JlYXRvciIpOwotICAgICAgICBpZiAoaW5uZXJDcmVhdG9yICE9IG51bGwpIHJldHVybiBpbm5lckNyZWF0b3I7Ci0gICAgICAgIGlubmVyQ3JlYXRvciA9IHNlcXVlbmNlKCI8aW5uZXJDcmVhdG9yPiIpOwotICAgICAgICAgICAgaW5uZXJDcmVhdG9yLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgaW5uZXJDcmVhdG9yLmFkZChjbGFzc0NyZWF0b3JSZXN0KCkpOwotICAgICAgICByZXR1cm4gaW5uZXJDcmVhdG9yOwotICAgIH0KLQotICAgIC8qKiBBcnJheUNyZWF0b3JSZXN0OgotICAgICAqICAgICAgWyAoXSBCcmFja2V0c09wdCBBcnJheUluaXRpYWxpemVyIHwgRXhwcmVzc2lvbl0ge1sgRXhwcmVzc2lvbl19IEJyYWNrZXRzT3B0ICkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGFycmF5Q3JlYXRvclJlc3QoKSB7Ci0gICAgICAgIGxvZygiYXJyYXlDcmVhdG9yUmVzdCIpOwotICAgICAgICBpZiAoYXJyYXlDcmVhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gYXJyYXlDcmVhdG9yUmVzdDsKLSAgICAgICAgYXJyYXlDcmVhdG9yUmVzdCA9IHNlcXVlbmNlKCI8YXJyYXlDcmVhdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIGFycmF5Q3JlYXRvclJlc3QuYWRkKG5ldyBTeW1ib2woJ1snKSk7Ci0gICAgICAgICAgICBhcnJheUNyZWF0b3JSZXN0LmFkZChhbHRlcm5hdGlvbigiPGFycmF5Q3JlYXRvclJlc3QkYT4iKQotICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxhcnJheUNyZWF0b3JSZXN0JDE+IikKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCddJykpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoYnJhY2tldHNPcHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZChhcnJheUluaXRpYWxpemVyKCkpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxhcnJheUNyZWF0b3IkMj4iKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCddJykpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPGFycmF5Q3JlYXRvciQzPiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ1snKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCddJykpCi0gICAgICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoYnJhY2tldHNPcHQoKSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gYXJyYXlDcmVhdG9yUmVzdDsKLSAgICB9Ci0KLSAgICAvKiogQ2xhc3NDcmVhdG9yUmVzdDoKLSAgICAgKiAgICAgIEFyZ3VtZW50cyBbQ2xhc3NCb2R5XQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY2xhc3NDcmVhdG9yUmVzdCgpIHsKLSAgICAgICAgbG9nKCJjbGFzc0NyZWF0b3JSZXN0Iik7Ci0gICAgICAgIGlmIChjbGFzc0NyZWF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBjbGFzc0NyZWF0b3JSZXN0OwotICAgICAgICBjbGFzc0NyZWF0b3JSZXN0ID0gc2VxdWVuY2UoIjxjbGFzc0NyZWF0b3JSZXN0PiIpOwotICAgICAgICAgICAgY2xhc3NDcmVhdG9yUmVzdC5hZGQoYXJndW1lbnRzKCkpOwotICAgICAgICAgICAgY2xhc3NDcmVhdG9yUmVzdC5hZGQoemVyb09yT25lKGNsYXNzQm9keSgpKSk7Ci0gICAgICAgIHJldHVybiBjbGFzc0NyZWF0b3JSZXN0OwotICAgIH0KLQotICAgIC8qKiBBcnJheUluaXRpYWxpemVyOgotICAgICAqICAgICAgeyBbVmFyaWFibGVJbml0aWFsaXplciB7LCBWYXJpYWJsZUluaXRpYWxpemVyfSBbLF1dfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYXJyYXlJbml0aWFsaXplcigpIHsKLSAgICAgICAgbG9nKCJhcnJheUluaXRpYWxpemVyIik7Ci0gICAgICAgIGlmIChhcnJheUluaXRpYWxpemVyICE9IG51bGwpIHJldHVybiBhcnJheUluaXRpYWxpemVyOwotICAgICAgICBhcnJheUluaXRpYWxpemVyID0gc2VxdWVuY2UoIjxhcnJheUluaXRpYWxpemVyPiIpOwotICAgICAgICBhcnJheUluaXRpYWxpemVyLmFkZChuZXcgU3ltYm9sKCJ7IikpOwotICAgICAgICBhcnJheUluaXRpYWxpemVyLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxhcnJheUluaXRpYWxpemVyJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlSW5pdGlhbGl6ZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxhcnJheUluaXRpYWxpemVyJDI+IikKLSAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIsIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQodmFyaWFibGVJbml0aWFsaXplcigpKQotICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgnLCcpKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICBhcnJheUluaXRpYWxpemVyLmFkZChuZXcgU3ltYm9sKCJ9IikpOwotICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLSAgICAvKiogVmFyaWFibGVJbml0aWFsaXplcjoKLSAgICAgKiAgICAgIEFycmF5SW5pdGlhbGl6ZXIKLSAgICAgKiAgICAgIEV4cHJlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlSW5pdGlhbGl6ZXIoKSB7Ci0gICAgICAgIGxvZygidmFyaWFibGVJbml0aWFsaXplciIpOwotICAgICAgICBpZiAodmFyaWFibGVJbml0aWFsaXplciAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVJbml0aWFsaXplcjsKLSAgICAgICAgdmFyaWFibGVJbml0aWFsaXplciA9IGFsdGVybmF0aW9uKCI8dmFyaWFibGVJbml0aWFsaXplcj4iKTsKLSAgICAgICAgICAgIHZhcmlhYmxlSW5pdGlhbGl6ZXIuYWRkKGFycmF5SW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgICAgICB2YXJpYWJsZUluaXRpYWxpemVyLmFkZChleHByZXNzaW9uKCkpOwotICAgICAgICByZXR1cm4gdmFyaWFibGVJbml0aWFsaXplcjsKLSAgICB9Ci0KLSAgICAvKiogUGFyRXhwcmVzc2lvbjoKLSAgICAgKiAgICAgICggRXhwcmVzc2lvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHBhckV4cHJlc3Npb24oKSB7Ci0gICAgICAgIGxvZygicGFyRXhwcmVzc2lvbiIpOwotICAgICAgICBpZiAocGFyRXhwcmVzc2lvbiAhPSBudWxsKSByZXR1cm4gcGFyRXhwcmVzc2lvbjsKLSAgICAgICAgcGFyRXhwcmVzc2lvbiA9IHNlcXVlbmNlKCI8cGFyRXhwcmVzc2lvbj4iKTsKLSAgICAgICAgICAgIHBhckV4cHJlc3Npb24uYWRkKG5ldyBTeW1ib2woJygnKSk7Ci0gICAgICAgICAgICBwYXJFeHByZXNzaW9uLmFkZChleHByZXNzaW9uKCkpOwotICAgICAgICAgICAgcGFyRXhwcmVzc2lvbi5hZGQobmV3IFN5bWJvbCgnKScpKTsKLSAgICAgICAgcmV0dXJuIHBhckV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgLyoqIEJsb2NrOgotICAgICAqICAgICAgeyBCbG9ja1N0YXRlbWVudHN9Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBibG9jaygpIHsKLSAgICAgICAgbG9nKCJibG9jayIpOwotICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgcmV0dXJuIGJsb2NrOwotICAgICAgICBibG9jayA9IHNlcXVlbmNlKCI8YmxvY2s+Iik7Ci0gICAgICAgIGJsb2NrLmFkZChuZXcgU3ltYm9sKCd7JykpOwotICAgICAgICBibG9jay5hZGQoYmxvY2tTdGF0ZW1lbnRzKCkpOwotICAgICAgICBibG9jay5hZGQobmV3IFN5bWJvbCgnfScpKTsKLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIC8qKiBCbG9ja1N0YXRlbWVudHM6Ci0gICAgICogICAgICB7IEJsb2NrU3RhdGVtZW50IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGJsb2NrU3RhdGVtZW50cygpIHsKLSAgICAgICAgbG9nKCJibG9ja1N0YXRlbWVudHMiKTsKLSAgICAgICAgaWYgKGJsb2NrU3RhdGVtZW50cyAhPSBudWxsKSByZXR1cm4gYmxvY2tTdGF0ZW1lbnRzOwotICAgICAgICBibG9ja1N0YXRlbWVudHMgPSByZXBldGl0aW9uKGJsb2NrU3RhdGVtZW50KCkpOwotICAgICAgICByZXR1cm4gYmxvY2tTdGF0ZW1lbnRzOwotICAgIH0KLQotICAgIC8qKiBCbG9ja1N0YXRlbWVudDoKLSAgICAgKiAgICAgIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudAotICAgICAqICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICogICAgICBbSWRlbnRpZmllcjpdIFN0YXRlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYmxvY2tTdGF0ZW1lbnQoKSB7Ci0gICAgICAgIGxvZygiYmxvY2tTdGF0ZW1lbnQiKTsKLSAgICAgICAgaWYgKGJsb2NrU3RhdGVtZW50ICE9IG51bGwpIHJldHVybiBibG9ja1N0YXRlbWVudDsKLSAgICAgICAgYmxvY2tTdGF0ZW1lbnQgPSBhbHRlcm5hdGlvbigiPGJsb2NrU3RhdGVtZW50PiIpOwotICAgICAgICAgICAgYmxvY2tTdGF0ZW1lbnQuYWRkKGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpKTsKLSAgICAgICAgICAgIGJsb2NrU3RhdGVtZW50LmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICBibG9ja1N0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxibG9ja1N0YXRlbWVudCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxibG9ja1N0YXRlbWVudCQyPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIjoiKSkKLSAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgICAgIC5hZGQoc3RhdGVtZW50KCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gYmxvY2tTdGF0ZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDoKLSAgICAgKiAgICAgIFtmaW5hbF0gVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JzOwotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KCkgewotICAgICAgICBsb2coImxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIpOwotICAgICAgICBpZiAobG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ICE9IG51bGwpIHJldHVybiBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci0gICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IHNlcXVlbmNlKCI8bG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PiIpOwotICAgICAgICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmFkZCh6ZXJvT3JPbmUobmV3IExpdGVyYWwoImZpbmFsIikpKTsKLSAgICAgICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5hZGQodHlwZSgpKTsKLSAgICAgICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5hZGQodmFyaWFibGVEZWNsYXJhdG9ycygpKTsKLSAgICAgICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5hZGQobmV3IFN5bWJvbCgnOycpKTsKLSAgICAgICAgcmV0dXJuIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKLSAgICB9Ci0KLSAgICAvKiogU3RhdGVtZW50OgotICAgICAqICAgICAgQmxvY2sKLSAgICAgKiAgICAgIGFzc2VydCBFeHByZXNzaW9uIFs6IEV4cHJlc3Npb25dOwotICAgICAqICAgICAgaWYgUGFyRXhwcmVzc2lvbiBTdGF0ZW1lbnQgW2Vsc2UgU3RhdGVtZW50XQotICAgICAqICAgICAgZm9yKEZvckNvbnRyb2wpIFN0YXRlbWVudAotICAgICAqICAgICAgd2hpbGUgUGFyRXhwcmVzc2lvbiBTdGF0ZW1lbnQKLSAgICAgKiAgICAgIGRvIFN0YXRlbWVudCB3aGlsZSBQYXJFeHByZXNzaW9uIDsKLSAgICAgKiAgICAgIHRyeSBCbG9jayAoIENhdGNoZXMgfCBbQ2F0Y2hlc10gZmluYWxseSBCbG9jayApCi0gICAgICogICAgICBzd2l0Y2ggUGFyRXhwcmVzc2lvbnsgU3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHN9Ci0gICAgICogICAgICBzeW5jaHJvbml6ZWQgUGFyRXhwcmVzc2lvbiBCbG9jawotICAgICAqICAgICAgcmV0dXJuIFtFeHByZXNzaW9uXTsKLSAgICAgKiAgICAgIHRocm93IEV4cHJlc3Npb24gOwotICAgICAqICAgICAgYnJlYWsgW0lkZW50aWZpZXJdCi0gICAgICogICAgICBjb250aW51ZSBbSWRlbnRpZmllcl0KLSAgICAgKiAgICAgIDsKLSAgICAgKiAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQKLSAgICAgKiAgICAgIElkZW50aWZpZXIgOiAgIFN0YXRlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc3RhdGVtZW50KCkgewotICAgICAgICBsb2coInN0YXRlbWVudCIpOwotICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgICAgIHN0YXRlbWVudCA9IGFsdGVybmF0aW9uKCI8c3RhdGVtZW50PiIpOwotICAgICAgICAgICAgLy9CbG9jawotICAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoYmxvY2soKSk7Ci0gICAgICAgICAgICAvL2Fzc2VydCBFeHByZXNzaW9uIFs6IEV4cHJlc3Npb25dOwotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiYXNzZXJ0IikpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8c3RhdGVtZW50JDI+IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOicpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvL2lmIFBhckV4cHJlc3Npb24gU3RhdGVtZW50IFtlbHNlIFN0YXRlbWVudF0KLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMz4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImlmIikpCi0gICAgICAgICAgICAgICAgLmFkZChwYXJFeHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZSgKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxzdGF0ZW1lbnQkND4iKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZWxzZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnQoKSkKLSAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vZm9yIChGb3JDb250cm9sKSBTdGF0ZW1lbnQKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkNT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImZvciIpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnKCcpKQotICAgICAgICAgICAgICAgIC5hZGQoZm9yQ29udHJvbCgpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnKScpKQotICAgICAgICAgICAgICAgIC5hZGQoc3RhdGVtZW50KCkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy93aGlsZSBQYXJFeHByZXNzaW9uIFN0YXRlbWVudAotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQ2PiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgid2hpbGUiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHBhckV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vZG8gU3RhdGVtZW50IHdoaWxlIFBhckV4cHJlc3Npb24gOwotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQ3PiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZG8iKSkKLSAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIndoaWxlIikpCi0gICAgICAgICAgICAgICAgLmFkZChwYXJFeHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy90cnkgQmxvY2sgKCBDYXRjaGVzIHwgW0NhdGNoZXNdIGZpbmFsbHkgQmxvY2sgKQotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQ4PiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidHJ5IikpCi0gICAgICAgICAgICAgICAgLmFkZChibG9jaygpKQotICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjxzdGF0ZW1lbnQkYT4iKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGNhdGNoZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQ5PiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShjYXRjaGVzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZmluYWxseSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChibG9jaygpKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vc3dpdGNoIFBhckV4cHJlc3Npb257IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzfQotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQxMD4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInN3aXRjaCIpKQotICAgICAgICAgICAgICAgIC5hZGQocGFyRXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgneycpKQotICAgICAgICAgICAgICAgIC5hZGQoc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ30nKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvL3N5bmNocm9uaXplZCBQYXJFeHByZXNzaW9uIEJsb2NrCi0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDExPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgic3luY2hyb25pemVkIikpCi0gICAgICAgICAgICAgICAgLmFkZChwYXJFeHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChibG9jaygpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vcmV0dXJuIFtFeHByZXNzaW9uXTsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMTI+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJyZXR1cm4iKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShleHByZXNzaW9uKCkpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIC8vdGhyb3cgRXhwcmVzc2lvbiA7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDEzPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhyb3ciKSkKLSAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvL2JyZWFrIFtJZGVudGlmaWVyXQotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQxND4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImJyZWFrIikpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoaWRlbnRpZmllcigpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvL2NvbnRpbnVlIFtJZGVudGlmaWVyXQotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQxNT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNvbnRpbnVlIikpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoaWRlbnRpZmllcigpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAvLzsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQobmV3IFN5bWJvbCgnOycpKTsKLSAgICAgICAgICAgIC8vRXhwcmVzc2lvblN0YXRlbWVudAotICAgICAgICAgICAgc3RhdGVtZW50LmFkZChleHByZXNzaW9uU3RhdGVtZW50KCkpOwotICAgICAgICAgICAgLy9JZGVudGlmaWVyIDogICBTdGF0ZW1lbnQKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMTY+IikKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzonKSkKLSAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLSAgICAvKiogQ2F0Y2hlczoKLSAgICAgKiAgICAgIENhdGNoQ2xhdXNlIHtDYXRjaENsYXVzZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNhdGNoZXMoKSB7Ci0gICAgICAgIGxvZygiY2F0Y2hlcyIpOwotICAgICAgICBpZiAoY2F0Y2hlcyAhPSBudWxsKSByZXR1cm4gY2F0Y2hlczsKLSAgICAgICAgY2F0Y2hlcyA9IHNlcXVlbmNlKCI8Y2F0Y2hlcz4iKTsKLSAgICAgICAgICAgIGNhdGNoZXMuYWRkKGNhdGNoQ2xhdXNlKCkpOwotICAgICAgICAgICAgY2F0Y2hlcy5hZGQocmVwZXRpdGlvbihjYXRjaENsYXVzZSgpKSk7Ci0gICAgICAgIHJldHVybiBjYXRjaGVzOwotICAgIH0KLQotICAgIC8qKiBDYXRjaENsYXVzZToKLSAgICAgKiAgICAgIGNhdGNoKCBGb3JtYWxQYXJhbWV0ZXIpIEJsb2NrCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBjYXRjaENsYXVzZSgpIHsKLSAgICAgICAgbG9nKCJjYXRjaENsYXVzZSIpOwotICAgICAgICBpZiAoY2F0Y2hDbGF1c2UgIT0gbnVsbCkgcmV0dXJuIGNhdGNoQ2xhdXNlOwotICAgICAgICBjYXRjaENsYXVzZSA9IHNlcXVlbmNlKCI8Y2F0Y2hDbGF1c2U+Iik7Ci0gICAgICAgICAgICBjYXRjaENsYXVzZS5hZGQobmV3IExpdGVyYWwoImNhdGNoIikpOwotICAgICAgICAgICAgY2F0Y2hDbGF1c2UuYWRkKG5ldyBTeW1ib2woJygnKSk7Ci0gICAgICAgICAgICBjYXRjaENsYXVzZS5hZGQoZm9ybWFsUGFyYW1ldGVyKCkpOwotICAgICAgICAgICAgY2F0Y2hDbGF1c2UuYWRkKG5ldyBTeW1ib2woJyknKSk7Ci0gICAgICAgICAgICBjYXRjaENsYXVzZS5hZGQoYmxvY2soKSk7Ci0gICAgICAgIHJldHVybiBjYXRjaENsYXVzZTsKLSAgICB9Ci0KLSAgICAvKiogU3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHM6Ci0gICAgICogICAgICB7IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXAgfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMoKSB7Ci0gICAgICAgIGxvZygic3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMiKTsKLSAgICAgICAgaWYgKHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzICE9IG51bGwpIHJldHVybiBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwczsKLSAgICAgICAgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMgPSByZXBldGl0aW9uKHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXAoKSk7Ci0gICAgICAgIHJldHVybiBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwczsKLSAgICB9Ci0KLSAgICAvKiogU3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cDoKLSAgICAgKiAgICAgIFN3aXRjaExhYmVsIEJsb2NrU3RhdGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cCgpIHsKLSAgICAgICAgbG9nKCJzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwIik7Ci0gICAgICAgIGlmIChzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwICE9IG51bGwpIHJldHVybiBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwOwotICAgICAgICBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwID0gc2VxdWVuY2UoIjxzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwPiIpOwotICAgICAgICAgICAgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cC5hZGQoc3dpdGNoTGFiZWwoKSk7Ci0gICAgICAgICAgICBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwLmFkZChibG9ja1N0YXRlbWVudHMoKSk7Ci0gICAgICAgIHJldHVybiBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwOwotICAgIH0KLQotICAgIC8qKiBTd2l0Y2hMYWJlbDoKLSAgICAgKiAgICAgIGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uIDoKLSAgICAgKiAgICAgIGRlZmF1bHQ6Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBzd2l0Y2hMYWJlbCgpIHsKLSAgICAgICAgbG9nKCJzd2l0Y2hMYWJlbCIpOwotICAgICAgICBpZiAoc3dpdGNoTGFiZWwgIT0gbnVsbCkgcmV0dXJuIHN3aXRjaExhYmVsOwotICAgICAgICBzd2l0Y2hMYWJlbCA9IGFsdGVybmF0aW9uKCI8c3dpdGNoTGFiZWw+Iik7Ci0gICAgICAgICAgICBzd2l0Y2hMYWJlbC5hZGQoc2VxdWVuY2UoIjxzd2l0Y2hMYWJlbCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiY2FzZSIpKQotICAgICAgICAgICAgICAgIC5hZGQoY29uc3RhbnRFeHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCI6IikpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgc3dpdGNoTGFiZWwuYWRkKG5ldyBMaXRlcmFsKCJkZWZhdWx0IikpOwotICAgICAgICAgICAgc3dpdGNoTGFiZWwuYWRkKG5ldyBTeW1ib2woIjoiKSk7Ci0gICAgICAgIHJldHVybiBzd2l0Y2hMYWJlbDsKLSAgICB9Ci0KLSAgICAvKiogTW9yZVN0YXRlbWVudEV4cHJlc3Npb25zOgotICAgICAqICAgICAgeywgU3RhdGVtZW50RXhwcmVzc2lvbiB9Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBtb3JlU3RhdGVtZW50RXhwcmVzc2lvbnMoKSB7Ci0gICAgICAgIGxvZygibW9yZVN0YXRlbWVudEV4cHJlc3Npb25zIik7Ci0gICAgICAgIGlmIChtb3JlU3RhdGVtZW50RXhwcmVzc2lvbnMgIT0gbnVsbCkgcmV0dXJuIG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9uczsKLSAgICAgICAgbW9yZVN0YXRlbWVudEV4cHJlc3Npb25zID0gcmVwZXRpdGlvbihzZXF1ZW5jZSgiPG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucyQxPiIpCi0gICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKLSAgICAgICAgICAgIC5hZGQoc3RhdGVtZW50RXhwcmVzc2lvbigpKQotICAgICAgICApOwotICAgICAgICByZXR1cm4gbW9yZVN0YXRlbWVudEV4cHJlc3Npb25zOwotICAgIH0KLQotICAgIC8qKiBGb3JDb250cm9sOgotICAgICAqICAgICAgOyAgIFtFeHByZXNzaW9uXSA7ICAgRm9yVXBkYXRlT3B0Ci0gICAgICogICAgICBTdGF0ZW1lbnRFeHByZXNzaW9uIE1vcmVTdGF0ZW1lbnRFeHByZXNzaW9uczsgICBbRXhwcmVzc2lvbl07IEZvclVwZGF0ZU9wdAotICAgICAqICAgICAgW2ZpbmFsXSBbQW5ub3RhdGlvbnNdIFR5cGUgSWRlbnRpZmllciBGb3JDb250cm9sUmVzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZm9yQ29udHJvbCgpIHsKLSAgICAgICAgbG9nKCJmb3JDb250cm9sIik7Ci0gICAgICAgIGlmIChmb3JDb250cm9sICE9IG51bGwpIHJldHVybiBmb3JDb250cm9sOwotICAgICAgICBmb3JDb250cm9sID0gYWx0ZXJuYXRpb24oIjxmb3JDb250cm9sPiIpOwotICAgICAgICAgICAgZm9yQ29udHJvbC5hZGQoc2VxdWVuY2UoIjxmb3JDb250cm9sJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShleHByZXNzaW9uKCkpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGZvclVwZGF0ZSgpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3JDb250cm9sLmFkZChzZXF1ZW5jZSgiPGZvckNvbnRyb2wkMj4iKQotICAgICAgICAgICAgICAgIC5hZGQoc3RhdGVtZW50RXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgIC5hZGQobW9yZVN0YXRlbWVudEV4cHJlc3Npb25zKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbigpKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShmb3JVcGRhdGUoKSkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgZm9yQ29udHJvbC5hZGQoc2VxdWVuY2UoIjxmb3JDb250cm9sJDM+IikKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShuZXcgTGl0ZXJhbCgiZmluYWwiKSkpCi0gICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoYW5ub3RhdGlvbnMoKSkpCi0gICAgICAgICAgICAgICAgLmFkZCh0eXBlKCkpCi0gICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICAgICAgLmFkZChmb3JDb250cm9sUmVzdCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGZvckNvbnRyb2w7Ci0gICAgfQotCi0gICAgLyoqIEZvckNvbnRyb2xSZXN0OgotICAgICAqICAgICAgVmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q7ICAgW0V4cHJlc3Npb25dIDsgICBGb3JVcGRhdGVPcHQKLSAgICAgKiAgICAgIDogRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZm9yQ29udHJvbFJlc3QoKSB7Ci0gICAgICAgIGxvZygiZm9yQ29udHJvbFJlc3QiKTsKLSAgICAgICAgaWYgKGZvckNvbnRyb2xSZXN0ICE9IG51bGwpIHJldHVybiBmb3JDb250cm9sUmVzdDsKLSAgICAgICAgZm9yQ29udHJvbFJlc3QgPSBhbHRlcm5hdGlvbigiPGZvckNvbnRyb2xSZXN0PiIpOwotICAgICAgICAgICAgZm9yQ29udHJvbFJlc3QuYWRkKHNlcXVlbmNlKCI8Zm9yQ29udHJvbFJlc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQodmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShleHByZXNzaW9uKCkpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGZvclVwZGF0ZSgpKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3JDb250cm9sUmVzdC5hZGQoc2VxdWVuY2UoIjxmb3JDb250cm9sUmVzdCQyPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc6JykpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gZm9yQ29udHJvbFJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIEZvclVwZGF0ZToKLSAgICAgKiAgICAgIFN0YXRlbWVudEV4cHJlc3Npb24gTW9yZVN0YXRlbWVudEV4cHJlc3Npb25zCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBmb3JVcGRhdGUoKSB7Ci0gICAgICAgIGxvZygiZm9yVXBkYXRlIik7Ci0gICAgICAgIGlmIChmb3JVcGRhdGUgIT0gbnVsbCkgcmV0dXJuIGZvclVwZGF0ZTsKLSAgICAgICAgZm9yVXBkYXRlID0gc2VxdWVuY2UoIjxmb3JVcGRhdGU+Iik7Ci0gICAgICAgICAgICBmb3JVcGRhdGUuYWRkKHN0YXRlbWVudEV4cHJlc3Npb24oKSk7Ci0gICAgICAgICAgICBmb3JVcGRhdGUuYWRkKG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucygpKTsKLSAgICAgICAgcmV0dXJuIGZvclVwZGF0ZTsKLSAgICB9Ci0KLQotICAgIC8qKiBNb2RpZmllcnNPcHQ6Ci0gICAgICogICAgICB7IE1vZGlmaWVyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIG1vZGlmaWVyc09wdCgpIHsKLSAgICAgICAgbG9nKCJtb2RpZmllcnNPcHQiKTsKLSAgICAgICAgaWYgKG1vZGlmaWVyc09wdCAhPSBudWxsKSByZXR1cm4gbW9kaWZpZXJzT3B0OwotICAgICAgICBtb2RpZmllcnNPcHQgPSByZXBldGl0aW9uKG1vZGlmaWVyKCkpOwotICAgICAgICByZXR1cm4gbW9kaWZpZXJzT3B0OwotICAgIH0KLQotICAgIC8qKiBNb2RpZmllcjoKLSAgICAgKiAgICAgIEFubm90YXRpb24KLSAgICAgKiAgICAgIHB1YmxpYwotICAgICAqICAgICAgcHJvdGVjdGVkCi0gICAgICogICAgICBwcml2YXRlCi0gICAgICogICAgICBzdGF0aWMKLSAgICAgKiAgICAgIGFic3RyYWN0Ci0gICAgICogICAgICBmaW5hbAotICAgICAqICAgICAgbmF0aXZlCi0gICAgICogICAgICBzeW5jaHJvbml6ZWQKLSAgICAgKiAgICAgIHRyYW5zaWVudAotICAgICAqICAgICAgdm9sYXRpbGUKLSAgICAgKiAgICAgIHN0cmljdGZwCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBtb2RpZmllcigpIHsKLSAgICAgICAgbG9nKCJtb2RpZmllciIpOwotICAgICAgICBpZiAobW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIG1vZGlmaWVyOwotICAgICAgICBtb2RpZmllciA9IGFsdGVybmF0aW9uKCI8bW9kaWZpZXI+Iik7Ci0gICAgICAgICAgICBtb2RpZmllci5hZGQoYW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwotICAgICAgICAgICAgbW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwcm90ZWN0ZWQiKSk7Ci0gICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInByaXZhdGUiKSk7Ci0gICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0YXRpYyIpKTsKLSAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgiYWJzdHJhY3QiKSk7Ci0gICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoImZpbmFsIikpOwotICAgICAgICAgICAgbW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJuYXRpdmUiKSk7Ci0gICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN5bmNocm9uaXplZCIpKTsKLSAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgidHJhbnNpZW50IikpOwotICAgICAgICAgICAgbW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJ2b2xhdGlsZSIpKTsKLSAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgic3RyaWN0ZnAiKSk7Ci0gICAgICAgIHJldHVybiBtb2RpZmllcjsKLSAgICB9Ci0KLSAgICAvKiogVmFyaWFibGVEZWNsYXJhdG9yczoKLSAgICAgKiAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB7LCAgIFZhcmlhYmxlRGVjbGFyYXRvciB9Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB2YXJpYWJsZURlY2xhcmF0b3JzKCkgewotICAgICAgICBsb2coInZhcmlhYmxlRGVjbGFyYXRvcnMiKTsKLSAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvcnMgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvcnM7Ci0gICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnMgPSBzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcnM+Iik7Ci0gICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JzLmFkZCh2YXJpYWJsZURlY2xhcmF0b3IoKSk7Ci0gICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JzLmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8dmFyaWFibGVEZWNsYXJhdG9ycyQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCi0gICAgICAgICAgICAgICAgLmFkZCh2YXJpYWJsZURlY2xhcmF0b3IoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yczsKLSAgICB9Ci0KLSAgICAvKiogVmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q6Ci0gICAgICogICAgICBWYXJpYWJsZURlY2xhcmF0b3JSZXN0IHssICAgVmFyaWFibGVEZWNsYXJhdG9yIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0KCkgewotICAgICAgICBsb2coInZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0Iik7Ci0gICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0b3JzUmVzdCAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q7Ci0gICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0ID0gc2VxdWVuY2UoIjx2YXJpYWJsZURlY2xhcmF0b3JzUmVzdD4iKTsKLSAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0LmFkZCh2YXJpYWJsZURlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjx2YXJpYWJsZURlY2xhcmF0b3JzUmVzdCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCi0gICAgICAgICAgICAgICAgLmFkZCh2YXJpYWJsZURlY2xhcmF0b3IoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0YW50RGVjbGFyYXRvcnNSZXN0OgotICAgICAqICAgICAgQ29uc3RhbnREZWNsYXJhdG9yUmVzdCB7LCAgIENvbnN0YW50RGVjbGFyYXRvciB9Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBjb25zdGFudERlY2xhcmF0b3JzUmVzdCgpIHsKLSAgICAgICAgbG9nKCJjb25zdGFudERlY2xhcmF0b3JzUmVzdCIpOwotICAgICAgICBpZiAoY29uc3RhbnREZWNsYXJhdG9yc1Jlc3QgIT0gbnVsbCkgcmV0dXJuIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwotICAgICAgICBjb25zdGFudERlY2xhcmF0b3JzUmVzdCA9IHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdG9yc1Jlc3Q+Iik7Ci0gICAgICAgICAgICBjb25zdGFudERlY2xhcmF0b3JzUmVzdC5hZGQoY29uc3RhbnREZWNsYXJhdG9yUmVzdCgpKTsKLSAgICAgICAgICAgIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0LmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdG9yc1Jlc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQotICAgICAgICAgICAgICAgIC5hZGQoY29uc3RhbnREZWNsYXJhdG9yKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgcmV0dXJuIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwotICAgIH0KLQotICAgIC8qKiBWYXJpYWJsZURlY2xhcmF0b3I6Ci0gICAgICogICAgICBJZGVudGlmaWVyIFZhcmlhYmxlRGVjbGFyYXRvclJlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvcigpIHsKLSAgICAgICAgbG9nKCJ2YXJpYWJsZURlY2xhcmF0b3IiKTsKLSAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvciAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yOwotICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3IgPSBzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcj4iKTsKLSAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3IuYWRkKHZhcmlhYmxlRGVjbGFyYXRvclJlc3QoKSk7Ci0gICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0YW50RGVjbGFyYXRvcjoKLSAgICAgKiAgICAgIElkZW50aWZpZXIgQ29uc3RhbnREZWNsYXJhdG9yUmVzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnREZWNsYXJhdG9yKCkgewotICAgICAgICBsb2coImNvbnN0YW50RGVjbGFyYXRvciIpOwotICAgICAgICBpZiAoY29uc3RhbnREZWNsYXJhdG9yICE9IG51bGwpIHJldHVybiBjb25zdGFudERlY2xhcmF0b3I7Ci0gICAgICAgIGNvbnN0YW50RGVjbGFyYXRvciA9IHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdG9yPiIpOwotICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yLmFkZChjb25zdGFudERlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICByZXR1cm4gY29uc3RhbnREZWNsYXJhdG9yOwotICAgIH0KLQotICAgIC8qKiBWYXJpYWJsZURlY2xhcmF0b3JSZXN0OgotICAgICAqICAgICAgQnJhY2tldHNPcHQgWyA9ICAgVmFyaWFibGVJbml0aWFsaXplcl0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvclJlc3QoKSB7Ci0gICAgICAgIGxvZygidmFyaWFibGVEZWNsYXJhdG9yUmVzdCIpOwotICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yUmVzdDsKLSAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yUmVzdCA9IHNlcXVlbmNlKCI8dmFyaWFibGVEZWNsYXJhdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvclJlc3QuYWRkKGJyYWNrZXRzT3B0KCkpOwotICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yUmVzdC5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8dmFyaWFibGVEZWNsYXJhdG9yUmVzdCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc9JykpCi0gICAgICAgICAgICAgICAgLmFkZCh2YXJpYWJsZUluaXRpYWxpemVyKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvclJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0YW50RGVjbGFyYXRvclJlc3Q6Ci0gICAgICogICAgICBCcmFja2V0c09wdCA9ICAgVmFyaWFibGVJbml0aWFsaXplcgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnREZWNsYXJhdG9yUmVzdCgpIHsKLSAgICAgICAgbG9nKCJjb25zdGFudERlY2xhcmF0b3JSZXN0Iik7Ci0gICAgICAgIGlmIChjb25zdGFudERlY2xhcmF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBjb25zdGFudERlY2xhcmF0b3JSZXN0OwotICAgICAgICBjb25zdGFudERlY2xhcmF0b3JSZXN0ID0gc2VxdWVuY2UoIjxjb25zdGFudERlY2xhcmF0b3JSZXN0PiIpOwotICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yUmVzdC5hZGQoYnJhY2tldHNPcHQoKSk7Ci0gICAgICAgICAgICBjb25zdGFudERlY2xhcmF0b3JSZXN0LmFkZChuZXcgU3ltYm9sKCc9JykpOwotICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yUmVzdC5hZGQodmFyaWFibGVJbml0aWFsaXplcigpKTsKLSAgICAgICAgcmV0dXJuIGNvbnN0YW50RGVjbGFyYXRvclJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIFZhcmlhYmxlRGVjbGFyYXRvcklkOgotICAgICAqICAgICAgSWRlbnRpZmllciBCcmFja2V0c09wdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgdmFyaWFibGVEZWNsYXJhdG9ySWQoKSB7Ci0gICAgICAgIGxvZygidmFyaWFibGVEZWNsYXJhdG9ySWQiKTsKLSAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvcklkICE9IG51bGwpIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3JJZDsKLSAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9ySWQgPSAgc2VxdWVuY2UoIjx2YXJpYWJsZURlY2xhcmF0b3JJZD4iKTsKLSAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcklkLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9ySWQuYWRkKGJyYWNrZXRzT3B0KCkpOwotICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9ySWQ7Ci0gICAgfQotCi0gICAgLyoqIENvbXBpbGF0aW9uVW5pdDoKLSAgICAgKiAgICAgIFtBbm5vdGF0aW9ucyBvcHQgcGFja2FnZSBRdWFsaWZpZWRJZGVudGlmaWVyIDsgIF0ge0ltcG9ydERlY2xhcmF0aW9ufSB7VHlwZURlY2xhcmF0aW9ufQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY29tcGlsYXRpb25Vbml0KCkgewotICAgICAgICBsb2coImNvbXBpbGF0aW9uVW5pdCIpOwotICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHJldHVybiBjb21waWxhdGlvblVuaXQ7Ci0gICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IHNlcXVlbmNlKCI8Y29tcGlsYXRpb25Vbml0PiIpOwotICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFkZCh6ZXJvT3JPbmUoCi0gICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxjb21waWxhdGlvblVuaXQkMT4iKQotICAgICAgICAgICAgICAgICAgICAvL3RvZG8gLmFkZCh6ZXJvT3JPbmUoYW5ub3RhdGlvbnMoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInBhY2thZ2UiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZChxdWFsaWZpZWRJZGVudGlmaWVyKCkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWRkKHJlcGV0aXRpb24oaW1wb3J0RGVjbGFyYXRpb24oKSkpOwotICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFkZChyZXBldGl0aW9uKHR5cGVEZWNsYXJhdGlvbigpKSk7Ci0gICAgICAgIHJldHVybiBjb21waWxhdGlvblVuaXQ7Ci0gICAgfQotCi0gICAgLyoqIEltcG9ydERlY2xhcmF0aW9uOgotICAgICAqICAgICAgaW1wb3J0IFtzdGF0aWNdIElkZW50aWZpZXIgeyAuICAgSWRlbnRpZmllciB9IFsgIC4qICAgXTsKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGltcG9ydERlY2xhcmF0aW9uKCkgewotICAgICAgICBsb2coImltcG9ydERlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gaW1wb3J0RGVjbGFyYXRpb247Ci0gICAgICAgIGltcG9ydERlY2xhcmF0aW9uID0gc2VxdWVuY2UoIjxpbXBvcnREZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uLmFkZChuZXcgTGl0ZXJhbCgiaW1wb3J0IikpOwotICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShuZXcgTGl0ZXJhbCgic3RhdGljIikpKTsKLSAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxpbXBvcnREZWNsYXJhdGlvbiQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCi0gICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgiLioiKSkpOwotICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7Ci0gICAgICAgIHJldHVybiBpbXBvcnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogVHlwZURlY2xhcmF0aW9uOgotICAgICAqICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICogICAgICA7Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB0eXBlRGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIGxvZygidHlwZURlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjx0eXBlRGVjbGFyYXRpb24+Iik7Ci0gICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24uYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbi5hZGQobmV3IFN5bWJvbCgnOycpKTsKLSAgICAgICAgcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOgotICAgICAqICAgICAgTW9kaWZpZXJzT3B0IChDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIGxvZygiY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKLSAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gc2VxdWVuY2UoIjxjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+Iik7Ci0gICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQobW9kaWZpZXJzT3B0KCkpOwotICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKGFsdGVybmF0aW9uKCI8Y2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uJGE+IikKLSAgICAgICAgICAgICAgICAuYWRkKGNsYXNzRGVjbGFyYXRpb24oKSkKLSAgICAgICAgICAgICAgICAuYWRkKGludGVyZmFjZURlY2xhcmF0aW9uKCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKiBDbGFzc0RlY2xhcmF0aW9uOgotICAgICAqICAgICAgTm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiAgICAgICAgICAgLy8gbm90ZSBlcnJvciBpbiBKTFOkMTggbWFrZXMgdGhpcyBsb29rIGxpa2UgYSBTZXF1ZW5jZSBub3QgYW4gQWx0ZXJuYXRpb24KLSAgICAgKiAgICAgIEVudW1EZWNsYXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY2xhc3NEZWNsYXJhdGlvbigpIHsKLSAgICAgICAgbG9nKCJjbGFzc0RlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChjbGFzc0RlY2xhcmF0aW9uICE9IG51bGwpIHJldHVybiBjbGFzc0RlY2xhcmF0aW9uOwotICAgICAgICBjbGFzc0RlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjxjbGFzc0RlY2xhcmF0aW9uPiIpOwotICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmFkZChub3JtYWxDbGFzc0RlY2xhcmF0aW9uKCkpOwotICAgICAgICAvL3RvZG8gY2xhc3NEZWNsYXJhdGlvbi5hZGQoZW51bURlY2xhcmF0aW9uKCkpOwotICAgICAgICByZXR1cm4gY2xhc3NEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogTm9ybWFsQ2xhc3NEZWNsYXJhdGlvbjoKLSAgICAgKiAgICAgIGNsYXNzIElkZW50aWZpZXIgVHlwZVBhcmFtZXRlcnMgb3B0IFtleHRlbmRzIFR5cGVdIFtpbXBsZW1lbnRzIFR5cGVMaXN0XSBDbGFzc0JvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIG5vcm1hbENsYXNzRGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIGxvZygibm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiIpOwotICAgICAgICBpZiAobm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbjsKLSAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiA9IHNlcXVlbmNlKCI8bm9ybWFsQ2xhc3NEZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIG5vcm1hbENsYXNzRGVjbGFyYXRpb24uYWRkKG5ldyBMaXRlcmFsKCJjbGFzcyIpKTsKLSAgICAgICAgICAgIG5vcm1hbENsYXNzRGVjbGFyYXRpb24uYWRkKGlkZW50aWZpZXIoKSk7Ci0gICAgICAgICAgICBub3JtYWxDbGFzc0RlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUodHlwZVBhcmFtZXRlcnMoKSkpOwotICAgICAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8bm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZXh0ZW5kcyIpKQotICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICBub3JtYWxDbGFzc0RlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxub3JtYWxDbGFzc0RlY2xhcmF0aW9uJDI+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJpbXBsZW1lbnRzIikpCi0gICAgICAgICAgICAgICAgLmFkZCh0eXBlTGlzdCgpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICBub3JtYWxDbGFzc0RlY2xhcmF0aW9uLmFkZChjbGFzc0JvZHkoKSk7Ci0gICAgICAgIHJldHVybiBub3JtYWxDbGFzc0RlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKiBUeXBlUGFyYW1ldGVyczoKLSAgICAgKiAgICAgIDwgVHlwZVBhcmFtZXRlciB7LCBUeXBlUGFyYW1ldGVyfT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHR5cGVQYXJhbWV0ZXJzKCkgewotICAgICAgICBsb2coInR5cGVQYXJhbWV0ZXJzIik7Ci0gICAgICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSByZXR1cm4gdHlwZVBhcmFtZXRlcnM7Ci0gICAgICAgIHR5cGVQYXJhbWV0ZXJzID0gc2VxdWVuY2UoIjx0eXBlUGFyYW1ldGVycz4iKTsKLSAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLmFkZChuZXcgU3ltYm9sKCc8JykpOwotICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMuYWRkKHR5cGVQYXJhbWV0ZXIoKSk7Ci0gICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPHR5cGVQYXJhbWV0ZXJzJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGVQYXJhbWV0ZXIoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMuYWRkKG5ldyBTeW1ib2woJz4nKSk7Ci0gICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKiogVHlwZVBhcmFtZXRlcjoKLSAgICAgKiAgICAgIElkZW50aWZpZXIgW2V4dGVuZHNCb3VuZF0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHR5cGVQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIGxvZygidHlwZVBhcmFtZXRlciIpOwotICAgICAgICBpZiAodHlwZVBhcmFtZXRlciAhPSBudWxsKSByZXR1cm4gdHlwZVBhcmFtZXRlcjsKLSAgICAgICAgdHlwZVBhcmFtZXRlciA9IHNlcXVlbmNlKCI8dHlwZVBhcmFtZXRlcj4iKTsKLSAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYWRkKGlkZW50aWZpZXIoKSk7Ci0gICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjx0eXBlUGFyYW1ldGVyJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJleHRlbmRzIikpCi0gICAgICAgICAgICAgICAgLmFkZChib3VuZCgpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyOwotICAgIH0KLQotICAgIC8qKiBCb3VuZDoKLSAgICAgKiAgICAgIFR5cGUgeyZUeXBlfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYm91bmQoKSB7Ci0gICAgICAgIGxvZygiYm91bmQiKTsKLSAgICAgICAgaWYgKGJvdW5kICE9IG51bGwpIHJldHVybiBib3VuZDsKLSAgICAgICAgYm91bmQgPSBzZXF1ZW5jZSgiPGJvdW5kPiIpOwotICAgICAgICAgICAgYm91bmQuYWRkKHR5cGUoKSk7Ci0gICAgICAgICAgICBib3VuZC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPGJvdW5kJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJyYnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gYm91bmQ7Ci0gICAgfQotCi0gICAgLyoqIEVudW1EZWNsYXJhdGlvbjoKLSAgICAgKiAgICAgIENsYXNzTW9kaWZpZXJzIG9wdCBlbnVtIElkZW50aWZpZXJbaW1wbGVtZW50cyBUeXBlTGlzdF0gRW51bUJvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGVudW1EZWNsYXJhdGlvbigpIHsKLSAgICAgICAgbG9nKCJlbnVtRGVjbGFyYXRpb24iKTsKLSAgICAgICAgaWYgKGVudW1EZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gZW51bURlY2xhcmF0aW9uOwotICAgICAgICBlbnVtRGVjbGFyYXRpb24gPSBzZXF1ZW5jZSgiPGVudW1EZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIGVudW1EZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKGNsYXNzTW9kaWZpZXJzKCkpKTsKLSAgICAgICAgICAgIGVudW1EZWNsYXJhdGlvbi5hZGQobmV3IExpdGVyYWwoImVudW0iKSk7Ci0gICAgICAgICAgICBlbnVtRGVjbGFyYXRpb24uYWRkKGlkZW50aWZpZXIoKSk7Ci0gICAgICAgICAgICBlbnVtRGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPGVudW1EZWNsYXJhdGlvbiQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiaW1wbGVtZW50cyIpKQotICAgICAgICAgICAgICAgIC5hZGQodHlwZUxpc3QoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICAgICAgZW51bURlY2xhcmF0aW9uLmFkZChlbnVtQm9keSgpKTsKLSAgICAgICAgcmV0dXJuIGVudW1EZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogRW51bUJvZHk6Ci0gICAgICogICAgICB7IEVudW1Db25zdGFudHMgb3B0ICxvcHQgRW51bUJvZHlEZWNsYXJhdGlvbnMgb3B0IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGVudW1Cb2R5KCkgewotICAgICAgICBsb2coImVudW1Cb2R5Iik7Ci0gICAgICAgIGlmIChlbnVtQm9keSAhPSBudWxsKSByZXR1cm4gZW51bUJvZHk7Ci0gICAgICAgIGVudW1Cb2R5ID0gc2VxdWVuY2UoIjxlbnVtQm9keT4iKTsKLSAgICAgICAgICAgIGVudW1Cb2R5LmFkZChuZXcgU3ltYm9sKCd7JykpOwotICAgICAgICAgICAgZW51bUJvZHkuYWRkKHplcm9Pck9uZShlbnVtQ29uc3RhbnRzKCkpKTsKLSAgICAgICAgICAgIGVudW1Cb2R5LmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgnLCcpKSk7Ci0gICAgICAgICAgICBlbnVtQm9keS5hZGQoemVyb09yT25lKGVudW1Cb2R5RGVjbGFyYXRpb25zKCkpKTsKLSAgICAgICAgICAgIGVudW1Cb2R5LmFkZChuZXcgU3ltYm9sKCd9JykpOwotICAgICAgICByZXR1cm4gZW51bUJvZHk7Ci0gICAgfQotCi0gICAgLyoqIEVudW1Db25zdGFudHM6Ci0gICAgICogICAgICBFbnVtQ29uc3RhbnQKLSAgICAgKiAgICAgIEVudW1Db25zdGFudHMgLCBFbnVtQ29uc3RhbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGVudW1Db25zdGFudHMoKSB7Ci0gICAgICAgIGxvZygiZW51bUNvbnN0YW50cyIpOwotICAgICAgICBpZiAoZW51bUNvbnN0YW50cyAhPSBudWxsKSByZXR1cm4gZW51bUNvbnN0YW50czsKLSAgICAgICAgZW51bUNvbnN0YW50cyA9IGFsdGVybmF0aW9uKCI8ZW51bUNvbnN0YW50cz4iKTsKLSAgICAgICAgICAgIGVudW1Db25zdGFudHMuYWRkKGVudW1Db25zdGFudCgpKTsKLSAgICAgICAgICAgIGVudW1Db25zdGFudHMuYWRkKHNlcXVlbmNlKCI8ZW51bUNvbnN0YW50cyQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChlbnVtQ29uc3RhbnRzKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCi0gICAgICAgICAgICAgICAgLmFkZChlbnVtQ29uc3RhbnQoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBlbnVtQ29uc3RhbnRzOwotICAgIH0KLQotICAgIC8qKiBFbnVtQ29uc3RhbnQ6Ci0gICAgICogICAgICBBbm5vdGF0aW9ucyBJZGVudGlmaWVyIEVudW1Bcmd1bWVudHMgb3B0IENsYXNzQm9keSBvcHQKLSAgICAgKgotICAgICAqIE4uQi4gSlJSIGNoYW5nZWQgdG8gRW51bUFyZ3VtZW50cyAtIGNoZWNrIHdpdGggSkxTdjMgc3BlYyByZXZpc2lvbnMgKGJ1ZyByZXBvcnRlZCBpbiBncmFtbWFyKQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZW51bUNvbnN0YW50KCkgewotICAgICAgICBsb2coImVudW1Db25zdGFudCIpOwotICAgICAgICBpZiAoZW51bUNvbnN0YW50ICE9IG51bGwpIHJldHVybiBlbnVtQ29uc3RhbnQ7Ci0gICAgICAgIGVudW1Db25zdGFudCA9IHNlcXVlbmNlKCI8ZW51bUNvbnN0YW50PiIpOwotICAgICAgICAgICAgZW51bUNvbnN0YW50LmFkZChhbm5vdGF0aW9ucygpKTsKLSAgICAgICAgICAgIGVudW1Db25zdGFudC5hZGQoaWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIGVudW1Db25zdGFudC5hZGQoemVyb09yT25lKGVudW1Bcmd1bWVudHMoKSkpOwotICAgICAgICAgICAgZW51bUNvbnN0YW50LmFkZCh6ZXJvT3JPbmUoY2xhc3NCb2R5KCkpKTsKLSAgICAgICAgcmV0dXJuIGVudW1Db25zdGFudDsKLSAgICB9Ci0KLSAgICAvKiogRW51bUFyZ3VtZW50czoKLSAgICAgKiAgICAgICggQXJndW1lbnRMaXN0b3B0ICkKLSAgICAgKgotICAgICAqIE4uQi4gSlJSIGNoYW5nZWQgdG8gRW51bUFyZ3VtZW50cyAtIGNoZWNrIHdpdGggSkxTdjMgc3BlYyByZXZpc2lvbnMgKGJ1ZyByZXBvcnRlZCBpbiBncmFtbWFyKQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZW51bUFyZ3VtZW50cygpIHsKLSAgICAgICAgbG9nKCJlbnVtQXJndW1lbnRzIik7Ci0gICAgICAgIGlmIChlbnVtQXJndW1lbnRzICE9IG51bGwpIHJldHVybiBlbnVtQXJndW1lbnRzOwotICAgICAgICBlbnVtQXJndW1lbnRzID0gc2VxdWVuY2UoIjxlbnVtQXJndW1lbnRzPiIpOwotICAgICAgICAgICAgZW51bUFyZ3VtZW50cy5hZGQobmV3IFN5bWJvbCgnKCcpKTsKLSAgICAgICAgICAgIGVudW1Bcmd1bWVudHMuYWRkKHplcm9Pck9uZShhcmd1bWVudExpc3QoKSkpOwotICAgICAgICAgICAgZW51bUFyZ3VtZW50cy5hZGQobmV3IFN5bWJvbCgnKScpKTsKLSAgICAgICAgcmV0dXJuIGVudW1Bcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqIEVudW1Cb2R5RGVjbGFyYXRpb25zOgotICAgICAqICAgICAgOyBDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQKLSAgICAgKgotICAgICAqIHRvZG8gdGhhdCBzZW1pY29sb24gbG9va3MgYSBiaXQgZG9kZ3kuLi4gamV6Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBlbnVtQm9keURlY2xhcmF0aW9ucygpIHsKLSAgICAgICAgbG9nKCJlbnVtQm9keURlY2xhcmF0aW9ucyIpOwotICAgICAgICBpZiAoZW51bUJvZHlEZWNsYXJhdGlvbnMgIT0gbnVsbCkgcmV0dXJuIGVudW1Cb2R5RGVjbGFyYXRpb25zOwotICAgICAgICBlbnVtQm9keURlY2xhcmF0aW9ucyA9IHNlcXVlbmNlKCI8ZW51bUJvZHlEZWNsYXJhdGlvbnM+Iik7Ci0gICAgICAgICAgICBlbnVtQm9keURlY2xhcmF0aW9ucy5hZGQobmV3IFN5bWJvbCgnOycpKTsKLSAgICAgICAgICAgIGVudW1Cb2R5RGVjbGFyYXRpb25zLmFkZCh6ZXJvT3JPbmUoY2xhc3NCb2R5RGVjbGFyYXRpb25zKCkpKTsKLSAgICAgICAgcmV0dXJuIGVudW1Cb2R5RGVjbGFyYXRpb25zOwotICAgIH0KLQotICAgIC8qKiBJbnRlcmZhY2VEZWNsYXJhdGlvbjoKLSAgICAgKiAgICAgIE5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICogICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKLSAgICAgICAgbG9nKCJpbnRlcmZhY2VEZWNsYXJhdGlvbiIpOwotICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uOwotICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbiA9IGFsdGVybmF0aW9uKCI8aW50ZXJmYWNlRGVjbGFyYXRpb24+Iik7Ci0gICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQobm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKiBOb3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbjoKLSAgICAgKiAgICAgIGludGVyZmFjZSBJZGVudGlmaWVyIFR5cGVQYXJhbWV0ZXJzIG9wdFtleHRlbmRzIFR5cGVMaXN0XSBJbnRlcmZhY2VCb2R5Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKLSAgICAgICAgbG9nKCJub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOwotICAgICAgICBpZiAobm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uOwotICAgICAgICBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IHNlcXVlbmNlKCI8bm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24+Iik7Ci0gICAgICAgICAgICBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQobmV3IExpdGVyYWwoImludGVyZmFjZSIpKTsKLSAgICAgICAgICAgIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZSh0eXBlUGFyYW1ldGVycygpKSk7Ci0gICAgICAgICAgICBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8bm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24kMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImV4dGVuZHMiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGVMaXN0KCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgICAgIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uLmFkZChpbnRlcmZhY2VCb2R5KCkpOwotICAgICAgICByZXR1cm4gbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqIFR5cGVMaXN0OgotICAgICAqICAgICAgVHlwZSB7ICwgICBUeXBlfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgdHlwZUxpc3QoKSB7Ci0gICAgICAgIGxvZygidHlwZUxpc3QiKTsKLSAgICAgICAgaWYgKHR5cGVMaXN0ICE9IG51bGwpIHJldHVybiB0eXBlTGlzdDsKLSAgICAgICAgdHlwZUxpc3QgPSBzZXF1ZW5jZSgiPHR5cGVMaXN0PiIpOwotICAgICAgICAgICAgdHlwZUxpc3QuYWRkKHR5cGUoKSk7Ci0gICAgICAgICAgICB0eXBlTGlzdC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPHR5cGVMaXN0JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gdHlwZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb246Ci0gICAgICogICAgICBJbnRlcmZhY2VNb2RpZmllcnMgb3B0IEAgaW50ZXJmYWNlIElkZW50aWZpZXIgQW5ub3RhdGlvblR5cGVCb2R5Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKCkgewotICAgICAgICBsb2coImFubm90YXRpb25UeXBlRGVjbGFyYXRpb24iKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci0gICAgICAgIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gPSBzZXF1ZW5jZSgiPGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+Iik7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUoaW50ZXJmYWNlTW9kaWZpZXJzKCkpKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJ0AnKSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZChuZXcgTGl0ZXJhbCgiaW50ZXJmYWNlIikpOyAvLyBAdG9kbyBpcyB0aGlzIGNvcnJlY3Q/Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5hZGQoYW5ub3RhdGlvblR5cGVCb2R5KCkpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQW5ub3RhdGlvblR5cGVCb2R5OgotICAgICAqICAgICAgeyBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMgfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYW5ub3RhdGlvblR5cGVCb2R5KCkgewotICAgICAgICBsb2coImFubm90YXRpb25UeXBlQm9keSIpOwotICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGVCb2R5ICE9IG51bGwpIHJldHVybiBhbm5vdGF0aW9uVHlwZUJvZHk7Ci0gICAgICAgIGFubm90YXRpb25UeXBlQm9keSA9IHNlcXVlbmNlKCI8YW5ub3RhdGlvblR5cGVCb2R5PiIpOwotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVCb2R5LmFkZChuZXcgU3ltYm9sKCd7JykpOwotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVCb2R5LmFkZChhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUJvZHkuYWRkKG5ldyBTeW1ib2woJ30nKSk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZUJvZHk7Ci0gICAgfQotCi0gICAgLyoqIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uczoKLSAgICAgKiAgICAgIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uCi0gICAgICogICAgICBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucygpIHsKLSAgICAgICAgbG9nKCJhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucyAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zOwotICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMgPSBhbHRlcm5hdGlvbigiPGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucz4iKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucy5hZGQoYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMuYWRkKHNlcXVlbmNlKCI8YW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucygpKQotICAgICAgICAgICAgICAgIC5hZGQoYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24oKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uOgotICAgICAqICAgICAgQWJzdHJhY3RNZXRob2RNb2RpZmllcnMgb3B0IFR5cGUgSWRlbnRpZmllciAoICkgRGVmYXVsdFZhbHVlb3B0IDsKLSAgICAgKiAgICAgIENvbnN0YW50RGVjbGFyYXRpb24KLSAgICAgKiAgICAgIENsYXNzRGVjbGFyYXRpb24KLSAgICAgKiAgICAgIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICogICAgICBFbnVtRGVjbGFyYXRpb24KLSAgICAgKiAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24KLSAgICAgKiAgICAgIDsKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uKCkgewotICAgICAgICBsb2coImFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjxhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmFkZChzZXF1ZW5jZSgiPGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhYnN0cmFjdE1ldGhvZE1vZGlmaWVycygpKSkKLSAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJygnKSkgICAvLyBAdG9kbyAtIGlzIHRoaXMgcmlnaHQKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJyknKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShkZWZhdWx0VmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24uYWRkKGNvbnN0YW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoY2xhc3NEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmFkZChpbnRlcmZhY2VEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmFkZChlbnVtRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmFkZChuZXcgU3ltYm9sKCc7JykpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqIERlZmF1bHRWYWx1ZToKLSAgICAgKiAgICAgIGRlZmF1bHQgRWxlbWVudFZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBkZWZhdWx0VmFsdWUoKSB7Ci0gICAgICAgIGxvZygiZGVmYXVsdFZhbHVlIik7Ci0gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgZGVmYXVsdFZhbHVlID0gc2VxdWVuY2UoIjxkZWZhdWx0VmFsdWU+Iik7Ci0gICAgICAgICAgICBkZWZhdWx0VmFsdWUuYWRkKG5ldyBMaXRlcmFsKCJkZWZhdWx0IikpOwotICAgICAgICAgICAgZGVmYXVsdFZhbHVlLmFkZChlbGVtZW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIENsYXNzQm9keToKLSAgICAgKiAgICAgIHsge0NsYXNzQm9keURlY2xhcmF0aW9ufX0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNsYXNzQm9keSgpIHsKLSAgICAgICAgbG9nKCJjbGFzc0JvZHkiKTsKLSAgICAgICAgaWYgKGNsYXNzQm9keSAhPSBudWxsKSByZXR1cm4gY2xhc3NCb2R5OwotICAgICAgICBjbGFzc0JvZHkgPSBzZXF1ZW5jZSgiPGNsYXNzQm9keT4iKTsKLSAgICAgICAgICAgIGNsYXNzQm9keS5hZGQobmV3IFN5bWJvbCgneycpKTsKLSAgICAgICAgICAgIC8vdG9kbyBjbGFzc0JvZHkuYWRkKHJlcGV0aXRpb24oY2xhc3NCb2R5RGVjbGFyYXRpb24oKSkpOwotICAgICAgICAgICAgY2xhc3NCb2R5LmFkZChuZXcgU3ltYm9sKCd9JykpOwotICAgICAgICByZXR1cm4gY2xhc3NCb2R5OwotICAgIH0KLQotICAgIC8qKiBJbnRlcmZhY2VCb2R5OgotICAgICAqICAgICAgeyB7SW50ZXJmYWNlQm9keURlY2xhcmF0aW9ufX0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGludGVyZmFjZUJvZHkoKSB7Ci0gICAgICAgIGxvZygiaW50ZXJmYWNlQm9keSIpOwotICAgICAgICBpZiAoaW50ZXJmYWNlQm9keSAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlQm9keTsKLSAgICAgICAgaW50ZXJmYWNlQm9keSA9IHNlcXVlbmNlKCI8aW50ZXJmYWNlQm9keT4iKTsKLSAgICAgICAgICAgIGludGVyZmFjZUJvZHkuYWRkKG5ldyBTeW1ib2woJ3snKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VCb2R5LmFkZChyZXBldGl0aW9uKGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbigpKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VCb2R5LmFkZChuZXcgU3ltYm9sKCd9JykpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlQm9keTsKLSAgICB9Ci0KLSAgICAvKiogQ2xhc3NCb2R5RGVjbGFyYXRpb246Ci0gICAgICogICAgICA7Ci0gICAgICogICAgICBbc3RhdGljXSBCbG9jawotICAgICAqICAgICAgTW9kaWZpZXJzT3B0IE1lbWJlckRlY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNsYXNzQm9keURlY2xhcmF0aW9uKCkgewotICAgICAgICBsb2coImNsYXNzQm9keURlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChjbGFzc0JvZHlEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gY2xhc3NCb2R5RGVjbGFyYXRpb247Ci0gICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjxjbGFzc0JvZHlEZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uLmFkZChuZXcgU3ltYm9sKCc7JykpOwotICAgICAgICAgICAgY2xhc3NCb2R5RGVjbGFyYXRpb24uYWRkKHNlcXVlbmNlKCI8Y2xhc3NCb2R5RGVjbGFyYXRpb24kMT4iKQotICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5ldyBMaXRlcmFsKCJzdGF0aWMiKSkpCi0gICAgICAgICAgICAgICAgLmFkZChibG9jaygpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uLmFkZChzZXF1ZW5jZSgiPGNsYXNzQm9keURlY2xhcmF0aW9uJDI+IikKLSAgICAgICAgICAgICAgICAuYWRkKG1vZGlmaWVyc09wdCgpKQotICAgICAgICAgICAgICAgIC5hZGQobWVtYmVyRGVjbCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQm9keURlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKiBNZW1iZXJEZWNsOgotICAgICAqICAgICAgR2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsCi0gICAgICogICAgICBNZXRob2RPckZpZWxkRGVjbAotICAgICAqICAgICAgdm9pZCBJZGVudGlmaWVyIE1ldGhvZERlY2xhcmF0b3JSZXN0Ci0gICAgICogICAgICBJZGVudGlmaWVyIENvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QKLSAgICAgKiAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgbWVtYmVyRGVjbCgpIHsKLSAgICAgICAgbG9nKCJtZW1iZXJEZWNsIik7Ci0gICAgICAgIGlmIChtZW1iZXJEZWNsICE9IG51bGwpIHJldHVybiBtZW1iZXJEZWNsOwotICAgICAgICBtZW1iZXJEZWNsID0gYWx0ZXJuYXRpb24oIjxtZW1iZXJEZWNsPiIpOwotICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQoZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsKCkpOwotICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQobWV0aG9kT3JGaWVsZERlY2woKSk7Ci0gICAgICAgICAgICBtZW1iZXJEZWNsLmFkZChzZXF1ZW5jZSgiPG1lbWJlckRlY2wkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInZvaWQiKSkKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG1ldGhvZERlY2xhcmF0b3JSZXN0KCkpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQoc2VxdWVuY2UoIjxtZW1iZXJEZWNsJDI+IikKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBtZW1iZXJEZWNsLmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBtZW1iZXJEZWNsOwotICAgIH0KLQotICAgIC8qKiBHZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2w6Ci0gICAgICogICAgICBUeXBlUGFyYW1ldGVycyBHZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbCgpIHsKLSAgICAgICAgbG9nKCJnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2wiKTsKLSAgICAgICAgaWYgKGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbCAhPSBudWxsKSByZXR1cm4gZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsOwotICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2wgPSBzZXF1ZW5jZSgiPGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbD4iKTsKLSAgICAgICAgICAgIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbC5hZGQodHlwZVBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2wuYWRkKGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbDsKLSAgICB9Ci0KLSAgICAvKiogR2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OgotICAgICAqICAgICAgVHlwZSBJZGVudGlmaWVyIE1ldGhvZERlY2xhcmF0b3JSZXN0Ci0gICAgICogICAgICBJZGVudGlmaWVyIENvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdCgpIHsKLSAgICAgICAgbG9nKCJnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QiKTsKLSAgICAgICAgaWYgKGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OwotICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QgPSBhbHRlcm5hdGlvbigiPGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdC5hZGQoc2VxdWVuY2UoIjxnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQotICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgIC5hZGQobWV0aG9kRGVjbGFyYXRvclJlc3QoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QuYWRkKHNlcXVlbmNlKCI8Z2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0JDI+IikKLSAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKLSAgICAgICAgICAgICAgICAuYWRkKGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIE1ldGhvZE9yRmllbGREZWNsOgotICAgICAqICAgICAgVHlwZSBJZGVudGlmaWVyIE1ldGhvZE9yRmllbGRSZXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBtZXRob2RPckZpZWxkRGVjbCgpIHsKLSAgICAgICAgbG9nKCJtZXRob2RPckZpZWxkRGVjbCIpOwotICAgICAgICBpZiAobWV0aG9kT3JGaWVsZERlY2wgIT0gbnVsbCkgcmV0dXJuIG1ldGhvZE9yRmllbGREZWNsOwotICAgICAgICBtZXRob2RPckZpZWxkRGVjbCA9IHNlcXVlbmNlKCI8bWV0aG9kT3JGaWVsZERlY2w+Iik7Ci0gICAgICAgICAgICBtZXRob2RPckZpZWxkRGVjbC5hZGQodHlwZSgpKTsKLSAgICAgICAgICAgIG1ldGhvZE9yRmllbGREZWNsLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgbWV0aG9kT3JGaWVsZERlY2wuYWRkKG1ldGhvZE9yRmllbGRSZXN0KCkpOwotICAgICAgICByZXR1cm4gbWV0aG9kT3JGaWVsZERlY2w7Ci0gICAgfQotCi0gICAgLyoqIE1ldGhvZE9yRmllbGRSZXN0OgotICAgICAqICAgICAgVmFyaWFibGVEZWNsYXJhdG9yUmVzdAotICAgICAqICAgICAgTWV0aG9kRGVjbGFyYXRvclJlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIG1ldGhvZE9yRmllbGRSZXN0KCkgewotICAgICAgICBsb2coIm1ldGhvZE9yRmllbGRSZXN0Iik7Ci0gICAgICAgIGlmIChtZXRob2RPckZpZWxkUmVzdCAhPSBudWxsKSByZXR1cm4gbWV0aG9kT3JGaWVsZFJlc3Q7Ci0gICAgICAgIG1ldGhvZE9yRmllbGRSZXN0ID0gYWx0ZXJuYXRpb24oIjxtZXRob2RPckZpZWxkUmVzdD4iKTsKLSAgICAgICAgICAgIG1ldGhvZE9yRmllbGRSZXN0LmFkZCh2YXJpYWJsZURlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICAgICAgbWV0aG9kT3JGaWVsZFJlc3QuYWRkKG1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICByZXR1cm4gbWV0aG9kT3JGaWVsZFJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIEludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjoKLSAgICAgKiAgICAgIDsKLSAgICAgKiAgICAgIE1vZGlmaWVyc09wdCBJbnRlcmZhY2VNZW1iZXJEZWNsCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIGxvZygiaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uIik7Ci0gICAgICAgIGlmIChpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjxpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24+Iik7Ci0gICAgICAgICAgICBpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24uYWRkKHNlcXVlbmNlKCI8aW50ZXJmYWNlQm9keURlY2xhcmF0aW9uJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG1vZGlmaWVyc09wdCgpKQotICAgICAgICAgICAgICAgIC5hZGQoaW50ZXJmYWNlTWVtYmVyRGVjbCgpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogSW50ZXJmYWNlTWVtYmVyRGVjbDoKLSAgICAgKiAgICAgIEludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsCi0gICAgICogICAgICBJbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbAotICAgICAqICAgICAgdm9pZCBJZGVudGlmaWVyIFZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdAotICAgICAqICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VNZW1iZXJEZWNsKCkgewotICAgICAgICBsb2coImludGVyZmFjZU1lbWJlckRlY2wiKTsKLSAgICAgICAgaWYgKGludGVyZmFjZU1lbWJlckRlY2wgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1lbWJlckRlY2w7Ci0gICAgICAgIGludGVyZmFjZU1lbWJlckRlY2wgPSBhbHRlcm5hdGlvbigiPGludGVyZmFjZU1lbWJlckRlY2w+Iik7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXJEZWNsLmFkZChpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbCgpKTsKLSAgICAgICAgICAgIGludGVyZmFjZU1lbWJlckRlY2wuYWRkKGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsKCkpOwotICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyRGVjbC5hZGQoc2VxdWVuY2UoIjxpbnRlcmZhY2VNZW1iZXJEZWNsJDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ2b2lkIikpCi0gICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCi0gICAgICAgICAgICAgICAgLmFkZCh2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXJEZWNsLmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXJEZWNsOwotICAgIH0KLQotICAgIC8qKiBJbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbDoKLSAgICAgKiAgICAgIFR5cGUgSWRlbnRpZmllciBJbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2woKSB7Ci0gICAgICAgIGxvZygiaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wiKTsKLSAgICAgICAgaWYgKGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsICE9IG51bGwpIHJldHVybiBpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbDsKLSAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wgPSBzZXF1ZW5jZSgiPGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsPiIpOwotICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wuYWRkKHR5cGUoKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbC5hZGQoaWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsLmFkZChpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdCgpKTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsOwotICAgIH0KLQotICAgIC8qKiBJbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdDoKLSAgICAgKiAgICAgIENvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwotICAgICAqICAgICAgSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0KCkgewotICAgICAgICBsb2coImludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0Iik7Ci0gICAgICAgIGlmIChpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3Q7Ci0gICAgICAgIGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0ID0gYWx0ZXJuYXRpb24oIjxpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdD4iKTsKLSAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0LmFkZChzZXF1ZW5jZSgiPGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0KCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3QuYWRkKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIE1ldGhvZERlY2xhcmF0b3JSZXN0OgotICAgICAqICAgICAgRm9ybWFsUGFyYW1ldGVycyBCcmFja2V0c09wdFt0aHJvd3NRdWFsaWZpZWRJZGVudGlmaWVyTGlzdF0oIE1ldGhvZEJvZHkgfDsgICkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIG1ldGhvZERlY2xhcmF0b3JSZXN0KCkgewotICAgICAgICBsb2coIm1ldGhvZERlY2xhcmF0b3JSZXN0Iik7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gbWV0aG9kRGVjbGFyYXRvclJlc3Q7Ci0gICAgICAgIG1ldGhvZERlY2xhcmF0b3JSZXN0ID0gc2VxdWVuY2UoIjxtZXRob2REZWNsYXJhdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZChmb3JtYWxQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgbWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKGJyYWNrZXRzT3B0KCkpOwotICAgICAgICAgICAgbWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPG1ldGhvZERlY2xhcmF0b3JSZXN0JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZChhbHRlcm5hdGlvbigiPG1ldGhvZERlY2xhcmF0b3JSZXN0JGE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG1ldGhvZEJvZHkoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICB9Ci0KLSAgICAvKiogVm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OgotICAgICAqICAgICAgRm9ybWFsUGFyYW1ldGVycyBbdGhyb3dzIFF1YWxpZmllZElkZW50aWZpZXJMaXN0XSAoIE1ldGhvZEJvZHkgfDsgICkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdCgpIHsKLSAgICAgICAgbG9nKCJ2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QiKTsKLSAgICAgICAgaWYgKHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gdm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OwotICAgICAgICB2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoZm9ybWFsUGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8dm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgICAgIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoYWx0ZXJuYXRpb24oIjx2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QkYT4iKQotICAgICAgICAgICAgICAgIC5hZGQobWV0aG9kQm9keSgpKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICB9Ci0KLSAgICAvKiogSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3Q6Ci0gICAgICogICAgICBGb3JtYWxQYXJhbWV0ZXJzIEJyYWNrZXRzT3B0IFt0aHJvd3MgUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdOwotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QoKSB7Ci0gICAgICAgIGxvZygiaW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QiKTsKLSAgICAgICAgaWYgKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICAgICAgaW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0PiIpOwotICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKGZvcm1hbFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoYnJhY2tldHNPcHQoKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8aW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInRocm93cyIpKQotICAgICAgICAgICAgICAgIC5hZGQocXVhbGlmaWVkSWRlbnRpZmllckxpc3QoKSkKLSAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIEludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsOgotICAgICAqICAgICAgVHlwZVBhcmFtZXRlcnMgVHlwZSBJZGVudGlmaWVyIEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbCgpIHsKLSAgICAgICAgbG9nKCJpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbCIpOwotICAgICAgICBpZiAoaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2wgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsOwotICAgICAgICBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbCA9IHNlcXVlbmNlKCI8aW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2w+Iik7Ci0gICAgICAgICAgICBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbC5hZGQodHlwZVBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbC5hZGQodHlwZSgpKTsKLSAgICAgICAgICAgIGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsLmFkZChpZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2wuYWRkKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2w7Ci0gICAgfQotCi0gICAgLyoqIFZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDoKLSAgICAgKiAgICAgIEZvcm1hbFBhcmFtZXRlcnMgW3Rocm93cyBRdWFsaWZpZWRJZGVudGlmaWVyTGlzdF07Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QoKSB7Ci0gICAgICAgIGxvZygidm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0Iik7Ci0gICAgICAgIGlmICh2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QgIT0gbnVsbCkgcmV0dXJuIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICAgICAgdm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0ID0gc2VxdWVuY2UoIjx2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3Q+Iik7Ci0gICAgICAgICAgICB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKGZvcm1hbFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhyb3dzIikpCi0gICAgICAgICAgICAgICAgLmFkZChxdWFsaWZpZWRJZGVudGlmaWVyTGlzdCgpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKG5ldyBTeW1ib2woJzsnKSk7Ci0gICAgICAgIHJldHVybiB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3Q7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3Q6Ci0gICAgICogICAgICBGb3JtYWxQYXJhbWV0ZXJzIFt0aHJvd3MgUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdIE1ldGhvZEJvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QoKSB7Ci0gICAgICAgIGxvZygiY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdCIpOwotICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdDsKLSAgICAgICAgY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdCA9IHNlcXVlbmNlKCI8Y29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdD4iKTsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QuYWRkKGZvcm1hbFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0LmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0JDE+IikKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKLSAgICAgICAgICAgICAgICAuYWRkKHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkpCi0gICAgICAgICAgICApKTsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QuYWRkKG1ldGhvZEJvZHkoKSk7Ci0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0OwotICAgIH0KLQotICAgIC8qKiBRdWFsaWZpZWRJZGVudGlmaWVyTGlzdDoKLSAgICAgKiAgICAgIFF1YWxpZmllZElkZW50aWZpZXIgeyAsICAgUXVhbGlmaWVkSWRlbnRpZmllcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkgewotICAgICAgICBsb2coInF1YWxpZmllZElkZW50aWZpZXJMaXN0Iik7Ci0gICAgICAgIGlmIChxdWFsaWZpZWRJZGVudGlmaWVyTGlzdCAhPSBudWxsKSByZXR1cm4gcXVhbGlmaWVkSWRlbnRpZmllckxpc3Q7Ci0gICAgICAgIHF1YWxpZmllZElkZW50aWZpZXJMaXN0ID0gc2VxdWVuY2UoIjxxdWFsaWZpZWRJZGVudGlmaWVyTGlzdD4iKTsKLSAgICAgICAgcXVhbGlmaWVkSWRlbnRpZmllckxpc3QuYWRkKHF1YWxpZmllZElkZW50aWZpZXIoKSk7Ci0gICAgICAgIHF1YWxpZmllZElkZW50aWZpZXJMaXN0LmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8cXVhbGlmaWVkSWRlbnRpZmllckxpc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQotICAgICAgICAgICAgICAgIC5hZGQocXVhbGlmaWVkSWRlbnRpZmllcigpKQotICAgICAgICAgICAgKSk7Ci0gICAgICAgIHJldHVybiBxdWFsaWZpZWRJZGVudGlmaWVyTGlzdDsKLSAgICB9Ci0KLSAgICAvKiogRm9ybWFsUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICggW0Zvcm1hbFBhcmFtZXRlckRlY2xzXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGZvcm1hbFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIGxvZygiZm9ybWFsUGFyYW1ldGVycyIpOwotICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycyAhPSBudWxsKSByZXR1cm4gZm9ybWFsUGFyYW1ldGVyczsKLSAgICAgICAgZm9ybWFsUGFyYW1ldGVycyA9IHNlcXVlbmNlKCI8Zm9ybWFsUGFyYW1ldGVycz4iKTsKLSAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlcnMuYWRkKG5ldyBTeW1ib2woJygnKSk7Ci0gICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXJzLmFkZCh6ZXJvT3JPbmUoZm9ybWFsUGFyYW1ldGVyRGVjbHMoKSkpOwotICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVycy5hZGQobmV3IFN5bWJvbCgnKScpKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hbFBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqIEZvcm1hbFBhcmFtZXRlckRlY2xzOgotICAgICAqICAgICAgW2ZpbmFsXSBbQW5ub3RhdGlvbnNdIFR5cGUgRm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0XQotICAgICAqIHRvZG8gLSBpcyBsYXN0IHBhcmFtZXRlciBvcHRpb25hbCEhIT8/Pz8KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGZvcm1hbFBhcmFtZXRlckRlY2xzKCkgewotICAgICAgICBsb2coImZvcm1hbFBhcmFtZXRlckRlY2xzIik7Ci0gICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJEZWNscyAhPSBudWxsKSByZXR1cm4gZm9ybWFsUGFyYW1ldGVyRGVjbHM7Ci0gICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzID0gc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXJEZWNscz4iKTsKLSAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzLmFkZCh6ZXJvT3JPbmUobmV3IExpdGVyYWwoImZpbmFsIikpKTsKLSAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzLmFkZCh6ZXJvT3JPbmUoYW5ub3RhdGlvbnMoKSkpOwotICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyRGVjbHMuYWRkKHR5cGUoKSk7Ci0gICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXJEZWNscy5hZGQoZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0KCkpOwotICAgICAgICByZXR1cm4gZm9ybWFsUGFyYW1ldGVyRGVjbHM7Ci0gICAgfQotCi0gICAgLyoqIEZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdDoKLSAgICAgKiAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIFssIEZvcm1hbFBhcmFtZXRlckRlY2xzXQotICAgICAqICAgICAgLi4uIFZhcmlhYmxlRGVjbGFyYXRvcklkCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QoKSB7Ci0gICAgICAgIGxvZygiZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0Iik7Ci0gICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QgIT0gbnVsbCkgcmV0dXJuIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdDsKLSAgICAgICAgZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0ID0gYWx0ZXJuYXRpb24oIjxmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3Q+Iik7Ci0gICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdC5hZGQoc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQodmFyaWFibGVEZWNsYXJhdG9ySWQoKSkKLSAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdCQyPiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQotICAgICAgICAgICAgICAgICAgICAuYWRkKGZvcm1hbFBhcmFtZXRlckRlY2xzKCkpCi0gICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdC5hZGQoc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QkMz4iKQotICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgiLi4uIikpICAvL3RvZG8gLSB0aGlzIGRvZXNuJ3Qgc2VlbSByaWdodCA6LSkKLSAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcklkKCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0OwotICAgIH0KLQotICAgIC8qKiBNZXRob2RCb2R5OgotICAgICAqICAgICAgQmxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIG1ldGhvZEJvZHkoKSB7Ci0gICAgICAgIGxvZygibWV0aG9kQm9keSIpOwotICAgICAgICBpZiAobWV0aG9kQm9keSAhPSBudWxsKSByZXR1cm4gbWV0aG9kQm9keTsKLSAgICAgICAgbWV0aG9kQm9keSA9IGJsb2NrKCk7Ci0gICAgICAgIHJldHVybiBtZXRob2RCb2R5OwotICAgIH0KLQotCi0gICAgLy8gLT0tPS09LT0tPS09LT0tPS09LSBFTkQgT0YgSkxTIENIQVBURVIgMTggLT0tPS09LT0tPS09LT0tPS0KLQotCi0KLQotCi0KLSAgICAvLyAtLS0tLS0gYWx0ZXJlZCBKTFN2M6Q4LjEuMSAtLS0tLS0KLSAgICAvKiogQ2xhc3NNb2RpZmllcnM6Ci0gICAgICogICAgICBDbGFzc01vZGlmaWVyIHtDbGFzc01vZGlmaWVyfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgY2xhc3NNb2RpZmllcnMoKSB7Ci0gICAgICAgIGxvZygiY2xhc3NNb2RpZmllcnMiKTsKLSAgICAgICAgaWYgKGNsYXNzTW9kaWZpZXJzICE9IG51bGwpIHJldHVybiBjbGFzc01vZGlmaWVyczsKLSAgICAgICAgY2xhc3NNb2RpZmllcnMgPSBvbmVPck1vcmUoY2xhc3NNb2RpZmllcigpKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTW9kaWZpZXJzOwotICAgIH0KLSAgICAvKiogQ2xhc3NNb2RpZmllcjogb25lIG9mCi0gICAgICogICAgICBBbm5vdGF0aW9uIHB1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZQotICAgICAqICAgICAgYWJzdHJhY3Qgc3RhdGljIGZpbmFsIHN0cmljdGZwCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBjbGFzc01vZGlmaWVyKCkgewotICAgICAgICBsb2coImNsYXNzTW9kaWZpZXIiKTsKLSAgICAgICAgaWYgKGNsYXNzTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIGNsYXNzTW9kaWZpZXI7Ci0gICAgICAgIGNsYXNzTW9kaWZpZXIgPSBuZXcgQWx0ZXJuYXRpb24oIjxjbGFzcyBtb2RpZmllcj4iKTsKLSAgICAgICAgICAgIGNsYXNzTW9kaWZpZXIuYWRkKGFubm90YXRpb24oKSk7Ci0gICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwotICAgICAgICAgICAgY2xhc3NNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInByb3RlY3RlZCIpKTsKLSAgICAgICAgICAgIGNsYXNzTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwcml2YXRlIikpOwotICAgICAgICAgICAgY2xhc3NNb2RpZmllci5hZGQobmV3IExpdGVyYWwoImFic3RyYWN0IikpOwotICAgICAgICAgICAgY2xhc3NNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0YXRpYyIpKTsKLSAgICAgICAgICAgIGNsYXNzTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJmaW5hbCIpKTsKLSAgICAgICAgICAgIGNsYXNzTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzdHJpY3RmcCIpKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tIGFsdGVyZWQgSkxTdjOkOC4xLjYgLS0tLS0tCi0gICAgLyoqIENsYXNzQm9keURlY2xhcmF0aW9uczoKLSAgICAgKiAgICAgIENsYXNzQm9keURlY2xhcmF0aW9uIHtDbGFzc0JvZHlEZWNsYXJhdGlvbn0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNsYXNzQm9keURlY2xhcmF0aW9ucygpIHsKLSAgICAgICAgbG9nKCJjbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKGNsYXNzQm9keURlY2xhcmF0aW9ucyAhPSBudWxsKSByZXR1cm4gY2xhc3NCb2R5RGVjbGFyYXRpb25zOwotICAgICAgICBjbGFzc0JvZHlEZWNsYXJhdGlvbnMgPSBvbmVPck1vcmUoY2xhc3NCb2R5RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBjbGFzc0JvZHlEZWNsYXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tIEpMU3YzpDguNC4xIC0tLS0tLQotICAgIC8qKiBGb3JtYWxQYXJhbWV0ZXI6Ci0gICAgICogICAgICBWYXJpYWJsZU1vZGlmaWVycyBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBmb3JtYWxQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIGxvZygiZm9ybWFsUGFyYW1ldGVyIik7Ci0gICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXIgIT0gbnVsbCkgcmV0dXJuIGZvcm1hbFBhcmFtZXRlcjsKLSAgICAgICAgZm9ybWFsUGFyYW1ldGVyID0gc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXI+Iik7Ci0gICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXIuYWRkKHZhcmlhYmxlTW9kaWZpZXJzKCkpOwotICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyLmFkZCh0eXBlKCkpOwotICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JJZCgpKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hbFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICAvKiogLS0tLS0tLSBhbHRlcmVkIEpMU3YzpDguNC4xIC0tLS0tLS0tCi0gICAgICogIFZhcmlhYmxlTW9kaWZpZXJzOgotICAgICAqICAgICAgVmFyaWFibGVNb2RpZmllciB7VmFyaWFibGVNb2RpZmllcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlTW9kaWZpZXJzKCkgewotICAgICAgICBsb2coInZhcmlhYmxlTW9kaWZpZXJzIik7Ci0gICAgICAgIGlmICh2YXJpYWJsZU1vZGlmaWVycyAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVNb2RpZmllcnM7Ci0gICAgICAgIHZhcmlhYmxlTW9kaWZpZXJzID0gb25lT3JNb3JlKHZhcmlhYmxlTW9kaWZpZXIoKSk7Ci0gICAgICAgIHJldHVybiB2YXJpYWJsZU1vZGlmaWVyczsKLSAgICB9Ci0KLSAgICAvKiogVmFyaWFibGVNb2RpZmllcjogb25lIG9mCi0gICAgICogICAgICBmaW5hbCBBbm5vdGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB2YXJpYWJsZU1vZGlmaWVyKCkgewotICAgICAgICBsb2coInZhcmlhYmxlTW9kaWZpZXIiKTsKLSAgICAgICAgaWYgKHZhcmlhYmxlTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlTW9kaWZpZXI7Ci0gICAgICAgIHZhcmlhYmxlTW9kaWZpZXIgPSBhbHRlcm5hdGlvbigiPHZhcmlhYmxlTW9kaWZpZXI+Iik7Ci0gICAgICAgICAgICB2YXJpYWJsZU1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgiZmluYWwiKSk7Ci0gICAgICAgICAgICB2YXJpYWJsZU1vZGlmaWVyLmFkZChhbm5vdGF0aW9uKCkpOwotICAgICAgICByZXR1cm4gdmFyaWFibGVNb2RpZmllcjsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tIGFsdGVyZWQgSkxTdjOkOS4xLjEgLS0tLS0tLS0tLS0tLQotICAgIC8qKiBJbnRlcmZhY2VNb2RpZmllcnM6Ci0gICAgICogICAgICBJbnRlcmZhY2VNb2RpZmllciB7SW50ZXJmYWNlTW9kaWZpZXJ9Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VNb2RpZmllcnMoKSB7Ci0gICAgICAgIGxvZygiaW50ZXJmYWNlTW9kaWZpZXJzIik7Ci0gICAgICAgIGlmIChpbnRlcmZhY2VNb2RpZmllcnMgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1vZGlmaWVyczsKLSAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXJzID0gb25lT3JNb3JlKGludGVyZmFjZU1vZGlmaWVyKCkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlTW9kaWZpZXJzOwotICAgIH0KLQotICAgIC8qKiBJbnRlcmZhY2VNb2RpZmllcjogb25lIG9mCi0gICAgICogICAgICBBbm5vdGF0aW9uIHB1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZQotICAgICAqICAgICAgYWJzdHJhY3Qgc3RhdGljIHN0cmljdGZwCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VNb2RpZmllcigpIHsKLSAgICAgICAgbG9nKCJpbnRlcmZhY2VNb2RpZmllciIpOwotICAgICAgICBpZiAoaW50ZXJmYWNlTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1vZGlmaWVyOwotICAgICAgICBpbnRlcmZhY2VNb2RpZmllciA9IGFsdGVybmF0aW9uKCI8aW50ZXJmYWNlTW9kaWZpZXI+Iik7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQoYW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIGludGVyZmFjZU1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwotICAgICAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwcm90ZWN0ZWQiKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInByaXZhdGUiKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoImFic3RyYWN0IikpOwotICAgICAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzdGF0aWMiKSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0cmljdGZwIikpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlTW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLSBKTFN2M6Q5LjMgLS0tLS0tLS0tLS0tLS0tCi0gICAgLyoqIENvbnN0YW50RGVjbGFyYXRpb246Ci0gICAgICogICAgICBDb25zdGFudE1vZGlmaWVycyBvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JzIDsKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNvbnN0YW50RGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIGxvZygiY29uc3RhbnREZWNsYXJhdGlvbiIpOwotICAgICAgICBpZiAoY29uc3RhbnREZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gY29uc3RhbnREZWNsYXJhdGlvbjsKLSAgICAgICAgY29uc3RhbnREZWNsYXJhdGlvbiA9IHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdGlvbj4iKTsKLSAgICAgICAgICAgIGNvbnN0YW50RGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShjb25zdGFudE1vZGlmaWVycygpKSk7Ci0gICAgICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uLmFkZCh0eXBlKCkpOwotICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdGlvbi5hZGQodmFyaWFibGVEZWNsYXJhdG9ycygpKTsKLSAgICAgICAgICAgIGNvbnN0YW50RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7Ci0gICAgICAgIHJldHVybiBjb25zdGFudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKiAtLS0tLS0tLS0tIGFsdGVyZWQgSkxTdjOkOS4zIC0tLS0tLS0tLS0tLS0tLQotICAgICAqIENvbnN0YW50TW9kaWZpZXJzOgotICAgICAqICAgICAgQ29uc3RhbnRNb2RpZmllciB7Q29uc3RhbnRNb2RpZmllcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNvbnN0YW50TW9kaWZpZXJzKCkgewotICAgICAgICBsb2coImNvbnN0YW50TW9kaWZpZXJzIik7Ci0gICAgICAgIGlmIChjb25zdGFudE1vZGlmaWVycyAhPSBudWxsKSByZXR1cm4gY29uc3RhbnRNb2RpZmllcnM7Ci0gICAgICAgIGNvbnN0YW50TW9kaWZpZXJzID0gb25lT3JNb3JlKGNvbnN0YW50TW9kaWZpZXIoKSk7Ci0gICAgICAgIHJldHVybiBjb25zdGFudE1vZGlmaWVyczsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RhbnRNb2RpZmllcjogb25lIG9mCi0gICAgICogICAgICBBbm5vdGF0aW9uIHB1YmxpYyBzdGF0aWMgZmluYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGNvbnN0YW50TW9kaWZpZXIoKSB7Ci0gICAgICAgIGxvZygiY29uc3RhbnRNb2RpZmllciIpOwotICAgICAgICBpZiAoY29uc3RhbnRNb2RpZmllciAhPSBudWxsKSByZXR1cm4gY29uc3RhbnRNb2RpZmllcjsKLSAgICAgICAgY29uc3RhbnRNb2RpZmllciA9IGFsdGVybmF0aW9uKCI8Y29uc3RhbnRNb2RpZmllcj4iKTsKLSAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKGFubm90YXRpb24oKSk7Ci0gICAgICAgICAgICBjb25zdGFudE1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwotICAgICAgICAgICAgY29uc3RhbnRNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0YXRpYyIpKTsKLSAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJmaW5hbCIpKTsKLSAgICAgICAgcmV0dXJuIGNvbnN0YW50TW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLSBhbHRlcmVkIEpMU3YzpDkuNCAtLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogQWJzdHJhY3RNZXRob2RNb2RpZmllcnM6Ci0gICAgICogICAgICBBYnN0cmFjdE1ldGhvZE1vZGlmaWVyIHtBYnN0cmFjdE1ldGhvZE1vZGlmaWVyfQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYWJzdHJhY3RNZXRob2RNb2RpZmllcnMoKSB7Ci0gICAgICAgIGxvZygiYWJzdHJhY3RNZXRob2RNb2RpZmllcnMiKTsKLSAgICAgICAgaWYgKGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzICE9IG51bGwpIHJldHVybiBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyczsKLSAgICAgICAgYWJzdHJhY3RNZXRob2RNb2RpZmllcnMgPSBvbmVPck1vcmUoYWJzdHJhY3RNZXRob2RNb2RpZmllcigpKTsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOwotICAgIH0KLQotICAgIC8qKiBBYnN0cmFjdE1ldGhvZE1vZGlmaWVyOiBvbmUgb2YKLSAgICAgKiAgICAgIEFubm90YXRpb24gcHVibGljIGFic3RyYWN0Ci0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyKCkgewotICAgICAgICBsb2coImFic3RyYWN0TWV0aG9kTW9kaWZpZXIiKTsKLSAgICAgICAgaWYgKGFic3RyYWN0TWV0aG9kTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIGFic3RyYWN0TWV0aG9kTW9kaWZpZXI7Ci0gICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIgPSBhbHRlcm5hdGlvbigiPGFic3RyYWN0TWV0aG9kTW9kaWZpZXI+Iik7Ci0gICAgICAgICAgICBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyLmFkZChhbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RNZXRob2RNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInB1YmxpYyIpKTsKLSAgICAgICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJhYnN0cmFjdCIpKTsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0TWV0aG9kTW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLSBhbHRlcmVkIEpMU3YzpDkuNyAtLS0tLS0tLS0tLS0tLS0KLSAgICAvKiogQW5ub3RhdGlvbnM6Ci0gICAgICogICAgICBBbm5vdGF0aW9uIHtBbm5vdGF0aW9ufQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIGxvZygiYW5ub3RhdGlvbnMiKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHJldHVybiBhbm5vdGF0aW9uczsKLSAgICAgICAgYW5ub3RhdGlvbnMgPSBvbmVPck1vcmUoYW5ub3RhdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIC8qKiBBbm5vdGF0aW9uOgotICAgICAqICAgICAgTm9ybWFsQW5ub3RhdGlvbgotICAgICAqICAgICAgTWFya2VyQW5ub3RhdGlvbgotICAgICAqICAgICAgU2luZ2xlRWxlbWVudEFubm90YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGFubm90YXRpb24oKSB7Ci0gICAgICAgIGxvZygiYW5ub3RhdGlvbiIpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICAgICAgYW5ub3RhdGlvbiA9IGFsdGVybmF0aW9uKCI8YW5ub3RhdGlvbj4iKTsKLSAgICAgICAgYW5ub3RhdGlvbi5hZGQobm9ybWFsQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbi5hZGQobWFya2VyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbi5hZGQoc2luZ2xlRWxlbWVudEFubm90YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKiBOb3JtYWxBbm5vdGF0aW9uOgotICAgICAqICAgICAgQCBUeXBlTmFtZSAoIEVsZW1lbnRWYWx1ZVBhaXJzIG9wdCApCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBub3JtYWxBbm5vdGF0aW9uKCkgewotICAgICAgICBsb2coIm5vcm1hbEFubm90YXRpb24iKTsKLSAgICAgICAgaWYgKG5vcm1hbEFubm90YXRpb24gIT0gbnVsbCkgcmV0dXJuIG5vcm1hbEFubm90YXRpb247Ci0gICAgICAgIG5vcm1hbEFubm90YXRpb24gPSBzZXF1ZW5jZSgiPG5vcm1hbEFubm90YXRpb24+Iik7Ci0gICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLmFkZChuZXcgU3ltYm9sKCdAJykpOwotICAgICAgICAgICAgbm9ybWFsQW5ub3RhdGlvbi5hZGQodHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLmFkZChuZXcgU3ltYm9sKCcoJykpOwotICAgICAgICAgICAgbm9ybWFsQW5ub3RhdGlvbi5hZGQoemVyb09yT25lKGVsZW1lbnRWYWx1ZVBhaXJzKCkpKTsKLSAgICAgICAgICAgIG5vcm1hbEFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJyknKSk7Ci0gICAgICAgIHJldHVybiBub3JtYWxBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKiBFbGVtZW50VmFsdWVQYWlyczoKLSAgICAgKiAgICAgIEVsZW1lbnRWYWx1ZVBhaXIKLSAgICAgKiAgICAgIEVsZW1lbnRWYWx1ZVBhaXJzICwgRWxlbWVudFZhbHVlUGFpcgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZWxlbWVudFZhbHVlUGFpcnMoKSB7Ci0gICAgICAgIGxvZygiZWxlbWVudFZhbHVlUGFpcnMiKTsKLSAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZVBhaXJzICE9IG51bGwpIHJldHVybiBlbGVtZW50VmFsdWVQYWlyczsKLSAgICAgICAgZWxlbWVudFZhbHVlUGFpcnMgPSBhbHRlcm5hdGlvbigiPGVsZW1lbnRWYWx1ZVBhaXJzPiIpOwotICAgICAgICBlbGVtZW50VmFsdWVQYWlycy5hZGQoZWxlbWVudFZhbHVlUGFpcigpKTsKLSAgICAgICAgZWxlbWVudFZhbHVlUGFpcnMuYWRkKHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlUGFpcnMkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQoZWxlbWVudFZhbHVlUGFpcnMoKSkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKLSAgICAgICAgICAgICAgICAuYWRkKGVsZW1lbnRWYWx1ZVBhaXIoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50VmFsdWVQYWlyczsKLSAgICB9Ci0KLSAgICAvKiogRWxlbWVudFZhbHVlUGFpcjoKLSAgICAgKiAgICAgIElkZW50aWZpZXIgPSBFbGVtZW50VmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGVsZW1lbnRWYWx1ZVBhaXIoKSB7Ci0gICAgICAgIGxvZygiZWxlbWVudFZhbHVlUGFpciIpOwotICAgICAgICBpZiAoZWxlbWVudFZhbHVlUGFpciAhPSBudWxsKSByZXR1cm4gZWxlbWVudFZhbHVlUGFpcjsKLSAgICAgICAgZWxlbWVudFZhbHVlUGFpciA9IHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlUGFpcj4iKTsKLSAgICAgICAgICAgIGVsZW1lbnRWYWx1ZVBhaXIuYWRkKGlkZW50aWZpZXIoKSk7Ci0gICAgICAgICAgICBlbGVtZW50VmFsdWVQYWlyLmFkZChuZXcgU3ltYm9sKCc9JykpOwotICAgICAgICAgICAgZWxlbWVudFZhbHVlUGFpci5hZGQoZWxlbWVudFZhbHVlKCkpOwotICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlUGFpcjsKLSAgICB9Ci0KLSAgICAvKiogRWxlbWVudFZhbHVlOgotICAgICAqICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uCi0gICAgICogICAgICBBbm5vdGF0aW9uCi0gICAgICogICAgICBFbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciBlbGVtZW50VmFsdWUoKSB7Ci0gICAgICAgIGxvZygiZWxlbWVudFZhbHVlIik7Ci0gICAgICAgIGlmIChlbGVtZW50VmFsdWUgIT0gbnVsbCkgcmV0dXJuIGVsZW1lbnRWYWx1ZTsKLSAgICAgICAgZWxlbWVudFZhbHVlID0gYWx0ZXJuYXRpb24oIjxlbGVtZW50VmFsdWU+Iik7Ci0gICAgICAgIGVsZW1lbnRWYWx1ZS5hZGQoY29uZGl0aW9uYWxFeHByZXNzaW9uKCkpOwotICAgICAgICBlbGVtZW50VmFsdWUuYWRkKGFubm90YXRpb24oKSk7Ci0gICAgICAgIGVsZW1lbnRWYWx1ZS5hZGQoZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcigpKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogRWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcjoKLSAgICAgKiAgICAgIHsgRWxlbWVudFZhbHVlc29wdCAsb3B0IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSB7Ci0gICAgICAgIGxvZygiZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplciIpOwotICAgICAgICBpZiAoZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplciAhPSBudWxsKSByZXR1cm4gZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcjsKLSAgICAgICAgZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplciA9IHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcj4iKTsKLSAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIuYWRkKG5ldyBTeW1ib2woJ3snKSk7Ci0gICAgICAgICAgICBlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyLmFkZCh6ZXJvT3JPbmUoZWxlbWVudFZhbHVlcygpKSk7Ci0gICAgICAgICAgICBlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyLmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgnLCcpKSk7Ci0gICAgICAgICAgICBlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyLmFkZChuZXcgU3ltYm9sKCd9JykpOwotICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLSAgICAvKiogRWxlbWVudFZhbHVlczoKLSAgICAgKiAgICAgIEVsZW1lbnRWYWx1ZQotICAgICAqICAgICAgRWxlbWVudFZhbHVlcyAsIEVsZW1lbnRWYWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgZWxlbWVudFZhbHVlcygpIHsKLSAgICAgICAgbG9nKCJlbGVtZW50VmFsdWVzIik7Ci0gICAgICAgIGlmIChlbGVtZW50VmFsdWVzICE9IG51bGwpIHJldHVybiBlbGVtZW50VmFsdWVzOwotICAgICAgICBlbGVtZW50VmFsdWVzID0gYWx0ZXJuYXRpb24oIjxlbGVtZW50VmFsdWVzPiIpOwotICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50VmFsdWUoKSk7Ci0gICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlcyQxPiIpCi0gICAgICAgICAgICAgICAgLmFkZChlbGVtZW50VmFsdWVzKCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCi0gICAgICAgICAgICAgICAgLmFkZChlbGVtZW50VmFsdWUoKSkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50VmFsdWVzOwotICAgIH0KLQotICAgIC8qKiBNYXJrZXJBbm5vdGF0aW9uOgotICAgICAqICAgICAgQCBUeXBlTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgbWFya2VyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgbG9nKCJtYXJrZXJBbm5vdGF0aW9uIik7Ci0gICAgICAgIGlmIChtYXJrZXJBbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBtYXJrZXJBbm5vdGF0aW9uOwotICAgICAgICBtYXJrZXJBbm5vdGF0aW9uID0gc2VxdWVuY2UoIjxtYXJrZXJBbm5vdGF0aW9uPiIpOwotICAgICAgICAgICAgbWFya2VyQW5ub3RhdGlvbi5hZGQobmV3IFN5bWJvbCgnQCcpKTsKLSAgICAgICAgICAgIG1hcmtlckFubm90YXRpb24uYWRkKHR5cGVOYW1lKCkpOwotICAgICAgICByZXR1cm4gbWFya2VyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogU2luZ2xlRWxlbWVudEFubm90YXRpb246Ci0gICAgICogICAgICBAIFR5cGVOYW1lICggRWxlbWVudFZhbHVlICkKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VyIHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uKCkgewotICAgICAgICBsb2coInNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uIik7Ci0gICAgICAgIGlmIChzaW5nbGVFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKSByZXR1cm4gc2luZ2xlRWxlbWVudEFubm90YXRpb247Ci0gICAgICAgIHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uID0gc2VxdWVuY2UoIjxzaW5nbGVFbGVtZW50QW5ub3RhdGlvbj4iKTsKLSAgICAgICAgICAgIHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uLmFkZChuZXcgU3ltYm9sKCdAJykpOwotICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKHR5cGVOYW1lKCkpOwotICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJygnKSk7Ci0gICAgICAgICAgICBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbi5hZGQoZWxlbWVudFZhbHVlKCkpOwotICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJyknKSk7Ci0gICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLSBKTFN2M6QxNS45IC0tLS0tLS0tLS0tCi0gICAgLyoqIEFyZ3VtZW50TGlzdDoKLSAgICAgKiAgICAgIEV4cHJlc3Npb24KLSAgICAgKiAgICAgIEFyZ3VtZW50TGlzdCAsRXhwcmVzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZXIgYXJndW1lbnRMaXN0KCkgewotICAgICAgICBsb2coImFyZ3VtZW50TGlzdCIpOwotICAgICAgICBpZiAoYXJndW1lbnRMaXN0ICE9IG51bGwpIHJldHVybiBhcmd1bWVudExpc3Q7Ci0gICAgICAgIGFyZ3VtZW50TGlzdCA9IGFsdGVybmF0aW9uKCI8YXJndW1lbnRMaXN0PiIpOwotICAgICAgICBhcmd1bWVudExpc3QuYWRkKGV4cHJlc3Npb24oKSk7Ci0gICAgICAgIGFyZ3VtZW50TGlzdC5hZGQoc2VxdWVuY2UoIjxhcmd1bWVudExpc3QkMT4iKQotICAgICAgICAgICAgICAgIC5hZGQoYXJndW1lbnRMaXN0KCkpCi0gICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCi0gICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0OwotICAgIH0KLQotCi0gICAgLy8gdG9kbyAtLS0tLS0tIHR5cG9zIGFuZCBhYmJyZXZpYXRpb25zIGluIHNwZWMgLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFBhcnNlciB0eXBlTmFtZSgpIHsKLSAgICAgICAgbG9nKCJ0eXBlTmFtZSIpOwotICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkgcmV0dXJuIHR5cGVOYW1lOwotICAgICAgICB0eXBlTmFtZSA9IHR5cGUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJzZXIgZXhwcigpIHsKLSAgICAgICAgbG9nKCJleHByIik7Ci0gICAgICAgIGlmIChleHByICE9IG51bGwpIHJldHVybiBleHByOwotICAgICAgICBleHByID0gZXhwcmVzc2lvbigpOwotICAgICAgICByZXR1cm4gZXhwcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VyIGV4cHJlc3Npb25TdGF0ZW1lbnQoKSB7Ci0gICAgICAgIGxvZygiZXhwcmVzc2lvblN0YXRlbWVudCIpOwotICAgICAgICBpZiAoZXhwcmVzc2lvblN0YXRlbWVudCAhPSBudWxsKSByZXR1cm4gZXhwcmVzc2lvblN0YXRlbWVudDsKLSAgICAgICAgZXhwcmVzc2lvblN0YXRlbWVudCA9IHN0YXRlbWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci0gICAgfQotCi0gICAgLy8gQW5ub3RhdGlvbnMgcmVmZXJzIHRvIKQxNS4yNSwgYnV0IHRoaXMgaXMgcmVwbGFjZWQgd2l0aCBFeHByZXNzaW9ucwotICAgIC8vIHRvZG8gLSBjb25kaXRpb25hbGV4cHJlc3Npb25zIGluIGFubm90YXRpb25zIG1heSBub3Qgd29yaywgb3IgdG9vIG11Y2ggbWlnaHQgYmUgYWxsb3dlZCBpbiBhbm5vdGF0aW9ucy4uLgotICAgIHB1YmxpYyBQYXJzZXIgY29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotICAgICAgICBsb2coImNvbmRpdGlvbmFsRXhwcmVzc2lvbiIpOwotICAgICAgICBpZiAoY29uZGl0aW9uYWxFeHByZXNzaW9uICE9IG51bGwpIHJldHVybiBjb25kaXRpb25hbEV4cHJlc3Npb247Ci0gICAgICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIGNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLSAgICB9Ci0KLQotICAgIC8vIHRvZG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotCi0KLSAgICBwdWJsaWMgUGFyc2VyIG51bGxMaXRlcmFsKCkgewotICAgICAgICBsb2coIm51bGxMaXRlcmFsIik7Ci0gICAgICAgIGlmIChudWxsTGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gbnVsbExpdGVyYWw7Ci0gICAgICAgIC8vdG9kbwotICAgICAgICBudWxsTGl0ZXJhbCA9IG5ldyBXb3JkKCk7Ci0gICAgICAgIHJldHVybiBudWxsTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VyIGJvb2xlYW5MaXRlcmFsKCkgewotICAgICAgICBsb2coImJvb2xlYW5MaXRlcmFsIik7Ci0gICAgICAgIGlmIChib29sZWFuTGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gYm9vbGVhbkxpdGVyYWw7Ci0gICAgICAgIC8vdG9kbwotICAgICAgICBib29sZWFuTGl0ZXJhbCA9IG5ldyBXb3JkKCk7Ci0gICAgICAgIHJldHVybiBib29sZWFuTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VyIHN0cmluZ0xpdGVyYWwoKSB7Ci0gICAgICAgIGxvZygic3RyaW5nTGl0ZXJhbCIpOwotICAgICAgICBpZiAoc3RyaW5nTGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLSAgICAgICAgLy90b2RvCi0gICAgICAgIHN0cmluZ0xpdGVyYWwgPSBuZXcgV29yZCgpOwotICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VyIGNoYXJhY3RlckxpdGVyYWwoKSB7Ci0gICAgICAgIGxvZygiY2hhcmFjdGVyTGl0ZXJhbCIpOwotICAgICAgICBpZiAoY2hhcmFjdGVyTGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gY2hhcmFjdGVyTGl0ZXJhbDsKLSAgICAgICAgLy90b2RvCi0gICAgICAgIGNoYXJhY3RlckxpdGVyYWwgPSBuZXcgV29yZCgpOwotICAgICAgICByZXR1cm4gY2hhcmFjdGVyTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyc2VyIGZsb2F0aW5nUG9pbnRMaXRlcmFsKCkgewotICAgICAgICBsb2coImZsb2F0aW5nUG9pbnRMaXRlcmFsIik7Ci0gICAgICAgIGlmIChmbG9hdGluZ1BvaW50TGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gZmxvYXRpbmdQb2ludExpdGVyYWw7Ci0gICAgICAgIC8vdG9kbwotICAgICAgICBmbG9hdGluZ1BvaW50TGl0ZXJhbCA9IG5ldyBOdW0oKTsKLSAgICAgICAgcmV0dXJuIGZsb2F0aW5nUG9pbnRMaXRlcmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJzZXIgaW50ZWdlckxpdGVyYWwoKSB7Ci0gICAgICAgIGxvZygiaW50ZWdlckxpdGVyYWwiKTsKLSAgICAgICAgaWYgKGludGVnZXJMaXRlcmFsICE9IG51bGwpIHJldHVybiBpbnRlZ2VyTGl0ZXJhbDsKLSAgICAgICAgLy90b2RvCi0gICAgICAgIGludGVnZXJMaXRlcmFsID0gbmV3IE51bSgpOwotICAgICAgICByZXR1cm4gaW50ZWdlckxpdGVyYWw7Ci0gICAgfQotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBzaW5nbGV0b25zIGFyZSB1c2VkIHRvIHByZXZlbnQgbGVmdCByZWN1cnNpb24gaW4gZ3JhbW1hcgotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBxdWFsaWZpZWRJZGVudGlmaWVyOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBsaXRlcmFsOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhc3NpZ25tZW50T3BlcmF0b3I7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHR5cGVBcmd1bWVudHM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHR5cGVBcmd1bWVudDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgcmF3VHlwZTsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIHN0YXRlbWVudEV4cHJlc3Npb247Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBjb25zdGFudEV4cHJlc3Npb247Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGV4cHJlc3Npb24xOwotICAgIHByb3RlY3RlZCBQYXJzZXIgZXhwcmVzc2lvbjFSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBleHByZXNzaW9uMjsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZXhwcmVzc2lvbjJSZXN0OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBpbmZpeE9wOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBwcmltYXJ5OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBpZGVudGlmaWVyU3VmZml4OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBub25XaWxkY2FyZFR5cGVBcmd1bWVudHM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXg7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHByZWZpeE9wOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBwb3N0Zml4T3A7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHNlbGVjdG9yOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBzdXBlclN1ZmZpeDsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gYmFzaWNUeXBlOwotICAgIHByb3RlY3RlZCBQYXJzZXIgYXJndW1lbnRzT3B0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBhcmd1bWVudHM7Ci0gICAgcHJvdGVjdGVkIFJlcGV0aXRpb24gYnJhY2tldHNPcHQ7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNyZWF0b3I7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNyZWF0ZWROYW1lOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBpbm5lckNyZWF0b3I7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGFycmF5Q3JlYXRvclJlc3Q7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNsYXNzQ3JlYXRvclJlc3Q7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHZhcmlhYmxlSW5pdGlhbGl6ZXI7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHBhckV4cHJlc3Npb247Ci0gICAgcHJvdGVjdGVkIFJlcGV0aXRpb24gYmxvY2tTdGF0ZW1lbnRzOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBibG9ja1N0YXRlbWVudDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBzdGF0ZW1lbnQ7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNhdGNoZXM7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNhdGNoQ2xhdXNlOwotICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBzd2l0Y2hMYWJlbDsKLSAgICBwcm90ZWN0ZWQgUmVwZXRpdGlvbiBtb3JlU3RhdGVtZW50RXhwcmVzc2lvbnM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGZvckNvbnRyb2w7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGZvckNvbnRyb2xSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBmb3JVcGRhdGU7Ci0gICAgcHJvdGVjdGVkIFJlcGV0aXRpb24gbW9kaWZpZXJzT3B0OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBtb2RpZmllcjsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgdmFyaWFibGVEZWNsYXJhdG9yczsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjb25zdGFudERlY2xhcmF0b3I7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZhcmlhYmxlRGVjbGFyYXRvclJlc3Q7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRvclJlc3Q7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZhcmlhYmxlRGVjbGFyYXRvcklkOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGltcG9ydERlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiB0eXBlRGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIG5vcm1hbENsYXNzRGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHR5cGVQYXJhbWV0ZXJzOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSB0eXBlUGFyYW1ldGVyOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBib3VuZDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZW51bURlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbnVtQm9keTsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZW51bUNvbnN0YW50czsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZW51bUNvbnN0YW50OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbnVtQXJndW1lbnRzOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbnVtQm9keURlY2xhcmF0aW9uczsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSB0eXBlTGlzdDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgYW5ub3RhdGlvblR5cGVCb2R5OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBkZWZhdWx0VmFsdWU7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNsYXNzQm9keTsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW50ZXJmYWNlQm9keTsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gY2xhc3NCb2R5RGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIG1lbWJlckRlY2w7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbDsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBtZXRob2RPckZpZWxkRGVjbDsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gbWV0aG9kT3JGaWVsZFJlc3Q7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlTWVtYmVyRGVjbDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2w7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBtZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugdm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2w7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdDsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZm9ybWFsUGFyYW1ldGVyczsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZm9ybWFsUGFyYW1ldGVyRGVjbHM7Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBtZXRob2RCb2R5OwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBjbGFzc01vZGlmaWVyOwotICAgIHByb3RlY3RlZCBQYXJzZXIgY2xhc3NCb2R5RGVjbGFyYXRpb25zOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBmb3JtYWxQYXJhbWV0ZXI7Ci0gICAgcHJvdGVjdGVkIFBhcnNlciB2YXJpYWJsZU1vZGlmaWVyczsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gdmFyaWFibGVNb2RpZmllcjsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGludGVyZmFjZU1vZGlmaWVyczsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlTW9kaWZpZXI7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBjb25zdGFudE1vZGlmaWVyczsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gY29uc3RhbnRNb2RpZmllcjsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBub3JtYWxBbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbGVtZW50VmFsdWVQYWlyOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBtYXJrZXJBbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZXhwcmVzc2lvbjsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gdHlwZTsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZXhwcmVzc2lvbjM7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGFycmF5SW5pdGlhbGl6ZXI7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZhcmlhYmxlRGVjbGFyYXRvcjsKLSAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gY2xhc3NEZWNsYXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGFubm90YXRpb25zOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBlbGVtZW50VmFsdWU7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGVsZW1lbnRWYWx1ZXM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGVsZW1lbnRWYWx1ZVBhaXJzOwotICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3Q7Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIHF1YWxpZmllZElkZW50aWZpZXJMaXN0OwotICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIFNlcXVlbmNlIGJsb2NrOwotICAgIHByb3RlY3RlZCBQYXJzZXIgY2xhc3NNb2RpZmllcnM7Ci0gICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGFyZ3VtZW50TGlzdDsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIHR5cGVOYW1lOwotICAgIHByb3RlY3RlZCBQYXJzZXIgZXhwcjsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBjb25kaXRpb25hbEV4cHJlc3Npb247Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBudWxsTGl0ZXJhbDsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGJvb2xlYW5MaXRlcmFsOwotICAgIHByb3RlY3RlZCBQYXJzZXIgc3RyaW5nTGl0ZXJhbDsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGNoYXJhY3RlckxpdGVyYWw7Ci0gICAgcHJvdGVjdGVkIFBhcnNlciBmbG9hdGluZ1BvaW50TGl0ZXJhbDsKLSAgICBwcm90ZWN0ZWQgUGFyc2VyIGludGVnZXJMaXRlcmFsOwotCi19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovTG9nZ2luZ0FsdGVybmF0aW9uLmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL0xvZ2dpbmdBbHRlcm5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJiN2FiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovTG9nZ2luZ0FsdGVybmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIGNvbS5qYXZhbmljdXMuYnB3ajsKLQotaW1wb3J0IHNqbS5wYXJzZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKiBwdXJlbHkgYSB3cmFwcGVyIGZvciBhbHRlcm5hdGlvbiB0byBwcm92aWRlIGRlYnVnIGluZm9ybWF0aW9uICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0FsdGVybmF0aW9uIGV4dGVuZHMgQWx0ZXJuYXRpb257Ci0gICAgcHVibGljIExvZ2dpbmdBbHRlcm5hdGlvbihTdHJpbmcgcykgewotICAgICAgICBzdXBlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIG1hdGNoKFZlY3RvciBpbikgewotCi0gICAgICAgIFN0cmluZyBpblN0cmluZyA9IHByZXR0eVByaW50KGJlc3QoaW4pLmdldFN0YWNrKCkpOwotICAgICAgICBpZiAoIWluU3RyaW5nLmVxdWFscyhMb2dnaW5nSmF2YVBhcnNlci5sYXN0SW4pKSB7Ci0gICAgICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPG5vZGUgVEVYVD0nIiArIGluU3RyaW5nICsgIicgUE9TSVRJT049J3JpZ2h0Jy8+Iik7Ci0gICAgICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5sYXN0SW4gPSBpblN0cmluZzsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuYW1lID0gdGhpcy5uYW1lOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSBuYW1lID0gdGhpcy50b1N0cmluZygpOwotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI8IiwiJmx0OyIpOwotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI+IiwiJmd0OyIpOwotICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPG5vZGUgVEVYVD0nIisgbmFtZSArIicgQ09MT1I9XCIjMDA5OTAwXCIgUE9TSVRJT049J3JpZ2h0Jz4iKTsKLSAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIubGV2ZWwrKzsKLQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU1RBUlQgIiArIG5hbWUgKyAiICAiICsgcHJldHR5UHJpbnQoYmVzdChpbikuZ2V0U3RhY2soKSkpOwotICAgICAgICBWZWN0b3Igb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IHN1cGVyLm1hdGNoKGluKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIub3V0LnByaW50bG4oIjxub2RlIFRFWFQ9JyIgKyBleC5nZXRDbGFzcygpICsgIicgQ09MT1I9XCIjZmYwMDAwXCIgUE9TSVRJT049J3JpZ2h0Jy8+Iik7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIExvZ2dpbmdKYXZhUGFyc2VyLmxldmVsLS07Ci0gICAgICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPC9ub2RlPiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vdG9kbyAtIG91dFN0cmluZwotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFTkQgIiArIG5hbWUpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5UHJpbnQoVmVjdG9yIHMpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcy5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgaSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsgc2IuYXBwZW5kKCcgJyk7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9Mb2dnaW5nSmF2YVBhcnNlci5qYXZhIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9Mb2dnaW5nSmF2YVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg0ZjI4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovTG9nZ2luZ0phdmFQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2UgY29tLmphdmFuaWN1cy5icHdqOwotCi1pbXBvcnQgc2ptLnBhcnNlLkFsdGVybmF0aW9uOwotaW1wb3J0IHNqbS5wYXJzZS5TZXF1ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBMb2dnaW5nSmF2YVBhcnNlciBleHRlbmRzIEphdmFQYXJzZXIgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhc3RJbjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsYXN0T3V0OwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGxldmVsID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIFByaW50U3RyZWFtIG91dDsKLQotICAgIHB1YmxpYyBBbHRlcm5hdGlvbiBhbHRlcm5hdGlvbihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IExvZ2dpbmdBbHRlcm5hdGlvbihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VxdWVuY2Ugc2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2dnaW5nVHJhY2tTZXF1ZW5jZShuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL0xvZ2dpbmdUcmFja1NlcXVlbmNlLmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL0xvZ2dpbmdUcmFja1NlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTM2ZGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9Mb2dnaW5nVHJhY2tTZXF1ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gICRJZCQKLQotICAgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDA0IFN0ZXZlbiBKb2huIE1ldHNrZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgIFN0ZXZlIE1ldHNrZXIgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMgYWJvdXQKLSAgIHRoZSBmaXRuZXNzIG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UsCi0gICBpbmNsdWRpbmcgdGhlIGltcGxpZWQgd2FycmFudHkgb2YgbWVyY2hhbnRhYmlsaXR5LgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IHNqbS5wYXJzZS4qOwotCi0vKioKLSAqIEEgTG9nZ2luZ1RyYWNrU2VxdWVuY2UgaXMgYSBzZXF1ZW5jZSB0aGF0IHRocm93cyBhIDxjb2RlPgotICogVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIHNlcXVlbmNlIGJlZ2lucyBidXQKLSAqIGRvZXMgbm90IGNvbXBsZXRlLiAgSXQgd2lsbCBvdXRwdXQgdGhlIHBhcnNlIHRyZWUgYXMKLSAqIFhNTCBpbiBhIGZvcm0gc3VpdGFibGUgZm9yIHZpZXdpbmcgaW4gZnJlZW1pbmQuc2YubmV0Ci0gKiAKLSAqIEBhdXRob3IgSmVyZW15IFJheW5lcgotICovCi0KLQotcHVibGljIGNsYXNzIExvZ2dpbmdUcmFja1NlcXVlbmNlIGV4dGVuZHMgVHJhY2tTZXF1ZW5jZSB7Ci0vKioKLSAqIENvbnN0cnVjdHMgYSBMb2dnaW5nVHJhY2tTZXF1ZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICoKLSAqIEBwYXJhbSAgICBuYW1lICAgIGEgbmFtZSB0byBiZSBrbm93biBieQotICovCi1wdWJsaWMgTG9nZ2luZ1RyYWNrU2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogR2l2ZW4gYSBjb2xsZWN0aW9uIG9mIGFzc2VtYmxpZXMsIHRoaXMgbWV0aG9kIG1hdGNoZXMgCi0gKiB0aGlzIHRyYWNrIGFnYWluc3QgYWxsIG9mIHRoZW0sIGFuZCByZXR1cm5zIGEgbmV3IAotICogY29sbGVjdGlvbiBvZiB0aGUgYXNzZW1ibGllcyB0aGF0IHJlc3VsdCBmcm9tIHRoZSAKLSAqIG1hdGNoZXMuCi0gKgotICogSWYgdGhlIG1hdGNoIGJlZ2lucyBidXQgZG9lcyBub3QgY29tcGxldGUsIHRoaXMgbWV0aG9kCi0gKiB0aHJvd3MgYSA8Y29kZT5UcmFja1NlcXVlbmNlRXhjZXB0aW9uPC9jb2RlPi4KLSAqCi0gKiBAcmV0dXJuICAgYSBWZWN0b3Igb2YgYXNzZW1ibGllcyB0aGF0IHJlc3VsdCBmcm9tIG1hdGNoaW5nCi0gKiAgICAgICAgICAgYWdhaW5zdCBhIGJlZ2lubmluZyBzZXQgb2YgYXNzZW1ibGllcwotICoKLSAqIEBwYXJhbSBpbiBhIHZlY3RvciBvZiBhc3NlbWJsaWVzIHRvIG1hdGNoIGFnYWluc3QKLSAqCi0gKi8KLXB1YmxpYyBWZWN0b3IgbWF0Y2goVmVjdG9yIGluKSB7Ci0KLSAgICAvLyBUaGlzIHByaW50bG4gaXMgdXNlZnVsIGZvciBleGFtaW5pbmcgbGVmdCByZWN1cnNpb24gZHVyaW5nIGEgcGFyc2UKLQotICAgIFN0cmluZyBpblN0cmluZyA9IHByZXR0eVByaW50KGJlc3QoaW4pKTsKLSAgICBpZiAoIWluU3RyaW5nLmVxdWFscyhMb2dnaW5nSmF2YVBhcnNlci5sYXN0SW4pKSB7Ci0gICAgICAgIExvZ2dpbmdKYXZhUGFyc2VyLm91dC5wcmludGxuKCI8bm9kZSBURVhUPSciICsgaW5TdHJpbmcgKyAiJyBQT1NJVElPTj0ncmlnaHQnLz4iKTsKLSAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIubGFzdEluID0gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiPCIsIiZsdDsiKTsKLSAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI+IiwiJmd0OyIpOwotICAgIFN0cmluZyBmb2xkTm9kZSA9ICIiOwotICAgIGlmIChMb2dnaW5nSmF2YVBhcnNlci5sZXZlbCA9PSA0IHx8IExvZ2dpbmdKYXZhUGFyc2VyLmxldmVsID09IDUgKSB7Ci0gICAgICAgIGZvbGROb2RlID0gIiBGT0xERUQ9J3RydWUnICI7Ci0gICAgfQotICAgIExvZ2dpbmdKYXZhUGFyc2VyLm91dC5wcmludGxuKCI8bm9kZSBURVhUPSciICsgbmFtZSArICInIENPTE9SPVwiIzAwMDBjY1wiIFBPU0lUSU9OPSdyaWdodCciICsgZm9sZE5vZGUgKyAiPiIpOwotICAgIExvZ2dpbmdKYXZhUGFyc2VyLmxldmVsKys7Ci0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU1RBUlQgIiArIG5hbWUgKyAiICAiICsgcHJldHR5UHJpbnQoYmVzdChpbikpKTsKLQotICAgIGJvb2xlYW4gaW5UcmFjayA9IGZhbHNlOwotCVZlY3RvciBsYXN0ID0gaW47Ci0JVmVjdG9yIG91dCA9IGluOwotCUVudW1lcmF0aW9uIGUgPSBzdWJwYXJzZXJzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJUGFyc2VyIHAgPSAoUGFyc2VyKSBlLm5leHRFbGVtZW50KCk7Ci0JCXRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBwLm1hdGNoQW5kQXNzZW1ibGUobGFzdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBvcGVuIDxub2RlPiBlbGVtZW50cyBvbiB3YXkgb3V0Ci0gICAgICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPG5vZGUgVEVYVD0nIiArIGV4LmdldENsYXNzKCkgKyAiJyBDT0xPUj1cIiNmZjAwMDBcIiBQT1NJVElPTj0ncmlnaHQnLz4iKTsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9Ci0JCWlmIChvdXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBMb2dnaW5nSmF2YVBhcnNlci5sZXZlbC0tOwotCi0JCQlMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPC9ub2RlPiIpOwotICAgICAgICAgICAgaWYgKGluVHJhY2spIHsKLQkJCQl0aHJvd1RyYWNrU2VxdWVuY2VFeGNlcHRpb24obGFzdCwgcCk7Ci0JCQl9Ci0JCQlyZXR1cm4gb3V0OwotCQl9Ci0JCWluVHJhY2sgPSB0cnVlOwotCQlsYXN0ID0gb3V0OwotCX0KLSAgICBTdHJpbmcgb3V0U3RyaW5nID0gcHJldHR5UHJpbnQoYmVzdChvdXQpKTsKLSAgICBpZiAoIW91dFN0cmluZy5lcXVhbHMoTG9nZ2luZ0phdmFQYXJzZXIubGFzdE91dCkpIHsKLSAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIub3V0LnByaW50bG4oIjxub2RlIFRFWFQ9JyIgKyBvdXRTdHJpbmcgKyAiJyBQT1NJVElPTj0ncmlnaHQnLz4iKTsKLSAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIubGFzdE91dCA9IG91dFN0cmluZzsKLSAgICB9Ci0gICAgTG9nZ2luZ0phdmFQYXJzZXIubGV2ZWwtLTsKLSAgICBMb2dnaW5nSmF2YVBhcnNlci5vdXQucHJpbnRsbigiPC9ub2RlPiIpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFTkQgIiArIG5hbWUgKyAiICAiICsgcHJldHR5UHJpbnQoYmVzdChvdXQpKSk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKTsKLQlyZXR1cm4gb3V0OwotfQotCi1wcml2YXRlIFN0cmluZyBwcmV0dHlQcmludChBc3NlbWJseSBhKSB7Ci0gICAgU3RhY2sgcyA9IGEuZ2V0U3RhY2soKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gcy5lbGVtZW50cygpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBPYmplY3QgaSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgc2IuYXBwZW5kKGkpOwotICAgICAgICBpZiAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeyBzYi5hcHBlbmQoJyAnKTt9Ci0gICAgfQotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9QYXJzZXJGYWNhZGUuamF2YSBiL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovUGFyc2VyRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWEyNWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9QYXJzZXJGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gICRJZCQKLQotICAgQ29weXJpZ2h0IChjKSAyMDA0IEplcmVteSBSYXluZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgIEplcmVteSBSYXluZXIgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMgYWJvdXQKLSAgIHRoZSBmaXRuZXNzIG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UsCi0gICBpbmNsdWRpbmcgdGhlIGltcGxpZWQgd2FycmFudHkgb2YgbWVyY2hhbnRhYmlsaXR5LgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7Ci0KLWltcG9ydCBzam0ucGFyc2UuKjsKLWltcG9ydCBzam0ucGFyc2UudG9rZW5zLio7Ci0KLWNsYXNzIFBhcnNlckZhY2FkZSB7Ci0gICAgcHJpdmF0ZSBQYXJzZXIgcGFyc2VyOwotCi0gICAgcHVibGljIFBhcnNlckZhY2FkZShQYXJzZXIgcGFyc2VyKSB7Ci0gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyOwotICAgIH0KLQotICAgIC8qIHV0aWxpdHkgd3JhcHBlciBmb3IgdG9rZW5pemVyIGFuZCBwYXJzZXIgKi8KLSAgICBwdWJsaWMgQXNzZW1ibHkgcGFyc2UoU3RyaW5nIHVzZXJJbnB1dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VXaXRob3V0U3dhbGxvd2luZ0V4Y2VwdGlvbnModXNlcklucHV0KTsKLSAgICAgICAgfSBjYXRjaCAoVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQXNzZW1ibHkgcGFyc2VXaXRob3V0U3dhbGxvd2luZ0V4Y2VwdGlvbnMoU3RyaW5nIHVzZXJJbnB1dCkgewotICAgICAgICAgICAgQXNzZW1ibHkgaW4gPSBuZXcgVG9rZW5Bc3NlbWJseSh1c2VySW5wdXQpOwotICAgICAgICAgICAgQXNzZW1ibHkgb3V0ID0gcGFyc2VyLmNvbXBsZXRlTWF0Y2goaW4pOwotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcGFyc2VyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovUGFyc2VyTWFpbi5qYXZhIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9QYXJzZXJNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWVmZDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9QYXJzZXJNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIGNvbS5qYXZhbmljdXMuYnB3ajsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFBhcnNlck1haW4gewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgLy8gLS0gbWFpbiBiaXQKLSAgICAgICAgTGlzdCBlcnJvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3JjID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHNyY0ZpbGUpKTsKLSAgICAgICAgICAgICAgICBjaGFyW10gc3JjQ2hhcnMgPSBuZXcgY2hhclsoaW50KXNyY0ZpbGUubGVuZ3RoKCldOwotICAgICAgICAgICAgICAgIHNyYy5yZWFkKHNyY0NoYXJzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3JjVGV4dCA9IG5ldyBTdHJpbmcoc3JjQ2hhcnMpOwotICAgICAgICAgICAgICAgIFBhcnNlckZhY2FkZSBwYXJzZXIgPSBuZXcgUGFyc2VyRmFjYWRlKG5ldyBKYXZhUGFyc2VyKCkuc3RhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VXaXRob3V0U3dhbGxvd2luZ0V4Y2VwdGlvbnMoc3JjVGV4dCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlcnJvckxpc3QuYWRkKCJlcnJvcjogY2Fubm90IHJlYWQ6ICIgKyBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYWNrU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExpc3QgYW5FcnJvciA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBhbkVycm9yLmFkZChhcmdzWzBdICsgIjogIiArIGUuZ2V0RXhwZWN0ZWQoKSArICIgZXhwZWN0ZWQiKTsgLy8gdG9kbyAtIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgICAgIGFuRXJyb3IuYWRkKCJhZnRlcjogIiArIGUuZ2V0QWZ0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgYW5FcnJvci5hZGQoZS5nZXRGb3VuZCgpKTsgLy8gdG9kbyAtIGJldHRlciBjb250ZXh0IG9mIGVycm9yCi0gICAgICAgICAgICAgICAgYW5FcnJvci5hZGQoIl4iKTsKLSAgICAgICAgICAgICAgICBlcnJvckxpc3QuYWRkKGFuRXJyb3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBsYXRlbnQgZXJyb3IgcmVwb3J0aW5nLi4uCi0gICAgICAgIGlmIChlcnJvckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3IgZXJyb3JzID0gZXJyb3JMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZXJyb3JzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBlcnIgPSBlcnJvcnMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZXJyTGlzdCA9IChMaXN0KWVycjsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3Igc3ViRXJyb3JzID0gZXJyTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3ViRXJyb3JzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHN1YkVycm9ycy5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBudW1iZXJPZkVycm9ycyA9IGVycm9yTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobnVtYmVyT2ZFcnJvcnMgPT0gMSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnJvckxpc3Quc2l6ZSgpICsgIiBlcnJvciIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXJPZkVycm9ycyA+IDEpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JMaXN0LnNpemUoKSArICIgZXJyb3JzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL1Nob3dKYXZhUGFyc2VyLmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL1Nob3dKYXZhUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODhkM2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9TaG93SmF2YVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gICRJZCQKLQotICAgQ29weXJpZ2h0IChjKSAyMDA0IEplcmVteSBSYXluZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgIEplcmVteSBSYXluZXIgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMgYWJvdXQKLSAgIHRoZSBmaXRuZXNzIG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UsCi0gICBpbmNsdWRpbmcgdGhlIGltcGxpZWQgd2FycmFudHkgb2YgbWVyY2hhbnRhYmlsaXR5LgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7Ci0KLWltcG9ydCBzam0ucGFyc2UuKjsKLWltcG9ydCBzam0ucGFyc2UudG9rZW5zLio7Ci1pbXBvcnQgc2ptLmV4YW1wbGVzLnRyYWNrLlRyYWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2hvd0phdmFQYXJzZXIgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICAvLyBidWlsZCBhIHBhcnNlcgotICAgICAgICBQYXJzZXIgcXVhbGlmaWVkSWRlbnRpZmllclBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKCkucXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBQYXJzZXIgZXhwcmVzc2lvblBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKCkuZXhwcmVzc2lvbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIHBhcnNlcjogIiArIHF1YWxpZmllZElkZW50aWZpZXJQYXJzZXIpOwotCi0KLSAgICAgICAgU2hvd0phdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBTaG93SmF2YVBhcnNlcigpOwotCi0gICAgICAgIFN0cmluZyBxdWFsaWZpZWRJZGVudGlmaWVyVGVzdFtdID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgImZvbyIsCi0gICAgICAgICAgICAiZm9vLmJhciIsCi0gICAgICAgICAgICAiZm9vLmJhci5tb29reSJ9OwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1YWxpZmllZElkZW50aWZpZXJUZXN0Lmxlbmd0aDtpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamF2YVBhcnNlci5wYXJzZShxdWFsaWZpZWRJZGVudGlmaWVyUGFyc2VyLHF1YWxpZmllZElkZW50aWZpZXJUZXN0W2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYWNrRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBleHByZXNzaW9uVGVzdFtdID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgImZvbyIsCi0gICAgICAgICAgICAiZm9vPWJhciJ9OwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBleHByZXNzaW9uVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBqYXZhUGFyc2VyLnBhcnNlKGV4cHJlc3Npb25QYXJzZXIsIGV4cHJlc3Npb25UZXN0W2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYWNrRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBvcnRFcnJvcihUcmFja0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBwYXJzZSBlcnJvciAqKioqIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIGFmdGVyOiAiICsgZS5nZXRBZnRlcigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgZXhwZWN0ZWQ6ICIgKyBlLmdldEV4cGVjdGVkKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZDogIiArIGUuZ2V0Rm91bmQoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2hvd0phdmFQYXJzZXIoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFQYXJzZXIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIik7Ci0KLSAgICB9Ci0KLSAgICAvKiogdG9rZW5pemUgdXNlciBpbnB1dCAqLwotICAgIHB1YmxpYyBBc3NlbWJseSB0b2tlbml6ZShTdHJpbmcgdXNlcklucHV0KSB7Ci0gICAgICAgIEFzc2VtYmx5IGluID0gbmV3IFRva2VuQXNzZW1ibHkodXNlcklucHV0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNlcklucHV0OiAiICsgdXNlcklucHV0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICB0b2tlbnM6ICIgKyBpbi5yZW1haW5kZXIoaW4uZGVmYXVsdERlbGltaXRlcigpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIC8qKiBwZXJmb3JtIG1hdGNoICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoUGFyc2VyIHBhcnNlciwgU3RyaW5nIHVzZXJJbnB1dCkgewotICAgICAgICBBc3NlbWJseSBvdXQgPSBwYXJzZXIuY29tcGxldGVNYXRjaCh0b2tlbml6ZSh1c2VySW5wdXQpKTsKLSAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIG91dDogIiArIG91dC5nZXRTdGFjaygpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgdGFyZ2V0OiAiICsgb3V0LmdldFRhcmdldCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgb3V0OiBudWxsIik7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9UcmFja1NlcXVlbmNlLmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL1RyYWNrU2VxdWVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzM2QwMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvY29tL2phdmFuaWN1cy9icHdqL1RyYWNrU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICAkSWQkCi0KLSAgIENvcHlyaWdodCAoYykgMTk5OSwgMjAwNCBTdGV2ZW4gSm9obiBNZXRza2VyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICBTdGV2ZSBNZXRza2VyIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBvciB3YXJyYW50aWVzIGFib3V0Ci0gICB0aGUgZml0bmVzcyBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLAotICAgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIG1lcmNoYW50YWJpbGl0eS4KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2UgY29tLmphdmFuaWN1cy5icHdqOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgc2ptLnBhcnNlLio7Ci0KLS8qKgotICogQSBUcmFja1NlcXVlbmNlIGlzIGEgc2VxdWVuY2UgdGhhdCB0aHJvd3MgYSA8Y29kZT4KLSAqIFRyYWNrU2VxdWVuY2VFeGNlcHRpb248L2NvZGU+IGlmIHRoZSBzZXF1ZW5jZSBiZWdpbnMgYnV0Ci0gKiBkb2VzIG5vdCBjb21wbGV0ZS4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gSi4gTWV0c2tlcgotICovCi0KLQotcHVibGljIGNsYXNzIFRyYWNrU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7Ci0vKioKLSAqIENvbnN0cnVjdHMgYSBuYW1lbGVzcyBUcmFja1NlcXVlbmNlLgotICovCi1wdWJsaWMgVHJhY2tTZXF1ZW5jZSAoKSB7Ci19Ci0vKioKLSAqIENvbnN0cnVjdHMgYSBUcmFja1NlcXVlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gKgotICogQHBhcmFtICAgIG5hbWUgICAgYSBuYW1lIHRvIGJlIGtub3duIGJ5Ci0gKi8KLXB1YmxpYyBUcmFja1NlcXVlbmNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0vKioKLSAqIEdpdmVuIGEgY29sbGVjdGlvbiBvZiBhc3NlbWJsaWVzLCB0aGlzIG1ldGhvZCBtYXRjaGVzIAotICogdGhpcyB0cmFjayBhZ2FpbnN0IGFsbCBvZiB0aGVtLCBhbmQgcmV0dXJucyBhIG5ldyAKLSAqIGNvbGxlY3Rpb24gb2YgdGhlIGFzc2VtYmxpZXMgdGhhdCByZXN1bHQgZnJvbSB0aGUgCi0gKiBtYXRjaGVzLgotICoKLSAqIElmIHRoZSBtYXRjaCBiZWdpbnMgYnV0IGRvZXMgbm90IGNvbXBsZXRlLCB0aGlzIG1ldGhvZAotICogdGhyb3dzIGEgPGNvZGU+VHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbjwvY29kZT4uCi0gKgotICogQHJldHVybiAgIGEgVmVjdG9yIG9mIGFzc2VtYmxpZXMgdGhhdCByZXN1bHQgZnJvbSBtYXRjaGluZwotICogICAgICAgICAgIGFnYWluc3QgYSBiZWdpbm5pbmcgc2V0IG9mIGFzc2VtYmxpZXMKLSAqCi0gKiBAcGFyYW0gaW4gYSB2ZWN0b3Igb2YgYXNzZW1ibGllcyB0byBtYXRjaCBhZ2FpbnN0Ci0gKgotICovCi1wdWJsaWMgVmVjdG9yIG1hdGNoKFZlY3RvciBpbikgewotCi0gICAgLy8gVGhpcyBwcmludGxuIGlzIHVzZWZ1bCBmb3IgZXhhbWluaW5nIGxlZnQgcmVjdXJzaW9uIGR1cmluZyBhIHBhcnNlCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4obmFtZSk7Ci0KLSAgICBib29sZWFuIGluVHJhY2sgPSBmYWxzZTsKLQlWZWN0b3IgbGFzdCA9IGluOwotCVZlY3RvciBvdXQgPSBpbjsKLQlFbnVtZXJhdGlvbiBlID0gc3VicGFyc2Vycy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVBhcnNlciBwID0gKFBhcnNlcikgZS5uZXh0RWxlbWVudCgpOwotCQlvdXQgPSBwLm1hdGNoQW5kQXNzZW1ibGUobGFzdCk7Ci0JCWlmIChvdXQuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoaW5UcmFjaykgewotCQkJCXRocm93VHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbihsYXN0LCBwKTsKLQkJCX0KLQkJCXJldHVybiBvdXQ7Ci0JCX0KLQkJaW5UcmFjayA9IHRydWU7Ci0JCWxhc3QgPSBvdXQ7Ci0JfQotCXJldHVybiBvdXQ7Ci19Ci0vKgotICogVGhyb3cgYW4gZXhjZXB0aW9uIHNob3dpbmcgaG93IGZhciB0aGUgbWF0Y2ggaGFkIAotICogcHJvZ3Jlc3NlZCwgd2hhdCBpdCBmb3VuZCBuZXh0LCBhbmQgd2hhdCBpdCB3YXMgCi0gKiBleHBlY3RpbmcuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHRocm93VHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbigKLQlWZWN0b3IgcHJldmlvdXNTdGF0ZSwgUGFyc2VyIHApIHsKLQkJCi0JQXNzZW1ibHkgYmVzdCA9IGJlc3QocHJldmlvdXNTdGF0ZSk7Ci0JU3RyaW5nIGFmdGVyID0gYmVzdC5jb25zdW1lZCgiICIpOwotCWlmIChhZnRlci5lcXVhbHMoIiIpKSB7Ci0JCWFmdGVyID0gIi1ub3RoaW5nLSI7Ci0JfQotCQotCVN0cmluZyBleHBlY3RlZCA9IHAudG9TdHJpbmcoKTsKLQkKLQlPYmplY3QgbmV4dCA9IGJlc3QucGVlaygpOwotCVN0cmluZyBmb3VuZCA9IAotCQkobmV4dCA9PSBudWxsKSA/ICItbm90aGluZy0iIDogbmV4dC50b1N0cmluZygpOwotCQkKLQl0aHJvdyBuZXcgVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbihhZnRlciwgZXhwZWN0ZWQsIGZvdW5kKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9jb20vamF2YW5pY3VzL2Jwd2ovVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9UcmFja1NlcXVlbmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzc3NDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovc3JjL2NvbS9qYXZhbmljdXMvYnB3ai9UcmFja1NlcXVlbmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICAkSWQkCi0KLSAgIENvcHlyaWdodCAoYykgMTk5OSwgMjAwNCBTdGV2ZW4gSm9obiBNZXRza2VyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICBTdGV2ZSBNZXRza2VyIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBvciB3YXJyYW50aWVzIGFib3V0Ci0gICB0aGUgZml0bmVzcyBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLAotICAgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIG1lcmNoYW50YWJpbGl0eS4KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIGNvbS5qYXZhbmljdXMuYnB3ajsKLSAKLS8qKgotICogU2lnbmFscyB0aGF0IGEgcGFyc2VyIGNvdWxkIG5vdCBtYXRjaCB0ZXh0IGFmdGVyCi0gKiBhIHNwZWNpZmljIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCXByb3RlY3RlZCBTdHJpbmcgYWZ0ZXIsIGV4cGVjdGVkLCBmb3VuZDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgPGNvZGU+VHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUKLSAqIHNwZWNpZmllZCByZWFzb25zIGZvciB0aGUgZXhjZXB0aW9uLgotICoKLSAqIEBwYXJhbSAgIGFmdGVyICAgYW4gaW5kaWNhdGlvbiBvZiB3aGF0IHRleHQgd2FzIHBhcnNlZAotICoKLSAqIEBwYXJhbSAgIGV4cGVjdGVkICAgYW4gaW5kaWNhdGlvbiBvZiB3aGF0IGtpbmQgb2YgdGhpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgIHdhcyBleHBlY3RlZCwgc3VjaCBhcyBhICcpJyB0b2tlbiAgICAgICAgCi0gKgotICogQHBhcmFtICAgZm91bmQgICB0aGUgdGV4dCB0aGUgdGhyb3dlciBhY3R1YWxseSBmb3VuZAotICovCi1wdWJsaWMgVHJhY2tTZXF1ZW5jZUV4Y2VwdGlvbigKLQlTdHJpbmcgYWZ0ZXIsIFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGZvdW5kKSB7Ci0JCQotCXN1cGVyKCJBZnRlciAgIDogIiArIGFmdGVyICsKLQkJIlxuRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArCi0JCSJcbkZvdW5kICAgOiAiICsgZm91bmQpOwotCXRoaXMuYWZ0ZXIgPSBhZnRlcjsKLQl0aGlzLmZvdW5kID0gZm91bmQ7Ci0JdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkOwotfQotLyoqCi0gKiBSZXR1cm5zIHNvbWUgaW5kaWNhdGlvbiBvZiB3aGF0IHRleHQgd2FzIGludGVycHJldGFibGUuCi0gKgotICogQHJldHVybiAgIHNvbWUgaW5kaWNhdGlvbiBvZiB3aGF0IHRleHQgd2FzIGludGVycHJldGFibGUKLSAqLwotcHVibGljIFN0cmluZyBnZXRBZnRlcigpIHsKLQlyZXR1cm4gYWZ0ZXI7Ci19Ci0vKioKLSAqIFJldHVybnMgc29tZSBpbmRpY2F0aW9uIG9mIHdoYXQga2luZCBvZiB0aGluZyB3YXMgCi0gKiBleHBlY3RlZCwgc3VjaCBhcyBhICcpJyB0b2tlbi4KLSAqCi0gKiBAcmV0dXJuICAgc29tZSBpbmRpY2F0aW9uIG9mIHdoYXQga2luZCBvZiB0aGluZyB3YXMgCi0gKiAgICAgICAgICAgZXhwZWN0ZWQsIHN1Y2ggYXMgYSAnKScgdG9rZW4KLSAqLwotcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZCgpIHsKLQlyZXR1cm4gZXhwZWN0ZWQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHRleHQgZWxlbWVudCB0aGUgdGhyb3dlciBhY3R1YWxseSBmb3VuZCB3aGVuIAotICogaXQgZXhwZWN0ZWQgc29tZXRoaW5nIGVsc2UuCi0gKgotICogQHJldHVybiAgIHRoZSB0ZXh0IGVsZW1lbnQgdGhlIHRocm93ZXIgYWN0dWFsbHkgZm91bmQgCi0gKiAgICAgICAgICAgd2hlbiBpdCBleHBlY3RlZCBzb21ldGhpbmcgZWxzZQotICovCi1wdWJsaWMgU3RyaW5nIGdldEZvdW5kKCkgewotCXJldHVybiBmb3VuZDsKLX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9tYW5pZmVzdC50eHQgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai9zcmMvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU4OTEzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3NyYy9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotTWFpbi1DbGFzczogY29tLmphdmFuaWN1cy5icHdqLlBhcnNlck1haW4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3Rlc3QvY29tL2phdmFuaWN1cy9icHdqL0phdmFQYXJzZXJUZXN0LmphdmEgYi9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai90ZXN0L2NvbS9qYXZhbmljdXMvYnB3ai9KYXZhUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUyNjI2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvaWRlYXMvcGFyc2Vycy9icHdqL3Rlc3QvY29tL2phdmFuaWN1cy9icHdqL0phdmFQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICAkSWQkCi0KLSAgIENvcHlyaWdodCAoYykgMjAwNCBKZXJlbXkgUmF5bmVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICBKZXJlbXkgUmF5bmVyIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBvciB3YXJyYW50aWVzIGFib3V0Ci0gICB0aGUgZml0bmVzcyBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLAotICAgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIG1lcmNoYW50YWJpbGl0eS4KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIGNvbS5qYXZhbmljdXMuYnB3ajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IHNqbS5wYXJzZS4qOwotaW1wb3J0IHNqbS5wYXJzZS50b2tlbnMuKjsKLWltcG9ydCBzam0uZXhhbXBsZXMudHJhY2suVHJhY2tFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBQYXJzZXJGYWNhZGUgcGFyc2VyOwotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHBhcnNlciA9IG5ldyBQYXJzZXJGYWNhZGUobmV3IExvZ2dpbmdKYXZhUGFyc2VyKCkuc3RhcnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUphdmFQcm9ncmFtKCkgewotICAgICAgICAvLyAtLSBkZWJ1ZwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIub3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJ0ZXN0U2ltcGxlSmF2YVByb2dyYW0ubW0iKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIub3V0LnByaW50bG4oIjxtYXAgdmVyc2lvbj0nMC43LjEnPiIpOwotCi0KLQotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShwYXJzZXIucGFyc2UoInBhY2thZ2UgZm9vLmJhcjsgcHVibGljIGNsYXNzIEZvbyBleHRlbmRzIEJhcnt9IikuaGFzTW9yZUVsZW1lbnRzKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nZ2luZ0phdmFQYXJzZXIub3V0LnByaW50bG4oIjwvbm9kZT4iKTsKLSAgICAgICAgfSAKLQotCi0gICAgICAgIExvZ2dpbmdKYXZhUGFyc2VyLm91dC5wcmludGxuKCI8L25vZGU+Iik7Ci0gICAgICAgIExvZ2dpbmdKYXZhUGFyc2VyLm91dC5wcmludGxuKCI8L21hcD4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai90ZXN0L2NvbS9qYXZhbmljdXMvYnB3ai9RdWFsaWZpZWRJZGVudGlmaWVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L2pzci9pZGVhcy9wYXJzZXJzL2Jwd2ovdGVzdC9jb20vamF2YW5pY3VzL2Jwd2ovUXVhbGlmaWVkSWRlbnRpZmllclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YTk2YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL2lkZWFzL3BhcnNlcnMvYnB3ai90ZXN0L2NvbS9qYXZhbmljdXMvYnB3ai9RdWFsaWZpZWRJZGVudGlmaWVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAgJElkJAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDQgSmVyZW15IFJheW5lci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgSmVyZW15IFJheW5lciBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgb3Igd2FycmFudGllcyBhYm91dAotICAgdGhlIGZpdG5lc3Mgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZSwKLSAgIGluY2x1ZGluZyB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBtZXJjaGFudGFiaWxpdHkuCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBzam0ucGFyc2UuKjsKLWltcG9ydCBzam0ucGFyc2UudG9rZW5zLio7Ci0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWRJZGVudGlmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFBhcnNlckZhY2FkZSBwYXJzZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgcGFyc2VyID0gbmV3IFBhcnNlckZhY2FkZShuZXcgSmF2YVBhcnNlcigpLnF1YWxpZmllZElkZW50aWZpZXIoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGFyc2VyOiIgKyBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUV4cHJlc3Npb24oKSB7Ci0gICAgICAgIGFzc2VydE51bGwocGFyc2VyLnBhcnNlKCIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkKCkgewotICAgICAgICBhc3NlcnRGYWxzZShwYXJzZXIucGFyc2UoImZvbyIpLmhhc01vcmVFbGVtZW50cygpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocGFyc2VyLnBhcnNlKCJmb28uYmFyIikuaGFzTW9yZUVsZW1lbnRzKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwYXJzZXIucGFyc2UoImZvby5iYXIubW9va3kiKS5oYXNNb3JlRWxlbWVudHMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWQoKSB7Ci0gICAgICAgIGFzc2VydE51bGwocGFyc2VyLnBhcnNlKCJmb28qYmFyIikpOwotICAgICAgICBhc3NlcnROdWxsKHBhcnNlci5wYXJzZSgiMTIzLjQ1NiIpKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yTWVzc2FnZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBc3NlbWJseSBhID0gcGFyc2VyLnBhcnNlKCJmb28qYmFyIik7Ci0gICAgICAgICAgICAvL3RvZG8gZmFpbCgiaW52YWxpZCAiICsgYSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkV4cGVjdGVkOiAuIikgPiAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9TZWFyY2hBbmRSZXBsYWNlIGIvZ3Jvb3Z5L2pzci9zcGVjL1NlYXJjaEFuZFJlcGxhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTgyNTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL1NlYXJjaEFuZFJlcGxhY2UKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0xIFNlYXJjaCBBbmQgUmVwbGFjZQotVGhlIGZvbGxvd2luZyBoZWFkaW5ncyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgdGV4dCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKLQotMS4xIGFuY2hvcgotPGEgbmFtZT0iJDEiPjwvYT4KLQotMS4xIGltYWdlCi0KLTxpbWcgc3JjPSckMScvPgotCi0xLjEgaW5jbHVkZQotCi08JQotICBpbmNsdWRlZFRleHQgPSAnJDEnCi0gIGlmICgnJDEnLmluZGV4T2YoJzonKSA+IDApIHsKLSAgICBwYXJzZXIgPSBuZXcgY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2gucGFyc2VyLkZhc3RQYWdlUGFyc2VyKCkKLSAgICBwYWdlID0gcGFyc2VyLnBhcnNlKCAnJDEnLnRvVVJMKCkudGV4dC50b0NoYXJBcnJheSgpICkKLSAgICBpbmNsdWRlZFRleHQgPSBwYWdlLmJvZHkKLQotICAgIHUgPSBuZXcgY29tLmphdmFuaWN1cy5iaXNjdWl0YmFycmVsLlBhZ2VVdGlscygnJDEnKQotICAgIGluY2x1ZGVkVGV4dCA9IHUucmVwbGFjZVdpdGhBYnNvbHV0ZShpbmNsdWRlZFRleHQsJ2FjdGlvbicpCi0gICAgaW5jbHVkZWRUZXh0ID0gdS5yZXBsYWNlV2l0aEFic29sdXRlKGluY2x1ZGVkVGV4dCwnaHJlZicpCi0gICAgaW5jbHVkZWRUZXh0ID0gdS5yZXBsYWNlV2l0aEFic29sdXRlKGluY2x1ZGVkVGV4dCwnc3JjJykKLSAgfSBlbHNlIHsKLSAgICBpbmNsdWRlZFRleHQgPSBqYXZhLmlvLkZpbGUoJyQxJykudGV4dAotICB9Ci0lPiAKLTwlPSBpbmNsdWRlZFRleHQgJT4KLQotMS4xIG1lcmdlCi0KLSR7bmV3IGphdmEuaW8uRmlsZSgnJDEnKS50ZXh0fQotCi0xLjEgKioqRU5EKioqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL1NlYXJjaEFuZFJlcGxhY2VSZWdleCBiL2dyb292eS9qc3Ivc3BlYy9TZWFyY2hBbmRSZXBsYWNlUmVnZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzAwNTUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL1NlYXJjaEFuZFJlcGxhY2VSZWdleAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTEgU2VhcmNoIEFuZCBSZXBsYWNlIFJlZ3VsYXIgRXhwcmVzc2lvbnMKLVRoZSBmb2xsb3dpbmcgcmVnZXhlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVnZXggaW1tZWRpYXRlbHkgZm9sbG93aW5nCi0KLTEuMSAtLS0tCi0KLTxociBjbGFzcz1saW5lIi8+Ci0KLTEuMSBcWyguKj8pXF0KLQote2xpbms6JDF9Ci0KLTEuMSBcP1w/KC4qPylcP1w/Ci0KLTxjaXRlIGNsYXNzPSJjaXRhdGlvbiI+JDE8L2NpdGU+Ci0KLTEuMSBfKFxTKj8pXwotCi08ZW0gY2xhc3M9ImVtcGhhc2lzIj4kMTwvZW0+Ci0KLTEuMSBce1x7KC4qPylcfVx9Ci0KLTx0dCBjbGFzcz0ibW9ub3NwYWNlZCI+JDE8L3R0PgotCi0xLjEgKD9tKV5ccyooaChbMC05XSlcLilccysoLio/KSQKLQotPGgzIGNsYXNzPSJoZWFkaW5nLSQyIj4kMzwvaDM+Ci0KLTEuMSBcKFwkKFteXCldKylcKQotCi0oe2xpbms6JiMxNjc7JDF8QWx0Q2hhcHRlcjAzTGV4aWNhbFN0cnVjdHVyZTIuaHRtbCMkMX0pCi0KLTEuMSAoP20pXlxzKihicVwuKVxzKyguKj8pJAotCi08YmxvY2txdW90ZSBjbGFzcz0iYmxvY2txdW90ZSI+JDI8L2Jsb2NrcXVvdGU+Ci0KLTEuMSBcKFwrXCkKLQotPGltZyBzcmM9InBsdXMucG5nIiBhbHQ9IkFkZGl0aW9uIiAvPgotCi0xLjEgXCgtXCkKLQotPGltZyBzcmM9Im1pbnVzLnBuZyIgYWx0PSJEZWxldGlvbiIgLz4KLQotMS4xIFwoaVwpCi0KLTxpbWcgc3JjPSJpbmZvLnBuZyIgYWx0PSJJbmZvcm1hdGlvbiIgLz4KLQotMS4xIFwqKC4qPylcKgotCi08Yj4kMTwvYj4KLQotMS4xICoqKkVORCoqKgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL1RlbXBsYXRlUGFnZS5odG1sIGIvZ3Jvb3Z5L2pzci9zcGVjL1RlbXBsYXRlUGFnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y4NGJhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9UZW1wbGF0ZVBhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPiR7Y29udGVudH08L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImJpc2N1aXQuY3NzIiB0aXRsZT0iRGVmYXVsdCIgbWVkaWE9InNjcmVlbiIvPgotICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJmdWxsc2NyZWVuLmNzcyIgdGl0bGU9IkZ1bGwgU2NyZWVuIiBtZWRpYT0ic2NyZWVuIiAvPgotICA8L2hlYWQ+Ci0gIDxib2R5IAotICAgYmdjb2xvcj0iIzk5OTk5OSIKLSAgIGxpbms9IiMwMDAwNzciIAotICAgYWxpbms9IiMwMDAwMzMiIAotICAgdmxpbms9IiMwMDAwMjIiCi0gICBiZ3Byb3BlcnRpZXM9ImZpeGVkIiAKLSAgIGxlZnRtYXJnaW49IjAiIAotICAgdG9wbWFyZ2luPSIwIiAKLSAgIHJpZ2h0bWFyZ2luPSIwIj4KLSAgCi0gPGJyPgotIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+Ci0gPHRhYmxlIGlkPSJ0YWJsZTEiIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MSB3aWR0aD0iMTAwJSIgYWxpZ249Y2VudGVyIGJnQ29sb3I9IzAwMDAwMCBib3JkZXI9MD4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGFsaWduPWNlbnRlciBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgICA8dHIgaGVpZ2h0PTE5PgotICAgICAgICAgICAgPCEtLSBub3J0aCBiYW5uZXIgLS0+Ci0JCTx0ZD4mbmJzcDs8L3RkPgotCQk8dGQgaGVpZ2h0PSIxOSIgYmdjb2xvcj0iI0ZGRkZGRiIgdmFsaWduPW1pZGRsZSBhbGlnbj1sZWZ0PgotCQkgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0JCSAgIDx0ciB3aWR0aD0iMTAwJSI+Ci0JCSAgICA8dGQgYmdjb2xvcj0iI0ZGRkZGRiIgdmFsaWduPW1pZGRsZSBhbGlnbj1sZWZ0PgotCQkgICAgIDxpbWcgc3JjPSJncm9vdnktbG9nby5wbmciPgotCQkgICAgPC90ZD4KLQkJICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiB2YWxpZ249dG9wIGFsaWduPXJpZ2h0PgotCQkgICAgIEdyb292eSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uJm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICAgICAgICA8YnI+Ci0gICAgICAgICAgICAgICAgICAgICBGaXJzdCBEcmFmdCZuYnNwOyZuYnNwOwotCQkgICAgPC90ZD4KLQkJICAgPC90cj4KLQkJICA8L3RhYmxlPgotCQk8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPCEtLSB3ZXN0IGd1dHRlciAtLT4KLSAgICAgICAgICA8dGQgcm93c3Bhbj0xMCB2YWxpZ249dG9wIGNsYXNzPSJ0IiB3aWR0aD0xMyBiZ2NvbG9yPSIjMDAwMDAwIj48IS0tYmFja2dyb3VuZD0id2VzdC5qcGciLS0+PC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICA8IS0tIG1haW4gc3R1ZmYgNjIyLS0+Ci0gICAgICAgICAgPHRkIHZhbGlnbj10b3AgY2xhc3M9InQiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjRkZGRkZGIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InQiPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLSAgICAgICAgICAgICAgPCEtLSBibGFjayBsaW5lIC0tPgotICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iYmxhY2siPjx0ZCBoZWlnaHQ9IjEiPjwhLS08aW1nIHNyYz0ic3BhY2UuZ2lmIiBoZWlnaHQ9MSB3aWR0aD0xPi0tPjwvdGQ+PC90cj4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwhLS0gbm9ydGggbmF2IGJhciAnYWN0aW9ucycgLS0+Ci0gICAgICAgICAgICAgIDx0ciBoZWlnaHQ9MTk+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0iMTkiIGJnY29sb3I9IiM2Mzk4YWEiIHZhbGlnbj1taWRkbGU+Ci0gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSIgc3R5bGU9Ik1BUkdJTi1MRUZUOiA2cHgiPgotICAgICAgICAgICAgICAgICAgICA8QSBzdHlsZT0iY29sb3I6ICNGRkZGRkYiIGhyZWY9ImluZGV4Lmh0bWwiPmNvbnRlbnRzPC9BPiB8Ci0gICAgICAgICAgICAgICAgICAgIDxBIHN0eWxlPSJjb2xvcjogI0ZGRkZGRiIgaHJlZj0iaHR0cDovL2N2cy5ncm9vdnkuY29kZWhhdXMub3JnL3ZpZXdyZXAvZ3Jvb3Z5L2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS8ke2NvbnRlbnR9P3I9TUFJTiI+aGlzdG9yeTwvYT4gfAotICAgICAgICAgICAgICAgICAgICA8QSBzdHlsZT0iY29sb3I6ICNGRkZGRkYiIGhyZWY9Imh0dHA6Ly9iaXNjdWl0LmphdmFuaWN1cy5jb20iPnBvd2VyZWQgYnkgYSBiaXNjdWl0PC9BPgotICAgICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwhLS0gYmxhY2sgbGluZSAtLT4KLSAgICAgICAgICAgICAgPHRyIGJnY29sb3I9ImJsYWNrIj48dGQgaGVpZ2h0PSIxIj48IS0tPGltZyBzcmM9InNwYWNlLmdpZiIgaGVpZ2h0PTEgd2lkdGg9MT4tLT48L3RkPjwvdHI+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8IS0tIG5vcnRoIG5hdiBiYXIgJ3lvdSBhcmUgaGVyZScgLS0+Ci0gICAgICAgICAgICAgIDx0ciBoZWlnaHQ9MTk+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0iMTkiIGJnY29sb3I9IiNGRkZGRkYiIHZhbGlnbj1taWRkbGU+Ci0gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSIgc3R5bGU9Ik1BUkdJTi1MRUZUOiA2cHgiPgotICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImluZGV4Lmh0bWwiPiR7Y29udGVudH08L2E+Ci0gICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPCEtLSBibGFjayBsaW5lIC0tPgotICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iYmxhY2siPjx0ZCBoZWlnaHQ9IjEiPjwhLS08aW1nIHNyYz0ic3BhY2UuZ2lmIiBoZWlnaHQ9MSB3aWR0aD0xPi0tPjwvdGQ+PC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgCi0gICAgICAgICA8L3RkPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIGltYWdlIGluIG5vcnRoZWFzdCBjb3JuZXIgdHVja2VkIHVuZGVyIG1haW4gYmFubmVyIC0tPgotPCEtLSAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgPElNRyBzcmM9Im5vcnRoZWFzdC5qcGciIGFsdD0ibm9ydGhlYXN0LmpwZyI+Ci0gICAgICAgICA8L3RkPgotLS0+ICAgICAgIDwvdHI+Ci0gICAgICAgCi0gICAgICAgPHRyPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIG1haW4gYm9keSwgd2hlcmUgcmVuZGVyZWQgdGV4dCBlbmRzIHVwIC0tPgotICAgICAgICAgIAotICAgICAgICAgPHRkIHZhbGlnbj10b3AgY2xhc3M9InQiIHdpZHRoPSIxMDAlIiBiZ0NvbG9yPSIjRkZGRkZGIj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0idCIgc3R5bGU9InBhZGRpbmc6IDlweDsgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVGRiI+Ci0gICAgICAgICAgICAke3JlbmRlcmVkVGV4dH0KLSAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICA8L3RkPgotCi0gICAgICAgICA8IS0tIHJpZ2h0IGhhbmQgbmF2aWdhdGlvbiBiYXIgLS0+Ci08IS0tICAgICAgICAgPHRkIHZhbGlnbj10b3AgY2xhc3M9InQiIHdpZHRoPTE0MSBzdHlsZT0iYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjRkZGRkZGIiBiZ0NvbG9yPSIjQTBCNzlCIj4KLSAgICAgICAgICAgPGltZyBzcmM9ImVhc3QuanBnIiBhbHQ9ImVhc3QuanBnIiBib3JkZXI9IjAiPgotICAgICAgICAgICA8YnI+Ci0gICAgICAgICAgIDxicj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0icmV2aGVhZCIgc3R5bGU9InBhZGRpbmctbGVmdDogNnB4OyBjb2xvcjogI0U3RDBDQiI+Ci0gICAgICAgICAgICAgPGI+SGVhZGluZzwvYj4KLSAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9InQiIHN0eWxlPSJtYXJnaW4tbGVmdDogNnB4OyBtYXJnaW4tcmlnaHQ6IDZweCI+Ci0gICAgICAgICAgICAgPGEgY2xhc3M9InJ2IiBocmVmPSJqYXZhLmh0bWwiPlN1YiBIZWFkaW5nPC9hPgotICAgICAgICAgICAgIDxicj5zbWFsbGVyPGJyPgotICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJieSI+c21hbGxlc3Q8L2Rpdj4KLSAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICA8L3RkPgotLS0+Ci0gICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gc291dGggbmF2IGJhciAtLT4KLSAgICAgICAgPHRyIGJnY29sb3I9IzAwMDAwMD4KLSAgICAgICAgICA8dGQgY29sc3Bhbj00IGhlaWdodD0yMD4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Ind0YiI+Ci0gICAgICAgICAgICAgIDxwIGNsYXNzPSJwYXJhZ3JhcGgiLz4gCi0gICAgICAgICAgICAgICAgPEEgc3R5bGU9ImNvbG9yOiAjRkZGRkZGIiBocmVmPSJpbmRleC5odG1sIj5jb250ZW50czwvQT4gfAotICAgICAgICAgICAgICAgIDxhIHN0eWxlPSJjb2xvcjogI0ZGRkZGRiIgaHJlZj0iaHR0cDovL2N2cy5ncm9vdnkuY29kZWhhdXMub3JnL3ZpZXdyZXAvZ3Jvb3Z5L2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS8ke2NvbnRlbnR9P3I9TUFJTiI+aGlzdG9yeTwvYT4gfAotICAgICAgICAgICAgICAgIDxhIHN0eWxlPSJjb2xvcjogI0ZGRkZGRiIgaHJlZj0iaHR0cDovL2Jpc2N1aXQuamF2YW5pY3VzLmNvbSI+cG93ZXJlZCBieSBhIGJpc2N1aXQ8L0E+Ci0gICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgPC90YWJsZT4KLSAgICAKLSAgICAKLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwvZGl2PgotCi08YnI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvYmlzY3VpdC5jc3MgYi9ncm9vdnkvanNyL3NwZWMvYmlzY3VpdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYWRkMzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL2Jpc2N1aXQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotZGl2LmNvbnRhaW5lcnt3aWR0aDo5OCU7IG1hcmdpbjogMSU7fQotdGFibGUjdGFibGUxe3RleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWxlZnQ6IGF1dG87IG1hcmdpbi1yaWdodDogYXV0bzsgd2lkdGg6IDYwMHB4O30KLXRyLnRke3RleHQtYWxpZ246bGVmdDt9Ci0KLS53aWtpdGFibGUsIC53aWtpLXRhYmxlIHsKLSAgICBtYXJnaW46IDVweDsKLSAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotLndpa2l0YWJsZSB0ZCwgLndpa2l0YWJsZSB0aCwgLndpa2ktdGFibGUgdGQsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwotICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDsKLX0KLS53aWtpdGFibGUgdGgsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLUJPRFksdGQsdHIsdGFibGUgICAgICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDE3cHg7IGZvbnQtZmFtaWx5OiBiYXNrZXJ2aWxsZSx0aW1lc30KLVRFWFRBUkVBICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2V9Ci0uaGVhZGluZy0xCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTNweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZn0KLS5oZWFkaW5nLTEtMQkgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0udGIJCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGR9Ci0ud3RiCQkgICAge2NvbG9yOiAjRkZGRkZGOyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLmJvbGQgICAgICAgICAgICAgICB7Rk9OVC1XRUlHSFQ6IGJvbGR9Ci1MSSAgICAgICAgICAgICAgICAgIHttYXJnaW4tbGVmdDogLTEwcHg7IG1hcmdpbi1yaWdodDogMTJweH0KLS50aXRsZSAJCSAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0uY29kZSAgICAgICAgICAgICAgIHtwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjY2ZmOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NmZjsgY29sb3I6ICM1NTU1Nzc7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHh9Ci0uY29kZS1hbHQgICAgICAgICAgIHtiYWNrZ3JvdW5kLWNvbG9yOiAjOEY3NzcxOyBwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGRkZGOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjsgY29sb3I6ICNGRkZGRkY7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2V9Ci0ucnYgICAgICAgICAgICAgICAgIHtmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNGRkZGRkYgfQotLnJieSAgICAgICAgICAgICAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLCBhcmlhbDsgY29sb3I6ICM2ODUwNDk7IHBhZGRpbmctYm90dG9tOiA4cHggfQotLmphdmEta2V5d29yZCAgICAgICB7Y29sb3I6ICMwMDAwODB9Ci0uamF2YS1vYmplY3QgICAgICAgIHtjb2xvcjogIzY2MEU3QX0KLS5qYXZhLXF1b3RlICAgICAgICAge2NvbG9yOiAjMDA4MDAwfQotQQkgCSAgICB7VEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3ZlciAJICAgIHtURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5ka2JsdWUgICAgICAge0NPTE9SOiAjMTE0NEFBOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuZGtibHVlICAgIHtDT0xPUjogIzExNDRBQTsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5ka2JsdWUgCSAgICB7Q09MT1I6ICMxMTQ0QUE7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLndoaXRlIAkgICAge0NPTE9SOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQud2hpdGUgICAgIHtDT0xPUjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci53aGl0ZSAJICAgIHtDT0xPUjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC53aGl0ZSAgICAge0NPTE9SOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLndoaXRlIAkgICAge0NPTE9SOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5yZXYJICAgIHtDT0xPUjogIzY1NTMyQjsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsYXJpYWw7IEZPTlQtU0laRTogMTBweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBGT05ULUZBTUlMWTogdmVyZGFuYSxhcmlhbDsgRk9OVC1TSVpFOiAxMHB4OyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5jYW4JICAgIHtDT0xPUjogIzAwMDAwMDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLmNhbgkgICAge0NPTE9SOiAjMDAwMDAwOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLmNhbgkgICAge0NPTE9SOiAjNTUwMEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5jYW5sdCAJICAgIHtDT0xPUjogIzU1NTU3NzsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLmNhbmx0CSAgICB7Q09MT1I6ICM1NTU1Nzc7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIuY2FubHQJICAgIHtDT0xPUjogIzU1MDBBQTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9idWlsZC54bWwgYi9ncm9vdnkvanNyL3NwZWMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FiM2IwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9ImJpc2N1aXQgcmVuZGVyIiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cHJvcGVydHkgbmFtZT0id2lraS5zcmMuZGlyIiB2YWx1ZT0ic3JjL3dpa2kiLz4KLSAgPHByb3BlcnR5IG5hbWU9InJlbmRlcmVkLmRpciIgdmFsdWU9Indpa2kiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KLSAgCQkKLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgICAgZGF0YXR5cGVzICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgICA8cGF0aCBpZD0iYmlzY3VpdC5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPCEtLSAgICAgICAgICAgICAgICAgIHRhcmdldHMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgCi0gICAgICAgICAgZGVwZW5kcz0icmVuZGVyIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVmYXVsdDogcmVuZGVyIHdpa2kgcGFnZXMiCi0gIC8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0icmVtb3ZlIGFsbCBidWlsdCBmaWxlcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7cmVuZGVyZWQuZGlyfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJyZW5kZXIiIGRlc2NyaXB0aW9uPSJyZW5kZXIgd2lraSBzb3VyY2UiPgotICAgICAgPHRhc2tkZWYgbmFtZT0iYmlzY3VpdCIgY2xhc3NuYW1lPSJjb20uamF2YW5pY3VzLmJpc2N1aXRiYXJyZWwuYW50LkJpc2N1aXQiIGNsYXNzcGF0aHJlZj0iYmlzY3VpdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxta2RpciBkaXI9IiR7cmVuZGVyZWQuZGlyfSIvPgotICAgICAgPGNvcHkgdG9kaXI9IiR7cmVuZGVyZWQuZGlyfSI+Ci0gICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iPjxpbmNsdWRlIG5hbWU9ImJpc2N1aXQuY3NzIi8+PC9maWxlc2V0PgotICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIj48aW5jbHVkZSBuYW1lPSJmdWxsc2NyZWVuLmNzcyIvPjwvZmlsZXNldD4KLSAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiI+PGluY2x1ZGUgbmFtZT0iKi5wbmciLz48L2ZpbGVzZXQ+Ci0gICAgICA8L2NvcHk+Ci0gICAgICA8YmlzY3VpdCBkZXN0ZGlyPSIke3JlbmRlcmVkLmRpcn0iCi0gICAgICAgICAgICAgICBzcmNkaXI9IiR7d2lraS5zcmMuZGlyfSIKLSAgICAgICAgICAgICAgIGxpc3RmaWxlcz0idHJ1ZSI+Ci0gICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYmlzY3VpdC5jbGFzc3BhdGgiLz4KLSAgICAgIDwvYmlzY3VpdD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9mdWxsc2NyZWVuLmNzcyBiL2dyb292eS9qc3Ivc3BlYy9mdWxsc2NyZWVuLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4MDZjOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvZnVsbHNjcmVlbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1kaXYuY29udGFpbmVye3dpZHRoOjk4JTsgbWFyZ2luOiAxJTt9Ci10YWJsZSN0YWJsZTF7dGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvO30KLXRyLnRke3RleHQtYWxpZ246bGVmdDt9Ci0KLS53aWtpdGFibGUsIC53aWtpLXRhYmxlIHsKLSAgICBtYXJnaW46IDVweDsKLSAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotLndpa2l0YWJsZSB0ZCwgLndpa2l0YWJsZSB0aCwgLndpa2ktdGFibGUgdGQsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwotICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDsKLX0KLS53aWtpdGFibGUgdGgsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLUJPRFksdGQsdHIsdGFibGUgICAgICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDE3cHg7IGZvbnQtZmFtaWx5OiBiYXNrZXJ2aWxsZSx0aW1lc30KLVRFWFRBUkVBICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2V9Ci0uaGVhZGluZy0xCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTNweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZn0KLS5oZWFkaW5nLTEtMQkgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0udGIJCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGR9Ci0ud3RiCQkgICAge2NvbG9yOiAjRkZGRkZGOyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLmJvbGQgICAgICAgICAgICAgICB7Rk9OVC1XRUlHSFQ6IGJvbGR9Ci1MSSAgICAgICAgICAgICAgICAgIHttYXJnaW4tbGVmdDogLTEwcHg7IG1hcmdpbi1yaWdodDogMTJweH0KLS50aXRsZSAJCSAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0uY29kZSAgICAgICAgICAgICAgIHtwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjY2ZmOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NmZjsgY29sb3I6ICM1NTU1Nzc7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHh9Ci0uY29kZS1hbHQgICAgICAgICAgIHtiYWNrZ3JvdW5kLWNvbG9yOiAjOEY3NzcxOyBwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGRkZGOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjsgY29sb3I6ICNGRkZGRkY7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2V9Ci0ucnYgICAgICAgICAgICAgICAgIHtmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNGRkZGRkYgfQotLnJieSAgICAgICAgICAgICAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLCBhcmlhbDsgY29sb3I6ICM2ODUwNDk7IHBhZGRpbmctYm90dG9tOiA4cHggfQotLmphdmEta2V5d29yZCAgICAgICB7Y29sb3I6ICMwMDAwODB9Ci0uamF2YS1vYmplY3QgICAgICAgIHtjb2xvcjogIzY2MEU3QX0KLS5qYXZhLXF1b3RlICAgICAgICAge2NvbG9yOiAjMDA4MDAwfQotQQkgCSAgICB7Rk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIgCSAgICB7Rk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLmRrYmx1ZSAgICAgICB7Q09MT1I6ICMxMTQ0QUE7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuZGtibHVlICAgIHtDT0xPUjogIzExNDRBQTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIuZGtibHVlIAkgICAge0NPTE9SOiAjMTE0NEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay53aGl0ZSAJICAgIHtDT0xPUjogI0ZGRkZGRjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC53aGl0ZSAgICAge0NPTE9SOiAjRkZGRkZGOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci53aGl0ZSAJICAgIHtDT0xPUjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQud2hpdGUgICAgIHtDT0xPUjogI0ZGRkZGRjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsYXJpYWw7IEZPTlQtU0laRTogMTBweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsYXJpYWw7IEZPTlQtU0laRTogMTBweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5yZXYJICAgIHtDT0xPUjogIzY1NTMyQjsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsuY2FuCSAgICB7Q09MT1I6ICMwMDAwMDA7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuY2FuCSAgICB7Q09MT1I6ICMwMDAwMDA7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLmNhbgkgICAge0NPTE9SOiAjNTUwMEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5jYW5sdCAJICAgIHtDT0xPUjogIzU1NTU3NzsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC5jYW5sdAkgICAge0NPTE9SOiAjNTU1NTc3OyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5jYW5sdAkgICAge0NPTE9SOiAjNTUwMEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL2dyb292eS1sb2dvLnBuZyBiL2dyb292eS9qc3Ivc3BlYy9ncm9vdnktbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWY0YzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL2dyb292eS1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9pbmZvLnBuZyBiL2dyb292eS9qc3Ivc3BlYy9pbmZvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4ZDMzOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvaW5mby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvbGliL2Jpc2N1aXQuamFyIGIvZ3Jvb3Z5L2pzci9zcGVjL2xpYi9iaXNjdWl0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmNGJkNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvbGliL2Jpc2N1aXQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL21pbnVzLnBuZyBiL2dyb292eS9qc3Ivc3BlYy9taW51cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYmZkY2QuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL21pbnVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9wbHVzLnBuZyBiL2dyb292eS9qc3Ivc3BlYy9wbHVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyNGRjMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvcGx1cy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL2Jpc2N1aXQuY3NzIGIvZ3Jvb3Z5L2pzci9zcGVjL3NyYy9iaXNjdWl0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmY2Q3Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvc3JjL2Jpc2N1aXQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotZGl2LmNvbnRhaW5lcnt3aWR0aDo5OCU7IG1hcmdpbjogMSU7fQotdGFibGUjdGFibGUxe3RleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWxlZnQ6IGF1dG87IG1hcmdpbi1yaWdodDogYXV0bzsgd2lkdGg6IDYwMHB4O30KLXRyLnRke3RleHQtYWxpZ246bGVmdDt9Ci0KLS53aWtpdGFibGUsIC53aWtpLXRhYmxlIHsKLSAgICBtYXJnaW46IDVweDsKLSAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotLndpa2l0YWJsZSB0ZCwgLndpa2l0YWJsZSB0aCwgLndpa2ktdGFibGUgdGQsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwotICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDsKLX0KLS53aWtpdGFibGUgdGgsIC53aWtpLXRhYmxlIHRoIHsKLSAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLUJPRFksdGQsdHIsdGFibGUgICAgICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDE3cHg7IGZvbnQtZmFtaWx5OiBiYXNrZXJ2aWxsZSx0aW1lc30KLVRFWFRBUkVBICAgICAgICAgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2V9Ci0uaGVhZGluZy0xCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTNweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZn0KLS5oZWFkaW5nLTEtMQkgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0udGIJCSAgICB7Y29sb3I6ICMzNDM0MzQ7IGZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IHRhaG9tYSxhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGR9Ci0ud3RiCQkgICAge2NvbG9yOiAjRkZGRkZGOyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLmJvbGQgICAgICAgICAgICAgICB7Rk9OVC1XRUlHSFQ6IGJvbGR9Ci1MSSAgICAgICAgICAgICAgICAgIHttYXJnaW4tbGVmdDogLTEwcHg7IG1hcmdpbi1yaWdodDogMTJweH0KLS50aXRsZSAJCSAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0uY29kZSAgICAgICAgICAgICAgIHtwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjY2ZmOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NmZjsgY29sb3I6ICM1NTU1Nzc7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHh9Ci0uY29kZS1hbHQgICAgICAgICAgIHtiYWNrZ3JvdW5kLWNvbG9yOiAjOEY3NzcxOyBwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWJvdHRvbTogMnB4OyBwYWRkaW5nLWxlZnQ6IDI0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGRkZGOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjsgY29sb3I6ICNGRkZGRkY7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2V9Ci0ucnYgICAgICAgICAgICAgICAgIHtmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNGRkZGRkYgfQotLnJieSAgICAgICAgICAgICAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLCBhcmlhbDsgY29sb3I6ICM2ODUwNDk7IHBhZGRpbmctYm90dG9tOiA4cHggfQotLmphdmEta2V5d29yZCAgICAgICB7Y29sb3I6ICMwMDAwODB9Ci0uamF2YS1vYmplY3QgICAgICAgIHtjb2xvcjogIzY2MEU3QX0KLS5qYXZhLXF1b3RlICAgICAgICAge2NvbG9yOiAjMDA4MDAwfQotQQkgCSAgICB7Rk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIgCSAgICB7Rk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLmRrYmx1ZSAgICAgICB7Q09MT1I6ICMxMTQ0QUE7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuZGtibHVlICAgIHtDT0xPUjogIzExNDRBQTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIuZGtibHVlIAkgICAge0NPTE9SOiAjMTE0NEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay53aGl0ZSAJICAgIHtDT0xPUjogI0ZGRkZGRjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC53aGl0ZSAgICAge0NPTE9SOiAjRkZGRkZGOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci53aGl0ZSAJICAgIHtDT0xPUjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQud2hpdGUgICAgIHtDT0xPUjogI0ZGRkZGRjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsYXJpYWw7IEZPTlQtU0laRTogMTBweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLnJldgkgICAge0NPTE9SOiAjNjU1MzJCOyBGT05ULVdFSUdIVDogYm9sZDsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsYXJpYWw7IEZPTlQtU0laRTogMTBweDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5yZXYJICAgIHtDT0xPUjogIzY1NTMyQjsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsuY2FuCSAgICB7Q09MT1I6ICMwMDAwMDA7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuY2FuCSAgICB7Q09MT1I6ICMwMDAwMDA7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLmNhbgkgICAge0NPTE9SOiAjNTUwMEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5jYW5sdCAJICAgIHtDT0xPUjogIzU1NTU3NzsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC5jYW5sdAkgICAge0NPTE9SOiAjNTU1NTc3OyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5jYW5sdAkgICAge0NPTE9SOiAjNTUwMEFBOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy9ncm9vdnktbG9nby5wbmcgYi9ncm9vdnkvanNyL3NwZWMvc3JjL2dyb292eS1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZjRjMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvc3JjL2dyb292eS1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9BbHRDaGFwdGVyMDNMZXhpY2FsU3RydWN0dXJlIGIvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0FsdENoYXB0ZXIwM0xleGljYWxTdHJ1Y3R1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNGI2NGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0FsdENoYXB0ZXIwM0xleGljYWxTdHJ1Y3R1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotKkNoYXB0ZXIgMyoKLQotaDEuIExleGljYWwgU3RydWN0dXJlCi0KLVRoaXMgY2hhcHRlciBzcGVjaWZpZXMgdGhlIGxleGljYWwgc3RydWN0dXJlIG9mIHRoZSBHcm9vdnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIAotCi1Qcm9ncmFtcyBhcmUgd3JpdHRlbiBpbiBVbmljb2RlICgkMy4xKSwgYnV0IGxleGljYWwgdHJhbnNsYXRpb25zIGFyZSBwcm92aWRlZCAoJDMuMikgc28gdGhhdCBVbmljb2RlIGVzY2FwZXMgKCQzLjMpIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgYW55IFVuaWNvZGUgY2hhcmFjdGVyIHVzaW5nIG9ubHkgQVNDSUkgY2hhcmFjdGVycy4gCi1MaW5lIHRlcm1pbmF0b3JzIGFyZSBkZWZpbmVkICgkMy40KSB0byBzdXBwb3J0IHRoZSBkaWZmZXJlbnQgY29udmVudGlvbnMgb2YgZXhpc3RpbmcgaG9zdCBzeXN0ZW1zIHdoaWxlIG1haW50YWluaW5nIGNvbnNpc3RlbnQgbGluZSBudW1iZXJzLiAKLQotVGhlIFVuaWNvZGUgY2hhcmFjdGVycyByZXN1bHRpbmcgZnJvbSB0aGUgbGV4aWNhbCB0cmFuc2xhdGlvbnMgYXJlIHJlZHVjZWQgdG8gYSBzZXF1ZW5jZSBvZiBpbnB1dCBlbGVtZW50cyAoJDMuNSksIHdoaWNoIGFyZSB3aGl0ZSBzcGFjZSAoJDMuNiksIGNvbW1lbnRzICgkMy43KSwgYW5kIHRva2Vucy4gCi1UaGUgdG9rZW5zIGFyZSB0aGUgaWRlbnRpZmllcnMgKCQzLjgpLCBrZXl3b3JkcyAoJDMuOSksIGxpdGVyYWxzICgkMy4xMCksIHNlcGFyYXRvcnMgKCQzLjExKSwgYW5kIG9wZXJhdG9ycyAoJDMuMTIpIG9mIHRoZSBzeW50YWN0aWMgZ3JhbW1hci4gCi0KLXthbmNob3I6My4xfQotaDIuIDMuMSBVbmljb2RlCi0KLVByb2dyYW1zIGFyZSB3cml0dGVuIHVzaW5nIHRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuCi1JbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoYXJhY3RlciBzZXQgYW5kIGl0cyBhc3NvY2lhdGVkIGNoYXJhY3RlciBlbmNvZGluZ3MgbWF5IGJlIGZvdW5kIGF0OiAKLQotYnEuIGh0dHA6Ly93d3cudW5pY29kZS5vcmcgCi0KLVRoZSBKYXZhIHBsYXRmb3JtIHRyYWNrcyB0aGUgVW5pY29kZSBzcGVjaWZpY2F0aW9uIGFzIGl0IGV2b2x2ZXMuIAotVGhlIHByZWNpc2UgdmVyc2lvbiBvZiBVbmljb2RlIHVzZWQgYnkgYSBnaXZlbiByZWxlYXNlIGlzIHNwZWNpZmllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY2xhc3Mge3tDaGFyYWN0ZXJ9fS4KLQotVmVyc2lvbnMgb2YgdGhlIEdyb292eSBwcm9ncmFtbWluZyBsYW5ndWFnZSB1cCB0byBhbmQgaW5jbHVkaW5nIDEuMCBmaW5hbCB1c2UgVW5pY29kZSB2ZXJzaW9uIDMuMCBiZWNhdXNlIEoyU0UgMS40IGRvZXMuIAotVXBncmFkZXMgdG8gbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIFVuaWNvZGUgU3RhbmRhcmQgb2NjdXJyZWQgaW4gSjJTRSA1LjAgKHRvIFVuaWNvZGUgNC4wKS4gCi0KLSpKMlNFIDUuMCsqCi1UaGUgVW5pY29kZSBzdGFuZGFyZCB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBhcyBhIGZpeGVkLXdpZHRoIDE2LWJpdCBjaGFyYWN0ZXIgZW5jb2RpbmcuIAotSXQgaGFzIHNpbmNlIGJlZW4gY2hhbmdlZCB0byBhbGxvdyBmb3IgY2hhcmFjdGVycyB3aG9zZSByZXByZXNlbnRhdGlvbiByZXF1aXJlcyBtb3JlIHRoYW4gMTYgYml0cy4gCi1UaGUgcmFuZ2Ugb2YgbGVnYWwgY29kZSBwb2ludHMgc2luY2UgSjJTRSA1LjAgaXMgbm93IFUrMDAwMCB0byBVKzEwRkZGRiwgdXNpbmcgdGhlIGhleGFkZWNpbWFsIFUrbiBfbm90YXRpb25fLiAKLUNoYXJhY3RlcnMgd2hvc2UgY29kZSBwb2ludHMgYXJlIGdyZWF0ZXIgdGhhbiBVK0ZGRkYgYXJlIGNhbGxlZCBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMuCi1UbyByZXByZXNlbnQgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGNoYXJhY3RlcnMgdXNpbmcgb25seSAxNi1iaXQgdW5pdHMsIHRoZSBVbmljb2RlIHN0YW5kYXJkIGRlZmluZXMgYW4gZW5jb2RpbmcgY2FsbGVkIFVURi0xNi4KLUluIHRoaXMgZW5jb2RpbmcsIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYXMgcGFpcnMgb2YgMTYtYml0IGNvZGUgdW5pdHMsIHRoZSBmaXJzdCBmcm9tIHRoZSBoaWdoLXN1cnJvZ2F0ZXMgcmFuZ2UsIChVK0Q4MDAgdG8gVStEQkZGKSwgdGhlIHNlY29uZCBmcm9tIHRoZSBsb3ctc3Vycm9nYXRlcyByYW5nZSAoVStEQzAwIHRvIFUrREZGRikuIAotRm9yIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAwMCB0byBVK0ZGRkYsIHRoZSB2YWx1ZXMgb2YgY29kZXBvaW50cyBhbmQgVVRGLTE2IGNvZGUgdW5pdHMgYXJlIHRoZSBzYW1lLiAKLQotVGhlIEdyb292eSBwcm9ncmFtbWluZyBsYW5ndWFnZSByZXByZXNlbnRzIHRleHQgaW4gc2VxdWVuY2VzIG9mIDE2LWJpdCBjb2RlIHVuaXRzLCB1c2luZyB0aGUgVVRGLTE2IGVuY29kaW5nLgotQSBmZXcgQVBJcywgcHJpbWFyaWx5IGluIHRoZSB7e0NoYXJhY3Rlcn19IGNsYXNzLCB1c2UgMzItYml0IGludGVnZXJzIHRvIHJlcHJlc2VudCBjb2RlIHBvaW50cyBhcyBpbmRpdmlkdWFsIGVudGl0aWVzLgotVGhlIEphdmEgcGxhdGZvcm0gcHJvdmlkZXMgbWV0aG9kcyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIHR3byByZXByZXNlbnRhdGlvbnMuCi0KLVRoaXMgYm9vayB1c2VzIHRoZSB0ZXJtcyBfY29kZV8gX3BvaW50XyBhbmQgX1VURi0xNl8gX2NvZGVfIF91bml0XyB3aGVyZSB0aGUgcmVwcmVzZW50YXRpb24gaXMgcmVsZXZhbnQsIGFuZCB0aGUgZ2VuZXJpYyB0ZXJtIF9jaGFyYWN0ZXJfIHdoZXJlIHRoZSByZXByZXNlbnRhdGlvbiBpcyBpcnJlbGV2YW50IHRvIHRoZSBkaXNjdXNzaW9uLgotCi0qQWxsIFBsYXRmb3JtcyoKLUV4Y2VwdCBmb3IgY29tbWVudHMgKCQzLjcpLCBpZGVudGlmaWVycywgYW5kIHRoZSBjb250ZW50cyBvZiBzdHJpbmcgbGl0ZXJhbHMgKCQzLjEwLjUpLCBhbGwgaW5wdXQgZWxlbWVudHMgKCQzLjUpIGluIGEgcHJvZ3JhbSBhcmUgZm9ybWVkIG9ubHkgZnJvbSBBU0NJSSBjaGFyYWN0ZXJzIChvciBVbmljb2RlIGVzY2FwZXMgKCQzLjMpIHdoaWNoIHJlc3VsdCBpbiBBU0NJSSBjaGFyYWN0ZXJzKS4gQVNDSUkgKEFOU0kgWDMuNCkgaXMgdGhlIEFtZXJpY2FuIFN0YW5kYXJkIENvZGUgZm9yIEluZm9ybWF0aW9uIEludGVyY2hhbmdlLiBUaGUgZmlyc3QgMTI4IGNoYXJhY3RlcnMgb2YgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGVuY29kaW5nIGFyZSB0aGUgQVNDSUkgY2hhcmFjdGVycy4gCi0KLU5vdGU6IEdyb292eSBoYXMgbm8gY2hhcmFjdGVyIGxpdGVyYWxzLCBzZWUgKCQzLjEwLjQpCi0KLXthbmNob3I6My4yfQotaDIuIDMuMiBMZXhpY2FsIFRyYW5zbGF0aW9ucwotCi1BIHJhdyBVbmljb2RlIGNoYXJhY3RlciBzdHJlYW0gaXMgdHJhbnNsYXRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgdG9rZW5zLCB1c2luZyB0aGUgZm9sbG93aW5nIHRocmVlIGxleGljYWwgdHJhbnNsYXRpb24gc3RlcHMsIHdoaWNoIGFyZSBhcHBsaWVkIGluIHR1cm46Ci0KLTEuIEEgdHJhbnNsYXRpb24gb2YgVW5pY29kZSBlc2NhcGVzICgkMy4zKSBpbiB0aGUgcmF3IHN0cmVhbSBvZiBVbmljb2RlIGNoYXJhY3RlcnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBjaGFyYWN0ZXIuIEEgVW5pY29kZSBlc2NhcGUgb2YgdGhlIGZvcm0ge3tcXFx1eHh4eH19LCB3aGVyZSB7e3h4eHh9fSBpcyBhIGhleGFkZWNpbWFsIHZhbHVlLCByZXByZXNlbnRzIHRoZSBVVEYtMTYgY29kZSB1bml0IHdob3NlIGVuY29kaW5nIGlzIHt7eHh4eH19LiBUaGlzIHRyYW5zbGF0aW9uIHN0ZXAgYWxsb3dzIGFueSBwcm9ncmFtIHRvIGJlIGV4cHJlc3NlZCB1c2luZyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMuCi0xLiBBIHRyYW5zbGF0aW9uIG9mIHRoZSBVbmljb2RlIHN0cmVhbSByZXN1bHRpbmcgZnJvbSBzdGVwIDEgaW50byBhIHN0cmVhbSBvZiBpbnB1dCBjaGFyYWN0ZXJzIGFuZCBsaW5lIHRlcm1pbmF0b3JzICgkMy40KS4KLTEuIEEgdHJhbnNsYXRpb24gb2YgdGhlIHN0cmVhbSBvZiBpbnB1dCBjaGFyYWN0ZXJzIGFuZCBsaW5lIHRlcm1pbmF0b3JzIHJlc3VsdGluZyBmcm9tIHN0ZXAgMiBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5wdXQgZWxlbWVudHMgKCQzLjUpIHdoaWNoLCBhZnRlciB3aGl0ZSBzcGFjZSAoJDMuNikgYW5kIGNvbW1lbnRzICgkMy43KSBhcmUgZGlzY2FyZGVkLCBjb21wcmlzZSB0aGUgdG9rZW5zICgkMy41KSB0aGF0IGFyZSB0aGUgdGVybWluYWwgc3ltYm9scyBvZiB0aGUgc3ludGFjdGljIGdyYW1tYXIgKCQyLjMpLgotCi1UaGUgbG9uZ2VzdCBwb3NzaWJsZSB0cmFuc2xhdGlvbiBpcyB1c2VkIGF0IGVhY2ggc3RlcCwgZXZlbiBpZiB0aGUgcmVzdWx0IGRvZXMgbm90IHVsdGltYXRlbHkgbWFrZSBhIGNvcnJlY3QgcHJvZ3JhbSB3aGlsZSBhbm90aGVyIGxleGljYWwgdHJhbnNsYXRpb24gd291bGQuIFRodXMgdGhlIGlucHV0IGNoYXJhY3RlcnMge3thXC1cLWJ9fSBhcmUgdG9rZW5pemVkICgkMy41KSBhcyB7e2F9fSwge3stLX19LCB7e2J9fSwgd2hpY2ggaXMgbm90IHBhcnQgb2YgYW55IGdyYW1tYXRpY2FsbHkgY29ycmVjdCBwcm9ncmFtLCBldmVuIHRob3VnaCB0aGUgdG9rZW5pemF0aW9uIHt7YX19LCB7ey19fSwge3stfX0sIHt7Yn19IGNvdWxkIGJlIHBhcnQgb2YgYSBncmFtbWF0aWNhbGx5IGNvcnJlY3QgcHJvZ3JhbS4gCi0KLXthbmNob3I6My4zfQotaDIuIDMuMyBVbmljb2RlIEVzY2FwZXMKLQotSW1wbGVtZW50YXRpb25zIGZpcnN0IHJlY29nbml6ZSBfVW5pY29kZV8gX2VzY2FwZXNfIGluIHRoZWlyIGlucHV0LCB0cmFuc2xhdGluZyB0aGUgQVNDSUkgY2hhcmFjdGVycyB7e1x1fX0gZm9sbG93ZWQgYnkgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMgdG8gdGhlIFVURi04IG9yIFVURi0xNiBjb2RlIHVuaXQgKCQzLjEpIHdpdGggdGhlIGluZGljYXRlZCBoZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIHBhc3NpbmcgYWxsIG90aGVyIGNoYXJhY3RlcnMgdW5jaGFuZ2VkLiAKLQotKkoyU0UgNS4wKyoKLVJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMgcmVxdWlyZXMgdHdvIGNvbnNlY3V0aXZlIFVuaWNvZGUgZXNjYXBlcy4gCi0KLSpBbGwgUGxhdGZvcm1zKgotVGhpcyB0cmFuc2xhdGlvbiBzdGVwIHJlc3VsdHMgaW4gYSBzZXF1ZW5jZSBvZiBVbmljb2RlIGlucHV0IGNoYXJhY3RlcnM6Ci0KLXtjb2RlfQotVW5pY29kZUlucHV0Q2hhcmFjdGVyOgotICBVbmljb2RlRXNjYXBlCi0KLSAgUmF3SW5wdXRDaGFyYWN0ZXIKLQotVW5pY29kZUVzY2FwZToKLSAgJ1xcXCcgVW5pY29kZU1hcmtlciBIZXhEaWdpdCBIZXhEaWdpdCBIZXhEaWdpdCBIZXhEaWdpdAotCi1Vbmljb2RlTWFya2VyOgotICAndScKLSAgVW5pY29kZU1hcmtlciAndScKLSAgCi1SYXdJbnB1dENoYXJhY3RlcjoKLSAgYW55IFVuaWNvZGUgY2hhcmFjdGVyCi0KLQotSGV4RGlnaXQ6IG9uZSBvZgotICAnMCcgJzEnICcyJyAnMycgJzQnICc1JyAnNicgJzcnICc4JyAnOScgCi0gICdhJyAnYicgJ2MnICdkJyAnZScgJ2YnIAotICAnQScgJ0InICdDJyAnRCcgJ0UnICdGJwote2NvZGV9Ci0KLVRoZSB7e1xcXH19LCB7e3V9fSwgYW5kIGhleGFkZWNpbWFsIGRpZ2l0cyBoZXJlIGFyZSBhbGwgQVNDSUkgY2hhcmFjdGVycy4KLQotSW4gYWRkaXRpb24gdG8gdGhlIHByb2Nlc3NpbmcgaW1wbGllZCBieSB0aGUgZ3JhbW1hciwgZm9yIGVhY2ggcmF3IGlucHV0IGNoYXJhY3RlciB0aGF0IGlzIGEgYmFja3NsYXNoIHt7XFxcfX0sIGlucHV0IHByb2Nlc3NpbmcgbXVzdCBjb25zaWRlciBob3cgbWFueSBvdGhlciBcIGNoYXJhY3RlcnMgY29udGlndW91c2x5IHByZWNlZGUgaXQsIHNlcGFyYXRpbmcgaXQgZnJvbSBhIG5vbi17e1xcXH19IGNoYXJhY3RlciBvciB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4KLUlmIHRoaXMgbnVtYmVyIGlzIGV2ZW4sIHRoZW4gdGhlIHt7XFxcfX0gaXMgZWxpZ2libGUgdG8gYmVnaW4gYSBVbmljb2RlIGVzY2FwZTsgCi1pZiB0aGUgbnVtYmVyIGlzIG9kZCwgdGhlbiB0aGUge3tcXFx9fSBpcyBub3QgZWxpZ2libGUgdG8gYmVnaW4gYSBVbmljb2RlIGVzY2FwZS4gCi1Gb3IgZXhhbXBsZSwgdGhlIHJhdyBpbnB1dCB7eyJcXFxcXFx1MDA2MT1cXFx1MDA2MSJ9fSByZXN1bHRzIGluIHRoZSBlbGV2ZW4gY2hhcmFjdGVycyB7eyIgXFxcIFxcXCB1IDAgMCA2IDEgPSBhICJ9fSAoe3tcXFx1MDA2MX19IGlzIHRoZSBVbmljb2RlIGVuY29kaW5nIG9mIHRoZSBjaGFyYWN0ZXIgImEiKS4KLQotSWYgYW4gZWxpZ2libGUge3tcXFx9fSBpcyBub3QgZm9sbG93ZWQgYnkge3t1fX0sIHRoZW4gaXQgaXMgdHJlYXRlZCBhcyBhIF9SYXdJbnB1dENoYXJhY3Rlcl8gYW5kIHJlbWFpbnMgcGFydCBvZiB0aGUgZXNjYXBlZCBVbmljb2RlIHN0cmVhbS4gCi1JZiBhbiBlbGlnaWJsZSB7e1xcXH19IGlzIGZvbGxvd2VkIGJ5IHt7dX19LCBvciBtb3JlIHRoYW4gb25lIHt7dX19LCBhbmQgdGhlIGxhc3Qge3t1fX0gaXMgbm90IGZvbGxvd2VkIGJ5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLCB0aGVuIGEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy4KLQotVGhlIGNoYXJhY3RlciBwcm9kdWNlZCBieSBhIFVuaWNvZGUgZXNjYXBlIGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIGZ1cnRoZXIKLVVuaWNvZGUgZXNjYXBlcy4gCi1Gb3IgZXhhbXBsZSwgdGhlIHJhdyBpbnB1dCB7e1xcXHUwMDVjdTAwNWF9fSByZXN1bHRzIGluIHRoZSBzaXggY2hhcmFjdGVycyB7e1xcXCB1IDAgMCA1IGF9fSwgYmVjYXVzZSB7ezAwNWN9fSBpcyB0aGUgVW5pY29kZSB2YWx1ZSBmb3Ige3tcXFx9fS4gCi1JdCBkb2VzIG5vdCByZXN1bHQgaW4gdGhlIGNoYXJhY3RlciB7e1p9fSwgd2hpY2ggaXMgVW5pY29kZSBjaGFyYWN0ZXIge3swMDVhfX0sIGJlY2F1c2UgdGhlIHt7XFxcfX0gdGhhdCByZXN1bHRlZCBmcm9tIHRoZSB7e1xcXHUwMDVjfX0gaXMgbm90IGludGVycHJldGVkIGFzIHRoZSBzdGFydCBvZiBhIGZ1cnRoZXIgVW5pY29kZSBlc2NhcGUuCi0KLVRoZSBHcm9vdnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3BlY2lmaWVzIGEgc3RhbmRhcmQgd2F5IG9mIHRyYW5zZm9ybWluZyBhIHByb2dyYW0gd3JpdHRlbiBpbiBVbmljb2RlIGludG8gQVNDSUkgdGhhdCBjaGFuZ2VzIGEgcHJvZ3JhbSBpbnRvIGEgZm9ybSB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgYnkgQVNDSUktYmFzZWQgdG9vbHMuCi1UaGUgdHJhbnNmb3JtYXRpb24gaW52b2x2ZXMgY29udmVydGluZyBhbnkgVW5pY29kZSBlc2NhcGVzIGluIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgcHJvZ3JhbSB0byBBU0NJSSBieSBhZGRpbmcgYW4gZXh0cmEge3t1fX0gLSBmb3IgZXhhbXBsZSwge3tcXFx1eHh4eH19IGJlY29tZXMge3tcXFx1dXh4eHh9fSAtIHdoaWxlIHNpbXVsdGFuZW91c2x5IGNvbnZlcnRpbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSB0ZXh0IHRvIFVuaWNvZGUgZXNjYXBlcyBjb250YWluaW5nIGEgc2luZ2xlIHt7dX19IGVhY2guCi0KLVRoaXMgdHJhbnNmb3JtZWQgdmVyc2lvbiBpcyBlcXVhbGx5IGFjY2VwdGFibGUgdG8gYSBjb21waWxlciBmb3IgdGhlIEdyb292eSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoIkdyb292eSBjb21waWxlciIpIGFuZCByZXByZXNlbnRzIHRoZSBleGFjdCBzYW1lIHByb2dyYW0uCi1UaGUgZXhhY3QgVW5pY29kZSBzb3VyY2UgY2FuIGxhdGVyIGJlIHJlc3RvcmVkIGZyb20gdGhpcyBBU0NJSSBmb3JtIGJ5IGNvbnZlcnRpbmcgZWFjaCBlc2NhcGUgc2VxdWVuY2Ugd2hlcmUgbXVsdGlwbGUge3t1fX0ncyBhcmUgcHJlc2VudCB0byBhIHNlcXVlbmNlIG9mIFVuaWNvZGUgY2hhcmFjdGVycyB3aXRoIG9uZSBmZXdlciB7e3V9fSwgd2hpbGUgc2ltdWx0YW5lb3VzbHkgY29udmVydGluZyBlYWNoIGVzY2FwZSBzZXF1ZW5jZSB3aXRoIGEgc2luZ2xlIHUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyLgotCi1JbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHVzZSB0aGUge3tcXFx1eHh4eH19IG5vdGF0aW9uIGFzIGFuIG91dHB1dCBmb3JtYXQgdG8gZGlzcGxheSBVbmljb2RlIGNoYXJhY3RlcnMgd2hlbiBhIHN1aXRhYmxlIGZvbnQgaXMgbm90IGF2YWlsYWJsZS4KLQote2FuY2hvcjozLjR9Ci1oMi4gMy40IExpbmUgVGVybWluYXRvcnMKLQotSW1wbGVtZW50YXRpb25zIG5leHQgZGl2aWRlIHRoZSBzZXF1ZW5jZSBvZiBVbmljb2RlIGlucHV0IGNoYXJhY3RlcnMgaW50byBsaW5lcyBieSByZWNvZ25pemluZyBfbGluZV8gX3Rlcm1pbmF0b3JzXy4gCi1UaGlzIGRlZmluaXRpb24gb2YgbGluZXMgZGV0ZXJtaW5lcyB0aGUgbGluZSBudW1iZXJzIHByb2R1Y2VkIGJ5IGEgR3Jvb3Z5IGNvbXBpbGVyIG9yIG90aGVyIHN5c3RlbSBjb21wb25lbnQuIAotSXQgYWxzbyBzcGVjaWZpZXMgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSB7ey8vfX0gZm9ybSBvZiBhIGNvbW1lbnQgKCQzLjcpLgotCi17Y29kZX0KLUxpbmVUZXJtaW5hdG9yOgotICB0aGUgQVNDSUkgTEYgY2hhcmFjdGVyLCBhbHNvIGtub3duIGFzICJuZXdsaW5lIgotICB0aGUgQVNDSUkgQ1IgY2hhcmFjdGVyLCBhbHNvIGtub3duIGFzICJyZXR1cm4iCi0gIHRoZSBBU0NJSSBDUiBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgdGhlIEFTQ0lJIExGIGNoYXJhY3RlcgotCi0KLUlucHV0Q2hhcmFjdGVyOgotICBVbmljb2RlSW5wdXRDaGFyYWN0ZXIgYnV0IG5vdCBDUiBvciBMRgote2NvZGV9Ci0KLQotTGluZXMgYXJlIHRlcm1pbmF0ZWQgYnkgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgQ1IsIG9yIExGLCBvciBDUiBMRi4gVGhlIHR3bwotY2hhcmFjdGVycyBDUiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBMRiBhcmUgY291bnRlZCBhcyBvbmUgbGluZSB0ZXJtaW5hdG9yLCBub3QKLXR3by4KLVRoZSByZXN1bHQgaXMgYSBzZXF1ZW5jZSBvZiBsaW5lIHRlcm1pbmF0b3JzIGFuZCBpbnB1dCBjaGFyYWN0ZXJzLCB3aGljaCBhcmUgdGhlIHRlcm1pbmFsIHN5bWJvbHMgZm9yIHRoZSB0aGlyZCBzdGVwIGluIHRoZSB0b2tlbml6YXRpb24gcHJvY2Vzcy4KLQote2FuY2hvcjozLjV9Ci1oMi4gMy41IElucHV0IEVsZW1lbnRzIGFuZCBUb2tlbnMKLQotVGhlIGlucHV0IGNoYXJhY3RlcnMgYW5kIGxpbmUgdGVybWluYXRvcnMgdGhhdCByZXN1bHQgZnJvbSBlc2NhcGUgcHJvY2Vzc2luZyAoJDMuMykgYW5kIHRoZW4gaW5wdXQgbGluZSByZWNvZ25pdGlvbiAoJDMuNCkgYXJlIHJlZHVjZWQgdG8gYSBzZXF1ZW5jZSBvZiBfaW5wdXRfIF9lbGVtZW50c18uCi1UaG9zZSBpbnB1dCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgd2hpdGUgc3BhY2UgKCQzLjYpIG9yIGNvbW1lbnRzICgkMy43KSBhcmUKLXRva2Vucy4gVGhlIHRva2VucyBhcmUgdGhlIHRlcm1pbmFsIHN5bWJvbHMgb2YgdGhlIHN5bnRhY3RpYyBncmFtbWFyICgkMi4zKS4KLQotCi1UaGlzIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgcHJvZHVjdGlvbnM6Ci17Y29kZX0KLUlucHV0OgotICBJbnB1dEVsZW1lbnRzKG9wdCkgU3ViKG9wdCkKLQotSW5wdXRFbGVtZW50czoKLSAgSW5wdXRFbGVtZW50Ci0gIElucHV0RWxlbWVudHMgSW5wdXRFbGVtZW50Ci0KLUlucHV0RWxlbWVudDoKLSAgV2hpdGVTcGFjZQotICBDb21tZW50Ci0gIFRva2VuCi0KLVRva2VuOgotICBJZGVudGlmaWVyCi0gIEtleXdvcmQKLSAgTGl0ZXJhbAotICBTZXBhcmF0b3IKLSAgT3BlcmF0b3IKLQotU3ViOgotICB0aGUgQVNDSUkgU1VCIGNoYXJhY3RlciwgYWxzbyBrbm93biBhcyAiY29udHJvbC1aIgote2NvZGV9Ci0KLVdoaXRlIHNwYWNlICgkMy42KSBhbmQgY29tbWVudHMgKCQzLjcpIGNhbiBzZXJ2ZSB0byBzZXBhcmF0ZSB0b2tlbnMgdGhhdCwgaWYgYWRqYWNlbnQsIG1pZ2h0IGJlIHRva2VuaXplZCBpbiBhbm90aGVyIG1hbm5lci4gRm9yIGV4YW1wbGUsIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIC0gYW5kID0gaW4gdGhlIGlucHV0IGNhbiBmb3JtIHRoZSBvcGVyYXRvciB0b2tlbiAtPSAoJDMuMTIpIG9ubHkgaWYgdGhlcmUgaXMgbm8gaW50ZXJ2ZW5pbmcgd2hpdGUgc3BhY2Ugb3IgY29tbWVudC4KLQotQXMgYSBzcGVjaWFsIGNvbmNlc3Npb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGUgQVNDSUkgU1VCIGNoYXJhY3RlciAoe3tcXFx1MDAxYX19LCBvciBjb250cm9sLVopIGlzIGlnbm9yZWQgaWYgaXQgaXMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBlc2NhcGVkIGlucHV0IHN0cmVhbS4KLQotQ29uc2lkZXIgdHdvIHRva2VucyB7e3h9fSBhbmQge3t5fX0gaW4gdGhlIHJlc3VsdGluZyBpbnB1dCBzdHJlYW0uIElmIHt7eH19IHByZWNlZGVzIHt7eX19LCB0aGVuIHdlIHNheSB0aGF0IHt7eH19IGlzIF90b18gX3RoZV8gX2xlZnRfIF9vZl8ge3t5fX0gYW5kIHRoYXQge3t5fX0gaXMgX3RvXyBfdGhlXyBfcmlnaHRfIF9vZl8ge3t4fX0uCi0KLUZvciBleGFtcGxlLCBpbiB0aGlzIHNpbXBsZSBwaWVjZSBvZiBjb2RlOgote2NvZGV9Ci1jbGFzcyBFbXB0eSB7Ci19Ci17Y29kZX0KLXdlIHNheSB0aGF0IHRoZSB7e1x9fX0gdG9rZW4gaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSB7e1x7fX0gdG9rZW4sIGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMsIGluIHRoaXMgdHdvLWRpbWVuc2lvbmFsIHJlcHJlc2VudGF0aW9uIG9uIHBhcGVyLCBkb3dud2FyZCBhbmQgdG8gdGhlIGxlZnQgb2YgdGhlIHt7XHt9fSB0b2tlbi4KLVRoaXMgY29udmVudGlvbiBhYm91dCB0aGUgdXNlIG9mIHRoZSB3b3JkcyBsZWZ0IGFuZCByaWdodCBhbGxvd3MgdXMgdG8gc3BlYWssIGZvciBleGFtcGxlLCBvZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIG9mIGEgYmluYXJ5IG9wZXJhdG9yIG9yIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgotCi17YW5jaG9yOjMuNn0KLWgyLiAzLjYgV2hpdGUgU3BhY2UKLQotX1doaXRlXyBfU3BhY2VfIGlzIGRlZmluZWQgYXMgdGhlIEFTQ0lJIHNwYWNlLCBob3Jpem9udGFsIHRhYiwgYW5kIGZvcm0gZmVlZCBjaGFyYWN0ZXJzLCBhcyB3ZWxsIGFzIGxpbmUgdGVybWluYXRvcnMgKCQzLjQpLgotCi17Y29kZX0KLVdoaXRlU3BhY2U6Ci0gIHRoZSBBU0NJSSBTUCBjaGFyYWN0ZXIsIGFsc28ga25vd24gYXMgInNwYWNlIgotICB0aGUgQVNDSUkgSFQgY2hhcmFjdGVyLCBhbHNvIGtub3duIGFzICJob3Jpem9udGFsIHRhYiIKLSAgdGhlIEFTQ0lJIEZGIGNoYXJhY3RlciwgYWxzbyBrbm93biBhcyAiZm9ybSBmZWVkIgotICBMaW5lVGVybWluYXRvcgote2NvZGV9Ci0KLXthbmNob3I6My43fQotaDIuIDMuNyBDb21tZW50cwotCi1UaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgX2NvbW1lbnRzXzoKLXt0YWJsZX0KLSAgICAgICAgICAgICAgICAgfAote3svXCogdGV4dCBcKi99fSB8IEEgX3RyYWRpdGlvbmFsXyBfY29tbWVudF86IGFsbCB0aGUgdGV4dCBmcm9tIHRoZSBBU0NJSQotICAgICAgICAgICAgICAgICB8IGNoYXJhY3RlcnMge3svXCp9fSB0byB0aGUgQVNDSUkgY2hhcmFjdGVycyB7e1wqL319IGlzIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgfCAoYXMgaW4gQyBhbmQgQysrKS4KLSAgICAgICAgICAgICAgICAgfAote3svLyB0ZXh0fX0gICAgICB8IEFuIF9lbmRfLV9vZl8tX2xpbmVfIF9jb21tZW50XzogYWxsIHRoZSB0ZXh0IGZyb20gdGhlIEFTQ0lJCi0gICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVycyB7ey8vfX0gdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBpcyBpZ25vcmVkIChhcyBpbgotICAgICAgICAgICAgICAgICB8IEMrKykuCi0gICAgICAgICAgICAgICAgIHwKLXt7IyB0ZXh0fX0gICAgICAgfCBBIF9zaGVsbF8gX2NvbW1lbnRfOiBhbGwgdGhlIHRleHQgZnJvbSB0aGUgQVNDSUkKLSAgICAgICAgICAgICAgICAgfCBjaGFyYWN0ZXIge3sjfX0gdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBpcyBpZ25vcmVkIChhcyBpbgotICAgICAgICAgICAgICAgICB8IFVuaXggc2hlbGwgc2NyaXB0cykuCi17dGFibGV9Ci0KLVRoZXNlIGNvbW1lbnRzIGFyZSBmb3JtYWxseSBzcGVjaWZpZWQgYnkgdGhlIGZvbGxvd2luZyBwcm9kdWN0aW9uczoKLXtjb2RlfQotQ29tbWVudDoKLSAgVHJhZGl0aW9uYWxDb21tZW50Ci0gIEVuZE9mTGluZUNvbW1lbnQKLSAgU2hlbGxDb21tZW50Ci0gIAotVHJhZGl0aW9uYWxDb21tZW50OgotICAnLycgJyonIENvbW1lbnRUYWlsCi0KLUVuZE9mTGluZUNvbW1lbnQ6Ci0gICcvJyAnLycgQ2hhcmFjdGVyc0luTGluZShvcHQpCi0KLVNoZWxsQ29tbWVudDoKLSAgJyMnIENoYXJhY3RlcnNJbkxpbmUob3B0KQotCi1Db21tZW50VGFpbDoKLSAgJyonIENvbW1lbnRUYWlsU3RhcgotICBOb3RTdGFyIENvbW1lbnRUYWlsCi0KLUNvbW1lbnRUYWlsU3RhcjoKLSAgJy8nCi0gICcqJyBDb21tZW50VGFpbFN0YXIKLSAgTm90U3Rhck5vdFNsYXNoIENvbW1lbnRUYWlsCi0KLU5vdFN0YXI6Ci0gIElucHV0Q2hhcmFjdGVyIGJ1dCBub3QgJyonCi0gIExpbmVUZXJtaW5hdG9yCi0KLU5vdFN0YXJOb3RTbGFzaDoKLSAgSW5wdXRDaGFyYWN0ZXIgYnV0IG5vdCAnKicgb3IgJy8nCi0gIExpbmVUZXJtaW5hdG9yCi0KLUNoYXJhY3RlcnNJbkxpbmU6Ci0gIElucHV0Q2hhcmFjdGVyCi0gIENoYXJhY3RlcnNJbkxpbmUgSW5wdXRDaGFyYWN0ZXIKLXtjb2RlfQotCi1UaGVzZSBwcm9kdWN0aW9ucyBpbXBseSBhbGwgb2YgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotLSBDb21tZW50cyBkbyBub3QgbmVzdAotLSB7eyN9fSwge3svXCp9fSBhbmQge3tcKi99fSBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyBpbiBjb21tZW50cyB0aGF0IGJlZ2luIHdpdGgge3svL319LgotLSB7eyN9fSBhbmQge3svL319IGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nIGluIGNvbW1lbnRzIHRoYXQgYmVnaW4gd2l0aCB7ey9cKn19IG9yIHt7L1wqXCp9fS4KLS0ge3svL319LCB7ey9cKn19IGFuZCB7e1wqL319IGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nIGluIGNvbW1lbnRzIHRoYXQgYmVnaW4gd2l0aCB7eyN9fS4KLQotQXMgYSByZXN1bHQsIHRoZSB0ZXh0Ogote2NvZGV9Ci0vKiBhIGNvbW1lbnQgd2hpY2guLi4gLyogIyAvLyAvKiogZW5kcyBoZXJlOiAqLwote2NvZGV9Ci1pcyBhIHNpbmdsZSBjb21wbGV0ZSBjb21tZW50LgotCi1UaGUgbGV4aWNhbCBncmFtbWFyIGltcGxpZXMgdGhhdCBjb21tZW50cyBkbyBub3Qgb2NjdXIgd2l0aGluIHN0cmluZyBsaXRlcmFscyAoJDMuMTAuNSkgb3IgcmVnZXggbGl0ZXJhbHMgKCQzLjEwLnRvZG8pLgotCi17YW5jaG9yOjMuOH0KLWgyLiAzLjggSWRlbnRpZmllcnMKLQotQW4gX2lkZW50aWZpZXJfIGlzIGFuIHVubGltaXRlZC1sZW5ndGggc2VxdWVuY2Ugb2YgX0phdmFfIF9sZXR0ZXJzXyBhbmQgX0phdmFfIF9kaWdpdHNfLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggbXVzdCBiZSBhIEphdmEgbGV0dGVyLiBBbiBpZGVudGlmaWVyIGNhbm5vdCBoYXZlIHRoZSBzYW1lIHNwZWxsaW5nIChVbmljb2RlIGNoYXJhY3RlciBzZXF1ZW5jZSkgYXMgYSBrZXl3b3JkICgkMy45KSwgYm9vbGVhbiBsaXRlcmFsICgkMy4xMC4zKSwgb3IgdGhlIG51bGwgbGl0ZXJhbCAoJDMuMTAuNykuICB0b2RvIC0gb3RoZXIgbGl0ZXJhbHM/Pz8/Ci17Y29kZX0KLUlkZW50aWZpZXI6Ci0gIElkZW50aWZpZXJDaGFycyBidXQgbm90IGEgS2V5d29yZCBvciBCb29sZWFuTGl0ZXJhbCBvciBOdWxsTGl0ZXJhbAotCi1JZGVudGlmaWVyQ2hhcnM6Ci0gIEphdmFMZXR0ZXIKLSAgSWRlbnRpZmllckNoYXJzIEphdmFMZXR0ZXJPckRpZ2l0Ci0KLUphdmFMZXR0ZXI6Ci0gIGFueSBVbmljb2RlIGNoYXJhY3RlciB0aGF0IGlzIGEgSmF2YSBsZXR0ZXIgKHNlZSBiZWxvdykKLQotSmF2YUxldHRlck9yRGlnaXQ6Ci0gIGFueSBVbmljb2RlIGNoYXJhY3RlciB0aGF0IGlzIGEgSmF2YSBsZXR0ZXItb3ItZGlnaXQgKHNlZSBiZWxvdykKLXtjb2RlfQotCi1MZXR0ZXJzIGFuZCBkaWdpdHMgbWF5IGJlIGRyYXduIGZyb20gdGhlIGVudGlyZSBVbmljb2RlIGNoYXJhY3RlciBzZXQsIHdoaWNoIHN1cHBvcnRzIG1vc3Qgd3JpdGluZyBzY3JpcHRzIGluIHVzZSBpbiB0aGUgd29ybGQgdG9kYXksIGluY2x1ZGluZyB0aGUgbGFyZ2Ugc2V0cyBmb3IgQ2hpbmVzZSwgSmFwYW5lc2UsIGFuZCBLb3JlYW4uIFRoaXMgYWxsb3dzIHByb2dyYW1tZXJzIHRvIHVzZSBpZGVudGlmaWVycyBpbiB0aGVpciBwcm9ncmFtcyB0aGF0IGFyZSB3cml0dGVuIGluIHRoZWlyIG5hdGl2ZSBsYW5ndWFnZXMuCi0KLUEgIkphdmEgbGV0dGVyIiBpcyBhIGNoYXJhY3RlciBmb3Igd2hpY2ggdGhlIG1ldGhvZCB7e0NoYXJhY3Rlcn19IHt7LmlzSmF2YUlkZW50aWZpZXJTdGFydChpbnQpfX0gcmV0dXJucyB7e3RydWV9fS4gQSAiSmF2YSBsZXR0ZXItb3ItZGlnaXQiIGlzIGEgY2hhcmFjdGVyIGZvciB3aGljaCB0aGUgbWV0aG9kIHt7Q2hhcmFjdGVyfX0ge3suaXNKYXZhSWRlbnRpZmllclBhcnQoaW50KX19IHJldHVybnMge3t0cnVlfX0uCi0KLVRoZSBKYXZhIGxldHRlcnMgaW5jbHVkZSB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBBU0NJSSBMYXRpbiBsZXR0ZXJzIHt7QX19LXt7Wn19ICh7e1xcXHUwMDQxfX0te3tcXFx1MDA1YX19KSwgYW5kIHt7YX19LXt7en19ICh7e1xcXHUwMDYxfX0te3tcXFx1MDA3YX19KSwgYW5kLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgQVNDSUkgdW5kZXJzY29yZSAoe3tffX0sIG9yIHt7XFxcdTAwNWZ9fSkgYW5kIGRvbGxhciBzaWduICh7eyR9fSwgb3Ige3tcXFx1MDAyNH19KS4gVGhlIHt7JH19IGNoYXJhY3RlciBzaG91bGQgYmUgdXNlZCBvbmx5IGluIG1lY2hhbmljYWxseSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgb3IsIHJhcmVseSwgdG8gYWNjZXNzIHByZWV4aXN0aW5nIG5hbWVzIG9uIGxlZ2FjeSBzeXN0ZW1zLgotCi1UaGUgIkphdmEgZGlnaXRzIiBpbmNsdWRlIHRoZSBBU0NJSSBkaWdpdHMge3swfX0te3s5fX0gKHt7XFxcdTAwMzB9fS17e1xcXHUwMDM5fX0pLgotCi1Ud28gaWRlbnRpZmllcnMgYXJlIHRoZSBzYW1lIG9ubHkgaWYgdGhleSBhcmUgaWRlbnRpY2FsLCB0aGF0IGlzLCBoYXZlIHRoZSBzYW1lIFVuaWNvZGUgY2hhcmFjdGVyIGZvciBlYWNoIGxldHRlciBvciBkaWdpdC4KLQotSWRlbnRpZmllcnMgdGhhdCBoYXZlIHRoZSBzYW1lIGV4dGVybmFsIGFwcGVhcmFuY2UgbWF5IHlldCBiZSBkaWZmZXJlbnQuIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpZmllcnMgY29uc2lzdGluZyBvZiB0aGUgc2luZ2xlIGxldHRlcnMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSAoe3tBfX0sIHt7XFxcdTAwNDF9fSksIExBVElOIFNNQUxMIExFVFRFUiBBICh7e2F9fSwge3tcXFx1MDA2MX19KSwgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgKHt7JiN4MDM5MTt9fSwge3tcXFx1MDM5MX19KSwgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEgKHt7JiN4MDQzMDt9fSwge3tcXFx1MDQzMH19KSBhbmQgTUFUSEVNQVRJQ0FMIEJPTEQgSVRBTElDIFNNQUxMIEEgKHt7YX19LCB7e1xcXHVkODM1XFxcdWRjODJ9fSkgYXJlIGFsbCBkaWZmZXJlbnQuCi0KLVVuaWNvZGUgY29tcG9zaXRlIGNoYXJhY3RlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWNvbXBvc2VkIGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCBhIExBVElOIENBUElUQUwgTEVUVEVSIEEgQUNVVEUgKHt7JiN4MDBjMTt9fSwge3tcXFx1MDBjMX19KSBjb3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIHRoZSBzYW1lIGFzIGEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSAoe3tBfX0sIHt7XFxcdTAwNDF9fSkgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBOT04tU1BBQ0lORyBBQ1VURSAoe3smI3gwMzAxO319LCB7e1xcXHUwMzAxfX0pIHdoZW4gc29ydGluZywgYnV0IHRoZXNlIGFyZSBkaWZmZXJlbnQgaW4gaWRlbnRpZmllcnMuIFNlZSBfVGhlXyBfVW5pY29kZV8gX1N0YW5kYXJkXywgVm9sdW1lIDEsIHBhZ2VzIDQxMmZmIGZvciBkZXRhaWxzIGFib3V0IGRlY29tcG9zaXRpb24sIGFuZCBzZWUgcGFnZXMgNjI2LTYyNyBvZiB0aGF0IHdvcmsgZm9yIGRldGFpbHMgYWJvdXQgc29ydGluZy4KLQotRXhhbXBsZXMgb2YgaWRlbnRpZmllcnMgYXJlOgote2NvZGV9Ci1TdHJpbmcgICBpMyAgICYjeDAzQjE7JiN4MDNjNjsmI3gwM2I1OyYjeDAzQzg7ICAgTUFYX1ZBTFVFICAgaXNMZXR0ZXJPckRpZ2l0Ci17Y29kZX0KLQotCi17YW5jaG9yOjMuOX0KLWgyLiAzLjkgS2V5d29yZHMKLQotVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgc2VxdWVuY2VzLCBmb3JtZWQgZnJvbSBBU0NJSSBsZXR0ZXJzLCBhcmUgcmVzZXJ2ZWQgZm9yCi11c2UgYXMgX2tleXdvcmRzXyBhbmQgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKCQzLjgpOgotCi17dGFibGV9Ci1LZXl3b3JkczogICAgfCBvbmUgb2YgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgCi17e2Fic3RyYWN0fX0gfCB7e2NvbnRpbnVlfX0gfCB7e2ZvciAgICAgICB9fSB8IHt7bmV3ICAgICAgIH19IHwge3tzd2l0Y2ggICAgICB9fQote3thc3NlcnQgIH19IHwge3tkZWZhdWx0IH19IHwge3tpZiAgICAgICAgfX0gfCB7e3BhY2thZ2UgICB9fSB8IHt7c3luY2hyb25pemVkfX0KLXt7Ym9vbGVhbiB9fSB8IHt7ZG8gICAgICB9fSB8IHt7Z290byAgICAgIH19IHwge3twcml2YXRlICAgfX0gfCB7e3RoaXMgICAgICAgIH19Ci17e2JyZWFrICAgfX0gfCB7e2RvdWJsZSAgfX0gfCB7e2ltcGxlbWVudHN9fSB8IHt7cHJvdGVjdGVkIH19IHwge3t0aHJvdyAgICAgICB9fQote3tieXRlICAgIH19IHwge3tlbHNlICAgIH19IHwge3tpbXBvcnQgICAgfX0gfCB7e3B1YmxpYyAgICB9fSB8IHt7dGhyb3dzICAgICAgfX0KLXt7Y2FzZSAgICB9fSB8IHt7ZW51bSAgICB9fSB8IHt7aW5zdGFuY2VvZn19IHwge3tyZXR1cm4gICAgfX0gfCB7e3RyYW5zaWVudCAgIH19Ci17e2NhdGNoICAgfX0gfCB7e2V4dGVuZHMgfX0gfCB7e2ludCAgICAgICB9fSB8IHt7c2hvcnQgICAgIH19IHwge3t0cnkgICAgICAgICB9fQote3tjaGFyICAgIH19IHwge3tmaW5hbCAgIH19IHwge3tpbnRlcmZhY2UgfX0gfCB7e3N0YXRpYyAgICB9fSB8IHt7dm9pZCAgICAgICAgfX0KLXt7Y2xhc3MgICB9fSB8IHt7ZmluYWxseSB9fSB8IHt7bG9uZyAgICAgIH19IHwge3tzdHJpY3RmcCAgfX0gfCB7e3ZvbGF0aWxlICAgIH19Ci17e2NvbnN0ICAgfX0gfCB7e2Zsb2F0ICAgfX0gfCB7e25hdGl2ZSAgICB9fSB8IHt7c3VwZXIgICAgIH19IHwge3t3aGlsZSAgICAgICB9fQotICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Ci17e2FueSAgICAgfX0gfCB7e2RlZiAgICAgfX0gfCB7e3RocmVhZHNhZmV9fSB8ICAgICAgICAgICAgICAgIHwgCi17e2FzICAgICAgfX0gfCB7e2luICAgICAgfX0gfCB7e3dpdGh9fSAgICAgICB8ICAgICAgICAgICAgICAgIHwKLXt0YWJsZX0KLQotVGhlIGtleXdvcmRzIHt7YW55fX0sIHt7Y29uc3R9fSwge3tnb3RvfX0sIHt7dGhyZWFkc2FmZX19IGFuZCB7e3dpdGh9fSBhcmUgcmVzZXJ2ZWQsIAotZXZlbiB0aG91Z2ggdGhleSBhcmUgbm90IGN1cnJlbnRseSB1c2VkLiBUaGlzIG1heSBhbGxvdyBhIEdyb292eSBjb21waWxlciB0byBwcm9kdWNlIGJldHRlciBlcnJvciBtZXNzYWdlcyBpZiB0aGVzZSBrZXl3b3JkcyBpbmNvcnJlY3RseSBhcHBlYXIgaW4gcHJvZ3JhbXMuCi0KLVdoaWxlIHt7dHJ1ZX19IGFuZCB7e2ZhbHNlfX0gbWlnaHQgYXBwZWFyIHRvIGJlIGtleXdvcmRzLCB0aGV5IGFyZSB0ZWNobmljYWxseSBCb29sZWFuIGxpdGVyYWxzICgkMy4xMC4zKS4gU2ltaWxhcmx5LCB3aGlsZSB7e251bGx9fSBtaWdodCBhcHBlYXIgdG8gYmUgYSBrZXl3b3JkLCBpdCBpcyB0ZWNobmljYWxseSB0aGUgbnVsbCBsaXRlcmFsICgkMy4xMC43KS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjAxSW50cm9kdWN0aW9uIGIvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIwMUludHJvZHVjdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzZWI2YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjAxSW50cm9kdWN0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotKkNoYXB0ZXIgMSoKLQotaDEuIEludHJvZHVjdGlvbgotCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIFtJbnRyb2R1Y3Rpb258aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2ludHJvLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXSwgd2hpY2ggYmVnaW5zIGFzIGZvbGxvd3M6Ci0KLWJxLiAgVGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaXMgYSBnZW5lcmFsLXB1cnBvc2UsIGNvbmN1cnJlbnQsIGNsYXNzLWJhc2VkLCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2UuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHNpbXBsZSBlbm91Z2ggdGhhdCBtYW55IHByb2dyYW1tZXJzIGNhbiBhY2hpZXZlIGZsdWVuY3kgaW4gdGhlIGxhbmd1YWdlLiBUaGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBpcyByZWxhdGVkIHRvIEMgYW5kIEMrKyBidXQgaXMgb3JnYW5pemVkIHJhdGhlciBkaWZmZXJlbnRseSwgd2l0aCBhIG51bWJlciBvZiBhc3BlY3RzIG9mIEMgYW5kIEMrKyBvbWl0dGVkIGFuZCBhIGZldyBpZGVhcyBmcm9tIG90aGVyIGxhbmd1YWdlcyBpbmNsdWRlZC4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgYSBwcm9kdWN0aW9uIGxhbmd1YWdlLCBub3QgYSByZXNlYXJjaCBsYW5ndWFnZSwgYW5kIHNvLCBhcyBDLiBBLiBSLiBIb2FyZSBzdWdnZXN0ZWQgaW4gaGlzIGNsYXNzaWMgcGFwZXIgb24gbGFuZ3VhZ2UgZGVzaWduLCB0aGUgZGVzaWduIGhhcyBhdm9pZGVkIGluY2x1ZGluZyBuZXcgYW5kIHVudGVzdGVkIGZlYXR1cmVzLgotCi1UTyBETzogYWRkIHNvbWUgd29yZHMgY29uY2VybmluZyBHcm9vdnkncyBkZXNpZ24gZ29hbHMuCi0KLUdyb292eSBpcyBzcGVjaWZpZWQgYXMgYSBzZXQgb2YgbW9kaWZpY2F0aW9ucyB0byB0aGUgdGV4dCBvZiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXS4gRWFjaCBjaGFwdGVyIG9mIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gKEpMUykgaGFzIGEgcGFyYWxsZWwgY2hhcHRlciBpbiB0aGUgR0xTLiBXaXRoaW4gZWFjaCBjaGFwdGVyLCBlYWNoIHNlY3Rpb24gb2YgdGhlIEpMUyBoYXMgYSBwYXJhbGxlbCBzZWN0aW9uIGluIHRoZSBHTFMsIGFsdGhvdWdoIHRoZSBHTFMgYWxzbyBjb250YWlucyBhZGRpdGlvbmFsIHNlY3Rpb25zLgotCi1UbyBhaWQgdW5kZXJzdGFuZGluZywgZWFjaCBtb2RpZmljYXRpb24gdG8gdGhlIHRleHQgb2YgdGhlIEpMUyBpcyBkZXNjcmliZWQgYXMgYW4gX0FkZGl0aW9uXywgX0RlbGV0aW9uXyBvciBfQ2hhbmdlXy4gV2hlcmUgYSBHTFMgc2VjdGlvbiBpcyBtYXJrZWQgInVuY2hhbmdlZCIsIGl0IG1lYW5zIHRoZSBKTFMgc2VjdGlvbiBkZXNjcmliZXMgR3Jvb3Z5IGFzIHdlbGwgYXMgSmF2YS4gU29tZSBzdWJzZWN0aW9ucyBvZiB0aGUgR0xTIGFsc28gaG9sZCBleHBsYW5hdG9yeSB0ZXh0LgotCi17YW5jaG9yOjEuMX0KLWgyLiAxLjEgRXhhbXBsZSBQcm9ncmFtcwotKENmLiA/P1tKTFMuICYjMTY3OzEuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW50cm8uZG9jLmh0bWwjMTE0ODRdPz8uKQotCi1VbmNoYW5nZWQuCi0KLXthbmNob3I6MS4yfQotaDIuIDEuMiBOb3RhdGlvbgotKENmLiA/P1tKTFMuICYjMTY3OzEuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW50cm8uZG9jLmh0bWwjMTE1MDZdPz8uKQotCi1VbmNoYW5nZWQuCi0KLXthbmNob3I6MS4zfQotaDIuIDEuMyBSZWxhdGlvbnNoaXAgdG8gUHJlZGVmaW5lZCBDbGFzc2VzIGFuZCBJbnRlcmZhY2VzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MS4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9pbnRyby5kb2MuaHRtbCMyNDgxMDRdPz8uKQotCi1fQWRkaXRpb25fOiBBcyBzb21lIGNsYXNzZXMgaGF2ZSBhIHNwZWNpYWwgcmVsYXRpb24gc2hpcCB3aXRoIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLCB0aGVyZSBhcmUgb3RoZXIgY2xhc3NlcyB0aGF0IGhhdmUgYSBzcGVjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBHcm9vdnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG5vdGFibHkgdGhvc2UgaW4gdGhlIHt7Z3Jvb3Z5Lmxhbmd9fSBwYWNrYWdlLgotCi0KLXthbmNob3I6MS40fQotaDIuIDEuNCBSZWZlcmVuY2VzIAotKENmLiA/P1tKTFMuICYjMTY3OzEuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW50cm8uZG9jLmh0bWwjMjQ3OTgwXT8/LikKLQotVE8gRE8KLQotCi0tLS0tCi1TcGVjaWZpY2F0aW9uIFtUYWJsZSBvZiBDb250ZW50c3xpbmRleC5odG1sXS4KLQotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBbSW50cm9kdWN0aW9ufGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9pbnRyby5kb2MuaHRtbF0gaW4gdGhlIFtKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvai50aXRsZS5kb2MuaHRtbF0uCi0KLVRoZSBvcmlnaW5hbCBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgYXQgW2h0dHA6Ly9kb2NzLmNvZGVoYXVzLm9yZy9kaXNwbGF5L0dyb292eUpTUl0uCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjAzTGV4aWNhbCBiL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMDNMZXhpY2FsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZjODZmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMDNMZXhpY2FsCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLSpDaGFwdGVyIDMqCi0KLWgxLiBMZXhpY2FsIFN0cnVjdHVyZQotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBjaGFwdGVyIG9uIFtMZXhpY2FsIFN0cnVjdHVyZXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbF0gaW4gdGhlIFtKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvai50aXRsZS5kb2MuaHRtbF0sIHdoaWNoIGJlZ2lucyBhcyBmb2xsb3dzOgotCi1icS4gVGhpcyBjaGFwdGVyIHNwZWNpZmllcyB0aGUgbGV4aWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0KLWJxLiBQcm9ncmFtcyBhcmUgd3JpdHRlbiBpbiBVbmljb2RlIChbJiMxNjc7My4xfENoYXB0ZXIwM0xleGljYWwuaHRtbCMzLjFdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzk1NDEzXSksIGJ1dCBsZXhpY2FsIHRyYW5zbGF0aW9ucyBhcmUgcHJvdmlkZWQgKFsmIzE2NzszLjJ8Q2hhcHRlcjAzTGV4aWNhbC5odG1sIzMuMl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjOTU1MDRdKSBzbyB0aGF0IFVuaWNvZGUgZXNjYXBlcyAoWyYjMTY3OzMuM3xDaGFwdGVyMDNMZXhpY2FsLmh0bWwjMy4zXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMxMDA4NTBdKSBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIGFueSBVbmljb2RlIGNoYXJhY3RlciB1c2luZyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMuIExpbmUgdGVybWluYXRvcnMgYXJlIGRlZmluZWQgKFsmIzE2NzszLjR8Q2hhcHRlcjAzTGV4aWNhbC5odG1sIzMuNF0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjMxNTcxXSkgdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW50IGNvbnZlbnRpb25zIG9mIGV4aXN0aW5nIGhvc3Qgc3lzdGVtcyB3aGlsZSBtYWludGFpbmluZyBjb25zaXN0ZW50IGxpbmUgbnVtYmVycy4KLQotYnEuIFRoZSBVbmljb2RlIGNoYXJhY3RlcnMgcmVzdWx0aW5nIGZyb20gdGhlIGxleGljYWwgdHJhbnNsYXRpb25zIGFyZSByZWR1Y2VkIHRvIGEgc2VxdWVuY2Ugb2YgaW5wdXQgZWxlbWVudHMgKFsmIzE2NzszLjV8Q2hhcHRlcjAzTGV4aWNhbC5odG1sIzMuNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjU2ODddKSwgd2hpY2ggYXJlIHdoaXRlIHNwYWNlIChbJiMxNjc7My42fENoYXB0ZXIwM0xleGljYWwuaHRtbCMzLjZdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzk1NzEwXSksIGNvbW1lbnRzIChbJiMxNjc7My43fENoYXB0ZXIwM0xleGljYWwuaHRtbCMzLjddLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzQ4MTI1XSksIGFuZCB0b2tlbnMuIFRoZSB0b2tlbnMgYXJlIHRoZSBpZGVudGlmaWVycyAoWyYjMTY3OzMuOHxDaGFwdGVyMDNMZXhpY2FsLmh0bWwjMy44XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM0MDYyNV0pLCBrZXl3b3JkcyAoWyYjMTY3OzMuOXxDaGFwdGVyMDNMZXhpY2FsLmh0bWwjMy45XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMjkzMDhdKSwgbGl0ZXJhbHMgKFsmIzE2NzszLjEwfENoYXB0ZXIwM0xleGljYWwuaHRtbCMzLjEwXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM0ODI3Ml0pLCBzZXBhcmF0b3JzIChbJiMxNjc7My4xMXxDaGFwdGVyMDNMZXhpY2FsLmh0bWwjMy4xMV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjMwNzUyXSksIGFuZCBvcGVyYXRvcnMgKFsmIzE2NzszLjEyfENoYXB0ZXIwM0xleGljYWwuaHRtbCMzLjEyXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMzA2NjNdKSBvZiB0aGUgc3ludGFjdGljIGdyYW1tYXIuCi0KLXthbmNob3I6My4xfQotaDIuIDMuMSBVbmljb2RlCi0oQ2YuID8/W0pMUy4gJiMxNjc7My4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzk1NDEzXT8/LikKLQotX0RlbGV0aW9uOl8gR3Jvb3Z5IGhhcyBubyBjaGFyYWN0ZXIgbGl0ZXJhbHMuCi0KLXthbmNob3I6My4yfQotaDIuIDMuMiBMZXhpY2FsIFRyYW5zbGF0aW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzMuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM5NTUwNF0/Py4pCi0KLVVuY2hhbmdlZC4KLQote2FuY2hvcjozLjN9Ci1oMi4gMy4zIFVuaWNvZGUgRXNjYXBlcwotKENmLiA/P1tKTFMuICYjMTY3OzMuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMxMDA4NTBdPz8uKQotCi1VbmNoYW5nZWQuCi0KLXthbmNob3I6My40fQotaDIuIDMuNCBMaW5lIFRlcm1pbmF0b3JzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIzMTU3MV0/Py4pCi0KLVVuY2hhbmdlZC4KLQote2FuY2hvcjozLjV9Ci1oMi4gMy41IElucHV0IEVsZW1lbnRzIGFuZCBUb2tlbnMKLShDZi4gPz9bSkxTLiAmIzE2NzszLjV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjU2ODddPz8uKQotCi1fQWRkaXRpb246XyBUaGUgZGVmaW5pdGlvbiBvZiBfVG9rZW5fIGluY2x1ZGVzIF9TdHJpbmdDb25zdHJ1Y3Rvcl8sIGFzIHNob3duIGJlbG93LgotCi17Y29kZX0KLVRva2VuOgotICAgIElkZW50aWZpZXIKLSAgICBLZXl3b3JkCi0gICAgTGl0ZXJhbAotICAgIFN0cmluZ0NvbnN0cnVjdG9yCi0gICAgU2VwYXJhdG9yCi0gICAgT3BlcmF0b3IKLXtjb2RlfQotCi1JdCBpcyBhbHNvIG5vdGVkIHRoYXQgbGluZSB0ZXJtaW5hdG9ycyAoYXMgZGVmaW5lZCBieSBbJiMxNjc7My40fCMzLjRdKSBtYXkgYmUgY2xhc3NpZmllZCBhcyBlaXRoZXIgc2VwYXJhdG9ycyAoWyYjMTY3OzMuMTF8IzMuMTFdKSBvciB3aGl0ZSBzcGFjZSAoWyYjMTY3OzMuNnwjMy42XSksIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgWyYjMTY3OzMuMTF8IzMuMTFdLgotCi17YW5jaG9yOjMuNn0KLWgyLiAzLjYgV2hpdGUgU3BhY2UKLShDZi4gPz9bSkxTLiAmIzE2NzszLjZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjOTU3MTBdPz8uKQotCi1fQWRkaXRpb246XyBTb21lIGxpbmUgdGVybWluYXRvcnMgYXJlIHRyYW5zZm9ybWVkIGludG8gc2VwYXJhdG9ycywgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZWZpbmVkIGluIFsmIzE2NzszLjExfCMzLjExXSwgYmVsb3cuCi0KLXthbmNob3I6My43fQotaDIuIDMuNyBDb21tZW50cwotKENmLiA/P1tKTFMuICYjMTY3OzMuN3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM5NzI0XT8/LikKLQotX0FkZGl0aW9uXzogSWYgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzIG9mIGEgR3Jvb3Z5IHByb2dyYW0gYXJlIHRoZSBBU0NJSSBzaGFycCBzaWduIGFuZCBleGNsYW1hdGlvbiBwb2ludCAoJyMnIGZvbGxvd2VkIGJ5ICchJyksIHRoZSB3aG9sZSBsaW5lIGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50LiAgSW4gb3RoZXIgd29yZHMsIHRoZSBwcm9ncmFtIGlzIHRyZWF0ZWQgZXhhY3RseSBhcyBpZiB0d28gc2xhc2ggY2hhcmFjdGVycyAoJy8vJykgd2VyZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHNoYXJwIHNpZ24uICBUaGlzIHVudXN1YWwgcnVsZSBtYWtlcyBpdCBlYXNpZXIgdG8gd3JpdGUgR3Jvb3Z5IHNjcmlwdHMgb24gc29tZSBzeXN0ZW1zLgotCi1fQWRkaXRpb25fOiBOb3RlIHRoYXQgdGhlIG5ld2xpbmUgdGVybWluYXRpbmcgYW4gImVuZCBvZiBsaW5lIiBjb21tZW50IGNhbiBiZSBzaWduaWZpY2FudC4KLQotCi17YW5jaG9yOjMuOH0KLWgyLiAzLjggSWRlbnRpZmllcnMKLShDZi4gPz9bSkxTLiAmIzE2NzszLjh8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjNDA2MjVdPz8uKQotCi1fQ2hhbmdlOl8gR3Jvb3Z5IGlkZW50aWZpZXJzIGRpZmZlciBmcm9tIEphdmEgaWRlbnRpZmllcnMgaW4gdGhhdCB0aGUgQVNDSUkgZG9sbGFyIGNoYXJhY3RlciAnJCcgaXMgbm90IGEgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXIuIAotCi1Ob3RlIHRoYXQgR3Jvb3Z5IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHVzZSBhbnkgVW5pY29kZSBzdHJpbmcgYXMgYSBuYW1lLiBUaGlzIGlzIHJlc3RyaWN0aW9uIGFwcGxpZXMgaW4gcHJhY3RpY2Ugb25seSB0byB0aGUgc3BlbGxpbmcgb2YgdW5xdWFsaWZpZWQgbmFtZXMsIHNpbmNlIEdyb292eSBwcm92aWRlcyBhIHdheSB0byB1c2UgYW55IFVuaWNvZGUgc3RyaW5nIHdoYXRldmVyIGFzIGEgbWVtYmVyIG5hbWUuIChTZWUgW0NoYXB0ZXIgNnxDaGFwdGVyMDZOYW1lcy5odG1sXS4pCi0KLShUaGUgZG9sbGFyIHNpZ24gaXMgc29tZXRpbWVzIHVzZWQgaW50ZXJuYWxseSBieSBHcm9vdnkgdG8gbWFuZ2xlIG5vbi1KYXZhIGlkZW50aWZpZXJzIHdoaWNoIG11c3QgYmUgY29udmVydGVkIHRvIEphdmEgbmFtZXMuIEZvciB0aGlzIHJlYXNvbiwgaXQgd291bGQgYmUgY29uZnVzaW5nIHRvIGFsbG93IHVuZXNjYXBlZCBkb2xsYXIgc2lnbnMgYXMgR3Jvb3Z5IGlkZW50aWZpZXIgY29uc3RpdHVlbnRzLikKLQote2FuY2hvcjozLjl9Ci1oMi4gMy45IEtleXdvcmRzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My45fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIyOTMwOV0/Py4pCi0KLV9BZGRpdGlvbjpfIFRoZSBmb2xsb3dpbmcgQVNDSUkgY2hhcmFjdGVyIHNlcXVlbmNlcyBhcmUga2V5d29yZHMgaW4gR3Jvb3Z5IGJ1dAotbm90IGluIEphdmE6Ci17dGFibGV9Ci0gYW55IHwgYXMgfCBkZWYgfCBpbiB8IHdpdGgKLXt0YWJsZX0KLQotX0FkZGl0aW9uOl8gSW4gYWRkaXRpb24gdG8ge3tjb25zdH19IGFuZCB7e2dvdG99fSwgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBhcmUgcmVzZXJ2ZWQgaW4gR3Jvb3Z5LCBidXQgYXJlIG5vdCBjdXJyZW50bHkgdXNlZC4gCi17dGFibGV9Ci0gIGRvICB8ICBzdHJpY3RmcCAgCi17dGFibGV9Ci0KLXthbmNob3I6My4xMH0KLWgyLiAzLjEwIExpdGVyYWxzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My4xMHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMjg3OTRdPz8uKQotCi1fQ2hhbmdlXzogQSBsaXRlcmFsIGlzIHRoZSBzb3VyY2UgY29kZSByZXByZXNlbnRhdGlvbiBvZiBhIHZhbHVlIG9mIGEgbnVtZXJpYyB0eXBlIChbJiMxNjc7My4xMC4xfCMzLjEwLjFdIGFuZCBbJiMxNjc7My4xMC4yfCMzLjEwLjJdKSwgdGhlIGJvb2xlYW4gdHlwZSAoWyYjMTY3OzMuMTAuM3wjMy4xMC4zXSksIHRoZSBzdHJpbmcgdHlwZSAoWyYjMTY3OzMuMTAuNXwjMy4xMC41XSksIG9yIHRoZSBudWxsIHR5cGUgKFsmIzE2NzszLjEwLjd8IzMuMTAuN10pLiBTdHJpbmcgY29uc3RydWN0b3JzIChbJiMxNjc7My4xMC41LjF8IzMuMTAuNS4xXSkgYXJlIGNsb3NlbHkgcmVsYXRlZCB0byBzdHJpbmcgbGl0ZXJhbHMgYW5kIG1heSBjb250YWluIG5vbi1jb25zdGFudCBwYXJ0cy4gR3Jvb3Z5IGFsc28gYnVpbGRzIG9uIHRoZSBKYXZhIG51bWVyaWMgbGl0ZXJhbCBzeW50YXhlcyB0byBzdXBwb3J0IGxpdGVyYWwgY29uc3RhbnRzIG9mIHR5cGUge3tCaWdJbnRlZ2VyfX0gYW5kIHt7QmlnRGVjaW1hbH19LgotCi17YW5jaG9yOjMuMTAuMX0KLWgzLiAzLjEwLjEgSW50ZWdlciBMaXRlcmFscwotKENmLiA/P1tKTFMuICYjMTY3OzMuMTAuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM0Njc1MF0/Py4pCi0KLVRoZSBwcm9kdWN0aW9uIHt7SW50ZWdlclR5cGVTdWZmaXg6IGcgR319IGlzIGFkZGVkLCBhbGxvd2luZyB7e0JpZ0ludGVnZXJ9fSBjb25zdGFudHMuCi0KLVRPIERPOiAgMTIzaSBhbGxvd2VkPyAgT3RoZXIgbGl0ZXJhbCBzeW50YXhlcz8KLQotQmVjYXVzZSBudW1iZXJzIGFyZSBvYmplY3RzIGluIEdyb292eSwKLW51bWVyaWMgbGl0ZXJhbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGJlZ2luIG9yIGVuZCB3aXRoIGFkZWNpbWFsIHBvaW50LgotSmF2YSBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBzdWNoIGFzIHt7LjAxfX0sIHt7MS5mfX0sIGFuZCB7ezEuZTEwfX0gbXVzdCBiZSBwYWRkZWQgd2l0aCB6ZXJvIGRpZ2l0cywKLWFzIGluIHt7MC4wMX19LCB7ezEuMGZ9fSwgYW5kIHt7MS4wZTEwfX0uCi0KLXtjb2RlfQotYXNzZXJ0ICcxMjMnID09IDEyMy50b1N0cmluZwotYXNzZXJ0ICcxLjIzJyA9PSAxLjIzLnRvU3RyaW5nCi17Y29kZX0KLQote2FuY2hvcjozLjEwLjJ9Ci1oMy4gMy4xMC4yIEZsb2F0aW5nLVBvaW50IExpdGVyYWxzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My4xMC4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIzMjA5NV0/Py4pCi0KLVRoZSBwcm9kdWN0aW9uIHt7RmxvYXRUeXBlU3VmZml4OiBnIEd9fSBpcyBhZGRlZCwgYWxsb3dpbmcge3tCaWdEZWNpbWFsfX0gY29uc3RhbnRzLgotCi17YW5jaG9yOjMuMTAuM30KLWgzLiAzLjEwLjMgQm9vbGVhbiBMaXRlcmFscwotKENmLiA/P1tKTFMuICYjMTY3OzMuMTAuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCM0OTY1Ml0/Py4pCi0KLVVuY2hhbmdlZC4KLQote2FuY2hvcjozLjEwLjR9Ci1oMy4gMy4xMC40IENoYXJhY3RlciBMaXRlcmFscwotKENmLiA/P1tKTFMuICYjMTY3OzMuMTAuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMxMDA5NjRdPz8uKQotCi1EZWxldGlvbjogR3Jvb3Z5IGhhcyBubyB7e0NoYXJhY3RlckxpdGVyYWx9fSB0b2tlbi4gIEFsbCBsaXRlcmFscyB3aXRoIGNoYXJhY3RlciBkYXRhIGluIHRoZW0gZGVub3RlIHN0cmluZ3MuICBDb25zdGFudCBzdHJpbmdzIG9mIHVuaXQgbGVuZ3RoIHNlcnZlIGluIHRoZSBwbGFjZSBvZiBjaGFyYWN0ZXIgbGl0ZXJhbHMsIHNpbmNlIHRoZXkgY29lcmNlIHByb3Blcmx5IHRvIGNoYXJhY3RlciBjb25zdGFudHMuCi0KLVRPRE86IGluY2x1ZGUgcmVmZXJlbmNlIHRvIHNlY3Rpb24gb2YgQ2hhcHRlciA1ICJDb252ZXJzaW9ucyIgdGhhdCBzcGVjaWZ5cyB0aGF0IHVuaXQgbGVuZ3RoIHN0cmluZ3MgY29vcmNlIHRvIGNoYXJhY3RlcnMKLQote2FuY2hvcjozLjEwLjV9Ci1oMy4gMy4xMC41IFN0cmluZyBMaXRlcmFscwotKENmLiA/P1tKTFMuICYjMTY3OzMuMTAuNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMxMDEwODRdPz8uKQotCi1fQ2hhbmdlOl8gVGhlIGZvbGxvd2luZyB0ZXh0IGNvbXBsZXRlbHkgcmVwbGFjZXMgW0pMUy4gJiMxNjc7My4xMC41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzEwMTA4NF0sIGFuZCBhZGRzICYjMTY3OzMuMTAuNS4xLgotCi1Hcm9vdnkgc3RyaW5nIGxpdGVyYWxzIGhhdmUgYSBzeW50YXggaW5zcGlyZWQgYnkgb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEEgc3RyaW5nIGxpdGVyYWwgbWF5IGJlIGRlbGltaXRlZCBieSBzaW5nbGUgb3IgZG91YmxlLiAgV2hlbiBmb2xsb3dpbmcgY2VydGFpbiBvcGVyYXRvcnMgYW5kIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMsIGEgc3RyaW5nIGxpdGVyYWwgbWF5IGFsc28gYmUgZGVsaW1pdGVkIGJ5IGZvcndhcmQtc2xhc2ggY2hhcmFjdGVycywgaW4gd2hpY2ggY2FzZSBpdCBpcyBhbHNvIGNhbGxlZCBhID8/cmVndWxhciBleHByZXNzaW9uIGxpdGVyYWw/Py4KLQotRG91YmxlLXF1b3RlZCBsaXRlcmFscyBhbmQgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxzIG1heSBpbmNvcnBvcmF0ZSBzdWJzdHJpbmcgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25zLCB3aGljaCBhcmUgaW50cm9kdWNlZCBieSB1bmVzY2FwZWQgZG9sbGFyIHNpZ25zLCBhbmQgdGhlc2UgYXJlIHNwZWNpZmllZCBieSBbJiMxNjc7My4xMC41LjF8IzMuMTAuNS4xXSwgYmVsb3cuCi0KLUluZGVwZW5kZW50bHksIHNpbmdsZSBvciBkb3VibGUgcXVvdGUgbWFya3MgbWF5IGJlIHRyaXBsZWQsIGFsbG93aW5nIHRoZSBzdHJpbmcgdG8gc3BhbiBtdWx0aXBsZSBsaW5lcy4gIFdoZW5ldmVyIHN0cmluZyBkZWxpbWl0ZXJzIGFyZSB1c2VkIHNpbmdseSwgdGhlIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gYW4gdW5lc2NhcGVkIGxpbmUgdGVybWluYXRvci4KLQotUmVnYXJkbGVzcyBvZiB0aGUgc3BlbGxpbmcgb2YgYSBsaW5lIHRlcm1pbmF0b3IgZm91bmQgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgb3IgY29uc3RydWN0b3IsIGl0IGlzIGFsd2F5cyB0YWtlbiB0byByZXByZXNlbnQgYSBuZXdsaW5lIGNoYXJhY3RlciwgcmVnYXJkbGVzcyBvZiB0aGUgbG9jYWwgbmV3bGluZSBjb252ZW50aW9ucy4KLQotVG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBjb21tZW50IHN5bnRheGVzLCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIGNhbm5vdCBiZSBlbXB0eSBhbmQgY2Fubm90IGJlZ2luIHdpdGggYSBzdGFyIGNoYXJhY3Rlci4gVGhlcmUgaXMgYWxzbyBhIHBvdGVudGlhbCBjb25mbGljdCB3aXRoIGRpdmlzaW9uIG9wZXJhdG9ycyAodGhvc2UgYmVnaW5uaW5nIHdpdGggYSBmb3J3YXJkIHNsYXNoKS4gRGl2aXNpb24gb3BlcmF0b3JzIGFyZSBvbmx5IHJlY29nbml6ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnM6ICBJZGVudGlmaWVycywga2V5d29yZHMsIG51bWVyaWMgYW5kIHN0cmluZyBjb25zdGFudHMsIHJpZ2h0IGJyYWNrZXRzLCBhbmQgdW5hcnkgaW5jcmVtZW50IG9wZXJhdG9ycyAoe3srK319LCB7ey0tfX0pLiAgQW55IGFtb3VudCBvZiB3aGl0ZXNwYWNlIGFuZCBsaW5lIHRlcm1pbmF0b3JzIG1heSBhbHNvIG9jY3VyIGJlZm9yZSBhIGRpdmlzaW9uIG9wZXJhdG9yLgotSW4gb3RoZXIgY29udGV4dHMsIGEgc2xhc2ggaW50cm9kdWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsLgotCi0oTm90ZTogIFRoZSBncmFtbWFyIG9mIHNpbmdsZS1xdW90ZWQgYW5kIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBkaWZmZXJzIG9ubHkgaW4gdGhlaXIgcHJvY2Vzc2luZyBvZiBsaW5lIHRlcm1pbmF0b3JzLiBXZSBleHByZXNzIHRoaXMgYnkgbWVhbnMgb2YgYSBncmFtbWF0aWNhbCBwYXJhbWV0ZXIge3tMVH19LCB3aGljaCBpcyB0cnVlIGlmIGxpbmUgdGVybWluYXRvcnMgYXJlIGFsbG93ZWQuKQotCi17Y29kZX0KLVN0cmluZ0xpdGVyYWw6Ci0gIFwnICAgKENTdHJpbmdDaGFyYWN0ZXJbTFQ9ZmFsc2VdKSogICBcJwotICBcIiAgIChEU3RyaW5nQ2hhcmFjdGVyW0xUPWZhbHNlXSkqICAgXCIKLSAgXCdcJ1wnIChDU3RyaW5nQ2hhcmFjdGVyW0xUPXRydWVdIChcJyk/IChcJyk/ICkqICBcJ1wnXCcKLSAgXCJcIlwiIChEU3RyaW5nQ2hhcmFjdGVyW0xUPXRydWVdIChcIik/IChcIj8pICkqIFwiXCJcIgotICBcLyAgIChSU3RyaW5nQ2hhcmFjdGVyIChcKikqKSsgICBcLwotCi1DU3RyaW5nQ2hhcmFjdGVyW0xUXToKLSAgSW5wdXRDaGFyYWN0ZXIgYnV0IG5vdCBcJyBvciBcXFwKLSAgRXNjYXBlU2VxdWVuY2VbTFRdCi0gIExpbmVUZXJtaW5hdG9yICB3aGVuKExUKQotCi1EU3RyaW5nQ2hhcmFjdGVyW0xUXToKLSAgSW5wdXRDaGFyYWN0ZXIgYnV0IG5vdCBcIiBvciBcXFwgb3IgXCQKLSAgRXNjYXBlU2VxdWVuY2VbTFRdCi0gIExpbmVUZXJtaW5hdG9yICB3aGVuKExUKQotCi1Fc2NhcGVTZXF1ZW5jZVtMVF06ICAoVXNlIHRoZSBKYXZhIEVzY2FwZVNlcXVlbmNlIGRlZmluaXRpb24sIHBsdXMgdGhlIGZvbGxvd2luZyBwcm9kdWN0aW9ucykKLSAgXFxcIFwkCi0gIFxcXCBMaW5lVGVybWluYXRvcgotCi1SU3RyaW5nQ2hhcmFjdGVyOgotICBJbnB1dENoYXJhY3RlciBidXQgbm90IGEgY2xvc2luZyBxdW90ZSBvciBcXFwgb3IgXCQKLSAgUlN0cmluZ0VzY2FwZQotCi1SU3RyaW5nRXNjYXBlOgotICBcJCAodW5sZXNzIHBhcnQgb2YgYSBtYXRjaCBmb3IgR1N0cmluZ1ZhbHVlUGFydCkKLSAgXFxcIExpbmVUZXJtaW5hdG9yCi0gIFxcXCBJbnB1dENoYXJhY3RlciAoYnV0IG5vdCBcciBvciBcbikKLXtjb2RlfQotCi1Ob3RlIHRoYXQgYSB0cmlwbGUtcXVvdGVkIHN0cmluZyBtYXkgY29udGFpbiBpc29sYXRlZCBzaW5nbGUgb3IgZG91YmxlIG9jY3VycmVuY2VzIG9mIGl0cyBjbG9zZS1xdW90ZS4gRm9yIGV4YW1wbGU6Ci17Y29kZX0gICAKLWFzc2VydCAiIiJ4IiIiID09ICd4JwotYXNzZXJ0ICIiIiIiIiA9PSAnJwotYXNzZXJ0ICcnJycnIicnJyA9PSAiJyciICsgJyInCi17Y29kZX0KLQote2FuY2hvcjozLjEwLjUuMX0KLWgzLiAzLjEwLjUuMSBTdHJpbmcgQ29uc3RydWN0b3JzCi0KLUlmIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcgbGl0ZXJhbCBvciByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCBjb250YWlucyBhbiB1bmVzY2FwZWQgZG9sbGFyIGNoYXJhY3RlciAoJyQnKSwgdGhlbiBpdCBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbCwgYnV0IHJhdGhlciBhID8/c3RyaW5nIGNvbnN0cnVjdG9yPz8sIHdoaWNoIGlzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIHRoYXQgY29tcHJpc2UgYW4gZXhwcmVzc2lvbiBmb3IgYSBzdHJpbmcgY29udGFpbmluZyBjb25zdGFudCBhbmQgbm9uLWNvbnN0YW50IHBhcnRzLgotRWFjaCB1bmVzY2FwZWQgZG9sbGFyIGNoYXJhY3RlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgPz92YWx1ZSBwYXJ0Pz8sIHdoaWNoIGlzIGEgR3Jvb3Z5IGV4cHJlc3Npb24gaW4gdGhlIGZvcm0gb2YgYSBuYW1lIG9yIGEgYmxvY2suCi1UaGVyZSBtYXkgYWxzbyBiZSBhIHN0YXIge3sqfX0gYmV0d2VlbiB0aGUgZG9sbGFyIGFuZCB0aGUgZXhwcmVzc2lvbiwgd2hpY2ggc2VydmVzIGFzIGEgPz9zcHJlYWQgb3BlcmF0b3I/PyB0aGF0IG1vZGlmaWVzIHRoZSBtYW5uZXIgaW4gd2hpY2ggdGhlIHZhbHVlIGlzIGluc2VydGVkLiAgKFRoZSBzZW1hbnRpY3Mgb2Ygc3ByZWFkaW5nIGFyZSBkZWZpbmVkIGJ5IHRoZSB7e0dTdHJpbmd9fSBjbGFzcyBhbmQgaXRzIHVzZXJzLikKLQotVGhlIHZhbHVlIHBhcnQgaXMgcGFyc2VkIGFuZCBldmFsdWF0ZWQgYXMgYW4gb3JkaW5hcnkgZXhwcmVzc2lvbi4KLUlmIGl0IGlzIGluIHRoZSBmb3JtIG9mIGEgYmxvY2sgd2l0aG91dCBleHBsaWNpdCBjbG9zdXJlIGFyZ3VtZW50cywgaXQgaXMgdGFrZW4gdG8gYmUgYSBjbG9zdXJlIG9mIG5vIHBhcmFtZXRlcnMsIGFuZCBpcyBpbW1lZGlhdGVseSBjYWxsZWQuICBJbiB0aGUgc2ltcGxlc3QgY2FzZSwgYW4gZXhwcmVzc2lvbiBzdXJyb3VuZGVkIGJ5IGJyYWNlcyBzdGFuZHMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCi1BcGFydCBmcm9tIHN1Y2ggZG9sbGFycyBhbmQgdmFsdWUgcGFydHMsIGV2ZXJ5IG90aGVyIGNoYXJhY3RlciBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZyBxdW90ZXMgaXMgdHJlYXRlZCBhcyBpbiB0aGUgY2FzZSBvZiBub3JtYWwgc3RyaW5nIGxpdGVyYWxzLgotCi1UaHVzLCBzdHJpbmcgY29uc3RydWN0b3IgZXhwcmVzc2lvbiBjb25zaXN0cyBvZiBhbHRlcm5hdGluZyBsaXRlcmFsIHBhcnRzIGFuZCB2YWx1ZXMuCi1EdXJpbmcgdGhlIHRva2VuaXphdGlvbiBwaGFzZSBvZiB0cmFuc2xhdGlvbiwgdGhlIGVuZCBvZiBhIGxpdGVyYWwgcGFydCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvY2N1cnJlbmNlIG9mIGFuIHVuZXNjYXBlZCBkb2xsYXIgY2hhcmFjdGVyLCBvciAoYXQgdGhlIGVuZCkgYnkgdGhlIGFwcHJvcHJpYXRlIGNsb3NpbmcgcXVvdGUuCi1UaGUgZW5kIG9mIGEgdmFsdWUgcGFydCBpcyBkZXRlcm1pbmVkIGVpdGhlciBieSBlYWdlcmx5IHBhcnNpbmcgYSBzZXJpZXMgb2YgZG90LXNlcGFyYXRlZCBpZGVudGlmaWVycywgb3IgYnkgcGFyc2luZyBhIGJsb2NrLCB3aXRoIGl0cyBiYWxhbmNlZCBjdXJseSBicmFjZXMuCi0KLUluIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcgY29uc3RydWN0b3IsIGFuIHVuZXNjYXBlZCBkb2xsYXIgc2lnbiBtdXN0IGJlIGZvbGxvd2VkIGVpdGhlciBieSBhIGRvdC1zZXBhcmF0ZWQgc2VyaWVzIG9mIGtleXdvcmRzIG9yIGlkZW50aWZpZXJzLCBvciBieSBhIGJsb2NrLgotSW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCwgaWYgYSBkb2xsYXIgc2lnbiBpcyBub3QgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBjaGFyYWN0ZXIgb3IgYSBsZWZ0IGN1cmx5IGJyYWNlLCBwZXJoYXBzIGFmdGVyIGFuIGludGVydmVuaW5nIHN0YXIsIHRoZSBkb2xsYXIgaXMgZGVlbWVkIHRvIGJlIGVzY2FwZWQuCi0oTm90ZSB0aGF0IGluIHN0YW5kYXJkIHJlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXhlcywgdGhlIGRvbGxhciBzaWduIGlzIG5ldmVyIG1lYW5pbmdmdWxseSBmb2xsb3dlZCBieSBhIHN0YXIsIGEgYnJhY2UsIG9yIGEgbGV0dGVyLCBzbyB0aGVzZSBub3RhdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlIGFzIHN0cmluZyBjb25zdHJ1Y3RvciB2YWx1ZSBwYXJ0cy4pCi0KLXtjb2RlfQotU3RyaW5nIHggPSAiWCIKLWRlZiB4eCA9IFtsZW5ndGg6MV0KLWFzc2VydCAiJHgiID09IHgKLWFzc2VydCAiJHt4fSIgPT0geAotYXNzZXJ0ICIke3h9byR4IiA9PSAiWG9YIgotYXNzZXJ0ICJcXFwkeCIgPT0gJyQnKyd4JwotYXNzZXJ0ICIkeHgubGVuZ3RoIiA9PSAiMSIKLWFzc2VydCAiJHh4Lmxlbmd0aC4iID09ICIxLiIKLWFzc2VydCAiJHh4Lmxlbmd0aCgpIiA9PSAiMSgpIgotYXNzZXJ0ICIkeHgubGVuZ3RoKzIiID09ICIxKzIiCi1hc3NlcnQgIiR4eCAuIGxlbmd0aCIgPT0gIltsZW5ndGg6MV0gLiBsZW5ndGgiCi1hc3NlcnQgInpYWTsiID09ICIiInokewotICAgIFN0cmluZyB5ID0gIlkiCi0gICAgKCIkeCR5IikgfTsiIiIgYXMgU3RyaW5nCi1hc3NlcnQgJ0VVT1VBRScubWF0Y2hlcygvXlthZWlvdV0qJC8pCi1hc3NlcnQgJ2Zvb3RiYWxsJy5yZXBsYWNlQWxsKC9mb28vLCAiQmFyIikuc3RhcnRzV2l0aCgnQmFydCcpCi17Y29kZX0KLQotVGhlIHByb2Nlc3Mgb2YgcGFyc2luZyBhbiBlbWJlZGRlZCBibG9jayBtYXkgYmUgdmlld2VkIGFzIGFuIGFwcHJveGltYXRlIHBhcnNlIHdoaWNoIGF0dGVuZHMgb25seSB0byB0aGUgYmFsYW5jaW5nIG9mIGN1cmx5IGJyYWNlIHRva2Vucy4KLShTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgYWJsZSB0byBwZXJmb3JtIHN0cmluZyBjb25zdHJ1Y3RvciB0b2tlbml6YXRpb24gYW5kIHBhcnNpbmcgaW4gb25lIGNvcm91dGluZWQgcGFzcywgYnV0IHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgdGhpcy4pCi1UaGUgdG9rZW5pemF0aW9uIG9mIGEgc3RyaW5nIGNvbnN0cnVjdG9yIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgb2YgYSB7e0dTdHJpbmdMZXhpY2FsRm9ybX19LgotVGhpcyBpcyBub3QgYSBwcm9kdWN0aW9uIG9mIHRoZSBHcm9vdnkgZXhwcmVzc2lvbiBncmFtbWFyLCBidXQgcmF0aGVyIGEgc3ludGF4IHdoaWNoIG11c3QgZ292ZXJuIHRoZSBzZXBhcmF0aW9uIG9mIGxpdGVyYWwgcGFydHMgZnJvbSBleHByZXNzaW9ucy4KLQotKE5vdGU6ICBUaGUgdGVybSB7e0dTdHJpbmd9fSByZWZlcnMgdG8gYSBjbGFzcyBvZiBzdHJpbmctbGlrZSBvYmplY3RzIGNyZWF0ZWQgYnkgYSBzdHJpbmcgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4pCi0KLXtjb2RlfQotR1N0cmluZ0xleGljYWxGb3JtW0xULFJFXToKLSAgR1N0cmluZ1N0YXJ0W0xULFJFXSBHU3RyaW5nVmFsdWVQYXJ0W0xULFJFXQotICAgICAgICAoR1N0cmluZ01pZGRsZVtMVCxSRV0gR1N0cmluZ1ZhbHVlUGFydFtMVCxSRV0pKgotICAgICAgICAgICAgICBHU3RyaW5nRW5kW0xULFJFXQotCi1HU3RyaW5nU3RhcnRbTFQsUkVdCi0gIFwiICAgKERTdHJpbmdDaGFyYWN0ZXJbTFRdKSogIHdoZW4oIUxUICYgIVJFKQotICBcIlwiXCIgKERTdHJpbmdDaGFyYWN0ZXJbTFRdKSogIHdoZW4oTFQgJiAhUkUpCi0gIFwvICAgKERTdHJpbmdDaGFyYWN0ZXJbTFRdKSogIHdoZW4oUkUgJiAhTFQpCi0KLUdTdHJpbmdNaWRkbGVbTFRdCi0gIChEU3RyaW5nQ2hhcmFjdGVyW0xUXSkqCi0KLUdTdHJpbmdFbmRbTFRdCi0gIChEU3RyaW5nQ2hhcmFjdGVyW0xUXSkqIFwiICAgIHdoZW4oIUxUICYgIVJFKQotICAoRFN0cmluZ0NoYXJhY3RlcltMVF0pKiBcIlwiXCIgIHdoZW4oIUxUICYgIVJFKQotICAoRFN0cmluZ0NoYXJhY3RlcltMVF0pKiBcLyAgICB3aGVuKFJFICYgIUxUKQotCi1HU3RyaW5nVmFsdWVQYXJ0W0xULFJFXToKLSAgXCQgKFwqKT8gUmF3SWRlbnRpZmllciAoIFwuIFJhd0lkZW50aWZpZXIgKSoKLSAgXCQgKFwqKT8gXHsgKEdTdHJpbmdUb2tlbltMVF0pKiBcfQotCi1HU3RyaW5nTGl0ZXJhbFBhcnRbTFQsUkVdOgotICBHU3RyaW5nU3RhcnRbTFQsUkVdCi0gIEdTdHJpbmdNaWRkbGVbTFQsUkVdCi0gIEdTdHJpbmdFbmRbTFQsUkVdCi0KLUdTdHJpbmdUb2tlbltMVCxSRV06Ci0gIElucHV0RWxlbWVudCBidXQgbm90IFx7IFx9IExpbmVUZXJtaW5hdG9yCi0gIFx7IEdTdHJpbmdUb2tlbltMVCxSRV0qIFx9Ci0gIEdTdHJpbmdMZXhpY2FsRm9ybVtMVD1mYWxzZSxSRT1mYWxzZV0KLSAgR1N0cmluZ0xleGljYWxGb3JtW0xUPWZhbHNlLFJFPXRydWVdCi0gIEdTdHJpbmdMZXhpY2FsRm9ybVtMVD10cnVlLFJFPWZhbHNlXSAgd2hlbihMVCkKLSAgTGluZVRlcm1pbmF0b3IgICAgICAgICAgICAgICAgICAgICAgICB3aGVuKExUKQotCi17Y29kZX0KLQotSW4gdGhpcyB3YXksIHN0cmluZyBjb25zdHJ1Y3RvcnMgYXJlIHJlY29nbml6ZWQgbGV4aWNhbGx5IGFzIGEgY29tcGxleCBvZiB7e0dTdHJpbmdMaXRlcmFsUGFydH19cyBhbmQgb3RoZXIgdG9rZW5zLCBhY2NvcmRpbmcgdG8gdGhlIGdyYW1tYXIgb2Yge3tHU3RyaW5nTGV4aWNhbEZvcm19fSwgd2hpY2ggZG9lcyBub3QgcmVjb2duaXplIHN0YXRlbWVudCBvciBleHByZXNzaW9uIHN0cnVjdHVyZSwgZXhjZXB0IHRvIGJhbGFuY2UgYnJhY2tldHMuCi0KLUluIHRoZSByZXN1bHRpbmcgbWl4IG9mIHRva2VucywgdGhlIHZhcmlvdXMgbGl0ZXJhbCBwYXJ0cyBhcmUgbGVmdCBhcy1pcywgZm9yIGxhdGVyIHBhcnNpbmcgYXMgYSB7e1N0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbn19IGJ5IHRoZSBncmFtbWFyLgotRWFjaCB7e1Jhd0lkZW50aWZpZXJ9fSBpcyByZWludGVycHJldGVkIGFzIGEgbm9ybWFsIHt7SWRlbnRpZmllcn19LCBvciBhcyBhIGtleXdvcmQsIGlmIGl0cyBzcGVsbGluZyBpcyByZWNvZ25pemVkIGFzIHN1Y2guCi1BdCB0aGF0IHBvaW50LCB0aGUgZG9sbGFyIHNpZ25zIGFyZSBpbnNpZ25pZmljYW50LCBidXQgYXJlIGxlZnQgaW4gdGhlIGdyYW1tYXIgZm9yIGNsYXJpdHkuCi0KLXtjb2RlfQotVG9rZW46Ci0gIEdTdHJpbmdMaXRlcmFsUGFydFtMVD1mYWxzZSxSRT1mYWxzZV0KLSAgR1N0cmluZ0xpdGVyYWxQYXJ0W0xUPXRydWUsUkU9ZmFsc2VdCi0gIEdTdHJpbmdMaXRlcmFsUGFydFtMVD1mYWxzZSxSRT10cnVlXQotCi1TdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb25bTFQsUkVdOgotICBHU3RyaW5nU3RhcnRbTFQsUkVdIFwkIEV4cHJlc3Npb24KLSAgICAgICAgKCBHU3RyaW5nTWlkZGxlW0xULFJFXSBcJCBFeHByZXNzaW9uICkqCi0gICAgICAgICAgICAgIEdTdHJpbmdFbmRbTFQsUkVdCi17Y29kZX0KLQotSWRlbnRpZmllcnMgYW5kIGRvdHMgYWZ0ZXIgYSBkb2xsYXIgc2lnbiBhcmUgcGFyc2VkIGludG8ge3tHU3RyaW5nVG9rZW59fXMgZWFnZXJseSwgZXZlbiB0aG91Z2ggdGhlaXIgY2hhcmFjdGVycyBjb3VsZCBhbHNvIGJlIHZhbGlkbHkgcGFyc2VkIGFzIHN0cmluZyBjaGFyYWN0ZXJzIGluc2lkZSBhIGZvbGxvd2luZyB7e0dTdHJpbmdWYWx1ZVBhcnR9fS4KLU5vdGUgdGhhdCBhIGRvdCBpcyB0YWtlbiB0byBiZSBwYXJ0IG9mIGFuIGVtYmVkZGVkIGV4cHJlc3Npb24gb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhIGxldHRlciBvciB1bmRlcnNjb3JlLgotQWxzbywgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhbHdheXMgaW50ZXJydXB0cyB0aGUgZWFnZXIgcGFyc2luZyBvZiBhIG5hbWUuCi0KLVdoZW4gZWFnZXJseSBwYXJzaW5nIGFuIGlkZW50aWZpZXIgYWZ0ZXIgYSBkb2xsYXIsIGtleXdvcmQgcmVjb2duaXRpb24gaXMgbm90IHBlcmZvcm1lZC4KLVRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBmcmFnbWVudCBtYXkgbm90IGJlIGFjY2VwdGVkIGFzIGEgdmFsaWQgR3Jvb3Z5IHByb2dyYW0sIGJlY2F1c2UgdGhlIHRva2VuICdpbnQnIG1heSBub3QgZm9sbG93IGEgZG90ICcuJzoKLXtjb2RlfQotICBTdHJpbmcgeCA9ICIiLCB5ID0gIiR4LmludCIKLXtjb2RlfQotCi1BIHN0cmluZyBjb25zdHJ1Y3RvciBleHByZXNzaW9uIHdoaWNoIGlzIGludHJvZHVjZWQgd2l0aCBhIHNpbmdsZSBkb3VibGUtcXVvdGUgY2hhcmFjdGVyIG9yIGZvcndhcmQtc2xhc2ggY2hhcmFjdGVyIG11c3Qgb2NjdXIgYWxsIG9uIG9uZSBsaW5lLgotSXQgaXMgYW4gZXJyb3IgZm9yIHRoZSB2YWx1ZSBwYXJ0cyBvZiBzdWNoIGFuIGV4cHJlc3Npb24gdG8gY29udGFpbiBsaW5lIHRlcm1pbmF0b3JzIG9mIGFueSBzb3J0LgotVGhlIGZvbGxvd2luZyBwcm9ncmFtIGZyYWdtZW50IG1heSBub3QgYmUgYWNjZXB0ZWQgYXMgYSB2YWxpZCBHcm9vdnkgcHJvZ3JhbSwgdW5sZXNzIHRoZSBkb3VibGUgcXVvdGVzIGFyZSB0cmlwbGVkOgote2NvZGV9Ci0gIHByaW50bG4gIkhlbGxvLCAkewotICAgICAgICAnd29ybGQnfS4iCi17Y29kZX0KLQotUmVmZXJlbmNlOiBodHRwOi8vYXJjaGl2ZS5ncm9vdnkuY29kZWhhdXMub3JnL2pzci90aHJlYWRzL2lha2JlaWVmZWRvaG1pZGRoa2VkCi0KLXthbmNob3I6My4xMC42fQotaDMuIDMuMTAuNiBFc2NhcGUgU2VxdWVuY2VzIGZvciBDaGFyYWN0ZXIgYW5kIFN0cmluZyBMaXRlcmFscwotKENmLiA/P1tKTFMuICYjMTY3OzMuMTAuNnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMzAzNTldPz8uKQotCi1XaXRoaW4gdGhlIHZhcmlvdXMga2luZHMgb2Ygc3RyaW5ncywgbW9zdCBjaGFyYWN0ZXJzIHN0YW5kIGZvciB0aGVtc2VsdmVzLCBidXQgYSBmZXcgaGF2ZSBzcGVjaWFsIGZ1bmN0aW9ucy4gIFRoZSBiYWNrc2xhc2ggY2hhcmFjdGVyIHNlcnZlcyBhcyBhbiBlc2NhcGUsIHdoaWNoIHR1cm5zIG9mZiB0aGUgc3BlY2lhbCBmdW5jdGlvbiBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3Rlci4gIEluIHF1b3RlZCBzdHJpbmcgbGl0ZXJhbHMsIGFuIGVzY2FwaW5nIGJhY2tzbGFzaCBpdHNlbGYgaXMgcmVtb3ZlZCwgd2hpbGUgaW4gcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxzIGJvdGggdGhlIGJhY2tzbGFzaCBhbmQgdGhlIGVzY2FwZWQgY2hhcmFjdGVyIGFyZSByZXRhaW5lZC4KLUluIHF1b3RlZCBzdHJpbmcgbGl0ZXJhbHMsIGEgYmFja3NsYXNoIG1heSBvbmx5IGJlIGZvbGxvd2VkIGJ5IGEgbGltaXRlZCBzZXQgb2YgY2hhcmFjdGVycywgdGhlIG9uZXMgd2hpY2ggbmVlZCBlc2NhcGluZywgb3Igb25lcyB3aGljaCB3aGVuIGVzY2FwZWQgc2VydmUgYXMgc3ltYm9scyBmb3IgY2VydGFpbiBub24tcHJpbnRpbmcgY2hhcmFjdGVycywgc3VjaCBhcyBuZXdsaW5lLgotQSBiYWNra3NsYXNoIG1heSBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIGxldHRlcnMge3tucnRiZn19LCBlaXRoZXIgb2YgdGhlIHF1b3RlcyB7eycifX0sIGFub3RoZXIgYmFja3NsYXNoLCBhIGRvbGxhciBzaWduLCBvciBsaW5lIHRlcm1pbmF0b3IsIG9yIGFuIG9jdGFsIGRpZ2l0LiAgQW55IG90aGVyIGNoYXJhY3RlciBmb2xsb3dpbmcgYSBiYWNrc2xhc2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0KLUluIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFscywgYW4gZXNjYXBpbmcgYmFja3NsYXNoIGNhbiBiZSBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyLCBhbmQgYm90aCBjaGFyYWN0ZXJzIGFyZSBwcmVzZXJ2ZWQgYXMgc2lnbmlmaWNhbnQuCi0KLUlmIGEgbGluZSB0ZXJtaW5hdG9yIGlzIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2gsIGJvdGggdGhlIGJhY2tzbGFzaCBhbmQgdGhlIGxpbmUgdGVybWluYXRvciBhcmUgZGlzcmVnYXJkZWQsICBleGNlcHQgd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwsIHdoZXJlIG9ubHkgdGhlIGJhY2tzbGFzaCBpcyBkaXNyZWdhcmRlZC4KLQote2FuY2hvcjozLjEwLjd9Ci1oMy4gMy4xMC43IFRoZSBOdWxsIExpdGVyYWwKLShDZi4gPz9bSkxTLiAmIzE2NzszLjEwLjd8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjMwNzE3XT8/LikKLQotVW5jaGFuZ2VkLgotCi17YW5jaG9yOjMuMTF9Ci1oMi4gMy4xMSBTZXBhcmF0b3JzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My4xMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMzA3NTddPz8uKQotCi1fQWRkaXRpb246XyBHcm9vdnkgc2VwYXJhdG9ycyBpbmNsdWRlIGFsbCB0aGUgR3Jvb3Z5IHNlcGFyYXRvcnMsIHBsdXMgc2lnbmlmaWNhbnQgbmV3bGluZSAoZGVzY3JpYmVkIGJlbG93KSBhbmQge3stPn19LgotCi17YW5jaG9yOjMuMTEuMX0KLWgyLiAzLjExLjEgU2lnbmlmaWNhbnQgTmV3bGluZXMKLQotX0FkZGl0aW9uOl8gVGhpcyBlbnRpcmUgc2VjdGlvbiBpcyBhZGRlZCB0byB0aGUgc3BlY2lmaWNhdGlvbi4KLQotQXMgdG9rZW5pemF0aW9uIHByb2NlZWRzIGZyb20gbGVmdCB0byByaWdodCwgc29tZSBsaW5lIHRlcm1pbmF0b3JzIGFyZSByZWNsYXNzaWZpZWQgYXMgc2lnbmlmaWNhbnQgbmV3bGluZXMsIHdoaWNoIHRoZW4gc2VydmUgYXMgYWx0ZXJuYXRpdmVzIHRvIHNlbWljb2xvbnMgaW4gdGhlIGdyYW1tYXIgb2Ygc3RhdGVtZW50cy4KLQotQXMgaW4gSmF2YSwgYSBMaW5lVGVybWluYXRvciB0b2tlbiBjYW4gb2NjdXIgaW5zaWRlIGEgVHJhZGl0aW9uYWxDb21tZW50LCBhbmQgaXMgYWx3YXlzIGluc2lnbmlmaWNhbnQuCi0KLUEgbGluZSB0ZXJtaW5hdG9yIGluc2lkZSBhIHN0cmluZyBsaXRlcmFsIGlzIGFsd2F5cyBsZXhpY2FsbHkgc2lnbmlmaWNhbnQuICBBIGxpbmUgdGVybWluYXRvciB3aGljaCBvY2N1cnMgd2l0aGluIGFuIGV4cHJlc3Npb24gZW1iZWRkZWQgaW4gYSBzdHJpbmcgY29uc3RydWN0b3IgbWF5IGFsc28gYmUgc2lnbmlmaWNhbnQuCi0KLU90aGVyd2lzZSwgYSBMaW5lVGVybWluYXRvciBpcyBkZWVtZWQgdG8gYmUgaW5zaWduaWZpY2FudCBpZiBpdCBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldCB0b2tlbnMsIGJ1dCBub3QgKGluIGEgY2VydGFpbiBwcmVjaXNlIHNlbnNlKSBtb3JlIGNsb3NlbHkgaW4gY3VybHkgYnJhY2VzLgotU3BlY2lmaWNhbGx5LCB0aGUgbGVmdCBjb250ZXh0IG9mIGEgTGluZVRlcm1pbmF0b3IsIHZpZXdlZCBpbiBpc29sYXRpb24sIGlzIGNvbnZlcnRlZCB0byB0b2tlbnMuCi1BbGwgdG9rZW5zIG90aGVyIHRoYW4gdW5tYXRjaGVkIHNlcGFyYXRvcnMgYXJlIHJlbW92ZWQsIGxlYXZpbmcgKGlmIHRoZSBwcm9ncmFtIGlzIHdlbGwtZm9ybWVkKSBhcyBzZXF1ZW5jZSBvZiBsZWZ0IHBhcmVudGhlc2VzLCBsZWZ0IHNxdWFyZSBicmFja2V0cywgYW5kIGxlZnQgY3VybHkgYnJhY2VzLgotVGhlIExpbmVUZXJtaW5hdG9yIGlzIHJlZ2FyZGVkIGFzIHNpZ25pZmljYW50IGlmIGFuZCBvbmx5IGlmIHRoZSByZXN1bHRpbmcgc2VxdWVuY2Ugb2Ygc2VwYXJhdG9ycyBpcyBlaXRoZXIgZW1wdHksIG9yIGVuZHMgaW4gYSBjdXJseSBicmFjZS4KLQotU2lnbmlmaWNhbnQgbmV3bGluZXMgYXJlIHNwZWNpZmljYWxseSBhbGxvd2VkIHRvIG9jY3VyIGluc2lkZSBub24tcGFyZW50aGVzaXplZCBleHByZXNzaW9ucyBhbmQgaW4gZW5kLW9mLWxpbmUgY29tbWVudHMuCi0KLShBcyBpbiBKYXZhLCBubyBuZXdsaW5lIG9mIGFueSBzb3J0IG1heSBvY2N1ciB3aXRoaW4gcGxhaW4gc3RyaW5nIHF1b3Rlcy4gIFRoZSBtZWFuaW5nIG9mIG5ld2xpbmVzIGluIHN0cmluZ3MgaXMgZGVzY3JpYmVkIGluIDMuMTAuNS4pCi0KLUEgc2lnbmlmaWNhbnQgbmV3bGluZSBpcyA/P2xleGljYWxseT8/IHNpZ25pZmljYW50LCBpbiB0aGF0IHRoZSBncmFtbWFyIG11c3Qgc29tZWhvdyBhY2NvdW50IGZvciBpdCBpbiB0aGUgdG9rZW4gc3RyZWFtLiAgSG93ZXZlciwgaW4gbWFueSBwbGFjZXMgaW4gdGhlIGdyYW1tYXIsIHNpZ25pZmljYW50IG5ld2xpbmVzIGFyZSBhY2NlcHRlZCBidXQgZGlzY2FyZGVkLgotCi1NYW55IHRva2VucyBjYW4gYmUgcmVnYXJkZWQgYXMgImxlYW5pbmcgcmlnaHR3YXJkIiAoaS5lLiwgdGhleSBhcmUgbGluZ3Vpc3RpY2FsbHkgcHJvY2xpdGljKSBiZWNhdXNlIHRoZXkgY2xlYXJseSByZXF1aXJlIGFkZGl0aW9uYWwgdG9rZW5zIHRvIGNvbXBsZXRlIGEgc3RhdGVtZW50LgotRm9yIGV4YW1wbGUsIGEgY29sb24gb3IgcGx1cyBzaWduIG5ldmVyIGVuZHMgYSBzdGF0ZW1lbnQsIGJ1dCBhbHdheXMgcmVxdWlyZXMgZnVydGhlciB0b2tlbnMuCi1UaGlzIG5vdGlvbiBpcyBmb3JtYWxpemVkIGluIHRoZSBHcm9vdnkgZ3JhbW1hciwgd2hlcmUgc2lnbmlmaWNhbnQgbmV3bGluZXMgYXJlIGFsbG93ZWQgYW5kIGRpc2NhcmRlZCBhZnRlciBzdWNoIHJpZ2h0d2FyZC1sZWFuaW5nIHRva2Vucy4KLVN1Y2ggdG9rZW5zIGluY2x1ZGUgcHJlZml4IGFuZCBpbmZpeCBleHByZXNzaW9uIG9wZXJhdG9yczsgY29tbWEsIGNvbG9uLCBhbmQgZG90OyBhbmQgY2VydGFpbiBrZXl3b3JkcyAoc3VjaCBhcyAidGhyb3dzIikgd2hpY2ggY29udHJpYnV0ZSB0byBkZWNsYXJhdGlvbiBzeW50YXguCi1JbiBhIGZldyBjYXNlcywgdG9rZW5zIGxlYW4gcmlnaHR3YXJkIG9ubHkgaW4gc29tZSBjb250ZXh0cy4gIEZvciBleGFtcGxlLCB0aGUge3srK319IG9wZXJhdG9yIGxlYW5zIHJpZ2h0d2FyZCBvbmx5IGlmIGl0IGlzIGEgcHJlZml4IG9wZXJhdG9yLgotCi1UaGVzZSBydWxlcyBwcm92aWRlIGZvciBlYXN5IGNvbnRpbnVhdGlvbiBvZiBsb25nIHN0YXRlbWVudHMgb3IgZXhwcmVzc2lvbnMgb250byBtdWx0aXBsZSBsaW5lcywgd2l0aG91dCBhIG5lZWQgdG8gZXhwbGljaXRseSBlc2NhcGUgdGhlIGludGVybWVkaWF0ZSBsaW5lIHRlcm1pbmF0b3JzLgotR2VuZXJhbGx5LCBleHByZXNzaW9uIHN0YXRlbWVudHMgd2lsbCB0ZXJtaW5hdGUgYXQgbmV3bGluZXMgaWYgdGhlIGV4cHJlc3Npb24gaXMgY29tcGxldGUsIGV2ZW4gaWYgZnVydGhlciB0b2tlbnMgb24gdGhlIG5leHQgbGluZSB3b3VsZCBhZGQgdG8gdGhlIGV4cHJlc3Npb24uCi1JZiBhIHByb2dyYW1tZXIgYnJlYWtzIGEgbG9uZyBleHByZXNzaW9uIGJ5IGluc2VydGluZyBhIG5ld2xpbmUgYWZ0ZXIgYW4gb3BlcmF0b3IsIHRoZSBHcm9vdnkgYW5kIEphdmEgbGFuZ3VhZ2VzIHdpbGwgYWdyZWUgb24gdGhlIHN0YXRlbWVudCBjb250aW51YXRpb24uCi1Gb2xsb3dpbmcgSmF2YSBmb3JtYXR0aW5nIGhhYml0cywgYSBwcm9ncmFtbWVyIG1heSBhbHNvIGluc2VydCBhIGxpbmUtYnJlYWtpbmcgbmV3bGluZSBiZWZvcmUgYW4gb3BlcmF0b3IuICBJbiBzdWNoIGNhc2VzLCB0aGUgR3Jvb3Z5IHBhcnNlciB3aWxsIGRldGVjdCB0aGUgZXJyb3IsIHNpbmNlIHRoZSBmb2xsb3dpbmcgbGluZSBmcmFnbWVudCwgZXZlbiBpZiBpdCBoYXBwZW5zIHRvIHBhcnNlIGFzIGFuIGV4cHJlc3Npb24sIHdpbGwgYW1vdW50IHRvIGFuIGlsbGVnYWwgZXhwcmVzc2lvbiBzdGF0ZW1lbnQgWygmIzE2NzsxNC44KXxDaGFwdGVyIDE0IEJsb2NrcyMxNC44XS4KLUlmIHRoZXJlIGlzIGRvdWJ0IGFib3V0IGEgc3BlY2lmaWMgZXhwcmVzc2lvbiwgZW5jbG9zZSBpdCBpbiBwYXJlbnRoZXNlcyB0byBtYWtlIGNsZWFyIHRoZSBpbnRlbmRlZCBncm91cGluZywgYW5kIGRpc2FibGUgc2lnbmlmaWNhbnQgbmV3bGluZXMuCi0KLXthbmNob3I6My4xMS4yfQotaDIuIDMuMTEuMiBHcmFtbWF0aWNhbCBTaWduaWZpY2FuY2Ugb2YgTmV3bGluZXMKLQotX0FkZGl0aW9uOl8gVGhpcyBlbnRpcmUgc2VjdGlvbiBpcyBhZGRlZCB0byB0aGUgc3BlY2lmaWNhdGlvbi4KLQotRm9yIHNpbXBsaWNpdHkgaW4gc3Vic2VxdWVudCBjaGFwdGVycywgdGhlIGZvbGxvd2luZyB0d28gZ3JhbW1hciBydWxlcyBkZWZpbmUgYWxsIG9jY3VycmVuY2VzIG9mIHNpZ25pZmljYW50IG5ld2xpbmVzLgotCi17Y29kZX0KLU5MUzoKLSAgKFNpZ25pZmljYW50TmV3bGluZSkqCi1TRVA6Ci0gICc7JyBOTFMKLSAgU2lnbmlmaWNhbnROZXdsaW5lICgnOycpPyBOTFMKLXtjb2RlfQotCi1XaGVyZXZlciB0aGUgZ3JhbW1hciBhbGxvd3MgYSBzZW1pY29sb24gc2VwYXJhdG9yIHRva2VuLCB0aGUgZ3JhbW1hciBhbHNvIGFjY2VwdHMgYW55IG51bWJlciBvZiBzaWduaWZpY2FudCBuZXdsaW5lcyBpbnN0ZWFkIG9mIG9yIGluIGFkZGl0aW9uIHRvIHRoZSBzZW1pY29sb24uICBUaGlzIGlzIGFsd2F5cyBpbmRpY2F0ZWQgaW4gc3Vic2VxdWVudCBjaGFwdGVycyBieSBhbiBvY2N1cnJlbmNlcyBvZiB0aGUge3tTRVB9fSBub250ZXJtaW5hbC4KLQotU3ludGFjdGljYWxseSBpbnNpZ25pZmljYW50IChhbmQgb3B0aW9uYWwpIG5ld2xpbmVzIGFyZSBpbmRpY2F0ZWQgYnkgb2NjdXJyZW5jZXMgb2YgdGhlIHt7TkxTfX0gbm9udGVybWluYWwuICBUaGVyZSBhcmUgbm8gb3RoZXIgdXNlcyBvZiB0aGUge3tTaWduaWZpY2FudE5ld2xpbmV9fSBlbGVtZW50LgotCi1Vbmxpa2UgSmF2YSwgYnV0IGxpa2UgUGFzY2FsLCBhIHNlbWljb2xvbiBmdW5jdGlvbnMgYXMgYSBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBub3QgYSBzdGF0ZW1lbnQgdGVybWluYXRvci4gIEEgc3RhdGVtZW50IGp1c3QgYmVmb3JlIGFuIGVuY2xvc2luZyByaWdodCBicmFja2V0IGlzIHRlcm1pbmF0ZWQgd2l0aCBvciB3aXRob3V0IGEgZmluYWwgc2VwYXJhdG9yIHRva2VuLiAgQXMgd2l0aCBjZXJ0YWluIHNjcmlwdGluZyBsYW5ndWFnZXMgc3VjaCBhcyB7e3NofX0gYW5kIHt7YXdrfX0sIHNlbWljb2xvbnMgYW5kIHNpZ25pZmljYW50IG5ld2xpbmVzIGFyZSBpbnRlcmNoYW5nZWFibGUgYXMgc3RhdGVtZW50IHNlcGFyYXRvcnMuCi0KLXtjb2RlfQotICBwcmludGxuIHggICAgICAvL1NJRwotICBwcmludGxuIHg7ICAgICAvL2luc2lnCi0gIHByaW50bG4geCAvKi4uLiAgaW5zaWcKLSAgICAuLi4qLyArIHkKLSAgcHJpbnRsbiB4ICsgICAgLy9pbnNpZwotICAgIHkKLSAgcHJpbnRsbiAoeCAgICAgLy9pbnNpZwotICAgICsgeSkKLSAgcHJpbnRsbiAoeyB4ICAgLy9TSUcKLSAgICB5IH0pCi17Y29kZX0KLQote2FuY2hvcjozLjEyfQotaDIuIDMuMTIgT3BlcmF0b3JzCi0oQ2YuID8/W0pMUy4gJiMxNjc7My4xMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMzA2NjldPz8uKQotCi1fQWRkaXRpb246XyBHcm9vdnkgaW5jbHVkZXMgYWxsIEphdmEgb3BlcmF0b3JzLCBwbHVzOgotCi17Y29kZX0KLU9wZXJhdG9yOgotICAgIDw9PiAgICAgLi4gICAgICAuLjwgICAgIC4uLiAgICAgKi4gICAgICA/LiAgICAgIC4mCi0gICAgPX4gICAgICA9PX4gICAgICoqICAgICAgKio9ICAgICAuQAote2NvZGV9Ci0KLS0tLS0KLVNwZWNpZmljYXRpb24gW1RhYmxlIG9mIENvbnRlbnRzfENoYXB0ZXIgMDAgQ29udGVudHNdLgotCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIGNoYXB0ZXIgb24gW0xleGljYWwgU3RydWN0dXJlfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXS4KLQotVGhlIG9yaWdpbmFsIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBhdCBbaHR0cDovL2RvY3MuY29kZWhhdXMub3JnL2Rpc3BsYXkvR3Jvb3Z5SlNSXS4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMDNMZXhpY2FsLVByb3Bvc2FsIGIvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIwM0xleGljYWwtUHJvcG9zYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTM2ZGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIwM0xleGljYWwtUHJvcG9zYWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotKkNoYXB0ZXIgMyoKLQotaDEuIExleGljYWwgU3RydWN0dXJlCi0KLVRoaXMgY2hhcHRlciBzcGVjaWZpZXMgdGhlIGxleGljYWwgc3RydWN0dXJlIG9mIHRoZSBHcm9vdnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0KLVRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjaGFwdGVyIHBhcmFsbGVscyB0aGUgY2hhcHRlciBvbiBbTGV4aWNhbCBTdHJ1Y3R1cmV8aHR0cDovL2V4YW1wbGUuY29tXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAodGhpcmQgZWRpdGlvbil8aHR0cDovL2V4YW1wbGUuY29tXSwgYW5kIGJ1aWxkcyBvbiB0b3Agb2YgdGhhdCBzcGVjaWZpY2F0aW9uLgotCi17YW5jaG9yOjMuMX0KLWgyLiAzLjEgVW5pY29kZQotCi1WZXJzaW9ucyBvZiB0aGUgR3Jvb3Z5IHByb2dyYW1taW5nIGxhbmd1YWdlIHVwIHRvIGFuZCBpbmNsdWRpbmcgMS4wIGZpbmFsIHVzZSBVbmljb2RlIHZlcnNpb24gMy4wIGJlY2F1c2UgSjJTRSAxLjQgZG9lcy4gCi1VcGdyYWRlcyB0byBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgVW5pY29kZSBTdGFuZGFyZCBvY2N1cnJlZCBpbiBKMlNFIDUuMCAodG8gVW5pY29kZSA0LjApLiAKLQotVGhlIHJhbmdlIG9mIGxlZ2FsIGNvZGUgcG9pbnRzIHNpbmNlIEoyU0UgNS4wIGlzIG5vdyBVKzAwMDAgdG8gVSsxMEZGRkYsIHVzaW5nIHRoZSBoZXhhZGVjaW1hbCBVK24gX25vdGF0aW9uXy4KLQotVGhlIEdyb292eSBwcm9ncmFtbWluZyBsYW5ndWFnZSByZXByZXNlbnRzIHRleHQgaW4gc2VxdWVuY2VzIG9mIDE2LWJpdCBjb2RlIHVuaXRzLCB1c2luZyB0aGUgVVRGLTE2IGVuY29kaW5nLgotCi0oLSkgVW5saWtlIEphdmEsIEdyb292eSBoYXMgbm8gY2hhcmFjdGVyIGxpdGVyYWxzLCBzZWUgKCQzLjEwLjQpCi0KLXthbmNob3I6My4yfQotaDIuIDMuMiBMZXhpY2FsIFRyYW5zbGF0aW9ucwotCi1VbmNoYW5nZWQuIFRva2VuaXphdGlvbiBvZiBjaGFyYWN0ZXIgc3RyZWFtcyBvY2N1cnMgZXhhY3RseSBhcyBpbiBKYXZhLgotCi17YW5jaG9yOjMuM30KLWgyLiAzLjMgVW5pY29kZSBFc2NhcGVzCi0KLVVuY2hhbmdlZC4gVW5pY29kZSBFc2NhcGVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcyBhbmQgYXJlIGV2YWx1YXRlZAotYXQgdGhlIHNhbWUgdGltZSBhcyBKYXZhLgotCi0qSjJTRSA1LjArKgotUmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycyByZXF1aXJlcyB0d28gY29uc2VjdXRpdmUgVW5pY29kZSBlc2NhcGVzLgotCi17YW5jaG9yOjMuNH0KLWgyLiAzLjQgTGluZSBUZXJtaW5hdG9ycwotCi1VbmNoYW5nZWQuIFVuaWNvZGUgaW5wdXQgY2hhcmFjdGVycyBhcmUgc3BsaXQgaW50byBsaW5lcyBpbiB0aGUgc2FtZSB3YXkgYXMgSmF2YS4KLQote2FuY2hvcjozLjV9Ci1oMi4gMy41IElucHV0IEVsZW1lbnRzIGFuZCBUb2tlbnMKLQotKCspIFNoZWxsIGNvbW1lbnRzIGFyZSBwb3NzaWJsZSBvbiB0aGUgZmlyc3QgbGluZSBvZiBhIGdyb292eSBzb3VyY2UgZmlsZSAoJDMuNykKLQotKCspIFRoZSBkZWZpbml0aW9uIG9mIF9Ub2tlbl8gaW5jbHVkZXMgX1N0cmluZ0NvbnN0cnVjdG9yXyAoJDMuMTAudG9kbyksIGFzIHNob3duIGJlbG93LgotCi17Y29kZX0KLUlucHV0OgotICAgIFNoZWxsQ29tbWVudChvcHQpIElucHV0RWxlbWVudHMob3B0KSBTdWIob3B0KQotCi1Ub2tlbjoKLSAgICBJZGVudGlmaWVyCi0gICAgS2V5d29yZAotICAgIExpdGVyYWwKLSAgICBTdHJpbmdDb25zdHJ1Y3RvcgotICAgIFNlcGFyYXRvcgotICAgIE9wZXJhdG9yCi17Y29kZX0KLQotKGkpIEl0IGlzIGFsc28gbm90ZWQgdGhhdCBsaW5lIHRlcm1pbmF0b3JzIChhcyBkZWZpbmVkIGJ5ICgkMy40KSkgbWF5IGJlIGNsYXNzaWZpZWQgYXMgZWl0aGVyIHNlcGFyYXRvcnMgKCQzLjExKSBvciB3aGl0ZSBzcGFjZSAoJDMuNiksIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgKCQzLjExKS4KLQote2FuY2hvcjozLjZ9Ci1oMi4gMy42IFdoaXRlIFNwYWNlCi0KLShpKSBTb21lIGxpbmUgdGVybWluYXRvcnMgYXJlIHRyYW5zZm9ybWVkIGludG8gc2VwYXJhdG9ycyBpbnN0ZWFkIG9mIHdoaXRlc3BhY2UsIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVmaW5lZCBpbiAoJDMuMTEpLCBiZWxvdy4KLQote2FuY2hvcjozLjd9Ci1oMi4gMy43IENvbW1lbnRzCi0KLSgrKSBHcm9vdnkgaGFzIGEgdGhpcmQga2luZCBvZiBfY29tbWVudF8gd2hpY2ggaXMgb25seSBhY2NlcHRhYmxlIG9uIHRoZSBmaXJzdCBsaW5lIG9mIGEgZ3Jvb3Z5IHNvdXJjZSBmaWxlICgkMy41KQote3RhYmxlfQotIHN5bnRheCAgICAgICAgICAgfCBkZXNjcmlwdGlvbgotIHt7IyB0ZXh0fX0gICAgICAgfCBBIF9zaGVsbF8gX2NvbW1lbnRfOiBhbGwgdGhlIHRleHQgZnJvbSB0aGUgQVNDSUkKLSAgICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyIHt7I319IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgaWdub3JlZCAoYXMgaW4KLSAgICAgICAgICAgICAgICAgIHwgVW5peCBzaGVsbCBzY3JpcHRzKS4KLXt0YWJsZX0KLQotVGhpcyBjb21tZW50IHN0eWxlIGlzIGZvcm1hbGx5IHNwZWNpZmllZCBieSB0aGUgZm9sbG93aW5nIGFtZW5kbWVudCB0byB0aGUgSmF2YSBwcm9kdWN0aW9ucyAoW0pMUyAzLjd8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjNDgxMjVdKSA6Ci17Y29kZX0KLSAgCi1TaGVsbENvbW1lbnQ6Ci0gICcjJyBDaGFyYWN0ZXJzSW5MaW5lKG9wdCkKLXtjb2RlfQotCi1UaGVzZSBwcm9kdWN0aW9ucyBpbXBseSBhbGwgb2YgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6Ci0tIHt7I319LCB7ey9cKn19IGFuZCB7e1wqL319IGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nIGluIGNvbW1lbnRzIHRoYXQgYmVnaW4gd2l0aCB7ey8vfX0uCi0tIHt7I319IGFuZCB7ey8vfX0gaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmcgaW4gY29tbWVudHMgdGhhdCBiZWdpbiB3aXRoIHt7L1wqfX0gb3Ige3svXCpcKn19LgotLSB7ey8vfX0sIHt7L1wqfX0gYW5kIHt7XCovfX0gaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmcgaW4gY29tbWVudHMgdGhhdCBiZWdpbiB3aXRoIHt7I319LgotCi1UaGUgbGV4aWNhbCBncmFtbWFyIGltcGxpZXMgdGhhdCBjb21tZW50cyBkbyBub3Qgb2NjdXIgd2l0aGluIHN0cmluZyBsaXRlcmFscyAoJDMuMTAuNSkgb3IgcmVnZXggbGl0ZXJhbHMgKCQzLjEwLnRvZG8pLgotCi0oKykgTm90ZSB0aGF0IHRoZSBuZXdsaW5lIHRlcm1pbmF0aW5nIGFuICJlbmQgb2YgbGluZSIgY29tbWVudCBjYW4gYmUgc2lnbmlmaWNhbnQuICgkMy4xMSkKLQote2FuY2hvcjozLjh9Ci1oMi4gMy44IElkZW50aWZpZXJzCi0KLShpKSBHcm9vdnkgaWRlbnRpZmllcnMgY29uc2lzdCBvZiBfSmF2YV8gX2xldHRlcnNfIGFuZCBfSmF2YV8gX251bWJlcnNfIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgQVNDSUkgZG9sbGFyIGNoYXJhY3RlciAnJCcgd2hpY2ggaXMgbm90IGEgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXIuICAKLQote3RhYmxlfQotdG9kbyAKLWpyb3NlIC0gIlRoZSBkb2xsYXIgc2lnbiBpcyBzb21ldGltZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEdyb292eSB0byBtYW5nbGUgbm9uLUphdmEgaWRlbnRpZmllcnMgd2hpY2ggbXVzdCBiZSBjb252ZXJ0ZWQgdG8gSmF2YSBuYW1lcy4gRm9yIHRoaXMgcmVhc29uLCBpdCB3b3VsZCBiZSBjb25mdXNpbmcgdG8gYWxsb3cgdW5lc2NhcGVkIGRvbGxhciBzaWducyBhcyBHcm9vdnkgaWRlbnRpZmllciBjb25zdGl0dWVudHMuIgotanJheW5lciAtIElzIHRoaXMgdHJ1ZSBibGFja2RyYWc/Ci1BbHNvLi4uIHNob3VsZCB3ZSBpbXBsZW1lbnQgQ2hhcmFjdGVyLmlzR3Jvb3Z5SWRlbnRpZmllcigpLCBpbmNsdWRpbmcgYSBmb3JtYWxpc20gb2YgdGhpcyBydWxlIGFib3ZlPwote3RhYmxlfQotCi0oKykgR3Jvb3Z5IHByb3ZpZGVzIGEgd2F5IHRvIHVzZSBhbnkgVW5pY29kZSBzdHJpbmcgYXMgYSBtZW1iZXIgbmFtZS4gKFNlZSBbQ2hhcHRlciA2fENoYXB0ZXIwNk5hbWVzLmh0bWxdLikKLQote2FuY2hvcjozLjl9Ci1oMi4gMy45IEtleXdvcmRzCi0KLSgrKSBUaGUgZm9sbG93aW5nIGNoYXJhY3RlciBzZXF1ZW5jZXMsIGZvcm1lZCBmcm9tIEFTQ0lJIGxldHRlcnMsIGFyZSByZXNlcnZlZCBmb3IgdXNlIGFzIGFkZGl0aW9uYWwgX2tleXdvcmRzXyAgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHVucXVhbGlmaWVkIGlkZW50aWZpZXJzICgkMy44KToKLQote3RhYmxlfQotS2V5d29yZHM6ICAgIHwgb25lIG9mICAgICAgIHwgICAgICAgICAgICAgICAgCi17e2FueSAgICAgfX0gfCB7e2RlZiAgICAgfX0gfCB7e3RocmVhZHNhZmV9fSAKLXt7YXMgICAgICB9fSB8IHt7aW4gICAgICB9fSB8IHt7d2l0aH19ICAgICAgIAote3RhYmxlfQotCi1UaGUga2V5d29yZHMge3thbnl9fSwge3tjb25zdH19LCB7e2dvdG99fSwge3t0aHJlYWRzYWZlfX0gYW5kIHt7d2l0aH19IGFyZSByZXNlcnZlZCwgZXZlbiB0aG91Z2ggdGhleSBhcmUgbm90IGN1cnJlbnRseSB1c2VkLiBUaGlzIG1heSBhbGxvdyBhIEdyb292eSBjb21waWxlciB0byBwcm9kdWNlIGJldHRlciBlcnJvciBtZXNzYWdlcyBpZiB0aGVzZSBrZXl3b3JkcyBpbmNvcnJlY3RseSBhcHBlYXIgaW4gcHJvZ3JhbXMuCi0KLSgtKSBUaGUga2V5d29yZHMge3tkb319LCB7e3N0cmljdGZwfX0sIHt7bmF0aXZlfX0gYXJlIG5vdCB1c2VkIGluIGdyb292eS4KLQotKGkpIFRoZSBmb2xsb3dpbmcgYXBwZWFyIHRvIG5vdCB5ZXQgYmUgaW1wbGVtZW50ZWQgaW4gZ3Jvb3Z5LCBidXQgSSB0aGluayB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSB7e3Rocm93c319LCB7e2VudW19fSwge3tmaW5hbH19Ci0KLShpKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gTm90ZToge3ttZXRhQ2xhc3N9fSBhbmQge3tcX1xfdGltZVN0YW1wfX0gYXJlIHVzZWQgaW50ZXJuYWxseSwgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGFzIGJhc2ljIG1lbWJlcnMgb2YgR3Jvb3Z5IE9iamVjdHMuCi0KLXt0YWJsZX0KLXRvZG8gCi1TaG91bGQgd2UgYWxsb3cga2V5d29yZHMgYXMgcXVhbGlmaWVkIG1lbWJlciBuYW1lcyAod2hlbiBpZGVudHMgcXVvdGVkKT8KLWUuZy4gbXlGb28ud2l0aCgpICBvciAgbXlCYXIuImFueSIgZXRjLi4uCi17dGFibGV9CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjA0VHlwZXMgYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjA0VHlwZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Njc2OTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIwNFR5cGVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLSpDaGFwdGVyIDQqCi0KLWgxLiBUeXBlcywgVmFsdWVzLCBhbmQgVmFyaWFibGVzCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIGNoYXB0ZXIgb24gW1R5cGVzLCBWYWx1ZXMsIGFuZCBWYXJpYWJsZXN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXSwgd2hpY2ggYmVnaW5zIGFzIGZvbGxvd3M6Ci0KLWJxLiBUaGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBpcyBhID8/c3Ryb25nbHkgdHlwZWQ/PyBsYW5ndWFnZSwgd2hpY2ggbWVhbnMgdGhhdCBldmVyeSB2YXJpYWJsZSBhbmQgZXZlcnkgZXhwcmVzc2lvbiBoYXMgYSB0eXBlIHRoYXQgaXMga25vd24gYXQgY29tcGlsZSB0aW1lLiBUeXBlcyBsaW1pdCB0aGUgdmFsdWVzIHRoYXQgYSB2YXJpYWJsZSAoWyYjMTY3OzQuNXxDaGFwdGVyIDA0IFR5cGVzIzQuNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzE4NDcwXSkgY2FuIGhvbGQgb3IgdGhhdCBhbiBleHByZXNzaW9uIGNhbiBwcm9kdWNlLCBsaW1pdCB0aGUgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgb24gdGhvc2UgdmFsdWVzLCBhbmQgZGV0ZXJtaW5lIHRoZSBtZWFuaW5nIG9mIHRoZSBvcGVyYXRpb25zLiBTdHJvbmcgdHlwaW5nIGhlbHBzIGRldGVjdCBlcnJvcnMgYXQgY29tcGlsZSB0aW1lLgotCi1icS4gVGhlIHR5cGVzIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIGFyZSBkaXZpZGVkIGludG8gdHdvIGNhdGVnb3JpZXM6IHByaW1pdGl2ZSB0eXBlcyBhbmQgcmVmZXJlbmNlIHR5cGVzLiBUaGUgcHJpbWl0aXZlIHR5cGVzIChbJiMxNjc7NC4yfENoYXB0ZXIgMDQgVHlwZXMjNC4yXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjODU1ODddKSBhcmUgdGhlIHt7Ym9vbGVhbn19IHR5cGUgYW5kIHRoZSBudW1lcmljIHR5cGVzLiBUaGUgbnVtZXJpYyB0eXBlcyBhcmUgdGhlIGludGVncmFsIHR5cGVzIHt7Ynl0ZX19LCB7e3Nob3J0fX0sIHt7aW50fX0sIHt7bG9uZ319LCBhbmQge3tjaGFyfX0sIGFuZCB0aGUgZmxvYXRpbmctcG9pbnQgdHlwZXMge3tmbG9hdH19IGFuZCB7e2RvdWJsZX19LiBUaGUgcmVmZXJlbmNlIHR5cGVzIChbJiMxNjc7NC4zfENoYXB0ZXIgMDQgVHlwZXMjNC4zXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjOTMxN10pIGFyZSBjbGFzcyB0eXBlcywgaW50ZXJmYWNlIHR5cGVzLCBhbmQgYXJyYXkgdHlwZXMuIFRoZXJlIGlzIGFsc28gYSBzcGVjaWFsIG51bGwgdHlwZS4gQW4gb2JqZWN0IChbJiMxNjc7NC4zLjF8Q2hhcHRlciAwNCBUeXBlcyM0LjMuMV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzEyMDI4XSkgaXMgYSBkeW5hbWljYWxseSBjcmVhdGVkIGluc3RhbmNlIG9mIGEgY2xhc3MgdHlwZSBvciBhIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYXJyYXkuIFRoZSB2YWx1ZXMgb2YgYSByZWZlcmVuY2UgdHlwZSBhcmUgcmVmZXJlbmNlcyB0byBvYmplY3RzLiBBbGwgb2JqZWN0cywgaW5jbHVkaW5nIGFycmF5cywgc3VwcG9ydCB0aGUgbWV0aG9kcyBvZiBjbGFzcyB7e09iamVjdH19IChbJiMxNjc7NC4zLjJ8Q2hhcHRlciAwNCBUeXBlcyM0LjMuMl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzExMDU1XSkuIFN0cmluZyBsaXRlcmFscyBhcmUgcmVwcmVzZW50ZWQgYnkge3tTdHJpbmd9fSBvYmplY3RzIChbJiMxNjc7NC4zLjN8Q2hhcHRlciAwNCBUeXBlcyM0LjMuM10sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzI2OTkyXSkuCi0KLWJxLiBOYW1lcyBvZiB0eXBlcyBhcmUgdXNlZCAoWyYjMTY3OzQuNHxDaGFwdGVyIDA0IFR5cGVzIzQuNF0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzI1OTQ4XSkgaW4gZGVjbGFyYXRpb25zLCBjYXN0cywgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbnMsIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb25zLCBjbGFzcyBsaXRlcmFscywgYW5kIHt7aW5zdGFuY2VvZn19IG9wZXJhdG9yIGV4cHJlc3Npb25zLiAKLQotYnEuIEEgdmFyaWFibGUgKFsmIzE2Nzs0LjV8Q2hhcHRlciAwNCBUeXBlcyM0LjVdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCMxODQ3MF0pIGlzIGEgc3RvcmFnZSBsb2NhdGlvbi4gQSB2YXJpYWJsZSBvZiBhIHByaW1pdGl2ZSB0eXBlIGFsd2F5cyBob2xkcyBhIHZhbHVlIG9mIHRoYXQgZXhhY3QgdHlwZS4gQSB2YXJpYWJsZSBvZiBhIGNsYXNzIHR5cGUgX1RfIGNhbiBob2xkIGEgbnVsbCByZWZlcmVuY2Ugb3IgYSByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgY2xhc3MgX1RfIG9yIG9mIGFueSBjbGFzcyB0aGF0IGlzIGEgc3ViY2xhc3Mgb2YgX1RfLiBBIHZhcmlhYmxlIG9mIGFuIGludGVyZmFjZSB0eXBlIGNhbiBob2xkIGEgbnVsbCByZWZlcmVuY2Ugb3IgYSByZWZlcmVuY2UgdG8gYW55IGluc3RhbmNlIG9mIGFueSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZS4gSWYgX1RfIGlzIGEgcHJpbWl0aXZlIHR5cGUsIHRoZW4gYSB2YXJpYWJsZSBvZiB0eXBlICJhcnJheSBvZiBfVF8iIGNhbiBob2xkIGEgbnVsbCByZWZlcmVuY2Ugb3IgYSByZWZlcmVuY2UgdG8gYW55IGFycmF5IG9mIHR5cGUgImFycmF5IG9mIF9UXyI7IGlmIF9UXyBpcyBhIHJlZmVyZW5jZSB0eXBlLCB0aGVuIGEgdmFyaWFibGUgb2YgdHlwZSAiYXJyYXkgb2YgX1RfIiBjYW4gaG9sZCBhIG51bGwgcmVmZXJlbmNlIG9yIGEgcmVmZXJlbmNlIHRvIGFueSBhcnJheSBvZiB0eXBlICJhcnJheSBvZiBfU18iIHN1Y2ggdGhhdCB0eXBlIF9TXyBpcyBhc3NpZ25hYmxlIChbJiMxNjc7NS4yfENoYXB0ZXIgMDUgQ29udmVyc2lvbnMjNS4yXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMTg0MjA2XSkgdG8gdHlwZSBfVF8uIEEgdmFyaWFibGUgb2YgdHlwZSB7e09iamVjdH19IGNhbiBob2xkIGEgbnVsbCByZWZlcmVuY2Ugb3IgYSByZWZlcmVuY2UgdG8gYW55IG9iamVjdCwgd2hldGhlciBjbGFzcyBpbnN0YW5jZSBvciBhcnJheS4KLQote2FuY2hvcjo0LjF9Ci1oMi4gNC4xIFRoZSBLaW5kcyBvZiBUeXBlcyBhbmQgVmFsdWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCMxMTEyOF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NC4yfQotaDIuIDQuMiBQcmltaXRpdmUgVHlwZXMgYW5kIFZhbHVlcwotKENmLiA/P1tKTFMuICYjMTY3OzQuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjODU1ODddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMi4xfQotaDMuIDQuMi4xIEludGVncmFsIFR5cGVzIGFuZCBWYWx1ZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjIuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjOTE1MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NC4yLjJ9Ci1oMy4gNC4yLjIgSW50ZWdlciBPcGVyYXRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC4yLjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzI5Nzc1XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo0LjIuM30KLWgzLiA0LjIuMyBGbG9hdGluZy1Qb2ludCBUeXBlcywgRm9ybWF0cywgYW5kIFZhbHVlcwotKENmLiA/P1tKTFMuICYjMTY3OzQuMi4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCM5MjA4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo0LjIuNH0KLWgzLiA0LjIuNCBGbG9hdGluZy1Qb2ludCBPcGVyYXRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC4yLjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzkyNDldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMi41fQotaDMuIDQuMi41IFRoZSA8Y29kZT5ib29sZWFuIFR5cGUgYW5kIDxjb2RlPmJvb2xlYW48L2NvZGU+IFZhbHVlczwvaDM+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7NC4yLjV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzkyOTVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuM30KLWgyLiA0LjMgUmVmZXJlbmNlIFR5cGVzIGFuZCBWYWx1ZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzkzMTddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMy4xfQotaDMuIDQuMy4xIE9iamVjdHMKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjMuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjMTIwMjhdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMy4yfQotaDMuIDQuMy4yIFRoZSBDbGFzcyBPYmplY3QKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjMuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjMTEwNTVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMy4zfQotaDMuIDQuMy4zIFRoZSBDbGFzcyBTdHJpbmcKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjMuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjMjcwMDBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuMy40fQotaDMuIDQuMy40IFdoZW4gUmVmZXJlbmNlIFR5cGVzIEFyZSB0aGUgU2FtZQotKENmLiA/P1tKTFMuICYjMTY3OzQuMy40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCM5NzA1OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NC40fQotaDIuIDQuNCBXaGVyZSBUeXBlcyBBcmUgVXNlZAotKENmLiA/P1tKTFMuICYjMTY3OzQuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjNTIzMDldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuNX0KLWgyLiA0LjUgVmFyaWFibGVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCMxMDg3Ml0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NC41LjF9Ci1oMy4gNC41LjEgVmFyaWFibGVzIG9mIFByaW1pdGl2ZSBUeXBlCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC41LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzI4MzQ0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo0LjUuMn0KLWgzLiA0LjUuMiBWYXJpYWJsZXMgb2YgUmVmZXJlbmNlIFR5cGUKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjUuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjMjgzNDVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuNS4zfQotaDMuIDQuNS4zIEtpbmRzIG9mIFZhcmlhYmxlcwotKENmLiA/P1tKTFMuICYjMTY3OzQuNS4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCMxMDg4M10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NC41LjR9Ci1oMy4gNC41LjQgZmluYWwgVmFyaWFibGVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7NC41LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sIzk2NjM5XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo0LjUuNX0KLWgzLiA0LjUuNSBJbml0aWFsIFZhbHVlcyBvZiBWYXJpYWJsZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs0LjUuNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuZG9jLmh0bWwjOTY1OTVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjQuNS42fQotaDMuIDQuNS42IFR5cGVzLCBDbGFzc2VzLCBhbmQgSW50ZXJmYWNlcwotKENmLiA/P1tKTFMuICYjMTY3OzQuNS42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC90eXBlc1ZhbHVlcy5kb2MuaHRtbCMyNDg4N10/Py4pCi0KLVRPIERPCi0KLS0tLS0KLVNwZWNpZmljYXRpb24gW1RhYmxlIG9mIENvbnRlbnRzfENoYXB0ZXIgMDAgQ29udGVudHNdLgotCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIGNoYXB0ZXIgb24gW1R5cGVzLCBWYWx1ZXMsIGFuZCBWYXJpYWJsZXN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXS4KLQotVGhlIG9yaWdpbmFsIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBhdCBbaHR0cDovL2RvY3MuY29kZWhhdXMub3JnL2Rpc3BsYXkvR3Jvb3Z5SlNSXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjA1Q29udmVyc2lvbnMgYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjA1Q29udmVyc2lvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzE3ODguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIwNUNvbnZlcnNpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSpDaGFwdGVyIDUqCi0KLWgxLiBDb252ZXJzaW9ucyBhbmQgUHJvbW90aW9ucwotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBjaGFwdGVyIG9uIFtDb252ZXJzaW9ucyBhbmQgUHJvbW90aW9uc3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWxdIGluIHRoZSBbSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbil8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2oudGl0bGUuZG9jLmh0bWxdLCB3aGljaCBiZWdpbnMgaW4gcGFydCBhcyBmb2xsb3dzOgotCi1icS4gVGhpcyBjaGFwdGVyIGZpcnN0IGRlc2NyaWJlcyB0aGUgc2V2ZW4gY2F0ZWdvcmllcyBvZiBjb252ZXJzaW9ucyAoWyYjMTY3OzUuMXxDaGFwdGVyIDA1IENvbnZlcnNpb25zIzUuMV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzE4OTk1NV0pLCBpbmNsdWRpbmcgdGhlIHNwZWNpYWwgY29udmVyc2lvbnMgdG8ge3tTdHJpbmd9fSBhbGxvd2VkIGZvciB0aGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gb3BlcmF0b3Ige3srfX0uIFRoZW4gdGhlIGZpdmUgY29udmVyc2lvbiBjb250ZXh0cyBhcmUgZGVzY3JpYmVkOgotCi0qIEFzc2lnbm1lbnQgY29udmVyc2lvbiAoWyYjMTY3OzUuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMTg0MjA2XSwgWyYjMTY3OzE1LjI2fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM1MjgxXSkgY29udmVydHMgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB0byB0aGUgdHlwZSBvZiBhIHNwZWNpZmllZCB2YXJpYWJsZS4gVGhlIGNvbnZlcnNpb25zIHBlcm1pdHRlZCBmb3IgYXNzaWdubWVudCBhcmUgbGltaXRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgYXNzaWdubWVudCBjb252ZXJzaW9uIG5ldmVyIGNhdXNlcyBhbiBleGNlcHRpb24uCi0qIE1ldGhvZCBpbnZvY2F0aW9uIGNvbnZlcnNpb24gKFsmIzE2Nzs1LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzEyNjg3XSwgWyYjMTY3OzE1Ljl8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzQxMTQ3XSwgWyYjMTY3OzE1LjEyfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMDQ0OF0pIGlzIGFwcGxpZWQgdG8gZWFjaCBhcmd1bWVudCBpbiBhIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGFuZCwgZXhjZXB0IGluIG9uZSBjYXNlLCBwZXJmb3JtcyB0aGUgc2FtZSBjb252ZXJzaW9ucyB0aGF0IGFzc2lnbm1lbnQgY29udmVyc2lvbiBkb2VzLiBNZXRob2QgaW52b2NhdGlvbiBjb252ZXJzaW9uIG5ldmVyIGNhdXNlcyBhbiBleGNlcHRpb24uCi0qIENhc3RpbmcgY29udmVyc2lvbiAoWyYjMTY3OzUuNXxDaGFwdGVyIDA1IENvbnZlcnNpb25zIzUuNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzIwMjMyXSkgY29udmVydHMgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB0byBhIHR5cGUgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgYSBjYXN0IG9wZXJhdG9yIChbJiMxNjc7MTUuMTZ8Q2hhcHRlciAxNSBFeHByZXNzaW9ucyMxNS4xNl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzODE0Nl0pLiBJdCBpcyBtb3JlIGluY2x1c2l2ZSB0aGFuIGFzc2lnbm1lbnQgb3IgbWV0aG9kIGludm9jYXRpb24gY29udmVyc2lvbiwgYWxsb3dpbmcgYW55IHNwZWNpZmljIGNvbnZlcnNpb24gb3RoZXIgdGhhbiBhIHN0cmluZyBjb252ZXJzaW9uLCBidXQgY2VydGFpbiBjYXN0cyB0byBhIHJlZmVyZW5jZSB0eXBlIG1heSBjYXVzZSBhbiBleGNlcHRpb24gYXQgcnVuIHRpbWUuCi0qIFN0cmluZyBjb252ZXJzaW9uIChbJiMxNjc7NS40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMxODYwMzVdLCBbJiMxNjc7MTUuMTguMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMzk5OTBdKSBhbGxvd3MgYW55IHR5cGUgdG8gYmUgY29udmVydGVkIHRvIHR5cGUge3tTdHJpbmd9fS4KLSogTnVtZXJpYyBwcm9tb3Rpb24gKFsmIzE2Nzs1LjZ8Q2hhcHRlciAwNSBDb252ZXJzaW9ucyM1LjZdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMyNjkxN10pIGJyaW5ncyB0aGUgb3BlcmFuZHMgb2YgYSBudW1lcmljIG9wZXJhdG9yIHRvIGEgY29tbW9uIHR5cGUgc28gdGhhdCBhbiBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZC4KLQote2FuY2hvcjo1LjF9Ci1oMi4gNS4xIEtpbmRzIG9mIENvbnZlcnNpb24KLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzI1MjAxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo1LjEuMX0KLWgzLiA1LjEuMSBJZGVudGl0eSBDb252ZXJzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzUuMS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMyNTIwOV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS4xLjJ9Ci1oMy4gNS4xLjIgV2lkZW5pbmcgUHJpbWl0aXZlIENvbnZlcnNpb24KLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjEuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMjUyMTRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjUuMS4zfQotaDMuIDUuMS4zIE5hcnJvd2luZyBQcmltaXRpdmUgQ29udmVyc2lvbnMKLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjEuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMjUzNjNdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjUuMS40fQotaDMuIDUuMS40IFdpZGVuaW5nIFJlZmVyZW5jZSBDb252ZXJzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzUuMS40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMyNTQ2MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS4xLjV9Ci1oMy4gNS4xLjUgTmFycm93aW5nIFJlZmVyZW5jZSBDb252ZXJzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzUuMS41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMyNTM3OV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS4xLjZ9Ci1oMy4gNS4xLjYgU3RyaW5nIENvbnZlcnNpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7NS4xLjZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzE3Njg4Nl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS4xLjd9Ci1oMy4gNS4xLjcgRm9yYmlkZGVuIENvbnZlcnNpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7NS4xLjd8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzE3NTAzNF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS4xLjh9Ci1oMy4gNS4xLjggVmFsdWUgU2V0IENvbnZlcnNpb24KLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjEuOHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMTg0MjI2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo1LjJ9Ci1oMi4gNS4yIEFzc2lnbm1lbnQgQ29udmVyc2lvbgotKENmLiA/P1tKTFMuICYjMTY3OzUuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWwjMTg0MjA2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo1LjN9Ci1oMi4gNS4zIE1ldGhvZCBJbnZvY2F0aW9uIENvbnZlcnNpb24KLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzUzMTcxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo1LjR9Ci1oMi4gNS40IFN0cmluZyBDb252ZXJzaW9uCi0oQ2YuID8/W0pMUy4gJiMxNjc7NS40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMxODYwMzVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjUuNX0KLWgyLiA1LjUgQ2FzdGluZyBDb252ZXJzaW9uCi0oQ2YuID8/W0pMUy4gJiMxNjc7NS41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMyMDIzMl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6NS42fQotaDIuIDUuNiBOdW1lcmljIFByb21vdGlvbnMKLShDZi4gPz9bSkxTLiAmIzE2Nzs1LjZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2NvbnZlcnNpb25zLmRvYy5odG1sIzI2OTE4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo1LjYuMX0KLWgzLiA1LjYuMSBVbmFyeSBOdW1lcmljIFByb21vdGlvbgotKENmLiA/P1tKTFMuICYjMTY3OzUuNi4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMxNzA5NTJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjUuNi4yfQotaDMuIDUuNi4yIEJpbmFyeSBOdW1lcmljIFByb21vdGlvbgotKENmLiA/P1tKTFMuICYjMTY3OzUuNi4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9jb252ZXJzaW9ucy5kb2MuaHRtbCMxODM2MTVdPz8uKQotCi1UTyBETwotCi0tLS0tCi1TcGVjaWZpY2F0aW9uIFtUYWJsZSBvZiBDb250ZW50c3xDaGFwdGVyIDAwIENvbnRlbnRzXS4KLQotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBjaGFwdGVyIG9uIFtDb252ZXJzaW9ucyBhbmQgUHJvbW90aW9uc3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvY29udmVyc2lvbnMuZG9jLmh0bWxdIGluIHRoZSBbSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbil8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2oudGl0bGUuZG9jLmh0bWxdLgotCi1UaGUgb3JpZ2luYWwgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGF0IFtodHRwOi8vZG9jcy5jb2RlaGF1cy5vcmcvZGlzcGxheS9Hcm9vdnlKU1JdLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMDZOYW1lcyBiL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMDZOYW1lcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmODQ5Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjA2TmFtZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotKkNoYXB0ZXIgNioKLQotaDEuIE5hbWVzCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIGNoYXB0ZXIgb24gW05hbWVzfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbF0gaW4gdGhlIFtKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvai50aXRsZS5kb2MuaHRtbF0sIHdoaWNoIGJlZ2lucyBhcyBmb2xsb3dzOgotCi1icS4gTmFtZXMgYXJlIHVzZWQgdG8gcmVmZXIgdG8gZW50aXRpZXMgZGVjbGFyZWQgaW4gYSBwcm9ncmFtLiBBIGRlY2xhcmVkIGVudGl0eSAoWyYjMTY3OzYuMXxDaGFwdGVyIDA2IE5hbWVzIzYuMV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzMzNzU3XSkgaXMgYSBwYWNrYWdlLCBjbGFzcyB0eXBlLCBpbnRlcmZhY2UgdHlwZSwgbWVtYmVyIChjbGFzcywgaW50ZXJmYWNlLCBmaWVsZCwgb3IgbWV0aG9kKSBvZiBhIHJlZmVyZW5jZSB0eXBlLCBwYXJhbWV0ZXIgKHRvIGEgbWV0aG9kLCBjb25zdHJ1Y3Rvciwgb3IgZXhjZXB0aW9uIGhhbmRsZXIpLCBvciBsb2NhbCB2YXJpYWJsZS4KLQotYnEuIE5hbWVzIGluIHByb2dyYW1zIGFyZSBlaXRoZXIgc2ltcGxlLCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGlkZW50aWZpZXIsIG9yIHF1YWxpZmllZCwgJiMzMjtjb25zaXN0aW5nIG9mIGEgc2VxdWVuY2Ugb2YgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5ICJ7ey59fSIgdG9rZW5zIChbJiMxNjc7Ni4yfENoYXB0ZXIgMDYgTmFtZXMjNi4yXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzE2OTJdKS4KLQotYnEuIEV2ZXJ5IGRlY2xhcmF0aW9uIHRoYXQgaW50cm9kdWNlcyBhIG5hbWUgaGFzIGEgPz9zY29wZT8/IChbJiMxNjc7Ni4zfENoYXB0ZXIgMDYgTmFtZXMjNi4zXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMTAzMjI4XSksIHdoaWNoIGlzIHRoZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIHRleHQgd2l0aGluIHdoaWNoIHRoZSBkZWNsYXJlZCBlbnRpdHkgY2FuIGJlIHJlZmVycmVkIHRvIGJ5IGEgc2ltcGxlIG5hbWUuCi0KLWJxLiBQYWNrYWdlcyBhbmQgcmVmZXJlbmNlIHR5cGVzICh0aGF0IGlzLCBjbGFzcyB0eXBlcywgaW50ZXJmYWNlIHR5cGVzLCBhbmQgYXJyYXkgdHlwZXMpIGhhdmUgbWVtYmVycyAoWyYjMTY3OzYuNHxDaGFwdGVyIDA2IE5hbWVzIzYuNF0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzEwNjQ0M10pLiBBIG1lbWJlciBjYW4gYmUgcmVmZXJyZWQgdG8gdXNpbmcgYSBxdWFsaWZpZWQgbmFtZSBfTl97ey59fV94Xywgd2hlcmUgX05fIGlzIGEgc2ltcGxlIG9yIHF1YWxpZmllZCBuYW1lIGFuZCBfeF8gaXMgYW4gaWRlbnRpZmllci4gSWYgX05fIG5hbWVzIGEgcGFja2FnZSwgdGhlbiBfeF8gaXMgYSBtZW1iZXIgb2YgdGhhdCBwYWNrYWdlLCB3aGljaCBpcyBlaXRoZXIgYSBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZSBvciBhIHN1YnBhY2thZ2UuIElmIF9OXyBuYW1lcyBhIHJlZmVyZW5jZSB0eXBlIG9yIGEgdmFyaWFibGUgb2YgYSByZWZlcmVuY2UgdHlwZSwgdGhlbiBfeF8gbmFtZXMgYSBtZW1iZXIgb2YgdGhhdCB0eXBlLCB3aGljaCBpcyBlaXRoZXIgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIGZpZWxkLCBvciBhIG1ldGhvZC4KLQotYnEuIEluIGRldGVybWluaW5nIHRoZSBtZWFuaW5nIG9mIGEgbmFtZSAoWyYjMTY3OzYuNXxDaGFwdGVyIDA2IE5hbWVzIzYuNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzEwNjk0MV0pLCB0aGUgY29udGV4dCBvZiB0aGUgb2NjdXJyZW5jZSBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBhbW9uZyBwYWNrYWdlcywgdHlwZXMsIHZhcmlhYmxlcywgYW5kIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lLgotCi1icS4gQWNjZXNzIGNvbnRyb2wgKFsmIzE2Nzs2LjZ8Q2hhcHRlciAwNiBOYW1lcyM2LjZdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMxMDQyODVdKSBjYW4gYmUgc3BlY2lmaWVkIGluIGEgY2xhc3MsIGludGVyZmFjZSwgbWV0aG9kLCBvciBmaWVsZCBkZWNsYXJhdGlvbiB0byBjb250cm9sIHdoZW4gPz9hY2Nlc3M/PyB0byBhIG1lbWJlciBpcyBhbGxvd2VkLiBBY2Nlc3MgaXMgYSBkaWZmZXJlbnQgY29uY2VwdCBmcm9tIHNjb3BlOyBhY2Nlc3Mgc3BlY2lmaWVzIHRoZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIHRleHQgd2l0aGluIHdoaWNoIHRoZSBkZWNsYXJlZCBlbnRpdHkgY2FuIGJlIHJlZmVycmVkIHRvIGJ5IGEgcXVhbGlmaWVkIG5hbWUsIGEgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24gKFsmIzE2NzsxNS4xMXxDaGFwdGVyIDE1IEV4cHJlc3Npb25zIzE1LjExXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDEyNjddKSwgb3IgYSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIChbJiMxNjc7MTUuMTJ8Q2hhcHRlciAxNSBFeHByZXNzaW9ucyMxNS4xMl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIwNDQ4XSkgaW4gd2hpY2ggdGhlIG1ldGhvZCBpcyBub3Qgc3BlY2lmaWVkIGJ5IGEgc2ltcGxlIG5hbWUuIFRoZSBkZWZhdWx0IGFjY2VzcyBpcyB0aGF0IGEgbWVtYmVyIGNhbiBiZSBhY2Nlc3NlZCBhbnl3aGVyZSB3aXRoaW4gdGhlIHBhY2thZ2UgdGhhdCBjb250YWlucyBpdHMgZGVjbGFyYXRpb247IG90aGVyIHBvc3NpYmlsaXRpZXMgYXJlIHt7cHVibGljfX0sIHt7cHJvdGVjdGVkfX0sIGFuZCB7e3ByaXZhdGV9fS4KLQotYnEuIEZ1bGx5IHF1YWxpZmllZCBhbmQgY2Fub25pY2FsIG5hbWVzIChbJiMxNjc7Ni43fENoYXB0ZXIgMDYgTmFtZXMjNi43XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMjU0MzBdKSBhbmQgbmFtaW5nIGNvbnZlbnRpb25zIChbJiMxNjc7Ni44fENoYXB0ZXIgMDYgTmFtZXMjNi44XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjNzMzMDddKSBhcmUgYWxzbyBkaXNjdXNzZWQgaW4gdGhpcyBjaGFwdGVyLgotCi17YW5jaG9yOjYuMX0KLWgyLiA2LjEgRGVjbGFyYXRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzMzc1N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni4yfQotaDIuIDYuMiBOYW1lcyBhbmQgSWRlbnRpZmllcnMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzMxNjkyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjN9Ci1oMi4gNi4zIFNjb3BlIG9mIGEgRGVjbGFyYXRpb24KLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzEwMzIyOF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni4zLjF9Ci1oMy4gNi4zLjEgU2hhZG93aW5nIERlY2xhcmF0aW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzYuMy4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNDEzM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni4zLjJ9Ci1oMy4gNi4zLjIgT2JzY3VyZWQgRGVjbGFyYXRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni4zLjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzEwNDA1OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni40fQotaDIuIDYuNCBNZW1iZXJzIGFuZCBJbmhlcml0YW5jZQotKENmLiA/P1tKTFMuICYjMTY3OzYuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMTA2NDQzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjQuMX0KLWgzLiA2LjQuMSBUaGUgTWVtYmVycyBvZiBhIFBhY2thZ2UKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjQuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzQ5OTNdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNC4yfQotaDMuIDYuNC4yIFRoZSBNZW1iZXJzIG9mIGEgQ2xhc3MgVHlwZQotKENmLiA/P1tKTFMuICYjMTY3OzYuNC4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNDc1N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni40LjN9Ci1oMy4gNi40LjMgVGhlIE1lbWJlcnMgb2YgYW4gSW50ZXJmYWNlIFR5cGUKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjQuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzQ4NDldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNC40fQotaDMuIDYuNC40IFRoZSBNZW1iZXJzIG9mIGFuIEFycmF5IFR5cGUKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjQuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMjc3MjVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNX0KLWgyLiA2LjUgRGV0ZXJtaW5pbmcgdGhlIE1lYW5pbmcgb2YgYSBOYW1lCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMxMDY5NDFdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS4xfQotaDMuIDYuNS4xIFN5bnRhY3RpYyBDbGFzc2lmaWNhdGlvbiBvZiBhIE5hbWUgQWNjb3JkaW5nIHRvIENvbnRleHQKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzI3NDFdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS4yfQotaDMuIDYuNS4yIFJlY2xhc3NpZmljYXRpb24gb2YgQ29udGV4dHVhbGx5IEFtYmlndW91cyBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuNS4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzMjEzM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni41LjN9Ci1oMy4gNi41LjMgTWVhbmluZyBvZiBQYWNrYWdlIE5hbWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzMyNzU3XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuMy4xfQotaDQuIDYuNS4zLjEgU2ltcGxlIFBhY2thZ2UgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuMy4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMyMjQ4MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni41LjMuMn0KLWg0LiA2LjUuMy4yIFF1YWxpZmllZCBQYWNrYWdlIE5hbWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41LjMuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMjI0ODJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS40fQotaDMuIDYuNS40IE1lYW5pbmcgb2YgPGk+UGFja2FnZU9yVHlwZU5hbWVzPC9oMz4KLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMjE3MjFdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS40LjF9Ci1oNC4gNi41LjQuMSBTaW1wbGUgPGk+UGFja2FnZU9yVHlwZU5hbWVzPC9oND4KLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuNC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCM3MzA2NV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni41LjQuMn0KLWg0LiA2LjUuNC4yIFF1YWxpZmllZCA8aT5QYWNrYWdlT3JUeXBlTmFtZXM8L2g0PgotKENmLiA/P1tKTFMuICYjMTY3OzYuNS40LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzczMDY3XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuNX0KLWgzLiA2LjUuNSBNZWFuaW5nIG9mIFR5cGUgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjNzMwNjRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS41LjF9Ci1oNC4gNi41LjUuMSBTaW1wbGUgVHlwZSBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuNS41LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzIxODEwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuNS4yfQotaDQuIDYuNS41LjIgUXVhbGlmaWVkIFR5cGUgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuNS4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMyMTgxMV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni41LjZ9Ci1oMy4gNi41LjYgTWVhbmluZyBvZiBFeHByZXNzaW9uIE5hbWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41LjZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzIxNjUwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuNi4xfQotaDQuIDYuNS42LjEgU2ltcGxlIEV4cHJlc3Npb24gTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjUuNi4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMyMjAyMl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni41LjYuMn0KLWg0LiA2LjUuNi4yIFF1YWxpZmllZCBFeHByZXNzaW9uIE5hbWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41LjYuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzMwODVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNS43fQotaDMuIDYuNS43IE1lYW5pbmcgb2YgTWV0aG9kIE5hbWVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni41Ljd8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzIxNjUyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuNy4xfQotaDQuIDYuNS43LjEgU2ltcGxlIE1ldGhvZCBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuNS43LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzU0NTEyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjUuNy4yfQotaDQuIDYuNS43LjIgUXVhbGlmaWVkIE1ldGhvZCBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuNS43LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzU0NTQ3XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjZ9Ci1oMi4gNi42IEFjY2VzcyBDb250cm9sCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMxMDQyODVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNi4xfQotaDMuIDYuNi4xIERldGVybWluaW5nIEFjY2Vzc2liaWxpdHkKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjYuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMTAyNzY1XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjYuMn0KLWgzLiA2LjYuMiBEZXRhaWxzIG9uIDxjb2RlPnByb3RlY3RlZCBBY2Nlc3M8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzYuNi4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCM2MjYzOF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni42LjIuMX0KLWg0LiA2LjYuMi4xIEFjY2VzcyB0byBhIDxjb2RlPnByb3RlY3RlZCBNZW1iZXI8L2g0PgotKENmLiA/P1tKTFMuICYjMTY3OzYuNi4yLjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzYwNjAyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjYuMi4yfQotaDQuIDYuNi4yLjIgUXVhbGlmaWVkIEFjY2VzcyB0byBhIDxjb2RlPnByb3RlY3RlZCBDb25zdHJ1Y3RvcjwvaDQ+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7Ni42LjIuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjNzI1OTZdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNi4zfQotaDMuIDYuNi4zIEFuIEV4YW1wbGUgb2YgQWNjZXNzIENvbnRyb2wKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjYuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjNjI2NDddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNi40fQotaDMuIDYuNi40IEV4YW1wbGU6IEFjY2VzcyB0byA8Y29kZT5wdWJsaWMgYW5kIDxjb2RlPk5vbi1wdWJsaWM8L2NvZGU+IENsYXNzZXM8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzYuNi40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNjA2MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni42LjV9Ci1oMy4gNi42LjUgRXhhbXBsZTogRGVmYXVsdC1BY2Nlc3MgRmllbGRzLCBNZXRob2RzLCBhbmQgQ29uc3RydWN0b3JzCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni42LjV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL25hbWVzLmRvYy5odG1sIzM2MTU0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjYuNn0KLWgzLiA2LjYuNiBFeGFtcGxlOiA8Y29kZT5wdWJsaWMgRmllbGRzLCBNZXRob2RzLCBhbmQgQ29uc3RydWN0b3JzPC9oMz4KLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjYuNnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzYyNTBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuNi43fQotaDMuIDYuNi43IEV4YW1wbGU6IDxjb2RlPnByb3RlY3RlZCBGaWVsZHMsIE1ldGhvZHMsIGFuZCBDb25zdHJ1Y3RvcnM8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzYuNi43fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNjE5MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni42Ljh9Ci1oMy4gNi42LjggRXhhbXBsZTogPGNvZGU+cHJpdmF0ZSBGaWVsZHMsIE1ldGhvZHMsIGFuZCBDb25zdHJ1Y3RvcnM8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzYuNi44fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNjIzM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni43fQotaDIuIDYuNyBGdWxseSBRdWFsaWZpZWQgTmFtZXMgYW5kIENhbm9uaWNhbCBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuN3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMjU0MzBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuOH0KLWgyLiA2LjggTmFtaW5nIENvbnZlbnRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7Ni44fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCM3MzMwN10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni44LjF9Ci1oMy4gNi44LjEgUGFja2FnZSBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuOC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCM5MTg0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjo2LjguMn0KLWgzLiA2LjguMiBDbGFzcyBhbmQgSW50ZXJmYWNlIFR5cGUgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjguMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjMzI4MjRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjYuOC4zfQotaDMuIDYuOC4zIE1ldGhvZCBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuOC4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCMzNDU2M10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni44LjR9Ci1oMy4gNi44LjQgRmllbGQgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjguNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjOTM1MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni44LjV9Ci1oMy4gNi44LjUgQ29uc3RhbnQgTmFtZXMKLShDZi4gPz9bSkxTLiAmIzE2Nzs2LjguNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbmFtZXMuZG9jLmh0bWwjOTM2OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6Ni44LjZ9Ci1oMy4gNi44LjYgTG9jYWwgVmFyaWFibGUgYW5kIFBhcmFtZXRlciBOYW1lcwotKENmLiA/P1tKTFMuICYjMTY3OzYuOC42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbCM4MTQwNF0/Py4pCi0KLVRPIERPCi0KLS0tLS0KLVNwZWNpZmljYXRpb24gW1RhYmxlIG9mIENvbnRlbnRzfENoYXB0ZXIgMDAgQ29udGVudHNdLgotCi1UaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY2hhcHRlciBwYXJhbGxlbHMgdGhlIGNoYXB0ZXIgb24gW05hbWVzfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9uYW1lcy5kb2MuaHRtbF0gaW4gdGhlIFtKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvai50aXRsZS5kb2MuaHRtbF0uCi0KLVRoZSBvcmlnaW5hbCBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgYXQgW2h0dHA6Ly9kb2NzLmNvZGVoYXVzLm9yZy9kaXNwbGF5L0dyb292eUpTUl0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIxNEJsb2NrcyBiL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMTRCbG9ja3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzNjY2QuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIxNEJsb2NrcworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0qQ2hhcHRlciAxNCoKLQotaDEuIEJsb2NrcyBhbmQgU3RhdGVtZW50cwotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBjaGFwdGVyIG9uIFtCbG9ja3MgYW5kIFN0YXRlbWVudHN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWxdIGluIHRoZSBbSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbil8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2oudGl0bGUuZG9jLmh0bWxdLCB3aGljaCBiZWdpbnMgYXMgZm9sbG93czoKLQotYnEuIFRoZSBzZXF1ZW5jZSBvZiBleGVjdXRpb24gb2YgYSBwcm9ncmFtIGlzIGNvbnRyb2xsZWQgYnkgPz9zdGF0ZW1lbnRzPz8sIHdoaWNoIGFyZSBleGVjdXRlZCBmb3IgdGhlaXIgZWZmZWN0IGFuZCBkbyBub3QgaGF2ZSB2YWx1ZXMuCi0KLWJxLiBTb21lIHN0YXRlbWVudHMgPz9jb250YWluPz8gb3RoZXIgc3RhdGVtZW50cyBhcyBwYXJ0IG9mIHRoZWlyIHN0cnVjdHVyZTsgc3VjaCBvdGhlciBzdGF0ZW1lbnRzIGFyZSBzdWJzdGF0ZW1lbnRzIG9mIHRoZSBzdGF0ZW1lbnQuIFdlIHNheSB0aGF0IHN0YXRlbWVudCBfU18gPz9pbW1lZGlhdGVseSAmIzMyO2NvbnRhaW5zPz8gc3RhdGVtZW50IF9VXyBpZiB0aGVyZSBpcyBubyBzdGF0ZW1lbnQgX1RfIGRpZmZlcmVudCBmcm9tIF9TXyBhbmQgX1VfIHN1Y2ggdGhhdCBfU18gY29udGFpbnMgX1RfIGFuZCBfVF8gY29udGFpbnMgX1VfLiBJbiB0aGUgc2FtZSBtYW5uZXIsIHNvbWUgc3RhdGVtZW50cyBjb250YWluIGV4cHJlc3Npb25zIChbJiMxNjc7MTV8Q2hhcHRlciAxNSBFeHByZXNzaW9ucyMxNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzQ3MDldKSBhcyBwYXJ0IG9mIHRoZWlyIHN0cnVjdHVyZS4KLQotYnEuIFRoZSBmaXJzdCBzZWN0aW9uIG9mIHRoaXMgY2hhcHRlciBkaXNjdXNzZXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gbm9ybWFsIGFuZCBhYnJ1cHQgY29tcGxldGlvbiBvZiBzdGF0ZW1lbnRzIChbJiMxNjc7MTQuMXxDaGFwdGVyIDE0IEJsb2NrcyMxNC4xXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM1ODk0XSkuIE1vc3Qgb2YgdGhlIHJlbWFpbmluZyBzZWN0aW9ucyBleHBsYWluIHRoZSB2YXJpb3VzIGtpbmRzIG9mIHN0YXRlbWVudHMsIGRlc2NyaWJpbmcgaW4gZGV0YWlsIGJvdGggdGhlaXIgbm9ybWFsIGJlaGF2aW9yIGFuZCBhbnkgc3BlY2lhbCB0cmVhdG1lbnQgb2YgYWJydXB0IGNvbXBsZXRpb24uCi0KLWJxLiBCbG9ja3MgYXJlIGV4cGxhaW5lZCBmaXJzdCAoWyYjMTY3OzE0LjJ8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjQ2ODM4XSksIGZvbGxvd2VkIGJ5IGxvY2FsIGNsYXNzIGRlY2xhcmF0aW9ucyAoWyYjMTY3OzE0LjN8Q2hhcHRlciAxNCBCbG9ja3MjMTQuM10sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjQ3NzY2XSkgYW5kIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMgKFsmIzE2NzsxNC40fENoYXB0ZXIgMTQgQmxvY2tzIzE0LjRdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzU5MjBdKS4gCi0KLWJxLiBOZXh0IGEgZ3JhbW1hdGljYWwgbWFuZXV2ZXIgdGhhdCBzaWRlc3RlcHMgdGhlIGZhbWlsaWFyICJkYW5nbGluZyB7e2Vsc2V9fSIgcHJvYmxlbSAoWyYjMTY3OzE0LjV8Q2hhcHRlciAxNCBCbG9ja3MjMTQuNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMzI1ODRdKSBpcyBleHBsYWluZWQuCi0KLWJxLiBTdGF0ZW1lbnRzIHRoYXQgd2lsbCBiZSBmYW1pbGlhciB0byBDIGFuZCBDKysgcHJvZ3JhbW1lcnMgYXJlIHRoZSBlbXB0eSAoWyYjMTY3OzE0LjZ8Q2hhcHRlciAxNCBCbG9ja3MjMTQuNl0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjNTk3MF0pLCBsYWJlbGVkIChbJiMxNjc7MTQuN3xDaGFwdGVyIDE0IEJsb2NrcyMxNC43XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM3ODk5M10pLCBleHByZXNzaW9uIChbJiMxNjc7MTQuOHxDaGFwdGVyIDE0IEJsb2NrcyMxNC44XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM1OTg0XSksIHt7aWZ9fSAoWyYjMTY3OzE0Ljl8Q2hhcHRlciAxNCBCbG9ja3MjMTQuOV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjNTk5MV0pLCB7e3N3aXRjaH19IChbJiMxNjc7MTQuMTB8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMTBdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzM1NTE4XSksIHt7d2hpbGV9fSAoWyYjMTY3OzE0LjExfENoYXB0ZXIgMTQgQmxvY2tzIzE0LjExXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMyMzcyNzddKSwge3tkb319IChbJiMxNjc7MTQuMTJ8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMTJdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzYwNDVdKSwge3tmb3J9fSAoWyYjMTY3OzE0LjEzfENoYXB0ZXIgMTQgQmxvY2tzIzE0LjEzXSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMyNDU4OF0pLCB7e2JyZWFrfX0gKFsmIzE2NzsxNC4xNHxDaGFwdGVyIDE0IEJsb2NrcyMxNC4xNF0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjNjg0Ml0pLCB7e2NvbnRpbnVlfX0gKFsmIzE2NzsxNC4xNXxDaGFwdGVyIDE0IEJsb2NrcyMxNC4xNV0sIFtKTFN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjNjEyMl0pLCBhbmQge3tyZXR1cm59fSAoWyYjMTY3OzE0LjE2fENoYXB0ZXIgMTQgQmxvY2tzIzE0LjE2XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM2NzY3XSkgc3RhdGVtZW50cy4KLQotYnEuIFVubGlrZSBDIGFuZCBDKyssIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIGhhcyBubyB7e2dvdG99fSBzdGF0ZW1lbnQuIEhvd2V2ZXIsIHRoZSB7e2JyZWFrfX0gYW5kIHt7Y29udGludWV9fSBzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkIHRvIG1lbnRpb24gc3RhdGVtZW50IGxhYmVscy4KLQotYnEuIFRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHN0YXRlbWVudHMgdGhhdCBhcmUgbm90IGluIHRoZSBDIGxhbmd1YWdlIGFyZSB0aGUge3t0aHJvd319IChbJiMxNjc7MTQuMTd8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMTddLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIzNzM1MF0pLCB7e3N5bmNocm9uaXplZH19IChbJiMxNjc7MTQuMTh8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMThdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzI1NTc2OV0pLCBhbmQge3t0cnl9fSAoWyYjMTY3OzE0LjE5fENoYXB0ZXIgMTQgQmxvY2tzIzE0LjE5XSwgW0pMU3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM3OTMxMV0pIHN0YXRlbWVudHMuCi0KLWJxLiBUaGUgbGFzdCBzZWN0aW9uIChbJiMxNjc7MTQuMjB8Q2hhcHRlciAxNCBCbG9ja3MjMTQuMjBdLCBbSkxTfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIzNjM2NV0pIG9mIHRoaXMgY2hhcHRlciBhZGRyZXNzZXMgdGhlIHJlcXVpcmVtZW50IHRoYXQgZXZlcnkgc3RhdGVtZW50IGJlID8/cmVhY2hhYmxlPz8gaW4gYSBjZXJ0YWluIHRlY2huaWNhbCBzZW5zZS4KLQote2FuY2hvcjoxNC4xfQotaDIuIDE0LjEgTm9ybWFsIGFuZCBBYnJ1cHQgQ29tcGxldGlvbiBvZiBTdGF0ZW1lbnRzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM1ODk0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4yfQotaDIuIDE0LjIgQmxvY2tzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMyNDY4MzhdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjN9Ci1oMi4gMTQuMyBMb2NhbCBDbGFzcyBEZWNsYXJhdGlvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzI0Nzc2Nl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuNH0KLWgyLiAxNC40IExvY2FsIFZhcmlhYmxlIERlY2xhcmF0aW9uIFN0YXRlbWVudHMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzU5MjBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjQuMX0KLWgzLiAxNC40LjEgTG9jYWwgVmFyaWFibGUgRGVjbGFyYXRvcnMgYW5kIFR5cGVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuNC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzM1MzkzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC40LjJ9Ci1oMy4gMTQuNC4yIFNjb3BlIG9mIExvY2FsIFZhcmlhYmxlIERlY2xhcmF0aW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE0LjQuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMzMjY0NF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuNC4zfQotaDMuIDE0LjQuMyBTaGFkb3dpbmcgb2YgTmFtZXMgYnkgTG9jYWwgVmFyaWFibGVzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuNC4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzMyNzE2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC40LjR9Ci1oMy4gMTQuNC40IEV4ZWN1dGlvbiBvZiBMb2NhbCBWYXJpYWJsZSBEZWNsYXJhdGlvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC40LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMzI3MTddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjV9Ci1oMi4gMTQuNSBTdGF0ZW1lbnRzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMzMjU4NF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuNn0KLWgyLiAxNC42IFRoZSBFbXB0eSBTdGF0ZW1lbnQKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzU5NzBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0Ljd9Ci1oMi4gMTQuNyBMYWJlbGVkIFN0YXRlbWVudHMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC43fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzc4OTkzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC44fQotaDIuIDE0LjggRXhwcmVzc2lvbiBTdGF0ZW1lbnRzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuOHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM1OTg0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC45fQotaDIuIDE0LjkgVGhlIDxjb2RlPmlmIFN0YXRlbWVudDwvaDI+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuOXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM1OTkxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC45LjF9Ci1oMy4gMTQuOS4xIFRoZSA8Y29kZT5pZi10aGVuIFN0YXRlbWVudDwvaDM+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuOS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIzNzQzM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuOS4yfQotaDMuIDE0LjkuMiBUaGUgPGNvZGU+aWYtdGhlbi1lbHNlIFN0YXRlbWVudDwvaDM+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuOS4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIzNjUwNl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTB9Ci1oMi4gMTQuMTAgVGhlIDxjb2RlPnN3aXRjaCBTdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjEwfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzM1NTIyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMX0KLWgyLiAxNC4xMSBUaGUgd2hpbGUgU3RhdGVtZW50Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMTF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjM3Mjc4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMS4xfQotaDMuIDE0LjExLjEgQWJydXB0IENvbXBsZXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xMS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIxMTM5XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMn0KLWgyLiAxNC4xMiBUaGUgZG8gU3RhdGVtZW50Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMTJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjQ2OTExXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMi4xfQotaDMuIDE0LjEyLjEgQWJydXB0IENvbXBsZXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xMi4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzQ1MzY2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMi4yfQotaDMuIDE0LjEyLjIgRXhhbXBsZSBvZiBkbyBzdGF0ZW1lbnQKLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xMi4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzI1MjI2NF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTN9Ci1oMi4gMTQuMTMgVGhlIDxjb2RlPmZvciBTdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjEzfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzI0NTg4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xMy4xfQotaDMuIDE0LjEzLjEgSW5pdGlhbGl6YXRpb24gb2YgPGNvZGU+Zm9yIHN0YXRlbWVudDwvaDM+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMTMuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCM0NTM2N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTMuMn0KLWgzLiAxNC4xMy4yIEl0ZXJhdGlvbiBvZiBmb3Igc3RhdGVtZW50Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMTMuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMyMTcxOTZdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjEzLjN9Ci1oMy4gMTQuMTMuMyBBYnJ1cHQgQ29tcGxldGlvbiBvZiA8Y29kZT5mb3Igc3RhdGVtZW50PC9oMz4KLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xMy4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzQ1MzcxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xNH0KLWgyLiAxNC4xNCBUaGUgPGNvZGU+YnJlYWsgU3RhdGVtZW50PC9oMj4KLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvc3RhdGVtZW50cy5kb2MuaHRtbCMzNTU0MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTV9Ci1oMi4gMTQuMTUgVGhlIDxjb2RlPmNvbnRpbnVlIFN0YXRlbWVudDwvaDI+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMTV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjNjEyMl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTZ9Ci1oMi4gMTQuMTYgVGhlIDxjb2RlPnJldHVybiBTdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjE2fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzY3NjddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjE3fQotaDIuIDE0LjE3IFRoZSA8Y29kZT50aHJvdyBTdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjE3fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzIzNzM1MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTh9Ci1oMi4gMTQuMTggVGhlIDxjb2RlPnN5bmNocm9uaXplZCBTdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjE4fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzI1NTc2OV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTQuMTl9Ci1oMi4gMTQuMTkgVGhlIDxjb2RlPnRyeSBzdGF0ZW1lbnQ8L2gyPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjE5fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzc5MzExXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4xOS4xfQotaDMuIDE0LjE5LjEgRXhlY3V0aW9uIG9mIHRyeS1jYXRjaDxjb2RlPjxiPjwvY29kZT48L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzE0LjE5LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjQxMzRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE0LjE5LjJ9Ci1oMy4gMTQuMTkuMiBFeGVjdXRpb24gb2YgdHJ5LWNhdGNoLWZpbmFsbHk8Y29kZT48Yj48L2NvZGU+PC9oMz4KLShDZi4gPz9bSkxTLiAmIzE2NzsxNC4xOS4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sIzc5MzI2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNC4yMH0KLWgyLiAxNC4yMCBVbnJlYWNoYWJsZSBTdGF0ZW1lbnRzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTQuMjB8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL3N0YXRlbWVudHMuZG9jLmh0bWwjMjM2MzY1XT8/LikKLQotVE8gRE8KLQotLS0tLQotU3BlY2lmaWNhdGlvbiBbVGFibGUgb2YgQ29udGVudHN8Q2hhcHRlciAwMCBDb250ZW50c10uCi0KLVRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjaGFwdGVyIHBhcmFsbGVscyB0aGUgY2hhcHRlciBvbiBbQmxvY2tzIGFuZCBTdGF0ZW1lbnRzfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9zdGF0ZW1lbnRzLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXS4KLQotVGhlIG9yaWdpbmFsIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBhdCBbaHR0cDovL2RvY3MuY29kZWhhdXMub3JnL2Rpc3BsYXkvR3Jvb3Z5SlNSXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjE1RXhwcmVzc2lvbnMgYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjE1RXhwcmVzc2lvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDUwNDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0NoYXB0ZXIxNUV4cHJlc3Npb25zCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLSpDaGFwdGVyIDE1KgotCi1oMS4gRXhwcmVzc2lvbnMKLVRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjaGFwdGVyIHBhcmFsbGVscyB0aGUgY2hhcHRlciBvbiBbRXhwcmVzc2lvbnN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sXSBpbiB0aGUgW0phdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXSwgd2hpY2ggYmVnaW5zIGFzIGZvbGxvd3M6Ci0KLWJxLiBNdWNoIG9mIHRoZSB3b3JrIGluIGEgcHJvZ3JhbSBpcyBkb25lIGJ5IGV2YWx1YXRpbmcgPz9leHByZXNzaW9ucz8/LCBlaXRoZXIgZm9yIHRoZWlyIHNpZGUgZWZmZWN0cywgc3VjaCBhcyBhc3NpZ25tZW50cyB0byB2YXJpYWJsZXMsIG9yIGZvciB0aGVpciB2YWx1ZXMsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBvciBvcGVyYW5kcyBpbiBsYXJnZXIgZXhwcmVzc2lvbnMsIG9yIHRvIGFmZmVjdCB0aGUgZXhlY3V0aW9uIHNlcXVlbmNlIGluIHN0YXRlbWVudHMsIG9yIGJvdGguCi0KLWJxLiBUaGlzIGNoYXB0ZXIgc3BlY2lmaWVzIHRoZSBtZWFuaW5ncyBvZiBleHByZXNzaW9ucyBhbmQgdGhlIHJ1bGVzIGZvciB0aGVpciBldmFsdWF0aW9uLgotCi17YW5jaG9yOjE1LjF9Ci1oMi4gMTUuMSBFdmFsdWF0aW9uLCBEZW5vdGF0aW9uLCBhbmQgUmVzdWx0Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjI4ODYyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4yfQotaDIuIDE1LjIgVmFyaWFibGVzIGFzIFZhbHVlcwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIyOTE4OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuM30KLWgyLiAxNS4zIFR5cGUgb2YgYW4gRXhwcmVzc2lvbgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzE5ODU1MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuNH0KLWgyLiAxNS40IEZQLXN0cmljdCBFeHByZXNzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI0OTE5OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuNX0KLWgyLiAxNS41IEV4cHJlc3Npb25zIGFuZCBSdW4tVGltZSBDaGVja3MKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyOTAwNzJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjZ9Ci1oMi4gMTUuNiBOb3JtYWwgYW5kIEFicnVwdCBDb21wbGV0aW9uIG9mIEV2YWx1YXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM3OTQ0OV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuN30KLWgyLiAxNS43IEV2YWx1YXRpb24gT3JkZXIKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS43fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM0Nzc5XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS43LjF9Ci1oMy4gMTUuNy4xIEV2YWx1YXRlIExlZnQtSGFuZCBPcGVyYW5kIEZpcnN0Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuNy4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMxODQ5OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuNy4yfQotaDMuIDE1LjcuMiBFdmFsdWF0ZSBPcGVyYW5kcyBiZWZvcmUgT3BlcmF0aW9uCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuNy4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMxODc0MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuNy4zfQotaDMuIDE1LjcuMyBFdmFsdWF0aW9uIFJlc3BlY3RzIFBhcmVudGhlc2VzIGFuZCBQcmVjZWRlbmNlCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuNy4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzIxM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuNy40fQotaDMuIDE1LjcuNCBBcmd1bWVudCBMaXN0cyBhcmUgRXZhbHVhdGVkIExlZnQtdG8tUmlnaHQKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS43LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzNzg5XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS43LjV9Ci1oMy4gMTUuNy41IEV2YWx1YXRpb24gT3JkZXIgZm9yIE90aGVyIEV4cHJlc3Npb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuNy41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzQ1MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOH0KLWgyLiAxNS44IFByaW1hcnkgRXhwcmVzc2lvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS44fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzNjIyNV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOC4xfQotaDMuIDE1LjguMSBMZXhpY2FsIExpdGVyYWxzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuOC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzNjQwN10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOC4yfQotaDMuIDE1LjguMiBDbGFzcyBMaXRlcmFscyAKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS44LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI1MTUzMF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOC4zfQotaDMuIDE1LjguMyA8Y29kZT50aGlzIDwvaDM+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuOC4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyNTE1MTldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjguNH0KLWgzLiAxNS44LjQgUXVhbGlmaWVkIDxjb2RlPnRoaXM8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjguNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjUxNjAzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS44LjV9Ci1oMy4gMTUuOC41IFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS44LjV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzNjgyMl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOX0KLWgyLiAxNS45IENsYXNzIEluc3RhbmNlIENyZWF0aW9uIEV4cHJlc3Npb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuOXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDExNDddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjkuMX0KLWgzLiAxNS45LjEgRGV0ZXJtaW5pbmcgdGhlIENsYXNzIGJlaW5nIEluc3RhbnRpYXRlZAotKENmLiA/P1tKTFMuICYjMTY3OzE1LjkuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM3NDVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjkuMn0KLWgzLiAxNS45LjIgRGV0ZXJtaW5pbmcgRW5jbG9zaW5nIEluc3RhbmNlcwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjkuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjUzMDI4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS45LjN9Ci1oMy4gMTUuOS4zIENob29zaW5nIHRoZSBDb25zdHJ1Y3RvciBhbmQgaXRzIEFyZ3VtZW50cwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjkuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjUzMDk3XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS45LjR9Ci1oMy4gMTUuOS40IFJ1bi10aW1lIEV2YWx1YXRpb24gb2YgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb24gRXhwcmVzc2lvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS45LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI1MTg4MV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuOS41fQotaDMuIDE1LjkuNSBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuOS41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyNTI5ODZdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjkuNS4xfQotaDQuIDE1LjkuNS4xIEFub255bW91cyBDb25zdHJ1Y3RvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS45LjUuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjUzMDAyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS45LjZ9Ci1oMy4gMTUuOS42IEV4YW1wbGU6IEV2YWx1YXRpb24gT3JkZXIgYW5kIE91dC1vZi1NZW1vcnkgRGV0ZWN0aW9uCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuOS42fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzNjY4N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTB9Ci1oMi4gMTUuMTAgQXJyYXkgQ3JlYXRpb24gRXhwcmVzc2lvbnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDYxNjhdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEwLjF9Ci1oMy4gMTUuMTAuMSBSdW4tdGltZSBFdmFsdWF0aW9uIG9mIEFycmF5IENyZWF0aW9uIEV4cHJlc3Npb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTAuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM2MDVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEwLjJ9Ci1oMy4gMTUuMTAuMiBFeGFtcGxlOiBBcnJheSBDcmVhdGlvbiBFdmFsdWF0aW9uIE9yZGVyCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTAuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjY0Mzk2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMC4zfQotaDMuIDE1LjEwLjMgRXhhbXBsZTogQXJyYXkgQ3JlYXRpb24gYW5kIE91dC1vZi1NZW1vcnkgRGV0ZWN0aW9uCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTAuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMzY3MzZdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjExfQotaDIuIDE1LjExIEZpZWxkIEFjY2VzcyBFeHByZXNzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjExfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM0MTI2N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTEuMX0KLWgzLiAxNS4xMS4xIEZpZWxkIEFjY2VzcyBVc2luZyBhIFByaW1hcnkKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzNzA1NV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTEuMn0KLWgzLiAxNS4xMS4yIEFjY2Vzc2luZyBTdXBlcmNsYXNzIE1lbWJlcnMgdXNpbmcgPGNvZGU+c3VwZXI8L2gzPgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjExLjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIwODYwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMn0KLWgyLiAxNS4xMiBNZXRob2QgSW52b2NhdGlvbiBFeHByZXNzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMDQ0OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuMX0KLWgzLiAxNS4xMi4xIENvbXBpbGUtVGltZSBTdGVwIDE6IERldGVybWluZSBDbGFzcyBvciBJbnRlcmZhY2UgdG8gU2VhcmNoCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjE2OTJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjJ9Ci1oMy4gMTUuMTIuMiBDb21waWxlLVRpbWUgU3RlcCAyOiBEZXRlcm1pbmUgTWV0aG9kIFNpZ25hdHVyZQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzE5OTE1XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMi4yLjF9Ci1oNC4gMTUuMTIuMi4xIEZpbmQgTWV0aG9kcyB0aGF0IGFyZSBBcHBsaWNhYmxlIGFuZCBBY2Nlc3NpYmxlCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuMi4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMxODQyN10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuMi4yfQotaDQuIDE1LjEyLjIuMiBDaG9vc2UgdGhlIE1vc3QgU3BlY2lmaWMgTWV0aG9kCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuMi4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyNzI4NjNdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjIuM30KLWg0LiAxNS4xMi4yLjMgRXhhbXBsZTogT3ZlcmxvYWRpbmcgQW1iaWd1aXR5Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuMi4zfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMTcxMl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuMi40fQotaDQuIDE1LjEyLjIuNCBFeGFtcGxlOiBSZXR1cm4gVHlwZSBOb3QgQ29uc2lkZXJlZAotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjIuNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjE3MjddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjIuNX0KLWg0LiAxNS4xMi4yLjUgRXhhbXBsZTogQ29tcGlsZS1UaW1lIFJlc29sdXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMi4yLjV8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI5Nzc1XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMi4zfQotaDMuIDE1LjEyLjMgQ29tcGlsZS1UaW1lIFN0ZXAgMzogSXMgdGhlIENob3NlbiBNZXRob2QgQXBwcm9wcmlhdGU/Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM2MTddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjR9Ci1oMy4gMTUuMTIuNCBSdW50aW1lIEV2YWx1YXRpb24gb2YgTWV0aG9kIEludm9jYXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMi40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM0NTY3N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuNC4xfQotaDQuIDE1LjEyLjQuMSBDb21wdXRlIFRhcmdldCBSZWZlcmVuY2UgKElmIE5lY2Vzc2FyeSkKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMi40LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzM4MzU5XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMi40LjJ9Ci1oNC4gMTUuMTIuNC4yIEV2YWx1YXRlIEFyZ3VtZW50cwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjQuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjE1OTNdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjQuM30KLWg0LiAxNS4xMi40LjMgQ2hlY2sgQWNjZXNzaWJpbGl0eSBvZiBUeXBlIGFuZCBNZXRob2QKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMi40LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzQ1NDUzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMi40LjR9Ci1oNC4gMTUuMTIuNC40IExvY2F0ZSBNZXRob2QgdG8gSW52b2tlCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuNC40fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM0NTYwNl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuNC41fQotaDQuIDE1LjEyLjQuNSBDcmVhdGUgRnJhbWUsIFN5bmNocm9uaXplLCBUcmFuc2ZlciBDb250cm9sCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuNC41fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzOTA3OF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTIuNC42fQotaDQuIDE1LjEyLjQuNiBFeGFtcGxlOiBUYXJnZXQgUmVmZXJlbmNlIGFuZCBTdGF0aWMgTWV0aG9kcwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjQuNnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMzkxMjJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjQuN30KLWg0LiAxNS4xMi40LjcgRXhhbXBsZTogRXZhbHVhdGlvbiBPcmRlcgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjQuN3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM4MzddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEyLjQuOH0KLWg0LiAxNS4xMi40LjggRXhhbXBsZTogT3ZlcnJpZGluZwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEyLjQuOHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM5NjUwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xMi40Ljl9Ci1oNC4gMTUuMTIuNC45IEV4YW1wbGU6IE1ldGhvZCBJbnZvY2F0aW9uIHVzaW5nIHN1cGVyCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTIuNC45fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzk3NTFdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEzfQotaDIuIDE1LjEzIEFycmF5IEFjY2VzcyBFeHByZXNzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjEzfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzk1ODddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEzLjF9Ci1oMy4gMTUuMTMuMSBSdW50aW1lIEV2YWx1YXRpb24gb2YgQXJyYXkgQWNjZXNzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTMuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjM5NThdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjEzLjJ9Ci1oMy4gMTUuMTMuMiBFeGFtcGxlczogQXJyYXkgQWNjZXNzIEV2YWx1YXRpb24gT3JkZXIKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xMy4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzkwNl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTR9Ci1oMi4gMTUuMTQgUG9zdGZpeCBFeHByZXNzaW9ucwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE0fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMzNjI1NF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTQuMX0KLWgzLiAxNS4xNC4xIFBvc3RmaXggSW5jcmVtZW50IE9wZXJhdG9yICsrCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTQuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjQ5MzA1XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNC4yfQotaDMuIDE1LjE0LjIgUG9zdGZpeCBEZWNyZW1lbnQgT3BlcmF0b3IgLS0KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xNC4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM0OTg3XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNX0KLWgyLiAxNS4xNSBVbmFyeSBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDk5MF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTUuMX0KLWgzLiAxNS4xNS4xIFByZWZpeCBJbmNyZW1lbnQgT3BlcmF0b3IgKysKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xNS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM1MDAyXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNS4yfQotaDMuIDE1LjE1LjIgUHJlZml4IERlY3JlbWVudCBPcGVyYXRvciAtLQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE1LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzOTEzNl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTUuM30KLWgzLiAxNS4xNS4zIFVuYXJ5IFBsdXMgT3BlcmF0b3IgKwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE1LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI0OTI0XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNS40fQotaDMuIDE1LjE1LjQgVW5hcnkgTWludXMgT3BlcmF0b3IgLQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE1LjR8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzNjM0NV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTUuNX0KLWgzLiAxNS4xNS41IEJpdHdpc2UgQ29tcGxlbWVudCBPcGVyYXRvciB+Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTUuNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMzk3MzldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjE1LjZ9Ci1oMy4gMTUuMTUuNiBMb2dpY2FsIENvbXBsZW1lbnQgT3BlcmF0b3IgIQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE1LjZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzEzMzUwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNn0KLWgyLiAxNS4xNiBDYXN0IEV4cHJlc3Npb25zCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTZ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzODE0Nl0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTd9Ci1oMi4gMTUuMTcgTXVsdGlwbGljYXRpdmUgT3BlcmF0b3JzCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTd8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzOTgyOV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMTcuMX0KLWgzLiAxNS4xNy4xIE11bHRpcGxpY2F0aW9uIE9wZXJhdG9yICoKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xNy4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM1MDM2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xNy4yfQotaDMuIDE1LjE3LjIgRGl2aXNpb24gT3BlcmF0b3IgLwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE3LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzUwNDddPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjE3LjN9Ci1oMy4gMTUuMTcuMyBSZW1haW5kZXIgT3BlcmF0b3IgJQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE3LjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzI0OTU2XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xOH0KLWgyLiAxNS4xOCBBZGRpdGl2ZSBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xOHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMTU3NDldPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjE4LjF9Ci1oMy4gMTUuMTguMSBTdHJpbmcgQ29uY2F0ZW5hdGlvbiBPcGVyYXRvciArCi0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMTguMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMzk5OTBdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjE4LjEuMX0KLWg0LiAxNS4xOC4xLjEgU3RyaW5nIENvbnZlcnNpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xOC4xLjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzQwMjIwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xOC4xLjJ9Ci1oNC4gMTUuMTguMS4yIE9wdGltaXphdGlvbiBvZiBTdHJpbmcgQ29uY2F0ZW5hdGlvbgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE4LjEuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDAyMjZdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjE4LjEuM30KLWg0LiAxNS4xOC4xLjMgRXhhbXBsZXMgb2YgU3RyaW5nIENvbmNhdGVuYXRpb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xOC4xLjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzQwNDIzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xOC4yfQotaDMuIDE1LjE4LjIgQWRkaXRpdmUgT3BlcmF0b3JzICgrIGFuZCAtKSBmb3IgTnVtZXJpYyBUeXBlcwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjE4LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzEzNTEwXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4xOX0KLWgyLiAxNS4xOSBTaGlmdCBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4xOXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTEyMV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjB9Ci1oMi4gMTUuMjAgUmVsYXRpb25hbCBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNDA2NDFdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjIwLjF9Ci1oMy4gMTUuMjAuMSBOdW1lcmljYWwgQ29tcGFyaXNvbiBPcGVyYXRvcnMgJmx0OywgJmx0Oz0sICZndDssIGFuZCAmZ3Q7PSAKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMC4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMxNTM2NTRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjIwLjJ9Ci1oMy4gMTUuMjAuMiBUeXBlIENvbXBhcmlzb24gT3BlcmF0b3IgaW5zdGFuY2VvZgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjIwLjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzgwMjkxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4yMX0KLWgyLiAxNS4yMSBFcXVhbGl0eSBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTE5Ml0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjEuMX0KLWgzLiAxNS4yMS4xIE51bWVyaWNhbCBFcXVhbGl0eSBPcGVyYXRvcnMgPT0mIzMyO2FuZCAhPSAKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMS4xfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM1MTk4XT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4yMS4yfQotaDMuIDE1LjIxLjIgQm9vbGVhbiBFcXVhbGl0eSBPcGVyYXRvcnMgPT0mIzMyO2FuZCAhPSAKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMS4yfGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM4MDM4OV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjEuM30KLWgzLiAxNS4yMS4zIFJlZmVyZW5jZSBFcXVhbGl0eSBPcGVyYXRvcnMgPT0mIzMyO2FuZCAhPQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjIxLjN8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzIzNjE2M10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjJ9Ci1oMi4gMTUuMjIgQml0d2lzZSBhbmQgTG9naWNhbCBPcGVyYXRvcnMKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTIyOF0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjIuMX0KLWgzLiAxNS4yMi4xIEludGVnZXIgQml0d2lzZSBPcGVyYXRvcnMgJmFtcDssIF4sIGFuZCB8Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMjIuMXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTIzM10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjIuMn0KLWgzLiAxNS4yMi4yIEJvb2xlYW4gTG9naWNhbCBPcGVyYXRvcnMgJmFtcDssIF4sIGFuZCB8Ci0oQ2YuID8/W0pMUy4gJiMxNjc7MTUuMjIuMnxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTI0Ml0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjN9Ci1oMi4gMTUuMjMgQ29uZGl0aW9uYWwtQW5kIE9wZXJhdG9yICZhbXA7JmFtcDsKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yM3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTI0N10/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjR9Ci1oMi4gMTUuMjQgQ29uZGl0aW9uYWwtT3IgT3BlcmF0b3IgfHwKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yNHxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTQ1MzJdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjI1fQotaDIuIDE1LjI1IENvbmRpdGlvbmFsIE9wZXJhdG9yID8mIzMyOzoKLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yNXxodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjMjkwMjkzXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4yNn0KLWgyLiAxNS4yNiBBc3NpZ25tZW50IE9wZXJhdG9ycwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjI2fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCM1MjgxXT8/LikKLQotVE8gRE8KLQote2FuY2hvcjoxNS4yNi4xfQotaDMuIDE1LjI2LjEgU2ltcGxlIEFzc2lnbm1lbnQgT3BlcmF0b3IgPQotKENmLiA/P1tKTFMuICYjMTY3OzE1LjI2LjF8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzUyOTVdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjI2LjJ9Ci1oMy4gMTUuMjYuMiBDb21wb3VuZCBBc3NpZ25tZW50IE9wZXJhdG9ycwotKENmLiA/P1tKTFMuICYjMTY3OzE1LjI2LjJ8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2V4cHJlc3Npb25zLmRvYy5odG1sIzUzMDRdPz8uKQotCi1UTyBETwotCi17YW5jaG9yOjE1LjI3fQotaDIuIDE1LjI3IEV4cHJlc3Npb24KLShDZi4gPz9bSkxTLiAmIzE2NzsxNS4yN3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWwjNTMwOV0/Py4pCi0KLVRPIERPCi0KLXthbmNob3I6MTUuMjh9Ci1oMi4gMTUuMjggQ29uc3RhbnQgRXhwcmVzc2lvbgotKENmLiA/P1tKTFMuICYjMTY3OzE1LjI4fGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9leHByZXNzaW9ucy5kb2MuaHRtbCMyMzYzMjNdPz8uKQotCi1UTyBETwotCi0tLS0tCi1TcGVjaWZpY2F0aW9uIFtUYWJsZSBvZiBDb250ZW50c3xDaGFwdGVyIDAwIENvbnRlbnRzXS4KLQotVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXIgcGFyYWxsZWxzIHRoZSBjaGFwdGVyIG9uIFtFeHByZXNzaW9uc3xodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvZXhwcmVzc2lvbnMuZG9jLmh0bWxdIGluIHRoZSBbSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbil8aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2oudGl0bGUuZG9jLmh0bWxdLgotCi1UaGUgb3JpZ2luYWwgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGF0IFtodHRwOi8vZG9jcy5jb2RlaGF1cy5vcmcvZGlzcGxheS9Hcm9vdnlKU1JdLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMThTeW50YXggYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvQ2hhcHRlcjE4U3ludGF4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk4NmY4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9DaGFwdGVyMThTeW50YXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0qQ2hhcHRlciAxOCoKLQotaDEuIFN5bnRheAotVGhpcyBpcyB0aGUgY3VycmVudCBKU1IgW0dyYW1tYXJ8R3Jvb3Z5UmVjb2duaXplci5odG1sXSBhbmQgW0xleGVyfEdyb292eUxleGVyLmh0bWxdCi0KLUF1dG9tYXRpYyBnZW5lcmF0aW9uIGZyb20gW2FudGxyfGh0dHA6Ly9hbnRsci5vcmddCi0KLWgxLiBEaWFncmFtcwotW0hlcmV8aHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvanNyL3NwZWMvZ3JhbW1hci9dIGFyZSBzeW50YXggZGlhZ3JhbXMgYmFzZWQgdXBvbiB0aGUgY3VycmVudCBncm9vdnkuZwotCi1EaWFncmFtIGdlbmVyYXRpb24gdXNpbmcgW3N5bmRpYWd8aHR0cDovL3N5bmRpYWcuamF2YW5pY3VzLmNvbV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvSkxTRGlmZmVyZW5jZXMgYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvSkxTRGlmZmVyZW5jZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODdmYWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL0pMU0RpZmZlcmVuY2VzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UaGlzIGlzIGEgc3lzdGVtYXRpYyBhY2NvdW50IG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEphdmEgYW5kIEdyb292eSwgb3JnYW5pemVkIGFzIGEgc2V0IG9mIGFubm90YXRpb25zIHRvIHRoZSBbSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9ufGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qLnRpdGxlLmRvYy5odG1sXS4gIEV2ZXJ5IGNoYXB0ZXIgYW5kIHNlY3Rpb24gb2YgdGhlIEpMUyBoYXMgYSBjb3JyZXNwb25kaW5nIGNoYXB0ZXIgYW5kIHNlY3Rpb24gKHdpdGggdGhlIHNhbWUgbnVtYmVyKSBpbiB0aGlzIGFjY291bnQuCi0KLV8oVGhpcyBpcyBhbiBleHBlcmltZW50IHVuZGVyIGNvbnN0cnVjdGlvbiEgIC0tanJvc2UpXwotCi17Y2hpbGRyZW46YWxsPXRydWV9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL2Jpc2N1aXQuY3NzIGIvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL2Jpc2N1aXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZjZDdiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9iaXNjdWl0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLWRpdi5jb250YWluZXJ7d2lkdGg6OTglOyBtYXJnaW46IDElO30KLXRhYmxlI3RhYmxlMXt0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87IHdpZHRoOiA2MDBweDt9Ci10ci50ZHt0ZXh0LWFsaWduOmxlZnQ7fQotCi0ud2lraXRhYmxlLCAud2lraS10YWJsZSB7Ci0gICAgbWFyZ2luOiA1cHg7Ci0gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLX0KLS53aWtpdGFibGUgdGQsIC53aWtpdGFibGUgdGgsIC53aWtpLXRhYmxlIHRkLCAud2lraS10YWJsZSB0aCB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKLSAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7Ci19Ci0ud2lraXRhYmxlIHRoLCAud2lraS10YWJsZSB0aCB7Ci0gICAgYmFja2dyb3VuZDogI2YwZjBmMDsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci1CT0RZLHRkLHRyLHRhYmxlICAgICAgICAgICAgICAgIHtjb2xvcjogIzM0MzQzNDsgZm9udC1zaXplOiAxN3B4OyBmb250LWZhbWlseTogYmFza2VydmlsbGUsdGltZXN9Ci1URVhUQVJFQSAgICAgICAgICAgIHtjb2xvcjogIzM0MzQzNDsgZm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlfQotLmhlYWRpbmctMQkgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDEzcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWZ9Ci0uaGVhZGluZy0xLTEJICAgIHtjb2xvcjogIzM0MzQzNDsgZm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmfQotLnRiCQkgICAge2NvbG9yOiAjMzQzNDM0OyBmb250LXNpemU6IDExcHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLnd0YgkJICAgIHtjb2xvcjogI0ZGRkZGRjsgZm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZH0KLS5ib2xkICAgICAgICAgICAgICAge0ZPTlQtV0VJR0hUOiBib2xkfQotTEkgICAgICAgICAgICAgICAgICB7bWFyZ2luLWxlZnQ6IC0xMHB4OyBtYXJnaW4tcmlnaHQ6IDEycHh9Ci0udGl0bGUgCQkgICAge2ZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmfQotLmNvZGUgICAgICAgICAgICAgICB7cGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1ib3R0b206IDJweDsgcGFkZGluZy1sZWZ0OiAyNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgI2NjY2NmZjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2NjZmY7IGNvbG9yOiAjNTU1NTc3OyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxMXB4fQotLmNvZGUtYWx0ICAgICAgICAgICB7YmFja2dyb3VuZC1jb2xvcjogIzhGNzc3MTsgcGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1ib3R0b206IDJweDsgcGFkZGluZy1sZWZ0OiAyNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgI0ZGRkZGRjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7IGNvbG9yOiAjRkZGRkZGOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxMXB4OyB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlfQotLnJ2ICAgICAgICAgICAgICAgICB7Zm9udC1zaXplOiAxMXB4OyBmb250LWZhbWlseTogdGFob21hLCBhcmlhbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjRkZGRkZGIH0KLS5yYnkgICAgICAgICAgICAgICAge2ZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWw7IGNvbG9yOiAjNjg1MDQ5OyBwYWRkaW5nLWJvdHRvbTogOHB4IH0KLS5qYXZhLWtleXdvcmQgICAgICAge2NvbG9yOiAjMDAwMDgwfQotLmphdmEtb2JqZWN0ICAgICAgICB7Y29sb3I6ICM2NjBFN0F9Ci0uamF2YS1xdW90ZSAgICAgICAgIHtjb2xvcjogIzAwODAwMH0KLUEJIAkgICAge0ZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyIAkgICAge0ZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5ka2JsdWUgICAgICAge0NPTE9SOiAjMTE0NEFBOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLmRrYmx1ZSAgICB7Q09MT1I6ICMxMTQ0QUE7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLmRrYmx1ZSAJICAgIHtDT0xPUjogIzExNDRBQTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQud2hpdGUgICAgIHtDT0xPUjogI0ZGRkZGRjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIud2hpdGUgCSAgICB7Q09MT1I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLndoaXRlIAkgICAge0NPTE9SOiAjRkZGRkZGOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLndoaXRlICAgICB7Q09MT1I6ICNGRkZGRkY7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOmhvdmVyLndoaXRlIAkgICAge0NPTE9SOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZX0KLUE6bGluay5yZXYJICAgIHtDT0xPUjogIzY1NTMyQjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtRkFNSUxZOiB2ZXJkYW5hLGFyaWFsOyBGT05ULVNJWkU6IDEwcHg7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6dmlzaXRlZC5yZXYJICAgIHtDT0xPUjogIzY1NTMyQjsgRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtRkFNSUxZOiB2ZXJkYW5hLGFyaWFsOyBGT05ULVNJWkU6IDEwcHg7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIucmV2CSAgICB7Q09MT1I6ICM2NTUzMkI7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lfQotQTpsaW5rLmNhbgkgICAge0NPTE9SOiAjMDAwMDAwOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTp2aXNpdGVkLmNhbgkgICAge0NPTE9SOiAjMDAwMDAwOyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lfQotQTpob3Zlci5jYW4JICAgIHtDT0xPUjogIzU1MDBBQTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci1BOmxpbmsuY2FubHQgCSAgICB7Q09MT1I6ICM1NTU1Nzc7IEZPTlQtV0VJR0hUOiBib2xkOyBURVhULURFQ09SQVRJT046IG5vbmV9Ci1BOnZpc2l0ZWQuY2FubHQJICAgIHtDT0xPUjogIzU1NTU3NzsgRk9OVC1XRUlHSFQ6IGJvbGQ7IFRFWFQtREVDT1JBVElPTjogbm9uZX0KLUE6aG92ZXIuY2FubHQJICAgIHtDT0xPUjogIzU1MDBBQTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmV9Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9ncm9vdnktbG9nby5wbmcgYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvZ3Jvb3Z5LWxvZ28ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFmNGMxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3Ivc3BlYy9zcmMvd2lraS9ncm9vdnktbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvaW5kZXggYi9ncm9vdnkvanNyL3NwZWMvc3JjL3dpa2kvaW5kZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTMxZjQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci9zcGVjL3NyYy93aWtpL2luZGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotKkdyb292eSBTcGVjaWZpY2F0aW9uKgotCi1oMS4gVGFibGUgb2YgQ29udGVudHMKLQotKiBDaGFwdGVyIDE6IFtJbnRyb2R1Y3Rpb258Q2hhcHRlcjAxSW50cm9kdWN0aW9uLmh0bWxdCi0qIENoYXB0ZXIgMjogR3JhbW1hcnMKLSogQ2hhcHRlciAzOiBbTGV4aWNhbCBTdHJ1Y3R1cmV8Q2hhcHRlcjAzTGV4aWNhbC5odG1sXQotKiBDaGFwdGVyIDQ6IFtUeXBlcywgVmFsdWVzLCBhbmQgVmFyaWFibGVzfENoYXB0ZXIwNFR5cGVzLmh0bWxdCi0qIENoYXB0ZXIgNTogW0NvbnZlcnNpb25zIGFuZCBQcm9tb3Rpb25zfENoYXB0ZXIwNUNvbnZlcnNpb25zLmh0bWxdCi0qIENoYXB0ZXIgNjogW05hbWVzfENoYXB0ZXIwNk5hbWVzLmh0bWxdCi0qIENoYXB0ZXIgNzogUGFja2FnZXMKLSogQ2hhcHRlciA4OiBDbGFzc2VzCi0qIENoYXB0ZXIgOTogSW50ZXJmYWNlcwotKiBDaGFwdGVyIDEwOiBBcnJheXMKLSogQ2hhcHRlciAxMTogRXhjZXB0aW9ucwotKiBDaGFwdGVyIDEyOiBFeGVjdXRpb24KLSogQ2hhcHRlciAxMzogQmluYXJ5IENvbXBhdGliaWxpdHkKLSogQ2hhcHRlciAxNDogW0Jsb2NrcyBhbmQgU3RhdGVtZW50c3xDaGFwdGVyMTRCbG9ja3MuaHRtbF0KLSogQ2hhcHRlciAxNTogW0V4cHJlc3Npb25zfENoYXB0ZXIxNUV4cHJlc3Npb25zLmh0bWxdCi0qIENoYXB0ZXIgMTY6IERlZmluaXRlIEFzc2lnbm1lbnQKLSogQ2hhcHRlciAxNzogVGhyZWFkcyBhbmQgTG9ja3MKLSogQ2hhcHRlciAxODogW1N5bnRheHxDaGFwdGVyMThTeW50YXguaHRtbF0KLSogTm90ZXMgZm9yIHNwZWMuIGRldmVsb3BlcnMuCi0qIFtKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gRGlmZmVyZW5jZXN8SkxTRGlmZmVyZW5jZXMuaHRtbF0KLSogW1Rlc3QgQ29tcGF0aWJpbGl0eSBLaXR8Li4vdGNrL2luZGV4Lmh0bWxdCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay9SRUFETUUudHh0IGIvZ3Jvb3Z5L2pzci90Y2svUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3ZTRjZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1Db250YWlucyB0aGUgVGVzdCBDb21wYXRpYmlsaXR5IEtpdCBmb3IgdGhlIEdyb292eSBsYW5ndWFnZQotCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay9idWlsZC54bWwgYi9ncm9vdnkvanNyL3Rjay9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTg2YmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGNrIiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgY29tcGlsZSBzZXR0aW5ncyAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGVidWciIHZhbHVlPSJvbiIvPgotICAKLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InN0YW5kYWxvbmUud29ya2luZy5kaXIiIHZhbHVlPSJ0ZW1wIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzdGFuZGFsb25lLmRpciIgdmFsdWU9InN0YW5kYWxvbmUiLz4KLQotICA8IS0tIGphdmFkb2MgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiB2YWx1ZT0iZG9jIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLnBhY2thZ2VzIiB2YWx1ZT0ib3JnLmNvZGVoYXVzLmdyb292eS4qIi8+Ci0KLSAgPCEtLSBqdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0ianVuaXQuc3R5bGUuZGlyIiB2YWx1ZT0ic3R5bGVzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2FzZS5zcmMuZGlyIiB2YWx1ZT0idGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkLnRlc3Quc3JjLmRpciIJdmFsdWU9ImdlbnRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QubGliLmRpciIgdmFsdWU9InRlc3RsaWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vdGVzdC9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJlcG9ydHMuZGlyIiB2YWx1ZT0icmVwb3J0cyIvPgotICAKLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgICAgZGF0YXR5cGVzICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHBhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi56aXAiIC8+Ci0gICAgPC9maWxlc2V0PgotICAgICAgPCEtLSBUT0RPIGxpbWl0IGV4cG9zdXJlIHRvIEpTUiBwYXJzZXIgZHVyaW5nIGNvbXBsaWF0aW9uIChuZWVkZWQgYnkgVGVzdEdlbmVyYXRvckhlbHBlciBjbGFzc2VzKS0tPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QubGliLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotCi0gIDwvcGF0aD4KLSAgCi0gIDwhLS0gaW50ZW50aW9uYWxseSBkb2Vzbid0IGluY2x1ZGUgdGhlIGNvbXBpbGUgY2xhc3NwYXRoIC0tPgotICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIvPgotICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmxpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgPC9maWxlc2V0PgotCi0gICAgPCEtLSBUT0RPIGxpbWl0IGV4cG9zdXJlIHRvIFRDSyBoZWxwZXIgY2xhc3NlcyAtLT4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+Ci0KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJteS5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtzdGFuZGFsb25lLmRpcn0iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+Ci0gICAgPC9maWxlc2V0PgotICA8L3BhdGg+Ci0KLSAgPHRhc2tkZWYgbmFtZT0iZ3Jvb3Z5YyIgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnljIiBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgdGFyZ2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiAKLSAgICAgICAgICBkZXBlbmRzPSJwcmV0dHktdGVzdCIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImRlZmF1bHQ6IHJ1biB0aGUgZ3Jvb3Z5IHRlc3Qgc3VpdGUiCi0gIC8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImFsbCIgCi0gICAgICAgICAgZGVwZW5kcz0idGVzdCxkaXN0IiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iYnVpbGQgYW5kIHRlc3QgZXZlcnl0aGluZyIKLSAgLz4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0icmVtb3ZlIGFsbCBidWlsdCBmaWxlcyI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdC5kaXJ9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbmVyYXRlZC50ZXN0LnNyYy5kaXJ9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke3N0YW5kYWxvbmUuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiAKLSAgICAgICAgICBkZXBlbmRzPSJjb21waWxlIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iY3JlYXRlIGRpc3RyaWJ1dGFibGVzIChqYXJzIGV0YykiPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9IiAvPgotICAgIDxqYXIgamFyZmlsZT0iJHtkaXN0LmRpcn0vdGNrLmphciIgCi0gICAgICAgICBtYW5pZmVzdD0iJHtzcmMuZGlyfS9tYW5pZmVzdC50eHQiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0ic3RhbmRhbG9uZSIgZGVwZW5kcz0iZGlzdCIgZGVzY3JpcHRpb249Im1lcmdlIGFsbCBqYXJzIHRvZ2V0aGVyIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSIvPgotICAgICAgICA8dW56aXAgZGVzdD0iJHtzdGFuZGFsb25lLndvcmtpbmcuZGlyfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L3VuemlwPgotICAgICAgICA8bWtkaXIgZGlyPSIke3N0YW5kYWxvbmUuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7c3RhbmRhbG9uZS5kaXJ9L3Rjay5qYXIiCi0gICAgICAgICAgICBtYW5pZmVzdD0iJHtzcmMuZGlyfS9tYW5pZmVzdC50eHQiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3N0YW5kYWxvbmUud29ya2luZy5kaXJ9Ii8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8IS0tPGRlbGV0ZSBkaXI9IiR7c3RhbmRhbG9uZS53b3JraW5nLmRpcn0iLz4tLT4KLQotICAgIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImdlbmVyYXRlIGRvY3VtZW50YXRpb24iPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICAgIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IiAKLSAgICAgICAgICAgICBwYWNrYWdlbmFtZXM9IiR7amF2YWRvYy5wYWNrYWdlc30iCi0gICAgICAgICAgICAgdXNlPSJ0cnVlIgotICAgICAgICAgICAgIHdpbmRvd3RpdGxlPSJ0Y2siCi0gICAgICAgICAgICAgcHJpdmF0ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgYW5kIHJ1biI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRjay5HZW5lcmF0ZVRlc3RDYXNlcyIgCi0gICAgICAgICAgZm9yaz0ieWVzIiAKLSAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LWNvbXBpbGUiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJydW4gYWxsIHRlc3QgY2FzZXMiPgotICAgIDxqdW5pdCBoYWx0b25mYWlsdXJlPSJ0cnVlIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+Ci0gICAgICA8YmF0Y2h0ZXN0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICA8L3RhcmdldD4KLSAgICAgICAgCi0gIDx0YXJnZXQgbmFtZT0icHJldHR5LXRlc3QiIAotICAgICAgICAgIGRlcGVuZHM9InRlc3QtY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249IkhUTUwgb3V0cHV0IG9mIHRlc3QgY2FzZXMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iLz4KLSAgICA8anVuaXQgaGFsdG9uZmFpbHVyZT0iZmFsc2UiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIHVzZWZpbGU9InRydWUiLz4KLQotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qVGVzdC5jbGFzcyIgLz4gCi0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotCi0gICAgPC9qdW5pdD4KLQotICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiBzdHlsZWRpcj0iJHtqdW5pdC5zdHlsZS5kaXJ9IiB0b2Rpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSIvPgotICAgIDwvanVuaXRyZXBvcnQ+Ci0gICAgPGVjaG8+Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgb3BlbiByZXBvcnRzL2luZGV4Lmh0bWwgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi08L2VjaG8+Ci0gIDwvdGFyZ2V0PgotCi0KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJjb21waWxlIGphdmEgYW5kIGdyb292eSBzb3VyY2VzIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICA8Z3Jvb3Z5YyBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIKLSAgICAgICAgICAgICBzcmNkaXI9IiR7c3JjLmRpcn0iCi0gICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4KLSAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICA8L2dyb292eWM+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIKLSAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iCi0gICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5jbGFzc3BhdGgiCi0gICAgICAgICAgIGRlYnVnPSIke2J1aWxkLmRlYnVnfSIKLSAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0ic3RhbmRhbG9uZSIgZGVzY3JpcHRpb249ImdlbmVyYXRlIHRlc3QgY2FzZXMiPgotICAgICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQudGVzdC5zcmMuZGlyfSIgLz4KLSAgICAgIDx0YXNrZGVmIG5hbWU9ImdlbnRlc3RzIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkudGNrLkdlbmVyYXRlVGVzdENhc2VzIiBjbGFzc3BhdGhyZWY9Im15LmNsYXNzcGF0aCIvPgotCi0gICAgICA8Z2VudGVzdHMgZGVzdGRpcj0iJHtnZW5lcmF0ZWQudGVzdC5zcmMuZGlyfSIKLSAgICAgICAgICAgICAgICBzcmNkaXI9IiR7dGVzdGNhc2Uuc3JjLmRpcn0iCi0gICAgICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNvbXBpbGUiIGRlcGVuZHM9ImdlbmVyYXRlIiBkZXNjcmlwdGlvbj0iY29tcGlsZSB0ZXN0cyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIgLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke2dlbmVyYXRlZC50ZXN0LnNyYy5kaXJ9IgotICAgICAgICAgICBkZXN0ZGlyPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9IiAKLSAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgCi0gICAgICAgICAgIGRlYnVnPSIke2J1aWxkLmRlYnVnfSIgCi0gICAgICAgICAgIGRlcHJlY2F0aW9uPSJvbiI+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wIC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtsaWIuZGlyfSIvPgotICA8L3RhcmdldD4KLSAgICAgICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL2xpYi9ncm9vdnktYWxsLTEuMC1iZXRhLTguamFyIGIvZ3Jvb3Z5L2pzci90Y2svbGliL2dyb292eS1hbGwtMS4wLWJldGEtOC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjMxYTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svbGliL2dyb292eS1hbGwtMS4wLWJldGEtOC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay9zcmMvbWFuaWZlc3QudHh0IGIvZ3Jvb3Z5L2pzci90Y2svc3JjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkMDYzNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9zcmMvbWFuaWZlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLU1haW4tQ2xhc3M6IG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrLkdlbmVyYXRlVGVzdENhc2VzCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svQmF0Y2hHZW5lcmF0ZS5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svQmF0Y2hHZW5lcmF0ZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTZiZWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL0JhdGNoR2VuZXJhdGUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIEplcmVteSBSYXluZXIKLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRjawotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1jbGFzcyBCYXRjaEdlbmVyYXRlIHsKLSAgICBwcm9wZXJ0eSBnZW5lcmF0b3I7Ci0gICAgcHJvcGVydHkgc3JjRGlyUGF0aDsKLSAgICBwcm9wZXJ0eSB0YXJnZXREaXI7Ci0gICAgcHJvcGVydHkgc3JjRW5jb2Rpbmc7Ci0gICAgcHJvcGVydHkgc3JjczsKLSAgICBwcm9wZXJ0eSBzcGV3Ci0KLSAgICBwdWJsaWMgQmF0Y2hHZW5lcmF0ZSgpIHsKLSAgICAgICAgZ2VuZXJhdG9yID0gbmV3IFRlc3RHZW5lcmF0b3IoKTsKLSAgICAgICAgdmVyYm9zZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpclBhdGgoU3RyaW5nIHBhdGhOYW1lKSB7Ci0gICAgICAgIGlmIChzcGV3KSB7cHJpbnRsbigic3JjRGlyOiR7cGF0aE5hbWV9IikgfQotICAgICAgICBzcmNEaXJQYXRoID0gcGF0aE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RGlyZWN0b3J5KEZpbGUgZGVzdERpcikgewotICAgICAgICBpZiAoc3BldykgeyBwcmludGxuKCJkZXN0RGlyOiR7ZGVzdERpcn0iKSB9Ci0gICAgICAgIHRhcmdldERpciA9IGRlc3REaXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChzcGV3KSB7IHByaW50bG4oImVuY29kaW5nOiR7ZW5jb2Rpbmd9IikgfQotICAgICAgICBzcmNFbmNvZGluZyA9IGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZXMoIEZpbGVbXSBjb21waWxlTGlzdCApIHsKLSAgICAgICAgaWYgKHNwZXcpIHsgcHJpbnRsbigiY29tcGlsZUxpc3Q6JHtjb21waWxlTGlzdH0iKSB9Ci0gICAgICAgIHNyY3MgPSBjb21waWxlTGlzdAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIHNwZXcgPSB2ZXJib3NlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGlsZSgpIHsKLSAgICAgICAgaWYgKHNwZXcpIHsgcHJpbnRsbigiY29tcGlsZSgpIikgfQotCi0KLSAgICAgICAgZm9yIChzcmMgaW4gc3JjcykgewotCi0gICAgICAgICAgICAvLyBtdW5nIHRoZSAke3Rlc3Quc3JjLmRpcn0vZ2xzL2NoMTQvczQgcGF0aCBpbnRvICR7ZGVzdC5kaXJ9L2dscy9jaDE0L3M0Ci0gICAgICAgICAgICAvLyBmaXJzdCBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIHBhdGggZS5nLiBnbHMvY2gxNC9zNAotICAgICAgICAgICAgcmVsYXRpdmVTcmNGaWxlUGF0aEFuZE5hbWUgPSBzcmMuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHNyY0RpclBhdGgubGVuZ3RoKCkgKyAxKQotICAgICAgICAgICAgcmVsYXRpdmVTcmNGaWxlTmFtZVN0YXJ0SW5kZXggPSByZWxhdGl2ZVNyY0ZpbGVQYXRoQW5kTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgICAgICByZWxhdGl2ZU91dHB1dFBhdGggPSAiIgotICAgICAgICAgICAgaWYgKHJlbGF0aXZlU3JjRmlsZU5hbWVTdGFydEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICByZWxhdGl2ZU91dHB1dFBhdGggPSByZWxhdGl2ZVNyY0ZpbGVQYXRoQW5kTmFtZS5zdWJzdHJpbmcoMCxyZWxhdGl2ZVNyY0ZpbGVOYW1lU3RhcnRJbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gZGV0ZXJtaW5lIHRoZSBhYnNvbHV0ZSBvdXRwdXQgcGF0aAotICAgICAgICAgICAgZ2hvc3RPdXRwdXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCByZWxhdGl2ZVNyY0ZpbGVQYXRoQW5kTmFtZSkKLSAgICAgICAgICAgIGdob3N0T3V0cHV0RmlsZVBhdGggPSBnaG9zdE91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgIGZpbGVOYW1lU3RhcnRJbmRleCA9IGdob3N0T3V0cHV0RmlsZVBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICAgICAgcmVhbE91dHB1dFBhdGggPSBnaG9zdE91dHB1dEZpbGVQYXRoLnN1YnN0cmluZygwLGZpbGVOYW1lU3RhcnRJbmRleCk7Ci0KLSAgICAgICAgICAgIC8vIG1rZGlyIGlmIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUocmVhbE91dHB1dFBhdGgpCi0gICAgICAgICAgICBpZiAoZGlyZWN0b3J5ICE9IG51bGwgJiYgIWRpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYSBzdWl0YWJsZSBqYXZhIGZpbGUgdG8gcHV0IHRoZXJlCi0gICAgICAgICAgICBmaWxlU3RlbSA9IHNyYy5uYW1lLnRva2VuaXplKCIuIilbMF0KLSAgICAgICAgICAgIHRhcmdldEZpbGVOYW1lID0gIiR7ZmlsZVN0ZW19VGVzdC5qYXZhIgotICAgICAgICAgICAgYW5PdXRwdXRGaWxlID0gbmV3IEZpbGUocmVhbE91dHB1dFBhdGgsIHRhcmdldEZpbGVOYW1lKQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdlbmVyYXRpbmcgIiArIHRhcmdldEZpbGVOYW1lKQotICAgICAgICAgICAgc29tZU91dHB1dFRleHQgPSBnZW5lcmF0b3IuZ2VuZXJhdGUocmVsYXRpdmVPdXRwdXRQYXRoLCB0YXJnZXREaXIsIHNyYy5uYW1lLHNyYy50ZXh0KTsKLSAgICAgICAgICAgIGlmIChzb21lT3V0cHV0VGV4dCAhPSBudWxsICYmIHNvbWVPdXRwdXRUZXh0ICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgYW5PdXRwdXRGaWxlLndyaXRlKHNvbWVPdXRwdXRUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9DbGFzc2ljR3Jvb3Z5VGVzdEdlbmVyYXRvckhlbHBlci5qYXZhIGIvZ3Jvb3Z5L2pzci90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL0NsYXNzaWNHcm9vdnlUZXN0R2VuZXJhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyN2ZlNjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL0NsYXNzaWNHcm9vdnlUZXN0R2VuZXJhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8vIEpTUiBwYXJzZXIKLS8vIEB0b2RvIC0gcmVmYWN0b3IgcHVsbGluZyBnZW5lcmljIHBhcnNlciBpbnRlcmZhY2UgdXAKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlMZXhlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlSZWNvZ25pemVyOwotCi0vLyBjb2RlaGF1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdXNhZ2UKLS8vIEB0b2RvIC0gcmVtb3ZlIGNsYXNzaWMgcmVmZXJlbmNlcyBmcm9tIHRoZSBUQ0sKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOwotaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOwotCi0vKiogSGVscGVyIG1ldGhvZHMgZm9yIGdlbmVyYXRlZCBUQ0sgdGVzdCBjYXNlIHVzaW5nIG5ldyBKU1IgcGFyc2VyIGFuZCBjbGFzc2ljIGdyb292eSBBU1QgYW5kIGV2YWx1YXRpb24gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2ljR3Jvb3Z5VGVzdEdlbmVyYXRvckhlbHBlciBpbXBsZW1lbnRzIFRlc3RHZW5lcmF0b3JIZWxwZXIgewotCi0gICAgLyoqIGV2YWx1YXRlIHRoZSBzb3VyY2UgdGV4dCBhZ2FpbnN0IHRoZSBjbGFzc2ljIEFTVCB3aXRoIHRoZSBKU1IgcGFyc2VyIGltcGxlbWVudGF0aW9uKi8KLSAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZShTdHJpbmcgdGhlU3JjVGV4dCwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGFyc2UodGhlU3JjVGV4dCwgdGVzdE5hbWUpOyAvLyBmYWlsIGVhcmx5IHdpdGggYSBkaXJlY3QgbWVzc2FnZSBpZiBwb3NzaWJsZScpCi0gICAgICAgIEdyb292eVNoZWxsIGdyb292eSA9IG5ldyBHcm9vdnlTaGVsbChuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBncm9vdnkucnVuKHRoZVNyY1RleHQsICJtYWluIiwgbmV3IEFycmF5TGlzdCgpKTsKLSAgICAgICAgLy9AdG9kbyAtIHdvcmsgb3V0IGhvdyB0byBlbnN1cmUgdGVzdCBmYWlsdXJlcyB0aHJvdyBleGNlcHRpb25zCi0gICAgfQotCi0gICAgLyoqIHJ1biB0aGUgSlNSIHBhcnNlciBpbXBsZW1lbnRhdGlvbiBvdmVyIHRoZSBzdXBwbGllZCBzb3VyY2UgdGV4dCovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHRoZVNyY1RleHQsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIiArIHRlc3ROYW1lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGhlU3JjVGV4dCkpOwotICAgICAgICAgICAgR3Jvb3Z5UmVjb2duaXplciByZWNvZ25pemVyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKHJlYWRlcik7Ci0gICAgICAgICAgICByZWNvZ25pemVyLmNvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlY29yYXRlV2l0aExpbmVOdW1iZXJzKHRoZVNyY1RleHQpKTsKLQotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlY29yYXRlV2l0aExpbmVOdW1iZXJzQW5kRXJyb3JNZXNzYWdlKHRoZVNyY1RleHQscGFyc2VFeGNlcHRpb24pKTsKLSAgICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVjb3JhdGVXaXRoTGluZU51bWJlcnNBbmRFcnJvck1lc3NhZ2UoU3RyaW5nIHRoZVNyY1RleHQsIFJlY29nbml0aW9uRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0aGVTcmNUZXh0KSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgbnVtYmVyZWRTcmNUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgaW50IGxpbmVOdW0gPSAxOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkgKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lTnVtKTsKLSAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXJzZUV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtID09IHBhcnNlRXhjZXB0aW9uLmdldExpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHBhZGRpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCJcdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sPTE7IGNvbDxwYXJzZUV4Y2VwdGlvbi5nZXRDb2x1bW4oKTtjb2wrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKHBhZGRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZCgiXiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQoIkVSUk9SOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQocGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQobGluZVNlcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKGxpbmVTZXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGluZU51bSsrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGVTcmNUZXh0ID0gbnVtYmVyZWRTcmNUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZVNyY1RleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVjb3JhdGVXaXRoTGluZU51bWJlcnMoU3RyaW5nIHRoZVNyY1RleHQpIHsKLSAgICAgICAgcmV0dXJuIGRlY29yYXRlV2l0aExpbmVOdW1iZXJzQW5kRXJyb3JNZXNzYWdlKHRoZVNyY1RleHQsbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsaW5lU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL0dlbmVyYXRlVGVzdENhc2VzLmphdmEgYi9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svR2VuZXJhdGVUZXN0Q2FzZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1NmZiZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svR2VuZXJhdGVUZXN0Q2FzZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgSmVyZW15IFJheW5lcgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC4qOwotCi0vKioKLSAqIEdlbmVyYXRlcyB0ZXN0IGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZwotICogYXJndW1lbnRzOgotICogPHVsPgotICogPGxpPnNvdXJjZWRpcgotICogPGxpPmRlc3RkaXIKLSAqIDwvdWw+Ci0gKiBCb3RoIGFyZSByZXF1aXJlZC4KLSAqIDxwPgotICogV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc291cmNlZGlyCi0gKiBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gZXhwYW5kIGludG8gdGVzdGNhc2VzLiBUaGlzIHRhc2sgbWFrZXMgaXRzCi0gKiBnZW5lcmF0aW9uIGRlY2lzaW9uIGJhc2VkIG9uIHRpbWVzdGFtcC4KLSAqCi0gKiBCYXNlZCBoZWF2aWx5IG9uIHRoZSBKYXZhYyBpbXBsZW1lbnRhdGlvbiBpbiBBbnQKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVUZXN0Q2FzZXMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewotCi0gICAgcHJpdmF0ZSBCYXRjaEdlbmVyYXRlIGJhdGNoR2VuZXJhdGUgPSBuZXcgQmF0Y2hHZW5lcmF0ZSgpOwotICAgIHByaXZhdGUgUGF0aCBzcmM7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7Ci0gICAgcHJpdmF0ZSBQYXRoIGNvbXBpbGVDbGFzc3BhdGg7Ci0gICAgcHJpdmF0ZSBQYXRoIGNvbXBpbGVTb3VyY2VwYXRoOwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGxpc3RGaWxlcyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBGaWxlW10gY29tcGlsZUxpc3QgPSBuZXcgRmlsZVswXTsKLQotICAgIHB1YmxpYyBHZW5lcmF0ZVRlc3RDYXNlcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcGF0aCBmb3Igc291cmNlIGNvbXBpbGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5lc3RlZCBzcmMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVTcmMoKSB7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgc3JjID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNyZWF0ZSBzcmMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmVzdGVkIHNyYyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBQYXRoIHJlY3JlYXRlU3JjKCkgewotICAgICAgICBzcmMgPSBudWxsOwotICAgICAgICByZXR1cm4gY3JlYXRlU3JjKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCi0gICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yaWVzIGFzIGEgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihQYXRoIHNyY0RpcikgewotICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKLSAgICAgICAgICAgIHNyYyA9IHNyY0RpcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNyYy5hcHBlbmQoc3JjRGlyKTsKLSAgICAgICAgfQotICAgICAgICBiYXRjaEdlbmVyYXRlLnNldFNyY2RpclBhdGgoc3JjLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNvdXJjZSBkaXJzIHRvIGZpbmQgdGhlIHNvdXJjZSBqYXZhIGZpbGVzLgotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBkaXJlY3RvcnlzIGFzIGEgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGdldFNyY2RpcigpIHsKLSAgICAgICAgcmV0dXJuIHNyYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQotICAgICAqIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC4KLSAgICAgKiBAcGFyYW0gZGVzdERpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgZGVzdERpcikgewotICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSB2ZXJib3NlIGNvbXBpbGluZyB3aGljaCB3aWxsIGRpc3BsYXkgd2hpY2ggZmlsZXMKLSAgICAgKiBhcmUgYmVpbmcgY29tcGlsZWQKLSAgICAgKiBAcGFyYW0gdmVyYm9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIGJhdGNoR2VuZXJhdGUuc2V0VmVyYm9zZSggdmVyYm9zZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBqYXZhIHNvdXJjZSBmaWxlcwotICAgICAqIHNob3VsZCBiZSBjb21waWxlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZGlyKCkgewotICAgICAgICByZXR1cm4gZGVzdERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgKiBAcGFyYW0gc291cmNlcGF0aCB0aGUgc291cmNlIHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VwYXRoKFBhdGggc291cmNlcGF0aCkgewotICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGlsZVNvdXJjZXBhdGggPSBzb3VyY2VwYXRoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29tcGlsZVNvdXJjZXBhdGguYXBwZW5kKHNvdXJjZXBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc291cmNlcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBwYXRoCi0gICAgICovCi0gICAgcHVibGljIFBhdGggZ2V0U291cmNlcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVTb3VyY2VwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwYXRoIHRvIHNvdXJjZXBhdGguCi0gICAgICogQHJldHVybiBhIHNvdXJjZXBhdGggdG8gYmUgY29uZmlndXJlZAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVNvdXJjZXBhdGgoKSB7Ci0gICAgICAgIGlmIChjb21waWxlU291cmNlcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21waWxlU291cmNlcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBpbGVTb3VyY2VwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBzb3VyY2UgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZXBhdGhSZWYoUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgY3JlYXRlU291cmNlcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIGFuIEFudCBQYXRoIG9iamVjdCBjb250YWluaW5nIHRoZSBjb21waWxhdGlvbiBjbGFzc3BhdGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7Ci0gICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgcGF0aAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC4KLSAgICAgKiBAcmV0dXJuIGEgY2xhc3MgcGF0aCB0byBiZSBjb25maWd1cmVkCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgKiBAcGFyYW0gciBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUVuY29kaW5nKCkgewotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdHJ1ZSwgbGlzdCB0aGUgc291cmNlIGZpbGVzIGJlaW5nIGhhbmRlZCBvZmYgdG8gdGhlIGNvbXBpbGVyLgotICAgICAqIEBwYXJhbSBsaXN0IGlmIHRydWUgbGlzdCB0aGUgc291cmNlIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGZpbGVzKGJvb2xlYW4gbGlzdCkgewotICAgICAgICBsaXN0RmlsZXMgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdGZpbGVzIGZsYWcuCi0gICAgICogQHJldHVybiB0aGUgbGlzdGZpbGVzIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRMaXN0ZmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0RmlsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1aWxkIHdpbGwgY29udGludWUKLSAgICAgKiBldmVuIGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnM7IGRlZmF1bHRzIHRvIHRydWUuCi0gICAgICogQHBhcmFtIGZhaWwgaWYgdHJ1ZSBoYWx0IHRoZSBidWlsZCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvY2VlZCBpbnZlcnNlIG9mIGZhaWxvZmVycm9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2VlZChib29sZWFuIHByb2NlZWQpIHsKLSAgICAgICAgZmFpbE9uRXJyb3IgPSAhcHJvY2VlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmYWlsb25lcnJvciBmbGFnLgotICAgICAqIEByZXR1cm4gdGhlIGZhaWxvbmVycm9yIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsb25lcnJvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgotICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrUGFyYW1ldGVycygpOwotICAgICAgICByZXNldEZpbGVMaXN0cygpOwotCi0gICAgICAgIC8vIHNjYW4gc291cmNlIGRpcmVjdG9yaWVzIGFuZCBkZXN0IGRpcmVjdG9yeSB0byBidWlsZCB1cAotICAgICAgICAvLyBjb21waWxlIGxpc3RzCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSBzcmMubGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxpc3RbaV0pOwotICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBcIiIgKyBzcmNEaXIuZ2V0UGF0aCgpICsgIlwiIGRvZXMgbm90IGV4aXN0ISIsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIgIT0gbnVsbCA/IGRlc3REaXIgOiBzcmNEaXIsIGZpbGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbXBpbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjb21waWxlZCBhbmQgY29waWVkLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEZpbGVMaXN0cygpIHsKLSAgICAgICAgY29tcGlsZUxpc3QgPSBuZXcgRmlsZVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcyB0byBiZSBjb21waWxlZC4KLSAgICAgKiBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlIGNsYXNzIHZhcmlhYmxlIGNvbXBpbGVMaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3JjRGlyICAgVGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gZGVzdERpciAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBmaWxlcyAgICBBbiBhcnJheSBvZiBmaWxlbmFtZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRGlyKEZpbGUgc3JjRGlyLCBGaWxlIGRlc3REaXIsIFN0cmluZ1tdIGZpbGVzKSB7Ci0gICAgICAgIEdsb2JQYXR0ZXJuTWFwcGVyIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKLSAgICAgICAgbS5zZXRGcm9tKCIqIik7Ci0gICAgICAgIG0uc2V0VG8oIiouaHRtbCIpOwotICAgICAgICBTb3VyY2VGaWxlU2Nhbm5lciBzZnMgPSBuZXcgU291cmNlRmlsZVNjYW5uZXIodGhpcyk7Ci0gICAgICAgIEZpbGVbXSBuZXdGaWxlcyA9IHNmcy5yZXN0cmljdEFzRmlsZXMoZmlsZXMsIHNyY0RpciwgZGVzdERpciwgbSk7Ci0KLSAgICAgICAgaWYgKG5ld0ZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIEZpbGVbXSBuZXdDb21waWxlTGlzdCA9IG5ldyBGaWxlW2NvbXBpbGVMaXN0Lmxlbmd0aCArIG5ld0ZpbGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbXBpbGVMaXN0LCAwLCBuZXdDb21waWxlTGlzdCwgMCwgY29tcGlsZUxpc3QubGVuZ3RoKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3RmlsZXMsIDAsIG5ld0NvbXBpbGVMaXN0LCBjb21waWxlTGlzdC5sZW5ndGgsIG5ld0ZpbGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBjb21waWxlTGlzdCA9IG5ld0NvbXBpbGVMaXN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjb21waWxlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIGFzIGFuIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIEZpbGVbXSBnZXRGaWxlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVMaXN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUGFyYW1ldGVycygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwgJiYgIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgXCIiICsgZGVzdERpciArICJcIiBkb2VzIG5vdCBleGlzdCAiICsgIm9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsCi0gICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCAmJiAhQ2hhcnNldC5pc1N1cHBvcnRlZChlbmNvZGluZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZW5jb2RpbmcgXCJcIiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21waWxlKCkgewotICAgICAgICBpZiAoY29tcGlsZUxpc3QubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgbG9nKAotICAgICAgICAgICAgICAgICJHZW5lcmF0aW5nIFRlc3RzICIKLSAgICAgICAgICAgICAgICAgICAgKyBjb21waWxlTGlzdC5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNvdXJjZSBmaWxlIgotICAgICAgICAgICAgICAgICAgICArIChjb21waWxlTGlzdC5sZW5ndGggPT0gMSA/ICIiIDogInMiKQotICAgICAgICAgICAgICAgICAgICArIChkZXN0RGlyICE9IG51bGwgPyAiIHRvICIgKyBkZXN0RGlyIDogIiIpKTsKLQotICAgICAgICAgICAgaWYgKGxpc3RGaWxlcykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGlsZUxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY29tcGlsZUxpc3RbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vQHRvZG8gLSBpcyB0aGlzIHVzZWZ1bD8KLSAgICAgICAgICAgICAgICAgICAgLy9iYXRjaE9mQmlzY3VpdHMuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmF0Y2hHZW5lcmF0ZS5zZXRUYXJnZXREaXJlY3RvcnkoZGVzdERpcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiYXRjaEdlbmVyYXRlLnNldFNvdXJjZUVuY29kaW5nKGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBiYXRjaEdlbmVyYXRlLmFkZFNvdXJjZXMoIGNvbXBpbGVMaXN0ICk7Ci0gICAgICAgICAgICAgICAgYmF0Y2hHZW5lcmF0ZS5jb21waWxlKCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIC8vQHRvZG8gLS0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIC8vbmV3IEVycm9yUmVwb3J0ZXIoIGUsIGZhbHNlICkud3JpdGUoIG5ldyBQcmludFdyaXRlcih3cml0ZXIpICk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9UZXN0R2VuZXJhdG9yLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9UZXN0R2VuZXJhdG9yLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhNmVkZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqCi0gKiBUaGlzIHdpbGwgdGFrZSBhIGdyb292eSB0ZXN0IGZpbGUgYW5kIHR1cm4gaXQgaW50byBhIEphdmEgVGVzdENhc2UKLSAqIEBhdXRob3IgSmVyZW15IFJheW5lcgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrCi1pbXBvcnQgamF2YS5pby4qOwotY2xhc3MgVGVzdEdlbmVyYXRvcnsKLSAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlKHJlYWxPdXRwdXRQYXRoLCB0YXJnZXREaXIsIHNyY05hbWUsc3JjVGV4dCkgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbignc2luZ2xlIFxcXFwnKQotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG91YmxlIFxcXFwiKQotICAgICAgICBzcmNUZXh0ID0gc3JjVGV4dC5yZXBsYWNlQWxsKCdcXFxcJywnXFxcXFxcXFwnKSAvLyBuZWVkIHRvIGVzY2FwZSBhIHNsYXNoIHdpdGggc2xhc2ggc2xhc2gKLQotICAgICAgICByZXN1bHRXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCkKLSAgICAgICAgcmVzdWx0ID0gbmV3IFByaW50V3JpdGVyKHJlc3VsdFdyaXRlcikKLQotICAgICAgICBmaWxlTmFtZSA9IHNyY05hbWUKLSAgICAgICAgZmlsZVN0ZW0gPSBmaWxlTmFtZS50b2tlbml6ZSgiLiIpWzBdCi0KLSAgICAgICAgY29tbWVudHMgPSBzY3JhcGUoc3JjVGV4dCwiICogIiwiLiIpIC8vIFRha2UgdGhlIGZpcnN0IGphdmFkb2Mgc2VudGVuY2UsIGlmIGl0IGV4aXN0cywgZm9yIHVzZSBhcyBtZXRob2QgbmFtZQotICAgICAgICBpZiAoY29tbWVudHMgPT0gbnVsbCB8fCBjb21tZW50c1swXSA9PSBudWxsKSB7Y29tbWVudHMgPSBbIiJdfQotICAgICAgICBiZWhhdmlvdXJEZXNjcmlwdGlvbiA9IGNvbW1lbnRzWzBdLnRyaW0oKQotCi0gICAgICAgIGlmICgiIiAhPSByZWFsT3V0cHV0UGF0aCkgewotICAgICAgICAgICAgcmVhbE91dHB1dFBhY2thZ2UgPSAnJwotICAgICAgICAgICAgaWYgKEZpbGUuc2VwYXJhdG9yICE9ICdcXCcpCi0gICAgICAgICAgICAgICAgcmVhbE91dHB1dFBhY2thZ2UgPSByZWFsT3V0cHV0UGF0aC5yZXBsYWNlQWxsKEZpbGUuc2VwYXJhdG9yLCcuJykKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZWFsT3V0cHV0UGFja2FnZSA9IHJlYWxPdXRwdXRQYXRoLnJlcGxhY2VBbGwoJ1xcXFwnLCcuJykKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCJwYWNrYWdlICR7cmVhbE91dHB1dFBhY2thZ2V9OyIpCi0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnByaW50bG4oImltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsiKQotICAgICAgICByZXN1bHQucHJpbnRsbigiaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrLio7IikKLQotICAgICAgICByZXN1bHQucHJpbnRsbigicHVibGljIGNsYXNzICR7ZmlsZVN0ZW19VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsiKQotCi0gICAgICAgIC8vbWV0aG9kTmFtZSA9IHR1cm5TZW50ZW5jZUludG9KYXZhTmFtZShiZWhhdmlvdXJEZXNjcmlwdGlvbikKLSAgICAgICAgbWV0aG9kTmFtZSA9ICIiCi0gICAgICAgIG1ldGhvZE5hbWUgPSAidGVzdCR7bWV0aG9kTmFtZX0iCi0KLSAgICAgICAgLy8gdGVzdCBmb3IgdGhlIHNvdXJjZSAnYXMgaXMnCi0gICAgICAgIHByaW50Q29tbW9uVGVzdE1ldGhvZFN0YXJ0KHJlc3VsdCwgIiR7bWV0aG9kTmFtZX1QYXNzIixzcmNUZXh0KQotICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICBoZWxwZXIuZXZhbHVhdGUoc3JjQnVmZmVyLnRvU3RyaW5nKCksIicgKyAiJHttZXRob2ROYW1lfVBhc3MiICsgJyIpOycpCi0gICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgfSIpCi0KLSAgICAgICAgLy8gdGVzdCBmb3IgZWFjaCBvZiB0aGUgJ0BwYXNzJyBhbHRlcm5hdGl2ZXMKLSAgICAgICAgcGFzc0FsdGVybmF0aXZlcyA9IGdlbmVyYXRlQWx0ZXJuYXRpdmVzKHNyY1RleHQsIkBwYXNzIikKLSAgICAgICAgcGFzc0FsdGVybmF0aXZlcy5lYWNoV2l0aEluZGV4e2FuQWx0ZXJuYXRpdmUsaXwKLSAgICAgICAgICAgIHByaW50Q29tbW9uVGVzdE1ldGhvZFN0YXJ0KHJlc3VsdCwgIiR7bWV0aG9kTmFtZX1QYXNzJHtpKzF9IixhbkFsdGVybmF0aXZlWzBdKTsKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgIGhlbHBlci5ldmFsdWF0ZShzcmNCdWZmZXIudG9TdHJpbmcoKSwiJyArICIke21ldGhvZE5hbWV9UGFzcyR7aSsxfSIgKyAnIik7JykKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgfSIpCi0gICAgICAgIH0KLQotICAgICAgICAvLyB0ZXN0IGZvciBlYWNoIG9mIHRoZSAnQGZhaWw6cGFyc2UnIGFsdGVybmF0aXZlcwotICAgICAgICBmYWlsdXJlVG9QYXJzZUFsdGVybmF0aXZlcyA9IGdlbmVyYXRlQWx0ZXJuYXRpdmVzKHNyY1RleHQsIkBmYWlsOnBhcnNlIikKLSAgICAgICAgZmFpbHVyZVRvUGFyc2VBbHRlcm5hdGl2ZXMuZWFjaFdpdGhJbmRleHthbkFsdGVybmF0aXZlLGl8Ci0gICAgICAgICAgICBwcmludENvbW1vblRlc3RNZXRob2RTdGFydChyZXN1bHQsICIke21ldGhvZE5hbWV9RmFpbFBhcnNlJHtpKzF9IixhbkFsdGVybmF0aXZlWzBdKTsKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgIHRyeSB7IikKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICBoZWxwZXIucGFyc2Uoc3JjQnVmZmVyLnRvU3RyaW5nKCksIicgKyAiJHttZXRob2ROYW1lfUZhaWxQYXJzZSR7aSsxfSIgKyAnIik7JykKLQotCi0gICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgZmFpbCgiVGhpcyBsaW5lIGRpZCBub3QgZmFpbCB0byBwYXJzZTogJyArIGFuQWx0ZXJuYXRpdmVbMV0gKyAnIik7JykKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IikKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgICAgICAvLyBpZ25vcmUgYW4gZXhjZXB0aW9uIGFzIHRoYXQgaXMgd2hhdCB3ZSdyZSBob3BpbmcgZm9yIGluIHRoaXMgY2FzZS4iKQotICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgfSIpCi0gICAgICAgICAgICByZXN1bHQucHJpbnRsbigiICAgIH0iKQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdCBmb3IgZWFjaCBvZiB0aGUgJ0BmYWlsJyBhbHRlcm5hdGl2ZXMsIGkuZS4gd2l0aG91dCBiZWluZyBmb2xsb3dlZCBieSBhIGNvbG9uCi0gICAgICAgIGZhaWx1cmVBbHRlcm5hdGl2ZXMgPSBnZW5lcmF0ZUFsdGVybmF0aXZlcyhzcmNUZXh0LCJAZmFpbCg/ITopIikKLSAgICAgICAgZmFpbHVyZUFsdGVybmF0aXZlcy5lYWNoV2l0aEluZGV4e2FuQWx0ZXJuYXRpdmUsaXwKLSAgICAgICAgICAgIHByaW50Q29tbW9uVGVzdE1ldGhvZFN0YXJ0KHJlc3VsdCwgIiR7bWV0aG9kTmFtZX1GYWlsJHtpKzF9IixhbkFsdGVybmF0aXZlWzBdKTsKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgIHRyeSB7IikKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICBoZWxwZXIuZXZhbHVhdGUoc3JjQnVmZmVyLnRvU3RyaW5nKCksIicgKyAiJHttZXRob2ROYW1lfUZhaWwke2krMX0iICsgJyIpOycpCi0gICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgZmFpbCgiVGhpcyBsaW5lIGRpZCBub3QgZmFpbCB0byBldmFsdWF0ZTogJyArIGFuQWx0ZXJuYXRpdmVbMV0gKyAnIik7JykKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IikKLSAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgICAgICAgICAvLyBpZ25vcmUgYW4gZXhjZXB0aW9uIGFzIHRoYXQgaXMgd2hhdCB3ZSdyZSBob3BpbmcgZm9yIGluIHRoaXMgY2FzZS4iKQotICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgfSIpCi0gICAgICAgICAgICByZXN1bHQucHJpbnRsbigiICAgIH0iKQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgcHJvdGVjdGVkIFN0cmluZyBsaW5lU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOycpCi0gICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgcHJvdGVjdGVkIFRlc3RHZW5lcmF0b3JIZWxwZXIgaGVscGVyID0gbmV3IENsYXNzaWNHcm9vdnlUZXN0R2VuZXJhdG9ySGVscGVyKCk7JykKLSAgICAgICAgcmVzdWx0LnByaW50bG4oIn0iKQotICAgICAgICByZXR1cm4gcmVzdWx0V3JpdGVyLnRvU3RyaW5nKCkKLSAgICB9Ci0KLQotICAgIC8vIC0tIHVzZWZ1bCBzdHVmZgotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbHRlcm5hdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgZ2l2ZW4gc291cmNlLCBvbmUgZm9yIGVhY2ggZW5kIG9mIGxpbmUgY29tbWVudCB0YWcgZS5nLiAvL0BmYWlsCi0gICAgICogd2lsbCByZW1vdmUgdGhlIGRvdWJsZSBzbGFzaCBmcm9tIHRoZSBzdGFydCBvZiBlYWNoIG9mIHRoZSBtYXRjaGluZyBsaW5lLgotICAgICAqIGUuZy4gc3JjIHRleHQgb2YuLi4KLSAgICAgKiA8cHJlPgotICAgICAqICAgICAvLyBhID0gMSAvLyBAZmFpbAotICAgICAqICAgICAvLyBiID0gMiAvLyBAZmFpbAotICAgICAqIDwvcHJlPgotICAgICAqIHdpbGwgcmV0dXJuCi0gICAgICogPHByZT4KLSAgICAgKiBbICJhID0gMSAvLyBAZmFpbCBOTFMgLy8gYiA9IDIgLy8gQGZhaWwiLAotICAgICAqICAgIi8vIGEgPSAxIC8vIEBmYWlsIE5MUyBiID0gMiAvLyBAZmFpbCIgXQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICovCi0gICAgTGlzdCBnZW5lcmF0ZUFsdGVybmF0aXZlcyhTdHJpbmcgc3JjVGV4dCwgU3RyaW5nIHRhZykgewotICAgICAgICBhbHRlcm5hdGl2ZXMgPSBbXQotICAgICAgICBtID0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZSgiLy8oLio/Ly9cXHMqIiArIHRhZyArICJcXFMqKVxccyIpLm1hdGNoZXIoc3JjVGV4dCkKLSAgICAgICAgd2hpbGUgKG0uZmluZCgpKSB7Ci0gICAgICAgICAgICBmb3VuZFRleHQgPSBtLmdyb3VwKDEpCi0gICAgICAgICAgICB1bmNvbW1lbnRlZFNyY1RleHQgPSAoc3JjVGV4dC5zdWJzdHJpbmcoMCxtLnN0YXJ0KCkpICsgIiAgIiArIHNyY1RleHQuc3Vic3RyaW5nKG0uc3RhcnQoKSArIDIpKQotICAgICAgICAgICAgYWx0ZXJuYXRpdmVzIDw8IFt1bmNvbW1lbnRlZFNyY1RleHQsIGZvdW5kVGV4dC5yZXBsYWNlQWxsKCciJywgJ1xcXFwiJyldCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsdGVybmF0aXZlcwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIHNldHVwIGNvZGUgZm9yIGVhY2ggdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICB2b2lkIHByaW50Q29tbW9uVGVzdE1ldGhvZFN0YXJ0KHJlc3VsdCwgZnVsbE1ldGhvZE5hbWUsc29tZVNyY1RleHQpIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHNvbWVTcmNUZXh0KQotCi0gICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgcHVibGljIHZvaWQgJHtmdWxsTWV0aG9kTmFtZX0oKSB0aHJvd3MgRXhjZXB0aW9uIHsiKQotICAgICAgICByZXN1bHQucHJpbnRsbigiICAgICAgICBTdHJpbmdCdWZmZXIgc3JjQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOyIpCi0KLSAgICAgICAgLy8gYXBwZW5kIGVhY2ggbGluZSB0byB0aGUgYnVmZmVyCi0gICAgICAgIGJ1ZmZlci5lYWNoTGluZSB7bGluZXwKLSAgICAgICAgICAgIC8vIGVzY2FwZSBkb3VibGUgcXVvdGVzCi0gICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlQWxsKCciJywnXFxcXCInKQotICAgICAgICAgICAgcmVzdWx0LnByaW50bG4gKCcgICAgICAgIHNyY0J1ZmZlci5hcHBlbmQoIicgKyBsaW5lICsgJyIpLmFwcGVuZChsaW5lU2VwKTsnKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHNlbnRlbmNlIGludG8gYSBKYXZhIHN0eWxlIG5hbWUgbGlrZSBUaGVRdWlja0Jyb3duRm94Ci0gICAgICovCi0gICAgU3RyaW5nIHR1cm5TZW50ZW5jZUludG9KYXZhTmFtZShTdHJpbmcgc2VudGVuY2UpIHsKLSAgICAgICAgLy91cHBlcmNhc2UgZWFjaCB3b3JkIGFuZCByZW1vdmUgc3BhY2VzIHRvIGdpdmUgY2FtZWwgY2FzZQotICAgICAgICB0b2tlbnMgPSBzZW50ZW5jZS50b2tlbml6ZSgiICw7Iik7Ci0gICAgICAgIG1ldGhvZE5hbWUgPSAiIgotICAgICAgICBmb3IgKHQgaW4gdG9rZW5zKSB7Ci0gICAgICAgICAgICBpZiAodC5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSArPSAoIHRbMF0udG9VcHBlckNhc2UoKSArIHRbMS4uLnQuc2l6ZSgpXS50b0xvd2VyQ2FzZSgpICkKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgKz0gdFswXS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlbW92ZSBub25hbHBoYW51bWVyaWMgY2hhcmFjdGVycwotICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5yZXBsYWNlQWxsKCJbXkEtWmEtejAtOV0iLCIiKQotCi0gICAgICAgIHJldHVybiBtZXRob2ROYW1lCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhIGxpc3Qgb2YgYWxsIHRoZSBvY2N1cmFuY2VzIG9mIHRleHQgYmV0d2VlbiBhIHN0cmluZyBkZWxpbWl0ZXIuCi0gICAgICovCi0gICAgTGlzdCBzY3JhcGUoU3RyaW5nIHR4dCwgU3RyaW5nIHRhZykgewotICAgICAgICByZXR1cm4gc2NyYXBlKHR4dCx0YWcsdGFnKQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoZXMgYSBsaXN0IG9mIGFsbCB0aGUgb2NjdXJhbmNlcyBvZiB0ZXh0IGJldHdlZW4gdHdvIHN0cmluZyBkZWxpbWl0ZXJzICh0YWdzKS4KLSAgICAgKi8KLSAgICBMaXN0IHNjcmFwZShTdHJpbmcgdHh0LCBTdHJpbmcgb3BlblRhZywgU3RyaW5nIGNsb3NlVGFnKSB7Ci0gICAgICAgIGkgPSAwOyBqID0gMDsgayA9IDA7Ci0gICAgICAgIGNvbnRlbnRzID0gW10KLSAgICAgICAgaWYgKHR4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaT4gLTEgJiYgayA+IC0xKSB7Ci0gICAgICAgICAgICAgIGkgPSB0eHQuaW5kZXhPZihvcGVuVGFnLGspCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAtMSkgewotICAgICAgICAgICAgICAgICAgaiA9IGkgKyBvcGVuVGFnLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgIGlmIChqID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICBrID0gdHh0LmluZGV4T2YoY2xvc2VUYWcsaikKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPDwgdHh0LnN1YnN0cmluZyhqLGspCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRzCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvckhlbHBlci5qYXZhIGIvZ3Jvb3Z5L2pzci90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL1Rlc3RHZW5lcmF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiMTRhNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrOwotCi0vKiogSGVscGVyIG1ldGhvZHMgdXNlZCBieSBnZW5lcmF0ZWQgVENLIHRlc3QgY2FzZXMgKi8KLQotcHVibGljIGludGVyZmFjZSBUZXN0R2VuZXJhdG9ySGVscGVyIHsKLSAgICB2b2lkIGV2YWx1YXRlKFN0cmluZyB0aGVTcmNUZXh0LCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb247Ci0gICAgdm9pZCBwYXJzZShTdHJpbmcgdGhlU3JjVGV4dCwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svc3R5bGVzL2p1bml0LWZyYW1lcy54c2wgYi9ncm9vdnkvanNyL3Rjay9zdHlsZXMvanVuaXQtZnJhbWVzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwOGM1YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay9zdHlsZXMvanVuaXQtZnJhbWVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgeG1sbnM6cmVkaXJlY3Q9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9yZWRpcmVjdCIKLSAgICB4bWxuczpzdHJpbmd1dGlscz0ieGFsYW46Ly9vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzIgotICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Ci08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KLTx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIvPgotPCEtLQotICAgQ29weXJpZ2h0IDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPCEtLQotCi0gU2FtcGxlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCB3aXRoIEFudCBKVW5pdFJlcG9ydCBvdXRwdXQuCi0KLSBJdCBjcmVhdGVzIGEgc2V0IG9mIEhUTUwgZmlsZXMgYSBsYSBqYXZhZG9jIHdoZXJlIHlvdSBjYW4gYnJvd3NlIGVhc2lseQotIHRocm91Z2ggYWxsIHBhY2thZ2VzIGFuZCBjbGFzc2VzLgotCi0gQGF1dGhvciBTdGVwaGFuZSBCYWlsbGlleiA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciLz4KLSBAYXV0aG9yIEVyaWsgSGF0Y2hlciA8YSBocmVmPSJtYWlsdG86ZWhhdGNoZXJAYXBhY2hlLm9yZyIvPgotIEBhdXRob3IgTWFydGlqbiBLcnVpdGhvZiA8YSBocmVmPSJtYWlsdG86bWFydGlqbkBrcnVpdGhvZi54czRhbGwubmwiLz4KLQotLS0+Ci08eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+Ci0gICAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9zdHlsZXNoZWV0LmNzcyI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+Ci0gICAgPC9yZWRpcmVjdDp3cml0ZT4KLQotICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucGFja2FnZXMiLz4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIHByb2Nlc3MgYWxsIHBhY2thZ2VzIC0tPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5kaXIiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkbmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkbmFtZSwnLicsJy8nKSIvPjwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRuYW1lID0gJyciPi48L3hzbDppZj4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICA8IS0tUHJvY2Vzc2luZyBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dC5kaXIiLz4gLS0+Ci0gICAgPCEtLSBjcmVhdGUgYSBjbGFzc2VzLWxpc3QuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+Ci0gICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1mcmFtZS5odG1sIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+Ci0gICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwvcmVkaXJlY3Q6d3JpdGU+Ci0KLSAgICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KLSAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlLnN1bW1hcnkiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3JlZGlyZWN0OndyaXRlPgotCi0gICAgPCEtLSBmb3IgZWFjaCBjbGFzcywgY3JlYXRlcyBhIEBuYW1lLmh0bWwgLS0+Ci0gICAgPCEtLSBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIHdpdGggaW5uZXIgY2xhc3NlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiAtLT4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW0BwYWNrYWdlID0gJG5hbWVdIj4KLSAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BuYW1lfS5odG1sIj4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyIvPgotICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+Ci0gICAgICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9LW91dC50eHQiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuL3N5c3RlbS1vdXQiIC8+Ci0gICAgICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPgotICAgICAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BuYW1lfS1lcnIudHh0Ij4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi9zeXN0ZW0tZXJyIiAvPgotICAgICAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+R3Jvb3Z5IFRDSyBSZXN1bHRzLjwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxmcmFtZXNldCBjb2xzPSIyMCUsODAlIj4KLSAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgotICAgICAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgotICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgotICAgICAgICA8L2ZyYW1lc2V0PgotICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KLSAgICAgICAgPG5vZnJhbWVzPgotICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotICAgICAgICAgICAgPC9wPgotICAgICAgICA8L25vZnJhbWVzPgotICAgIDwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Ci1ib2R5IHsKLSAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgY29sb3I6IzAwMDAwMDsKLX0KLXRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7Ci0gICAgZm9udC1zaXplOiA2OCU7Ci19Ci10YWJsZS5kZXRhaWxzIHRyIHRoewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIHRleHQtYWxpZ246bGVmdDsKLSAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Ci19Ci10YWJsZS5kZXRhaWxzIHRyIHRkewotICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKLX0KLQotcCB7Ci0gICAgbGluZS1oZWlnaHQ6MS41ZW07Ci0gICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKLX0KLWgxIHsKLSAgICBtYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oMiB7Ci0gICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oMyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotaDQgewotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKLX0KLWg1IHsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCi19Ci1oNiB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQotfQotLkVycm9yIHsKLSAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Ci19Ci0uRmFpbHVyZSB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOwotfQotLlByb3BlcnRpZXMgewotICB0ZXh0LWFsaWduOnJpZ2h0OwotfQotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHRlc3RzdWl0ZSBjbGFzcy4KLSAgICBJdCBwcmludHMgYSBzdW1tYXJ5IG9mIHRoZSB0ZXN0c3VpdGUgYW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgdGVzdGNhc2UgbWV0aG9kcy4KLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iY2xhc3MuZGV0YWlscyI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLm5hbWUiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICA8dGl0bGU+R3Jvb3Z5IFRDSyBSZXN1bHRzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotICAgICAgICB2YXIgVGVzdENhc2VzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHZhciBjdXI7Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgotICAgICAgIDwvc2NyaXB0PgotICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCi0gICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7Ci0gICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKLSAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50Lm9wZW4oKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOwotICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7Ci0gICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKLSAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7Ci0gICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKLSAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgICAgZG9jLmNsb3NlKCk7Ci0gICAgICAgICAgd2luLmZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICAgIF1dPgotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPkNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvaDM+Ci0KLQotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDxoMj5UZXN0czwvaDI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+Ci0gICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tb3V0LnR4dDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgJiMxODc7Ci0gICAgICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHAvPgotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQotICAgICAgICAgICAgICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5Ci0gICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgPGE+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgJiMxODc7Ci0gICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+Ci0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgICAgICAgIDxhPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tb3V0LnR4dDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQgJiMxODc7Ci0gICAgICAgICAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPgotICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgotICAgICAgICAgICAgICAgICAgICA8YT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LWVyci50eHQ8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyICYjMTg3OwotICAgICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0KLSAgIFdyaXRlIHByb3BlcnRpZXMgaW50byBhIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmUuCi0gICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpZGVhIGJ5IEVyaWsgSGF0Y2hlciAoZWhhdGNoZXJAYXBhY2hlLm9yZykKLSAgIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KLSAgICBjdXIgPSBUZXN0Q2FzZXNbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4nXSA9IG5ldyBBcnJheSgpOwotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgY3VyWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nXSA9ICc8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9IkB2YWx1ZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JzsKLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHBhY2thZ2UuCi0gICAgSXQgcHJpbnRzIHRoZSBuYW1lIG9mIGFsbCBjbGFzc2VzIHRoYXQgYmVsb25ncyB0byB0aGlzIHBhY2thZ2UuCi0gICAgQHBhcmFtIG5hbWUgdGhlIHBhY2thZ2UgbmFtZSB0byBwcmludCBjbGFzc2VzLgotICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBsaXN0IG9mIGNsYXNzZXMgaW4gYSBwYWNrYWdlIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSIvPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx0aXRsZT5Hcm9vdnkgVENLIENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC90YWJsZT4KLQotICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLSAgICBvbiBlYWNoIGNsYXNzLgotLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHRpdGxlPkFsbCBHcm9vdnkgVENLIENsYXNzZXM8L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+Ci0gICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlIiBtb2RlPSJhbGwuY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgotICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgIDxhIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0KLSAgICBDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24KLSAgICBlYWNoIHBhY2thZ2UgZXhpc3Rpbmcgb24gdGVzdHN1aXRlcy4KLSAgICBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGhlcmUsIEkgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGhhbmRsZSB1bm5hbWVkIHBhY2thZ2UgOigKLS0tPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8dGl0bGU+QWxsIEdyb292eSBUQ0sgUGFja2FnZXM8L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KLSAgICAgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+Ci0gICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJhbGwucGFja2FnZXMiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KLSAgICAgICAgICAgIDxhIGhyZWY9Ii4ve3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KLSAgICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgotICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDx0aXRsZT5Hcm9vdnkgVENLIFJlc3VsdHM6IFN1bW1hcnk8L3RpdGxlPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxsY2xhc3Nlcy1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KLSAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KLSAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgotICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotCi0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgotICAgICAgICBOb3RlOiA8ZW0+ZmFpbHVyZXM8L2VtPiBhcmUgYW50aWNpcGF0ZWQgYW5kIGNoZWNrZWQgZm9yIHdpdGggYXNzZXJ0aW9ucyB3aGlsZSA8ZW0+ZXJyb3JzPC9lbT4gYXJlIHVuYW50aWNpcGF0ZWQuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGgyPlBhY2thZ2VzPC9oMj4KLSAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KLSAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotICAgICAgICAgICAgICAgIDwhLS0gZ2V0IHRoZSBub2RlIHNldCBjb250YWluaW5nIGFsbCB0ZXN0c3VpdGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5zYW1lcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iLz4KLSAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXkgYSBmYWlsdXJlIGlmIHRoZXJlIGlzIGFueSBmYWlsdXJlL2Vycm9yIGluIHRoZSBwYWNrYWdlIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4ve3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwYWNrYWdlID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICA8L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRlc3RzKSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0aW1lKSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+Ci0gICAgPGh0bWw+Ci0gICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgotICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KLQotICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KLSAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KLSAgICAgICAgICAgIDwvdGFibGUtLT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIi8+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlIiBtb2RlPSJwcmludC50ZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KLSAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKLS0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KLSAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgotICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgotICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+Ci0gICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+Ci0gICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgotICAgIDwveHNsOmlmPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L2xpbms+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotCi08IS0tIFBhZ2UgSEVBREVSIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KLSAgICA8aW1nIHNyYz0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvaW1hZ2VzL2dyb292eS1sb2dvLnBuZyIgYWx0PSJHcm9vdnkiLz4KLSAgICA8aDE+VENLIFJlc3VsdHM8L2gxPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9Imh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnL2pzci9zcGVjIj5TcGVjaWZpY2F0aW9uPC9hPi48L3RkPgotICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8aHIgc2l6ZT0iMSIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gY2xhc3MgaGVhZGVyIC0tPgotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KLSAgICAgICAgPHRoPlRlc3RzPC90aD4KLSAgICAgICAgPHRoPkVycm9yczwvdGg+Ci0gICAgICAgIDx0aD5GYWlsdXJlczwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08IS0tIG1ldGhvZCBoZWFkZXIgLS0+Ci08eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KLSAgICA8dHIgdmFsaWduPSJ0b3AiPgotICAgICAgICA8dGg+TmFtZTwvdGg+Ci0gICAgICAgIDx0aD5TdGF0dXM8L3RoPgotICAgICAgICA8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+Ci0gICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgotICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6YXR0cmlidXRlPgotICAgICAgICA8dGQ+PGEgaHJlZj0ie0BuYW1lfS5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRlc3RzIi8+PC90ZD4KLSAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGVycm9ycyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvdGQ+Ci0gICAgICAgIDx0ZD48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+Ci0gICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj5FcnJvcjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlRhYmxlUm93Q29sb3I8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgotICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgotICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gTm90ZSA6IHRoZSBiZWxvdyB0ZW1wbGF0ZSBlcnJvciBhbmQgZmFpbHVyZSBhcmUgdGhlIHNhbWUgc3R5bGUKLSAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgotICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KLSAgICA8YnIvPjxici8+Ci0gICAgPGNvZGU+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KLSAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4KLSAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L2NvZGU+Ci0gICAgPCEtLSB0aGUgbGF0dGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+Ci0gICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLQotPCEtLQotICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKLSAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCi0tLT4KLTx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJiciI+PGJyLz48L3hzbDpwYXJhbT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsJGJyKScvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDEvVW5pY29kZTEuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDEvVW5pY29kZTEuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzdiOTRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczAxL1VuaWNvZGUxLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2UgZ2xzLmNoMDMuczAxOwotLyoqCi0gKiBFeGNlcHQgZm9yIGNvbW1lbnRzLCBpZGVudGlmaWVycyBhbmQgdGhlIGNvbnRlbnRzIG9mIC4uLiBzdHJpbmcgCi0gKiBsaXRlcmFscywgYWxsIGlucHV0IGVsZW1lbnRzIGFyZSBmb3JtZWQgZnJvbSBBU0NJSSBjaGFyYWN0ZXJzLgotICoKLSAqIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHRlc3QgdGhlc2UgdGhpbmdzCi0gKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGxpdHRsZSBoYXJkIHRvIHRlc3Qgc2luY2UgdGhlIGlucHV0IGZpbGUgaXMgQVNDSUkuCi0gKi8KLQotY2xhc3MgVW5pY29kZTEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbW1lbnRzKCkgewotICAgICAgICAvLyBVbmljb2RlIGlzIGFsbG93ZWQgaW4gY29tbWVudHMKLSAgICAgICAgLy8gVGhpcyBpcyBhIGNvbW1lbnQgXHUwNDEwXHUwNDA2XHUwNDE0XHUwNDE5Ci0gICAgICAgIC8qIEFub3RoZXIgY29tbWVudCBcdTA1RDBcdTIxMzZcdTA1ZDNcdTA1ZDcgKi8KLQotICAgICAgICAvKiovIC8vIFRpbnkgY29tbWVudAotICAgICAgICAvKioqLyAvLyBBbHNvIHZhbGlkCi0KLSAgICAgICAgLy8gTmVlZCB0byB0ZXN0IHN0cmluZyBsaXRlcmFscyBhbmQgaWRlbnRpZmllcnMKLSAgICAgICAgcHJpbnRsbiAiQWxsIGlzIHdlbGwiCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMi9Mb25nZXN0MS5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMi9Mb25nZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGM4OTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDIvTG9uZ2VzdDEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMDIKLQotLyoqCi0gKiBHTFMgMy4yOiBUaGUgbG9uZ2VzdCBwb3NzaWJsZSB0cmFuc2xhdGlvbiBpcyB1c2VkIGF0IGVhY2ggc3RlcCwgZXZlbiBpZiB0aGUgCi0gKiByZXN1bHQgZG9lcyBub3QgdWx0aW1hdGVseSBtYWtlIGEgY29ycmVjdCBwcm9ncmFtIHdoaWxlIGFub3RoZXIgbGV4aWNhbCAKLSAqIHRyYW5zbGF0aW9uIHdvdWxkLgotICogCi0gKiBUaGlzIGlzIGZ1bmRhbWVudGFsIHRvIHRoZSB3YXkgdGhlIGxleGVyIHdvcmtzLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aAotICogaXQsIG90aGVyIHRlc3RzIChlLmcuIHRvIHRlc3QgZnVuY3Rpb25hbGl0eSBvZiBvcGVyYXRvcnMgb3IgaWRlbnRpZmllcgotICogbmFtZXMpIHdvdWxkIGV4cG9zZSBpdCBxdWlja2x5LiBOZXZlcnRoZWxlc3MsIHdlIHRlc3Qgc29tZSBjb21iaW5hdGlvbnMKLSAqIGhlcmUgZm9yIGNvbnNpc3RlbmN5LgotICovCi1jbGFzcyBMb25nZXN0MSBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIC8vIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycwotICAgIHZvaWQgdGVzdFByZWZpeEluY0RlYygpIHsKLSAgICAgICAgZGVmIGEgPSAyMAotICAgICAgICBkZWYgYiA9IDEwCi0gICAgICAgIGRlZiBjID0gYSAtIGIKLSAgICAgICAgLy9jID0gYSAtLSBiIC8vIEBmYWlsOnBhcnNlIAotICAgICAgICAvL2MgPSBhICsrIGIgLy8gQGZhaWw6cGFyc2UKLSAgICAgICAgLy9jID0gYSArLSBiIC8vIEBwYXNzCi0gICAgICAgIC8vYyA9IGEgLSsgYiAvLyBAcGFzcwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDMvQ29tbWVudFNlcGFyYXRlc1Rva2Vucy5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Db21tZW50U2VwYXJhdGVzVG9rZW5zLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlNTRlMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Db21tZW50U2VwYXJhdGVzVG9rZW5zLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2UgZ2xzLmNoMDMuczAzCi0vKioKLSAqIEdMUyAzLjM6IC4uLmNvbW1lbnRzICinMy43KSBjYW4gc2VydmUgdG8gc2VwYXJhdGUgdG9rZW5zIHRoYXQsIGlmIGFkamFjZW50LAotICogbWlnaHQgYmUgdG9rZW5pemVkIGluIGFub3RoZXIgbWFubmVyLgotICoKLSAqIFNlZSBhbHNvIHRoZSBXaGl0ZXNwYWNlIHRlc3RzICgzLjYpCi0gKi8KLWNsYXNzIENvbW1lbnRTZXBhcmF0ZXNUb2tlbnMgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDb21tZW50U2VwYXJhdGVzKCkgewotICAgICAgICBkZWYgYSA9IDEKLSAgICAgICAgYSAtPSAxCi0gICAgICAgIC8vIGEgLS8qIGEgY29tbWVudCAqLz0gMSAvLyBmYWlsOiBwYXJzZQotCi0gICAgICAgIGRlZi8qIGFub3RoZXIgY29tbWVudCAqL2IgPSAyCi0gICAgICAgIGFzc2VydCBiID09IDIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Vbmljb2RlRXNjYXBlczEuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDMvVW5pY29kZUVzY2FwZXMxLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkOGQ5OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Vbmljb2RlRXNjYXBlczEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMDMKLS8qKgotICogR0xTIDMuMzoKLSAqIEltcGxlbWVudGF0aW9ucyBmaXJzdCByZWNvZ25pemUgVW5pY29kZSBlc2NhcGVzIGluIHRoZWlyIGlucHV0LCB0cmFuc2xhdGluZyAKLSAqIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIGJhY2tzbGFzaCBhbmQgJ3UnIGZvbGxvd2VkIGJ5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzCi0gKiB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgaW5kaWNhdGVkIGhleGFkZWNpbWFsIHZhbHVlLCBhbmQgcGFzc2luZwotICogYWxsIG90aGVyIGNoYXJhY3RlcnMgdW5jaGFuZ2VkLiAgCi0gKi8KLQotY2xhc3MgVW5pY29kZUVzY2FwZXMxIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QWxsSGV4RGlnaXRzKCkgewotICAgICAgICAvLyBBbGwgaGV4IGRpZ2l0cyB3b3JrIChjaGFyIGRlZjAgaXMgYSBzcGVjaWFsIGNvZGVwb2ludCkKLSAgICAgICAgZGVmIHMgPSAiXHUxMjM0XHU1Njc4XHU5YWJjXHUwZmVkXHU5QUJDXHUwRkVDIgotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoMCkgPT0gMHgxMjM0Ci0gICAgICAgIGFzc2VydCBzLmNoYXJBdCgxKSA9PSAweDU2NzgKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDIpID09IDB4OWFiYwotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoMykgPT0gMHgwZmVkCi0gICAgICAgIGFzc2VydCBzLmNoYXJBdCg0KSA9PSAweDlhYmMKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDUpID09IDB4MGZlYwotICAgIH0KLQotICAgIC8vIEdMUzogSWYgYW4gZXZlbiBudW1iZXIgb2YgYmFja3NsYXNoZXMgcHJlY2VkZSB0aGUgJ3UnLCBpdCBpcyBub3QgCi0gICAgLy8gYW4gZXNjYXBlCi0gICAgdm9pZCB0ZXN0Q291bnRCYWNrc2xhc2goKSB7Ci0gICAgICAgIGRlZiBhID0gMQotICAgICAgICBhc3NlcnQgXHUwMDYxID09IDEgLy8gY2hhciA2MSBpcyAnYScKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdCBpbnRlcHJldGVkIGFzIGFuIGVzY2FwZQotICAgICAgICAvLyBcXHUwMDYxID09IDEgLy8gQGZhaWw6cGFyc2UKLQotICAgICAgICBhc3NlcnQgIlx1MDA2MSIubGVuZ3RoKCkgPT0gMQotICAgICAgICAvLyBEb3VibGUgYmFja3NsYXNoIGludGVycHJldGVkIGFzIGEgc2luZ2xlIGJhY2tzbGFzaCBpbiBzdHJpbmcKLSAgICAgICAgYXNzZXJ0ICJcXHUwMDYxIi5sZW5ndGgoKSA9PSA2Ci0gICAgICAgIGFzc2VydCAiXFxcdTAwNjEiLmxlbmd0aCgpID09IDIKLSAgICAgICAgCi0gICAgfQotCi0gICAgLy8gVGhlcmUgY2FuIGJlIDEgb3IgbW9yZSB1J3MgYWZ0ZXIgdGhlIGJhY2tzbGFzaAotICAgIHZvaWQgdGVzdE11bHRpcGxlVXMoKSB7Ci0gICAgICAgIGFzc2VydCAiXHV1MDA2MSIgPT0gImEiCi0gICAgICAgIGFzc2VydCAiXHV1dTAwNjEiID09ICJhIgotICAgICAgICBhc3NlcnQgIlx1dXV1dTAwNjEiID09ICJhIgotICAgIH0KLQotICAgIC8vIEdMUzogSWYgYW4gZWxpZ2libGUgXCBpcyBmb2xsb3dlZCBieSB1LCBvciBtb3JlIHRoYW4gb25lIHUsIGFuZCB0aGUgbGFzdCB1Ci0gICAgLy8gaXMgbm90IGZvbGxvd2VkIGJ5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLCB0aGVuIGEgY29tcGlsZS10aW1lIGVycm9yCi0gICAgLy8gb2NjdXJzLgotICAgIHZvaWQgdGVzdEZvdXJIZXhEaWdpdHMoKSB7Ci0gICAgICAgIC8vIHRoZXNlIG5leHQgbGluZXMgd29uJ3Qgd29yay4gVGhlIGJhY2tzbGFzaCBoYXMgYmVlbiByZXBsYWNlIGJ5IGEgCi0gICAgICAgIC8vIGZvcndhcmRzIHNsYXNoIHNvIHRoYXQgdGhlIGZpbGUgcGFyc2VzLiAoQ29tbWVudHMgZG9uJ3QgY29tbWVudCBvdXQKLSAgICAgICAgLy8gdW5pY29kZSBlc2NhcGVzLikKLSAgICAgICAgLy8gYXNzZXJ0ICIvdTciID09ICJcMDciIC8vQGZhaWw6cGFyc2UgCi0gICAgICAgIC8vIGRlZiAvdTYxID0gMiAvL0BmYWlsOnBhcnNlIAotICAgICAgICAvLyBkZWYgL3UwNjEgPSAyIC8vQGZhaWw6cGFyc2UgCi0KLSAgICAgICAgLy8gSWYgZml2ZSBkaWdpdHMsIG9ubHkgdGhlIGZpcnN0IGZvdXIgY291bnQKLSAgICAgICAgZGVmIFx1MDA2MTAgPSAyIAotICAgICAgICBhc3NlcnQgYTAgPT0gMgotICAgIH0KLQotICAgIHZvaWQgdGVzdE90aGVyVmFyaWF0aW9ucygpIHsKLSAgICAgICAgLy8gQ2FwaXRhbCAnVScgbm90IGFsbG93ZWQKLSAgICAgICAgLy8gZGVmIFxVMDA2MSA9IDEgLy8gQGZhaWw6cGFyc2UgCi0gICAgfQotCi0gICAgLy8gR0xTOiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHVzZSB0aGUgXCB1eHh4eCBub3RhdGlvbiBhcyBhbiBvdXRwdXQgZm9ybWF0IHRvCi0gICAgLy8gZGlzcGxheSBVbmljb2RlIGNoYXJhY3RlcnMgd2hlbiBhIHN1aXRhYmxlIGZvbnQgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAvLyAodG8gYmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkpCi0KLSAgICAvLyBHTFM6IFJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMgcmVxdWlyZXMgdHdvIGNvbnNlY3V0aXZlIFVuaWNvZGUKLSAgICAvLyBlc2NhcGVzLiAKLSAgICAvLyAobm90IHN1cmUgaG93IHRvIHRlc3QpCi0KLSAgICAvLyBBbHNvOiB0ZXN0IHVuaWNvZGUgZXNjYXBlcyBsYXN0IGluIGZpbGUKLSAgICAvLyBhbmQgaW52YWxpZCBlc2NhcGVzIGF0IGVuZCBvZiBmaWxlCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNC9BbGxvd2VkTGluZVRlcm1pbmF0b3JzMS5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNC9BbGxvd2VkTGluZVRlcm1pbmF0b3JzMS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NGQyMjUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDQvQWxsb3dlZExpbmVUZXJtaW5hdG9yczEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMDQKLS8qKgotICogR0xTIDMuNDoKLSAqIFRoaXMgZGVmaW5pdGlvbiBvZiBsaW5lcyBkZXRlcm1pbmVzIHRoZSBsaW5lIG51bWJlcnMKLSAqIHByb2R1Y2VkIGJ5IGEgSmF2YSBjb21waWxlciBvciBvdGhlciBzeXN0ZW0gY29tcG9uZW50LgotICovCi0KLWNsYXNzIEFsbG93ZWRMaW5lVGVybWluYXRvcnMxIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIHZvaWQgdGVzdE1lc3NhZ2VMaW5lTnVtYmVycygpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIE5lZWQgdG8gZXhlY3V0ZSBjb21waWxlciBhbmQgY2hlY2sgZm9yIGNvcnJlY3QgbGluZSBudW1iZXJzIAotICAgICAgICAvLyBpbiBtZXNzYWdlcwotCi0gICAgICAgIC8vIFRlc3QgQ1IsIExGIGFuZCBDUkxGLiBCZSBjYXJlZnVsIHRoYXQgQ1JMRiBjb3VudHMgYXMgb25lIGxpbmUsIG5vdAotICAgICAgICAvLyB0d28KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNhbid0IHRlc3QgdGhpcywgeWV0IikKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA0L0FsbG93ZWRMaW5lVGVybWluYXRvcnMyLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA0L0FsbG93ZWRMaW5lVGVybWluYXRvcnMyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0NjM1Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNC9BbGxvd2VkTGluZVRlcm1pbmF0b3JzMi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1wYWNrYWdlIGdscy5jaDAzLnMwNAotLyoqCi0gKiBHTFMgMy40OgotICogLi4uICBJdCBhbHNvICogc3BlY2lmaWVzIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGUgLy8gZm9ybSBvZiBhIGNvbW1lbnQKLSAqICinMy43KS4KLSAqLwotY2xhc3MgQWxsb3dlZExpbmVUZXJtaW5hdG9yczIgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RMaW5lRW5kaW5ncygpIHsKLSAgICAgICAgZGVmIGEgPSAxCi0gICAgICAgIC8vIFRoaXMgY29tbWVudCBlbmRzIHdpdGggYSBDUiBcdTAwMTMgYSA9IDIKLSAgICAgICAgYXNzZXJ0IGEgPT0gMgotICAgICAgICAvLyBUaGlzIGNvbW1lbnQgZW5kcyB3aXRoIGEgTEYgXHUwMDBhIGEgPSAzCi0gICAgICAgIGFzc2VydCBhID09IDMKLSAgICAgICAgLy8gVGhpcyBjb21tZW50IGVuZHMgd2l0aCBhIENSTEYgXHUwMDEzXHUwMDBhIGEgPSA0Ci0gICAgICAgIGFzc2VydCBhID09IDQKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA1L0VuZFdpdGhTVUIxLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA1L0VuZFdpdGhTVUIxLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3NTViYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNS9FbmRXaXRoU1VCMS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vL3ZpOiBiaW5hcnk6bm9lb2wKLXBhY2thZ2UgZ2xzLmNoMDMuczA1Ci0KLS8vIE5vdGU6IHRoaXMgZmlsZSBtdXN0IG5vdCBoYXZlIGEgdHJhaWxpbmcgRU9MLiBGb3IgdGhpcyByZWFzb24sIAotLy8gaXQgc2hvdWxkIGJlIHN0b3JlZCBpbiBDVlMgYXMgYSBiaW5hcnkgZmlsZSAoLWtiKQotCi0vKioKLSAqIEdMUyAzLjU6Ci0gKiBBcyBhIHNwZWNpYWwgY29uY2Vzc2lvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNlcnRhaW4gb3BlcmF0aW5nCi0gKiBzeXN0ZW1zLCB0aGUgQVNDSUkgU1VCIGNoYXJhY3RlciAoXHUwMDFhLCBvciBjb250cm9sLVopIGlzIGlnbm9yZWQgaWYKLSAqIGl0IGlzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZXNjYXBlZCBpbnB1dCBzdHJlYW0uCi0gKgotICogVGhpcyBmaWxlIHRlc3RzIEFTQ0lJIFNVQnMgZXhwcmVzc2VkIGFzIHVuaWNvZGUgZXNjYXBlcwotICovCi1wdWJsaWMgY2xhc3MgRW5kV2l0aFNVQjIgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RNZSgpIHsKLSAgICAgICAgLy8gSW5saW5lIFNVQnMgYXJlIG5vdCBhbGxvd2VkCi0gICAgICAgIC8vIGludCBhXHUwMDFhID0gMi8vQGZhaWw6cGFyc2UKLSAgICB9Ci0vLyBOZXh0IGxpbmUgZW5kcyB3aXRoIEFTQ0lJIFNVQiwgZXhwcmVzc2VkIGFzIGEgdW5pY29kZSBlc2NhcGUKLX0gXHUwMDFhCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNS9FbmRXaXRoU1VCMi5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNS9FbmRXaXRoU1VCMi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWU5MmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDUvRW5kV2l0aFNVQjIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy92aTogYmluYXJ5Om5vZW9sCi1wYWNrYWdlIGdscy5jaDAzLnMwNQotCi0vLyBOb3RlOiB0aGlzIGZpbGUgbXVzdCBub3QgaGF2ZSBhIHRyYWlsaW5nIEVPTC4gRm9yIHRoaXMgcmVhc29uLCAKLS8vIGl0IHNob3VsZCBiZSBzdG9yZWQgaW4gQ1ZTIGFzIGEgYmluYXJ5IGZpbGUgKC1rYikKLQotLyoqCi0gKiBHTFMgMy41OgotICogQXMgYSBzcGVjaWFsIGNvbmNlc3Npb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjZXJ0YWluIG9wZXJhdGluZwotICogc3lzdGVtcywgdGhlIEFTQ0lJIFNVQiBjaGFyYWN0ZXIgKFx1MDAxYSwgb3IgY29udHJvbC1aKSBpcyBpZ25vcmVkIGlmCi0gKiBpdCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGVzY2FwZWQgaW5wdXQgc3RyZWFtLgotICovCi1wdWJsaWMgY2xhc3MgRW5kV2l0aFNVQjEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RNZSgpIHsKLSAgICAgICAgLy8gSW5saW5lIFNVQnMgYXJlIG5vdCBhbGxvd2VkCi0gICAgICAgIC8vIGludCBhGiA9IDIvL0BmYWlsOnBhcnNlCi0gICAgfQotLy8gTmV4dCBsaW5lIGVuZHMgd2l0aCBBU0NJSSBTVUIgY2hhcmFjdGVyCi19IBoKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA2L1doaXRlc3BhY2VDaGFycy5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNi9XaGl0ZXNwYWNlQ2hhcnMuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGMxMmNmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA2L1doaXRlc3BhY2VDaGFycy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1wYWNrYWdlIGdscy5jaDAzLnMwNgotCi0vKioKLSAqIEdMUyAzLjY6Ci0gKiBXaGl0ZSBzcGFjZSBpcyBkZWZpbmVkIGFzIHRoZSBBU0NJSSBzcGFjZSwgaG9yaXpvbnRhbCB0YWIsIGFuZCBmb3JtIGZlZWQKLSAqIGNoYXJhY3RlcnMsIGFzIHdlbGwgYXMgbGluZSB0ZXJtaW5hdG9ycy4KLSAqLwotY2xhc3MgV2hpdGVzcGFjZUNoYXJzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0V2hpdGVzcGFjZSgpIHsKLSAgICAgICAgLy8gU3BhY2UgKHdvdWxkIG90aGVyd2lzZSBiZSAiZGVmYSA9IDEiKQotICAgICAgICBkZWZcdTAwMjBhID0gMTsKLSAgICAgICAgYXNzZXJ0IGEgPT0gMQotCi0gICAgICAgIC8vIFRhYgotICAgICAgICBkZWZcdTAwMDliID0gMgotICAgICAgICBhc3NlcnQgYiA9PSAyCi0KLSAgICAgICAgLy8gRm9ybWZlZWQKLSAgICAgICAgZGVmXHUwMDBjYyA9IDMgCi0gICAgICAgIGFzc2VydCBjID09IDMKLQotICAgICAgICAvLyBOZXdsaW5lIC0gY2FyZWZ1bCwgY2FuIGFsc28gYmUgYSB0ZXJtaW5hdG9yCi0gICAgICAgIGRlZlx1MDAwZGQgPSA0Ci0gICAgICAgIGFzc2VydCBkID09IDQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA3L0hhc2hDb21tZW50Lmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA3L0hhc2hDb21tZW50Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZmFiZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwNy9IYXNoQ29tbWVudC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIFRoaXMgaXMgYSBjb21tZW50OiBAIyQlXkBAIyQ7QCMkQCMkNCEhCi1wYWNrYWdlIGdscy5jaDAzLnMwNwotLyoqCi0gKiBHTFMgMy43OgotICogSW4gYWRkaXRpb24sIGlmIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVyIG9mIGEgR3Jvb3Z5IHByb2dyYW0gaXMgdGhlCi0gKiBBU0NJSSBzaGFycCBzaWduICgnIycpLCB0aGUgd2hvbGUgbGluZSBpcyB0cmVhdGVkIGFzIGEgY29tbWVudC4gSW4gb3RoZXIKLSAqIHdvcmRzLCB0aGUgcHJvZ3JhbSBpcyB0cmVhdGVkIGV4YWN0bHkgYXMgaWYgdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCcvLycpIHdlcmUKLSAqIGluc2VydGVkIGJlZm9yZSB0aGUgc2hhcnAgc2lnbi4gVGhpcyB1bnVzdWFsIHJ1bGUgbWFrZXMgaXQgZWFzaWVyIHRvIHdyaXRlCi0gKiBHcm9vdnkgc2NyaXB0cyBvbiBzb21lIHN5c3RlbXMuCi0gKi8KLS8vIyBUaGlzIGlzIG5vdCBhIGNvbW1lbnQgKDEpIC8vQGZhaWw6cGFyc2UKLWNsYXNzIEhhc2hDb21tZW50IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0vLyMgVGhpcyBpcyBub3QgYSBjb21tZW50ICgyKSAvL0BmYWlsOnBhcnNlCi0KLSAgICB2b2lkIHRlc3RIYXNoQ29tbWVudCgpIHsKLSAgICAgICAgLy8jIFRoaXMgaXMgbm90IGEgY29tbWVudCAoMykgLy9AZmFpbDpwYXJzZQotICAgICAgICBhc3NlcnQgdHJ1ZSAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA3L05vcm1hbENvbW1lbnQuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDcvTm9ybWFsQ29tbWVudC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2UyNjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDcvTm9ybWFsQ29tbWVudC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIGdscy5jaDAzLnMwNwotLyoqCi0gKiBHTFMgMy43OgotICogICAgVGhlcmUgYXJlIHR3byBraW5kcyBvZiBjb21tZW50czoKLSAqICAgICAgICAvKiB0ZXh0ICogLyAKLSAqICAgICAgICAgICAgQSB0cmFkaXRpb25hbCBjb21tZW50OiBhbGwgdGhlIHRleHQgZnJvbSB0aGUgQVNDSUkKLSAqICAgICAgICAgICAgY2hhcmFjdGVycyAvKiB0byB0aGUgQVNDSUkgY2hhcmFjdGVycyAqIC8gaXMgaWdub3JlZAotICogICAgICAgICAgICAoYXMgaW4gQyBhbmQgQysrKS4KLSAqICAgICAgICAvLyB0ZXh0IAotICogICAgICAgICAgICBBIGVuZC1vZi1saW5lIGNvbW1lbnQ6IGFsbCB0aGUgdGV4dCBmcm9tIHRoZSBBU0NJSQotICogICAgICAgICAgICBjaGFyYWN0ZXJzIC8vIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgaWdub3JlZCAoYXMgaW4gCi0gKiAgICAgICAgICAgIEMrKykuCi0gKi8KLWNsYXNzIE5vcm1hbENvbW1lbnQgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RFb2xDb21tZW50KCkgewotICAgICAgICBkZWYgYSA9IDEKLQotICAgICAgICBkZWYgYiA9IDEKLSAgICAgICAgLy8gYSA9IGEgKyAoCi0gICAgICAgIGIgPSAyCi0gICAgICAgIC8vICkKLSAgICAgICAgYXNzZXJ0IGEgPT0gMQotICAgICAgICBhc3NlcnQgYiA9PSAyCi0KLSAgICAgICAgLy8gR0xTOiAuLi4gc29tZSBsaW5lIHRlcm1pbmF0b3JzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIHNpZ25pZmljYW50Ci0gICAgICAgIC8vIG5ld2xpbmVzLgotICAgICAgICBhID0gMyAvLyBTaWduaWZpY2FudCBuZXcgbGluZSBmb2xsb3dzIHRoaXMgY29tbWVudAotICAgICAgICAvLyAvIGIgLy9AZmFpbDpwYXJzZSAKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RUcmFkaXRpb25hbENvbW1lbnQoKSB7Ci0gICAgICAgIC8vICJkZWYgYSIgZG9lc24ndCB3b3JrCi0gICAgICAgIGRlZiBhID0gMQotCi0gICAgICAgIGEgPSAxMC8qY29tbWVudCovLzIKLSAgICAgICAgYXNzZXJ0IGEgPT0gNQotICAgICAgICBhID0gMjAvLypjb21tZW50Ki8yCi0gICAgICAgIGFzc2VydCBhID09IDEwCi0KLSAgICAgICAgYSA9IDEwKi8qY29tbWVudCovMgotICAgICAgICBhc3NlcnQgYSA9PSAyMAotICAgICAgICBhID0gMjAvKmNvbW1lbnQqLyoyCi0gICAgICAgIGFzc2VydCBhID09IDQwCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwOC9JZGVudGlmaWVyQ2hhcnMuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMDgvSWRlbnRpZmllckNoYXJzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzZTZlYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwOC9JZGVudGlmaWVyQ2hhcnMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMDgKLS8qKgotICogSkxTIDMuODoKLSAqIEFuIGlkZW50aWZpZXIgaXMgYW4gdW5saW1pdGVkLWxlbmd0aCBzZXF1ZW5jZSBvZiBKYXZhIGxldHRlcnMgYW5kIEphdmEKLSAqIGRpZ2l0cywgdGhlIGZpcnN0IG9mIHdoaWNoIG11c3QgYmUgYSBKYXZhIGxldHRlci4gLi4uIAotICoKLSAqIExldHRlcnMgYW5kIGRpZ2l0cyBtYXkgYmUgZHJhd24gZnJvbSB0aGUgZW50aXJlIFVuaWNvZGUgY2hhcmFjdGVyIHNldC4uLiAKLSAqCi0gKiBBIJNKYXZhIGxldHRlcpQgaXMgYSBjaGFyYWN0ZXIgZm9yIHdoaWNoIHRoZSBtZXRob2QKLSAqIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoaW50KSByZXR1cm5zIHRydWUuIEEgk0phdmEgbGV0dGVyLW9yLWRpZ2l0lAotICogaXMgYSBjaGFyYWN0ZXIgZm9yIHdoaWNoIHRoZSBtZXRob2QgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGludCkKLSAqIHJldHVybnMgdHJ1ZS4gIAotICovCi1jbGFzcyBJZGVudGlmaWVyQ2hhcnMgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RBU0NJSUNoYXJzKCkgewotICAgICAgICAvLyBJZGVudGlmaWVyIG1heSBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0Ci0gICAgICAgIC8vZGVmIDFhID0gMSAvL0BmYWlsOnBhcnNlCi0KLSAgICAgICAgLy8gSWRlbnRpZmllciBtYXkgY29udGFpbiBkaWdpdHMgYWZ0ZXIgdGhlIGZpcnN0IGxldHRlcgotICAgICAgICBkZWYgYTEgPSAyIAotICAgICAgICBhc3NlcnQgYTEgPT0gMgotCi0gICAgICAgIC8vIElkZW50aWZpZXIgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSBBU0NJSSBkaWdpdHMKLSAgICAgICAgZGVmIGExMjM0NTY3ODkwID0gIkhlbGxvIgotICAgICAgICBhc3NlcnQgYTEyMzQ1Njc4OTAgPT0gIkhlbGxvIgotCi0gICAgICAgIC8vIElkZW50aWZpZXIgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSBBU0NJSSB1cHBlciBvciBsb3dlciBjYXNlIGxldHRlcnMKLSAgICAgICAgZGVmIFpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBID0gImJhY2t3b3JkcyIKLSAgICAgICAgYXNzZXJ0IFpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBID09ICJiYWNrd29yZHMiCi0KLSAgICAgICAgLy8gSWRlbnRpZmllciBtYXkgY29udGFpbiBhbnkgb2YgdGhlIEFTQ0lJIHVwcGVyIG9yIGxvd2VyIGNhc2UgbGV0dGVycwotICAgICAgICBkZWYgenl4d3Z1dHNycXBvbm1sa2ppZ2hmZWRjYmEgPSAiQkFDS1dPUkRTIgotICAgICAgICBhc3NlcnQgenl4d3Z1dHNycXBvbm1sa2ppZ2hmZWRjYmEgPT0gIkJBQ0tXT1JEUyIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3ROb25Bc2NpaUNoYXJzKCkgewotICAgICAgICAvLyBOb24tYXNjaWkgY2hhcnMgZW5jb2RlZCBkaXJlY3RseSBpbiB0aGUgc3RyZWFtIG9mIHRleHQKLSAgICAgICAgZGVmIGEgPSAyCi0gICAgICAgIGRlZiBhsiA9IGEgKiBhICAvLyBhLXNxdWFyZWQgaW4gbGF0aW4tMSBlbmNvZGluZwotICAgICAgICBhc3NlcnQgYbIgPT0gNAotICAgICAgICBkZWYgtSA9IDEwZS02IAotICAgICAgICBhc3NlcnQgtSA9IDEwZS02Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0RW5jb2RlZEFzY2lpQ2hhcnMoKSB7Ci0gICAgICAgIC8vIE5vbi1hc2NpaSBjaGFycyBlbmNvZGVkIGRpcmVjdGx5IGluIHRoZSBzdHJlYW0gb2YgdGV4dAotICAgICAgICBkZWYgYSA9IDIKLSAgICAgICAgZGVmIGGyID0gYSAqIGEgIC8vIGEtc3F1YXJlZCBpbiBsYXRpbi0xIGVuY29kaW5nCi0gICAgICAgIGFzc2VydCBhsiA9PSA0Ci0gICAgICAgIGRlZiC1ID0gMTBlLTYgCi0gICAgICAgIGFzc2VydCC1ID0gMTBlLTYKLSAgICB9Ci0KLSAgICAKLSAgICB2b2lkIHRlc3RDb21wb3NlZENoYXIoKSB7Ci0gICAgICAgIC8vIEV4YW1wbGUgdGFrZW4gZnJvbSBKTFMKLSAgICAgICAgZGVmIFx1MDBjMSA9ICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIEFDVVRFIgotICAgICAgICAvL2Fzc2VydCBcdTAwNGFcMDMwMSA9PSAiTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBBQ1VURSIgLy9AZmFpbAotICAgIH0KLQotICAgIHZvaWQgdGVzdFZpc3VhbEVxdWl2YWxlbnRzKCkgewotICAgICAgICAvLyBFeGFtcGxlIHRha2VuIGZyb20gSkxTCi0gICAgICAgIGRlZiBBID0gIkEiCi0gICAgICAgIC8vYXNzZXJ0IGEgPT0gQSAvL0BmYWlsCi0gICAgICAgIC8vYXNzZXJ0IFx1MDM5MSA9PSBBIC8vQGZhaWwKLSAgICAgICAgLy9hc3NlcnQgXHUwNDMwID09IEEgLy9AZmFpbAotICAgICAgICAvL2Fzc2VydCBcdWQ4MzVcdWRjODIgPT0gQSAvL0BmYWlsCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MwOC9JZGVudGlmaWVyTGVuZ3RoLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA4L0lkZW50aWZpZXJMZW5ndGguZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzYyNjBmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczA4L0lkZW50aWZpZXJMZW5ndGguZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMDgKLS8qKgotICogR0xTIDMuODoKLSAqIEFuIGlkZW50aWZpZXIgaXMgYW4gdW5saW1pdGVkLWxlbmd0aCBzZXF1ZW5jZSBvZiBKYXZhIGxldHRlcnMgYW5kIEphdmEKLSAqIGRpZ2l0cywgdGhlIGZpcnN0IG9mIHdoaWNoIG11c3QgYmUgYSBKYXZhIGxldHRlci4KLSAqCi0gKiBUaGlzIHRlc3QgY2FzZSBjaGVja3MgdGhhdCB0aGUgY29tcGlsZXIgY2FuIGhhbmRsZSBhIDYyMCBjaGFyYWN0ZXIKLSAqIGlkZW50aWZpZXIuCi0gKi8KLWNsYXNzIElkZW50aWZpZXJMZW5ndGggZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RMb25nVmFyTmFtZSgpIHsKLSAgICAgICAgZGVmIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5ID0gMQotCi0gICAgICAgIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5ICs9IDEKLQotICAgICAgICBhc3NlcnQgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkgPT0gMQotCi0gICAgfQotCi0gICAgLy8gVE9ETzogdGVzdCBsb25nIGNsYXNzIG5hbWUgKHRvcCBsZXZlbCBjbGFzc2VzIGludGVyYWN0IHdpdGggdGhlIGZpbGUgCi0gICAgLy8gc3lzdGVtIGluIGludGVyZXN0aW5nIHdheXMpCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MxMC9Cb29sZWFuTGl0ZXJhbHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMTAvQm9vbGVhbkxpdGVyYWxzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYjVlOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MxMC9Cb29sZWFuTGl0ZXJhbHMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMTA7Ci0vKioKLSAqIEpMUzogMy4xMC4zCi0gKiBUaGUgYm9vbGVhbiB0eXBlIGhhcyB0d28gdmFsdWVzLCByZXByZXNlbnRlZCBieSB0aGUgbGl0ZXJhbHMgdHJ1ZSBhbmQgZmFsc2UsCi0gKiBmb3JtZWQgZnJvbSBBU0NJSSBsZXR0ZXJzLiAgQSBib29sZWFuIGxpdGVyYWwgaXMgYWx3YXlzIG9mIHR5cGUgYm9vbGVhbi4KLSAqLwotY2xhc3MgQm9vbGVhbkxpdGVyYWxzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0Qm9vbCgpIHsKLSAgICAgICAgLy8gVHJ5IHNvbWUgc2ltcGxlIHRoaW5ncyB3aXRoIGxpdGVyYWxzCi0gICAgICAgIGFzc2VydCAodHJ1ZSAhPSBmYWxzZSkKLSAgICAgICAgYXNzZXJ0IHRydWUKLSAgICAgICAgYXNzZXJ0ICFmYWxzZQotCi0gICAgICAgIC8vIGJvb2xlYW4gcmVzdWx0cyBtdXN0IGJlIGVxdWFsIHRvIGEgYm9vbGVhbiBsaXRlcmFsCi0gICAgICAgIGFzc2VydCAoMSA+IDIpID09IGZhbHNlCi0gICAgICAgIGFzc2VydCAoMyA8IDQpID09IHRydWUKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczEwL0ludGVnZXJMaXRlcmFscy5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MxMC9JbnRlZ2VyTGl0ZXJhbHMuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI3ZGE5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczEwL0ludGVnZXJMaXRlcmFscy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotcGFja2FnZSBnbHMuY2gwMy5zMTA7Ci0vKioKLSAqIEpMUzogMy4xMC4xCi0gKiBBbiBpbnRlZ2VyIGxpdGVyYWwgbWF5IGJlIGV4cHJlc3NlZCBpbiBkZWNpbWFsIChiYXNlIDEwKSwgaGV4YWRlY2ltYWwgKGJhc2UKLSAqIDE2KSwgb3Igb2N0YWwgKGJhc2UgOCkuLi4KLSAqCi0gKiBBbiBpbnRlZ2VyIGxpdGVyYWwgaXMgb2YgdHlwZSBsb25nIGlmIGl0IGlzIHN1ZmZpeGVkIHdpdGggYW4gQVNDSUkgbGV0dGVyIEwKLSAqIG9yIGwgKGVsbCk7IG90aGVyd2lzZSBpdCBpcyBvZiB0eXBlIGludCAopzQuMi4xKS4uLgotICoKLSAqIEludGVnZXIgbGl0ZXJhbHMKLSAqIC0tIGV4cGxpY2l0bHkgaW50ZWdlciBpZiBlbmRzIHdpdGggJ2knIHR5cGUgc3BlY2lmaWVyCi0gKiAgICAoY2FuIGFsc28gY3JlYXRlIGludGVnZXJzIGluIG90aGVyIHdheXMgdG9vKQotICogLS0gY29tZSBpbiBEZWNpbWFsLCBPY3RhbCBhbmQgSGV4IHZhcmlldGllcwotICogLS0gcmVwcmVzZW50ZWQgaW4gMzIgYml0cywgdHdvJ3MgY29tcGxlbWVudAotICovCi1jbGFzcyBJbnRlZ2VyTGl0ZXJhbHMgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3REZWNJbnQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyaSwgKDFpICsgMWkpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMGksICgxaSAtIDFpKSkKLQotICAgICAgICAvLyBQbGF5IGdhbWVzIHdpdGggbW9zdCBzaWduaWZpY2FudCBiaXQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgtMjE0NzQ4MzY0N2kgLSAxKSwgKDIxNDc0ODM2NDdpICsgMSkpCi0KLSAgICAgICAgLy8gTGFyZ2UgcG9zaXRpdmUgbGl0ZXJhbHMKLSAgICAgICAgLy9kZWYgYSA9IDIxNDc0ODM2NDdpIC8vQHBhc3MKLSAgICAgICAgLy9kZWYgYSA9IDIxNDc0ODM2NDhpIC8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy9kZWYgYSA9IDIxNDc0ODM2NDlpIC8vQGZhaWw6cGFyc2UKLQotICAgICAgICAvLyBMYXJnZSBuZWdhdGl2ZSBsaXRlcmFscwotICAgICAgICAvL2RlZiBhID0gLTIxNDc0ODM2NDdpIC8vQHBhc3MKLSAgICAgICAgLy9kZWYgYSA9IC0yMTQ3NDgzNjQ4aSAvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAtMjE0NzQ4MzY0OWkgLy9AZmFpbDpwYXJzZQotCi0gICAgICAgIGFzc2VydEVxdWFscyg5OWksIDk5SSkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RIZXhJbnQoKSB7Ci0gICAgICAgIC8vIENoZWNrIGxpdGVyYWxzIGdldCBjb3JyZWN0IHZhbHVlcwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgMHgwaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIDB4MWkpCi0gICAgICAgIGFzc2VydEVxdWFscygyLCAweDJpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgMHgzaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIDB4NGkpCi0gICAgICAgIGFzc2VydEVxdWFscyg1LCAweDVpKQotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgMHg2aSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIDB4N2kpCi0gICAgICAgIGFzc2VydEVxdWFscyg4LCAweDhpKQotICAgICAgICBhc3NlcnRFcXVhbHMoOSwgMHgwOWkpCi0gICAgICAgIGFzc2VydEVxdWFscygxMCwgMHhhaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCAweGJpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIDB4Y2kpCi0gICAgICAgIGFzc2VydEVxdWFscygxMywgMHhkaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDE0LCAweGVpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIDB4ZmkpCi0gICAgICAgIGFzc2VydEVxdWFscygxNiwgMHgxMGkpCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDY1NTM1aSwgMHhmZmZmaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMTQwODk0aSwgMHg5YWJjZGVpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMTEyNTkzNzVpLCAweGFiY2RlZmkpCi0gICAgICAgIGFzc2VydEVxdWFscygzMDU0MTk4OTZpLCAweDEyMzQ1Njc4aSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDdpLCAweDdmZmZmZmZmaSkKLQotICAgICAgICAvLyBleHRyYSB6ZXJvZXMgYWZ0ZXIgdGhlICd4JyBzaG91bGQgbm90IGFmZmVjdCByZXN1bHQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIDB4MDFpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgMHgwMDAwMDFpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxaSkKLQotICAgICAgICAvL2RlZiBhID0gMHg3ZmZmZmZmZmkvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAweDgwMDAwMDAwaS8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy9kZWYgYSA9IDB4ODAwMDAwMDFpLy9AZmFpbDpwYXJzZQotCi0gICAgICAgIC8vZGVmIGEgPSAtMHg3ZmZmZmZmZmkvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAtMHg4MDAwMDAwMGkvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAtMHg4MDAwMDAwMWkvL0BmYWlsOnBhcnNlCi0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBjb21waWxlciBoYW5kbGVzIHRoZSB1bmFyeSAnLScgYXMgYSBzZXBhcmF0ZSB0b2tlbgotICAgICAgICAvL2RlZiBhID0gLSAweDgwMDAwMDAwaS8vQHBhc3MKLSAgICAgICAgLy9kZWYgYSA9IC0vKiAqLzB4ODAwMDAwMDBpLy9AcGFzcwotICAgICAgICAvL2RlZiBhID0gLSAweDgwMDAwMDAxaS8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy9kZWYgYSA9IC0vKiAqLzB4ODAwMDAwMDFpLy9AZmFpbDpwYXJzZQotICAgIH0KLQotICAgIHZvaWQgdGVzdE9jdEludCgpIHsKLSAgICAgICAgLy8gQ2hlY2sgbGl0ZXJhbHMgZ2V0IGNvcnJlY3QgdmFsdWVzCi0gICAgICAgIGFzc2VydEVxdWFscygwaSwgMDApCi0gICAgICAgIGFzc2VydEVxdWFscygxaSwgMDFpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMmksIDAyaSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDNpLCAwM2kpCi0gICAgICAgIGFzc2VydEVxdWFscyg0aSwgMDRpKQotICAgICAgICBhc3NlcnRFcXVhbHMoNWksIDA1aSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDZpLCAwNmkpCi0gICAgICAgIGFzc2VydEVxdWFscyg3aSwgMDdpKQotCi0gICAgICAgIGFzc2VydEVxdWFscyg2NTUzNSwgMDE3Nzc3N2kpCi0gICAgICAgIGFzc2VydEVxdWFscygxMDE0MDg5NCwgMDQ2NTM2MzM2KQotICAgICAgICBhc3NlcnRFcXVhbHMoMTEyNTkzNzUsIDA1Mjc0Njc1N2kpCi0gICAgICAgIGFzc2VydEVxdWFscygzMDU0MTk4OTYsIDAyMjE1MDUzMTcwKQotICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0NywgMDE3Nzc3Nzc3Nzc3aSkKLQotICAgICAgICAvLyBleHRyYSB6ZXJvZXMgc2hvdWxkIG5vdCBhZmZlY3QgcmVzdWx0Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCAwMDFpKQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgMDAwMDAwMWkpCi0gICAgICAgIGFzc2VydEVxdWFscygxLCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWkpCi0KLSAgICAgICAgLy9kZWYgYSA9IDAxNzc3Nzc3Nzc3N2kvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAwMjAwMDAwMDAwMDBpLy9AZmFpbAotICAgICAgICAvL2RlZiBhID0gMDIwMDAwMDAwMDAxaS8vQGZhaWwKLQotICAgICAgICAvL2RlZiBhID0gLTAxNzc3Nzc3Nzc3N2kvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAtMDIwMDAwMDAwMDAwaS8vQHBhc3MKLSAgICAgICAgLy9kZWYgYSA9IC0wMjAwMDAwMDAwMDFpLy9AZmFpbAotCi0KLSAgICAgICAgLy9kZWYgYSA9IC0gMDIwMDAwMDAwMDAwaS8vQHBhc3MKLSAgICAgICAgLy9kZWYgYSA9IC0vKiAqLzAyMDAwMDAwMDAwMGkvL0BwYXNzCi0gICAgICAgIC8vZGVmIGEgPSAtIDAyMDAwMDAwMDAwMWkvL0BmYWlsCi0gICAgICAgIC8vZGVmIGEgPSAtLyogKi8wMjAwMDAwMDAwMDFpLy9AZmFpbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczEwL051bGxMaXRlcmFsLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczEwL051bGxMaXRlcmFsLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllYzg4NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDAzL3MxMC9OdWxsTGl0ZXJhbC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1wYWNrYWdlIGdscy5jaDAzLnMxMDsKLS8qKgotICogSkxTOiAzLjEwLjcKLSAqIFRoZSBudWxsIHR5cGUgaGFzIG9uZSB2YWx1ZSwgdGhlIG51bGwgcmVmZXJlbmNlLCByZXByZXNlbnRlZCBieSB0aGUgbGl0ZXJhbAotICogbnVsbCwgd2hpY2ggaXMgZm9ybWVkIGZyb20gQVNDSUkgY2hhcmFjdGVycy4gQSBudWxsIGxpdGVyYWwgaXMgYWx3YXlzIG9mIHRoZQotICogbnVsbCB0eXBlLiAgCi0gKgotICoKLSAqIFRlc3QgaW1wbGVtZW50YXRpb24gbm90ZXM6Ci0gKiBDYW4gc2hvdyB0aGF0IHRoZSBudWxsIGxpdGVyYWwgZXhpc3RzLCBob3dldmVyIHRoZSBudWxsIHR5cGUgaGFzIG5vIG5hbWUKLSAqIGFuZCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYW55IHJlZmVyZW5jZSB0eXBlLCBzbyBpdCBpcyBoYXJkIHRvIAotICogdGVsbCBpZiBudWxsIGlzIG9mIHRoZSBudWxsIHR5cGUuIAotICovCi1jbGFzcyBOdWxsTGl0ZXJhbCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdE51bGwoKSB7Ci0gICAgICAgIC8vIE51bGwgbGl0ZXJhbCBleGlzdHMKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsCi0gICAgICAgIGFzc2VydCBzID09IG51bGwKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJpbnQgcy5sZW5ndGgoKQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpCi0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE9LCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMDMvczEwL1N0cmluZ0VzY2FwZXMuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMTAvU3RyaW5nRXNjYXBlcy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNmQwNWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gwMy9zMTAvU3RyaW5nRXNjYXBlcy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIGdscy5jaDAzLnMxMDsKLS8qKgotICogSkxTOiAzLjEwLjUKLSAqIFtTXXRyaW5nIGVzY2FwZSBzZXF1ZW5jZXMgYWxsb3cgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBzb21lIG5vbmdyYXBoaWMKLSAqIGNoYXJhY3RlcnMgYXMgd2VsbCBhcyB0aGUgc2luZ2xlIHF1b3RlLCBkb3VibGUgcXVvdGUsIGFuZCBiYWNrc2xhc2gKLSAqIGNoYXJhY3RlcnMgaW4gLi4uIHN0cmluZyBsaXRlcmFscyAopzMuMTAuNSkuCi0gKgotICogR0xTIDMuMTAuNQotICogSW4gYWxsIHN0cmluZ3MsIHRoZSBlc2NhcGUgc2VxdWVuY2UgJ1wkJyBpcyBsZWdhbCwgYW5kIHN0YW5kcyBmb3IgdGhlIEFTQ0lJCi0gKiBkb2xsYXIgY2hhcmFjdGVyLgotICovCi1jbGFzcyBTdHJpbmdFc2NhcGVzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0U3RhbmRhcmRKYXZhRXNjYXBlQ2hhcnMoKSB7Ci0gICAgICAgIFN0cmluZyBzID0gIlxiXHRcblxmXHJcIlwnXFwiCi0gICAgICAgIGFzc2VydCBzLmNoYXJBdCgwKSA9PSAweDgKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDEpID09IDB4OQotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoMikgPT0gMHhhCi0gICAgICAgIGFzc2VydCBzLmNoYXJBdCgzKSA9PSAweGMKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDQpID09IDB4ZAotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoNSkgPT0gMHgyMgotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoNikgPT0gMHgyNwotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoNykgPT0gMHg1YwotCi0gICAgICAgIC8vIEEgc2VsY3Rpb24gb2YgaW52YWxpZCwgbm9uLXN0YW5kYXJkIGVzY2FwZXMKLSAgICAgICAgLy9TdHJpbmcgczIgPSAiXHEiLy9AZmFpbDpwYXJzZQotICAgICAgICAvL1N0cmluZyBzMiA9ICJcfSIvL0BmYWlsOnBhcnNlCi0gICAgICAgIC8vU3RyaW5nIHMyID0gIlxeIi8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy9TdHJpbmcgczIgPSAiXE4iLy9AZmFpbDpwYXJzZQotICAgICAgICAvL1N0cmluZyBzMiA9ICJcQCIvL0BmYWlsOnBhcnNlCi0gICAgICAgIC8vU3RyaW5nIHMyID0gIlxhIi8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy9TdHJpbmcgczIgPSAiXEEiLy9AZmFpbDpwYXJzZQotICAgIH0KLQotICAgIHZvaWQgdGVzdE9jdGFsRXNjYXBlcygpIHsKLSAgICAgICAgU3RyaW5nIHMgPSAiXDBcMDBcMDAwXDFcMzc3XDA0Mlw0MiIKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDApID09IDAKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDEpID09IDAKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDIpID09IDAKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDMpID09IDEKLSAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDQpID09IDI1NQotICAgICAgICBhc3NlcnQgcy5jaGFyQXQoNSkgPT0gMDQyCi0gICAgICAgIGFzc2VydCBzLmNoYXJBdCg2KSA9PSAwNDIKLQotICAgICAgICBTdHJpbmcgczIgPSAiXDAwMDciCi0gICAgICAgIGFzc2VydCBzMi5sZW5ndGgoKSA9PSAyCi0gICAgICAgIGFzc2VydCBzMi5jaGFyQXQoMCkgPT0gMAotICAgICAgICBhc3NlcnQgczIuY2hhckF0KDEpID09ICI3IgotCi0gICAgICAgIC8vIEEgc2VsZWN0aW9uIG9mIGludmFsaWQgZXNjYXBlcwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMTQvczQvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50czEuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWViMDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIEEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IGRlY2xhcmVzIG9uZSBvciBtb3JlIGxvY2FsIHZhcmlhYmxlIG5hbWVzCi0gKi8KLWNsYXNzIEZvbyB7Ci0gICAgZGVmIHJ1bigpIHsKLSAgICAgICAgcnVuSW50VGVzdHMKLSAgICAgICAgcnVuRGVmSW50VGVzdHMKLSAgICAgICAgcnVuRGVmVGVzdHMKLSAgICAgICAgcnVuU3RyaW5nVGVzdHMKLSAgICAgICAgcnVuRGVmU3RyaW5nVGVzdHMKLSAgICAgICAgcnVuTW9kaWZpZXJUZXN0cwotICAgICAgICBydW5Ob25UeXBlVGVzdHMKLSAgICB9Ci0gICAgLy8gVGhlIHR5cGUgY2FuIGJlIGEgYnVpbHRpbiB0eXBlIGtleXdvcmQuCi0gICAgZGVmIHJ1bkludFRlc3RzKCkgewotICAgICAgICBpbnQgYQotICAgICAgICBpbnQgYiA9IDEKLSAgICAgICAgaW50IGMsZCxlCi0gICAgICAgIGludCBmLGcgPSAyCi0gICAgICAgIGludCBoID0gMyxpID0gNCAgLy8gZXh0cmEgcGVybXV0YXRpb25zCi0gICAgICAgIGludCBqID0gNSxrICAgICAgLy8gZXh0cmEgcGVybXV0YXRpb25zCi0gICAgICAgIC8vaW50IGludCBwLy9AZmFpbDpwYXJzZQotICAgIH0KLSAgICAvLyBXaXRoIHR5cGUga2V5d29yZHMsIHRoZSAnZGVmJyBrZXl3b3JkIGlzIG9wdGlvbmFsLgotICAgIGRlZiBydW5EZWZJbnRUZXN0cygpIHsKLSAgICAgICAgZGVmIGludCBhCi0gICAgICAgIGRlZiBpbnQgYiA9IDEKLSAgICAgICAgZGVmIGludCBjLGQsZQotICAgICAgICBkZWYgaW50IGYsZyA9IDIKLSAgICAgICAgLy9kZWYgaW50IGludCBwLy9AZmFpbDpwYXJzZQotICAgIH0KLSAgICAvLyBXaXRoIHRoZSAnZGVmJyB0aGUgdHlwZSBpcyBvcHRpb25hbC4KLSAgICAvLyAoSXQgZGVmYXVsdHMgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uKQotICAgIGRlZiBydW5EZWZUZXN0cygpIHsKLSAgICAgICAgZGVmIGEKLSAgICAgICAgZGVmIGIgPSAxCi0gICAgICAgIGRlZiBjLGQsZQotICAgICAgICBkZWYgZixnID0gMgotICAgICAgICBkZWYgaCA9ICJoIgotICAgICAgICBkZWYgamF2YS5sYW5nLlN0cmluZyBpID0gJ2knCi0gICAgICAgIC8vZGVmIGRlZiBwLy9AZmFpbDpwYXJzZQotICAgIH0KLSAgICAvLyBDYXBpdGFsaXplZCBuYW1lcyBhcmUgdGFrZW4gdG8gYmUgZGVjbGFyYXRpb24gdHlwZXMuCi0gICAgLy8gV2l0aCBzdWNoIG5hbWVzLCB0aGUgJ2RlZicga2V5d29yZCBpcyBvcHRpb25hbC4KLSAgICBkZWYgcnVuU3RyaW5nVGVzdHMoKSB7Ci0gICAgICAgIFN0cmFuZ2UgegotICAgICAgICBTdHJpbmcgYQotICAgICAgICBTdHJpbmcgYiA9ICcxJwotICAgICAgICBTdHJpbmcgYyxkLGUKLSAgICAgICAgU3RyaW5nIGYsZyA9ICcyJwotICAgICAgICBTdHJpbmcgaCA9IDMsaSA9IDQgIC8vIGV4dHJhIHBlcm11dGF0aW9ucwotICAgICAgICBTdHJpbmcgaiA9IDUsayAgICAgIC8vIGV4dHJhIHBlcm11dGF0aW9ucwotICAgICAgICAvL1N0cmluZyBTdHJpbmcgcC8vQGZhaWw6cGFyc2UKLSAgICB9Ci0gICAgLy8gV2l0aCBjYXBpdGFsaXplZCB0eXBlIG5hbWVzLCB0aGUgJ2RlZicga2V5d29yZCBpcyBvcHRpb25hbC4KLSAgICBkZWYgcnVuRGVmU3RyaW5nVGVzdHMoKSB7Ci0gICAgICAgIGRlZiBTdHJpbmcgYQotICAgICAgICBkZWYgU3RyaW5nIGIgPSAnMScKLSAgICAgICAgZGVmIFN0cmluZyBjLGQsZQotICAgICAgICBkZWYgU3RyaW5nIGYsZyA9ICcyJwotICAgICAgICAvL2RlZiBTdHJpbmcgU3RyaW5nIHAvL0BmYWlsOnBhcnNlCi0gICAgICAgIGRlZiBTdHJhbmdlIHogLy8gV2lsbCBwYXJzZSwgdGhvdWdoIG5vdCBhIHR5cGUhIC8vQGZhaWw6Y2hlY2sKLSAgICB9Ci0gICAgLy8gV2hlbiBhIG1vZGlmaWVyIGlzIHByZXNlbnQsIHRoZSAnZGVmJyBrZXl3b3JkIGlzIG9wdGlvbmFsLgotICAgIGRlZiBydW5Nb2RpZmllclRlc3RzKCkgewotICAgICAgICBmaW5hbCBhID0gMSwgYiA9IDIKLSAgICAgICAgZmluYWwgaW50IGMgPSAxMgotICAgICAgICBkZWYgZmluYWwgZCA9IDMsIGUgPSA0Ci0gICAgICAgIGRlZiBmaW5hbCBpbnQgZiA9IDUKLSAgICAgICAgLy9pbnQgZmluYWwgcCAgLy9AZmFpbDpwYXJzZQotICAgICAgICAvL2ZpbmFsIGRlZiBxID0gOS8vQGZhaWw6cGFyc2UKLSAgICB9Ci0gICAgZGVmIG5vblR5cGUgPSAgLy8gbm90IGNhcGl0YWxpemVkLi4uCi0gICAgICAgIHtwcmludGxuICJub25UeXBlIGludm9rZWQgb24gJGl0In0KLSAgICBkZWYgb25lPTEKLSAgICAvLyBUaGUgcGFyc2VyIGFjY2VwdHMgdW5jYXBpdGFsaXplZCB0eXBlIG5hbWVzIG9ubHkgd2hlbiByZXF1aXJlZCBieSBjb250ZXh0LgotICAgIC8vIFRoZSByZXF1aXJpbmcgY29udGV4dCBpcyBhIG1vZGlmaWVyICgnZmluYWwnKSBvciB0aGUgJ2RlZicga2V5d29yZC4KLSAgICAvLyBPZiBjb3Vyc2UsIGJ1aWx0LWluIHR5cGUga2V5d29yZHMgbGlrZSAnaW50JyBhcmUgYWx3YXlzIHR5cGVzLgotICAgIC8vIEFsbCBvdGhlciB1bmNhcGl0YWxpemVkIG5hbWVzIGFyZSB0YWtlbiB0byBiZSBjb21tYW5kcy4KLSAgICBkZWYgcnVuTm9uVHlwZVRlc3RzKCkgewotICAgICAgICBub25UeXBlIG9uZSAgLy8gUGFyc2VzIGFzIGEgY29tbWFuZC4KLSAgICAgICAgZGVmIG5vblR5cGUgYTsgLy8gV2lsbCBwYXJzZSwgdGhvdWdoIG5vdCBhIHR5cGUhIC8vQGZhaWw6Y2hlY2sKLSAgICAgICAgZmluYWwgbm9uVHlwZSBiID0gMDsgLy9AZmFpbDpjaGVjayAgLy8gV2lsbCBwYXJhc2UsIHRob3VnaCBub3QgYSB0eXBlIQotICAgICAgICAvL25vblR5cGUgcCA9IDEgLy9AZmFpbDpwYXJzZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMTQvczQvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50czIuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjUyNWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioKLSAqIEV2ZXJ5IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBpcyBpbW1lZGlhdGVseSBjb250YWluZWQgYnkgYSBibG9jay4KLSAqLwotY2xhc3MgRm9vIHsKLSAgICBkZWYgcnVuKCkgewotICAgICAgICBpbnQgYSA9IDEKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGIgPSAyCi0gICAgICAgICAgICBhc3NlcnQgYSA9PSAxCi0gICAgICAgICAgICBhc3NlcnQgYiA9PSAyCi0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGEgPT0gMQotICAgICAgICAvL2Fzc2VydCBiID09IDIgLy9AZmFpbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMTQvczQvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50czMuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTNiZGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9nbHMvY2gxNC9zNC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRzMy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKioKLSAqIExvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMgbWF5IGJlIGludGVybWl4ZWQgZnJlZWx5IHdpdGggb3RoZXIga2luZHMgb2Ygc3RhdGVtZW50cyBpbiB0aGUgYmxvY2suCi0gKi8KLWNsYXNzIEZvbyB7Ci0gICAgZGVmIHJ1bigpIHsKLSAgICAgICAgaW50IGEgPSAxCi0gICAgICAgIGFzc2VydCBhID09IDEKLSAgICAgICAgaW50IGIgPSAyCi0gICAgICAgIGFzc2VydCBiID09IDIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L2dscy9jaDE0L3M0L0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudHM0Lmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMTQvczQvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50czQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZkMmQ0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3QvZ2xzL2NoMTQvczQvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50czQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyoqCi0gKiBBIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGNhbiBhbHNvIGFwcGVhciBpbiB0aGUgaGVhZGVyIG9mIGEgZm9yIHN0YXRlbWVudC4KLSAqIEluIHRoaXMgY2FzZSBpdCBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgaWYgaXQgd2VyZSBwYXJ0IG9mIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LgotICovCi1jbGFzcyBGb28gewotICAgIGRlZiBydW4oKSB7Ci0gICAgICAgIC8vZm9yIChpbnQgaSA9IDA7aSA8IDEwO2krKykge30gLy9AcGFzcwotICAgICAgICAvL2ZvciAoaSA9IDA7aSA8IDEwOyBpKyspIHt9IC8vQGZhaWwKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvQW5ub3RhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL0Fubm90YXRpb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNzVhMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvQW5ub3RhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotY2xhc3MgQW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgQFByb3BlcnR5IFN0cmluZyBmb28KLSAgICBAUHJvcGVydHkgcHJvdGVjdGVkIGRlZiBiYXIKLSAgICBwcm90ZWN0ZWQgQFByb3BlcnR5IGRlZiBtb29reQotICAgIAotICAgIEBQcm9wZXJ0eQotICAgIFN0cmluZyB3aWJibGUgPSAid29iYmxlIgotCi0gICAgQFByb3BlcnR5IFN0cmluZyBnb3VkYSwgZWRhbSwgd2Vuc2xleWRhbGUsIGdvcmdvbnpvbGEsIHBhcm1lc2FuLAotICAgIG1vemFyZWxsYSwgCi0gICAgY2hlZGRhcgotCi0gICAgZGVmIGJhem91a2kgPSAib2ZmIgotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbHVlcygpIHsKLSAgICAgICAgYXNzZXJ0IGJhem91a2kgPT0gIm9mZiIKLQotICAgICAgICBhc3NlcnQgd2liYmxlID09ICJ3b2JibGUiCi0gICAgICAgIGFzc2VydCBnZXRXaWJibGUoKSA9PSAid29iYmxlIgotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL0JhZE1ldGhvZC5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvQmFkTWV0aG9kLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmODJiOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvQmFkTWV0aG9kLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKgotICogVmFyaW91cyBnb29kIGFuZCBiYWQgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzCi0gKi8KLWNsYXNzIEZvbyB7Ci0KLSAgICBzdGF0aWMgYmxhaCgpIHt9ICAvL0BmYWlsOnBhcnNlIGxvb2tzIGxpa2UgY29uc3RydWN0b3Igd2l0aCBiYWQgbmFtZQotCi0gICAgc3RhdGljIHZvaWQgYmxhaCgpIHt9IC8vIE9LCi0gICAgcHJpdmF0ZSBGb28oKSB7Ci0gICAgfQotCi0gICAgRm9vKFN0cmluZyB4KSB7Ci0gICAgfQotCi0KLSAgICBkZWYgRm9vKGludCB4KSB7fSAvL0BmYWlsOnBhcnNlIGNhbm5vdCB1c2UgZGVmIHdpdGggY29uc3RydWN0b3JzCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvRmllbGRQcm9wZXJ0eU1ldGhvZERpc2FtYmlndWF0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvRmllbGRQcm9wZXJ0eU1ldGhvZERpc2FtYmlndWF0aW9uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDg5ZTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL0ZpZWxkUHJvcGVydHlNZXRob2REaXNhbWJpZ3VhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotY2xhc3MgRmllbGRQcm9wZXJ0eU1ldGhvZERpc2FtYmlndWF0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICBTdHJpbmcgYmFyID0gImZpZWxkIgotCi0gICAgU3RyaW5nIGdldEJhcigpIHsKLSAgICAgICAgcmV0dXJuICJwcm9wZXJ0eU1ldGhvZCIKLSAgICB9Ci0KLSAgICBTdHJpbmcgYmFyKCkgewotICAgICAgICByZXR1cm4gIm1ldGhvZCIKLSAgICB9Ci0KLQotICAgIFN0cmluZyBiYXIocGFyYW0pIHsKLSAgICAgICAgcmV0dXJuICJtZXRob2Qgd2l0aCBwYXJhbTogIiArIHBhcmFtCi0gICAgfQotCi0KLSAgICB2b2lkIHRlc3RDYXNlKCkgewotICAgICAgICBkZWYgYW5zd2VyID0gYmFyKCkKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAibWV0aG9kIgotICAgICAgICBhc3NlcnQgdGhpcy5iYXIoKSA9PSAibWV0aG9kIgotCi0gICAgICAgIGFzc2VydCBiYXIoMSkgPT0gIm1ldGhvZCB3aXRoIHBhcmFtOiAxIgotICAgICAgICBhc3NlcnQgdGhpcy5iYXIoMSkgPT0gIm1ldGhvZCB3aXRoIHBhcmFtOiAxIgotCi0KLSAgICAgICAgYXNzZXJ0IGdldEJhcigpID09ICJwcm9wZXJ0eU1ldGhvZCIKLSAgICAgICAgYXNzZXJ0IHRoaXMuZ2V0QmFyKCkgPT0gInByb3BlcnR5TWV0aG9kIgotCi0gICAgICAgIC8vIFRPRE8gc2hvdWxkIHRoZXNlIDIgZXhwcmVzc2lvbnMgY2FsbCB0aGUgZ2V0dGVyIG9yIHJldHVybiB0aGUgZmllbGQ/Ci0gICAgICAgIGFzc2VydCBiYXIgPT0gImZpZWxkIgotICAgICAgICBhc3NlcnQgdGhpcy5iYXIgPT0gImZpZWxkIgotCi0KLSAgICAgICAgZGVmIHZhbHVlID0gdGhpcy5AYmFyCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiZmllbGQiCi0KLSAgICAgICAgYXNzZXJ0IHRoaXMuQGJhciA9PSAiZmllbGQiCi0KLSAgICAgICAgZGVmIHRtcCA9IHRoaXMKLSAgICAgICAgYXNzZXJ0IHRtcC5AYmFyID09ICJmaWVsZCIKLQotICAgICAgICB0bXAuQGJhciA9ICJ3aGF0bm90IgotCi0gICAgICAgIGFzc2VydCBiYXIgPT0gIndoYXRub3QiCi0gICAgICAgIGFzc2VydCB0aGlzLkBiYXIgPT0gIndoYXRub3QiCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvbWlzYy9Kb2huUm9zZUV4YW1wbGVzLmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvbWlzYy9Kb2huUm9zZUV4YW1wbGVzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MzgzNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvSm9oblJvc2VFeGFtcGxlcy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIEpvaG4gUm9zZSBFeGFtcGxlIHRlc3QgY2FzZXMuCi0gKi8KLWNsYXNzIE5pZnR5IHsKLSAgICBkZWYgc3R1ZmYoKSB7Ci0gICAgKFthLGIsY10gPSBuKQotICAgIFN5c3RlbS4naW4nLnJlYWQKLSAgICBwcmludGxuICIiImhlbGxvLCB3b3JsZCEiIiIKLSAgICBkZWYgbCA9IFtmb28sIGJhciwgKmJheiwgXQotICAgIGwuZm9yRWFjaHtwcmludGxuIGl0fQotICAgIHdoaWxlIChkZWYgU3RyaW5nIGl0ID0gYXNhKSB7IHByaW50bG4gaXQgfQotICAgIHdpdGggKGh0bWwpIHsgaGVhZHt9OyBib2R5eyAqImhlbGxvIiB9IH0KLSAgICAvL2ZvbygpIGJhcigpIC8vQGZhaWw6cGFyc2UKLSAgICBmb3IgKGkgaW4gMC0tYS5sZW5ndGgpICBwcmludGxuIGFbaV0KLSAgfQotICAvL2ludGVyZmFjZSBkZWYge307Ci0KLSAgZGVmIGZvbyh4KSB7IDEreCB9Ci0gIGRlZiBiYXIoKSB7Ci0gICAgZGVmIGludCB2ID0gMAotICAgIGRlZiB4ID0gKDEKLSAgICAgICAgICAgICAgKzIpOyBkZWYgeSA9IDMKLSAgICBkZWYKLSAgICAgIHogPQotICAgICAgICAgeSArCi0gICAgICAgICAgICAgeAotfQotZGVmIGNhdCA9IHt4LHl8ICIkeCR5In0KLWRlZiBmdW4oKSB7Ci0gICAgZGVmIGlkMSA9IHtpdH0KLSAgICBkZWYgaWQyID0ge3h8eH0KLSAgICBkZWYgaWQzID0ge3tpZDF9fQotfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvUHJvcGVydHlDYWxsZWROYW1lVGVzdC5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvUHJvcGVydHlDYWxsZWROYW1lVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmRmZGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL1Byb3BlcnR5Q2FsbGVkTmFtZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCi1jbGFzcyBQcm9wZXJ0eUNhbGxlZE5hbWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgQFByb3BlcnR5IFN0cmluZyBuYW1lCi0KLSAgICB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gSlVuaXQgZG9lc24ndCBsaWtlIGl0IGlmIHdlIG92ZXJsb2FkIHRoZSBzZXROYW1lKCkgc28gbGV0cyBrZWVwIGl0IHdvcmtpbmcgOikKLSAgICAgICAgc3VwZXIuc2V0TmFtZShuYW1lKQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0UHJvcGVydHkoKSB7Ci0KLSAgICAgICAgZGVmIGZvbyA9IHRoaXMubmFtZQotICAgICAgICBhc3NlcnQgZm9vID09ICJ0ZXN0UHJvcGVydHkiCi0KLSAgICAgICAgYXNzZXJ0IG5hbWUgPT0gInRlc3RQcm9wZXJ0eSIKLSAgICAgICAgYXNzZXJ0IHRoaXMuZ2V0TmFtZSgpID09ICJ0ZXN0UHJvcGVydHkiCi0gICAgICAgIGFzc2VydCB0aGlzLm5hbWUgPT0gInRlc3RQcm9wZXJ0eSIKLQotICAgICAgICBkZWYgYmFyID0gdGhpcwotICAgICAgICBhc3NlcnQgYmFyLmdldE5hbWUoKSA9PSAidGVzdFByb3BlcnR5IgotICAgICAgICBhc3NlcnQgYmFyLm5hbWUgPT0gInRlc3RQcm9wZXJ0eSIKLQotICAgICAgICBuYW1lID0gImNoZWRkYXIiCi0KLSAgICAgICAgYXNzZXJ0IHRoaXMuZ2V0TmFtZSgpID09ICJjaGVkZGFyIgotICAgICAgICBhc3NlcnQgdGhpcy5uYW1lID09ICJjaGVkZGFyIgotCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvbWlzYy9Qcm9wZXJ0eVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL1Byb3BlcnR5VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNWM1YWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL1Byb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0KLWNsYXNzIFByb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotCi0gICAgLy8gVE9ETyBzaG91bGQgYmFyZiBhcyBUZXN0Q2FzZSBoYXMgYSBwcml2YXRlIHNldHRlcj8KLSAgICAvLyBAUHJvcGVydHkgU3RyaW5nIG5hbWUgPSAiYWJjIgotCi0gICAgQFByb3BlcnR5IFN0cmluZyBjaGVlc2UgPSAiZWRhbSIKLQotICAgIC8qKiBUT0RPIGNhbid0IGRvIGNvbnN0cnVjdG9ycyA6KQotICAgIFByb3BlcnR5VGVzdCgpIHsKLSAgICB9Ci0gICAgKi8KLQotICAgIHZvaWQgdGVzdFByb3BlcnR5KCkgewotCi0gICAgICAgIGRlZiBmb28gPSB0aGlzLmNoZWVzZQotICAgICAgICBhc3NlcnQgZm9vID09ICJlZGFtIgotCi0gICAgICAgIGFzc2VydCBjaGVlc2UgPT0gImVkYW0iCi0gICAgICAgIGFzc2VydCB0aGlzLmdldENoZWVzZSgpID09ICJlZGFtIgotICAgICAgICBhc3NlcnQgdGhpcy5jaGVlc2UgPT0gImVkYW0iCi0KLSAgICAgICAgZGVmIGJhciA9IHRoaXMKLSAgICAgICAgYXNzZXJ0IGJhci5nZXRDaGVlc2UoKSA9PSAiZWRhbSIKLSAgICAgICAgYXNzZXJ0IGJhci5jaGVlc2UgPT0gImVkYW0iCi0KLSAgICAgICAgY2hlZXNlID0gImNoZWRkYXIiCi0KLSAgICAgICAgYXNzZXJ0IHRoaXMuZ2V0Q2hlZXNlKCkgPT0gImNoZWRkYXIiCi0gICAgICAgIGFzc2VydCB0aGlzLmNoZWVzZSA9PSAiY2hlZGRhciIKLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvU2FtcGxlTWFpbi5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvU2FtcGxlTWFpbi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTE5YTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9taXNjL1NhbXBsZU1haW4uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBmb28uYmFyCi0KLWNsYXNzIFNhbXBsZU1haW4gewotCi0gICAgQFByb3BlcnR5IFN0cmluZyBuYW1lID0gIkphbWVzIgotCi0KLSAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLSAgICAgICAgZm9vID0gbmV3IFNhbXBsZU1haW4oKQotICAgICAgICBwcmludGxuICJIZWxsbyAke2Zvby5uYW1lfSIKLQotICAgICAgICBhc3NlcnQgZm9vLmdldE5hbWUoKSA9PSAiSmFtZXMiCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9qc3IvdGNrL3Rlc3QvbWlzYy9TYW1wbGVUZXN0Lmdyb292eSBiL2dyb292eS9qc3IvdGNrL3Rlc3QvbWlzYy9TYW1wbGVUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwNmZiMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvanNyL3Rjay90ZXN0L21pc2MvU2FtcGxlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotcGFja2FnZSBmb28uYmFyCi0KLWltcG9ydCBqYXZhLmlvLkZpbGUKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZSBhcyBVRGF0ZQotCi0vLyBUT0RPIGFsbG93IGFubm90YXRpb25zIG9uIGNsYXNzZXMgYWdhaW4gOikKLS8vQEJlYW4oY29vbD10cnVlKQotCi1jbGFzcyBTYW1wbGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgU3RyaW5nIGZvbyA9ICJKb2huIgotICAgIFN0cmluZyBiYXIgPSAiSmV6IgotICAgIHByaXZhdGUgc3RhdGljIGRlZiBkdW1teXggPSAxMjMKLSAgICBwcm90ZWN0ZWQgZmluYWwgZGVmIGR1bW15WSA9IDQ1NgotCi0gICAgdm9pZCB0ZXN0UmFuZ2UoKSB7Ci0gICAgICAgIGRlZiByYW5nZSA9IDEuLjMKLSAgICAgICAgYXNzZXJ0IHJhbmdlID09IFsxLCAyLCAzXQotCi0gICAgICAgIGZvciAoaSBpbiAxLi4xMCkgewotICAgICAgICAgICAgcHJpbnRsbiAiUmFuZ2UgbG9vcCBhdCAkaSIKLSAgICAgICAgfQotCi0gICAgICAgICgxMC4uMSkuZWFjaCB7IHByaW50bG4gIlJhbmdlIGNsb3N1cmUgbG9vcCBhdCAkaXQiIH0KLSAgICB9Ci0KLQotICAgIHZvaWQgdGVzdExpc3RDbG9zdXJlKCkgewotICAgICAgICBkZWYgbGlzdCA9IFsxLCAyLCAzXQotCi0gICAgICAgIHByaW50bG4gImxpc3QgaXMgJGxpc3QiCi0KLSAgICAgICAgLy8gVE9ETyBzb3J0IG91dCBwYXJzZXIKLSAgICAgICAgLy8gbGlzdC5lYWNoIHt8ZXwgcHJpbnRsbigiTGlzdCBjb250YWlucyAkZSIpIH0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNYXAoKSB7Ci0gICAgICAgIG4gPSBbOl0KLSAgICAgICAgYXNzZXJ0IG4gaW5zdGFuY2VvZiBqYXZhLnV0aWwuTWFwCi0KLSAgICAgICAgbSA9IFsieSI6MiwgImZvbyI6ImJhciIsICJ4Ijo0LjJdCi0KLSAgICAgICAgLy8gVE9ETwotICAgICAgICAvL20uZWFjaCB7IChrLCB2KXwgcHJpbnRsbiAia2V5ICRrIGFuZCB2YWx1ZSAkdiIgfQotCi0gICAgICAgIHByaW50bG4gIkNyZWF0ZWQgbWFwICRtIgotCi0gICAgICAgIG0yID0gW3g6MTIzLCB5OjQ1Niwgejoid2hhdG5vdCJdCi0KLSAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCBtYXAgd2l0aCBuYW1lZCBhcmd1bWVudHMgJG0yIgotCi0gICAgICAgIC8vIFRPRE8gcGFyc2VyIGNhbid0IGhhbmRsZSB0aGlzIQotICAgICAgICAvL20zID0gWzEyMzo0NTYsIDY3ODoid2hhdG5vdCJdCi0gICAgICAgIG0zID0gWygxMjMpOjQ1NiwgKDY3OCk6IndoYXRub3QiXQotICAgICAgICBwcmludGxuICJDcmVhdGVkIG1hcCB3aXRoIG5hbWVkIGFyZ3VtZW50cyAkbTMiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TXVsdGlMaW5lU3RyaW5nKCkgewotICAgICAgICBwcmludGxuICIiIgotdGhpcyBpcwotYSB2ZXJ5Ci1sb25nIHN0cmluZwotd2hpY2ggc3BhbnMKLW1hbnkgbGluZXMKLSIiIgotICAgIH0KLQotICAgIHZvaWQgdGVzdFN0cmluZ3MoKSB7Ci0gICAgICAgIGFzc2VydCAiXFwiID09ICdcXCcKLSAgICAgICAgYXNzZXJ0ICJcXCIgIT0gIlxcXFwiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TmV3KCkgewotICAgICAgICB4ID0gbmV3IEFycmF5TGlzdCgpCi0gICAgICAgIHguYWRkKDEyMykKLQotICAgICAgICBhc3NlcnQgeC5zaXplKCkgPT0gMQotCi0gICAgICAgIHByaW50bG4gImNyZWF0ZWQgbGlzdCAkeCIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3ROZXdXaXRoSW1wb3J0cygpIHsKLSAgICAgICAgZiA9IG5ldyBGaWxlKCJmb28udHh0IikKLQotICAgICAgICBkZWYgbmFtZSA9IGYubmFtZQotICAgICAgICBkZWYgbmFtZTIgPSBmLmdldE5hbWUoKQotICAgICAgICBhc3NlcnQgbmFtZSA9PSBuYW1lMgotCi0KLSAgICAgICAgcHJpbnRsbiAiRmlsZSBuYW1lICRuYW1lIgotCi0gICAgICAgIHByaW50bG4gbmV3IFVEYXRlKCkKLQotICAgICAgICBkZWYgc2QgPSBuZXcgamF2YS5zcWwuRGF0ZSgxMDUsIDExLCA1KQotICAgICAgICBwcmludGxuICJjcmVhdGVkIFNRTCBkYXRlIG9mIHZhbHVlICRzZCIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBc0Nhc3RBbmRJbnN0YW5jZW9mKCkgewotICAgICAgICBkZWYgeCA9ICJmb28iCi0KLSAgICAgICAgZGVmIGZvbyA9IHggYXMgU3RyaW5nCi0gICAgICAgIGRlZiBiYXIgPSAoU3RyaW5nKSB4Ci0KLSAgICAgICAgYXNzZXJ0IGZvbyA9PSBiYXIKLSAgICAgICAgYXNzZXJ0IGZvbyBpbnN0YW5jZW9mIFN0cmluZwotICAgIH0KLQotICAgIHZvaWQgdGVzdENvbXBsZXhFeHByZXNzaW9uKCkgewotICAgICAgICBkZWYgbGlzdCA9IFsxLCBbMSwgWzEsIDJdLCAzXSwgM10KLQotICAgICAgICBkZWYgeCA9IGxpc3RbMV1bMV1bMV0KLQotICAgICAgICBhc3NlcnQgeCA9PSAyCi0KLSAgICAgICAgZGVmIHkgPSBsaXN0LmdldCgxKVsxXS5nZXQoMSkKLQotICAgICAgICBhc3NlcnQgeCA9PSB5Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FzZSgpIHsKLSAgICAgICAgcHJpbnRsbiAiSGVsbG8iCi0gICAgICAgIHByaW50bG4gMTIzCi0gICAgICAgIHByaW50bG4gMTIzLjQ1NgotCi0gICAgICAgIHByaW50bG4gIkhlbGxvICRmb28hIgotICAgICAgICBwcmludGxuICJIZWxsbyAke2Jhcn0hIgotCi0KLSAgICAgICAgZGVmIGYgPSB0aGlzCi0gICAgICAgIGRlZiBhbnN3ZXIgPSBmLmZvbygiaGVsbG8gIiwgIkphbWVzIikKLQotICAgICAgICBwcmludGxuICJSZWNlaXZlZCBhbnN3ZXIgJGFuc3dlciIKLQotICAgICAgICBhc3NlcnQgYW5zd2VyID09ICJoZWxsbyBKYW1lcyIKLQotICAgICAgICBhbnN3ZXIgPSBmb28yKCJoZWxsbyAiLCAiR3VpbGxhdW1lIikKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAiaGVsbG8gR3VpbGxhdW1lIgotCi0gICAgICAgIHByaW50bG4gIk5vdyB0aGUgYW5zd2VyIGlzICRhbnN3ZXIiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0U3Vic2NyaXB0KCkgewotICAgICAgICBsaXN0ID0gWzEsIDIsIDNdCi0KLSAgICAgICAgZGVmIHggPSBsaXN0WzJdCi0gICAgICAgIGFzc2VydCB4ID09IDMKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RJZigpIHsKLSAgICAgICAgZGVmIHggPSAxMjMKLSAgICAgICAgZGVmIHkgPSAxCi0gICAgICAgIGlmICh4ID4gMTAwKSB7Ci0gICAgICAgICAgICB5ID0gMgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHkgPT0gMgotICAgIH0KLQotICAgIHZvaWQgdGVzdElmRWxzZSgpIHsKLSAgICAgICAgZGVmIHggPSAxMjMKLSAgICAgICAgZGVmIHkgPSAxCi0gICAgICAgIGlmICh4ID4gMTAwKSB7Ci0gICAgICAgICAgICB5ID0gMgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgeSA9IDMKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgeSA9PSAyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0V2hpbGUoKSB7Ci0gICAgICAgIGRlZiB4ID0gMTAKLQotICAgICAgICB3aGlsZSAoeCA+IDApIHsKLSAgICAgICAgICAgIHByaW50bG4gImxvb3AgdmFsdWUgd2l0aCB4PSR4IgotICAgICAgICAgICAgeCA9IHggLSAxCi0KLSAgICAgICAgICAgIGlmICh4ID09IDMpIHsKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0V2hpbGVXaXRoTGFiZWwoKSB7Ci0gICAgICAgIGRlZiB4ID0gMTAKLQotICAgICAgICB3aGlsZSAoeCA+IDApIHsKLSAgICAgICAgICAgIHByaW50bG4gImxvb3AgdmFsdWUgd2l0aCB4PSR4IgotICAgICAgICAgICAgeCA9IHggLSAxCi0KLSAgICAgICAgICAgIGlmICh4ID09IDMpIHsKLSAgICAgICAgICAgICAgICBicmVhayBGT08KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZPTzogcHJpbnRsbiAiRG9uZSIKLSAgICB9Ci0KLSAgICBTdHJpbmcgZm9vKGEsIGIpIHsKLSAgICAgICAgcmV0dXJuIGEgKyBiCi0gICAgfQotCi0KLSAgICBkZWYgZm9vMihhLCBiKSB7Ci0gICAgICAgIGRlZiBhbnN3ZXIgPSBhICsgYgotICAgICAgICByZXR1cm4gYW5zd2VyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0VHJ5Q2F0Y2hXaXRoRXhjZXB0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWV0aG9kVGhhdFRocm93c0V4Y2VwdGlvbigpCi0gICAgICAgICAgICBmYWlsICJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIGJ5IG5vdyEiCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcmludGxuICJXb3JrZWQhIENhdWdodCBleHBlY3RlZCBleGNlcHRpb24gJGUiCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbWV0aG9kVGhhdFRocm93c0V4Y2VwdGlvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVzdCBleGNlcHRpb24iKQotICAgIH0KLQotICAgIHZvaWQgdGVzdFN3aXRjaCgpIHsKLSAgICAgICAgeCA9IDEyCi0gICAgICAgIHN3aXRjaCAoeCkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGZhaWwgIm5vdCAxIgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgIGNhc2UgIDEyOgotICAgICAgICAgICAgICAgIHByaW50bG4gIlN3aXRjaCB3b3JrZWQhIGFuc3dlciBpcyAxMiEiCi0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgY2FzZSAidGV4dCI6Ci0gICAgICAgICAgICAgICAgZmFpbCAibm90IHRleHQiCi0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsICJOb3QgZGVmYWlsdCIKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0KLSAgICAgICAgeCA9IDUKLSAgICAgICAgc3dpdGNoICh4KSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgZmFpbCAibm90IDEiCi0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgY2FzZSAgMTI6Ci0gICAgICAgICAgICAgICAgZmFpbCAibm90IDEyIgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgIGNhc2UgInRleHQiOgotICAgICAgICAgICAgICAgIGZhaWwgIm5vdCB0ZXh0IgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRsbiAid29ya2VkLCB0aGUgZGVmYXVsdCBhbnN3ZXIiCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgdm9pZCB0ZXN0Rm9yKCkgewotICAgICAgICBkZWYgbGlzdCA9IFsxLCAyLCAzXQotCi0gICAgICAgIHByaW50bG4gIm5vcm1hbCBpdGVyYXRpb24gbG9vcCBvbiBsaXN0ICRsaXN0IgotCi0gICAgICAgIGZvciAoaSBpbiBsaXN0KSB7Ci0gICAgICAgICAgICBwcmludGxuICJmb3IgaXRlbTogJGkiCi0gICAgICAgIH0KLQotICAgICAgICBwcmludGxuICJ0eXBlZCBpdGVyYXRpb24gbG9vcCBvbiBsaXN0ICRsaXN0IgotCi0gICAgICAgIGZvciAoSW50ZWdlciBpIGluIGxpc3QpIHsKLSAgICAgICAgICAgIHByaW50bG4gImZvciBpdGVtOiAkaSIKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgdm9pZCB0ZXN0VHJ5Q2F0Y2goKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRob2RUaGF0RG9lc05vdFRocm93RXhjZXB0aW9uKCkKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwgIlNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uICRlIgotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0VHJ5Q2F0Y2hGaW5hbGx5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWV0aG9kVGhhdERvZXNOb3RUaHJvd0V4Y2VwdGlvbigpCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsICJTaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiAkZSIKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIHByaW50bG4gIkNhbGxlZCBmcm9tIGZpbmFsbHkgYmxvY2siCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG1ldGhvZFRoYXREb2VzTm90VGhyb3dFeGNlcHRpb24oKSB7Ci0gICAgICAgIHByaW50bG4gIk5vcm1hbCBtZXRob2QgaW52b2NhdGlvbi4uLiIKLSAgICB9Ci0KLQotICAgIHZvaWQgdGVzdEJ1ZzY3NSgpIHsKLSAgICAgICAgYXNzZXJ0ICJcXCIhPSJcXFxcIgotCi0gICAgICAgIC8vIEFyZSB0aGUgZm9sbG93aW5nIHZhbGlkIG5vdz8gTXVzdCAkIGJlIGVzY2FwZWQ/Ci0KLSAgICAgICAgLy8gVE9ETyAgYXNzZXJ0ICJcXCQiPT0iXFwiKyIkIgotCi0KLSAgICAgICAgYXNzZXJ0ICgiXFxcXCIrIlxcIikubGVuZ3RoKCkgPT0gMwotICAgICAgICAvLyBUT0RPIGFzc2VydCAiXFwzICQxJDIiID09ICJcXCIgKyAiMyIgKyAiICIgKyAiJCIgKyAiMSIgKyAiJCIgKyAiMiIKLSAgICAgICAgLy8gVE9ETyBhc3NlcnQgIlxcXFwzIFxcJDEkMiIgPT0gIlxcIiArICJcXCIgKyAiMyIgKyAiICIgKyAiXFwiKyAiJCIgKyAiMSIgKyAiJCIgKyAiMiIKLSAgICAgICAgLy8gVE9ETyBhc3NlcnQgIlxcXFxcXDMgXFxcXCQxJDIiID09ICJcXCIgKyAiXFxcXCIgKyAiMyIgKyAiICIgKyAiXFxcXCIrICIkIiArICIxIiArICIkIiArICIyIgotICAgICAgICAvLyBUT0RPIGFzc2VydCAiXFxcXFxcXFwzIFxcXFxcXCQxJDIiID09ICJcXFxcIiArICJcXFxcIiArICIzIiArICIgIiArICJcXFxcXFwiKyAiJCIgKyAiMSIgKyAiJCIgKyAiMiIKLQotICAgICAgICBhc3NlcnQgIlxcXFwiID09ICJcXCIgKyAiXFwiCi0gICAgICAgIGFzc2VydCAiXFxcXCIubGVuZ3RoKCkgPT0gMgotCi0gICAgICAgIHogPSAxMDAgKyAyMDAKLSAgICAgICAgYXNzZXJ0ICJIZWxsb1xcLCBcXFdvcmxkXFwiLmNoYXJBdCg0KSA9PSAibyIuY2hhckF0KDApCi0gICAgICAgIGFzc2VydCAiSGVsbG9cXCwgXFxXb3JsZFxcIi5jaGFyQXQoNSkgPT0gIlxcIi5jaGFyQXQoMCkKLSAgICAgICAgYXNzZXJ0ICJIZWxsb1xcLCBcXFdvcmxkXFwiLmNoYXJBdCg2KSA9PSAiLCIuY2hhckF0KDApCi0KLSAgICAgICAgLy8gVE9ETyBmYWlsaW5nIHRlc3RzLi4uCi0gICAgICAgIC8vIGFzc2VydCAiXFwiKyJcXFxcIiA9PSAiXFwiKyJcXCIrIlxcIiAmJiAiXFxcXCIrIlxcIiA9PSAiXFwiKyJcXCIrIlxcIgotICAgICAgICAvLyBhc3NlcnQgIlxcXFwgXFwgJHt6fSIgPT0gIlxcXFwgXFwgMzAwIgotICAgICAgICAvLyBhc3NlcnQgIlxcXFwgXFwgJHt6fSIgPT0gIlxcIiArICJcXCIgKyAiICIgKyAiXFwiICsgIiAiICsgIjMwMCIKLSAgICB9Ci0KLQotICAgIEB3ZWJTZXJ2aWNlIHZvaWQgbWV0aG9kV2l0aEFubm90YXRpb25zKCkgewotICAgICAgICBwcmludGxuICJIZXkiCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzb21ldGhpbmcoKSB7Ci0gICAgICAgIHByaW50bG4gIkhleSwgSSdtIHN5bmNocm9uaXplZCBhbmQgc3RhdGljIgotICAgIH0KLQotICAgIHZvaWQgdGVzdFByZVBvc3RGaXgoKSB7Ci0gICAgICAgIGRlZiB4ID0gMTIzCi0KLSAgICAgICAgcHJpbnRsbigidmFsdWUgaXMgJHgiKQotCi0gICAgICAgIGlmICh4ID4gMTAwKSB7Ci0gICAgICAgICAgICArK3gKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IDEyNAotICAgICAgICBhc3NlcnQgKyt4ID09IDEyNQotCi0gICAgICAgIGFzc2VydCB4KysgPT0gMTI1Ci0gICAgICAgIGFzc2VydCAtLXggPT0gMTI1Ci0gICAgICAgIGFzc2VydCB4LS0gPT0gMTI1Ci0KLSAgICAgICAgcHJpbnRsbigidmFsdWUgaXMgbm93ICR7eH0iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMTI0Ci0gICAgfQotCi0KLSAgICAvLyBUT0RPIHdoZW4gcGFyc2VyIGZpeGVkCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qCi0KLSAgICB2b2lkIHRlc3RBcnJheXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gdGhpcyBsaW5lIHNlZW1zIHRvIGNhdXNlIGEgc3RhY2sgb3ZlcmZsb3cuLi4KLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSB7ICJhIiwgImIiLCAiYyIgfQotCi0gICAgICAgIExpc3QgbGlzdCA9IGFycmF5LmFzTGlzdCgpCi0KLSAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWyJhIiwgImIiLCAiYyJdCi0gICAgfQotCi0KLSAgICB2b2lkIHRlc3RNYXBXaXRoSW50ZWdlcktleSgpIHsKLSAgICAgICAgbSA9IFsxOjIsICJmb28iOiJiYXIiLCAieCI6NC4yXQotCi0gICAgICAgIHByaW50bG4gIkNyZWF0ZWQgbWFwICRtIgotCi0gICAgICAgIG0uZWFjaCB7IChrLCB2KXwgcHJpbnRsbiAia2V5ICRrIGFuZCB2YWx1ZSAkdiIgfQotICAgIH0KLQotICAgICovCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0L3Byb3Bvc2Fscy9DbG9zdXJlcy5ncm9vdnkgYi9ncm9vdnkvanNyL3Rjay90ZXN0L3Byb3Bvc2Fscy9DbG9zdXJlcy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMDg4MDAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L2pzci90Y2svdGVzdC9wcm9wb3NhbHMvQ2xvc3VyZXMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqCi0gKiBDbG9zdXJlIEV4YW1wbGUgdGVzdCBjYXNlcy4KLSAqLwotY2xhc3MgQ2xvc3VyZXMgewotICAgIGRlZiBzb21lQ2xvc3VyZXMoKSB7Ci0gICAgICAgIC8vIGMxID0ge3ByaW50ICJoZWxsbyJ9ICAgLy9AcGFzcwotICAgICAgICAvLyBjMiA9IHtmb298IHByaW50IGZvb30gIC8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy8gYzMgPSB7fGJhcnwgcHJpbnQgYmFyfSAvL0BwYXNzCi0gICAgICAgIC8vIGM0ID0ge3xTdHJpbmcgdGVsc29ufCBwcmludGxuIHRlbHNvbn0gLy9AcGFzcwotICAgICAgICAvLyBjNSA9IHt8Q29vbCBjYXIsIGZ1bmt5LCBNb3BlZCB5ZWFofCBwcmludGxuIHllYWggKyBmdW5reSArIGNhcn0gLy9AcGFzcwotICAgICAgICAvLyBjNiA9IHt8U3RyaW5nIG5hbWUsIGFnZXwgcHJpbnRsbiAiJHtuYW1lKSBpcyAke2FnZX0geWVhcnMgb2xkIn0gLy9AcGFzcwotICAgICAgICAvLyBteUxpc3QuZWFjaHtwcmludCBpdH0gICAvL0BwYXNzCi0gICAgICAgIC8vIG15TGlzdC5lYWNoe2Zvb3xwcmludCBmb299IC8vQGZhaWw6cGFyc2UKLSAgICAgICAgLy8gbXlMaXN0LmVhY2h7fGJhcnxwcmludCBiYXJ9IC8vQHBhc3MKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2pzci90Y2svdGVzdGxpYi9SRUFETUUudHh0IGIvZ3Jvb3Z5L2pzci90Y2svdGVzdGxpYi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIzNzBlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3RsaWIvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGlzIHdoZXJlIHRvIHB1dCB0aGUgcnVudGltZSBqYXJzIHRoYXQgYXJlIHVuZGVyIHRlc3QuLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvanNyL3Rjay90ZXN0bGliL2FudGxyLTIuNy41LmphciBiL2dyb292eS9qc3IvdGNrL3Rlc3RsaWIvYW50bHItMi43LjUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1ZTNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9qc3IvdGNrL3Rlc3RsaWIvYW50bHItMi43LjUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvLmN2c2lnbm9yZSBiL2dyb292eS9tb2R1bGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2IwZjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS5EU19TdG9yZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9SRUFETUUudHh0IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ3ZmNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBjbGFzc2ljIHBhcnNlciwgd2hpY2ggaGFzIHNpbmNlIGJlZW4gc3VwZXJjZWRlZCBieSB0aGUgSlNSIHBhcnNlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9BYnN0cmFjdENoYXJTdHJlYW0uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvQWJzdHJhY3RDaGFyU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzgyYzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9BYnN0cmFjdENoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXJTdHJlYW0KLSAgICBpbXBsZW1lbnRzIENoYXJTdHJlYW0KLXsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHB1YmxpYyBBYnN0cmFjdENoYXJTdHJlYW0oKQotICAgIHsKLSAgICAgICAgdGhpcyggIjx1bmtub3duPiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RDaGFyU3RyZWFtKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvQ2hhclN0cmVhbS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9DaGFyU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTY5NzcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9DaGFyU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyOwotCi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci0KLS8qKiBDb25kdWl0IG9mIGNoYXJhY3RlcnMgIHRvIGEgbGV4ZXIuCi0gKgotICogIEBzZWUgTGV4ZXIKLSAqICBAc2VlIEFic3RyYWN0Q2hhclN0cmVhbQotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAd2Vya2VuLmNvbSI+Ym9iIG1jd2hpcnRlcjwvYT4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoYXJTdHJlYW0gewotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgICAgQ29uc3RhbnRzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqIEVuZC1vZi1zdHJlYW0gdmFsdWUuICovCi0gICAgZmluYWwgY2hhciBFT1MgPSAoY2hhcikgLSAxOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vICAgICBJbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKiBDb25zdW1lIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBjb25zdW1lZCBjaGFyYWN0ZXIgb3IgLTEgaWYgbm8gbW9yZSBjaGFyYWN0ZXJzCi0gICAgICogICAgICAgICAgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgUmVhZEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjb25zdW1lCi0gICAgICogICAgICAgICAgYSBjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgY2hhciBjb25zdW1lKCkgdGhyb3dzIFJlYWRFeGNlcHRpb247Ci0KLSAgICB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlYWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0RlbGltaXRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9EZWxpbWl0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYmZkMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0RlbGltaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotCi0vKioKLSAqICBBbiBpbnRlcmZhY2UgZm9yIExleGVycyB0aGF0IGRlbGltaXQgY29udGVudCBmcm9tIGEgbGFyZ2VyIHNvdXJjZS4KLSAqCi0gKiAgQGF1dGhvciBDaHJpcyBQb2lyaWVyCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBEZWxpbWl0ZXIKLXsKLQotCi0gICAvKioKLSAgICAqICBUdXJucyBkZWxpbWl0aW5nIG9uIG9yIG9mZi4gIFRoaXMgc2hvdWxkIGFmZmVjdCA8Y29kZT5sYSgpPC9jb2RlPgotICAgICogIGFuZCA8Y29kZT5jb25zdW1lKCk8L2NvZGU+LiAgSG93ZXZlciwgb25jZSB0aGUgZGVsaW1pdGVyIGhhcyBiZWVuCi0gICAgKiAgcmVhY2hlZCwgdGhpcyByb3V0aW5lIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZGVsaW1pdCggYm9vbGVhbiBkZWxpbWl0ZXIgKTsKLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGV4ZXIgaXMgYXBwbHlpbmcgaXRzIGRlbGltaXRlciBwb2xpY3kuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsaW1pdGVkKCk7Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGxleGVyIHN0cmVhbSBpcyBkcnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9GaWxlQ2hhclN0cmVhbS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9GaWxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU5Y2E0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvRmlsZUNoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsZUNoYXJTdHJlYW0KLSAgICBpbXBsZW1lbnRzIENoYXJTdHJlYW0KLXsKLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIENoYXJTdHJlYW0gY2hhclN0cmVhbTsKLQotICAgIHB1YmxpYyBGaWxlQ2hhclN0cmVhbShGaWxlIGZpbGUpCi0gICAgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2hhclN0cmVhbSBnZXRDaGFyU3RyZWFtKCkKLSAgICAgICAgdGhyb3dzIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMuY2hhclN0cmVhbSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNoYXJTdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1DaGFyU3RyZWFtKCBuZXcgRmlsZUlucHV0U3RyZWFtKCBnZXRGaWxlKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlYWRFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLmNoYXJTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RmlsZSgpLmdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhciBjb25zdW1lKCkKLSAgICAgICAgdGhyb3dzIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDaGFyU3RyZWFtKCkuY29uc3VtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICAgICAgdGhyb3dzIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldENoYXJTdHJlYW0oKS5jbG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvR1N0cmluZ0xleGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0dTdHJpbmdMZXhlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc3ZThiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvR1N0cmluZ0xleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotLy97e3sgaW1wb3J0cwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0vL319fQotCi0vKioKLSAqICBBIGxleGVyIGZvciBHU3RyaW5ncywgdXN1YWxseSBydW4gb24gYSBMZXhlckZpbHRlciBiYXNlLgotICoKLSAqICBAYXV0aG9yIENocmlzIFBvaXJpZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgR1N0cmluZ0xleGVyIGV4dGVuZHMgTGV4ZXJCYXNlCi17Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZW50U3RhcnRUb2tlbiAgICAgID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VudEVuZFRva2VuICAgICAgICA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciAgICAgICBmdWxsVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBwcm90ZWN0ZWQgaW50ICAgICAgIGZ1bGxUZXh0U3RhcnRMaW5lID0gMDsKLSAgICBwcm90ZWN0ZWQgaW50ICAgICBmdWxsVGV4dFN0YXJ0Q29sdW1uID0gMDsKLQotICAgIHByb3RlY3RlZCBHcm9vdnlFeHByZXNzaW9uTGV4ZXIgY2hpbGQgPSBudWxsOwotICAgIHByb3RlY3RlZCBib29sZWFuICAgICAgICBpbkV4cHJlc3Npb24gPSBmYWxzZTsKLQotCi0gICAvKioKLSAgICAqICBGaW5kcyBhbmQgcmV0dXJucyAoY29uc3VtaW5nKSB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAqICBSZXR1cm5zIG51bGwgd2hlbiBvdXQgb2YgdG9rZW5zLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gdW5kZWxlZ2F0ZWROZXh0VG9rZW4oKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgTGV4ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIiIgKyB0aGlzICsgInVuZGVsZWdhdGVkTmV4dFRva2VuKCkiICk7Ci0gICAgICAgIFRva2VuIHRva2VuID0gbnVsbDsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEhhbmRsZSBicmFja2V0aW5nIHRva2VucyBhbmQgRU9TCi0KLSAgICAgICAgaWYoICFzZW50U3RhcnRUb2tlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgIGZ1bGxUZXh0U3RhcnRMaW5lICAgPSBnZXRTdGFydExpbmUoKTsKLSAgICAgICAgICAgIGZ1bGxUZXh0U3RhcnRDb2x1bW4gPSBnZXRTdGFydENvbHVtbigpOwotICAgICAgICAgICAgc2VudFN0YXJ0VG9rZW4gICAgICA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIiIgKyB0aGlzICsgInJldHVybmluZyBHU1RSSU5HX1NUQVJUIiApOwotICAgICAgICAgICAgcmV0dXJuIHN5bWJvbCggVHlwZXMuR1NUUklOR19TVEFSVCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGxhKDEpID09IENoYXJTdHJlYW0uRU9TICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICFzZW50RW5kVG9rZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbnRFbmRUb2tlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5uZXdTeW1ib2woIFR5cGVzLkdTVFJJTkdfRU5ELCBmdWxsVGV4dFN0YXJ0TGluZSwgZnVsbFRleHRTdGFydENvbHVtbiApOwotICAgICAgICAgICAgICAgIHRva2VuLnNldFRleHQoIGZ1bGxUZXh0LnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiIiArIHRoaXMgKyAicmV0dXJuaW5nICIgKyB0b2tlbiApOwotICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIsIHdlIGFyZSBubyBsb25nZXIgZGVsZWdhdGVkLiAgSWYKLSAgICAgICAgLy8gd2UganVzdCBwcm9jZXNzZWQgYW4gZXhwcmVzc2lvbiwgdGhlIG5leHQgY2hhcmFjdGVyCi0gICAgICAgIC8vIGhhZCBiZXR0ZXIgYmUgYSAnfScuLi4KLQotICAgICAgICBpZiggaW5FeHByZXNzaW9uICYmIGxhKDEpICE9ICd9JyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgIHVuZXhwZWN0ZWQoIGxhKDEpLCAwICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIGxleC4uLgotCi0gICAgICAgIG1hcmsoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNlZ21lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgY2hhciBjOwotICAgICAgICBNQUlOX0xPT1A6IHdoaWxlKCB0cnVlICkKLSAgICAgICAgewotICAgICAgICAgICAgYyA9IGxhKDEpOwotCi0gICAgICAgICAgICBST09UX1NXSVRDSDogc3dpdGNoKCBjICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIENoYXJTdHJlYW0uRU9TOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgTUFJTl9MT09QOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkRU9MKCBzZWdtZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVTQ0FQRV9TV0lUQ0g6IHN3aXRjaCggbGEoMikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEVTQ0FQRV9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEVTQ0FQRV9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBsYSgyKSA9PSAneycgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggc2VnbWVudC5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZWxpbWl0aW5nKCBmYWxzZSApOyAgLy8gZW5zdXJlcyAkeyIuLi4ifSB3b3JrcwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuR1NUUklOR19FWFBSRVNTSU9OX1NUQVJUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FeHByZXNzaW9uID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjaGlsZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IEdyb292eUV4cHJlc3Npb25MZXhlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKCBjaGlsZCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTUFJTl9MT09QOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1BSU5fTE9PUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgJ30nOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGluRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5HU1RSSU5HX0VYUFJFU1NJT05fRU5EICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluRXhwcmVzc2lvbiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNQUlOX0xPT1A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmFwcGVuZCggY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmFwcGVuZCggY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHRva2VuICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICIiICsgdGhpcyArICJyZXR1cm5pbmcgIiArIHRva2VuICk7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICIiICsgdGhpcyArICJyZXR1cm5pbmcgc3RyaW5nIG9mICIgKyBzZWdtZW50ICk7Ci0gICAgICAgICAgICByZXR1cm4gVG9rZW4ubmV3U3RyaW5nKCBzZWdtZW50LnRvU3RyaW5nKCksIGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydENvbHVtbigpICk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBERUxFR0FUSU9OCi0KLQotICAgLyoqCi0gICAgKiAgQ29vcmRpbmF0ZXMgd2l0aCBvdXIgc291cmNlIGFib3V0IGRlbGltaXRpbmcuICBXaGVuCi0gICAgKiAgZW50ZXJpbmcgb3IgcHJvY2Vzc2luZyBzdWItZXhwcmVzc2lvbnMsIHNvdXJjZSBkZWxpbWl0aW5nCi0gICAgKiAgc2hvdWxkIGJlIG9mZi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc291cmNlRGVsaW1pdGluZyggYm9vbGVhbiBkZWxpbWl0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBzb3VyY2UgaW5zdGFuY2VvZiBEZWxpbWl0ZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKERlbGltaXRlcilzb3VyY2UpLmRlbGltaXQoIGRlbGltaXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIERlbGVnYXRlcyBvdXIgZHV0aWVzIHRvIGFub3RoZXIgTGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlbGVnYXRlKCBMZXhlciB0byApCi0gICAgewotICAgICAgICB0aGlzLmRlbGVnYXRlID0gdG87Ci0gICAgICAgIHNvdXJjZURlbGltaXRpbmcoIGZhbHNlICk7Ci0gICAgICAgIHRvLnNldFNvdXJjZSggdGhpcyApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIG91ciBkdXRpZXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHVuZGVsZWdhdGUoKQotICAgIHsKLSAgICAgICAgaWYoIGRlbGVnYXRlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS51bnNldFNvdXJjZSggKTsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgICAgIHNvdXJjZURlbGltaXRpbmcoIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFNldHMgdGhlIHNvdXJjZSBsZXhlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlKCBMZXhlciBzb3VyY2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0U291cmNlKCBzb3VyY2UgKTsKLQotICAgICAgICBzZW50U3RhcnRUb2tlbiA9IGZhbHNlOwotICAgICAgICBzZW50RW5kVG9rZW4gICA9IGZhbHNlOwotCi0gICAgICAgIGZ1bGxUZXh0U3RhcnRMaW5lICAgPSBnZXRTdGFydExpbmUoKTsKLSAgICAgICAgZnVsbFRleHRTdGFydENvbHVtbiA9IGdldFN0YXJ0Q29sdW1uKCk7Ci0gICAgICAgIGZ1bGxUZXh0ICAgICAgICAgICAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaW5FeHByZXNzaW9uID0gZmFsc2U7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgVW5zZXRzIHRoZSBzb3VyY2UgbGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHVuc2V0U291cmNlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnVuc2V0U291cmNlKCk7Ci0KLSAgICAgICAgc2VudFN0YXJ0VG9rZW4gPSBmYWxzZTsKLSAgICAgICAgc2VudEVuZFRva2VuICAgPSBmYWxzZTsKLSAgICAgICAgZnVsbFRleHQgICAgICAgPSBudWxsOwotICAgICAgICBpbkV4cHJlc3Npb24gICA9IGZhbHNlOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTVFJFQU0gUk9VVElORVMKLQotCi0gICAvKioKLSAgICAqICBFYXRzIGEgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgY29uc3VtZSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2hhciBjID0gc3VwZXIuY29uc3VtZSgpOwotCi0gICAgICAgIGlmKCBjICE9IENoYXJTdHJlYW0uRU9TICkKLSAgICAgICAgewotICAgICAgICAgICAgZnVsbFRleHQuYXBwZW5kKGMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9Hcm9vdnlFeHByZXNzaW9uTGV4ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvR3Jvb3Z5RXhwcmVzc2lvbkxleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWM1YTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9Hcm9vdnlFeHByZXNzaW9uTGV4ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVhZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKLQotLyoqCi0gKiAgTGV4ZXMgR3Jvb3Z5LCBjb3VudGluZyBicmFjZXMuICBDb25zaWRlcnMgaXRzZWxmIGF0IGVuZCBvZiBzdHJlYW0KLSAqICB3aGVuIHRoZSB9IGNvdW50IGV4Y2VlZHMgdGhlIHsgY291bnQuCi0gKgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBHcm9vdnlFeHByZXNzaW9uTGV4ZXIgZXh0ZW5kcyBHcm9vdnlMZXhlckJhc2UgaW1wbGVtZW50cyBEZWxpbWl0ZXIKLXsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGRlbGltaXRlZCA9IHRydWU7ICAgLy8gV2hlbiB0cnVlLCB0aGUgbGV4ZXIgY2FuIGRvIGl0cyBkZWxpbWl0aW5nCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoZWQgID0gZmFsc2U7ICAvLyBTZXQgd2hlbiB3ZSByZWFjaCB0aGUgZGVsaW1pdGVyCi0gICAgcHJvdGVjdGVkIGludCAgICAgYmFsYW5jZSAgID0gMDsgICAgICAvLyBUaGUgY3VycmVudCBudW1iZXIgb2YgdW5tYXRjaGVkIG9wZW4tYnJhY2VzCi0KLQotICAgLyoqCi0gICAgKiAgRmluZHMgYW5kIHJldHVybnMgKGFuZCBjb25zdW1lcykgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgKiAgUmV0dXJucyBudWxsIHdoZW4gb3V0IG9mIHRva2Vucy4gIFdlIGxldCB0aGUgR3Jvb3Z5TGV4ZXJCYXNlIHZlcnNpb24gZGVhbAotICAgICogIHdpdGggZGVsZWdhdGlvbiBzdHVmZi4KLSAgICAqLwotCi0gICAgcHVibGljIFRva2VuIG5leHRUb2tlbigpIHRocm93cyBSZWFkRXhjZXB0aW9uLCBMZXhlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIGZpbmlzaGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gREVMSU1JVEVSIFJPVVRJTkVTCi0KLQotICAgLyoqCi0gICAgKiAgVHVybnMgZGVsaW1pdGluZyBvbiBvciBvZmYuICBUaGlzIHNob3VsZCBhZmZlY3QgPGNvZGU+bGEoKTwvY29kZT4KLSAgICAqICBhbmQgPGNvZGU+Y29uc3VtZSgpPC9jb2RlPi4gIEhvd2V2ZXIsIG9uY2UgdGhlIGRlbGltaXRlciBoYXMgYmVlbgotICAgICogIHJlYWNoZWQsIHRoaXMgcm91dGluZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlbGltaXQoIGJvb2xlYW4gZGVsaW1pdGVkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVsaW1pdGVkID0gZGVsaW1pdGVkOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGV4ZXIgaXMgYXBwbHlpbmcgaXRzIGRlbGltaXRlciBwb2xpY3kuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsaW1pdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGltaXRlZDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGxleGVyIHN0cmVhbSBpcyBkcnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmlzaGVkOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJlc3RhcnRzIHRoZSBsZXhlciBzdHJlYW0gYWZ0ZXIgYSA8Y29kZT5maW5pc2goKTwvY29kZT4KLSAgICAqICBhbmQgc29tZSBpbnRldmVuaW5nIGFjdCAobGlrZSBhIG5ldyBzb3VyY2UpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0YXJ0KCkKLSAgICB7Ci0gICAgICAgIGZpbmlzaGVkID0gZmFsc2U7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgU3RvcHMgdGhlIGxleGVyIHN0cmVhbS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoKCkKLSAgICB7Ci0gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gREVMRUdBVElPTgotCi0KLSAgIC8qKgotICAgICogIERlbGVnYXRlcyBvdXIgZHV0aWVzIHRvIGFub3RoZXIgTGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlbGVnYXRlKCBMZXhlciB0byApCi0gICAgewotICAgICAgICB0aGlzLmRlbGVnYXRlID0gdG87Ci0gICAgICAgIGRlbGltaXQoIGZhbHNlICk7Ci0gICAgICAgIHRvLnNldFNvdXJjZSggdGhpcyApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIG91ciBkdXRpZXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHVuZGVsZWdhdGUoKQotICAgIHsKLSAgICAgICAgaWYoIGRlbGVnYXRlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS51bnNldFNvdXJjZSggKTsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgICAgIGRlbGltaXQoIHRydWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gU1RSRUFNIFJPVVRJTkVTCi0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBuZXh0IDxjb2RlPms8L2NvZGU+dGggY2hhcmFjdGVyLCB3aXRob3V0IGNvbnN1bWluZyBhbnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGxhKGludCBrKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBkZWxpbWl0ZWQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9ICcgJzsKLSAgICAgICAgICAgICAgICBpbnQgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBrICYmIGJhbGFuY2UgPj0gMDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBzb3VyY2UubGEoayk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggYyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBiYWxhbmNlID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtLkVPUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmxhKGspOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2hhclN0cmVhbS5FT1M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBFYXRzIGEgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgY29uc3VtZSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGRlbGltaXRlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gc291cmNlLmxhKDEpOwotICAgICAgICAgICAgICAgIHN3aXRjaCggYyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBiYWxhbmNlID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5jb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmNvbnN1bWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDaGFyU3RyZWFtLkVPUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvR3Jvb3Z5TGV4ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvR3Jvb3Z5TGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0MTNhMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0dyb292eUxleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKLQotCi0vKioKLSAqICBJZGVudGlmaWVzIGFuZCByZXR1cm5zIHRva2VucyBmcm9tIGEgc291cmNlIHRleHQuICA8Y29kZT5uZXh0VG9rZW4oKTwvY29kZT4KLSAqICBpcyB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludC4gIFRoaXMgaXMgdGhlIHByaW1hcnkgbGV4ZXIgZm9yIHRoZSBHcm9vdnkgbGFuZ3VhZ2UuCi0gKiAgSXQgY2FuIGRlbGVnYXRlIG9wZXJhdGlvbnMsIGJ1dCB3aWxsIG5vdCBhY2NlcHQgYmVpbmcgZGVsZWdhdGVkIHRvLgotICoKLSAqICBAYXV0aG9yIEJvYiBNY3doaXJ0ZXIKLSAqICBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiAgQGF1dGhvciBKb2huIFdpbHNvbgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBHcm9vdnlMZXhlciBleHRlbmRzIEdyb292eUxleGVyQmFzZQotewotCi0gICAgcHJpdmF0ZSBDaGFyU3RyZWFtIGNoYXJTdHJlYW07ICAgICAgICAgICAvLyB0aGUgc291cmNlIG9mIGRhdGEgZm9yIHRoZSBsZXhlcgotICAgIHByb3RlY3RlZCBpbnQgbGluZTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgc291cmNlCi0gICAgcHJvdGVjdGVkIGludCBjb2x1bW47ICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBjb2x1bW4gaW4gdGhlIHNvdXJjZQotCi0KLQotICAgLyoqCi0gICAgKiAgSW5pdGlhbGl6ZXMgdGhlIDxjb2RlPkxleGVyPC9jb2RlPiBmcm9tIGFuIG9wZW5lZCA8Y29kZT5DaGFyU3RyZWFtPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIEdyb292eUxleGVyKENoYXJTdHJlYW0gY2hhclN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2hhclN0cmVhbSA9IGNoYXJTdHJlYW07Ci0gICAgICAgIHRoaXMubGluZSA9IDE7Ci0gICAgICAgIHRoaXMuY29sdW1uID0gMTsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgdW5kZXJseWluZyA8Y29kZT5DaGFyU3RyZWFtPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIENoYXJTdHJlYW0gZ2V0Q2hhclN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jaGFyU3RyZWFtOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJlZnVzZXMgdG8gc2V0IGEgc291cmNlLgotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoIExleGVyIHNvdXJjZSApCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJ5b3UgY2FuJ3Qgc2V0IGEgc291cmNlIG9uIHRoZSBHcm9vdnlMZXhlciIgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTaW1pbGFybHkgcmVmdXNlcyB0byBjbGVhciBhIHNvdXJjZS4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdW5zZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAieW91IGNhbid0IHVuc2V0IGEgc291cmNlIG9uIHRoZSBHcm9vdnlMZXhlciIgKTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gU1RSRUFNIFBST0NFU1NJTkcKLQotICAgIHByaXZhdGUgZmluYWwgY2hhcltdIGJ1ZiAgICAgICA9IG5ldyBjaGFyWzVdOyAgICAgICAgICAvLyA/PwotICAgIHByaXZhdGUgZmluYWwgaW50W10gIGNoYXJXaWR0aCA9IG5ldyBpbnRbYnVmLmxlbmd0aF07ICAvLyA/PwotCi0gICAgcHJpdmF0ZSBpbnQgY3VyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID8/Ci0gICAgcHJpdmF0ZSBpbnQgY2hhcnNJbkJ1ZmZlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vID8/Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVvc1JlYWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgIC8vID8/Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVzY2FwZUxvb2thaGVhZCA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vID8/Ci0gICAgcHJpdmF0ZSBjaGFyIGVzY2FwZUxvb2thaGVhZENoYXI7ICAgICAgICAgICAgICAgICAgICAgIC8vID8/Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYm91bmRhcnkgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRydWUgd2hlbiB0aGUgbGV4ZXIgaXMgb24gYSBsaW5lIGJvdW5kYXJ5Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICAgICovCi0KLSAgICBwdWJsaWMgaW50IGdldExpbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aGluIHRoYXQgbGluZS4KLSAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRDb2x1bW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBuZXh0IDxjb2RlPms8L2NvZGU+dGggY2hhcmFjdGVyLCB3aXRob3V0IGNvbnN1bWluZyBhbnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGxhKGludCBrKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChrID4gdGhpcy5jaGFyc0luQnVmZmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggayA+IHRoaXMuYnVmLmxlbmd0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiQ291bGQgbm90IGxvb2sgYWhlYWQgZm9yIGNoYXJhY3RlcjogIiArIGsgKyAiIGR1ZSB0byBidWZmZXIgZXhoYXVzdGlvbiIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gdGhpcy5jaGFyc0luQnVmZmVyOyBpKyssIHRoaXMuY3VyKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0aGlzLmJ1ZltpXSA9IHRoaXMuYnVmW3RoaXMuY3VyXTsKLSAgICAgICAgICAgICAgIHRoaXMuY2hhcldpZHRoW2ldID0gdGhpcy5jaGFyV2lkdGhbdGhpcy5jdXJdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWxsQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5idWZbdGhpcy5jdXIgKyBrIC0gMV07Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgRWF0cyBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICBXZSBkb24ndAotICAgICogIHN1cHBvcnQgc291cmNlcyBoZXJlLCBhcyB3ZSBvd24gdGhlIENoYXJTdHJlYW0gb24gd2hpY2gKLSAgICAqICB3ZSBhcmUgd29ya2luZy4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgY29uc3VtZSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuY2hhcnNJbkJ1ZmZlciA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxsQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENvbnN1bWUgdGhlIG5leHQgY2hhcmFjdGVyCi0KLSAgICAgICAgdGhpcy5jaGFyc0luQnVmZmVyLS07Ci0KLSAgICAgICAgaW50ICB3aWR0aCAgID0gdGhpcy5jaGFyV2lkdGhbdGhpcy5jdXJdOwotICAgICAgICBjaGFyIGMgICAgICAgPSB0aGlzLmJ1Zlt0aGlzLmN1cisrXTsKLSAgICAgICAgdGhpcy5jb2x1bW4gKz0gd2lkdGg7Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBNYXJrIGxpbmUgYm91bmRhcmllcyBhcyBuZWNlc3NhcnkuICBPbmx5IHJlbGV2YW50Ci0gICAgICAgIC8vIG5vbi1tYW51ZmFjdHVyZWQgdG9rZW5zIG5lZWQgYXBwbHkuCi0KLSAgICAgICAgaWYoIGJvdW5kYXJ5IHx8IChjID09ICdcbicgJiYgd2lkdGggPT0gMSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib3VuZGFyeSA9IGZhbHNlOwotICAgICAgICAgICAgbGluZSsrOwotICAgICAgICAgICAgY29sdW1uID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBjID09ICdccicgJiYgd2lkdGggPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBsYSgxKSAhPSAnXG4nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaW5lKys7Ci0gICAgICAgICAgICAgICAgY29sdW1uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaXQgaXMgJ1xuJyBhbmQgKi8gaWYoIHRoaXMuY2hhcldpZHRoW3RoaXMuY3VyXSA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBjOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEZpbGxzIHRoZSBsb29rYWhlYWQgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS4KLSAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgTGV4ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRoaXMuY3VyID0gMDsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5lb3NSZWFkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLmNoYXJzSW5CdWZmZXJdID0gQ2hhclN0cmVhbS5FT1M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gdGhpcy5lc2NhcGVMb29rYWhlYWQgPyB0aGlzLmVzY2FwZUxvb2thaGVhZENoYXIgOiBjaGFyU3RyZWFtLmNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlTG9va2FoZWFkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGFyV2lkdGhbdGhpcy5jaGFyc0luQnVmZmVyXSA9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZihjID09IENoYXJTdHJlYW0uRU9TKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5lb3NSZWFkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYyA9PSAnXFwnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBjaGFyU3RyZWFtLmNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggYyA9PSAndScgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcldpZHRoW3RoaXMuY2hhcnNJbkJ1ZmZlcl0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gY2hhclN0cmVhbS5jb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYyA9PSAndScpOyAvLyB0aGUgc3BlYyBhbGxvd3MgYW55IG51bWJlciBvZiB1IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIFwJCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcikgSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGNoYXJbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyU3RyZWFtLmNvbnN1bWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclN0cmVhbS5jb25zdW1lKCkgICAgfSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyV2lkdGhbdGhpcy5jaGFyc0luQnVmZmVyXSArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGFydExpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhcnRDb2x1bW4oKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBjaGFyW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGVMb29rYWhlYWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGVMb29rYWhlYWRDaGFyID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXFwnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5jaGFyc0luQnVmZmVyXSA9IGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCsrdGhpcy5jaGFyc0luQnVmZmVyICE9IHRoaXMuYnVmLmxlbmd0aCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0dyb292eUxleGVyQmFzZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9Hcm9vdnlMZXhlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhY2I4Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0dyb292eUxleGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4Lk51bWJlcnM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0KLS8qKgotICogIFRoZSBjb3JlIGNvZGUgdXNlZCBpbiBsZXhpbmcgR3Jvb3Z5LgotICoKLSAqICBAYXV0aG9yIEJvYiBNY3doaXJ0ZXIKLSAqICBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiAgQGF1dGhvciBKb2huIFdpbHNvbgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBHcm9vdnlMZXhlckJhc2UgZXh0ZW5kcyBMZXhlckJhc2UKLXsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdMZXhlciAgc3RyaW5nTGV4ZXIgID0gbmV3IFN0cmluZ0xleGVyKCk7ICAgLy8gc3VwcG9ydCBsZXhlciBmb3IgcHJvY2Vzc2luZyBzdHJpbmdzCi0gICAgcHJvdGVjdGVkIEdTdHJpbmdMZXhlciBnc3RyaW5nTGV4ZXIgPSBuZXcgR1N0cmluZ0xleGVyKCk7ICAvLyBzdXBwb3J0IGxleGVyIGZvciBwcm9jZXNzaW5nIEdTdHJpbmdzCi0KLQotICAgLyoqCi0gICAgKiAgRmluZHMgYW5kIHJldHVybnMgKGFuZCBjb25zdW1lcykgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgKiAgUmV0dXJucyBudWxsIHdoZW4gb3V0IG9mIHRva2Vucy4KLSAgICAqLwotCi0gICAgcHVibGljIFRva2VuIG5leHRUb2tlbigpIHRocm93cyBSZWFkRXhjZXB0aW9uLCBMZXhlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiZW50ZXJpbmcgR3Jvb3Z5TGV4ZXJCYXNlLm5leHRUb2tlbigpIG9uICIgKyB0aGlzICk7Ci0KLSAgICAgICAgVG9rZW4gdG9rZW4gPSBudWxsOwotICAgICAgICBPVVRFUl9MT09QIDogd2hpbGUgKHRva2VuID09IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEdldCBmcm9tIHRoZSBkZWxlZ2F0ZSwgaWYgYXZhaWxhYmxlCi0KLSAgICAgICAgICAgIGlmKCBkZWxlZ2F0ZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlbiA9IGRlbGVnYXRlLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAgICAgaWYoIHRva2VuID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdW5kZWxlZ2F0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhayBPVVRFUl9MT09QOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkbyBpdCB0aGUgaGFyZCB3YXkuCi0KLSAgICAgICAgICAgIGNoYXIgYyA9IGxhKCk7Ci0KLSAgICAgICAgICAgIFJPT1RfU1dJVENIIDogc3dpdGNoIChjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKENoYXJTdHJlYW0uRU9TKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhayBPVVRFUl9MT09QOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnICcpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnXHQnKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCdccicpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnXG4nKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVFT0woKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCd7JykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5MRUZUX0NVUkxZX0JSQUNFICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnfScpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuUklHSFRfQ1VSTFlfQlJBQ0UgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCdbJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnXScpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuUklHSFRfU1FVQVJFX0JSQUNLRVQgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCcoJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnKScpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuUklHSFRfUEFSRU5USEVTSVMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCcjJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5ORVdMSU5FLCAtMSApOwotCi0gICAgICAgICAgICAgICAgICAgIENPTlNVTUVfTE9PUCA6IHdoaWxlKCB0cnVlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjID0gbGEoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnXHInKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJ1xuJykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVPTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBDT05TVU1FX0xPT1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhclN0cmVhbS5FT1MgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgQ09OU1VNRV9MT09QOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCcvJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYyA9IGxhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTVVMVElDSEFSX1NXSVRDSCA6IHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz0nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5ESVZJREVfRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJy8nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5ORVdMSU5FLCAtMiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1VNRV9MT09QIDogd2hpbGUgKHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSBsYSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnXHInKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnXG4nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVPTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIENPTlNVTUVfTE9PUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhclN0cmVhbS5FT1MgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIENPTlNVTUVfTE9PUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJyonKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1VNRV9MT09QIDogd2hpbGUgKHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVU1FX1NXSVRDSCA6IHN3aXRjaCAoYyA9IGxhKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCcqJykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGEoKSA9PSAnLycpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIENPTlNVTUVfTE9PUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgQ09OU1VNRV9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnXHInKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnXG4nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVPTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIENPTlNVTUVfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyU3RyZWFtLkVPUyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgQ09OU1VNRV9MT09QOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLkRJVklERSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCclJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYyA9IGxhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTVVMVElDSEFSX1NXSVRDSCA6IHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz0nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5NT0RfRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk1PRCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCdcXCcpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1VTFRJQ0hBUl9TV0lUQ0ggOiBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuSU5URElWX0VRVUFMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5JTlRESVYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnficpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5SRUdFWF9QQVRURVJOICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnIScpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1VTFRJQ0hBUl9TV0lUQ0ggOiBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbGEoKSA9PSAnPScgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9OT1RfSURFTlRJQ0FMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5DT01QQVJFX05PVF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk5PVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYyA9IGxhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTVVMVElDSEFSX1NXSVRDSCA6IHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz0nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPScgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9JREVOVElDQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk1BVENIX1JFR0VYICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLkNPTVBBUkVfRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnficgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuRklORF9SRUdFWCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnJicpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1VTFRJQ0hBUl9TV0lUQ0ggOiBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCcmJykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsYSgpID09ICc9JyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5MT0dJQ0FMX0FORF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTE9HSUNBTF9BTkQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz0nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5CSVRXSVNFX0FORF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQklUV0lTRV9BTkQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnfCcpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICBNVUxUSUNIQVJfU1dJVENIIDogc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnfCcpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbGEoKSA9PSAnPScgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTE9HSUNBTF9PUl9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTE9HSUNBTF9PUiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnPScpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLQkJCSAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQklUV0lTRV9PUl9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuUElQRSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCcrJykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYyA9IGxhKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTVVMVElDSEFSX1NXSVRDSCA6IHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJysnKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5QTFVTX1BMVVMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz0nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5QTFVTX0VRVUFMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5QTFVTICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAoJy0nKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICBNVUxUSUNIQVJfU1dJVENIIDogc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnLScpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk1JTlVTX01JTlVTICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTUlOVVNfRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz4nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5OQVZJR0FURSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTUlOVVMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnKicpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1VTFRJQ0hBUl9TV0lUQ0ggOiBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTVVMVElQTFlfRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJyonKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjID09ICc9JyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5QT1dFUl9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsJCi0JCQkgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5QT1dFUiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk1VTFRJUExZICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAoJ14nKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICBNVUxUSUNIQVJfU1dJVENIIDogc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnPScpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLkJJVFdJU0VfWE9SX0VRVUFMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5CSVRXSVNFX1hPUiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCc6JykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLkNPTE9OICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnLCcpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NTUEgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCc7JykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5TRU1JQ09MT04gKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgKCc/JykgOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5RVUVTVElPTiApOwotICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAoJzwnKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICBNVUxUSUNIQVJfU1dJVENIIDogc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgnPScpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGxhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9UTyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9MRVNTX1RIQU5fRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTVVMVElDSEFSX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc8JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBhICJoZXJlLWRvYyIsIGNyZWF0ZWQgdXNpbmcgPDw8VE9LIC4uLiBcblRPSy4gICBUaGUgdGVybWluYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgZnJvbSB0aGUgPDw8IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGUgbWFya2VyIGlzIHRoZW4gdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSBhIEhlcmVEb2NMZXhlciB3aGljaCBiZWNvbWVzIG91ciBkZWxlZ2F0ZSB1bnRpbCB0aGUgaGVyZWRvYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGZpbmlzaGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzwnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtYXJrZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoYyA9IGxhKCkpICE9ICdcbicgJiYgYyAhPSAnXHInICYmIGMgIT0gQ2hhclN0cmVhbS5FT1MgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRFT0woKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXhlciBjaGlsZCA9IG5ldyBIZXJlRG9jTGV4ZXIoIG1hcmtlci50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKCBjaGlsZCApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdHJpbmdMZXhlci5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kZWxlZ2F0ZSggZ3N0cmluZ0xleGVyICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJz0nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTEVGVF9TSElGVF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuTEVGVF9TSElGVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBST09UX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9MRVNTX1RIQU4gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnPicpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIE1VTFRJQ0hBUl9TV0lUQ0ggOiBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCc9JykgOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9HUkVBVEVSX1RIQU5fRVFVQUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJz4nKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjID09ICc+JyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBsYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnPScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5SSUdIVF9TSElGVF9VTlNJR05FRF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuUklHSFRfU0hJRlRfVU5TSUdORUQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnPScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5SSUdIVF9TSElGVF9FUVVBTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdG9rZW4gPSBzeW1ib2woIFR5cGVzLlJJR0hUX1NISUZUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIE1VTFRJQ0hBUl9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN5bWJvbCggVHlwZXMuQ09NUEFSRV9HUkVBVEVSX1RIQU4gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBNVUxUSUNIQVJfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnXCcnKSA6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGV4ZXIucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGV4ZXIuYWxsb3dHU3RyaW5ncyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlKCBzdHJpbmdMZXhlciApOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnIicpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLQotICAgICAgICAgICAgICAgICAgICBzdHJpbmdMZXhlci5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmdMZXhlci5hbGxvd0dTdHJpbmdzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSggc3RyaW5nTGV4ZXIgKTsKLQotICAgICAgICAgICAgICAgICAgICBnc3RyaW5nTGV4ZXIucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGV4ZXIuZGVsZWdhdGUoIGdzdHJpbmdMZXhlciApOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICgnMCcpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnMScpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnMicpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnMycpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnNCcpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnNScpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnNicpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnNycpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnOCcpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnOScpIDoKLSAgICAgICAgICAgICAgICBjYXNlICgnLicpIDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhICcuJyBhbmQgbm90IGZvbGxvd2VkIGJ5IGEgZGlnaXQsCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgYW4gb3BlcmF0b3IuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gJy4nICYmICFOdW1iZXJzLmlzRGlnaXQobGEoMikpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxhKCkgPT0gJy4nICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxhKCkgPT0gJy4nICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLkRPVF9ET1RfRE9UICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5ET1RfRE9UICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3ltYm9sKCBUeXBlcy5ET1QgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSBwcm9jZXNzaW5nIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGRlY2ltYWwpLgotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBudW1lcmljTGl0ZXJhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiAgICAgIGlzRGVjaW1hbCAgICAgID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBzdGFydHMgMCBhbmQgaXNuJ3QgYSBkZWNpbWFsIG51bWJlciwgd2UgZ2l2ZQotICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBoZXhhZGVjaW1hbCBvciBvY3RhbCBub3RhdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICBjaGFyIGMyID0gbGEoMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBjID09ICcwJyAmJiAoYzIgPT0gJ1gnIHx8IGMyID09ICd4JyB8fCBOdW1iZXJzLmlzRGlnaXQoYzIpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNMaXRlcmFsLmFwcGVuZCggY29uc3VtZSgpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoYyA9IGxhKCkpID09ICdYJyB8fCBjID09ICd4JyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0xpdGVyYWwuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTnVtYmVycy5pc0hleERpZ2l0KGxhKCkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBOdW1iZXJzLmlzSGV4RGlnaXQobGEoKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljTGl0ZXJhbC5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQoIGxhKCksIG51bWVyaWNMaXRlcmFsLmxlbmd0aCgpLCAiZXhwZWN0ZWQgaGV4YWRlY2ltYWwgZGlnaXQiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBOdW1iZXJzLmlzT2N0YWxEaWdpdChsYSgpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljTGl0ZXJhbC5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBOdW1iZXJzLmlzRGlnaXQobGEoKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZCggbGEoKSwgbnVtZXJpY0xpdGVyYWwubGVuZ3RoKCksICJleHBlY3RlZCBvY3RhbCBkaWdpdCIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBpbiBiYXNlIDEwLCBpbnRlZ2VyIG9yIGRlY2ltYWwuCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggTnVtYmVycy5pc0RpZ2l0KGxhKCkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljTGl0ZXJhbC5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0LCBjaGVjayBmb3IgYSBkZWNpbWFsIHBvaW50Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsYSgpID09ICcuJyAmJiBOdW1iZXJzLmlzRGlnaXQobGEoMikpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RlY2ltYWwgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0xpdGVyYWwuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggTnVtYmVycy5pc0RpZ2l0KGxhKCkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNMaXRlcmFsLmFwcGVuZCggY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYW4gZXhwb25lbnQKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoYyA9IGxhKCkpID09ICdlJyB8fCBjID09ICdFJyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljTGl0ZXJhbC5hcHBlbmQoIGNvbnN1bWUoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYSgpID09ICcrJyB8fCBsYSgpID09ICctJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0xpdGVyYWwuYXBwZW5kKGNvbnN1bWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTnVtYmVycy5pc0RpZ2l0KGxhKCkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIE51bWJlcnMuaXNEaWdpdChsYSgpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0xpdGVyYWwuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQoIGxhKCksIG51bWVyaWNMaXRlcmFsLmxlbmd0aCgpLCAiZXhwZWN0ZWQgZXhwb25lbnQiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgdHlwZSBzdWZmaXgsIGluY2x1ZGUgaXQuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE51bWJlcnMuaXNOdW1lcmljVHlwZVNwZWNpZmllcihsYSgpLCBpc0RlY2ltYWwpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0xpdGVyYWwuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGdvb2QgZXJyb3IgcmVwb3J0aW5nLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm90aGluZyBpbnZhbGlkIG5leHQuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjID0gbGEoKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkKCBjLCBudW1lcmljTGl0ZXJhbC5sZW5ndGgoKSwgImV4cGVjdGVkIGVuZCBvZiBudW1lcmljIGxpdGVyYWwiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGNyZWF0ZSB0aGUgdG9rZW4uCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGlzRGVjaW1hbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gVG9rZW4ubmV3RGVjaW1hbCggbnVtZXJpY0xpdGVyYWwudG9TdHJpbmcoKSwgZ2V0U3RhcnRMaW5lKCksIGdldFN0YXJ0Q29sdW1uKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gVG9rZW4ubmV3SW50ZWdlciggbnVtZXJpY0xpdGVyYWwudG9TdHJpbmcoKSwgZ2V0U3RhcnRMaW5lKCksIGdldFN0YXJ0Q29sdW1uKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFJPT1RfU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBpZGVudGlmaWVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJREVOVElGSUVSX0xPT1AgOiB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbGEoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLmFwcGVuZChjb25zdW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBJREVOVElGSUVSX0xPT1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGlkZW50aWZpZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gVG9rZW4ubmV3S2V5d29yZCggdGV4dCwgZ2V0U3RhcnRMaW5lKCksIGdldFN0YXJ0Q29sdW1uKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBUb2tlbi5uZXdJZGVudGlmaWVyKCB0ZXh0LCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRDb2x1bW4oKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZCggYywgMSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgUk9PVF9TV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiIiArIHRoaXMgKyAiLm5leHRUb2tlbigpIHJldHVybmluZyBbIiArIHRva2VuICsgIl0iICk7Ci0KLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9IZXJlRG9jTGV4ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvSGVyZURvY0xleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjkxYzUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9IZXJlRG9jTGV4ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVhZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAgQSBMZXhlciBmb3IgcHJvY2Vzc2luZyBoZXJlIGRvY3MuICBJdCByZWFkcyBhIGxpbmUgYXQgYSB0aW1lIGZyb20KLSAqICB0aGUgdW5kZXJseWluZyBzdHJlYW0gKGxlYXZpbmcgdGhlIEVPTCBmb3IgdGhlIG5leHQgcmVhZCksIHRoZW4KLSAqICBvZmZlcnMgdGhhdCBkYXRhIGZvciB1c2Vycy4KLSAqCi0gKiAgQGF1dGhvciBDaHJpcyBQb2lyaWVyCi0gKi8KLQotcHVibGljIGNsYXNzIEhlcmVEb2NMZXhlciBleHRlbmRzIFRleHRMZXhlckJhc2UKLXsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgIG1hcmtlciAgID0gbnVsbDsgICAvLyBUaGUgbWFya2VyIHRvIHdhdGNoIGZvcgotICAgIHByb3RlY3RlZCBib29sZWFuIG9ubWFyZ2luID0gdHJ1ZTsgICAvLyBJZiBmYWxzZSwgdGhlIG1hcmtlciBjYW4gYmUgaW5kZW50ZWQKLSAgICBwcm90ZWN0ZWQgU3RyaW5nICBkYXRhICAgICA9ICIiOyAgICAgLy8gVGhlIGN1cnJlbnQgZGF0YQotICAgIHByb3RlY3RlZCBpbnQgICAgIGNvbnN1bWVkID0gLTE7ICAgICAvLyBUaGUgbGFzdCBpbmRleCBjb25zdW1lZAotICAgIHByb3RlY3RlZCBib29sZWFuIGxhc3QgICAgID0gZmFsc2U7ICAvLyBTZXQgYWZ0ZXIgdGhlIGxhc3QgbGluZSBpcyByZWFkCi0KLQotICAgLyoqCi0gICAgKiAgSW5pdGlhbGl6ZXMgdGhlIGxleGVyIHRvIHJlYWQgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZSBtYXJrZXIKLSAgICAqICBvbiBhIGxpbmUgYnkgaXRzZWxmLgotICAgICovCi0KLSAgICBwdWJsaWMgSGVyZURvY0xleGVyKCBTdHJpbmcgbWFya2VyICkKLSAgICB7Ci0gICAgICAgIGlmKCBtYXJrZXIuc3RhcnRzV2l0aCgiLSIpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tYXJrZXIgPSBtYXJrZXIuc3Vic3RyaW5nKCAxLCBtYXJrZXIubGVuZ3RoKCkgKTsKLSAgICAgICAgICAgIHRoaXMub25tYXJnaW4gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyOwotICAgICAgICAgICAgdGhpcy5vbm1hcmdpbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTZXRzIHRoZSBzb3VyY2UgbGV4ZXIgYW5kIHNldHMgdGhlIGxleGVyIHJ1bm5pbmcuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZSggTGV4ZXIgc291cmNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFNvdXJjZSggc291cmNlICk7Ci0KLSAgICAgICAgZGF0YSAgICAgPSAiIjsKLSAgICAgICAgY29uc3VtZWQgPSAtMTsKLSAgICAgICAgbGFzdCAgICAgPSBmYWxzZTsKLQotICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgIGRlbGltaXQoIHRydWUgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBVbnNldHMgdGhlIHNvdXJjZSBsZXhlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdW5zZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIHN1cGVyLnVuc2V0U291cmNlKCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgU2V0cyBkZWxpbWl0aW5nIG9uLiAgVGhlIGZpcnN0IHRoaW5nIHdlIHRvIGlzIGNoZWNrIGZvciBhbmQgZWF0IG91cgotICAgICogIGRlbGltaXRlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZGVsaW1pdCggYm9vbGVhbiBkZWxpbWl0ICkKLSAgICB7Ci0gICAgICAgIHN1cGVyLmRlbGltaXQoIGRlbGltaXQgKTsKLQotICAgICAgICBpZiggZGVsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhZmluaXNoZWQgJiYgbGEoMSkgPT0gQ2hhclN0cmVhbS5FT1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIG5leHQgPGNvZGU+azwvY29kZT50aCBjaGFyYWN0ZXIsIHdpdGhvdXQgY29uc3VtaW5nIGFueS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgbGEoaW50IGspIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBpZiggIWZpbmlzaGVkICYmIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbnN1bWVkICsgayA+PSBkYXRhLmxlbmd0aCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZpbGwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGNvbnN1bWVkICsgayA8IGRhdGEubGVuZ3RoKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmNoYXJBdCggY29uc3VtZWQgKyBrICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ2hhclN0cmVhbS5FT1M7Ci0gICAgfQotCi0KLQotCi0gICAvKioKLSAgICAqICBFYXRzIGEgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFNlYXJjaGVzIGZvciB0aGUgZGVsaW1pdGVyIGlmCi0gICAgKiAgZmlsdGVyZWQuICBOb3RlIHRoYXQgdHVybmluZyBkZWxpbWl0aW5nIG9uIGFsc28gY2hlY2tzIGlmIHdlIGFyZSBhdCB0aGUKLSAgICAqICBkZWxpbWl0ZXIsIHNvIGlmIHdlIGFyZW4ndCBmaW5pc2hlZCwgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGNvbnN1bWUuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGNvbnN1bWUoKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCAhZmluaXNoZWQgJiYgc291cmNlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBkYXRhLmNoYXJBdCggKytjb25zdW1lZCApOwotICAgICAgICAgICAgaWYoIGRlbGltaXRlZCAmJiBsYSgxKSA9PSBDaGFyU3RyZWFtLkVPUyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJlYWRzIHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBJZiBkZWxpbWl0ZWQsIGNoZWNrcyBmb3IKLSAgICAqICB0aGUgbWFya2VyLiAgV2UgZG9uJ3QgdXBkYXRlIGZpbmlzaGVkIGhlcmUsIHRob3VnaCwgYXMgdGhhdCB3b3VsZCBwcmV2ZW50Ci0gICAgKiAgYW55IGJ1ZmZlcmVkIGRhdGEgZnJvbSBiZWluZyByZWFkLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZpbGwoKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCAhZmluaXNoZWQgJiYgc291cmNlICE9IG51bGwgJiYgIWxhc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVhZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlYWQgYW55IHJlc2lkdWFsIGRhdGEgaW50byB0aGUgYnVmZmVyLgotCi0gICAgICAgICAgICBmb3IoIGludCBpID0gY29uc3VtZWQgKyAxOyBpIDwgZGF0YS5sZW5ndGgoKTsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkLmFwcGVuZCggZGF0YS5jaGFyQXQoaSkgKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUmVhZCBsaW5lIGVuZHMgdW50aWwgd2UgaGF2ZSBzb21lIG5vbi1ibGFuayBsaW5lcyB0byByZWFkLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBsaW5lIGVuZHMsIGFzIHRoZQotICAgICAgICAgICAgLy8gZW5kIG9mIG9uZSBsaW5lIGJlbG9uZ3MgdG8gdGhlIG5leHQsIHdoZW4gaXQgY29tZXMgdG8gZGlzY2FyZHMKLSAgICAgICAgICAgIC8vIGR1ZSB0byBtYXJrZXIgaWRlbnRpZmljYXRpb24hCi0KLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciByYXcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICB3aGlsZSggKGMgPSBzb3VyY2UubGEoKSkgPT0gJ1xuJyB8fCBjID09ICdccicgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCByYXcubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWQuYXBwZW5kKCByYXcgKTsKLSAgICAgICAgICAgICAgICAgICAgcmF3LnNldExlbmd0aCggMCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCAhKChMZXhlckJhc2Upc291cmNlKS5yZWFkRU9MKHJhdykgKSAvLyBiYWQgY2FzdCwgYnV0IGZvciBub3cuLi4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uKGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydENvbHVtbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIG5leHQgbGluZSwgY2hlY2tpbmcgZm9yIHRoZSBlbmQgbWFya2VyLCBpZiBkZWxpbWl0ZWQuCi0gICAgICAgICAgICAvLyBXZSBsZWF2ZSB0aGUgRU9MIGZvciB0aGUgbmV4dCByZWFkLi4uCi0KLSAgICAgICAgICAgIGJvb2xlYW4gdXNlID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYoICFpc0RlbGltaXRlZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggKGMgPSBzb3VyY2UubGEoKSkgIT0gJ1xuJyAmJiBjICE9ICdccicgJiYgYyAhPSBDaGFyU3RyZWFtLkVPUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYXcuYXBwZW5kKCBzb3VyY2UuY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWFya2VyIHN0YXJ0ZWQgd2l0aCB0aGUgIi0iIG1vZGlmaWVyLCB3aGl0ZXNwYWNlIGlzCi0gICAgICAgICAgICAgICAgLy8gYWxsb3dlZCBiZWZvcmUgdGhlIG1hcmtlci4gIFRoZSBtYXJrZXIgY2FuIGJlIGZvbGxvd2VkIG9uCi0gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgbGluZSBieSBjb2RlLCBzbyBpZiBpdCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuLCB3ZSBzdG9wIGFmdGVyIHJlYWRpbmcgdGhlIGxhc3QgY2hhcmFjdGVyLgotCi0gICAgICAgICAgICAgICAgaWYoICFvbm1hcmdpbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKGMgPSBzb3VyY2UubGEoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhdy5hcHBlbmQoIHNvdXJjZS5jb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCB0ZXN0aW5nID0gMCwgbGVuZ3RoID0gbWFya2VyLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZSwgbG9zdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHdoaWxlKCAoYyA9IHNvdXJjZS5sYSgpKSAhPSAnXG4nICYmIGMgIT0gJ1xyJyAmJiBjICE9IENoYXJTdHJlYW0uRU9TICYmICFmb3VuZCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggIWxvc3QgJiYgYyA9PSBtYXJrZXIuY2hhckF0KHRlc3RpbmcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRlc3RpbmcgPT0gbGVuZ3RoICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3N0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJhdy5hcHBlbmQoIHNvdXJjZS5jb25zdW1lKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggZm91bmQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlICA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSXQncyBlaXRoZXIgb3VyIGRlbGltaXRlciBvciBhIGxpbmUgb2YgZGF0YS4KLQotICAgICAgICAgICAgaWYoIHVzZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZC5hcHBlbmQoIHJhdyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGRhdGEgPSByZWFkLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjb25zdW1lZCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0lucHV0U3RyZWFtQ2hhclN0cmVhbS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9JbnB1dFN0cmVhbUNoYXJTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZjJkOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0lucHV0U3RyZWFtQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1DaGFyU3RyZWFtCi0gICAgZXh0ZW5kcyBBYnN0cmFjdENoYXJTdHJlYW0KLXsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOwotCi0gICAgcHVibGljIElucHV0U3RyZWFtQ2hhclN0cmVhbShJbnB1dFN0cmVhbSBpbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW4gPSBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW1DaGFyU3RyZWFtKElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIoIGRlc2NyaXB0aW9uICk7Ci0gICAgICAgIHRoaXMuaW4gPSBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyIGNvbnN1bWUoKQotICAgICAgICB0aHJvd3MgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoY2hhcikgZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgIHRocm93IG5ldyBSZWFkRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHRocm93cyBSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlYWRFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5YzZiYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0KLS8qKgotICogIFRoZSBtaW5pbWFsIGludGVyZmFjZSBwcm92aWRlZCBieSBhbGwgTGV4ZXJzLgotICoKLSAqICBAYXV0aG9yIEJvYiBNY3doaXJ0ZXIKLSAqICBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiAgQGF1dGhvciBKb2huIFdpbHNvbgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTGV4ZXIKLXsKLQotCi0gICAvKioKLSAgICAqICBHZXRzIHRoZSBsZXhlciB0aGF0IGlzIGFjdHVhbGx5IGRvaW5nIHRoZSA8Y29kZT5uZXh0VG9rZW4oKTwvY29kZT4KLSAgICAqICB3b3JrLCBpZiBpdCBpc24ndCB1cy4KLSAgICAqLwotCi0gICAgcHVibGljIExleGVyIGdldERlbGVnYXRlKCk7Ci0KLQotCi0gICAvKioKLSAgICAqICBHZXRzIHRoZSBsZXhlciBmcm9tIHdoaWNoIHRoaXMgbGV4ZXIgaXMgb2J0YWluaW5nIGNoYXJhY3RlcnMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBMZXhlciBnZXRTb3VyY2UoKTsKLQotCi0KLSAgIC8qKgotICAgICogIEZpbmRzIGFuZCByZXR1cm5zIChjb25zdW1pbmcpIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotICAgICogIFJldHVybnMgbnVsbCB3aGVuIG91dCBvZiB0b2tlbnMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgTGV4ZXJFeGNlcHRpb247Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gREVMRUdBVElPTgotCi0KLSAgIC8qKgotICAgICogIFJlc2V0cyBhIGxleGVyIGZvciByZXVzZS4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKTsKLQotCi0KLSAgIC8qKgotICAgICogIERlbGVnYXRlcyBvdXIgZHV0aWVzIHRvIGFub3RoZXIgTGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlbGVnYXRlKCBMZXhlciB0byApOwotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0YWtlcyByZXNwb25zaWJpbGl0eSBmb3Igb3VyIGR1dGllcy4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdW5kZWxlZ2F0ZSgpOwotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBkZWxlZ2F0ZWQuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVkKCk7Ci0KLQotCi0gICAvKioKLSAgICAqICBTZXRzIHRoZSBzb3VyY2UgbGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZSggTGV4ZXIgc291cmNlICk7Ci0KLQotCi0gICAvKioKLSAgICAqICBVbnNldHMgdGhlIHNvdXJjZSBsZXhlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdW5zZXRTb3VyY2UoICk7Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgd2UgaGF2ZSBhbiBleHRlcm5hbCBzb3VyY2UuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxseVNvdXJjZWQoKTsKLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTVFJFQU0gUk9VVElORVMKLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICAgICovCi0KLSAgICBwdWJsaWMgaW50IGdldExpbmUoKTsKLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIGN1cnJlbnQgY29sdW1uIG9uIHRoYXQgbGluZS4KLSAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRDb2x1bW4oKTsKLQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIsIHdpdGhvdXQgY29uc3VtaW5nIGl0LgotICAgICovCi0KLSAgICBwdWJsaWMgY2hhciBsYSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbjsKLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIG5leHQgPGNvZGU+azwvY29kZT50aCBjaGFyYWN0ZXIsIHdpdGhvdXQgY29uc3VtaW5nIGFueS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgbGEoaW50IGspIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbjsKLQotCi0KLSAgIC8qKgotICAgICogIEVhdHMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgY29uc3VtZSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbjsKLQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyQmFzZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwOWJjOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7Ci0KLQotLyoqCi0gKiAgQSBiYXNlIGNsYXNzIGZvciBhbGwgb3RoZXIgbGV4ZXJzLgotICoKLSAqICBAYXV0aG9yIEJvYiBNY3doaXJ0ZXIKLSAqICBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiAgQGF1dGhvciBKb2huIFdpbHNvbgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBMZXhlckJhc2UgaW1wbGVtZW50cyBMZXhlcgotewotCi0gICAgcHJvdGVjdGVkIGludCBzdGFydExpbmU7ICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgbGluZSBvZiB0aGUgY3VycmVudCB0b2tlbgotICAgIHByb3RlY3RlZCBpbnQgc3RhcnRDb2x1bW47ICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvbHVtbiBvZiB0aGUgY3VycmVudCB0b2tlbgotCi0gICAgcHJvdGVjdGVkIExleGVyIGRlbGVnYXRlID0gbnVsbDsgICAgICAgICAvLyBhbm90aGVyIGxleGVyIGN1cnJlbnRseSBzYXRpc2Z5aW5nIG91ciByZXF1ZXN0cwotICAgIHByb3RlY3RlZCBMZXhlciBzb3VyY2UgICA9IG51bGw7ICAgICAgICAgLy8gYSBsZXhlciB3ZSBhcmUgb2J0YWluaW5nIGRhdGEgZnJvbQotCi0KLQotICAgLyoqCi0gICAgKiAgSW5pdGlhbGl6ZXMgdGhlIDxjb2RlPkxleGVyQmFzZTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyBMZXhlckJhc2UoICkKLSAgICB7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgR2V0cyB0aGUgbGV4ZXIgdGhhdCBpcyBhY3R1YWxseSBkb2luZyB0aGUgPGNvZGU+bmV4dFRva2VuKCk8L2NvZGU+Ci0gICAgKiAgd29yaywgaWYgaXQgaXNuJ3QgdXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBMZXhlciBnZXREZWxlZ2F0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgR2V0cyB0aGUgbGV4ZXIgZnJvbSB3aGljaCB0aGlzIGxleGVyIGlzIG9idGFpbmluZyBjaGFyYWN0ZXJzLgotICAgICovCi0KLSAgICBwdWJsaWMgTGV4ZXIgZ2V0U291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgRmluZHMgYW5kIHJldHVybnMgKGNvbnN1bWluZykgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgKiAgUmV0dXJucyBudWxsIHdoZW4gb3V0IG9mIHRva2Vucy4gIFRoaXMgaW1wbGVtZW50YXRpb24gY29ycmVjdGx5IGhhbmRsZXMKLSAgICAqICBkZWxlZ2F0aW9uLCBhbmQgc3ViY2xhc3NlcyBpbXBsZW1lbnQgdW5kZWxlZ2F0ZWROZXh0VG9rZW4oKSwgd2hpY2ggd2lsbAotICAgICogIGJlIGNhbGxlZCBieSB0aGlzIHJvdXRpbmUgd2hlbiBhcHByb3ByaWF0ZS4KLSAgICAqLwotCi0gICAgcHVibGljIFRva2VuIG5leHRUb2tlbigpIHRocm93cyBSZWFkRXhjZXB0aW9uLCBMZXhlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgd2UgYXJlIGRlbGVnYXRlZCwgdXNlIGl0IHVudGlsIGl0IHJldHVybnMgbnVsbC4KLQotICAgICAgICBpZiggZGVsZWdhdGUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRva2VuIG5leHQgPSBkZWxlZ2F0ZS5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgaWYoIG5leHQgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5kZWxlZ2F0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBtYXJrKCk7Ci0gICAgICAgIHJldHVybiB1bmRlbGVnYXRlZE5leHRUb2tlbigpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIERvZXMgdW5kZWxlZ2F0ZWQgbmV4dFRva2VuKCkgb3BlcmF0aW9ucy4gIFlvdSBzdXBwbHkgeW91cgotICAgICogIGxleGVyLXNwZWNpZmljIG5leHRUb2tlbigpIGNvZGUgYnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRva2VuIHVuZGVsZWdhdGVkTmV4dFRva2VuKCkgdGhyb3dzIFJlYWRFeGNlcHRpb24sIExleGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gU1BFQ0lBTCBIQU5ETEVSUwotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3MgYW4gZW5kLW9mLWxpbmUgbWFya2VyIGFuZCByZXR1cm5zIGEgTkVXTElORSB0b2tlbi4KLSAgICAqICBSZXR1cm5zIG51bGwgaWYgbm90IGF0IGFuIGVuZC1vZi1saW5lLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gdG9rZW5pemVFT0woKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gbnVsbDsKLQotICAgICAgICBjaGFyIGMgPSBsYSgpOwotICAgICAgICBzd2l0Y2goIGMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSBzeW1ib2woIFR5cGVzLk5FV0xJTkUgKTsKLQotICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXHInICYmIGxhKCkgPT0gJ1xuJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmVhZHMgYW4gZW5kLW9mLWxpbmUgbWFya2VyIGFuZCB3cml0ZXMgdGhlIHRleHQgaW50byB0aGUKLSAgICAqICBzcGVjaWZpZWQgYnVmZmVyLCBpZiBzdXBwbGllZC4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVPTCggU3RyaW5nQnVmZmVyIGRlc3RpbmF0aW9uICkgdGhyb3dzIExleGVyRXhjZXB0aW9uLCBSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIHJlYWQgPSBmYWxzZTsKLQotICAgICAgICBjaGFyIGMgPSBsYSgpOwotICAgICAgICBzd2l0Y2goIGMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgaWYoIGRlc3RpbmF0aW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXHInICYmIGxhKCkgPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFwcGVuZCggY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdccicgJiYgbGEoKSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5hcHBlbmQoIGNvbnN1bWUoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVhZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVhZDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTeW5vbnltIGZvciA8Y29kZT5yZWFkRU9MKG51bGwpPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVPTCgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmVhZEVPTCggbnVsbCApOwotICAgIH0KLQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIERFTEVHQVRJT04KLQotCi0gICAvKioKLSAgICAqICBSZXNldHMgYSBsZXhlciBmb3IgcmV1c2UuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgc291cmNlICAgPSBudWxsOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIERlbGVnYXRlcyBvdXIgZHV0aWVzIHRvIGFub3RoZXIgTGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGRlbGVnYXRlKCBMZXhlciB0byApCi0gICAgewotICAgICAgICB0aGlzLmRlbGVnYXRlID0gdG87Ci0gICAgICAgIHRvLnNldFNvdXJjZSggdGhpcyApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIG91ciBkdXRpZXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHVuZGVsZWdhdGUoKQotICAgIHsKLSAgICAgICAgaWYoIGRlbGVnYXRlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS51bnNldFNvdXJjZSggKTsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFNldHMgdGhlIHNvdXJjZSBsZXhlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlKCBMZXhlciBzb3VyY2UgKQotICAgIHsKLSAgICAgICAgaWYoIHNvdXJjZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAidXNlIHVuc2V0U291cmNlKCkgdG8gcmVtb3ZlIGEgc291cmNlIGZyb20gYSBsZXhlciIgKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBVbnNldHMgdGhlIHNvdXJjZSBsZXhlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdW5zZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgZGVsZWdhdGVkIHRvIGFub3RoZXIgbGV4ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZSAhPSBudWxsOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgb2J0YWluaW5nIG91ciBjaGFyYWN0ZXJzCi0gICAgKiAgZnJvbSBhbm90aGVyIGxleGVyLgotICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsbHlTb3VyY2VkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UgIT0gbnVsbDsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRVJST1IgSEFORExJTkcKLQotCi0gICAvKioKLSAgICAqICBDcmVhdGVzIGFuZCB0aHJvd3MgYSBuZXcgPGNvZGU+VW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbjwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHVuZXhwZWN0ZWQoIGNoYXIgYywgaW50IG9mZnNldCwgU3RyaW5nIG1lc3NhZ2UgKSB0aHJvd3MgVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24oIGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydENvbHVtbigpICsgb2Zmc2V0LCBjLCBtZXNzYWdlICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgQ3JlYXRlcyBhbmQgdGhyb3dzIGEgbmV3IDxjb2RlPlVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb248L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmV4cGVjdGVkKCBjaGFyIGMsIGNoYXJbXSBleHBlY3RlZCwgaW50IG9mZnNldCApIHRocm93cyBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbiggZ2V0U3RhcnRMaW5lKCksIGdldFN0YXJ0Q29sdW1uKCkgKyBvZmZzZXQsIGMsIGV4cGVjdGVkICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgU3lub255bSBmb3IgPGNvZGU+dW5leHBlY3RlZCggYywgbnVsbCwgb2Zmc2V0ICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmV4cGVjdGVkKCBjaGFyIGMsIGludCBvZmZzZXQgKSB0aHJvd3MgVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdW5leHBlY3RlZCggYywgbnVsbCwgb2Zmc2V0ICk7Ci0gICAgfQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFNVUFBPUlQgUk9VVElORVMKLQotCi0gICAvKioKLSAgICAqICBDcmVhdGVzIGEgbmV3IHN5bWJvbCB0b2tlbiwgYW5kIGFsbG93cyB5b3UgdG8gYWx0ZXIgdGhlIHN0YXJ0aW5nCi0gICAgKiAgY29sdW1uLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gc3ltYm9sKCBpbnQgdHlwZSwgaW50IGNvbHVtbk9mZnNldCApCi0gICAgewotICAgICAgICByZXR1cm4gVG9rZW4ubmV3U3ltYm9sKCB0eXBlLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRDb2x1bW4oKSAtIGNvbHVtbk9mZnNldCApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIENyZWF0ZXMgYSBuZXcgc3ltYm9sIHRva2VuLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gc3ltYm9sKCBpbnQgdHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gVG9rZW4ubmV3U3ltYm9sKCB0eXBlLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRDb2x1bW4oKSApOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTVFJFQU0gUk9VVElORVMKLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICAgICovCi0KLSAgICBwdWJsaWMgaW50IGdldExpbmUoKQotICAgIHsKLSAgICAgICAgaWYoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRMaW5lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aGluIHRoYXQgbGluZS4KLSAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRDb2x1bW4oKQotICAgIHsKLSAgICAgICAgaWYoIHNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRDb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTYXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBwb3NpdGlvbiwgZm9yIHRyYWNraW5nIHRva2VuIGV4dGVudHMuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIG1hcmsoKQotICAgIHsKLSAgICAgICAgc3RhcnRMaW5lICAgPSBnZXRMaW5lKCk7Ci0gICAgICAgIHN0YXJ0Q29sdW1uID0gZ2V0Q29sdW1uKCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgc3RhcnRpbmcgbGluZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRTdGFydExpbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMaW5lOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIHN0YXJ0aW5nIGNvbHVtbiBvZiB0aGUgY3VycmVudCB0b2tlbi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGludCBnZXRTdGFydENvbHVtbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5zdGFydENvbHVtbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlciwgd2l0aG91dCBjb25zdW1pbmcgaXQuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGxhKCkgdGhyb3dzIExleGVyRXhjZXB0aW9uLCBSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbGEoMSk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgbmV4dCA8Y29kZT5rPC9jb2RlPnRoIGNoYXJhY3Rlciwgd2l0aG91dCBjb25zdW1pbmcgYW55LgotICAgICovCi0KLSAgICBwdWJsaWMgY2hhciBsYShpbnQgaykgdGhyb3dzIExleGVyRXhjZXB0aW9uLCBSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggc291cmNlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlLmxhKGspOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgRWF0cyBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGNvbnN1bWUoKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzb3VyY2UuY29uc3VtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiOGYxYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyOwotCi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlN5bnRheEV4Y2VwdGlvbjsKLQotLyoqIEJhc2UgZXhjZXB0aW9uIGluZGljYXRpbmcgYSBsZXhpY2FsIGVycm9yLgotICoKLSAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAd2Vya2VuLmNvbSI+Ym9iIG1jd2hpcnRlcjwvYT4KLSAqCi0gKiAgQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTGV4ZXJFeGNlcHRpb24gZXh0ZW5kcyBTeW50YXhFeGNlcHRpb24gewotCi0gICAgLyoqIAotICAgICAqICBAcGFyYW0gbGluZSBMaW5lIHVwb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgotICAgICAqICBAcGFyYW0gY29sdW1uIENvbHVtbiB1cG9uIHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGV4ZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKSB7Ci0vLyAgICAgICAgc3VwZXIobWVzc2FnZSArICIgYXQgIiArIGxpbmUgKyAiOiIgKyBjb2x1bW4sIGxpbmUsIGNvbHVtbik7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlclRva2VuU3RyZWFtLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyVG9rZW5TdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5MDhlNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyVG9rZW5TdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuQWJzdHJhY3RUb2tlblN0cmVhbTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVhZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuQWJzdHJhY3RUb2tlblN0cmVhbTsKLQotCi0vKioKLSAqICBJbXBsZW1lbnRzIGEgPGNvZGU+VG9rZW5TdHJlYW08L2NvZGU+IG9uIGEgPGNvZGU+TGV4ZXI8L2NvZGU+LgotICovCi0KLXB1YmxpYyBjbGFzcyBMZXhlclRva2VuU3RyZWFtCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFRva2VuU3RyZWFtCi17Ci0gICAgcHJpdmF0ZSBMZXhlciBsZXhlcjsKLQotICAgLyoqCi0gICAgKiAgSW5pdGlhbGl6ZXMgdGhlIDxjb2RlPkxleGVyVG9rZW5TdHJlYW08L2NvZGU+LgotICAgICovCi0KLSAgICBwdWJsaWMgTGV4ZXJUb2tlblN0cmVhbShMZXhlciBsZXhlcikKLSAgICB7Ci0gICAgICAgIHRoaXMubGV4ZXIgPSBsZXhlcjsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgdW5kZXJseWluZyA8Y29kZT5MZXhlcjwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyBMZXhlciBnZXRMZXhlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5sZXhlcjsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSA8Y29kZT5MZXhlcjwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgU3ludGF4RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGV4ZXIoKS5uZXh0VG9rZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1JlYWRlckNoYXJTdHJlYW0uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvUmVhZGVyQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFjZGM3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvUmVhZGVyQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVhZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlYWRlckNoYXJTdHJlYW0KLSAgICBleHRlbmRzIEFic3RyYWN0Q2hhclN0cmVhbQotewotICAgIHByaXZhdGUgUmVhZGVyIGluOwotCi0gICAgcHVibGljIFJlYWRlckNoYXJTdHJlYW0oUmVhZGVyIGluKQotICAgIHsKLSAgICAgICAgdGhpcy5pbiA9IGluOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWFkZXJDaGFyU3RyZWFtKFJlYWRlciBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gICAgewotICAgICAgICBzdXBlciggZGVzY3JpcHRpb24gKTsKLSAgICAgICAgdGhpcy5pbiA9IGluOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhciBjb25zdW1lKCkKLSAgICAgICAgdGhyb3dzIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGNoYXIpIGdldFJlYWRlcigpLnJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZWFkRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHRocm93cyBSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0UmVhZGVyKCkuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZWFkRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1N0cmluZ0NoYXJTdHJlYW0uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvU3RyaW5nQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA3MWQ0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvU3RyaW5nQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdDaGFyU3RyZWFtIGV4dGVuZHMgQWJzdHJhY3RDaGFyU3RyZWFtIHsKLSAgICBwcml2YXRlIGludCBjdXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotICAgIHB1YmxpYyBTdHJpbmdDaGFyU3RyZWFtKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgIHRoaXMuY3VyID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQ2hhclN0cmVhbShTdHJpbmcgdGV4dCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgICAgdGhpcy5jdXIgPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyIGNvbnN1bWUoKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmN1ciA+PSB0aGlzLnRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtLkVPUzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgYyA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5jdXIpOwotCi0gICAgICAgICsrdGhpcy5jdXI7Ci0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1N0cmluZ0xleGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1N0cmluZ0xleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzE3NWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9TdHJpbmdMZXhlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLS8ve3t7IGltcG9ydHMKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7Ci0vL319fQotCi0vKioKLSAqICBBIExleGVyIGZvciBwcm9jZXNzaW5nIHN0YW5kYXJkIHN0cmluZ3MuCi0gKgotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMZXhlciBleHRlbmRzIFRleHRMZXhlckJhc2UKLXsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgIGRlbGltaXRlciA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIGNoYXIgICAgd2F0Y2hGb3I7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dHU3RyaW5ncyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGVtcHR5U3RyaW5nICAgPSB0cnVlOyAgIC8vIElmIHNldCwgd2UgbmVlZCB0byBzZW5kIGFuIGVtcHR5IHN0cmluZwotCi0KLSAgIC8qKgotICAgICogIElmIHNldCB0cnVlLCB0aGUgZmlsdGVyIHdpbGwgYWxsb3cgXFwgYW5kIFwkIHRvIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuCi0gICAgKiAgWW91IHNob3VsZCBzZXQgdGhpcyBhcHByb3ByaWF0ZWx5IEJFRk9SRSBzZXR0aW5nIHNvdXJjZSEKLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgYWxsb3dHU3RyaW5ncyggYm9vbGVhbiBhbGxvdyApCi0gICAgewotICAgICAgICBhbGxvd0dTdHJpbmdzID0gYWxsb3c7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyBhIHNpbmdsZSBTVFJJTkcsIHRoZW4gbnVsbC4gICBUaGUgU1RSSU5HIGlzIGFsbCBvZiB0aGUgcHJvY2Vzc2VkCi0gICAgKiAgaW5wdXQuICBCYWNrc2xhc2hlcyBhcmUgc3RyaXBwZWQsIHdpdGggdGhlIFxyLCBcbiwgYW5kIFx0IGNvbnZlcnRlZAotICAgICogIGFwcHJvcHJpYXRlbHkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBUb2tlbiB1bmRlbGVnYXRlZE5leHRUb2tlbiggKSB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgTGV4ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBlbXB0eVN0cmluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVtcHR5U3RyaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gVG9rZW4ubmV3U3RyaW5nKCAiIiwgZ2V0U3RhcnRMaW5lKCksIGdldFN0YXJ0Q29sdW1uKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBmaW5pc2hlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgd2hpbGUoIGxhKDEpICE9IENoYXJTdHJlYW0uRU9TICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCBjb25zdW1lKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGxhKDEpID09IENoYXJTdHJlYW0uRU9TICYmIHN0cmluZy5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBUb2tlbi5uZXdTdHJpbmcoIHN0cmluZy50b1N0cmluZygpLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRDb2x1bW4oKSApOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgQ29udHJvbHMgZGVsaW1pdGVyIHNlYXJjaC4gIFdoZW4gdHVybmVkIG9uLCB0aGUgZmlyc3QgdGhpbmcgd2UgZG8KLSAgICAqICBpcyBjaGVjayBmb3IgYW5kIGVhdCBvdXIgZGVsaW1pdGVyLgotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBkZWxpbWl0KCBib29sZWFuIGRlbGltaXQgKQotICAgIHsKLSAgICAgICAgc3VwZXIuZGVsaW1pdCggZGVsaW1pdCApOwotCi0gICAgICAgIGlmKCBkZWxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFmaW5pc2hlZCAmJiBsYSgxKSA9PSBDaGFyU3RyZWFtLkVPUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5pc2hVcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBHU3RyaW5nTGV4ZXIgd2lsbCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0LiAgSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYW4gZW1wdHkgc3RyaW5nIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLCB3ZSBzZXQgYSBmbGFnIHRoYXQgaXMgY2hlY2tlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWxlZ2F0ZWROZXh0VG9rZW4oKS4KLQotICAgICAgICAgICAgICAgICAgICBpZiggIWFsbG93R1N0cmluZ3MgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVN0cmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLQotICAgLyoqCi0gICAgKiAgU2V0cyB0aGUgc291cmNlIGxleGVyIGFuZCBpZGVudGlmaWVzIGFuZCBjb25zdW1lcyB0aGUgb3BlbmluZyBkZWxpbWl0ZXIuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZSggTGV4ZXIgc291cmNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFNvdXJjZSggc291cmNlICk7Ci0KLSAgICAgICAgZW1wdHlTdHJpbmcgPSBmYWxzZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gc291cmNlLmxhKCk7Ci0gICAgICAgICAgICBzd2l0Y2goIGMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgICAgICAgICAgbWFyaygpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBzb3VyY2UubGEoKSA9PSBjICYmIHNvdXJjZS5sYSgyKSA9PSBjICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNvbnN1bWUoKTsgc291cmNlLmNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQoYykuYXBwZW5kKGMpLmFwcGVuZChjKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZChjKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgd2F0Y2hGb3IgPSBkZWxpbWl0ZXIuY2hhckF0KDApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImF0IHRoZSB0aW1lIG9mIFN0cmluZ0xleGVyLnNldFNvdXJjZSgpLCB0aGUgc291cmNlIG11c3QgYmUgb24gYSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdGFydCgpOwotICAgICAgICAgICAgZGVsaW1pdCggdHJ1ZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCByZWFkIG91ciBkZWxpbWl0ZXIsIHdlJ2xsIGp1c3QKLSAgICAgICAgICAgIC8vIGNhbmNlbCBvdXIgc291cmNlLiAgbmV4dFRva2VuKCkgd2lsbCByZXR1cm4gbnVsbC4KLQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHVuc2V0U291cmNlKCApOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgVW5zZXRzIG91ciBzb3VyY2UuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHVuc2V0U291cmNlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnVuc2V0U291cmNlKCk7Ci0gICAgICAgIGRlbGltaXRlciAgID0gbnVsbDsKLSAgICAgICAgZmluaXNoZWQgICAgPSB0cnVlOwotICAgICAgICBlbXB0eVN0cmluZyA9IGZhbHNlOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTVFJFQU0gUk9VVElORVMKLQotICAgIHByaXZhdGUgaW50ICAgIGxvb2thaGVhZCAgPSAwOyAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaWRlbnRpZmllZAotICAgIHByaXZhdGUgY2hhcltdIGNoYXJhY3RlcnMgPSBuZXcgY2hhclszXTsgICAvLyB0aGUgbmV4dCBjaGFyYWN0ZXJzIGlkZW50aWZpZWQgYnkgbGEoKQotICAgIHByaXZhdGUgaW50W10gIHdpZHRocyAgICAgPSBuZXcgaW50WzNdOyAgICAvLyB0aGUgc291cmNlIHdpZHRocyBvZiB0aGUgbmV4dCBjaGFyYWN0ZXJzCi0KLQotICAgIHB1YmxpYyBjaGFyIGxhKCkgdGhyb3dzIExleGVyRXhjZXB0aW9uLCBSZWFkRXhjZXB0aW9uCi0gICAgewotCQlyZXR1cm4gbGEoMSk7Ci0gICAgfQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBuZXh0IDxjb2RlPms8L2NvZGU+dGggY2hhcmFjdGVyLCB3aXRob3V0IGNvbnN1bWluZyBhbnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGxhKGludCBrKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgaWYoICFmaW5pc2hlZCAmJiBzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYoIGRlbGltaXRlZCApCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpZiggayA+IGNoYXJhY3RlcnMubGVuZ3RoICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggIlN0cmluZ0xleGVyIGxvb2thaGVhZCB0b2xlcmFuY2UgZXhjZWVkZWQiICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGxvb2thaGVhZCA+PSBrICYmIGsgPj0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyYWN0ZXJzW2stMV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbG9va2FoZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIGNoYXIgYyA9ICcgJywgYzEgPSAnICcsIGMyID0gJyAnOwotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAxLCB3aWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPD0gazsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMxID0gc291cmNlLmxhKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIEMxX1NXSVRDSDogc3dpdGNoKCBjMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhclN0cmVhbS5FT1M6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBzb3VyY2UubGEoIG9mZnNldCArIDEgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQ0FQRV9TV0lUQ0g6IHN3aXRjaCggYzIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJTdHJlYW0uRU9TOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXFwnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1swXSA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMF0gPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdccic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcdCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcYic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcZic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyQnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhbGxvd0dTdHJpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBFU0NBUEVfU1dJVENIOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNbMF0gPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzBdID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcXCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzWzBdID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEMxX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYzEgPT0gd2F0Y2hGb3IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5sYShvZmZzZXQpICE9IHdhdGNoRm9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEMxX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAxOyBqIDwgZGVsaW1pdGVyLmxlbmd0aCgpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3VyY2UubGEob2Zmc2V0K2opICE9IGRlbGltaXRlci5jaGFyQXQoaikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGF0RW5kICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnJCcgJiYgYWxsb3dHU3RyaW5ncykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEMxX1NXSVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1tsb29rYWhlYWRdID0gYzsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2xvb2thaGVhZF0gICAgID0gd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw8PCBGTE9XIENPTlRST0wgPDw8PDw8PDw8Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvb2thaGVhZCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlLmxhKGspOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotCi0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgRWF0cyBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICBTZWFyY2hlcyBmb3IgdGhlIGRlbGltaXRlciBpZgotICAgICogIGRlbGltaXRlZC4gIE5vdGUgdGhhdCB0dXJuaW5nIGRlbGltaXRpbmcgb24gYWxzbyBjaGVja3MgaWYgd2UgYXJlIGF0IHRoZQotICAgICogIGRlbGltaXRlciwgc28gaWYgd2UgYXJlbid0IGZpbmlzaGVkLCB0aGVyZSBpcyBzb21ldGhpbmcgdG8gY29uc3VtZS4KLSAgICAqLwotCi0gICAgcHVibGljIGNoYXIgY29uc3VtZSgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoICFmaW5pc2hlZCAmJiBzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IENoYXJTdHJlYW0uRU9TOwotCi0gICAgICAgICAgICBpZiggZGVsaW1pdGVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggbG9va2FoZWFkIDwgMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYSggMSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBsb29rYWhlYWQgPj0gMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjID0gY2hhcmFjdGVyc1swXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB3aWR0aHNbMF07IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBsYSgxKSA9PSBDaGFyU3RyZWFtLkVPUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5pc2hVcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gc291cmNlLmNvbnN1bWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9va2FoZWFkID0gMDsKLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEVhdHMgb3VyIGRlbGltaXRlciBmcm9tIHRoZSBzdHJlYW0gYW5kIG1hcmtzIHVzIGZpbmlzaGVkLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hVcCgpIHRocm93cyBMZXhlckV4Y2VwdGlvbiwgUmVhZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBkZWxpbWl0ZXIubGVuZ3RoKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHNvdXJjZS5sYSgxKTsKLSAgICAgICAgICAgIGlmKCBjID09IENoYXJTdHJlYW0uRU9TICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbihnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRDb2x1bW4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjID09IGRlbGltaXRlci5jaGFyQXQoaSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvdXJjZS5jb25zdW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAibGEoKSBzYWlkIGRlbGltaXRlciBbIiArIGRlbGltaXRlciArICJdLCBmaW5pc2hVcCgpIGZvdW5kIFsiICsgYyArICJdIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluaXNoKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1RleHRMZXhlckJhc2UuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvVGV4dExleGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VkODM4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvVGV4dExleGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotCi0vKioKLSAqICBBIGJhc2UgY2xhc3MgZm9yIExleGVycyB0aGF0IHByb2Nlc3MgZW1iZWRkZWQgdGV4dC4KLSAqIAotICogIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXh0TGV4ZXJCYXNlIGV4dGVuZHMgTGV4ZXJCYXNlIGltcGxlbWVudHMgRGVsaW1pdGVyIAotewotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVsaW1pdGVkID0gdHJ1ZTsgICAvLyBXaGVuIHRydWUsIHRoZSBsZXhlciBjYW4gZG8gaXRzIGRlbGltaXRpbmcKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2hlZCAgPSB0cnVlOyAgIC8vIFdoZW4gdHJ1ZSwgdGhlIGxleGVyIGlzIGRyeQotCi0KLSAgIC8qKgotICAgICogIFR1cm5zIGRlbGltaXRpbmcgb24gb3Igb2ZmLiAgVGhpcyBzaG91bGQgYWZmZWN0IDxjb2RlPmxhKCk8L2NvZGU+Ci0gICAgKiAgYW5kIDxjb2RlPmNvbnN1bWUoKTwvY29kZT4uICBIb3dldmVyLCBvbmNlIHRoZSBkZWxpbWl0ZXIgaGFzIGJlZW4KLSAgICAqICByZWFjaGVkLCB0aGlzIHJvdXRpbmUgc2hvdWxkIGhhdmUgbm8gZWZmZWN0LgotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBkZWxpbWl0KCBib29sZWFuIGRlbGltaXRlZCApIAotICAgIHsKLSAgICAgICAgdGhpcy5kZWxpbWl0ZWQgPSBkZWxpbWl0ZWQ7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBsZXhlciBpcyBhcHBseWluZyBpdHMgZGVsaW1pdGVyIHBvbGljeS4KLSAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxpbWl0ZWQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGltaXRlZDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIGxleGVyIHN0cmVhbSBpcyBkcnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hlZDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXN0YXJ0cyB0aGUgbGV4ZXIgc3RyZWFtIGFmdGVyIGEgPGNvZGU+ZmluaXNoKCk8L2NvZGU+Ci0gICAgKiAgYW5kIHNvbWUgaW50ZXZlbmluZyBhY3QgKGxpa2UgYSBuZXcgc291cmNlKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdGFydCgpIAotICAgIHsKLSAgICAgICAgZmluaXNoZWQgPSBmYWxzZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTdG9wcyB0aGUgbGV4ZXIgc3RyZWFtLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2goKSAKLSAgICB7Ci0gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKLSAgICB9Ci0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBTVFJFQU0gUk9VVElORVMKLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBuZXh0IDxjb2RlPms8L2NvZGU+dGggY2hhcmFjdGVyLCB3aXRob3V0IGNvbnN1bWluZyBhbnkuCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGxhKGludCBrKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24gCi0gICAgewotICAgICAgICBpZiggZmluaXNoZWQgKSAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHNvdXJjZSAhPSBudWxsICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGEoayk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgRWF0cyBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgKi8KLQotICAgIHB1YmxpYyBjaGFyIGNvbnN1bWUoKSB0aHJvd3MgTGV4ZXJFeGNlcHRpb24sIFJlYWRFeGNlcHRpb24gCi0gICAgewotICAgICAgICBpZiggZmluaXNoZWQgKSAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW0uRU9TOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHNvdXJjZSAhPSBudWxsICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzb3VyY2UuY29uc3VtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtLkVPUzsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9VbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1VuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhOTJjMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1VuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLXB1YmxpYyBjbGFzcyBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uIGV4dGVuZHMgTGV4ZXJFeGNlcHRpb24gewotICAgIHByaXZhdGUgY2hhciBjOwotICAgIHByaXZhdGUgY2hhcltdIGV4cGVjdGVkOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbiwgY2hhciBjLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcigidW5leHBlY3RlZCBjaGFyYWN0ZXI6ICIgKyBjICsgKG1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogIjsgIiArIG1lc3NhZ2UpLCBsaW5lLCBjb2x1bW4pOwotICAgICAgICB0aGlzLmMgPSBjOwotICAgICAgICB0aGlzLmV4cGVjdGVkID0gbnVsbDsKLSAgICAgICAgdGhpcy5tZXNzYWdlICA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24oaW50IGxpbmUsIGludCBjb2x1bW4sIGNoYXIgYywgY2hhcltdIGV4cGVjdGVkKSB7Ci0gICAgICAgIHN1cGVyKCJ1bmV4cGVjdGVkIGNoYXJhY3RlcjogIiArIGMsIGxpbmUsIGNvbHVtbik7Ci0gICAgICAgIHRoaXMuYyA9IGM7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLSAgICAgICAgdGhpcy5tZXNzYWdlICA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXIgZ2V0Q2hhcmFjdGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0RXhwZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cGVjdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYoIHRoaXMubWVzc2FnZSAhPSBudWxsICkgewotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0aGlzLmV4cGVjdGVkICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiZXhwZWN0ZWQgIik7Ci0gICAgICAgICAgICBpZiAodGhpcy5leHBlY3RlZC5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCInIiArIHRoaXMuZXhwZWN0ZWRbMF0gKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIm9uZSBvZiB7Iik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhwZWN0ZWQubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiciICsgdGhpcy5leHBlY3RlZFtpXSArICInIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAodGhpcy5leHBlY3RlZC5sZW5ndGggLSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoICI7IGZvdW5kICciICkuYXBwZW5kKCBjICkuYXBwZW5kKCAiJyIgKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9VbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjgwZTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9VbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLXB1YmxpYyBjbGFzcyBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGV4dGVuZHMgTGV4ZXJFeGNlcHRpb24gewotICAgIHB1YmxpYyBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uKGludCBsaW5lLCBpbnQgY29sdW1uKSB7Ci0gICAgICAgIHN1cGVyKCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwiLCBsaW5lLCBjb2x1bW4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Y2EyNWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxodG1sPgotICA8aGVhZD4KLSAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlci4qPC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgICA8cD5MZXhlci48L3A+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0FTVEJ1aWxkZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0FTVEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4OGExMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9BU1RCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgxICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaXR3aXNlTmVnYXRlRXZhbHVhdGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuSW5uZXJDbGFzc05vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29uc3RydWN0b3JOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1ldGhvZE5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTWl4aW5Ob2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlByb3BlcnR5Tm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5UeXBlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQXJyYXlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQmluYXJ5RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJvb2xlYW5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5DbGFzc0V4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5DbG9zdXJlRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuR1N0cmluZ0V4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5MaXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk1hcEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5NZXRob2RDYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk5lZ2F0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJpdHdpc2VOZWdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTm90RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlBvc3RmaXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlByb3BlcnR5RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlJhbmdlRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlJlZ2V4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlRlcm5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVHVwbGVFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVmFyaWFibGVFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQXNzZXJ0U3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQmxvY2tTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkNhc2VTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5DYXRjaFN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkNvbnRpbnVlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRG9XaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkVtcHR5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRXhwcmVzc2lvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LklmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3luY2hyb25pemVkU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuVGhyb3dTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5UcnlDYXRjaFN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4Lk51bWJlcnM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguQVNUSGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5DU1ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiAgQnVpbGRzIGFuIEFic3RyYWN0IFN5bnRheCBUcmVlIGZyb20gdGhlIENvbmNyZXRlIFN5bnRheCBUcmVlIHByb2R1Y2VkCi0gKiAgYnkgdGhlIFBhcnNlci4gIFRoZSByZXN1bHRpbmcgQVNUIGlzIHZlcnkgcHJlbGltaW5hcnksIGFuZCBtdXN0IHN0aWxsCi0gKiAgYmUgdmFsaWRhdGVkIGFuZCBtYXNzYWdlZCBiZWZvcmUgaXQgaXMgcmVhZHkgdG8gYmUgdXNlZC4KLSAqICA8Y29kZT5idWlsZCgpPC9jb2RlPiBpcyB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludC4KLSAqCi0gKiAgQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogIEBhdXRob3IgQm9iIE1jV2hpcnRlcgotICogIEBhdXRob3IgU2FtIFB1bGxhcmEKLSAqICBAYXV0aG9yIENocmlzIFBvaXJpZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgQVNUQnVpbGRlciBleHRlbmRzIEFTVEhlbHBlcgotewotCi0gICAgcHVibGljIEFTVEJ1aWxkZXIoIFNvdXJjZVVuaXQgc291cmNlVW5pdCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgKQotICAgIHsKLSAgICAgICAgc3VwZXIoc291cmNlVW5pdCwgY2xhc3NMb2FkZXIpOwotICAgIH0KLQotCi0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVOVFJZIFBPSU5UCi0KLQotICAgLyoqCi0gICAgKiAgQnVpbGRzIGFuIEFTVCBNb2R1bGVOb2RlIGZyb20gYSBQYXJzZXIubW9kdWxlKCkgUmVkdWN0aW9uLgotICAgICovCi0KLSAgICBwdWJsaWMgTW9kdWxlTm9kZSBidWlsZCggQ1NUTm9kZSBpbnB1dCApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1ha2VNb2R1bGUoKTsKLQotICAgICAgIC8vCi0gICAgICAgIC8vIGlucHV0IHN0cnVjdHVyZToKLSAgICAgICAgLy8gICAgMTogcGFja2FnZQotICAgICAgICAvLyAgICAyOiBpbXBvcnRzCi0gICAgICAgIC8vICAgMys6IHN0YXRlbWVudHMKLQotICAgICAgICBzZXRQYWNrYWdlTmFtZSggcGFja2FnZURlY2xhcmF0aW9uKCBpbnB1dC5nZXQoMSkgKSk7Ci0KLSAgICAgICAgaW1wb3J0U3RhdGVtZW50cyhpbnB1dC5nZXQoMikgKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMzsgaSA8IGlucHV0LnNpemUoKTsgKytpICkKLSAgICAgICAgewotICAgICAgICAgICAgdG9wTGV2ZWxTdGF0ZW1lbnQoIG91dHB1dCwgaW5wdXQuZ2V0KGkpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggb3V0cHV0LmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC5hZGRTdGF0ZW1lbnQoIG5ldyBCbG9ja1N0YXRlbWVudCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotCi0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIERFQ0xBUkFUSU9OUwotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5wYWNrYWdlRGVjbGFyYXRpb24oKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlRGVjbGFyYXRpb24oIENTVE5vZGUgcmVkdWN0aW9uICkKLSAgICB7Ci0gICAgICAgIGlmKCByZWR1Y3Rpb24uaGFzQ2hpbGRyZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYWtlTmFtZSggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIGltcG9ydHMgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5tb2R1bGUoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW1wb3J0U3RhdGVtZW50cyhDU1ROb2RlIGNvbnRhaW5lcikKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgY29udGFpbmVyLnNpemUoKTsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRTdGF0ZW1lbnQoIGNvbnRhaW5lci5nZXQoaSkgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5pbXBvcnRTdGF0ZW1lbnQoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW1wb3J0U3RhdGVtZW50KENTVE5vZGUgcmVkdWN0aW9uKQotICAgIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRmlyc3QsIGdldCB0aGUgcGFja2FnZSBuYW1lIChpZiBzdXBwbGllZCkuCi0KLSAgICAgICAgU3RyaW5nIGltcG9ydFBhY2thZ2UgPSBtYWtlTmFtZSggcmVkdWN0aW9uLmdldCgxKSwgbnVsbCApOwotCi0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2xhdXNlIGlzIFR5cGVzLlNUQVIsIGl0J3MgYSBwYWNrYWdlIGltcG9ydC4KLQotICAgICAgICBpZiggcmVkdWN0aW9uLmdldCgyKS5pc0EoVHlwZXMuU1RBUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRQYWNrYWdlV2l0aFN0YXIoaW1wb3J0UGFja2FnZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIHNlcmllcyBvZiBzcGVjaWZpYyBpbXBvcnRzLgotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDI7IGkgPCByZWR1Y3Rpb24uc2l6ZSgpOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENTVE5vZGUgY2xhdXNlID0gcmVkdWN0aW9uLmdldChpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgICA9IGlkZW50aWZpZXIoIGNsYXVzZSApOwotICAgICAgICAgICAgICAgIFN0cmluZyAgYXMgICAgID0gKGNsYXVzZS5oYXNDaGlsZHJlbigpID8gaWRlbnRpZmllcihjbGF1c2UuZ2V0KDEpKSA6IG5hbWUpOwotCi0gICAgICAgICAgICAgICAgaW1wb3J0Q2xhc3MoaW1wb3J0UGFja2FnZSwgbmFtZSwgYXMpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci50b3BMZXZlbFN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0b3BMZXZlbFN0YXRlbWVudCggTW9kdWxlTm9kZSBtb2R1bGUsIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50IHR5cGUgPSByZWR1Y3Rpb24uZ2V0TWVhbmluZygpOwotICAgICAgICBzd2l0Y2goIHR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX0NMQVNTOgotICAgICAgICAgICAgICAgIG1vZHVsZS5hZGRDbGFzcyggY2xhc3NEZWNsYXJhdGlvbihudWxsLCByZWR1Y3Rpb24pICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIG1vZHVsZS5hZGRDbGFzcyggaW50ZXJmYWNlRGVjbGFyYXRpb24obnVsbCwgcmVkdWN0aW9uKSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX01FVEhPRDoKLSAgICAgICAgICAgICAgICBtb2R1bGUuYWRkTWV0aG9kKCBtZXRob2REZWNsYXJhdGlvbihudWxsLCByZWR1Y3Rpb24pICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbW9kdWxlLmFkZFN0YXRlbWVudCggc3RhdGVtZW50KHJlZHVjdGlvbikgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLmNsYXNzRGVjbGFyYXRpb24oKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENsYXNzTm9kZSBjbGFzc0RlY2xhcmF0aW9uKCBDbGFzc05vZGUgY29udGV4dCwgQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGVhc3kgc3R1ZmYKLQotICAgICAgICBTdHJpbmcgICBuYW1lID0gaWRlbnRpZmllciggcmVkdWN0aW9uICk7Ci0gICAgICAgIGFkZE5ld0NsYXNzTmFtZShuYW1lKTsKLSAgICAgICAgaW50IG1vZGlmaWVycyA9IG1vZGlmaWVycyggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVzb2x2ZU5hbWUoIHJlZHVjdGlvbi5nZXQoMikuZ2V0KDEpICk7Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBUaGVuIHByb2Nlc3MgdGhlIGludGVyZmFjZSBsaXN0LgotCi0gICAgICAgIENTVE5vZGUgIGludGVyZmFjZVJlZHVjdGlvbiA9IHJlZHVjdGlvbi5nZXQoMyk7Ci0gICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXMgPSBuZXcgU3RyaW5nW2ludGVyZmFjZVJlZHVjdGlvbi5jaGlsZHJlbigpXTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCBpbnRlcmZhY2VSZWR1Y3Rpb24uc2l6ZSgpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VzW2ktMV0gPSByZXNvbHZlTmFtZSggaW50ZXJmYWNlUmVkdWN0aW9uLmdldChpKSApOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBDcmVhdGUgdGhlIGNsYXNzLgotCi0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSAoCi0gICAgICAgICAgICBjb250ZXh0ID09IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBDbGFzc05vZGUoICAgICAgICAgICAgICAgZG90KGdldFBhY2thZ2VOYW1lKCksIG5hbWUpLCBtb2RpZmllcnMsIHBhcmVudCwgaW50ZXJmYWNlcywgTWl4aW5Ob2RlLkVNUFRZX0FSUkFZICkKLSAgICAgICAgICAgICAgICA6IG5ldyBJbm5lckNsYXNzTm9kZSggY29udGV4dCwgZG90KGdldFBhY2thZ2VOYW1lKCksIG5hbWUpLCBtb2RpZmllcnMsIHBhcmVudCwgaW50ZXJmYWNlcywgTWl4aW5Ob2RlLkVNUFRZX0FSUkFZICkKLSAgICAgICAgKTsKLQotICAgICAgICBjbGFzc05vZGUuc2V0Q1NUTm9kZSggcmVkdWN0aW9uLmdldCgwKSApOwotICAgICAgICB0eXBlQm9keSggY2xhc3NOb2RlLCByZWR1Y3Rpb24uZ2V0KDQpLCAwLCAwICk7Ci0gICAgICAgIHJldHVybiBjbGFzc05vZGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSB0eXBlIGJvZHkgZm9yIGNsYXNzRGVjbGFyYXRpb24oKSBhbmQgb3RoZXJzLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0eXBlQm9keSggQ2xhc3NOb2RlIGNsYXNzTm9kZSwgQ1NUTm9kZSBib2R5LCBpbnQgcHJvcGVydHlNb2RpZmllcnMsIGludCBtZXRob2RNb2RpZmllcnMgKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IGJvZHkuc2l6ZSgpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU1ROb2RlIHN0YXRlbWVudCA9IGJvZHkuZ2V0KGkpOwotICAgICAgICAgICAgc3dpdGNoKCBzdGF0ZW1lbnQuZ2V0TWVhbmluZygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX1BST1BFUlRZOgotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eURlY2xhcmF0aW9uKCBjbGFzc05vZGUsIHN0YXRlbWVudCwgcHJvcGVydHlNb2RpZmllcnMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX01FVEhPRDoKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24oIGNsYXNzTm9kZSwgc3RhdGVtZW50LCBtZXRob2RNb2RpZmllcnMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX0NMQVNTOgotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uKCBjbGFzc05vZGUsIHN0YXRlbWVudCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbiggY2xhc3NOb2RlLCBzdGF0ZW1lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJ1bnJlY29nbml6ZWQgdHlwZSBib2R5IHN0YXRlbWVudCBbIiArIHN0YXRlbWVudC50b1N0cmluZygpICsgIl0iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIucHJvcGVydHlEZWNsYXJhdGlvbigpLgotICAgICogIEFkZHMgdGhlIHByb3BlcnR5IHRvIHRoZSBzdXBwbGllZCBjbGFzcy4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlEZWNsYXJhdGlvbiggQ2xhc3NOb2RlIGNsYXNzTm9kZSwgQ1NUTm9kZSByZWR1Y3Rpb24sIGludCBleHRyYU1vZGlmaWVycyApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyAgIG5hbWUgPSBpZGVudGlmaWVyKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgaW50IG1vZGlmaWVycyA9IG1vZGlmaWVycyggcmVkdWN0aW9uLmdldCgxKSApIHwgZXh0cmFNb2RpZmllcnM7Ci0gICAgICAgIFN0cmluZyAgIHR5cGUgPSByZXNvbHZlTmFtZSggcmVkdWN0aW9uLmdldCgyKSApOwotCi0gICAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSByZWR1Y3Rpb24uc2l6ZSgpID4gMyA/IGV4cHJlc3Npb24ocmVkdWN0aW9uLmdldCgzKSkgOiBudWxsOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUgPSBjbGFzc05vZGUuYWRkUHJvcGVydHkoIG5hbWUsIG1vZGlmaWVycywgdHlwZSwgdmFsdWUsIG51bGwsIG51bGwgKTsKLSAgICAgICAgcHJvcGVydHlOb2RlLnNldENTVE5vZGUoIHJlZHVjdGlvbi5nZXQoMCkgKTsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+YWRkUHJvcGVydHlEZWNsYXJhdGlvbiggY2xhc3NOb2RlLCByZWR1Y3Rpb24sIDAgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5RGVjbGFyYXRpb24oIENsYXNzTm9kZSBjbGFzc05vZGUsIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWRkUHJvcGVydHlEZWNsYXJhdGlvbiggY2xhc3NOb2RlLCByZWR1Y3Rpb24sIDAgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIubWV0aG9kRGVjbGFyYXRpb24oKS4KLSAgICAqICBBZGRzIHRoZSBtZXRob2QgdG8gdGhlIHN1cHBsaWVkIGNsYXNzLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kTm9kZSBtZXRob2REZWNsYXJhdGlvbiggQ2xhc3NOb2RlIGNsYXNzTm9kZSwgQ1NUTm9kZSByZWR1Y3Rpb24sIGludCBleHRyYU1vZGlmaWVycyApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICBpZiggY2xhc3NOb2RlICE9IG51bGwgICkKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOb2RlLmdldE5hbWVXaXRob3V0UGFja2FnZSgpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBHZXQgdGhlIGJhc2ljIG1ldGhvZCBkYXRhCi0KLSAgICAgICAgU3RyaW5nICAgbmFtZSA9IGlkZW50aWZpZXIoIHJlZHVjdGlvbiApOwotICAgICAgICBpbnQgbW9kaWZpZXJzID0gbW9kaWZpZXJzKCByZWR1Y3Rpb24uZ2V0KDEpICkgfCBleHRyYU1vZGlmaWVyczsKLSAgICAgICAgU3RyaW5nICAgdHlwZSA9IHJlc29sdmVOYW1lKCByZWR1Y3Rpb24uZ2V0KDIpICk7Ci0KLSAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRlY2xhcmF0aW9ucyggcmVkdWN0aW9uLmdldCgzKSApOwotICAgICAgICBCbG9ja1N0YXRlbWVudCAgICBib2R5ID0gc3RhdGVtZW50Qm9keSggcmVkdWN0aW9uLmdldCg1KSApOwotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgdGhyb3dzIGNsYXVzZQotCi0gICAgICAgIENTVE5vZGUgIGNsYXVzZSAgICAgPSByZWR1Y3Rpb24uZ2V0KDQpOwotICAgICAgICBTdHJpbmdbXSB0aHJvd1R5cGVzID0gbmV3IFN0cmluZ1tjbGF1c2UuY2hpbGRyZW4oKV07Ci0gICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgY2xhdXNlLnNpemUoKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3dUeXBlc1tpLTFdID0gcmVzb2x2ZU5hbWUoIGNsYXVzZS5nZXQoaSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBjbGF1c2UuaGFzQ2hpbGRyZW4oKSApIHsgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogdGhyb3dzIGNsYXVzZSIgKTsgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQW4gdW5uYW1lZCBtZXRob2QgaXMgYSBzdGF0aWMgaW5pdGlhbGl6ZXIKLQotICAgICAgICBpZiggbmFtZS5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogc3RhdGljIGluaXRpYWxpemVycyIgKTsKLQotICAgICAgICAgICAgLyoKLQotICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIG5vZGUgPSBuZXcgQ29uc3RydWN0b3JOb2RlKCBtb2RpZmllcnMgfCBDb25zdGFudHMuQUNDX1NUQVRJQywgcGFyYW1ldGVycywgYm9keSApOwotICAgICAgICAgICAgbm9kZS5zZXRDU1ROb2RlKCByZWR1Y3Rpb24uZ2V0KDApICk7Ci0KLSAgICAgICAgICAgIGNsYXNzTm9kZS5hZGRDb25zdHJ1Y3Rvciggbm9kZSApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgICovCi0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEEgbWV0aG9kIHdpdGggdGhlIGNsYXNzIG5hbWUgaXMgYSBjb25zdHJ1Y3RvcgotCi0gICAgICAgIGVsc2UgaWYoIGNsYXNzTmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKGNsYXNzTmFtZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgbm9kZSA9IG5ldyBDb25zdHJ1Y3Rvck5vZGUoIG1vZGlmaWVycywgcGFyYW1ldGVycywgYm9keSApOwotICAgICAgICAgICAgbm9kZS5zZXRDU1ROb2RlKCByZWR1Y3Rpb24uZ2V0KDApICk7Ci0KLSAgICAgICAgICAgIGNsYXNzTm9kZS5hZGRDb25zdHJ1Y3Rvciggbm9kZSApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgYSBwbGFpbiBvbGQgbWV0aG9kCi0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IG5ldyBNZXRob2ROb2RlKCBuYW1lLCBtb2RpZmllcnMsIHR5cGUsIHBhcmFtZXRlcnMsIGJvZHkgKTsKLSAgICAgICAgICAgIG1ldGhvZC5zZXRDU1ROb2RlKCByZWR1Y3Rpb24uZ2V0KDApICk7Ci0KLSAgICAgICAgICAgIGlmKCBjbGFzc05vZGUgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZCggbWV0aG9kICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+bWV0aG9kRGVjbGFyYXRpb24oIGNsYXNzTm9kZSwgcmVkdWN0aW9uLCAwICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kTm9kZSBtZXRob2REZWNsYXJhdGlvbiggQ2xhc3NOb2RlIGNsYXNzTm9kZSwgQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24oIGNsYXNzTm9kZSwgcmVkdWN0aW9uLCAwICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyW10gcGFyYW1ldGVyRGVjbGFyYXRpb25zKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVyWyByZWR1Y3Rpb24uY2hpbGRyZW4oKSBdOwotCi0gICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgcmVkdWN0aW9uLnNpemUoKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ1NUTm9kZSBub2RlID0gcmVkdWN0aW9uLmdldChpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyKCBub2RlICk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZSAgICAgICA9IHJlc29sdmVOYW1lKCBub2RlLmdldCgxKSApOwotCi0gICAgICAgICAgICBpZiggbm9kZS5zaXplKCkgPiAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ktMV0gPSBuZXcgUGFyYW1ldGVyKCB0eXBlLCBpZGVudGlmaWVyLCBleHByZXNzaW9uKG5vZGUuZ2V0KDIpKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbaS0xXSA9IG5ldyBQYXJhbWV0ZXIoIHR5cGUsIGlkZW50aWZpZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotCi0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIuaW50ZXJmYWNlRGVjbGFyYXRpb24oKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENsYXNzTm9kZSBpbnRlcmZhY2VEZWNsYXJhdGlvbiggQ2xhc3NOb2RlIGNvbnRleHQsIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogaW50ZXJmYWNlcyIgKTsKLQotICAgICAgICAvKgotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZWFzeSBzdHVmZgotCi0gICAgICAgIFN0cmluZyAgIG5hbWUgPSBpZGVudGlmaWVyKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgaW50IG1vZGlmaWVycyA9IG1vZGlmaWVycyggcmVkdWN0aW9uLmdldCgxKSApIHwgQ29uc3RhbnRzLkFDQ19BQlNUUkFDVCB8IENvbnN0YW50cy5BQ0NfU1RBVElDOwotICAgICAgICBTdHJpbmcgcGFyZW50ID0gbnVsbDsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZW4gcHJvY2VzcyB0aGUgaW50ZXJmYWNlIGxpc3QuCi0KLSAgICAgICAgQ1NUTm9kZSAgaW50ZXJmYWNlUmVkdWN0aW9uID0gcmVkdWN0aW9uLmdldCgzKTsKLSAgICAgICAgU3RyaW5nW10gaW50ZXJmYWNlcyA9IG5ldyBTdHJpbmdbaW50ZXJmYWNlUmVkdWN0aW9uLmNoaWxkcmVuKCldOwotICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IGludGVyZmFjZVJlZHVjdGlvbi5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyZmFjZXNbaS0xXSA9IHJlc29sdmVOYW1lKCBpbnRlcmZhY2VSZWR1Y3Rpb24uZ2V0KGkpICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJmYWNlLgotCi0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSAoCi0gICAgICAgICAgICBjb250ZXh0ID09IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBDbGFzc05vZGUoICAgICAgICAgICAgICAgZG90KGdldFBhY2thZ2VOYW1lKCksIG5hbWUpLCBtb2RpZmllcnMsIHBhcmVudCwgaW50ZXJmYWNlcywgTWl4aW5Ob2RlLkVNUFRZX0FSUkFZICkKLSAgICAgICAgICAgICAgICA6IG5ldyBJbm5lckNsYXNzTm9kZSggY29udGV4dCwgZG90KGdldFBhY2thZ2VOYW1lKCksIG5hbWUpLCBtb2RpZmllcnMsIHBhcmVudCwgaW50ZXJmYWNlcywgTWl4aW5Ob2RlLkVNUFRZX0FSUkFZICkKLSAgICAgICAgKTsKLQotICAgICAgICBjbGFzc05vZGUuc2V0Q1NUTm9kZSggcmVkdWN0aW9uLmdldCgwKSApOwotCi0gICAgICAgIGludCBwcm9wZXJ0eU1vZGlmaWVycyA9IENvbnN0YW50cy5BQ0NfU1RBVElDIHwgQ29uc3RhbnRzLkFDQ19GSU5BTCB8IENvbnN0YW50cy5BQ0NfUFVCTElDOwotICAgICAgICBpbnQgbWV0aG9kTW9kaWZpZXJzICAgPSBDb25zdGFudHMuQUNDX0FCU1RSQUNUOwotCi0gICAgICAgIHR5cGVCb2R5KCBjbGFzc05vZGUsIHJlZHVjdGlvbi5nZXQoNCksIHByb3BlcnR5TW9kaWZpZXJzLCBtZXRob2RNb2RpZmllcnMgKTsKLQotCi0gICAgICAgIHJldHVybiBjbGFzc05vZGU7Ci0KLSAgICAgICAgKi8KLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gU1RBVEVNRU5UUwotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHRoYXQgcmVzdWx0cyBmcm9tIFBhcnNlci5zdGF0ZW1lbnRCb2R5KCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnRCb2R5KCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCByZWR1Y3Rpb24uaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja1N0YXRlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHJlZHVjdGlvbi5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnRCbG9jayggcmVkdWN0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50KCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgIHN0YXRlbWVudC5zZXRDU1ROb2RlKCByZWR1Y3Rpb24gKTsKLQotICAgICAgICAgICAgQmxvY2tTdGF0ZW1lbnQgYmxvY2sgPSBudWxsOwotICAgICAgICAgICAgaWYoIHN0YXRlbWVudCBpbnN0YW5jZW9mIEJsb2NrU3RhdGVtZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBibG9jayA9IChCbG9ja1N0YXRlbWVudClzdGF0ZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoIHN0YXRlbWVudCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYmxvY2s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYW55IHNlcmllcyBvZiBzdGF0ZW1lbnRzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldAotICAgICogIGFuZCBydW5uaW5nIHRvIHRoZSBlbmQgb2YgdGhlIENTVE5vZGUuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnRzKCBDU1ROb2RlIHJlZHVjdGlvbiwgaW50IGZpcnN0ICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgYmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKLQotICAgICAgICBmb3IoIGludCBpID0gZmlyc3Q7IGkgPCByZWR1Y3Rpb24uc2l6ZSgpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU1ROb2RlIHN0YXRlbWVudFJlZHVjdGlvbiA9IHJlZHVjdGlvbi5nZXQoaSk7Ci0KLSAgICAgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQoIHN0YXRlbWVudFJlZHVjdGlvbiApOwotICAgICAgICAgICAgc3RhdGVtZW50LnNldENTVE5vZGUoIHN0YXRlbWVudFJlZHVjdGlvbiApOwotCi0gICAgICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoIHN0YXRlbWVudCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhbnkgc3RhdGVtZW50IGJsb2NrLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50QmxvY2soIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudHMoIHJlZHVjdGlvbiwgMSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5zdGF0ZW1lbnQoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN0YXRlbWVudCBzdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ29udmVydCB0aGUgc3RhdGVtZW50Ci0KLSAgICAgICAgc3dpdGNoKCByZWR1Y3Rpb24uZ2V0TWVhbmluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0FTU0VSVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBhc3NlcnRTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQlJFQUs6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gYnJlYWtTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQ09OVElOVUU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gY29udGludWVTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfSUY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gaWZTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfUkVUVVJOOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHJldHVyblN0YXRlbWVudCggcmVkdWN0aW9uICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9TV0lUQ0g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3dpdGNoU3RhdGVtZW50KCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1NZTkNIUk9OSVpFRDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfVEhST1c6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhyb3dTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfVFJZOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRyeVN0YXRlbWVudCggcmVkdWN0aW9uICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9GT1I6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gZm9yU3RhdGVtZW50KCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1dISUxFOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHdoaWxlU3RhdGVtZW50KCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0RPOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGRvV2hpbGVTdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX0JMT0NLOgotICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX0NVUkxZX0JSQUNFOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudEJsb2NrKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5TWU5USF9MQUJFTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQoIHJlZHVjdGlvbi5nZXQoMSkgKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuc2V0U3RhdGVtZW50TGFiZWwoIGlkZW50aWZpZXIocmVkdWN0aW9uKSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX0NMT1NVUkU6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGV4cHJlc3Npb25TdGF0ZW1lbnQoIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHN0YXRlbWVudC5zZXRDU1ROb2RlKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIuYXNzZXJ0U3RhdGVtZW50KCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50KCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEJvb2xlYW5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgQm9vbGVhbkV4cHJlc3Npb24oIGV4cHJlc3Npb24ocmVkdWN0aW9uLmdldCgxKSkgKTsKLQotICAgICAgICBpZiggcmVkdWN0aW9uLmNoaWxkcmVuKCkgPiAxICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRTdGF0ZW1lbnQoIGV4cHJlc3Npb24sIGV4cHJlc3Npb24ocmVkdWN0aW9uLmdldCgyKSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0U3RhdGVtZW50KCBleHByZXNzaW9uLCBDb25zdGFudEV4cHJlc3Npb24uTlVMTCApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5icmVha1N0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQnJlYWtTdGF0ZW1lbnQgYnJlYWtTdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHJlZHVjdGlvbi5oYXNDaGlsZHJlbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudCggcmVkdWN0aW9uLmdldCgxKS5nZXRSb290VGV4dCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50KCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLmNvbnRpbnVlU3RhdGVtZW50KCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBDb250aW51ZVN0YXRlbWVudCBjb250aW51ZVN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGlmKCByZWR1Y3Rpb24uaGFzQ2hpbGRyZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGludWVTdGF0ZW1lbnQoIHJlZHVjdGlvbi5nZXQoMSkuZ2V0Um9vdFRleHQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb250aW51ZVN0YXRlbWVudCgpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5pZlN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBleHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50ICBib2R5ID0gc3RhdGVtZW50Qm9keSggcmVkdWN0aW9uLmdldCgyKSApOwotICAgICAgICBTdGF0ZW1lbnQgIGVsc2VCbG9jayA9IEVtcHR5U3RhdGVtZW50LklOU1RBTkNFOwotCi0gICAgICAgIGlmKCByZWR1Y3Rpb24uc2l6ZSgpID4gMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgZWxzZVJlZHVjdGlvbiA9IHJlZHVjdGlvbi5nZXQoMyk7Ci0gICAgICAgICAgICBpZiggZWxzZVJlZHVjdGlvbi5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuS0VZV09SRF9JRiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWxzZUJsb2NrID0gaWZTdGF0ZW1lbnQoIGVsc2VSZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbHNlQmxvY2sgPSBzdGF0ZW1lbnRCb2R5KCBlbHNlUmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IElmU3RhdGVtZW50KCBuZXcgQm9vbGVhbkV4cHJlc3Npb24oY29uZGl0aW9uKSwgYm9keSwgZWxzZUJsb2NrICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLnJldHVyblN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggcmVkdWN0aW9uLmhhc0NoaWxkcmVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudCggZXhwcmVzc2lvbihyZWR1Y3Rpb24uZ2V0KDEpKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFJldHVyblN0YXRlbWVudC5SRVRVUk5fTlVMTF9PUl9WT0lEOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5zd2l0Y2hTdGF0ZW1lbnQoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnQoIGV4cHJlc3Npb24ocmVkdWN0aW9uLmdldCgxKSkgKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMjsgaSA8IHJlZHVjdGlvbi5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgY2hpbGQgPSByZWR1Y3Rpb24uZ2V0KGkpOwotCi0gICAgICAgICAgICBzd2l0Y2goIGNoaWxkLmdldE1lYW5pbmcoKSApCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQ0FTRToKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmFkZENhc2UoIGNhc2VTdGF0ZW1lbnQoY2hpbGQpICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0RFRkFVTFQ6Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5zZXREZWZhdWx0U3RhdGVtZW50KCBzdGF0ZW1lbnRCbG9jayhjaGlsZCkgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJpbnZhbGlkIHNvbWV0aGluZyBpbiBzd2l0Y2ggWyIgKyBjaGlsZCArICJdIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIuc3dpdGNoU3RhdGVtZW50KCkgZm9yIGNhc2VzLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50KCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FzZVN0YXRlbWVudCggZXhwcmVzc2lvbihyZWR1Y3Rpb24uZ2V0KDEpKSwgc3RhdGVtZW50cyhyZWR1Y3Rpb24sIDIpICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLnN5bmNocm9uaXplZFN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgU3luY2hyb25pemVkU3RhdGVtZW50IHN5bmNocm9uaXplZFN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCggZXhwcmVzc2lvbihyZWR1Y3Rpb24uZ2V0KDEpKSwgc3RhdGVtZW50Qm9keShyZWR1Y3Rpb24uZ2V0KDIpKSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci50aHJvd1N0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaHJvd1N0YXRlbWVudCggZXhwcmVzc2lvbihyZWR1Y3Rpb24uZ2V0KDEpKSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci50cnlTdGF0ZW1lbnQoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRyeUNhdGNoU3RhdGVtZW50IHRyeVN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBCbG9ja1N0YXRlbWVudCAgICAgICAgIGJvZHkgPSBzdGF0ZW1lbnRCb2R5KCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IGZpbmFsbHlCbG9jayA9IHN0YXRlbWVudEJvZHkoIHJlZHVjdGlvbi5nZXQoMykgKTsKLQotICAgICAgICBUcnlDYXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgVHJ5Q2F0Y2hTdGF0ZW1lbnQoIGJvZHksIGZpbmFsbHlCbG9jayApOwotCi0gICAgICAgIENTVE5vZGUgY2F0Y2hlcyA9IHJlZHVjdGlvbi5nZXQoMik7Ci0gICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgY2F0Y2hlcy5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgICBlbGVtZW50ID0gY2F0Y2hlcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgICAgICAgdHlwZSA9IHJlc29sdmVOYW1lKCBlbGVtZW50LmdldCgxKSApOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyKCBlbGVtZW50LmdldCgyKSApOwotCi0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkQ2F0Y2goIG5ldyBDYXRjaFN0YXRlbWVudCh0eXBlLCBpZGVudGlmaWVyLCBzdGF0ZW1lbnRCb2R5KGVsZW1lbnQuZ2V0KDMpKSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLmZvclN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDU1ROb2RlIGhlYWRlciA9IHJlZHVjdGlvbi5nZXQoMSk7Ci0gICAgICAgIFN0YXRlbWVudCBib2R5ID0gc3RhdGVtZW50Qm9keSggcmVkdWN0aW9uLmdldCgyKSApOwotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgdGhlIGhlYWRlciBoYXMgdHlwZSBUeXBlcy5VTktOT1dOLCBpdCdzIGEgc3RhbmRhcmQgZm9yIGxvb3AuCi0KLSAgICAgICAgaWYoIGhlYWRlci5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuVU5LTk9XTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4cHJlc3Npb25bXSBpbml0ID0gZXhwcmVzc2lvbnMoIGhlYWRlci5nZXQoMSkgKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gICB0ZXN0ID0gZXhwcmVzc2lvbiggIGhlYWRlci5nZXQoMikgKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb25bXSBpbmNyID0gZXhwcmVzc2lvbnMoIGhlYWRlci5nZXQoMykgKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogc3RhbmRhcmQgZm9yIGxvb3AiICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIGZvciBlYWNoIGxvb3AuCi0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFR5cGUgICAgICAgICB0eXBlID0gdHlwZUV4cHJlc3Npb24oIGhlYWRlci5nZXQoMSkgKTsKLSAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gaWRlbnRpZmllciggIGhlYWRlci5nZXQoMikgKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gc291cmNlID0gZXhwcmVzc2lvbiggIGhlYWRlci5nZXQoMykgKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnQoIGlkZW50aWZpZXIsIHR5cGUsIHNvdXJjZSwgYm9keSApOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBSZWR1Y3Rpb24gcHJvZHVjZWQgYnkgUGFyc2VyLmRvV2hpbGVTdGF0ZW1lbnQoKS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIERvV2hpbGVTdGF0ZW1lbnQgZG9XaGlsZVN0YXRlbWVudCggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGV4cHJlc3Npb24oIHJlZHVjdGlvbi5nZXQoMikgKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgIGJvZHkgPSBzdGF0ZW1lbnRCb2R5KCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEb1doaWxlU3RhdGVtZW50KCBuZXcgQm9vbGVhbkV4cHJlc3Npb24oY29uZGl0aW9uKSwgYm9keSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci53aGlsZVN0YXRlbWVudCgpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBleHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50ICBib2R5ID0gc3RhdGVtZW50Qm9keSggcmVkdWN0aW9uLmdldCgyKSApOwotCi0gICAgICAgIHJldHVybiBuZXcgV2hpbGVTdGF0ZW1lbnQoIG5ldyBCb29sZWFuRXhwcmVzc2lvbihjb25kaXRpb24pLCBib2R5ICk7Ci0KLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRVhQUkVTU0lPTlMKLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYW55IGV4cHJlc3Npb24gdGhhdCBmb3JtcyBhIGNvbXBsZXRlIHN0YXRlbWVudC4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50KCBDU1ROb2RlIG5vZGUgKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoIGV4cHJlc3Npb24obm9kZSkgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBzZXJpZXMgb2YgZXhwcmVzc2lvbiB0byBhbiBFeHByZXNzaW9uW10uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uW10gZXhwcmVzc2lvbnMoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gbmV3IEV4cHJlc3Npb25bIHJlZHVjdGlvbi5jaGlsZHJlbigpIF07Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCByZWR1Y3Rpb24uc2l6ZSgpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHByZXNzaW9uc1tpLTFdID0gZXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldChpKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25zOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgQ1NUTm9kZSBwcm9kdWNlZCBieSBQYXJzZXIuZXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBleHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgaW50IHR5cGUgPSByZWR1Y3Rpb24uZ2V0TWVhbmluZ0FzKCBFWFBSRVNTSU9OX0hBTkRMRVJTICk7Ci0gICAgICAgIHN3aXRjaCggdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhFVElDOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBzeW50aGV0aWNFeHByZXNzaW9uKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5SQU5HRV9PUEVSQVRPUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGZyb20gPSBleHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiAgIHRvID0gZXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgyKSApOwotCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBSYW5nZUV4cHJlc3Npb24oIGZyb20sIHRvLCByZWR1Y3Rpb24uZ2V0TWVhbmluZygpID09IFR5cGVzLkRPVF9ET1QgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQ6Ci0gICAgICAgICAgICBjYXNlIFR5cGVzLklORklYX09QRVJBVE9SOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBpbmZpeEV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuUkVHRVhfUEFUVEVSTjogICAgIC8vICAgc2FtZSB0byBUeXBlcy5CSVRXSVNFX05FR0FUSU9OCi0gICAgICAgICAgICB7Ci0JCUNTVE5vZGUgICAgYm9keSAgICAgICA9IHJlZHVjdGlvbi5nZXQoMSk7Ci0JCVRva2VuICB0b2tlbiAgPSBib2R5LmdldFJvb3QoKTsKLQkJU3RyaW5nIHRleHQgICA9IGJvZHkuZ2V0Um9vdFRleHQoKTsKLQotICAgICAgICAgICAgICAgIGlmICggYm9keS5pc0EoVHlwZXMuU1lOVEhfR1NUUklORykgKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgUmVnZXhFeHByZXNzaW9uKCBleHByZXNzaW9uKHJlZHVjdGlvbi5nZXQoMSkpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQml0d2lzZU5lZ0V4cHJlc3Npb24oIGV4cHJlc3Npb24oYm9keSkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5QUkVGSVhfT1BFUkFUT1I6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHByZWZpeEV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuUE9TVEZJWF9PUEVSQVRPUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGJvZHkgPSBleHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbiggYm9keSwgcmVkdWN0aW9uLmdldFJvb3QoKSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU0lNUExFX0VYUFJFU1NJT046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHNpbXBsZUV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9ORVc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggInVuaGFuZGxlZCBDU1Q6IFsiICsgcmVkdWN0aW9uLnRvU3RyaW5nKCkgKyAiXSIgKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGV4cHJlc3Npb24gPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImV4cHJlc3Npb24gcHJvZHVjZWQgbnVsbDogWyIgKyByZWR1Y3Rpb24udG9TdHJpbmcoKSArICJdIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwcmVzc2lvbi5zZXRDU1ROb2RlKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEVYUFJFU1NJT05fSEFORExFUlMgPSB7Ci0gICAgICAgICAgVHlwZXMuU1lOVEhFVElDCi0gICAgICAgICwgVHlwZXMuUkFOR0VfT1BFUkFUT1IKLSAgICAgICAgLCBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUCi0gICAgICAgICwgVHlwZXMuSU5GSVhfT1BFUkFUT1IKLSAgICAgICAgLCBUeXBlcy5SRUdFWF9QQVRURVJOCi0gICAgICAgICwgVHlwZXMuUFJFRklYX09QRVJBVE9SCi0gICAgICAgICwgVHlwZXMuUE9TVEZJWF9PUEVSQVRPUgotICAgICAgICAsIFR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OCi0gICAgICAgICwgVHlwZXMuS0VZV09SRF9ORVcKLSAgICB9OwotCi0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgbW9zdCBpbmZpeCBvcGVyYXRvcnMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb247Ci0KLSAgICAgICAgaW50IHR5cGUgPSByZWR1Y3Rpb24uZ2V0TWVhbmluZygpOwotICAgICAgICBzd2l0Y2goIHR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFR5cGVzLkRPVDoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuTkFWSUdBVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWR1Y3Rpb24uZ2V0KDIpLmdldFJvb3RUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmKCBuYW1lLmVxdWFscygiY2xhc3MiKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDU1ROb2RlIG5vZGUgPSByZWR1Y3Rpb24uZ2V0KDEpOwotICAgICAgICAgICAgICAgICAgICBpZiggbm9kZS5pc0EoVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCkgJiYgbm9kZS5jaGlsZHJlbigpID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJOT1QgWUVUIElNUExFTUVOVEVEOiAuY2xhc3MgZm9yIGFycmF5IHR5cGVzIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dCA9IGNsYXNzRXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGNvbnRleHQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gZXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgUHJvcGVydHlFeHByZXNzaW9uKCBjb250ZXh0LCBuYW1lLCB0eXBlID09IFR5cGVzLk5BVklHQVRFICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0lOU1RBTkNFT0Y6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiAgIGxocyA9IGV4cHJlc3Npb24oICByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiAgIHJocyA9IGNsYXNzRXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgyKSApOwotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbiggbGhzLCByZWR1Y3Rpb24uZ2V0Um9vdCgpLCByaHMgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gbGhzID0gZXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gcmhzID0gZXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldCgyKSApOwotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbiggbGhzLCByZWR1Y3Rpb24uZ2V0Um9vdCgpLCByaHMgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBtb3N0IHByZWZpeCBvcGVyYXRvcnMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLSAgICAgICAgQ1NUTm9kZSAgICBib2R5ICAgICAgID0gcmVkdWN0aW9uLmdldCgxKTsKLQotICAgICAgICBpbnQgdHlwZSA9IHJlZHVjdGlvbi5nZXRNZWFuaW5nKCk7Ci0gICAgICAgIHN3aXRjaCggdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuUFJFRklYX01JTlVTOgotICAgICAgICAgICAgICAgIGlmKCBib2R5LnNpemUoKSA9PSAxICYmIGJvZHkuaXNBKFR5cGVzLk5VTUJFUikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG51bWVyaWNFeHByZXNzaW9uKCBib2R5LCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgTmVnYXRpb25FeHByZXNzaW9uKCBleHByZXNzaW9uKGJvZHkpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlBSRUZJWF9QTFVTOgotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKGJvZHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLk5PVDoKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IE5vdEV4cHJlc3Npb24oIGV4cHJlc3Npb24oYm9keSkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5CSVRXSVNFX05FR0FUSU9OOgotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQml0d2lzZU5lZ0V4cHJlc3Npb24oIGV4cHJlc3Npb24oYm9keSkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IFByZWZpeEV4cHJlc3Npb24oIHJlZHVjdGlvbi5nZXRSb290KCksIGV4cHJlc3Npb24oYm9keSkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBtb3N0IHNpbXBsZSBleHByZXNzaW9ucy4KLSAgICAqLwotCi0gICAgcHVibGljIEV4cHJlc3Npb24gc2ltcGxlRXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0gICAgICAgIGludCB0eXBlID0gcmVkdWN0aW9uLmdldE1lYW5pbmcoKTsKLSAgICAgICAgc3dpdGNoKCB0eXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX05VTEw6Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IENvbnN0YW50RXhwcmVzc2lvbi5OVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfVFJVRToKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gQ29uc3RhbnRFeHByZXNzaW9uLlRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9GQUxTRToKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gQ29uc3RhbnRFeHByZXNzaW9uLkZBTFNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNUUklORzoKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldFJvb3RUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5JTlRFR0VSX05VTUJFUjoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTF9OVU1CRVI6Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG51bWVyaWNFeHByZXNzaW9uKCByZWR1Y3Rpb24sIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9TVVBFUjoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9USElTOgotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSB2YXJpYWJsZUV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLklERU5USUZJRVI6Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHZhcmlhYmxlT3JDbGFzc0V4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgbnVtZXJpYyBsaXRlcmFscy4KLSAgICAqLwotCi0gICAgcHVibGljIEV4cHJlc3Npb24gbnVtZXJpY0V4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uLCBib29sZWFuIG5lZ2F0ZSApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuICB0b2tlbiAgPSByZWR1Y3Rpb24uZ2V0Um9vdCgpOwotICAgICAgICBTdHJpbmcgdGV4dCAgID0gcmVkdWN0aW9uLmdldFJvb3RUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBzaWduZWQgPSBuZWdhdGUgPyAiLSIgKyB0ZXh0IDogdGV4dDsKLQotICAgICAgICBib29sZWFuIGlzSW50ZWdlciA9ICh0b2tlbi5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuSU5URUdFUl9OVU1CRVIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgbnVtYmVyID0gaXNJbnRlZ2VyID8gTnVtYmVycy5wYXJzZUludGVnZXIoc2lnbmVkKSA6IE51bWJlcnMucGFyc2VEZWNpbWFsKHNpZ25lZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCBudW1iZXIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciggIm51bWVyaWMgbGl0ZXJhbCBbIiArIHNpZ25lZCArICJdIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlIGZvciBpdHMgdHlwZSIsIHRva2VuICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJ0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4iICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIG1vc3Qgc3ludGhldGljIGV4cHJlc3Npb25zLgotICAgICovCi0KLSAgICBwdWJsaWMgRXhwcmVzc2lvbiBzeW50aGV0aWNFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgaW50IHR5cGUgPSByZWR1Y3Rpb24uZ2V0TWVhbmluZygpOwotICAgICAgICBzd2l0Y2goIHR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX1RFUk5BUlk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbkV4cHJlc3Npb24gY29uZGl0aW9uICAgPSBuZXcgQm9vbGVhbkV4cHJlc3Npb24oIGV4cHJlc3Npb24ocmVkdWN0aW9uLmdldCgxKSkgKTsKLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uICAgICAgICB0cnVlQnJhbmNoICA9IGV4cHJlc3Npb24oIHJlZHVjdGlvbi5nZXQoMikgKTsKLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uICAgICAgICBmYWxzZUJyYW5jaCA9IGV4cHJlc3Npb24oIHJlZHVjdGlvbi5nZXQoMykgKTsKLQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgVGVybmFyeUV4cHJlc3Npb24oIGNvbmRpdGlvbiwgdHJ1ZUJyYW5jaCwgZmFsc2VCcmFuY2ggKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX0NBU1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc29sdmVOYW1lKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiAgYm9keSA9IGV4cHJlc3Npb24oICByZWR1Y3Rpb24uZ2V0KDIpICk7Ci0KLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IENhc3RFeHByZXNzaW9uKCBjbGFzc05hbWUsIGJvZHkgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlNZTlRIX1ZBUklBQkxFX0RFQ0xBUkFUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiggcmVkdWN0aW9uICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5TWU5USF9NRVRIT0RfQ0FMTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbWV0aG9kQ2FsbEV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfQ0xPU1VSRToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gY2xvc3VyZUV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfR1NUUklORzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gZ3N0cmluZ0V4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfTElTVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbGlzdEV4cHJlc3Npb24oIHJlZHVjdGlvbiApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU1lOVEhfTUFQOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBtYXBFeHByZXNzaW9uKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLQotICAgLyoqCi0gICAgKiAgQ29udmVydHMgYSAodHlwaWNhbGx5IElERU5USUZJRVIpIENTVE5vZGUgdG8gYSBDbGFzc0V4cHJlc3Npb24sIGlmIHZhbGlkLAotICAgICogIG9yIGEgVmFyaWFibGVFeHByZXNzaW9uIG90aGVyd2lzZS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdmFyaWFibGVPckNsYXNzRXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcmVzb2x2ZU5hbWUoIHJlZHVjdGlvbiwgZmFsc2UgKTsKLQotICAgICAgICBpZiggY2xhc3NOYW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmFyaWFibGVFeHByZXNzaW9uKCByZWR1Y3Rpb24gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NFeHByZXNzaW9uKCBjbGFzc05hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIENvbnZlcnRzIGEgQ1NUTm9kZSBpbnRvIGEgQ2xhc3NFeHByZXNzaW9uLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ2xhc3NFeHByZXNzaW9uIGNsYXNzRXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVOYW1lKCByZWR1Y3Rpb24sIHRydWUgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0V4cHJlc3Npb24oIG5hbWUgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBDb252ZXJ0cyBhICh0eXBpY2FsbHkgSURFTlRJRklFUikgQ1NUTm9kZSB0byBhIFZhcmlhYmxlRXhwcmVzc2lvbiwgaWYKLSAgICAqICB2YWxpZC4KLSAgICAqLwotCi0gICBwcm90ZWN0ZWQgVmFyaWFibGVFeHByZXNzaW9uIHZhcmlhYmxlRXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKQotICAgewotICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0Um9vdFRleHQoKSwgbnVsbCApOwotICAgfQotCi0gICAgcHJvdGVjdGVkIFZhcmlhYmxlRXhwcmVzc2lvbiB2YXJpYWJsZUV4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uLCBTdHJpbmcgdHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlRXhwcmVzc2lvbiggcmVkdWN0aW9uLmdldFJvb3RUZXh0KCksIHR5cGUgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBDb252ZXJ0cyBhbiAocG9zc2libHkgb3B0aW9uYWwpIHR5cGUgZXhwcmVzc2lvbiB0byBhIFR5cGUuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUeXBlIHR5cGVFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IG1ha2VOYW1lKCByZWR1Y3Rpb24sIG51bGwgKTsKLSAgICAgICAgaWYoIG5hbWUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUeXBlLkRZTkFNSUNfVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZSggcmVzb2x2ZU5hbWUobmFtZSwgdHJ1ZSkgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IHBhcnNpbmcgYSB0eXBlZCB2YXJpYWJsZQotICAgICogIGRlY2xhcmF0aW9uLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiggQ1NUTm9kZSByZWR1Y3Rpb24gKSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdHlwZSA9IHJlc29sdmVOYW1lKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBURU1QT1JBUlkgVU5USUwgR0VORVJBTCBTVVBQT1JUIElOIFBMQUNFCi0KLSAgICAgICAgaWYoIHJlZHVjdGlvbi5zaXplKCkgPT0gMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgbm9kZSA9IHJlZHVjdGlvbi5nZXQoMik7Ci0KLSAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiBuYW1lID0gdmFyaWFibGVFeHByZXNzaW9uKCBub2RlLCB0eXBlICk7Ci0gICAgICAgICAgICAvL25hbWUuc2V0VHlwZSggdHlwZSApOwotCi0gICAgICAgICAgICBUb2tlbiBzeW1ib2wgPSBUb2tlbi5uZXdTeW1ib2woIFR5cGVzLkVRVUFMLCAtMSwgLTEgKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKCBuYW1lLCBzeW1ib2wsIGV4cHJlc3Npb24obm9kZS5nZXQoMSkpICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggIk5PVCBZRVQgSU1QTEVNRU5URUQ6IGdlbmVyYWxpemVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyIgKTsKLQotICAgICAgICAvKgotCi0gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oIHR5cGUgKTsKLQotICAgICAgICBmb3IoIGkgPSAyOyBpIDwgcmVkdWN0aW9uLnNpemUoKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ1NUTm9kZSBub2RlID0gcmVkdWN0aW9uLmdldChpKTsKLSAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFkZCggbm9kZS5nZXQoMCksIGV4cHJlc3Npb24obm9kZS5nZXQoMSkpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLQotICAgICAgICAqLwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIFNZTlRIX01FVEhPRF9DQUxMIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIuZXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kQ2FsbEV4cHJlc3Npb24gbWV0aG9kQ2FsbEV4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTWV0aG9kQ2FsbEV4cHJlc3Npb24gY2FsbCA9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbmFtZSBhbmQgY29udGV4dCBvZiB0aGUgbWV0aG9kIGNhbGwuCi0KLSAgICAgICAgQ1NUTm9kZSBkZXNjcmlwdG9yID0gcmVkdWN0aW9uLmdldCgxKTsKLSAgICAgICAgRXhwcmVzc2lvbiBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiAgIGltcGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyAgICAgIG1ldGhvZCA9ICJjYWxsIjsKLSAgICAgICAgYm9vbGVhbiAgICAgICBzYWZlID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IHR5cGUgPSBkZXNjcmlwdG9yLmdldE1lYW5pbmcoKTsKLSAgICAgICAgc3dpdGNoKCB0eXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1NVUEVSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQgID0gdmFyaWFibGVFeHByZXNzaW9uKCBkZXNjcmlwdG9yICk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kICAgPSBpZGVudGlmaWVyKCBkZXNjcmlwdG9yICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9USElTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQgID0gVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTjsKLSAgICAgICAgICAgICAgICBtZXRob2QgICA9IGlkZW50aWZpZXIoIGRlc2NyaXB0b3IgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5JREVOVElGSUVSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQgID0gVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTjsKLSAgICAgICAgICAgICAgICBtZXRob2QgICA9IGlkZW50aWZpZXIoIGRlc2NyaXB0b3IgKTsKLSAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuRE9UOgotICAgICAgICAgICAgY2FzZSBUeXBlcy5OQVZJR0FURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gZXhwcmVzc2lvbiggZGVzY3JpcHRvci5nZXQoMSkgKTsKLSAgICAgICAgICAgICAgICBtZXRob2QgID0gaWRlbnRpZmllciggZGVzY3JpcHRvci5nZXQoMikgKTsKLSAgICAgICAgICAgICAgICBzYWZlICAgID0gdHlwZSA9PSBUeXBlcy5OQVZJR0FURTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gZXhwcmVzc2lvbiggZGVzY3JpcHRvciApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBBbmQgYnVpbGQgdGhlIGV4cHJlc3Npb24KLQotICAgICAgICBFeHByZXNzaW9uIHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJMaXN0KCByZWR1Y3Rpb24uZ2V0KDIpICk7Ci0KLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAibWV0aG9kIGNhbGwgZXhwcmVzc2lvbjogIiArIGNvbnRleHQgKyAiLCAiICsgbWV0aG9kICsgIiwgIiArIHBhcmFtZXRlcnMgKyAiLCAiICsgaW1wbGljaXQgKTsKLQotICAgICAgICBjYWxsID0gbmV3IE1ldGhvZENhbGxFeHByZXNzaW9uKCBjb250ZXh0LCBtZXRob2QsIHBhcmFtZXRlcnMgKTsKLSAgICAgICAgY2FsbC5zZXRJbXBsaWNpdFRoaXMoIGltcGxpY2l0ICk7Ci0gICAgICAgIGNhbGwuc2V0U2FmZSggc2FmZSApOwotCi0gICAgICAgIHJldHVybiBjYWxsOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5jbG9zdXJlRXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ2xvc3VyZUV4cHJlc3Npb24gY2xvc3VyZUV4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xvc3VyZUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRlY2xhcmF0aW9ucyggcmVkdWN0aW9uLmdldCgxKSApOwotICAgICAgICBleHByZXNzaW9uID0gbmV3IENsb3N1cmVFeHByZXNzaW9uKCBwYXJhbWV0ZXJzLCBzdGF0ZW1lbnRCbG9jayhyZWR1Y3Rpb24uZ2V0KDIpKSApOwotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5wYXJhbWV0ZXJMaXN0KCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHBhcmFtZXRlckxpc3QoIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVHVwbGVFeHByZXNzaW9uIGxpc3QgPSBuZXcgVHVwbGVFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCByZWR1Y3Rpb24uc2l6ZSgpOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU1ROb2RlIG5vZGUgPSByZWR1Y3Rpb24uZ2V0KGkpOwotICAgICAgICAgICAgbGlzdC5hZGRFeHByZXNzaW9uKCBleHByZXNzaW9uKG5vZGUpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIubmV3RXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgICAgIENTVE5vZGUgICAgICB0eXBlTm9kZSA9IHJlZHVjdGlvbi5nZXQoMSk7Ci0gICAgICAgIFN0cmluZyAgICAgICAgICAgdHlwZSA9IHJlc29sdmVOYW1lKCB0eXBlTm9kZSApOwotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQXJyYXkgdHlwZXMgaGF2ZSBkaW1lbnNpb24gYW5kIGluaXRpYWxpemF0aW9uIGRhdGEgdG8gaGFuZGxlLgotCi0gICAgICAgIGlmKCB0eXBlTm9kZS5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgZGltZW5zaW9ucyA9IHJlZHVjdGlvbi5nZXQoMik7Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBCVUc6IGF0IHByZXNlbnQsIEFycmF5RXhwcmVzc2lvbiBleHBlY3RzIGEgc2NhbGFyIHR5cGUgYW5kCi0gICAgICAgICAgICAvLyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEluIGZ1dHVyZSwgdGhlCi0gICAgICAgICAgICAvLyB0aGUgbGF0dGVyIHdpbGwgbmVlZCB0byBjaGFuZ2UsIGFuZCB0aGF0IG1heSByZXF1aXJlIHRoZQotICAgICAgICAgICAgLy8gZm9ybWVyIHRvIGNoYW5nZSwgYXMgd2VsbC4gIEZvciBub3csIHdlIGNhbGN1bGF0ZSB0aGUgc2NhbGFyCi0gICAgICAgICAgICAvLyB0eXBlIGFuZCBlcnJvciBmb3IgbXVsdGlwbGUgZGltZW5zaW9ucy4KLQotICAgICAgICAgICAgaWYoIHR5cGVOb2RlLmdldCgxKS5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogbXVsdGlkaW1lbnNpb25hbCBhcnJheXMiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IHJlc29sdmVOYW1lKCB0eXBlTm9kZS5nZXQoMSkgKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGRpbWVuc2lvbnMsIHByb2Nlc3MgYSB0dXBsZSBpbml0aWFsaXplcgotCi0gICAgICAgICAgICBpZiggZGltZW5zaW9ucy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENTVE5vZGUgZGF0YSA9IHJlZHVjdGlvbi5nZXQoMyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZGF0YS5nZXQoMSwgdHJ1ZSkuZ2V0TWVhbmluZygpID09IFR5cGVzLlNZTlRIX1RVUExFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggIk5PVCBZRVQgSU1QTEVNRU5URUQ6IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQXJyYXlFeHByZXNzaW9uKCB0eXBlLCB0dXBsZUV4cHJlc3Npb24oZGF0YSkuZ2V0RXhwcmVzc2lvbnMoKSApOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgdGhlIGRpbWVuc2lvbnMKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBkaW1lbnNpb25zLnNpemUoKSA+IDIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiTk9UIFlFVCBJTVBMRU1FTlRFRDogbXVsdGlkaW1lbnNpb25hbCBhcnJheXMiICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLQotICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IEFycmF5RXhwcmVzc2lvbiggdHlwZSwgdHVwbGVFeHByZXNzaW9uKGRpbWVuc2lvbnMpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBBcnJheUV4cHJlc3Npb24oIHR5cGUsIGV4cHJlc3Npb24oZGltZW5zaW9ucy5nZXQoMSkpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBTY2FsYXIgdHlwZXMgaGF2ZSBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0IGFuZCBwb3NzaWJseSBhIHR5cGUgYm9keQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVyTGlzdCggcmVkdWN0aW9uLmdldCgyKSApOwotCi0gICAgICAgICAgICBpZiggcmVkdWN0aW9uLnNpemUoKSA+IDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggIk5PVCBZRVQgSU1QTEVNRU5URUQ6IGFub255bW91cyBjbGFzc2VzIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oIHR5cGUsIHBhcmFtZXRlcnMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5uZXdBcnJheUluaXRpYWxpemVyKCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUdXBsZUV4cHJlc3Npb24gdHVwbGVFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFR1cGxlRXhwcmVzc2lvbiB0dXBsZSA9IG5ldyBUdXBsZUV4cHJlc3Npb24oKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IHJlZHVjdGlvbi5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgZWxlbWVudCA9IHJlZHVjdGlvbi5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE1lYW5pbmcoKSA9PSBUeXBlcy5TWU5USF9UVVBMRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHVwbGUuYWRkRXhwcmVzc2lvbiggdHVwbGVFeHByZXNzaW9uKGVsZW1lbnQpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHVwbGUuYWRkRXhwcmVzc2lvbiggZXhwcmVzc2lvbihlbGVtZW50KSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR1cGxlOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyB0aGUgUmVkdWN0aW9uIHByb2R1Y2VkIGJ5IFBhcnNlci5nc3RyaW5nKCkuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGdzdHJpbmdFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCAhcmVkdWN0aW9uLmhhc0NoaWxkcmVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbiggIiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCByZWR1Y3Rpb24uY2hpbGRyZW4oKSA9PSAxICYmIHJlZHVjdGlvbi5nZXQoMSkuZ2V0TWVhbmluZygpID09IFR5cGVzLlNUUklORyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uKCByZWR1Y3Rpb24uZ2V0KDEpICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEdTdHJpbmdFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgR1N0cmluZ0V4cHJlc3Npb24oIHJlZHVjdGlvbi5nZXRSb290VGV4dCgpICk7Ci0gICAgICAgIGJvb2xlYW4gbGFzdFdhc0V4cHJlc3Npb24gPSBmYWxzZTsKLQotICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IHJlZHVjdGlvbi5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgZWxlbWVudCA9IHJlZHVjdGlvbi5nZXQoaSk7Ci0gICAgICAgICAgICBpZiggZWxlbWVudC5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuU1RSSU5HICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gc3RyaW5nID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbiggZWxlbWVudC5nZXRSb290VGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLnNldENTVE5vZGUoIGVsZW1lbnQgKTsKLQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uYWRkU3RyaW5nKCBzdHJpbmcgKTsKLQotICAgICAgICAgICAgICAgIGxhc3RXYXNFeHByZXNzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGxhc3RXYXNFeHByZXNzaW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uYWRkU3RyaW5nKCBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCIiKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RXYXNFeHByZXNzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLmFkZFZhbHVlKCBlbGVtZW50LmlzRW1wdHkoKSA/IENvbnN0YW50RXhwcmVzc2lvbi5OVUxMIDogZXhwcmVzc2lvbihlbGVtZW50KSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIG9uZSBvZiB0aGUgUmVkdWN0aW9ucyBwcm9kdWNlZCBieSBQYXJzZXIubGlzdE9yTWFwRXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTGlzdEV4cHJlc3Npb24gbGlzdEV4cHJlc3Npb24oIENTVE5vZGUgcmVkdWN0aW9uICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24gbGlzdCA9IG5ldyBMaXN0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgcmVkdWN0aW9uLnNpemUoKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdC5hZGRFeHByZXNzaW9uKCBleHByZXNzaW9uKHJlZHVjdGlvbi5nZXQoaSkpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIG90aGVyIFJlZHVjdGlvbiBwcm9kdWNlZCBieSBQYXJzZXIubGlzdE9yTWFwRXhwcmVzc2lvbigpLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTWFwRXhwcmVzc2lvbiBtYXBFeHByZXNzaW9uKCBDU1ROb2RlIHJlZHVjdGlvbiApIHRocm93cyBQYXJzZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcEV4cHJlc3Npb24gbWFwID0gbmV3IE1hcEV4cHJlc3Npb24oKTsKLQotICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IHJlZHVjdGlvbi5zaXplKCk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTVE5vZGUgIGVsZW1lbnQgPSByZWR1Y3Rpb24uZ2V0KGkpOwotICAgICAgICAgICAgRXhwcmVzc2lvbiAgIGtleSA9IGV4cHJlc3Npb24oIGVsZW1lbnQuZ2V0KDEpICk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIHZhbHVlID0gZXhwcmVzc2lvbiggZWxlbWVudC5nZXQoMikgKTsKLQotICAgICAgICAgICAgbWFwLmFkZE1hcEVudHJ5RXhwcmVzc2lvbigga2V5LCB2YWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBOQU1JTkcKLQotCi0gICAgLyoqCi0gICAgKiAgQ29udmVydHMgYSBDU1ROb2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSBuYW1lIGJhY2sgaW50bwotICAgICogIGEgc3RyaW5nLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ha2VOYW1lKCBDU1ROb2RlIHJvb3QsIFN0cmluZyBkZWZhdWx0TmFtZSApCi0gICAgewotICAgICAgICBpZiggcm9vdCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgc3dpdGNoKCByb290LmdldE1lYW5pbmcoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbWFrZU5hbWUoIHJvb3QuZ2V0KDEpICkgKyAiW10iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLkRPVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDU1ROb2RlIG5vZGUgPSByb290OwotICAgICAgICAgICAgICAgIHdoaWxlKCBub2RlLmlzQShUeXBlcy5ET1QpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiLiIgKyBub2RlLmdldCgyKS5nZXRSb290VGV4dCgpICsgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0KDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5hbWUgPSBub2RlLmdldFJvb3RUZXh0KCkgKyBuYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLlVOS05PV046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGRlZmF1bHROYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSByb290LmdldFJvb3RUZXh0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+bWFrZU5hbWUoIHJvb3QsICJqYXZhLmxhbmcuT2JqZWN0IiApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlTmFtZSggQ1NUTm9kZSByb290ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYWtlTmFtZSggcm9vdCwgIiIgKTsgLy8gYnI6IHRoZSBkZWZhdWx0IG5hbWUuIHdhcyAiamF2YS5sYW5nLk9iamVjdCIKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSB0ZXh0IG9mIGFuIGlkZW50aWZpZXIuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgaWRlbnRpZmllciggQ1NUTm9kZSBpZGVudGlmaWVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpZGVudGlmaWVyLmdldFJvb3RUZXh0KCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqICBCdWlsZHMgYSBuYW1lIGZyb20gYSBDU1ROb2RlLCB0aGVuIHJlc29sdmVzIGl0LiAgUmV0dXJucyB0aGUgcmVzb2x2ZWQgbmFtZQotICAgICogIGlmIGF2YWlsYWJsZSwgb3IgbnVsbCwgdW5sZXNzIHNhZmUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBidWlsdCBuYW1lCi0gICAgKiAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsLgotICAgICoKLSAgICAqICBAdG9kbyB3ZSBzaG91bGQgYWN0dWFsbHkgcmVtb3ZlIGFsbCByZXNvbHZpbmcgY29kZSBmcm9tIHRoZSBBU1RCdWlsZGVyIGFuZAotICAgICogICAgICAgIG1vdmUgaXQgaW50byB0aGUgdmVyaWZpZXIgLyBhbmFseXNlcgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOYW1lKCBDU1ROb2RlIHJvb3QsIGJvb2xlYW4gc2FmZSApCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IG1ha2VOYW1lKCByb290ICk7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByZXNvbHZlTmV3Q2xhc3NPck5hbWUobmFtZSwgc2FmZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPnJlc29sdmVOYW1lKCByb290LCB0cnVlICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOYW1lKCBDU1ROb2RlIHJvb3QgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVOYW1lKCByb290LCB0cnVlICk7Ci0gICAgfQotCi0KLQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQVNNIFNVUFBPUlQKLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBBU00gQ29uc3RhbnQgYml0cyBmb3IgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBpbnQgbW9kaWZpZXJzKCBDU1ROb2RlIGxpc3QgKQotICAgIHsKLSAgICAgICAgaW50IG1vZGlmaWVycyA9IDA7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCBsaXN0LnNpemUoKTsgKytpICkKLSAgICAgICAgewotICAgICAgICAgICAgU1dJVENIOiBzd2l0Y2goIGxpc3QuZ2V0KGkpLmdldE1lYW5pbmcoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1BVQkxJQzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX1BVQkxJQzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9QUk9URUNURUQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gQ29uc3RhbnRzLkFDQ19QUk9URUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfUFJJVkFURToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX1BSSVZBVEU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9BQlNUUkFDVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX0FCU1RSQUNUOwotICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0ZJTkFMOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzIHw9IENvbnN0YW50cy5BQ0NfRklOQUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfTkFUSVZFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzIHw9IENvbnN0YW50cy5BQ0NfTkFUSVZFOwotICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1RSQU5TSUVOVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX1RSQU5TSUVOVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9WT0xBVElMRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX1ZPTEFUSUxFOwotICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfU1lOQ0hST05JWkVEOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzIHw9IENvbnN0YW50cy5BQ0NfU1lOQ0hST05JWkVEOwotICAgICAgICAgICAgICAgICAgICBicmVhayBTV0lUQ0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9TVEFUSUM6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gQ29uc3RhbnRzLkFDQ19TVEFUSUM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgbm90IHByb3RlY3RlZCBvciBwcml2YXRlIHdlIGRlZmF1bHQgdG8gcHVibGljLgotCi0gICAgICAgIGlmKCAobW9kaWZpZXJzICYgKENvbnN0YW50cy5BQ0NfUFJPVEVDVEVEIHwgQ29uc3RhbnRzLkFDQ19QUklWQVRFKSkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGlmaWVycyB8PSBDb25zdGFudHMuQUNDX1BVQkxJQzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2RpZmllcnM7Ci0gICAgfQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVSUk9SIEhBTkRMSU5HCi0KLQotICAgLyoqCi0gICAgKiAgVGhyb3dzIGEgPGNvZGU+UGFyc2VyRXhjZXB0aW9uPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXJyb3IoIFN0cmluZyBkZXNjcmlwdGlvbiwgQ1NUTm9kZSBub2RlICkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlckV4Y2VwdGlvbiggZGVzY3JpcHRpb24sIG5vZGUuZ2V0Um9vdCgpICk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0Fic3RyYWN0VG9rZW5TdHJlYW0uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0Fic3RyYWN0VG9rZW5TdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNzQ5Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9BYnN0cmFjdFRva2VuU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuTWlzbWF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7Ci0KLQotLyoqCi0gKiAgUHJvdmlkZXMgdGhlIGNvbW1vbiBjb2RlIGZvciA8Y29kZT57QGxpbmsgVG9rZW5TdHJlYW19PC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VG9rZW5TdHJlYW0KLSAgICBpbXBsZW1lbnRzIFRva2VuU3RyZWFtCi17Ci0gICAgcHJpdmF0ZSBUb2tlbltdIGJ1ZjsgICAgICAgICAgICAgLy8gQSBjaXJjdWxhciBidWZmZXIgb2YgdG9rZW5zCi0gICAgcHJpdmF0ZSBpbnQgZmlyc3Q7ICAgICAgICAgICAgICAgLy8gbGEoMSkgcG9pbnRzIHRvIHRoaXMgb2Zmc2V0IGludG8gYnVmCi0gICAgcHJpdmF0ZSBpbnQgYXZhaWw7ICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhaGVhZCB0b2tlbnMgaW4gYnVmCi0KLSAgICBwcml2YXRlIGludCBjaGVja3BvaW50X2ZpcnN0OyAgICAvLyBsYXN0IGNoZWNrcG9pbnQoKSBjb3B5IG9mIGZpcnN0Ci0gICAgcHJpdmF0ZSBpbnQgY2hlY2twb2ludF9hdmFpbDsgICAgLy8gbGFzdCBjaGVja3BvaW50KCkgY29weSBvZiBhdmFpbAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlTG9jYXRvcjsgICAgLy8gQSBkZXNjcmlwdG9yIG9mIHRoZSBzb3VyY2Ugb2YgdGhlIHN0cmVhbQotCi0KLSAgIC8qKgotICAgICogIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgKi8KLQotICAgIHB1YmxpYyBBYnN0cmFjdFRva2VuU3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIHRoaXMoICI8dW5rbm93bj4iICk7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogIEluaXRpYWxpemVzIHRoZSBzdHJlYW0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlLgotICAgICovCi0KLSAgICBwdWJsaWMgQWJzdHJhY3RUb2tlblN0cmVhbShTdHJpbmcgc291cmNlTG9jYXRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuYnVmICAgICAgICAgICA9IG5ldyBUb2tlbls4ICogMTAyNF07Ci0gICAgICAgIHRoaXMuZmlyc3QgICAgICAgICA9IC0xOwotICAgICAgICB0aGlzLmF2YWlsICAgICAgICAgPSAwOwotICAgICAgICB0aGlzLnNvdXJjZUxvY2F0b3IgPSBzb3VyY2VMb2NhdG9yOwotICAgIH0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZSAodHlwaWNhbGx5IGEgZmlsZSBuYW1lKS4KLSAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VMb2NhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUxvY2F0b3I7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogIEltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHN1YnR5cGVzLCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG5leHQKLSAgICAqICB0b2tlbiBpbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUb2tlbiBuZXh0VG9rZW4oKQotICAgICAgICB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgU3ludGF4RXhjZXB0aW9uOwotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSB3aXRob3V0IGNvbnN1bWluZyBpdC4KLSAgICAqLwotCi0gICAgcHVibGljIFRva2VuIGxhKCkKLSAgICAgICAgdGhyb3dzIFJlYWRFeGNlcHRpb24sIFN5bnRheEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhKCAxICk7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIDxjb2RlPms8L2NvZGU+dGggdG9rZW4gaW4gdGhlIHN0cmVhbSB3aXRob3V0IGNvbnN1bWluZwotICAgICogIGl0IChvciBhbnkgb3RoZXIgdW5jb25zdW1lZCB0b2tlbnMpLgotICAgICovCi0KLSAgICBwdWJsaWMgVG9rZW4gbGEoaW50IGspCi0gICAgICAgIHRocm93cyBSZWFkRXhjZXB0aW9uLCBTeW50YXhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggayA+IGJ1Zi5sZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJMb29rYWhlYWQgWyIgKyBrICsgIl0gaXMgbGFyZ2VyIHRoYW4gbG9va2FoZWFkIGJ1ZmZlciBbIiArIGJ1Zi5sZW5ndGggKyAiXSIgKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCByZWFkIG1vcmUgdG9rZW5zIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotCi0gICAgICAgIGlmICggayA+IHRoaXMuYXZhaWwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbnVtVG9Qb3B1bGF0ZSA9IGsgLSB0aGlzLmF2YWlsOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbnVtVG9Qb3B1bGF0ZSA7ICsraSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCB0aGlzLmZpcnN0IDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHBvcCA9ICggKCB0aGlzLmZpcnN0ICsgdGhpcy5hdmFpbCApICUgdGhpcy5idWYubGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgdGhpcy5idWZbIHBvcCBdID0gbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgKyt0aGlzLmF2YWlsOwotICAgICAgICAgICAgICAgICsrdGhpcy5jaGVja3BvaW50X2F2YWlsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcXVlc3RlZCB0b2tlbi4KLQotICAgICAgICBpbnQgcG9zID0gKCAoIGsgKyB0aGlzLmZpcnN0IC0gMSApICUgdGhpcy5idWYubGVuZ3RoICk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnVmWyBwb3MgXTsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiAgUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHN0cmVhbSwgcHJvdmlkZWQgaXQKLSAgICAqICBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAqLwotCi0gICAgcHVibGljIFRva2VuIGNvbnN1bWUoaW50IHR5cGUpCi0gICAgICAgIHRocm93cyBSZWFkRXhjZXB0aW9uLCBTeW50YXhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gbGEoKTsKLQotICAgICAgICBpZiggdG9rZW4gPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICF0b2tlbi5pc0EodHlwZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVG9rZW5NaXNtYXRjaEV4Y2VwdGlvbiggdG9rZW4sIHR5cGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgICsrdGhpcy5maXJzdDsKLSAgICAgICAgLS10aGlzLmF2YWlsOwotCi0gICAgICAgIHRoaXMuZmlyc3QgJT0gdGhpcy5idWYubGVuZ3RoOwotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgc3RyZWFtLCBwcm92aWRlZCBpdAotICAgICogIGlzbid0IHRoZSBFT0YuCi0gICAgKi8KLQotICAgIHB1YmxpYyBUb2tlbiBjb25zdW1lKCkgdGhyb3dzIFJlYWRFeGNlcHRpb24sIFN5bnRheEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWUoIFR5cGVzLk5PVF9FT0YgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTYXZlcyB0aGUgbG9vay1haGVhZCBzdGF0ZSBmb3IgPGNvZGU+cmVzdG9yZSgpPC9jb2RlPmluZyBsYXRlci4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgY2hlY2twb2ludCgpIHsKLSAgICAgICAgY2hlY2twb2ludF9maXJzdCA9IGZpcnN0OwotICAgICAgICBjaGVja3BvaW50X2F2YWlsID0gYXZhaWw7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogIFJlc3RvcmVzIHRoZSBsb29rLWFoZWFkIHN0YXRlIHNhdmVkIGJ5IDxjb2RlPmNoZWNrcG9pbnQoKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0gICAgICAgIGZpcnN0ID0gY2hlY2twb2ludF9maXJzdDsKLSAgICAgICAgYXZhaWwgPSBjaGVja3BvaW50X2F2YWlsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgb3V0IG9mIHRva2Vucy4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGF0RW5kKCBib29sZWFuIGlnbm9yaW5nV2hpdGVzcGFjZSApIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IG9mZnNldCA9IDE7Ci0KLSAgICAgICAgICAgIGlmKCBpZ25vcmluZ1doaXRlc3BhY2UgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGxhKG9mZnNldCkuaXNBKFR5cGVzLk5FV0xJTkUpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGxhKG9mZnNldCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7fQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgc3lub255bSBmb3IgPGNvZGU+YXRFbmQodHJ1ZSk8L2NvZGU+LgotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gYXRFbmQoKSB7Ci0gICAgICAgIHJldHVybiBhdEVuZCh0cnVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0NsYXNzaWNQYXJzZXJQbHVnaW4uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0NsYXNzaWNQYXJzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlNjRmMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9DbGFzc2ljUGFyc2VyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCBKYW1lcyBTdHJhY2hhbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWR1Y3Rpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyLlRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyLkdyb292eUxleGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyLkxleGVyVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuUmVhZGVyQ2hhclN0cmVhbTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuUGFyc2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5BU1RCdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5QYXJzZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NpY1BhcnNlclBsdWdpbiBpbXBsZW1lbnRzIFBhcnNlclBsdWdpbiB7Ci0KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gcGFyc2VDU1QoU291cmNlVW5pdCBzb3VyY2VVbml0LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gewotICAgICAgICAvLwotICAgICAgICAvLyBDcmVhdGUgYSBsZXhlciBhbmQgdG9rZW4gc3RyZWFtCi0KLSAgICAgICAgR3Jvb3Z5TGV4ZXIgbGV4ZXIgPSBuZXcgR3Jvb3Z5TGV4ZXIobmV3IFJlYWRlckNoYXJTdHJlYW0ocmVhZGVyKSk7Ci0gICAgICAgIFRva2VuU3RyZWFtIHN0cmVhbSA9IG5ldyBMZXhlclRva2VuU3RyZWFtKGxleGVyKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBEbyB0aGUgcGFyc2luZwotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihzb3VyY2VVbml0LCBzdHJlYW0pOwotICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZU5vZGUgYnVpbGRBU1QoU291cmNlVW5pdCBzb3VyY2VVbml0LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgUmVkdWN0aW9uIGNzdCkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBU1RCdWlsZGVyKCBzb3VyY2VVbml0LCBjbGFzc0xvYWRlciApOwotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCggY3N0ICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQ2xhc3NpY1BhcnNlclBsdWdpbkZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0NsYXNzaWNQYXJzZXJQbHVnaW5GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOGY4MjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQ2xhc3NpY1BhcnNlclBsdWdpbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICoKLSAqIENvcHlyaWdodCAyMDA0IEphbWVzIFN0cmFjaGFuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5DbGFzc2ljUGFyc2VyUGx1Z2luOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5QYXJzZXJQbHVnaW5GYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5QYXJzZXJQbHVnaW47Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NpY1BhcnNlclBsdWdpbkZhY3RvcnkgZXh0ZW5kcyBQYXJzZXJQbHVnaW5GYWN0b3J5IHsKLQotICAgIHB1YmxpYyBQYXJzZXJQbHVnaW4gY3JlYXRlUGFyc2VyUGx1Z2luKCkgewotICAgICAgICByZXR1cm4gbmV3IENsYXNzaWNQYXJzZXJQbHVnaW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9FeHByZXNzaW9uU3RhY2suamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0V4cHJlc3Npb25TdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgxN2E0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0V4cHJlc3Npb25TdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguKjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOwotCi0KLQotLyoqCi0gKiAgQSBjb21iaW5hdGlvbiBzdGFjayBhbmQgaGVscGVyIGNsYXNzIGZvciBwYXJzaW5nIGdyb292eSBleHByZXNzaW9uLgotICogIDxwPgotICogIEV4cHJlc3Npb25zIGFyZSBhIGxpdHRsZSB0cmlja2llciB0byBwYXJzZSB0aGFuIHRoZSBzdGF0ZW1lbnRzIGFib3ZlLgotICogIEFzIGEgcmVzdWx0LCB3ZSBhcmUgbm93IGRvaW5nIGEgaHlicmlkIExML0xSIHBhcnNlIGF0IHRoZSBleHByZXNzaW9uCi0gKiAgbGV2ZWwuCi0gKgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblN0YWNrCi17Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgc3RhY2sgID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgUGFyc2VyICAgIHBhcnNlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgb3BlbiAgID0gMDsKLQotCi0gICAgRXhwcmVzc2lvblN0YWNrKCBQYXJzZXIgY29udGV4dCApCi0gICAgewotICAgICAgICB0aGlzLnBhcnNlciA9IGNvbnRleHQ7Ci0gICAgfQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBQUklNQVJZIE9QRVJBVElPTlMKLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHN0YWNrIGlzIGVtcHR5LgotICAgICovCi0KLSAgICBib29sZWFuIGlzRW1wdHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YWNrLmlzRW1wdHkoKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHN0YWNrIGlzIGluIGEgc3RhdGUgdGhhdCBjYW4gYmUgY29uc2lkZXJlZAotICAgICogIGEgY29tcGxldGUgZXhwcmVzc2lvbiwgcHJvdmlkZWQgbG9va2FoZWFkIGlzIGFtZW5hYmxlLCBvZiBjb3Vyc2UuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAxICYmIHRvcElzQW5FeHByZXNzaW9uKCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBzdGFjayBjYW4gYmUgY29tcGxldGVkIHdpdGhvdXQgZnVydGhlciBzaGlmdHMuCi0gICAgKiAgVXNlZCBieSBQYXJzZXIubGEoRXhwcmVzc2lvblN0YWNrKSB0byBkZXRlcm1pbmUgd2hlbiBhbWJpZ3VvdXMgdG9rZW5zCi0gICAgKiAgY2FuJ3QgYmUgcmVhZCBhY3Jvc3MgYSBuZXdsaW5lLiAgVGhlIGFsZ29yaXRobSB3aWxsIGd1ZXNzIHRydWUgaWYgaXQKLSAgICAqICBpc24ndCBzdXJlLiAgSWYgaXQgcmV0dXJucyBmYWxzZSwgeW91IGNhbiByZWx5IG9uIHRoYXQgYW5hbHlzaXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkNvbXBsZXRlKCkKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgYW55dGhpbmcKLSAgICAgICAgLy8gb3BlbiBvciBpZiB0aGUgdG9wIGlzIG5vdCBhbiBleHByZXNzaW9uLi4uCi0KLSAgICAgICAgaWYoIG9wZW4gPiAwIHx8ICF0b3BJc0FuRXhwcmVzc2lvbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBJZiBpdCBpcyBjb21wbGV0ZSwgaXQgY2FuIGNvbXBsZXRlLi4uCi0KLSAgICAgICAgaWYoIHNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UsIHdlIGd1ZXNzIHRydWUuICBJdCBpcyBtb3N0IGxpa2VseQotICAgICAgICAvLyB0aGUgY2FzZSwgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBwYXJzZXIgbW92ZXMgY29tcGxleAotICAgICAgICAvLyBzdHVmZiBvZmYgdG8gTEwgcm91dGluZXMgYW5kIHZhbGlkYXRlcyB0aGUgb3JkZXJpbmcgb2YKLSAgICAgICAgLy8gbm9kZXMgcHVzaGVkIG9uIHRoZSBzdGFjaywgdGhhdCBpZiB0aGUgdG9wIGlzIGFuIGV4cHJlc3Npb24sCi0gICAgICAgIC8vIGFuZCBub3RoaW5nIGlzICJvcGVuIiAoaWUuIHVubWF0Y2hlZCBwYXJlbnRoZXNpcywgZWFybHkKLSAgICAgICAgLy8gc3RhZ2UgdGVybmFyeSBvcGVyYXRvcnMpLCB0aGUgc3RhY2sgY2FuIGJlIHJlZHVjZWQgYmFjawotICAgICAgICAvLyB0byB0aGUgcm9vdCB3aXRob3V0IGZ1cnRoZXIgc2hpZnRzLiAgT3VyIGd1YXJhbnRlZSBpcwotICAgICAgICAvLyB0aGF0IG91ciBndWVzcyB0cnVlIG1pZ2h0IGJlIHdyb25nLCBidXQgdGhhdCB3ZSB3aWxsIG9ubHkKLSAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gd2UgYXJlIHN1cmUsIHNvLCBubyBoYXJtIGRvbmUuLi4KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN0YWNrLgotICAgICovCi0KLSAgICBpbnQgc2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhY2suc2l6ZSgpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFB1c2hlcyBhIG5vZGUgb250byB0aGUgc3RhY2suCi0gICAgKi8KLQotICAgIHZvaWQgcHVzaCggQ1NUTm9kZSBub2RlICkKLSAgICB7Ci0gICAgICAgIGlmKCAobm9kZS5pc0EoVHlwZXMuTEVGVF9QQVJFTlRIRVNJUykgfHwgbm9kZS5pc0EoVHlwZXMuUVVFU1RJT04pKSAmJiBub2RlLnNpemUoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgb3BlbisrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhY2suYWRkKCBub2RlICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUG9wcyB0aGUgbm9kZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAgICovCi0KLSAgICBDU1ROb2RlIHBvcCgpCi0gICAgewotICAgICAgICBDU1ROb2RlIG5vZGUgPSAoQ1NUTm9kZSlzdGFjay5yZW1vdmUoIHN0YWNrLnNpemUoKSAtIDEgKTsKLQotICAgICAgICBpZiggKG5vZGUuaXNBKFR5cGVzLkxFRlRfUEFSRU5USEVTSVMpIHx8IG5vZGUuaXNBKFR5cGVzLlFVRVNUSU9OKSkgJiYgbm9kZS5zaXplKCkgPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wZW4tLTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIHRvcCBub2RlIGZyb20gdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgKi8KLQotICAgIENTVE5vZGUgdG9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b3AoMCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyBzb21lIG5vZGUgZnJvbSB0aGUgc3RhY2suICA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGNvdW50ZWQKLSAgICAqICBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAgICovCi0KLSAgICBDU1ROb2RlIHRvcCggaW50IG9mZnNldCApCi0gICAgewotICAgICAgICBpZiggb2Zmc2V0IDwgc3RhY2suc2l6ZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChDU1ROb2RlKXN0YWNrLmdldCggc3RhY2suc2l6ZSgpIC0gMSAtIG9mZnNldCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRva2VuLk5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gUEFSU0VSIE9QRVJBVElPTlMKLQotCi0gICAvKioKLSAgICAqICBTaGlmdHMgc29tZSBudW1iZXIgb2YgKG5vbi1uZXdsaW5lKSB0b2tlbnMgZnJvbSB0aGUgc3RyZWFtIHRvIHRoZSB0b3AKLSAgICAqICBvZiB0aGUgc3RhY2suICBUaGV5IGFyZSBwdXNoZWQgaW4gb3JkZXIuCi0gICAgKi8KLQotICAgIHZvaWQgc2hpZnQoIGludCBjb3VudCApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKCBwYXJzZXIuY29uc3VtZSgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTaGlmdHMgYSB0b2tlbiBmcm9tIHRoZSBzdHJlYW0gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gICAgKi8KLQotICAgIHZvaWQgc2hpZnQoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHVzaCggcGFyc2VyLmNvbnN1bWUoKSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFBlcmZvcm1zIGEgcmVkdWNlIGJ5IHRha2luZyBzb21lIG51bWJlciBvZiA8Y29kZT5DU1ROb2RlPC9jb2RlPnMKLSAgICAqICBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBhbmQgbWFraW5nIG9uZSBvZiB0aGVtIGEKLSAgICAqICA8Y29kZT5SZWR1Y3Rpb248L2NvZGU+IHdpdGggdGhlIG90aGVycyBhcyBjaGlsZHJlbiwgdGhlbiBwdXNoZXMKLSAgICAqICB0aGF0IG5ldyBub2RlIGJhY2sgb250byB0aGUgc3RhY2suCi0gICAgKi8KLQotICAgIHZvaWQgcmVkdWNlKCBpbnQgY291bnQsIGludCByb290T2Zmc2V0LCBib29sZWFuIG1hcmsgKQotICAgIHsKLSAgICAgICAgaWYoIGNvdW50IDw9IHJvb3RPZmZzZXQgfHwgcm9vdE9mZnNldCA8IDAgfHwgY291bnQgPiBzaXplKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJlcnJvciBpbiBjYWxsIHRvIEV4cHJlc3Npb25TdGFjay5yZWR1Y2UoKTogY291bnQ9IiArIGNvdW50ICsgIiwgcm9vdE9mZnNldD0iICsgcm9vdE9mZnNldCApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NUTm9kZSAgIHJvb3QgICAgID0gbnVsbDsKLSAgICAgICAgQ1NUTm9kZVtdIGNoaWxkcmVuID0gbmV3IENTVE5vZGVbY291bnQtMV07Ci0KLSAgICAgICAgZm9yKCBpbnQgY2hpbGQgPSBjb3VudCAtIDIsIGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgY291bnQ7IGVsZW1lbnQrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50ID09IHJvb3RPZmZzZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJvb3QgPSBwb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbltjaGlsZC0tXSA9IHBvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcm9vdCA9IHJvb3QuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJvb3QuYWRkKCBjaGlsZHJlbltpXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG1hcmsgKQotICAgICAgICB7Ci0gICAgICAgICAgICByb290Lm1hcmtBc0V4cHJlc3Npb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1c2goIHJvb3QgKTsKLQotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBURVNUUwotCi0KLSAgIC8qKgotICAgICogIFJldHVybiB0cnVlIGlmIHRoZSBzdGFjayBpcyBhdCB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbi4gIFRydWUgaWYKLSAgICAqICBlaXRoZXIgdGhlIHN0YWNrIGlzIGVtcHR5IG9yIHRoZSB0b3AgdG9rZW4gaXMgYSBsZWZ0IHBhcmVudGhlc2lzLgotICAgICovCi0KLSAgICBib29sZWFuIGF0U3RhcnRPZkV4cHJlc3Npb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzRW1wdHkoKSB8fCAodG9wKCkuaXNBKFR5cGVzLkxFRlRfUEFSRU5USEVTSVMpICYmICF0b3AoKS5oYXNDaGlsZHJlbigpKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSBzdGFjayBpcyBhbiBvcGVyYXRvci4KLSAgICAqLwotCi0gICAgYm9vbGVhbiB0b3BJc0FuT3BlcmF0b3IoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHByZXNzaW9uU3VwcG9ydC5pc0FuT3BlcmF0b3IoIHRvcCgpLCBmYWxzZSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBmcm9tIHRoZSB0b3AKLSAgICAqICBvZiB0aGUgc3RhY2sgaXMgYW4gb3BlcmF0b3IuCi0gICAgKi8KLQotICAgIGJvb2xlYW4gdG9wSXNBbk9wZXJhdG9yKCBpbnQgb2Zmc2V0LCBib29sZWFuIHVua25vd25SZXR1cm5zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHByZXNzaW9uU3VwcG9ydC5pc0FuT3BlcmF0b3IoIHRvcChvZmZzZXQpLCB1bmtub3duUmV0dXJucyApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIHN0YWNrIGlzIGEgbW9kaWZpYWJsZSBleHByZXNzaW9uLgotICAgICovCi0KLSAgICBib29sZWFuIHRvcElzQU1vZGlmaWFibGVFeHByZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHByZXNzaW9uU3VwcG9ydC5pc0FNb2RpZmlhYmxlRXhwcmVzc2lvbiggdG9wKCkgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSBzdGFjayBpcyBhbiBleHByZXNzaW9uLgotICAgICovCi0KLSAgICBib29sZWFuIHRvcElzQW5FeHByZXNzaW9uKCApCi0gICAgewotICAgICAgICByZXR1cm4gdG9wKCkuaXNBbkV4cHJlc3Npb24oKTsKLSAgICB9Ci0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFNVR0FSCi0KLQotICAgLyoqCi0gICAgKiAgU2hpZnRzIGlmIHRoZSBzcGVjaWZpZWQgZmxhZyBpcyB0cnVlLCByZXBvcnRzIGFuIGVycm9yIG90aGVyd2lzZS4KLSAgICAqLwotCi0gICAgdm9pZCBzaGlmdElmKCBib29sZWFuIGZsYWcsIFN0cmluZyBlcnJvciApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggZmxhZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goIHBhcnNlci5jb25zdW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlci5lcnJvciggZXJyb3IgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFNoaWZ0cyB1bmxlc3MgdGhlIHNwZWNpZmllZCBmbGFnIGlzIHRydWUsIHJlcG9ydHMgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICAgICovCi0KLSAgICB2b2lkIHNoaWZ0VW5sZXNzKCBib29sZWFuIGZsYWcsIFN0cmluZyBlcnJvciApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiggZmxhZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlci5lcnJvciggZXJyb3IgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goIHBhcnNlci5jb25zdW1lKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFNoaWZ0cyBpZiB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBhbiBleHByZXNzaW9uLCByZXBvcnRzIGFuIGVycm9yCi0gICAgKiAgb3RoZXJ3aXNlLgotICAgICovCi0KLSAgICB2b2lkIHNoaWZ0SWZUb3BJc0FuRXhwcmVzc2lvbiggU3RyaW5nIGVycm9yICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNoaWZ0SWYoIEV4cHJlc3Npb25TdXBwb3J0LmlzQW5FeHByZXNzaW9uKHRvcCgpLCBmYWxzZSksIGVycm9yICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgU2hpZnRzIGlmIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGEgb3BlcmF0b3IsIHJlcG9ydHMgYW4KLSAgICAqICBlcnJvciBvdGhlcndpc2UuCi0gICAgKi8KLQotICAgIHZvaWQgc2hpZnRJZlRvcElzQW5PcGVyYXRvciggU3RyaW5nIGVycm9yICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNoaWZ0SWYoIEV4cHJlc3Npb25TdXBwb3J0LmlzQW5PcGVyYXRvcih0b3AoKSwgZmFsc2UpLCBlcnJvciApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFNoaWZ0cyB1bmxlc3MgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgYW4gZXhwcmVzc2lvbiwgcmVwb3J0cyBhbgotICAgICogIGVycm9yIG90aGVyd2lzZS4KLSAgICAqLwotCi0gICAgdm9pZCBzaGlmdFVubGVzc1RvcElzQW5FeHByZXNzaW9uKCBTdHJpbmcgZXJyb3IgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2hpZnRVbmxlc3MoIEV4cHJlc3Npb25TdXBwb3J0LmlzQW5FeHByZXNzaW9uKHRvcCgpLCBmYWxzZSksIGVycm9yICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgU2hpZnRzIHVubGVzcyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBhbiBvcGVyYXRvciwgcmVwb3J0cyBhbgotICAgICogIGVycm9yIG90aGVyd2lzZS4KLSAgICAqLwotCi0gICAgdm9pZCBzaGlmdFVubGVzc1RvcElzQW5PcGVyYXRvciggU3RyaW5nIGVycm9yICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHNoaWZ0VW5sZXNzKCBFeHByZXNzaW9uU3VwcG9ydC5pc0FuT3BlcmF0b3IodG9wKCksIGZhbHNlKSwgZXJyb3IgKTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gT1VUUFVUCi0KLQotICAgLyoqCi0gICAgKiAgQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhY2suCi0gICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoICkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdsaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiLCAiXG4iICk7Ci0gICAgICAgIGludCBjb3VudCA9IHN0YWNrLnNpemUoKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKCAiRXhwcmVzc2lvblN0YWNrIHdpdGggIiApLmFwcGVuZCggc2l6ZSgpICkuYXBwZW5kKCAiIGVsZW1lbnRzIiApLmFwcGVuZCggbmV3bGluZSApOwotICAgICAgICBmb3IoIGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIHRvcChpKS50b1N0cmluZygpICkuYXBwZW5kKCBuZXdsaW5lICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9FeHByZXNzaW9uU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvRXhwcmVzc2lvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliZDY5Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9FeHByZXNzaW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4Lio7Ci0KLQotCi0vKioKLSAqICBBIGhlbHBlciBmb3IgdGhlIGV4cHJlc3Npb24gcGFyc2luZyBzeXN0ZW0gdGhhdCBwcm92aWRlcyBpbi1kZXB0aAotICogIGFuYWx5c2lzIG9mIDxjb2RlPkNTVE5vZGU8L2NvZGU+cy4KLSAqCi0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uU3VwcG9ydAotewotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVYUFJFU1NJT04gSURFTlRJRklDQVRJT04KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYSBjb21wbGV0ZSBleHByZXNzaW9uIChzb21ldGhpbmcgdGhhdCBoYXMKLSAgICAqICBhIHZhbHVlKS4KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5FeHByZXNzaW9uKCBDU1ROb2RlIG5vZGUsIGJvb2xlYW4gdW5rbm93blJldHVybnMgKQotICAgIHsKLSAgICAgICAgaWYoIG5vZGUuaXNBKFR5cGVzLlVOS05PV04pICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHVua25vd25SZXR1cm5zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5vZGUuaXNBbkV4cHJlc3Npb24oKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPmlzQW5FeHByZXNzaW9uKCBub2RlLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5FeHByZXNzaW9uKCBDU1ROb2RlIG5vZGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzQW5FeHByZXNzaW9uKCBub2RlLCBmYWxzZSApOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBPUEVSQVRPUiBJREVOVElGSUNBVElPTgotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhbiBvcGVyYXRvciBhbmQgbm90IGFuIGV4cHJlc3Npb24gKHNlZQotICAgICogIGFib3ZlKS4KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5PcGVyYXRvciggQ1NUTm9kZSBub2RlLCBib29sZWFuIHVua25vd25SZXR1cm5zICkKLSAgICB7Ci0gICAgICAgIGlmKCBub2RlLmlzQShUeXBlcy5VTktOT1dOKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB1bmtub3duUmV0dXJuczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhbm9kZS5pc0FuRXhwcmVzc2lvbigpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+aXNBbk9wZXJhdG9yKG5vZGUsIGZhbHNlKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuT3BlcmF0b3IoIENTVE5vZGUgbm9kZSApCi0gICAgewotICAgICAgICByZXR1cm4gaXNBbk9wZXJhdG9yKCBub2RlLCBmYWxzZSApOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBWQVJJQUJMRSBJREVOVElGSUNBVElPTgotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBtaWdodCBiZSBhIHZhcmlhYmxlLgotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBVmFyaWFibGUoIENTVE5vZGUgbm9kZSApCi0gICAgewotICAgICAgICBzd2l0Y2goIG5vZGUuZ2V0TWVhbmluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUOgotICAgICAgICAgICAgICAgIGlmKCBub2RlLmlzQW5FeHByZXNzaW9uKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBVmFyaWFibGUoIG5vZGUuZ2V0KDEpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLkRPVDoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuTkFWSUdBVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIG5vZGUuaXNBbkV4cHJlc3Npb24oKSAmJiBub2RlLmdldCgyKS5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuSURFTlRJRklFUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuSURFTlRJRklFUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gTUVUSE9EIElERU5USUZJQ0FUSU9OCi0KLQotICAgLyoqCi0gICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIG1pZ2h0IGJlIGEgbWV0aG9kLgotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZva2FibGUoIENTVE5vZGUgbm9kZSApCi0gICAgewotICAgICAgICBzd2l0Y2goIG5vZGUuZ2V0TWVhbmluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUeXBlcy5TWU5USF9DTE9TVVJFOgotICAgICAgICAgICAgY2FzZSBUeXBlcy5TWU5USF9NRVRIT0RfQ0FMTDoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9TVVBFUjoKLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9USElTOgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBpc0FWYXJpYWJsZShub2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBU1NJR05NRU5UIFRBUkdFVCBJREVOVElGSUNBVElPTgotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIG1vZGlmaWFibGUgZXhwcmVzc2lvbiAoaWUuIHNvbWV0aGluZyB0aGF0Ci0gICAgKiAgY2FuIGJlIHRoZSB0YXJnZXQgb2YgYW4gYXNzaWdubWVudCkuICBOb3RlIHRoYXQgdGhpcyBkZXRlcm1pbmF0aW9uIGlzCi0gICAgKiAgYXBwcm94aW1hdGU6IGZhbHNlIG5lZ2F0aXZlcyB3b24ndCBoYXBwZW4sIGJ1dCBmYWxzZSBwb3NpdGl2ZXMgYXJlCi0gICAgKiAgZGlzdGluY3RseSBwb3NzaWJsZSwgYW5kIG11c3QgYmUgcmVzb2x2ZWQgaW4gbGF0ZXIgcGhhc2VzLgotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBTW9kaWZpYWJsZUV4cHJlc3Npb24oIENTVE5vZGUgbm9kZSwgYm9vbGVhbiB1bmtub3duUmV0dXJucyApCi0gICAgewotICAgICAgICBpZiggaXNBbkV4cHJlc3Npb24obm9kZSwgdW5rbm93blJldHVybnMpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGlzQVZhcmlhYmxlKG5vZGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiggbm9kZS5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuU1lOVEhfTElTVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCBub2RlLnNpemUoKTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhaXNBTW9kaWZpYWJsZUV4cHJlc3Npb24obm9kZS5nZXQoaSksIHVua25vd25SZXR1cm5zKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPmlzQU1vZGlmaWFibGVFeHByZXNzaW9uKCBub2RlLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQU1vZGlmaWFibGVFeHByZXNzaW9uKCBDU1ROb2RlIG5vZGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzQU1vZGlmaWFibGVFeHByZXNzaW9uKCBub2RlLCBmYWxzZSApOwotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUWVBFIE9QRVJBVElPTlMgSURFTlRJRklDQVRJT04KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgcG90ZW50aWFsbHkgYSBjYXN0IG9wZXJhdG9yLgotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3RlbnRpYWxDYXN0T3BlcmF0b3IoIENTVE5vZGUgbm9kZSApCi0gICAgewotICAgICAgICBpZiggbm9kZS5pc0EoVHlwZXMuTEVGVF9QQVJFTlRIRVNJUykgJiYgbm9kZS5pc0FuRXhwcmVzc2lvbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlzQVBvdGVudGlhbFR5cGVOYW1lKCBub2RlLmdldCgxKSwgZmFsc2UgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgcG90ZW50aWFsbHkgYSB0eXBlIG5hbWUuCi0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FQb3RlbnRpYWxUeXBlTmFtZSggQ1NUTm9kZSBub2RlLCBib29sZWFuIGFsbG93Vm9pZCApCi0gICAgewotICAgICAgICBpZiggbm9kZS5pc0EoYWxsb3dWb2lkID8gVHlwZXMuVFlQRV9OQU1FIDogVHlwZXMuQ1JFQVRBQkxFX1RZUEVfTkFNRSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBub2RlLmlzQShUeXBlcy5ET1QpICYmIG5vZGUuaXNBbkV4cHJlc3Npb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpc0FQb3RlbnRpYWxUeXBlTmFtZShub2RlLmdldCgyKSwgYWxsb3dWb2lkKSAmJiBpc0FQb3RlbnRpYWxUeXBlTmFtZShub2RlLmdldCgxKSwgYWxsb3dWb2lkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBub2RlLmlzQShUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUKSAmJiBub2RlLmlzQW5FeHByZXNzaW9uKCkgJiYgbm9kZS5zaXplKCkgPT0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpc0FQb3RlbnRpYWxUeXBlTmFtZShub2RlLmdldCgxKSwgYWxsb3dWb2lkICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9QYXJzZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJhZjQyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxMSArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLlNpbXBsZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLlN5bnRheEVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlZHVjdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LkNTVE5vZGU7Ci0KLS8qKgotICogIFJlYWRzIHRoZSBzb3VyY2UgdGV4dCBhbmQgcHJvZHVjZXMgYSBDb25jcmV0ZSBTeW50YXggVHJlZS4gIEV4Y2VwdGlvbnMKLSAqICBhcmUgY29sbGVjdGVkIGR1cmluZyBwcm9jZXNzaW5nLCBhbmQgcGFyc2luZyB3aWxsIGNvbnRpbnVlIGZvciB3aGlsZQotICogIHBvc3NpYmxlLCBpbiBvcmRlciB0byByZXBvcnQgYXMgbWFueSBwcm9ibGVtcyBhcyBwb3NzaWJsZS4KLSAqICA8Y29kZT5tb2R1bGUoKTwvY29kZT4gaXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQuCi0gKgotICogIEBhdXRob3IgQm9iIE1jV2hpcnRlcgotICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgotICAqLwotCi1wdWJsaWMgY2xhc3MgUGFyc2VyCi17Ci0gICAgcHJpdmF0ZSBTb3VyY2VVbml0ICBjb250cm9sbGVyICA9IG51bGw7ICAvLyBUaGUgY29udHJvbGxlciB0byB3aGljaCB3ZSByZXBvcnQgZXJyb3JzCi0gICAgcHJpdmF0ZSBUb2tlblN0cmVhbSB0b2tlblN0cmVhbSA9IG51bGw7ICAvLyBPdXIgdG9rZW4gc291cmNlCi0gICAgcHJpdmF0ZSBpbnQgICAgICAgICBuZXN0Q291bnQgICA9IDE7ICAgICAvLyBTaW1wbGlmaWVzIHRyYWNpbmcgb2YgbmVzdGVkIGNhbGxzCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIENPTlNUUlVDVElPTiBBTkQgREFUQSBBQ0NFU1MKLQotICAgLyoqCi0gICAgKiAgU2V0cyB0aGUgPGNvZGU+UGFyc2VyPC9jb2RlPiB0byBwcm9jZXNzIGEgPGNvZGU+VG9rZW5TdHJlYW08L2NvZGU+LAotICAgICogIHVuZGVyIGNvbnRyb2wgb2YgdGhlIHNwZWNpZmllZCA8Y29kZT5Tb3VyY2VVbml0PC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIFBhcnNlciggU291cmNlVW5pdCBjb250cm9sbGVyLCBUb2tlblN0cmVhbSB0b2tlblN0cmVhbSApCi0gICAgewotICAgICAgICB0aGlzLmNvbnRyb2xsZXIgID0gY29udHJvbGxlcjsKLSAgICAgICAgdGhpcy50b2tlblN0cmVhbSA9IHRva2VuU3RyZWFtOwotICAgIH0KLQotCi0gICAvKioKLSAgICAqICBTeW5vbnltIGZvciBtb2R1bGUoKSwgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQuCi0gICAgKi8KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gcGFyc2UoKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFN5bnRheEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5hZGRGYXRhbEVycm9yKCBuZXcgU3ludGF4RXJyb3JNZXNzYWdlKGUpICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJ0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIiApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIDxjb2RlPlRva2VuU3RyZWFtPC9jb2RlPiBiZWluZyBwYXJzZWQuCi0gICAgKi8KLQotICAgIHB1YmxpYyBUb2tlblN0cmVhbSBnZXRUb2tlblN0cmVhbSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50b2tlblN0cmVhbTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gUFJPRFVDVElPTiBTVVBQT1JUCi0KLQotICAgLyoqCi0gICAgKiAgRWF0cyBhbnkgb3B0aW9uYWwgbmV3bGluZXMuCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIG9wdGlvbmFsTmV3bGluZXMoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgd2hpbGUoIGx0KGZhbHNlKSA9PSBUeXBlcy5ORVdMSU5FKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5ORVdMSU5FICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBFYXRzIGEgcmVxdWlyZWQgZW5kLW9mLXN0YXRlbWVudCAoc2VtaWNvbG9uIG9yIG5ld2xpbmUpIGZyb20gdGhlIHN0cmVhbS4KLSAgICAqICBUaHJvd3MgYW4gPGNvZGU+VW5leHBlY3RlZFRva2VuRXhjZXB0aW9uPC9jb2RlPiBpZiBhbnl0aGluZyBlbHNlIGlzIGZvdW5kLgotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBlbmRPZlN0YXRlbWVudCggYm9vbGVhbiBhbGxvd1JpZ2h0Q3VybHlCcmFjZSApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbiBuZXh0ID0gbGEoIHRydWUgKTsKLQotICAgICAgICBpZiggbmV4dC5pc0EoVHlwZXMuR0VORVJBTF9FTkRfT0ZfU1RBVEVNRU5UKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN1bWUoIHRydWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhbGxvd1JpZ2h0Q3VybHlCcmFjZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFuZXh0LmlzQShUeXBlcy5SSUdIVF9DVVJMWV9CUkFDRSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIG5ldyBpbnRbXSB7IFR5cGVzLlNFTUlDT0xPTiwgVHlwZXMuTkVXTElORSwgVHlwZXMuUklHSFRfQ1VSTFlfQlJBQ0UgfSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJvciggbmV3IGludFtdIHsgVHlwZXMuU0VNSUNPTE9OLCBUeXBlcy5ORVdMSU5FIH0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+ZW5kT2ZTdGF0ZW1lbnQoIHRydWUgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGVuZE9mU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGVuZE9mU3RhdGVtZW50KCB0cnVlICk7Ci0gICAgfQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFBST0RVQ1RJT05TOiBQUklNQVJZIFNUUlVDVFVSRVMKLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBkb3R0ZWQgaWRlbnRpZmVyLiAgVXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBkb3R0ZWRJZGVudGlmaWVyID0gPGlkZW50aWZpZXI+ICgiLiIgPGlkZW50aWZpZXI+KSoKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgZG90dGVkID0geyAiLiIgZG90dGVkIDxpZGVudGlmaWVyPiB9IHwgPGlkZW50aWZpZXI+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHB1YmxpYyBDU1ROb2RlIGRvdHRlZElkZW50aWZpZXIoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ1NUTm9kZSBpZGVudGlmaWVyID0gY29uc3VtZShUeXBlcy5JREVOVElGSUVSKTsKLQotICAgICAgICB3aGlsZSAobHQoKSA9PSBUeXBlcy5ET1QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlkZW50aWZpZXIgPSBjb25zdW1lKFR5cGVzLkRPVCkuYXNSZWR1Y3Rpb24oIGlkZW50aWZpZXIsIGNvbnN1bWUoVHlwZXMuSURFTlRJRklFUikgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZGVudGlmaWVyOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFRoZSBwcmltYXJ5IGZpbGUtbGV2ZWwgcGFyc2luZyBlbnRyeSBwb2ludC4gIFRoZSByZXR1cm5lZCBDU1QKLSAgICAqICByZXByZXNlbnRzIHRoZSBjb250ZW50IGluIGEgc2luZ2xlIGNsYXNzIGZpbGUuICBDb2xsZWN0cyBtb3N0Ci0gICAgKiAgZXhjZXB0aW9ucyBhbmQgYXR0ZW1wdHMgdG8gY29udGludWUuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBtb2R1bGUgPSBbcGFja2FnZVN0YXRlbWVudF0KLSAgICAqICAgICAgICAgICAgICAodXNpbmdTdGF0ZW1lbnQpKgotICAgICogICAgICAgICAgICAgICh0b3BMZXZlbFN0YXRlbWVudCkqCi0gICAgKiAgICAgICAgICAgICAgPGVvZj4KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgbW9kdWxlID0geyA8bnVsbD4gcGFja2FnZSBpbXBvcnRzICh0b3BMZXZlbFN0YXRlbWVudCkqIH0KLSAgICAqCi0gICAgKiAgICAgcGFja2FnZSAgICAgICAgICAgc2VlIHBhY2thZ2VEZWNsYXJhdGlvbigpCi0gICAgKiAgICAgaW1wb3J0cyAgICAgICAgICAgc2VlIGltcG9ydFN0YXRlbWVudCgpCi0gICAgKiAgICAgdG9wTGV2ZWxTdGF0ZW1lbnQgc2VlIHRvcExldmVsU3RhdGVtZW50KCkKLSAgICAqICA8L3ByZT4KLSAgICAqCi0gICAgKi8KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gbW9kdWxlKCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBtb2R1bGUgPSBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRmlyc3QgdXAsIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uCi0KLSAgICAgICAgLy8gWFhYIGJyOiB0aGlzIGlzIHdoZXJlIGkgY2FuIGRvIG1hY3JvIHByb2Nlc3NpbmcgCi0gICAgICAgIAotICAgICAgICBSZWR1Y3Rpb24gcGFja2FnZURlY2xhcmF0aW9uID0gbnVsbDsKLQotICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5LRVlXT1JEX1BBQ0tBR0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYWNrYWdlRGVjbGFyYXRpb24gPSBwYWNrYWdlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBhY2thZ2VEZWNsYXJhdGlvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcGFja2FnZURlY2xhcmF0aW9uID0gUmVkdWN0aW9uLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9kdWxlLmFkZCggcGFja2FnZURlY2xhcmF0aW9uICk7Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBOZXh0LCBoYW5kbGUgaW1wb3J0IHN0YXRlbWVudHMKLQotICAgICAgICBSZWR1Y3Rpb24gaW1wb3J0cyA9IChSZWR1Y3Rpb24pbW9kdWxlLmFkZCggUmVkdWN0aW9uLm5ld0NvbnRhaW5lcigpICk7Ci0gICAgICAgIE9iamVjdCBjb2xsZWN0b3I7Ci0KLSAgICAgICAgd2hpbGUoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9JTVBPUlQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCggaW1wb3J0U3RhdGVtZW50KCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2goIFN5bnRheEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUpOwotICAgICAgICAgICAgICAgIHJlY292ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV2l0aCB0aGF0IHRha2VuIGNhcmUgb2YsIHByb2Nlc3MgZXZlcnl0aGluZyBlbHNlLgotCi0gICAgICAgIHdoaWxlKCBsdCgpICE9IFR5cGVzLkVPRiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZHVsZS5hZGQoIHRvcExldmVsU3RhdGVtZW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUpOwotICAgICAgICAgICAgICAgIHJlY292ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2R1bGU7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgcGFja2FnZSBkZWNsYXJhdGlvbi4gIENhbGxlZCBieSA8Y29kZT5tb2R1bGUoKTwvY29kZT4uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBwYWNrYWdlRGVjbGFyYXRpb24gPSAicGFja2FnZSIgZG90dGVkSWRlbnRpZmllciA8ZW9zPgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBwYWNrYWdlID0geyAicGFja2FnZSIgZG90dGVkSWRlbnRpZmllciB9Ci0gICAgKgotICAgICogICAgIHNlZSBkb3R0ZWRJZGVudGlmaWVyKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24oKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IGNvbnN1bWUoVHlwZXMuS0VZV09SRF9QQUNLQUdFKS5hc1JlZHVjdGlvbiggZG90dGVkSWRlbnRpZmllcigpICk7Ci0gICAgICAgIGVuZE9mU3RhdGVtZW50KCBmYWxzZSApOwotCi0gICAgICAgIHJldHVybiBwYWNrYWdlRGVjbGFyYXRpb247Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGFuIGltcG9ydCBzdGF0ZW1lbnQuICBDYWxsZWQgYnkgPGNvZGU+bW9kdWxlKCk8L2NvZGU+LgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgaW1wb3J0U3RhdGVtZW50ID0gImltcG9ydCIgKGFsbHxzcGVjaWZpYykgPGVvcz4KLSAgICAqCi0gICAgKiAgICAgYWxsICAgICAgPSBwYWNrYWdlICIuIiAocGFja2FnZSAiLiIpKiAiKiIKLSAgICAqCi0gICAgKiAgICAgc3BlY2lmaWMgPSAocGFja2FnZSAiLiIgKHBhY2thZ2UgIi4iKSopPyBjbGFzc2VzCi0gICAgKiAgICAgY2xhc3NlcyAgPSBjbGFzcyBbImFzIiBhbGlhc10gKCIsIiBjbGFzcyBbImFzIiBhbGlhc10pKgotICAgICoKLSAgICAqICAgICBwYWNrYWdlICA9IDxpZGVudGlmaWVyPgotICAgICogICAgIGNsYXNzICAgID0gPGlkZW50aWZpZXI+Ci0gICAgKiAgICAgYWxpYXMgICAgPSA8aWRlbnRpZmllcj4KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgaW1wb3J0ICAgPSB7ICJpbXBvcnQiIChwYWNrYWdlfHt9KSAoeyIqIn0gfCBjbGF1c2UrKSB9Ci0gICAgKgotICAgICogICAgIHBhY2thZ2UgID0geyAiLiIgcGFja2FnZSA8aWRlbnRpZmllcj4gfSB8IDxpZGVudGlmaWVyPgotICAgICogICAgIGNsYXVzZSAgID0geyA8aWRlbnRpZmllcj4gPGFsaWFzPj8gfQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwdWJsaWMgUmVkdWN0aW9uIGltcG9ydFN0YXRlbWVudCgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWR1Y3Rpb24gaW1wb3J0U3RhdGVtZW50ID0gY29uc3VtZShUeXBlcy5LRVlXT1JEX0lNUE9SVCkuYXNSZWR1Y3Rpb24oKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBGaXJzdCwgcHJvY2VzcyBhbnkgcGFja2FnZSBuYW1lLgotCi0gICAgICAgIENTVE5vZGUgcGFja2FnZU5vZGUgPSBudWxsOwotICAgICAgICBpZiggbHQoMikgPT0gVHlwZXMuRE9UICkKLSAgICAgICAgewotICAgICAgICAgICAgcGFja2FnZU5vZGUgPSBjb25zdW1lKFR5cGVzLklERU5USUZJRVIpLmFzUmVkdWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBsdCgzKSA9PSBUeXBlcy5ET1QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhY2thZ2VOb2RlID0gY29uc3VtZShUeXBlcy5ET1QpLmFzUmVkdWN0aW9uKCBwYWNrYWdlTm9kZSApOwotICAgICAgICAgICAgICAgIHBhY2thZ2VOb2RlLmFkZCggY29uc3VtZShUeXBlcy5JREVOVElGSUVSKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5ET1QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwYWNrYWdlTm9kZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcGFja2FnZU5vZGUgPSBSZWR1Y3Rpb24uRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbXBvcnRTdGF0ZW1lbnQuYWRkKCBwYWNrYWdlTm9kZSApOwotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlbiBwcm9jZXNzIHRoZSBjbGFzcyBsaXN0LgotCi0gICAgICAgIGlmKCAhcGFja2FnZU5vZGUuaXNFbXB0eSgpICYmIGx0KCkgPT0gVHlwZXMuU1RBUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGltcG9ydFN0YXRlbWVudC5hZGQoIGNvbnN1bWUoVHlwZXMuU1RBUikgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0gICAgICAgICAgIHdoaWxlKCAhZG9uZSApCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFJlZHVjdGlvbiBjbGF1c2UgPSBjb25zdW1lKFR5cGVzLklERU5USUZJRVIpLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5LRVlXT1JEX0FTICkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5LRVlXT1JEX0FTICk7Ci0gICAgICAgICAgICAgICAgICAgY2xhdXNlLmFkZCggY29uc3VtZShUeXBlcy5JREVOVElGSUVSKSApOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpbXBvcnRTdGF0ZW1lbnQuYWRkKCBjbGF1c2UgKTsKLQotICAgICAgICAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuQ09NTUEgKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLkNPTU1BICk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRW5kIHRoZSBzdGF0ZW1lbnQgYW5kIHJldHVybi4KLQotICAgICAgICBlbmRPZlN0YXRlbWVudCggZmFsc2UgKTsKLSAgICAgICAgcmV0dXJuIGltcG9ydFN0YXRlbWVudDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSB0b3AgbGV2ZWwgc3RhdGVtZW50IChjbGFzc2VzLCBpbnRlcmZhY2VzLCB1bmF0dGFjaGVkIG1ldGhvZHMsIGFuZAotICAgICogIHVuYXR0YWNoZWQgY29kZSkuICBDYWxsZWQgYnkgPGNvZGU+bW9kdWxlKCk8L2NvZGU+LgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgdG9wTGV2ZWxTdGF0ZW1lbnQKLSAgICAqICAgICAgID0gbWV0aG9kRGVjbGFyYXRpb24KLSAgICAqICAgICAgIHwgdHlwZURlY2xhcmF0aW9uCi0gICAgKiAgICAgICB8IHN0YXRlbWVudAotICAgICoKLSAgICAqICAgICB0eXBlRGVjbGFyYXRpb24gPSBjbGFzc0RlY2xhcmF0aW9uIHwgaW50ZXJmYWNlRGVjbGFyYXRpb24KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBSZWNvZ25pdGlvbjogPHByZT4KLSAgICAqICAgICAiZGVmIiAgICAgICAgICAgICAgICAgICAgPT4gbWV0aG9kRGVjbGFyYXRpb24KLSAgICAqICAgICAic3luY2hyb25pemVkIiAiKCIgICAgICAgPT4gc3luY2hyb25pemVkU3RhdGVtZW50Ci0gICAgKiAgICAgbW9kaWZpZXJMaXN0ICJjbGFzcyIgICAgID0+IGNsYXNzRGVjbGFyYXRpb24KLSAgICAqICAgICBtb2RpZmllckxpc3QgImludGVyZmFjZSIgPT4gaW50ZXJmYWNlRGVjbGFyYXRpb24KLSAgICAqICAgICBtb2RpZmllckxpc3QgICAgICAgICAgICAgPT4gPGVycm9yPgotICAgICogICAgICogICAgICAgICAgICAgICAgICAgICAgICA9PiBzdGF0ZW1lbnQKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgc2VlIG1ldGhvZERlY2xhcmF0aW9uKCkKLSAgICAqICAgICBzZWUgY2xhc3NEZWNsYXJhdGlvbigpCi0gICAgKiAgICAgc2VlIGludGVyZmFjZURlY2xhcmF0aW9uKCkKLSAgICAqICAgICBzZWUgc3RhdGVtZW50KCkKLSAgICAqICAgICBzZWUgc3luY2hyb25pemVkU3RhdGVtZW50KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIENTVE5vZGUgdG9wTGV2ZWxTdGF0ZW1lbnQoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ1NUTm9kZSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIGl0IHN0YXJ0cyAiZGVmIiwgaXQncyBhIG1ldGhvZCBkZWNsYXJhdGlvbi4gIE1ldGhvZHMKLSAgICAgICAgLy8gZGVjbGFyZWQgdGhpcyB3YXkgY2Fubm90IGJlIGFic3RyYWN0LiAgTm90ZSB0aGF0ICJkZWYiCi0gICAgICAgIC8vIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIHJldHVybiB0eXBlIGlzIG5vdCwgYW5kIGl0IHdvdWxkCi0gICAgICAgIC8vIGJlIHZlcnkgaGFyZCB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBmdW5jdGlvbgotICAgICAgICAvLyBkZWYgYW5kIGEgZnVuY3Rpb24gaW52b2thdGlvbiB3aXRoIGNsb3N1cmUuLi4KLQotICAgICAgICBpZiAobHQoKSA9PSBUeXBlcy5LRVlXT1JEX0RFRikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICBSZWR1Y3Rpb24gbW9kaWZpZXJzICA9IG1vZGlmaWVyTGlzdCggZmFsc2UsIGZhbHNlICk7Ci0gICAgICAgICAgICBDU1ROb2RlICAgdHlwZSAgICAgICA9IG9wdGlvbmFsRGF0YXR5cGUoIGZhbHNlLCB0cnVlICk7Ci0gICAgICAgICAgICBUb2tlbiAgICAgaWRlbnRpZmllciA9IG5hbWVEZWNsYXJhdGlvbiggZmFsc2UgKTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kRGVjbGFyYXRpb24obW9kaWZpZXJzLCB0eXBlLCBpZGVudGlmaWVyLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmIChsdCgpID09IFR5cGVzLktFWVdPUkRfREVGTUFDUk8pCi0gICAgICAgIHsKLSAgICAgICAgCS8vIFhYWCBhZGQgbXkgbG9naWMgaGVyZQotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzICJzeW5jaHJvbml6ZWQoIiwgaXQncyBhIHN0YXRlbWVudC4gIFRoaXMgY2hlY2sKLSAgICAgICAgLy8gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgInN5bmNocm9uaXplZCIgaXMgYWxzbyBhIGNsYXNzIG1vZGlmaWVyLgotCi0gICAgICAgIGVsc2UgaWYoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9TWU5DSFJPTklaRUQgJiYgbHQoMikgPT0gVHlwZXMuTEVGVF9QQVJFTlRIRVNJUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHN5bmNocm9uaXplZFN0YXRlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBtb2RpZmllciwgImNsYXNzIiwgb3IgImludGVyZmFjZSIsCi0gICAgICAgIC8vIGl0J3MgYSB0eXBlIGRlY2xhcmF0aW9uLgotCi0gICAgICAgIGVsc2UgaWYoIGxhKCkuaXNBKFR5cGVzLkRFQ0xBUkFUSU9OX01PRElGSUVSKSB8fCBsYSgpLmlzQShUeXBlcy5UWVBFX0RFQ0xBUkFUSU9OKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlZHVjdGlvbiBtb2RpZmllcnMgPSBtb2RpZmllckxpc3QoIHRydWUsIHRydWUgKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBsdCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQ0xBU1M6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbGFzc0RlY2xhcmF0aW9uKCBtb2RpZmllcnMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGludGVyZmFjZURlY2xhcmF0aW9uKCBtb2RpZmllcnMgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCBuZXcgaW50W10geyBUeXBlcy5LRVlXT1JEX0NMQVNTLCBUeXBlcy5LRVlXT1JEX0lOVEVSRkFDRSB9ICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIHN0YXRlbWVudC4KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHN0YXRlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9teW0gZm9yIDxjb2RlPnRvcExldmVsU3RhdGVtZW50KCk8L2NvZGU+LgotICAgICovCi0KLSAgICBwdWJsaWMgQ1NUTm9kZSB0eXBlRGVjbGFyYXRpb24oKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvcExldmVsU3RhdGVtZW50KCk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBtb2RpZmllcnMgbGlzdCB0aGF0IGNhbiBhcHBlYXIgb24gdG9wLSBhbmQgY2xhc3MtbGV2ZWwKLSAgICAqICBtZXRob2QgYW5kIGNsYXNzLWxldmVsIHZhcmlhYmxlIG5hbWVzIChwdWJsaWMsIHByaXZhdGUsIGFic3RyYWN0LCBldGMuKS4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIG1vZGlmaWVyTGlzdCA9IDxtb2RpZmllcj4qCi0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIG1vZGlmaWVycyA9IHsgPG51bGw+IDxtb2RpZmllcj4qIH0KLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiBtb2RpZmllckxpc3QoYm9vbGVhbiBhbGxvd1N0YXRpYywgYm9vbGVhbiBhbGxvd0Fic3RyYWN0KSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIFN5bnRheEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIG1vZGlmaWVycyA9IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKTsKLQotICAgICAgICB3aGlsZSggbGEoKS5pc0EoVHlwZXMuREVDTEFSQVRJT05fTU9ESUZJRVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9BQlNUUkFDVCAmJiAhYWxsb3dBYnN0cmFjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCAia2V5d29yZCAnYWJzdHJhY3QnIG5vdCB2YWxpZCBpbiB0aGlzIHNldHRpbmciLCBsYSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsdCgpID09IFR5cGVzLktFWVdPUkRfU1RBVElDICYmICFhbGxvd1N0YXRpYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCAia2V5d29yZCAnc3RhdGljJyBub3QgdmFsaWQgaW4gdGhpcyBzZXR0aW5nIiwgbGEoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9kaWZpZXJzLmFkZCggY29uc3VtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbW9kaWZpZXJzOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIGNsYXNzIGRlY2xhcmF0aW9uLiAgQ2FsbGVyIGhhcyBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgZGVjbGFyYXRpb24KLSAgICAqICBtb2RpZmllcnMsIGFuZCBwYXNzZXMgdGhlbSBpbi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIGNsYXNzRGVjbGFyYXRpb24gPSA8bW9kaWZpZXI+KiAiY2xhc3MiIDxpZGVudGlmaWVyPgotICAgICogICAgICAgICAgICAgICAgICAgICAgICBbImV4dGVuZHMiIGRhdGF0eXBlXQotICAgICogICAgICAgICAgICAgICAgICAgICAgICBbImltcGxlbWVudHMiIGRhdGF0eXBlICgsIGRhdGF0eXBlKSpdCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVCb2R5Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIGNsYXNzICAgICAgPSB7IDxpZGVudGlmaWVyPjpTWU5USF9DTEFTUyBtb2RpZmllcnMgZXh0ZW5kcyBpbXBsZW1lbnRzIGJvZHkgfQotICAgICogICAgIGV4dGVuZHMgICAgPSB7ICJleHRlbmRzIiAgICBkYXRhdHlwZSAgfSB8IHt9Ci0gICAgKiAgICAgaW1wbGVtZW50cyA9IHsgImltcGxlbWVudHMiIGRhdGF0eXBlKiB9IHwge30KLSAgICAqCi0gICAgKiAgICAgbW9kaWZpZXJzIHNlZSBtb2RpZmllckxpc3QoKQotICAgICogICAgIGRhdGF0eXBlICBzZWUgZGF0YXR5cGUoKQotICAgICogICAgIGJvZHkgICAgICBzZWUgdHlwZUJvZHkoKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwdWJsaWMgUmVkdWN0aW9uIGNsYXNzRGVjbGFyYXRpb24oIFJlZHVjdGlvbiBtb2RpZmllcnMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY29uc3VtZSggVHlwZXMuS0VZV09SRF9DTEFTUyApOwotCi0gICAgICAgIFJlZHVjdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gY29uc3VtZShUeXBlcy5JREVOVElGSUVSKS5hc1JlZHVjdGlvbiggbW9kaWZpZXJzICk7Ci0gICAgICAgIGNsYXNzRGVjbGFyYXRpb24uc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfQ0xBU1MgKTsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgYW55IGV4dGVuZHMgY2xhdXNlLgotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmFkZCggdHlwZUxpc3QoVHlwZXMuS0VZV09SRF9FWFRFTkRTLCB0cnVlLCAxKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlKTsKLSAgICAgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uYWRkKCBSZWR1Y3Rpb24uRU1QVFkgKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gUHJvY2VzcyBhbnkgaW1wbGVtZW50cyBjbGF1c2UuCi0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uYWRkKCB0eXBlTGlzdChUeXBlcy5LRVlXT1JEX0lNUExFTUVOVFMsIHRydWUsIDApICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUpOwotICAgICAgICAgICAgY2xhc3NEZWNsYXJhdGlvbi5hZGQoIFJlZHVjdGlvbi5FTVBUWSApOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBkZWNsYXJhdGlvbiBib2R5LiAgV2UgY3VycmVudGx5IGlnbm9yZSB0aGUgYWJzdHJhY3Qga2V5d29yZC4KLQotICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmFkZCggdHlwZUJvZHkodHJ1ZSwgdHJ1ZSwgZmFsc2UpICk7Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzRGVjbGFyYXRpb247Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiAgQ2FsbGVyIGhhcyBhbHJlYWR5IHByb2Nlc3NlZCB0aGUKLSAgICAqICBkZWNsYXJhdGlvbiBtb2RpZmllcnMsIGFuZCBwYXNzZXMgdGhlbSBpbi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIGludGVyZmFjZURlY2xhcmF0aW9uID0gPG1vZGlmaWVyPiogImludGVyZmFjZSIgPGlkZW50aWZpZXI+Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImV4dGVuZHMiIHR5cGVMaXN0XQotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUJvZHkKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgaW50ZXJmYWNlICA9IHsgPGlkZW50aWZpZXI+OlNZTlRIX0lOVEVSRkFDRSBtb2RpZmllcnMge30gZXh0ZW5kcyBib2R5IH0KLSAgICAqICAgICBleHRlbmRzICAgID0geyAiZXh0ZW5kcyIgZGF0YXR5cGUqIH0gfCB7fQotICAgICoKLSAgICAqICAgICBtb2RpZmllcnMgc2VlIG1vZGlmaWVyTGlzdCgpCi0gICAgKiAgICAgZGF0YXR5cGUgIHNlZSBkYXRhdHlwZSgpCi0gICAgKiAgICAgYm9keSAgICAgIHNlZSB0eXBlQm9keSgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24oIFJlZHVjdGlvbiBtb2RpZmllcnMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY29uc3VtZSggVHlwZXMuS0VZV09SRF9JTlRFUkZBQ0UgKTsKLQotICAgICAgICBSZWR1Y3Rpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBjb25zdW1lKFR5cGVzLklERU5USUZJRVIpLmFzUmVkdWN0aW9uKCBtb2RpZmllcnMsIFJlZHVjdGlvbi5FTVBUWSApOwotICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9JTlRFUkZBQ0UgKTsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgYW55IGV4dGVuZHMgY2xhdXNlLgotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQoIHR5cGVMaXN0KFR5cGVzLktFWVdPUkRfRVhURU5EUywgdHJ1ZSwgMCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQoIFJlZHVjdGlvbi5FTVBUWSApOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBkZWNsYXJhdGlvbiBib2R5LiAgQWxsIG1ldGhvZHMgbXVzdCBiZSBhYnN0cmFjdC4KLSAgICAgICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIG5vdCBhbGxvd2VkLgotCi0gICAgICAgIGludGVyZmFjZURlY2xhcmF0aW9uLmFkZCggdHlwZUJvZHkoZmFsc2UsIHRydWUsIHRydWUpICk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSB0eXBlIGxpc3QsIGxpa2UgdGhlIG9uZXMgdGhhdCBvY2N1ciBhZnRlciAiZXh0ZW5kcyIgb3IKLSAgICAqICBpbXBsZW1lbnRzLiAgSWYgdGhlIGxpc3QgaXMgb3B0aW9uYWwsIHRoZSByZXR1cm5lZCBDU1ROb2RlIHdpbGwKLSAgICAqICBiZSBlbXB0eS4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHR5cGVMaXN0ID0gPGRlY2xhcmF0b3I+IGRhdGF0eXBlICgsIGRhdGF0eXBlKSoKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgdHlwZUxpc3QgPSB7IDxkZWNsYXJhdG9yPiBkYXRhdHlwZSsgfSB8IHt9Ci0gICAgKgotICAgICogICAgIGRhdGF0eXBlIHNlZSBkYXRhdHlwZSgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gdHlwZUxpc3QoaW50IGRlY2xhcmF0b3IsIGJvb2xlYW4gb3B0aW9uYWwsIGludCBsaW1pdCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiB0eXBlTGlzdCA9IG51bGw7Ci0KLSAgICAgICAgaWYoIGx0KCkgPT0gZGVjbGFyYXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVMaXN0ID0gY29uc3VtZShkZWNsYXJhdG9yKS5hc1JlZHVjdGlvbigpOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTG9vcCwgcmVhZGluZyBvbmUgZGF0YXR5cGUgYXQgYSB0aW1lLiAgT24gZXJyb3IsIGF0dGVtcHQKLSAgICAgICAgICAgIC8vIHJlY292ZXJ5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGNsYXVzZSBpcyBmb3VuZC4KLQotICAgICAgICAgICAgd2hpbGUoIGxpbWl0ID09IDAgfHwgdHlwZUxpc3QuY2hpbGRyZW4oKSA8IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFRyeSBmb3IgYSBsaXN0IGVudHJ5LCBhbmQgY29ycmVjdCBpZiBtaXNzaW5nCi0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB0eXBlTGlzdC5jaGlsZHJlbigpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuQ09NTUEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHR5cGVMaXN0LmFkZCggZGF0YXR5cGUoZmFsc2UpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY292ZXIoIFR5cGVzLlRZUEVfTElTVF9URVJNSU5BVE9SUyApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgcG9pbnQuICBJdCBpcwotICAgICAgICAgICAgICAgIC8vIGRvbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbG9vcCB0byBlbnN1cmUgdGhhdCB0aGVyZQotICAgICAgICAgICAgICAgIC8vIGlzIGF0IGxlYXN0IG9uZSBkYXRhdHlwZSBpbiB0aGUgbGlzdAotCi0gICAgICAgICAgICAgICAgaWYoICFsYSgpLmlzQShUeXBlcy5DT01NQSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3QgPSBSZWR1Y3Rpb24uRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIGRlY2xhcmF0b3IgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlTGlzdDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlIG9yIGNsYXNzLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgdHlwZUJvZHkgPSAieyIgdHlwZUJvZHlTdGF0ZW1lbnQqICJ9IgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBib2R5ID0geyA8bnVsbD4gdHlwZUJvZHlTdGF0ZW1lbnQqIH0KLSAgICAqCi0gICAgKiAgICAgdHlwZUJvZHlTdGF0ZW1lbnQgc2VlIHR5cGVCb2R5U3RhdGVtZW50KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiB0eXBlQm9keShib29sZWFuIGFsbG93U3RhdGljLCBib29sZWFuIGFsbG93QWJzdHJhY3QsIGJvb2xlYW4gcmVxdWlyZUFic3RyYWN0KSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIGJvZHkgPSBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29uc3VtZSggVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSApOwotCi0gICAgICAgIHdoaWxlKCBsdCgpICE9IFR5cGVzLkVPRiAmJiBsdCgpICE9IFR5cGVzLlJJR0hUX0NVUkxZX0JSQUNFICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9keS5hZGQoIHR5cGVCb2R5U3RhdGVtZW50KGFsbG93U3RhdGljLCBhbGxvd0Fic3RyYWN0LCByZXF1aXJlQWJzdHJhY3QpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggU3ludGF4RXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3VtZSggVHlwZXMuUklHSFRfQ1VSTFlfQlJBQ0UgKTsKLQotICAgICAgICByZXR1cm4gYm9keTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBzaW5nbGUgZW50cnkgaW4gdGhlIHRoZSBib2R5IG9mIGFuIGludGVyZmFjZSBvciBjbGFzcy4KLSAgICAqICBWYWxpZCBvYmplY3RzIGFyZSBjb25zdHJ1Y3RvcnMsIG1ldGhvZHMsIHByb3BlcnRpZXMsIHN0YXRpYyBpbml0aWFsaXplcnMsCi0gICAgKiAgYW5kIGlubmVyIGNsYXNzZXMgb3IgaW50ZXJmYWNlcy4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHR5cGVCb2R5U3RhdGVtZW50Ci0gICAgKiAgICAgICA9IHN0YXRpY0luaXRpYWxpemVyCi0gICAgKiAgICAgICB8IGNsYXNzRGVjbGFyYXRpb24KLSAgICAqICAgICAgIHwgaW50ZXJmYWNlRGVjbGFyYXRpb24KLSAgICAqICAgICAgIHwgcHJvcGVydHlEZWNsYXJhdGlvbgotICAgICogICAgICAgfCBtZXRob2REZWNsYXJhdGlvbgotICAgICoKLSAgICAqICAgICBzdGF0aWNJbml0aWFsaXplciA9ICgic3RhdGljIiAieyIgc3RhdGVtZW50KiAifSIpCi0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgUmVjb2duaXRpb246IDxwcmU+Ci0gICAgKiAgICAgInN0YXRpYyIgInsiICAgICAgICAgICAgID0+IHN0YXRpY0luaXRpYWxpemVyCi0gICAgKiAgICAgbW9kaWZpZXJMaXN0ICJjbGFzcyIgICAgID0+IGNsYXNzRGVjbGFyYXRpb24KLSAgICAqICAgICBtb2RpZmllckxpc3QgImludGVyZmFjZSIgPT4gaW50ZXJmYWNlRGVjbGFyYXRpb24KLSAgICAqICAgICBtb2RpZmllckxpc3QgWyJwcm9wZXJ0eSJdIG9wdGlvbmFsRGF0YXR5cGUgaWRlbnRpZmllciAiKCIgICAgICAgICAgICAgICA9PiBtZXRob2REZWNsYXJhdGlvbgotICAgICogICAgIG1vZGlmaWVyTGlzdCBbInByb3BlcnR5Il0gb3B0aW9uYWxEYXRhdHlwZSBpZGVudGlmaWVyICgiPSJ8IjsifCJcbiJ8In0iID0+IHByb3BlcnR5RGVjbGFyYXRpb24KLSAgICAqICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgPT4gPGVycm9yPgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBzZWUgY2xhc3NEZWNsYXJhdGlvbigpCi0gICAgKiAgICAgc2VlIGludGVyZmFjZURlY2xhcmF0aW9uKCkKLSAgICAqICAgICBzZWUgbWV0aG9kRGVjbGFyYXRpb24oKQotICAgICogICAgIHNlZSBwcm9wZXJ0eURlY2xhcmF0aW9uKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiB0eXBlQm9keVN0YXRlbWVudChib29sZWFuIGFsbG93U3RhdGljLCBib29sZWFuIGFsbG93QWJzdHJhY3QsIGJvb2xlYW4gcmVxdWlyZUFic3RyYWN0KSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIHN0YXRlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQXMgInN0YXRpYyIgY2FuIGJlIGJvdGggYSBtb2RpZmllciBhbmQgYSBzdGF0aWMgaW5pdGlhbGl6ZXIsIHdlCi0gICAgICAgIC8vIGhhbmRsZSB0aGUgc3RhdGljIGluaXRpYWxpemVyIGZpcnN0LgotCi0gICAgICAgIGlmKCBsdCgpID09IFR5cGVzLktFWVdPUkRfU1RBVElDICYmIGx0KDIpID09IFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWFsbG93U3RhdGljKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoICJzdGF0aWMgaW5pdGlhbGl6ZXJzIG5vdCB2YWxpZCBpbiB0aGlzIGNvbnRleHQiLCBsYSgpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlZHVjdGlvbiBtb2RpZmllcnMgID0gbW9kaWZpZXJMaXN0KCB0cnVlLCBmYWxzZSApOwotICAgICAgICAgICAgVG9rZW4gICAgIGlkZW50aWZpZXIgPSBUb2tlbi5OVUxMOwotICAgICAgICAgICAgc3RhdGVtZW50ID0gbWV0aG9kRGVjbGFyYXRpb24oIG1vZGlmaWVycywgUmVkdWN0aW9uLkVNUFRZLCBpZGVudGlmaWVyLCBmYWxzZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIHByb3BlcnR5LCBjb25zdHJ1Y3RvciwgbWV0aG9kLCBjbGFzcywgb3IgaW50ZXJmYWNlLgotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUmVkdWN0aW9uIG1vZGlmaWVycyA9IG1vZGlmaWVyTGlzdCggYWxsb3dTdGF0aWMsIGFsbG93QWJzdHJhY3QgKTsKLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbm5lciB0eXBlcwotCi0gICAgICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5LRVlXT1JEX0NMQVNTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjbGFzc0RlY2xhcmF0aW9uKCBtb2RpZmllcnMgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiggbHQoKSA9PSBUeXBlcy5LRVlXT1JEX0lOVEVSRkFDRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gaW50ZXJmYWNlRGVjbGFyYXRpb24oIG1vZGlmaWVycyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIHByb3BlcnR5LCBjb25zdHJ1Y3Rvciwgb3IgbWV0aG9kLgotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IHByb3BlcnR5IGtleXdvcmQsIGlmIHByZXNlbnQgKGl0J3MgZGVwcmVjYXRlZCkKLQotICAgICAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLktFWVdPUkRfUFJPUEVSVFkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gQWxsIHByb2Nlc3NpbmcgaGVyZSBpcyB3aGl0ZXNwYWNlIHNlbnNpdGl2ZSwgaW4gb3JkZXIKLSAgICAgICAgICAgICAgICAvLyB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHdheSAiZGVmIiBmdW5jdGlvbnMgd29yayAoZHVlCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIG9wdGlvbmFsaXR5IG9mIHRoZSBzZW1pY29sb24pLiAgT25lIG9mIHRoZQotICAgICAgICAgICAgICAgIC8vIGNvbnNlcXVlbmNlcyBpcyB0aGF0IHRoZSBsZWZ0IHBhcmVudGhlc2lzIG9mIGEKLSAgICAgICAgICAgICAgICAvLyBtZXRob2QgZGVjbGFyYXRpb24gL211c3QvIGFwcGVhciBvbiB0aGUgc2FtZSBsaW5lLgotCi0gICAgICAgICAgICAgICAgd2hpbGUoIGx0KHRydWUpID09IFR5cGVzLk5FV0xJTkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5ORVdMSU5FICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB5ZXQga25vdyBhYm91dCB2b2lkLCBzbyB3ZSBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbgotCi0gICAgICAgICAgICAgICAgQ1NUTm9kZSAgIHR5cGUgICAgICAgPSBvcHRpb25hbERhdGF0eXBlKCB0cnVlLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgVG9rZW4gICAgIGlkZW50aWZpZXIgPSBuYW1lRGVjbGFyYXRpb24oIHRydWUgKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCggbHQodHJ1ZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTIDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHJlcXVpcmUgYWJzdHJhY3QgaWYgc3BlY2lmaWVkIG9uIGNhbGwgb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiYWJzdHJhY3QiIG1vZGlmaWVyIHdhcyBzdXBwbGllZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtZXRob2RJc0Fic3RyYWN0ID0gcmVxdWlyZUFic3RyYWN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggIW1ldGhvZElzQWJzdHJhY3QgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgbW9kaWZpZXJzLnNpemUoKTsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtb2RpZmllcnMuZ2V0KGkpLmdldE1lYW5pbmcoKSA9PSBUeXBlcy5LRVlXT1JEX0FCU1RSQUNUICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSXNBYnN0cmFjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbWV0aG9kRGVjbGFyYXRpb24oIG1vZGlmaWVycywgdHlwZSwgaWRlbnRpZmllciwgbWV0aG9kSXNBYnN0cmFjdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkVRVUFMOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNFTUlDT0xPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5ORVdMSU5FOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlJJR0hUX0NVUkxZX0JSQUNFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkVPRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHByb3BlcnR5RGVjbGFyYXRpb24oIG1vZGlmaWVycywgdHlwZSwgaWRlbnRpZmllciApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCBuZXcgaW50W10geyBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTLCBUeXBlcy5FUVVBTCwgVHlwZXMuU0VNSUNPTE9OLCBUeXBlcy5ORVdMSU5FLCBUeXBlcy5SSUdIVF9DVVJMWV9CUkFDRSB9ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPnR5cGVCb2R5U3RhdGVtZW50KCB0cnVlLCB0cnVlLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiBib2R5U3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlQm9keVN0YXRlbWVudCggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBuYW1lIHRoYXQgaXMgdmFsaWQgZm9yIGRlY2xhcmF0aW9ucy4gIE5ld2xpbmVzIGNhbiBiZSBtYWRlCi0gICAgKiAgc2lnbmlmaWNhbnQsIGlmIHJlcXVpcmVkIGZvciBkaXNhbWJpZ3VhdGlvbi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIG5hbWVEZWNsYXJhdGlvbiA9IDxpZGVudGlmaWVyPgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBuYW1lID0gPGlkZW50aWZpZXI+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUb2tlbiBuYW1lRGVjbGFyYXRpb24oIGJvb2xlYW4gc2lnbmlmaWNhbnROZXdsaW5lcyApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY29uc3VtZSggVHlwZXMuSURFTlRJRklFUiwgc2lnbmlmaWNhbnROZXdsaW5lcyApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIHJlZmVyZW5jZSB0byBhIGRlY2xhcmVkIG5hbWUuICBOZXdsaW5lcyBjYW4gYmUgbWFkZSBzaWduaWZpY2FudCwKLSAgICAqICBpZiByZXF1aXJlZCBmb3IgZGlzYW1iaWd1YXRpb24uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBuYW1lUmVmZXJlbmNlID0gPGlkZW50aWZpZXI+IHwgPHZhcmlvdXMga2V5d29yZHM+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIG5hbWUgPSA8aWRlbnRpZmllcj4KLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRva2VuIG5hbWVSZWZlcmVuY2UoIGJvb2xlYW4gc2lnbmlmaWNhbnROZXdsaW5lcyApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIFRva2VuIHRva2VuID0gbGEoIHNpZ25pZmljYW50TmV3bGluZXMgKTsKLSAgICAgICAgaWYoICF0b2tlbi5jYW5NZWFuKFR5cGVzLklERU5USUZJRVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IoIFR5cGVzLklERU5USUZJRVIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgdG9rZW4uc2V0TWVhbmluZyggVHlwZXMuSURFTlRJRklFUiApOwotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhbiBvcHRpb25hbCBkYXRhIHR5cGUgbWFya2VyIChmb3IgYSBwYXJhbWV0ZXIsIG1ldGhvZCByZXR1cm4gdHlwZSwKLSAgICAqICBldGMuKS4gIE5ld2xpbmVzIGNhbiBiZSBtYWRlIHNpZ25pZmljYW50LCBpZiByZXF1aXJlZCBmb3IgZGlzYW1iaWd1YXRpb24uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBvcHRpb25hbERhdGF0eXBlID0gZGF0YXR5cGU/ICg/PTxpZGVudGlmaWVyPikKLSAgICAqICA8L3ByZT5oCi0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHJlc3VsdCA9IGRhdGF0eXBlIHwge30KLSAgICAqCi0gICAgKiAgICAgc2VlIGRhdGF0eXBlKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENTVE5vZGUgb3B0aW9uYWxEYXRhdHlwZSggYm9vbGVhbiBzaWduaWZpY2FudE5ld2xpbmVzLCBib29sZWFuIGFsbG93Vm9pZCApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDU1ROb2RlIHR5cGUgPSBSZWR1Y3Rpb24uRU1QVFk7Ci0gICAgICAgIFRva2VuICAgbmV4dCA9IGxhKHNpZ25pZmljYW50TmV3bGluZXMpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGl0IGNvdWxkIGJlIGFuIHVudHlwZWQKLSAgICAgICAgLy8gdmFyaWFibGUvbWV0aG9kIG5hbWUuICBJZiBpdCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIGlkZW50aWZpZXIsCi0gICAgICAgIC8vIHdlJ2xsIGFzc3VtZSB0eXBlLiAgT3RoZXJ3aXNlLCB3ZSdsbCBhdHRlbXB0IGEgZGF0YXR5cGUgYW5kCi0gICAgICAgIC8vIHJlc3RvcmUoKSB0aGUgc3RyZWFtIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KLQotICAgICAgICBpZiggbmV4dC5pc0EoVHlwZXMuSURFTlRJRklFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbHQoMiwgc2lnbmlmaWNhbnROZXdsaW5lcykgPT0gVHlwZXMuSURFTlRJRklFUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGRhdGF0eXBlKCBhbGxvd1ZvaWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRUb2tlblN0cmVhbSgpLmNoZWNrcG9pbnQoKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGRhdGF0eXBlKCBhbGxvd1ZvaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGx0KHNpZ25pZmljYW50TmV3bGluZXMpICE9IFR5cGVzLklERU5USUZJRVIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFRva2VuU3RyZWFtKCkucmVzdG9yZSgpOwotICAgICAgICAgICAgICAgICAgICB0eXBlID0gUmVkdWN0aW9uLkVNUFRZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUgbmFtZSwgaXQgbXVzdCBiZSBhIGRhdGF0eXBlLiAgSWYgdm9pZAotICAgICAgICAvLyBpcyBwcmVzZW50IGJ1dCBub3QgYWxsb3dlZCwgaXQgaXMgYW4gZXJyb3IsIGFuZCB3ZSBsZXQgZGF0YXR5cGUoKQotICAgICAgICAvLyBjYXRjaCBpdC4KLQotICAgICAgICBlbHNlIGlmKCBuZXh0LmlzQShUeXBlcy5QUklNSVRJVkVfVFlQRSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gZGF0YXR5cGUoIGFsbG93Vm9pZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBjbGFzcy9pbnRlcmZhY2UgcHJvcGVydHksIGluY2x1ZGluZyB0aGUgb3B0aW9uYWwgaW5pdGlhbGl6YXRpb24KLSAgICAqICBjbGF1c2UuICBUaGUgbW9kaWZpZXJzLCB0eXBlLCBhbmQgaWRlbnRpZmllciBoYXZlIGFscmVhZHkgYmVlbiBpZGVudGlmaWVkCi0gICAgKiAgYnkgdGhlIGNhbGxlciwgYW5kIGFyZSBwYXNzZWQgaW4uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBwcm9wZXJ0eURlY2xhcmF0aW9uID0gKG1vZGlmaWVyTGlzdCBvcHRpb25hbERhdGF0eXBlIG5hbWVEZWNsYXJhdGlvbiBbIj0iIGV4cHJlc3Npb25dKSA8ZW9zPgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBwcm9wZXJ0eSA9IHsgPGlkZW50aWZpZXI+OlNZTlRIX1BST1BFUlRZIG1vZGlmaWVyTGlzdCBvcHRpb25hbERhdGF0eXBlIGV4cHJlc3Npb24/IH0KLSAgICAqCi0gICAgKiAgICAgc2VlIG1vZGlmaWVyTGlzdCgpCi0gICAgKiAgICAgc2VlIG9wdGlvbmFsRGF0YXR5cGUoKQotICAgICogICAgIHNlZSBleHByZXNzaW9uKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHVibGljIFJlZHVjdGlvbiBwcm9wZXJ0eURlY2xhcmF0aW9uKCBSZWR1Y3Rpb24gbW9kaWZpZXJzLCBDU1ROb2RlIHR5cGUsIFRva2VuIGlkZW50aWZpZXIgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIHByb3BlcnR5ID0gaWRlbnRpZmllci5hc1JlZHVjdGlvbiggbW9kaWZpZXJzLCB0eXBlICk7Ci0gICAgICAgIHByb3BlcnR5LnNldE1lYW5pbmcoIFR5cGVzLlNZTlRIX1BST1BFUlRZICk7Ci0KLSAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuRVFVQUwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdW1lKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eS5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIGNsYXNzL2ludGVyZmFjZSBtZXRob2QuICBUaGUgbW9kaWZpZXJzLCB0eXBlLCBhbmQgaWRlbnRpZmllciBoYXZlCi0gICAgKiAgYWxyZWFkeSBiZWVuIGlkZW50aWZpZWQgYnkgdGhlIGNhbGxlciwgYW5kIGFyZSBwYXNzZWQgaW4uICBJZiA8Y29kZT5lbXB0eU9ubHk8L2NvZGU+Ci0gICAgKiAgaXMgc2V0LCBubyBtZXRob2QgYm9keSB3aWxsIGJlIGFsbG93ZWQuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBtZXRob2REZWNsYXJhdGlvbiA9IG1vZGlmaWVyTGlzdCBvcHRpb25hbERhdGF0eXBlIGlkZW50aWZpZXIKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICIoIiBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgIikiCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBbICJ0aHJvd3MiIHR5cGVMaXN0IF0KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICggc3RhdGVtZW50Qm9keSB8IDxlb3M+ICkKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgbWV0aG9kID0geyA8aWRlbnRpZmllcj46U1lOVEhfTUVUSE9EIG1vZGlmaWVyTGlzdCBvcHRpb25hbERhdGF0eXBlCi0gICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IHRocm93c0NsYXVzZSBzdGF0ZW1lbnRCb2R5IH0KLSAgICAqCi0gICAgKiAgICAgdGhyb3dzQ2xhdXNlID0geyAidGhyb3dzIiBkYXRhdHlwZSsgfSB8IHt9Ci0gICAgKgotICAgICogICAgIHNlZSBtb2RpZmllckxpc3QoKQotICAgICogICAgIHNlZSBvcHRpb25hbERhdGF0eXBlKCkKLSAgICAqICAgICBzZWUgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KCkKLSAgICAqICAgICBzZWUgc3RhdGVtZW50Qm9keSgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHB1YmxpYyBSZWR1Y3Rpb24gbWV0aG9kRGVjbGFyYXRpb24oIFJlZHVjdGlvbiBtb2RpZmllcnMsIENTVE5vZGUgdHlwZSwgVG9rZW4gaWRlbnRpZmllciwgYm9vbGVhbiBlbXB0eU9ubHkpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWR1Y3Rpb24gbWV0aG9kID0gaWRlbnRpZmllci5hc1JlZHVjdGlvbiggbW9kaWZpZXJzLCB0eXBlICk7Ci0gICAgICAgIG1ldGhvZC5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9NRVRIT0QgKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBwYXJhbWV0ZXIgbGlzdAotCi0gICAgICAgIGNvbnN1bWUoVHlwZXMuTEVGVF9QQVJFTlRIRVNJUyk7Ci0gICAgICAgIG1ldGhvZC5hZGQoIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCgpICk7Ci0gICAgICAgIGNvbnN1bWUoVHlwZXMuUklHSFRfUEFSRU5USEVTSVMpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIG9wdGlvbmFsICJ0aHJvd3MiIGNsYXVzZQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QuYWRkKCB0eXBlTGlzdCggVHlwZXMuS0VZV09SRF9USFJPV1MsIHRydWUsIDAgKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlKTsKLSAgICAgICAgICAgIG1ldGhvZC5hZGQoIFJlZHVjdGlvbi5FTVBUWSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQW5kIHRoZSBib2R5LiAgSWYgaXQgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgdGhlcmUsIHJlcG9ydCB0aGUKLSAgICAgICAgLy8gZXJyb3IsIGJ1dCBwcm9jZXNzIGl0IGFueXdheSwgZm9yIHRoZSBwb2ludCBvZiByZWNvdmVyaW5nLgotCi0gICAgICAgIENTVE5vZGUgYm9keSA9IG51bGw7Ci0KLSAgICAgICAgaWYoIGVtcHR5T25seSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoICJhYnN0cmFjdCBhbmQgaW50ZXJmYWNlIG1ldGhvZHMgY2Fubm90IGhhdmUgYSBib2R5IiwgbGEoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvZHkgPSBSZWR1Y3Rpb24uRU1QVFk7Ci0gICAgICAgICAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGJvZHkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvZHkgPSBzdGF0ZW1lbnRCb2R5KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0aG9kLmFkZCggYm9keSApOwotCi0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gbGlzdCwgd2hpY2ggY2FuIG9jY3VyIG9uIG1ldGhvZHMgYW5kIGNsb3N1cmVzLgotICAgICogIEl0IGxvb3BzIGFzIGxvbmcgYXMgaXQgZmluZHMgYSBjb21tYSBhcyB0aGUgbmV4dCB0b2tlbi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAotICAgICogICAgICAgID0gKHBhcmFtZXRlckRlY2xhcmF0aW9uICgiLCIgcGFyYW1ldGVyRGVjbGFyYXRpb24pKiAoIiwiIHBhcmFtZXRlckRlY2xhcmF0aW9uICI9IiBleHByZXNzaW9uKSogKT8KLSAgICAqICAgICAgICB8IChwYXJhbWV0ZXJEZWNsYXJhdGlvbiAiPSIgZXhwcmVzc2lvbiAoIiwiIHBhcmFtZXRlckRlY2xhcmF0aW9uICI9IiBleHByZXNzaW9uKSogKT8KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgcGFyYW1ldGVycyA9IHsgPG51bGw+IHBhcmFtZXRlciogfQotICAgICogICAgIHBhcmFtZXRlciAgPSB7IDxpZGVudGlmaWVyPjpTWU5USF9QQVJBTUVURVJfREVDTEFSQVRJT04gb3B0aW9uYWxEYXRhdHlwZSBkZWZhdWx0PyB9Ci0gICAgKiAgICAgZGVmYXVsdCAgICA9IGV4cHJlc3Npb24KLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIGxpc3QgPSBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBleHBlY3REZWZhdWx0cyA9IGZhbHNlOwotICAgICAgICB3aGlsZSggbGEoKS5pc0EoVHlwZXMuVFlQRV9OQU1FKSApICAvLyBUWVBFX05BTUUgaW5jbHVkZXMgPGlkZW50aWZpZXI+LCBhbmQgc28gZG9lcyBkb3VibGUgZHV0eQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGRlY2xhcmF0aW9uCi0KLSAgICAgICAgICAgIFJlZHVjdGlvbiBwYXJhbWV0ZXIgPSAoUmVkdWN0aW9uKWxpc3QuYWRkKCBwYXJhbWV0ZXJEZWNsYXJhdGlvbigpICk7Ci0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBkZWZhdWx0IHBhcmFtZXRlciAoaXQgaXMgcmVxdWlyZWQgb24gZXZlcnkgcGFyYW1ldGVyCi0gICAgICAgICAgICAvLyBhZnRlciB0aGUgZmlyc3Qgb2NjdXJyYW5jZSkuCi0KLSAgICAgICAgICAgIGlmKCBleHBlY3REZWZhdWx0cyB8fCBsdCgpID09IFR5cGVzLkVRVUFMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3REZWZhdWx0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuRVFVQUwgKTsKLQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRvbmUuCi0KLSAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkNPTU1BICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5DT01NQSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgc2luZ2xlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiwgd2hpY2ggY2FuIG9jY3VyIG9uIG1ldGhvZHMgYW5kIGNsb3N1cmVzLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBvcHRpb25hbERhdGF0eXBlIG5hbWVEZWNsYXJhdGlvbgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBwYXJhbWV0ZXIgPSB7IDxpZGVudGlmaWVyPjpTWU5USF9QQVJBTUVURVJfREVDTEFSQVRJT04gb3B0aW9uYWxEYXRhdHlwZSB9Ci0gICAgKgotICAgICogICAgIHNlZSBvcHRpb25hbERhdGF0eXBlKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbigpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDU1ROb2RlICAgdHlwZSAgICAgID0gb3B0aW9uYWxEYXRhdHlwZSggZmFsc2UsIGZhbHNlICk7Ci0gICAgICAgIFJlZHVjdGlvbiBwYXJhbWV0ZXIgPSBuYW1lRGVjbGFyYXRpb24oIGZhbHNlICkuYXNSZWR1Y3Rpb24oIHR5cGUgKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldE1lYW5pbmcoIFR5cGVzLlNZTlRIX1BBUkFNRVRFUl9ERUNMQVJBVElPTiApOwotCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXI7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgZGF0YXR5cGUgc3BlY2lmaWNhdGlvbi4gIEZvciByZWFzb25zIG9mIGRpc2FtYmlndWF0aW9uLAotICAgICogIHRoZSBhcnJheSBtYXJrZXIgKFtdKSBtdXN0IG5ldmVyIGJlIG9uIGEgc2VwYXJhdGUgbGluZSBmcm9tIHRoZQotICAgICogIGJhc2UgZGF0YXR5cGUuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBkYXRhdHlwZSA9IHNjYWxhckRhdGF0eXBlICggIlsiICJdIiApKgotICAgICoKLSAgICAqICAgICBzY2FsYXJEYXRhdHlwZSA9IGRvdHRlZElkZW50aWZpZXIgfCAidm9pZCIgfCAiaW50IiB8IC4uLgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBkYXRhdHlwZSAgPSB7ICJbIiBkYXRhdHlwZSB9IHwgc2NhbGFyCi0gICAgKiAgICAgc2NhbGFyICAgID0gZG90dGVkSWRlbnRpZmllciB8IHByaW1pdGl2ZQotICAgICogICAgIHByaW1pdGl2ZSA9ICJ2b2lkIiB8ICJpbnQiIHwgLi4uCi0gICAgKgotICAgICogICAgIHNlZSBkb3R0ZWRJZGVudGlmaWVyKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENTVE5vZGUgZGF0YXR5cGUoIGJvb2xlYW4gYWxsb3dWb2lkICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENTVE5vZGUgZGF0YXR5cGUgPSBzY2FsYXJEYXRhdHlwZShhbGxvd1ZvaWQpOwotCi0gICAgICAgIHdoaWxlKCBsdCh0cnVlKSA9PSBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUICkKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YXR5cGUgPSBjb25zdW1lKFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQpLmFzUmVkdWN0aW9uKCBkYXRhdHlwZSApOwotICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuUklHSFRfU1FVQVJFX0JSQUNLRVQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkYXRhdHlwZTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPmRhdGF0eXBlKCB0cnVlICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ1NUTm9kZSBkYXRhdHlwZSgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZGF0YXR5cGUodHJ1ZSk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgc2NhbGFyIGRhdGF0eXBlIHNwZWNpZmljYXRpb24uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBzY2FsYXJEYXRhdHlwZSA9IGRvdHRlZElkZW50aWZpZXIgfCAidm9pZCIgfCAiaW50IiB8IC4uLgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBzY2FsYXIgICAgPSBkb3R0ZWRJZGVudGlmaWVyIHwgcHJpbWl0aXZlCi0gICAgKiAgICAgcHJpbWl0aXZlID0gInZvaWQiIHwgImludCIgfCAuLi4KLSAgICAqCi0gICAgKiAgICAgc2VlIGRvdHRlZElkZW50aWZpZXIoKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ1NUTm9kZSBzY2FsYXJEYXRhdHlwZSggYm9vbGVhbiBhbGxvd1ZvaWQgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ1NUTm9kZSBkYXRhdHlwZSA9IG51bGw7Ci0KLSAgICAgICAgaWYoIGxhKCkuaXNBKGFsbG93Vm9pZCA/IFR5cGVzLlBSSU1JVElWRV9UWVBFIDogVHlwZXMuQ1JFQVRBQkxFX1BSSU1JVElWRV9UWVBFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGF0eXBlID0gY29uc3VtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YXR5cGUgPSBkb3R0ZWRJZGVudGlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YXR5cGU7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIHRoZSBib2R5IG9mIGEgY29tcGxleCBzdGF0ZW1lbnQgKGxpa2UgImlmIiwgImZvciIsIGV0Yy4pLgotICAgICogIFNldCA8Y29kZT5yZXF1aXJlQnJhY2VzPC9jb2RlPiBpZiB0aGUgYm9keSBtdXN0IG5vdCBiZSBqdXN0IGEgc2luZ2xlCi0gICAgKiAgc3RhdGVtZW50LgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgc3RhdGVtZW50Qm9keSA9ICgieyIgc3RhdGVtZW50KiAifSIpCi0gICAgKiAgICAgICAgICAgICAgICAgICB8IHN0YXRlbWVudAotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBjb21wbGV4ID0geyAieyIgc3RhdGVtZW50KiB9Ci0gICAgKiAgICAgc2ltcGxlICA9IHN0YXRlbWVudAotICAgICoKLSAgICAqICAgICBzZWUgc3RhdGVtZW50KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENTVE5vZGUgc3RhdGVtZW50Qm9keSggYm9vbGVhbiByZXF1aXJlQnJhY2VzICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENTVE5vZGUgYm9keSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGx0KCkgPT0gVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW4gYnJhY2UgPSBjb25zdW1lKCBUeXBlcy5MRUZUX0NVUkxZX0JSQUNFICk7Ci0gICAgICAgICAgICBicmFjZS5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9CTE9DSyApOwotCi0gICAgICAgICAgICBib2R5ID0gc3RhdGVtZW50c1VudGlsUmlnaHRDdXJseSgpOwotICAgICAgICAgICAgYm9keS5zZXQoIDAsIGJyYWNlICk7Ci0KLSAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX0NVUkxZX0JSQUNFICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcmVxdWlyZUJyYWNlcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGJvZHkgPSBzdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBib2R5OwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJlYWRzIHN0YXRlbWVudHMgdW50aWwgYSAifSIgaXMgbWV0LgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgc3RhdGVtZW50c1VudGlsUmlnaHRDdXJseSA9IHN0YXRlbWVudCogKD89ICJ9IikKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgc3RhdGVtZW50cyA9IHsgPG51bGw+IHN0YXRlbWVudCogfQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIHN0YXRlbWVudHNVbnRpbFJpZ2h0Q3VybHkoICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBibG9jayA9IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKTsKLQotICAgICAgICB3aGlsZSggbHQoKSAhPSBUeXBlcy5FT0YgJiYgbHQoKSAhPSBUeXBlcy5SSUdIVF9DVVJMWV9CUkFDRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJsb2NrLmFkZCggc3RhdGVtZW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBTeW50YXhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvciggZSApOwotICAgICAgICAgICAgICAgIHJlY292ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gUFJPRFVDVElPTlM6IFNUQVRFTUVOVFMKLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBzaW5nbGUgc3RhdGVtZW50LiAgU3RhdGVtZW50cyBpbmNsdWRlOiBsb29wIGNvbnN0cnVjdHMsIGJyYW5jaAotICAgICogIGNvbnN0cnVjdHMsIGZsb3cgY29udHJvbCBjb25zdHJ1Y3RzLCBleGNlcHRpb24gY29uc3RydWN0cywgZXhwcmVzc2lvbnMgb2YKLSAgICAqICBhIHZhcmlldHkgb2YgdHlwZXMsIGFuZCBwcmV0dHkgbXVjaCBhbnl0aGluZyB5b3UgY2FuIHB1dCBpbnNpZGUgYSBtZXRob2QuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBzdGF0ZW1lbnQgICAgICA9IChsYWJlbCAiOiIpPyBiYXJlU3RhdGVtZW50Ci0gICAgKiAgICAgYmFyZVN0YXRlbWVudCAgPSAoZW1wdHlTdGF0ZW1lbnR8YmFzaWNTdGF0ZW1lbnR8YmxvY2tTdGF0ZW1lbnQpCi0gICAgKgotICAgICogICAgIGJhc2ljU3RhdGVtZW50ID0gZm9yU3RhdGVtZW50Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgfCB3aGlsZVN0YXRlbWVudAotICAgICogICAgICAgICAgICAgICAgICAgIHwgZG9TdGF0ZW1lbnQKLSAgICAqICAgICAgICAgICAgICAgICAgICB8IGNvbnRpbnVlU3RhdGVtZW50Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgfCBicmVha1N0YXRlbWVudAotICAgICogICAgICAgICAgICAgICAgICAgIHwgaWZTdGF0ZW1lbnQKLSAgICAqICAgICAgICAgICAgICAgICAgICB8IHRyeVN0YXRlbWVudAotICAgICogICAgICAgICAgICAgICAgICAgIHwgdGhyb3dTdGF0ZW1lbnQKLSAgICAqICAgICAgICAgICAgICAgICAgICB8IHN5bmNocm9uaXplZFN0YXRlbWVudAotICAgICogICAgICAgICAgICAgICAgICAgIHwgc3dpdGNoU3RhdGVtZW50Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgfCByZXR1cm5TdGF0ZW1lbnQKLSAgICAqICAgICAgICAgICAgICAgICAgICB8IGFzc2VydFN0YXRlbWVudAotICAgICogICAgICAgICAgICAgICAgICAgIHwgZXhwcmVzc2lvbiA8ZW9zPgotICAgICoKLSAgICAqICAgICBsYWJlbCAgICAgICAgICA9IDxpZGVudGlmaWVyPgotICAgICogICAgIGJsb2NrU3RhdGVtZW50ID0gInsiIHN0YXRlbWVudCogIn0iCi0gICAgKiAgICAgZW1wdHlTdGF0ZW1lbnQgPSAiOyIKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBSZWNvZ25pdGlvbjogPHByZT4KLSAgICAqICAgICAiOyIgICAgICAgPT4gZW1wdHlTdGF0ZW1lbnQKLSAgICAqICAgICA8a2V5d29yZD4gPT4gPGtleXdvcmQ+U3RhdGVtZW50Ci0gICAgKiAgICAgInsiICAgICAgID0+IGV4cHJlc3Npb24sIHRoZW46Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYSBjbG9zdXJlRXhwcmVzc2lvbiBhbmQgaGFzIG5vIHBhcmFtZXRlcnMgPT4gYmxvY2tTdGF0ZW1lbnQKLSAgICAqCi0gICAgKiAgICAgKiAgICAgICAgID0+IGV4cHJlc3Npb24KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgbGFiZWxsZWQgICAgICAgPSB7IDxpZGVudGlmaWVyPjpTWU5USF9MQUJFTCBiYXJlU3RhdGVtZW50IH0KLSAgICAqICAgICBiYXJlU3RhdGVtZW50ICA9IGVtcHR5U3RhdGVtZW50IHwgYmxvY2tTdGF0ZW1lbnQgfCBiYXNpY1N0YXRlbWVudAotICAgICogICAgIGVtcHR5U3RhdGVtZW50ID0geyAieyIgfQotICAgICogICAgIGJsb2NrU3RhdGVtZW50ID0geyAieyIgc3RhdGVtZW50KiB9Ci0gICAgKgotICAgICogICAgIHNlZSBmb3JTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSB3aGlsZVN0YXRlbWVudCgpCi0gICAgKiAgICAgc2VlIGRvU3RhdGVtZW50KCkKLSAgICAqICAgICBzZWUgY29udGludWVTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSBicmVha1N0YXRlbWVudCgpCi0gICAgKiAgICAgc2VlIGlmU3RhdGVtZW50KCkKLSAgICAqICAgICBzZWUgdHJ5U3RhdGVtZW50KCkKLSAgICAqICAgICBzZWUgdGhyb3dTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSBzd2l0Y2hTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSByZXR1cm5TdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSBhc3NlcnRTdGF0ZW1lbnQoKQotICAgICogICAgIHNlZSBleHByZXNzaW9uKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENTVE5vZGUgc3RhdGVtZW50KCBib29sZWFuIGFsbG93VW5sYWJlbGxlZEJsb2NrcyApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDU1ROb2RlIHN0YXRlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGFuZCBncmFiIGFueSBsYWJlbCBmb3IgdGhlIHN0YXRlbWVudAotCi0gICAgICAgIENTVE5vZGUgbGFiZWwgPSBudWxsOwotICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5JREVOVElGSUVSICYmIGx0KDIpID09IFR5cGVzLkNPTE9OICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFiZWwgPSBjb25zdW1lKCBUeXBlcy5JREVOVElGSUVSICkuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgICAgIGxhYmVsLnNldE1lYW5pbmcoIFR5cGVzLlNZTlRIX0xBQkVMICk7Ci0KLSAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLkNPTE9OICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBzdGF0ZW1lbnQKLQotICAgICAgICBzd2l0Y2goIGx0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQVNTRVJUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGFzc2VydFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfQlJFQUs6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gYnJlYWtTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0NPTlRJTlVFOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbnRpbnVlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9JRjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBpZlN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfUkVUVVJOOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHJldHVyblN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfU1dJVENIOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN3aXRjaFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfU1lOQ0hST05JWkVEOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN5bmNocm9uaXplZFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfVEhST1c6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhyb3dTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1RSWToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0cnlTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0ZPUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBmb3JTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0RPOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGRvV2hpbGVTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX1dISUxFOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHdoaWxlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgVHlwZXMuU0VNSUNPTE9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbnN1bWUoKS5hc1JlZHVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9CTE9DSyApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0U6Ci0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIEJhcmUgYmxvY2tzIGFyZSBubyBsb25nZXIgZ2VuZXJhbGx5IHN1cHBvcnRlZCwgZHVlIHRvIHRoZSBhbWJpZ3VpdHkKLSAgICAgICAgICAgICAgICAvLyB3aXRoIGNsb3N1cmVzLiAgRnVydGhlciwgY2xvc3VyZXMgYW5kIGJsb2NrcyBjYW4gbG9vayBpZGVudGljYWwKLSAgICAgICAgICAgICAgICAvLyB1bnRpbCBhZnRlciBwYXJzaW5nLCBzbyB3ZSBwcm9jZXNzIGZpcnN0IGFzIGEgY2xvc3VyZSBleHByZXNzaW9uLAotICAgICAgICAgICAgICAgIC8vIHRoZW4sIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgcGFyYW1ldGVyLWxlc3MsIGJhcmUgY2xvc3VyZSwgcmVidWlsZAotICAgICAgICAgICAgICAgIC8vIGl0IGFzIGEgYmxvY2sgKHdoaWNoIGdlbmVyYWxseSByZXF1aXJlcyBhIGxhYmVsKS4gIEpveS4KLQotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBpZiggc3RhdGVtZW50LmlzQShUeXBlcy5TWU5USF9DTE9TVVJFKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggIXN0YXRlbWVudC5nZXQoMSkuaGFzQ2hpbGRyZW4oKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZHVjdGlvbiBibG9jayA9IHN0YXRlbWVudC5nZXRSb290KCkuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLnNldE1lYW5pbmcoIFR5cGVzLlNZTlRIX0JMT0NLICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5hZGRDaGlsZHJlbk9mKCBzdGF0ZW1lbnQuZ2V0KDIpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsYWJlbCA9PSBudWxsICYmICFhbGxvd1VubGFiZWxsZWRCbG9ja3MgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoICJncm9vdnkgZG9lcyBub3Qgc3VwcG9ydCBhbm9ueW1vdXMgYmxvY2tzOyBwbGVhc2UgYWRkIGEgbGFiZWwiLCBzdGF0ZW1lbnQuZ2V0Um9vdCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGJsb2NrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgY2xvc3VyZSBleHByZXNzaW9uLCBhbmQgbXVzdCBiZSBhIHN0YXRlbWVudAotCi0gICAgICAgICAgICAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3ZlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV3JhcCB0aGUgc3RhdGVtZW50IGluIHRoZSBsYWJlbCwgaWYgbmVjZXNzYXJ5LgotCi0gICAgICAgIGlmKCBsYWJlbCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbGFiZWwuYWRkKCBzdGF0ZW1lbnQgKTsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGxhYmVsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTeW5vbnltIGZvciA8Y29kZT5zdGF0ZW1lbnQoIGZhbHNlICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgQ1NUTm9kZSBzdGF0ZW1lbnQoICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQoIGZhbHNlICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGFuIGFzc2VydCBzdGF0ZW1lbnQuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBhc3NlcnRTdGF0ZW1lbnQgPSAiYXNzZXJ0IiBleHByZXNzaW9uICgiOiIgZXhwcmVzc2lvbikgPGVvcz4KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgYXNzZXJ0ID0geyAiYXNzZXJ0IiBleHByZXNzaW9uIGV4cHJlc3Npb24/IH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIGFzc2VydFN0YXRlbWVudCgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWR1Y3Rpb24gc3RhdGVtZW50ID0gY29uc3VtZSggVHlwZXMuS0VZV09SRF9BU1NFUlQgKS5hc1JlZHVjdGlvbiggZXhwcmVzc2lvbigpICk7Ci0KLSAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuQ09MT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5DT0xPTiApOwotICAgICAgICAgICAgc3RhdGVtZW50LmFkZCggZXhwcmVzc2lvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmRPZlN0YXRlbWVudCgpOwotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgYnJlYWsgc3RhdGVtZW50LiAgV2UgcmVxdWlyZSB0aGUgbGFiZWwgb24gdGhlIHNhbWUgbGluZS4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIGJyZWFrU3RhdGVtZW50ID0gImJyZWFrIiBsYWJlbD8gPGVvcz4KLSAgICAqCi0gICAgKiAgICAgbGFiZWwgPSA8aWRlbnRpZmllcj4KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgc3RhdGVtZW50ID0geyAiYnJlYWsiIGxhYmVsPyB9Ci0gICAgKiAgICAgbGFiZWwgICAgID0gPGlkZW50aWZpZXI+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gYnJlYWtTdGF0ZW1lbnQoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIHN0YXRlbWVudCA9IGNvbnN1bWUoVHlwZXMuS0VZV09SRF9CUkVBSykuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgaWYoIGx0KHRydWUpID09IFR5cGVzLklERU5USUZJRVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKCBjb25zdW1lKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZE9mU3RhdGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBjb250aW51ZSBzdGF0ZW1lbnQuICBXZSByZXF1aXJlIHRoZSBsYWJlbCBvbiB0aGUgc2FtZSBsaW5lLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgY29udGludWVTdGF0ZW1lbnQgPSAiY29udGludWUiIGxhYmVsPyA8ZW9zPgotICAgICoKLSAgICAqICAgICBsYWJlbCA9IDxpZGVudGlmaWVyPgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBzdGF0ZW1lbnQgPSB7ICJjb250aW51ZSIgbGFiZWw/IH0KLSAgICAqICAgICBsYWJlbCAgICAgPSA8aWRlbnRpZmllcj4KLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBjb250aW51ZVN0YXRlbWVudCgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWR1Y3Rpb24gc3RhdGVtZW50ID0gY29uc3VtZShUeXBlcy5LRVlXT1JEX0NPTlRJTlVFKS5hc1JlZHVjdGlvbigpOwotICAgICAgICBpZiggbHQodHJ1ZSkgPT0gVHlwZXMuSURFTlRJRklFUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoIGNvbnN1bWUoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIHRocm93IHN0YXRlbWVudC4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHRocm93U3RhdGVtZW50ID0gInRocm93IiBleHByZXNzaW9uIDxlb3M+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHN0YXRlbWVudCA9IHsgInRocm93IiBleHByZXNzaW9uIH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIHRocm93U3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfVEhST1cpLmFzUmVkdWN0aW9uKCBleHByZXNzaW9uKCkgKTsKLSAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhbiBpZiBzdGF0ZW1lbnQuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBpZlN0YXRlbWVudCAgPSBpZkNsYXVzZSBlbHNlSWZDbGF1c2UqIGVsc2VDbGF1c2U/Ci0gICAgKgotICAgICogICAgIGlmQ2xhdXNlICAgICA9ICJpZiIgIigiIGV4cHJlc3Npb24gIikiIHN0YXRlbWVudEJvZHkKLSAgICAqICAgICBlbHNlSWZDbGF1c2UgPSAiZWxzZSIgImlmIiAiKCIgZXhwcmVzc2lvbiAiKSIgc3RhdGVtZW50Qm9keQotICAgICogICAgIGVsc2VDbGF1c2UgICA9ICJlbHNlIiBzdGF0ZW1lbnRCb2R5Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIGlmICAgPSB7ICJpZiIgZXhwcmVzc2lvbiBzdGF0ZW1lbnRCb2R5IGVsc2U/IH0KLSAgICAqICAgICBlbHNlID0gaWYgfCB7ICJlbHNlIiBzdGF0ZW1lbnRCb2R5IH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogICAgIHNlZSBzdGF0ZW1lbnRCb2R5KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBpZlN0YXRlbWVudCgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBpZiBjbGF1c2UKLQotICAgICAgICBSZWR1Y3Rpb24gc3RhdGVtZW50ID0gY29uc3VtZShUeXBlcy5LRVlXT1JEX0lGKS5hc1JlZHVjdGlvbigpOwotCi0gICAgICAgIGNvbnN1bWUoIFR5cGVzLkxFRlRfUEFSRU5USEVTSVMgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGVtZW50LmFkZCggZXhwcmVzc2lvbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFN5bnRheEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvciggZSApOwotICAgICAgICAgICAgcmVjb3ZlciggVHlwZXMuUklHSFRfUEFSRU5USEVTSVMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgc3RhdGVtZW50LmFkZCggc3RhdGVtZW50Qm9keShmYWxzZSkgKTsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIHRoZSBlbHNlIGNsYXVzZSBpcyBwcmVzZW50OgotICAgICAgICAvLyAgIGlmIGl0IGlzIGFuIGVsc2UgaWYsIHJlY3Vyc2UKLSAgICAgICAgLy8gICBvdGhlcndpc2UsIGJ1aWxkIHRoZSBlbHNlIG5vZGUgZGlyZWN0bHkuCi0KLSAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9FTFNFICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGx0KDIpID09IFR5cGVzLktFWVdPUkRfSUYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLktFWVdPUkRfRUxTRSApOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoIGlmU3RhdGVtZW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWR1Y3Rpb24gbGFzdCA9IChSZWR1Y3Rpb24pc3RhdGVtZW50LmFkZCggY29uc3VtZShUeXBlcy5LRVlXT1JEX0VMU0UpLmFzUmVkdWN0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICBsYXN0LmFkZCggc3RhdGVtZW50Qm9keShmYWxzZSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgcmV0dXJuIHN0YXRlbWVudC4gIEFueSBleHByZXNzaW9uIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgbGluZQotICAgICogIGFzIHRoZSAicmV0dXJuIi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHJldHVyblN0YXRlbWVudCA9ICJyZXR1cm4iIGV4cHJlc3Npb24/IDxlb3M+Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHN0YXRlbWVudCA9IHsgInJldHVybiIgZXhwcmVzc2lvbj8gfQotICAgICoKLSAgICAqICAgICBzZWUgZXhwcmVzc2lvbigpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gcmV0dXJuU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfUkVUVVJOKS5hc1JlZHVjdGlvbigpOwotCi0gICAgICAgIGlmKCAhbGEodHJ1ZSkuaXNBKFR5cGVzLkFOWV9FTkRfT0ZfU1RBVEVNRU5UKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5kT2ZTdGF0ZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIHN3aXRjaCBzdGF0ZW1lbnQuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBzd2l0Y2hTdGF0bWVudCA9ICJzd2l0Y2giICIoIiBleHByZXNzaW9uICIpIiAieyIgc3dpdGNoQm9keSAifSIKLSAgICAqCi0gICAgKiAgICAgc3dpdGNoQm9keSA9IGNhc2VTZXQqCi0gICAgKiAgICAgY2FzZVNldCA9ICgoImNhc2UiIGV4cHJlc3Npb24gIjoiKSsgfCAoImRlZmF1bHQiICI6IikpIHN0YXRlbWVudCsKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgc3dpdGNoID0geyAic3dpdGNoIiBleHByZXNzaW9uIGNhc2UqIH0KLSAgICAqICAgICBjYXNlICAgPSB7ICJjYXNlIiBleHByZXNzaW9uIHN0YXRlbWVudCogfQotICAgICogICAgICAgICAgICB8IHsgImRlZmF1bHQiIHN0YXRlbWVudCogfQotICAgICoKLSAgICAqICAgICBzZWUgZXhwcmVzc2lvbigpCi0gICAgKiAgICAgc2VlIHN0YXRlbWVudCgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gc3dpdGNoU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfU1dJVENIKS5hc1JlZHVjdGlvbigpOwotICAgICAgICBjb25zdW1lKCBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTICk7Ci0gICAgICAgIHN0YXRlbWVudC5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICBjb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHN3aXRjaCBib2R5LiAgTGFiZWxzIGNhbiBiZSBwcmV0dHkgbXVjaCBhbnl0aGluZywKLSAgICAgICAgLy8gYnV0IHdlJ2xsIGR1cGxpY2F0ZS1jaGVjayBmb3IgZGVmYXVsdC4KLQotICAgICAgICBjb25zdW1lKCBUeXBlcy5MRUZUX0NVUkxZX0JSQUNFICk7Ci0KLSAgICAgICAgYm9vbGVhbiBkZWZhdWx0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9DQVNFIHx8IGx0KCkgPT0gVHlwZXMuS0VZV09SRF9ERUZBVUxUICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxhYmVsCi0KLSAgICAgICAgICAgIFJlZHVjdGlvbiBjYXNlQmxvY2sgPSBudWxsOwotICAgICAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9DQVNFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlQmxvY2sgPSBjb25zdW1lKCBUeXBlcy5LRVlXT1JEX0NBU0UgKS5hc1JlZHVjdGlvbiggZXhwcmVzc2lvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBsdCgpID09IFR5cGVzLktFWVdPUkRfREVGQVVMVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGRlZmF1bHRGb3VuZCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCAiZHVwbGljYXRlIGRlZmF1bHQgZW50cnkgaW4gc3dpdGNoIiwgbGEoKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2VCbG9jayA9IGNvbnN1bWUoIFR5cGVzLktFWVdPUkRfREVGQVVMVCApLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJvciggbmV3IGludFtdIHsgVHlwZXMuS0VZV09SRF9ERUZBVUxULCBUeXBlcy5LRVlXT1JEX0NBU0UgfSApOwotICAgICAgICAgICAgICAgIHJlY292ZXIoIFR5cGVzLlNXSVRDSF9FTlRSSUVTICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLkNPTE9OICk7Ci0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHN0YXRlbWVudHMsIGlmIGFueQotCi0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlKCAhbGEoKS5pc0EoVHlwZXMuU1dJVENIX0JMT0NLX1RFUk1JTkFUT1JTKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZUJsb2NrLmFkZCggc3RhdGVtZW50KGZpcnN0KSApOwotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoIGNhc2VCbG9jayApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3VtZSggVHlwZXMuUklHSFRfQ1VSTFlfQlJBQ0UgKTsKLQotICAgICAgICByZXR1cm4gc3RhdGVtZW50OwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQgPSAic3luY2hyb25pemVkIiAiKCIgZXhwcmVzc2lvbiAiKSIgc3RhdGVtZW50Qm9keQotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBzdGF0ZW1lbnQgPSB7ICJzeW5jaHJvbml6ZWQiIGV4cHJlc3Npb24gc3RhdGVtZW50Qm9keSB9Ci0gICAgKgotICAgICogICAgIHNlZSBleHByZXNzaW9uKCkKLSAgICAqICAgICBzZWUgc3RhdGVtZW50Qm9keSgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gc3luY2hyb25pemVkU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfU1lOQ0hST05JWkVEKS5hc1JlZHVjdGlvbigpOwotCi0gICAgICAgIGNvbnN1bWUoIFR5cGVzLkxFRlRfUEFSRU5USEVTSVMgKTsKLSAgICAgICAgc3RhdGVtZW50LmFkZCggZXhwcmVzc2lvbigpICk7Ci0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgc3RhdGVtZW50LmFkZCggc3RhdGVtZW50Qm9keSh0cnVlKSApOwotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0KLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSB0cnkgc3RhdGVtZW50LgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgdHJ5U3RhdGVtZW50ICA9ICJ0cnkiIHN0YXRlbWVudEJvZHkgY2F0Y2hDbGF1c2UqIGZpbmFsbHlDbGF1c2U/Ci0gICAgKgotICAgICogICAgIGNhdGNoQ2xhdXNlICAgPSAiY2F0Y2giICIoIiBkYXRhdHlwZSBpZGVudGlmaWVyICIpIiBzdGF0ZW1lbnRCb2R5Ci0gICAgKiAgICAgZmluYWxseUNsYXVzZSA9ICJmaW5hbGx5IiBzdGF0ZW1lbnRCb2R5Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHRyeSAgICAgPSB7ICJ0cnkiIHN0YXRlbWVudEJvZHkgY2F0Y2hlcyBmaW5hbGx5IH0KLSAgICAqCi0gICAgKiAgICAgY2F0Y2hlcyA9IHsgPG51bGw+IGNhdGNoKiB9Ci0gICAgKgotICAgICogICAgIGNhdGNoICAgPSB7ICJjYXRjaCIgZGF0YXR5cGUgPGlkZW50aWZpZXI+IHN0YXRlbWVudEJvZHkgfQotICAgICoKLSAgICAqICAgICBmaW5hbGx5ID0ge30gfCBzdGF0ZW1lbnRCb2R5Ci0gICAgKgotICAgICogICAgIHNlZSBkYXRhdHlwZSgpCi0gICAgKiAgICAgc2VlIGlkZW50aWZpZXIoKQotICAgICogICAgIHNlZSBzdGF0ZW1lbnRCb2R5KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiB0cnlTdGF0ZW1lbnQoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICAvLwotICAgICAgICAvLyBTZXQgdXAgdGhlIHN0YXRlbWVudCB3aXRoIHRoZSB0cnkgY2xhdXNlCi0KLSAgICAgICAgUmVkdWN0aW9uIHN0YXRlbWVudCA9IGNvbnN1bWUoVHlwZXMuS0VZV09SRF9UUlkpLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgIHN0YXRlbWVudC5hZGQoIHN0YXRlbWVudEJvZHkodHJ1ZSkgKTsKLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGNhdGNoIGNsYXVzZXMKLQotICAgICAgICBSZWR1Y3Rpb24gY2F0Y2hlcyA9IChSZWR1Y3Rpb24pc3RhdGVtZW50LmFkZCggUmVkdWN0aW9uLm5ld0NvbnRhaW5lcigpICk7Ci0gICAgICAgIHdoaWxlKCBsdCgpID09IFR5cGVzLktFWVdPUkRfQ0FUQ0ggKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWR1Y3Rpb24gY2F0Y2hCbG9jayA9IChSZWR1Y3Rpb24pY2F0Y2hlcy5hZGQoIGNvbnN1bWUoVHlwZXMuS0VZV09SRF9DQVRDSCkuYXNSZWR1Y3Rpb24oKSApOwotCi0gICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuTEVGVF9QQVJFTlRIRVNJUyApOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2F0Y2hCbG9jay5hZGQoIGRhdGF0eXBlKGZhbHNlKSApOwotICAgICAgICAgICAgICAgICAgICBjYXRjaEJsb2NrLmFkZCggbmFtZURlY2xhcmF0aW9uKGZhbHNlKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggU3ludGF4RXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvciggZSApOwotICAgICAgICAgICAgICAgICAgICByZWNvdmVyKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgICAgICAgICAgY2F0Y2hCbG9jay5hZGQoIHN0YXRlbWVudEJvZHkodHJ1ZSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBTeW50YXhFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvciggZSApOwotICAgICAgICAgICAgICAgIHJlY292ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGZpbmFsbHkgY2xhdXNlLCBpZiBhdmFpbGFibGUuCi0KLSAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuS0VZV09SRF9GSU5BTExZICkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuS0VZV09SRF9GSU5BTExZICk7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKCBzdGF0ZW1lbnRCb2R5KHRydWUpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKCBSZWR1Y3Rpb24uRU1QVFkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgfQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBQUk9EVUNUSU9OUzogTE9PUCBTVEFURU1FTlRTCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgZm9yIHN0YXRlbWVudC4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIGZvclN0YXRlbWVudCA9ICJmb3IiICIoIiBub3JtYWwgfCBlYWNoICIpIiBzdGF0ZW1lbnRCb2R5Ci0gICAgKgotICAgICogICAgIG5vcm1hbCA9IG11bHRpICI7IiBleHByZXNzaW9uICI7IiBtdWx0aQotICAgICogICAgIG11bHRpICA9IChleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl0qKQotICAgICoKLSAgICAqICAgICBlYWNoICAgPSBvcHRpb25hbERhdGF0eXBlIG5hbWVEZWNsYXJhdGlvbiAoImluInwiOiIpIGV4cHJlc3Npb24KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgZm9yICAgID0geyAiZm9yIiBoZWFkZXIgc3RhdGVtZW50Qm9keSB9Ci0gICAgKgotICAgICogICAgIGhlYWRlciA9IG5vcm1hbCB8IGVhY2gKLSAgICAqICAgICBlYWNoICAgPSB7ICgiaW4ifCI6Iikgb3B0aW9uYWxEYXRhdHlwZSBuYW1lRGVjbGFyYXRpb24gZXhwcmVzc2lvbiB9Ci0gICAgKgotICAgICogICAgIG5vcm1hbCA9IHsgPG51bGw+IGluaXQgdGVzdCBpbmNyIH0KLSAgICAqICAgICBpbml0ICAgPSB7IDxudWxsPiBleHByZXNzaW9uKiB9Ci0gICAgKiAgICAgdGVzdCAgID0gZXhwcmVzc2lvbgotICAgICogICAgIGluY3IgICA9IHsgPG51bGw+IGV4cHJlc3Npb24qIH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogICAgIHNlZSBuYW1lRGVjbGFyYXRpb24oKQotICAgICogICAgIHNlZSBzdGF0ZW1lbnRCb2R5KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBmb3JTdGF0ZW1lbnQoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIHN0YXRlbWVudCA9IGNvbnN1bWUoIFR5cGVzLktFWVdPUkRfRk9SICkuYXNSZWR1Y3Rpb24oKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgZm9yIGxvb3AgaXMgYSBsaXR0bGUgdHJpY2t5LiAgVGhlcmUgYXJlIHRocmVlIGZvcm1zLAotICAgICAgICAvLyBhbmQgdGhlIGZpcnN0IHR3byBjYW4ndCBiZSBwcm9jZXNzZWQgd2l0aCBleHByZXNzaW9uKCkuCi0gICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMsIHdlIGFyZSBnb2luZyB0byBjaGVja3BvaW50KCkKLSAgICAgICAgLy8gdGhlIHN0cmVhbSBiZWZvcmUgcHJvY2Vzc2luZyBvcHRpb25hbERhdGF0eXBlKCksIHRoZW4gcmVzdG9yZQotICAgICAgICAvLyBpdCBpZiB3ZSBuZWVkIHRvIHVzZSBleHByZXNzaW9uKCkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFueXdheSwgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgb3B0aW9uYWxEYXRhdHlwZSgpLCBpZiBLRVlXT1JEX0lOCi0gICAgICAgIC8vIG9yIGEgQ09MT04gaXMgYXQgbGEoMiksIGl0J3MgYW4gZWFjaCBsb29wLiAgT3RoZXJ3aXNlLCBpdCdzIHRoZQotICAgICAgICAvLyBzdGFuZGFyZCBmb3IgbG9vcC4KLQotICAgICAgICBjb25zdW1lKCBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgZ2V0VG9rZW5TdHJlYW0oKS5jaGVja3BvaW50KCk7Ci0KLSAgICAgICAgUmVkdWN0aW9uIGhlYWRlciAgID0gbnVsbDsKLSAgICAgICAgQ1NUTm9kZSAgIGRhdGF0eXBlID0gb3B0aW9uYWxEYXRhdHlwZSggZmFsc2UsIGZhbHNlICk7Ci0KLSAgICAgICAgaWYoIGx0KDIpID09IFR5cGVzLktFWVdPUkRfSU4gfHwgbHQoMikgPT0gVHlwZXMuQ09MT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb2tlbiBuYW1lID0gbmFtZURlY2xhcmF0aW9uKCBmYWxzZSApOwotICAgICAgICAgICAgaGVhZGVyID0gY29uc3VtZSgpLmFzUmVkdWN0aW9uKCBkYXRhdHlwZSwgbmFtZSwgZXhwcmVzc2lvbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRUb2tlblN0cmVhbSgpLnJlc3RvcmUoKTsKLSAgICAgICAgICAgIGhlYWRlciA9IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKTsKLQotICAgICAgICAgICAgUmVkdWN0aW9uIGluaXQgPSBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICB3aGlsZSggbHQoKSAhPSBUeXBlcy5TRU1JQ09MT04gJiYgbHQoKSAhPSBUeXBlcy5FT0YgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluaXQuYWRkKCBleHByZXNzaW9uKCkgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBsdCgpICE9IFR5cGVzLlNFTUlDT0xPTiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5DT01NQSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuU0VNSUNPTE9OICk7Ci0KLSAgICAgICAgICAgIGhlYWRlci5hZGQoIGluaXQgKTsKLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTmV4dCB1cCwgYSBzaW5nbGUgZXhwcmVzc2lvbiBpcyB0aGUgdGVzdCBjbGF1c2UsIGZvbGxvd2VkCi0gICAgICAgICAgICAvLyBieSBhIHNlbWljb2xvbi4KLQotICAgICAgICAgICAgaGVhZGVyLmFkZCggZXhwcmVzc2lvbigpICk7Ci0gICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5TRU1JQ09MT04gKTsKLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRmluYWxseSwgdGhlIGluY3JlbWVudCBzZWN0aW9uIGlzIGEgKHBvc3NpYmx5IGVtcHR5KSBjb21tYS0KLSAgICAgICAgICAgIC8vIHNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGZvbGxvd2VkIGJ5IHRoZSBSSUdIVF9QQVJFTlRIRVNJUy4KLQotICAgICAgICAgICAgUmVkdWN0aW9uIGluY3IgPSAoUmVkdWN0aW9uKWhlYWRlci5hZGQoIFJlZHVjdGlvbi5uZXdDb250YWluZXIoKSApOwotCi0gICAgICAgICAgICB3aGlsZSggbHQoKSAhPSBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyAmJiBsdCgpICE9IFR5cGVzLkVPRiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5jci5hZGQoIGV4cHJlc3Npb24oKSApOwotCi0gICAgICAgICAgICAgICAgaWYoIGx0KCkgIT0gVHlwZXMuUklHSFRfUEFSRU5USEVTSVMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuQ09NTUEgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgIHN0YXRlbWVudC5hZGQoIGhlYWRlciApOwotICAgICAgICBzdGF0ZW1lbnQuYWRkKCBzdGF0ZW1lbnRCb2R5KGZhbHNlKSApOwotCi0gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgZG8gLi4uIHdoaWxlIHN0YXRlbWVudC4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIGRvV2hpbGVTdGF0ZW1lbnQgPSAiZG8iIHN0YXRlbWVudEJvZHkgIndoaWxlIiAiKCIgZXhwcmVzc2lvbiAiKSIgPGVvcz4KLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgZG8gPSB7ICJkbyIgc3RhdGVtZW50Qm9keSBleHByZXNzaW9uIH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogICAgIHNlZSBzdGF0ZW1lbnRCb2R5KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBkb1doaWxlU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfRE8pLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgIHN0YXRlbWVudC5hZGQoIHN0YXRlbWVudEJvZHkoZmFsc2UpICk7Ci0gICAgICAgIGNvbnN1bWUoIFR5cGVzLktFWVdPUkRfV0hJTEUgKTsKLQotICAgICAgICBjb25zdW1lKCBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKCBleHByZXNzaW9uKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggU3ludGF4RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCBlICk7Ci0gICAgICAgICAgICByZWNvdmVyKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIHdoaWxlIHN0YXRlbWVudC4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHdoaWxlU3RhdGVtZW50ID0gIndoaWxlIiAiKCIgZXhwcmVzc2lvbiAiKSIgc3RhdGVtZW50Qm9keQotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICB3aGlsZSA9IHsgIndoaWxlIiBleHByZXNzaW9uIHN0YXRlbWVudEJvZHkgfQotICAgICoKLSAgICAqICAgICBzZWUgZXhwcmVzc2lvbigpCi0gICAgKiAgICAgc2VlIHN0YXRlbWVudEJvZHkoKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIHdoaWxlU3RhdGVtZW50KCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlZHVjdGlvbiBzdGF0ZW1lbnQgPSBjb25zdW1lKFR5cGVzLktFWVdPUkRfV0hJTEUpLmFzUmVkdWN0aW9uKCk7Ci0KLSAgICAgICAgY29uc3VtZSggVHlwZXMuTEVGVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKCBleHByZXNzaW9uKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggU3ludGF4RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCBlICk7Ci0gICAgICAgICAgICByZWNvdmVyKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgc3RhdGVtZW50LmFkZCggc3RhdGVtZW50Qm9keShmYWxzZSkgKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLQotICAgIH0KLQotCi0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBQUk9EVUNUSU9OUzogRVhQUkVTU0lPTlMKLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSBzaW5nbGUgKHN1Yi0pZXhwcmVzc2lvbiBpbnRvIGEgQ1NUTm9kZS4gIE5vIGFzc3VtcHRpb24gaXMKLSAgICAqICBtYWRlIGFib3V0IHdoYXQgZm9sbG93cyB0aGUgZXhwcmVzc2lvbi4KLSAgICAqICA8cD4KLSAgICAqICBOb3RlIHRoYXQgdGhlIGV4cHJlc3Npb24gcGFyc2VyIGlzIHJhdGhlciBzdHVwaWQsIGluIHRoYXQgaXQgY2Fubm90Ci0gICAgKiAgcmVzb2x2ZSBuYW1lcy4gIFRoZXJlZm9yZSBpdCBpcyBsaXR0bGUgbW9yZSB0aGFuIGEgcHJlLWZpbHRlciwgcmVtb3ZpbmcKLSAgICAqICBzdGF0ZW1lbnRzIHRoYXQgY2FuJ3QgcG9zc2libHkgYmUgcmlnaHQsIGJ1dCBsZWF2aW5nIGV2ZXJ5dGhpbmcgdGhhdAotICAgICogIG1pZ2h0IGJlIHJpZ2h0IGZvciBzZW1hbnRpYyBhbmFseXNpcyBieSB0aGUgPGNvZGU+QW5hbHl6ZXI8L2NvZGU+ICh3aGljaAotICAgICogIGhhcyBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXJlIHdhcyBzb21lIHRob3VnaHQgZ2l2ZW4gdG8gZWxpbWluYXRpbmcKLSAgICAqICB0aGUgQ1NUcyBhbmQgZ29pbmcgcmlnaHQgdG8gQVNUcywgYnV0IHRoYXQgb3B0aW9uIHdhcyByZWplY3RlZCBiZWNhdXNlCi0gICAgKiAgaW5uZXIgY2xhc3NlcyBtZWFuIHRoYXQgY2xhc3MgbmFtZSByZXNvbHV0aW9uIHdvbid0IHdvcmsgYmVmb3JlIHBhcnNpbmcKLSAgICAqICBpcyBjb21wbGV0ZS4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIENTVE5vZGUgZXhwcmVzc2lvbiggKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gaW50IGlkID0gbmVzdENvdW50Kys7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIkVOVEVSSU5HIEVYUFJFU1NJT04gIiArIGlkICk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YWNrIHN0YWNrID0gbmV3IEV4cHJlc3Npb25TdGFjayggdGhpcyApOwotICAgICAgICBDU1ROb2RlIGV4cHJlc3Npb24gPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gYmFyZU1vZGUgPSBmYWxzZTsKLQotICAgICAgICBNQUlOX0xPT1A6IGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBWYWxpZCBhdCB0aGUgc3RhcnQgb2YgYW4gKHN1YilleHByZXNzaW9uLCBhIHR5cGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAvLyBpcyBoYW5kbGVkIHNlcGFyYXRlbHkuICBJdCBoYXMgdGhlIGZvcm0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEluIHRoZSBTSElGVCBwaGFzZSwgd2UgbW92ZSBzdHVmZiBvbnRvIHRoZSBzdGFjayB0aGF0IGNhbiBoYXZlCi0gICAgICAgICAgICAvLyBtdWx0aXBsZSBtZWFuaW5ncyBhbmQvb3IgcHJlY2VkZW5jZSBpc3N1ZXMsIGFuZCBsZWF2ZSB0aGUgaW50ZXJwcmV0YXRpb24KLSAgICAgICAgICAgIC8vIGZvciBhIGxhdGVyIFJFRFVDRS4gIE5vIGxvb2thaGVhZCBpcyB1c2VkLiAgV2hlbiBzdHJ1Y3R1cmVzIGFyZSBmb3VuZCB0aGF0Ci0gICAgICAgICAgICAvLyBoYXZlIGEgY29uc2lzdGVudCBmb3JtLCB3ZSB1c2UgTEwgdGVjaG5pcXVlcyAodGhlIG5ldyBvcGVyYXRvciwgZm9yIGluc3RhbmNlKS4KLQotICAgICAgICAgICAgVG9rZW4gbmV4dCA9IGxhKHN0YWNrKTsKLSAgICAgICAgICAgIGludCB0eXBlID0gbmV4dC5nZXRNZWFuaW5nQXMoIEVYUFJFU1NJT05fU0hJRlRfSEFORExFUlMgKTsKLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiZXhwcmVzc2lvbigpIHN0YXR1czoiICk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIHN0YWNrLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIm5leHQ6ICIgKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggbmV4dC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIGxhKDIpLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICAgICAgU0hJRlQ6IHN3aXRjaCggdHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5HU1RSSU5HX1NUQVJUOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHN0YWNrLnRvcElzQW5FeHByZXNzaW9uKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggImdzdHJpbmcgY2Fubm90IGRpcmVjdGx5IGZvbGxvdyBhbm90aGVyIGV4cHJlc3Npb24iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBnc3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkNSRUFUQUJMRV9QUklNSVRJVkVfVFlQRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnNoaWZ0SWYoIHN0YWNrLmF0U3RhcnRPZkV4cHJlc3Npb24oKSwgInR5cGUgbmFtZSBub3QgdmFsaWQgaW4gdGhpcyBjb250ZXh0IiApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU0lNUExFX0VYUFJFU1NJT046Ci0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE1ldGhvZCBwYXJhbWV0ZXJzIGRvbid0IG1ha2UgaXQgaGVyZSAoc2VlIFJFRFVDRSkuLi4KLQotICAgICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdFVubGVzc1RvcElzQW5FeHByZXNzaW9uKCAibGl0ZXJhbCBjYW5ub3QgZGlyZWN0bHkgZm9sbG93IGFub3RoZXIgZXhwcmVzc2lvbiIgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfSURFTlRJRklFUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBzdGFjay50b3AoKS5pc0EoVHlwZXMuREVSRUZFUkVOQ0VfT1BFUkFUT1IpICYmIHN0YWNrLnRvcElzQW5PcGVyYXRvcigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGEoKS5zZXRNZWFuaW5nKCBUeXBlcy5JREVOVElGSUVSICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoICJub3QgdmFsaWQgYXMgYW4gaWRlbnRpZmllciBpbiB0aGlzIGNvbnRleHQiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkFTU0lHTk1FTlRfT1BFUkFUT1I6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdElmKCBzdGFjay50b3BJc0FNb2RpZmlhYmxlRXhwcmVzc2lvbigpLCAibGVmdC1oYW5kLXNpZGUgb2YgYXNzaWdubWVudCBtdXN0IGJlIG1vZGlmaWFibGUiICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5QUkVGSVhfT1JfSU5GSVhfT1BFUkFUT1I6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggc3RhY2sudG9wSXNBbk9wZXJhdG9yKDAsIHRydWUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMubWFrZVByZWZpeCggbmV4dCwgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCggKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlBSRUZJWF9PUEVSQVRPUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGVzLm1ha2VQcmVmaXgoIG5leHQsIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnNoaWZ0KCApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuUVVFU1RJT046Ci0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JTkZJWF9PUEVSQVRPUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnNoaWZ0SWZUb3BJc0FuRXhwcmVzc2lvbiggImluZml4IG9wZXJhdG9ycyBtYXkgb25seSBmb2xsb3cgZXhwcmVzc2lvbnMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gTWV0aG9kIGNhbGxzIGRvbid0IG1ha2UgaXQgaGVyZSAoc2VlIFJFRFVDRSkuICBJdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgYSBzdWItZXhwcmVzc2lvbiBvciBhIGNhc3QuCi0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25kaXRpb24gPSBzdGFjay5hdFN0YXJ0T2ZFeHByZXNzaW9uKCkgfHwgKHN0YWNrLnRvcElzQW5PcGVyYXRvcigpICYmICFzdGFjay50b3AoKS5pc0EoVHlwZXMuREVSRUZFUkVOQ0VfT1BFUkFUT1IpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhY2suc2hpZnRJZiggY29uZGl0aW9uLCAic3ViLWV4cHJlc3Npb24gbm90IHZhbGlkIGF0IHRoaXMgcG9zaXRpb24iICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggc3RhY2suYXRTdGFydE9mRXhwcmVzc2lvbigpIHx8IHN0YWNrLnRvcElzQW5PcGVyYXRvcigpIHx8IHN0YWNrLnRvcCgpLmlzQShUeXBlcy5TWU5USF9NRVRIT0RfQ0FMTCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBjbG9zdXJlRXhwcmVzc2lvbigpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggImNsb3N1cmUgbm90IHZhbGlkIGluIHRoaXMgY29udGV4dCIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNNYXAgPSBmYWxzZSwgaW5zaXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBzdGFjay50b3BJc0FuRXhwcmVzc2lvbigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBsaXN0T3JNYXBFeHByZXNzaW9uKGlzTWFwLCBpbnNpc3QpICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX05FVzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBzdGFjay5hdFN0YXJ0T2ZFeHByZXNzaW9uKCkgfHwgc3RhY2sudG9wSXNBbk9wZXJhdG9yKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBuZXdFeHByZXNzaW9uKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCAibmV3IGNhbiBmb2xsb3cgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24gb3IgYW5vdGhlciBvcGVyYXRvciIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9JTlNUQU5DRU9GOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhY2suc2hpZnRJZiggc3RhY2sudG9wSXNBbkV4cHJlc3Npb24oKSwgImluc3RhbmNlb2YgbWF5IG9ubHkgZm9sbG93IGFuIGV4cHJlc3Npb24iICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIG9wZXJhdG9ycyBhcmUgY2F1Z2h0IGR1cmluZyBSRURVQ0UsIHNvIGlmIGl0IG1ha2VzCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGhlcmUsIGl0J3MgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24sIG9yIGFuIGVycm9yLgotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBzdGFjay5zaXplKCkgPT0gMSAmJiBzdGFjay50b3BJc0FuRXhwcmVzc2lvbigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgTUFJTl9MT09QOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IEZMT1cgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEluIHRoZSBSRURVQ0UgcGhhc2UsIHdlIHRyeSB0byBmaW5kIHdheXMgdG8gY29udmVydCBzZXZlcmFsIHN0YWNrCi0gICAgICAgICAgICAvLyBlbGVtZW50cyAoYW5kIG1heWJlIG9uZSBsb29rYWhlYWQgdG9rZW4pIGludG8gYSBzaW5nbGUgZXhwcmVzc2lvbi4KLSAgICAgICAgICAgIC8vIFdlIHJldHJ5IHRoZSBSRURVQ0UgYXMgbG9uZyBhcyBpdCBzdWNjZWVkcy4gIE5vdGUgdGhhdCByZWR1Y3Rpb25zCi0gICAgICAgICAgICAvLyBhcmUgT05MWSBwb3NzaWJsZSB3aGVuIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGFuIGV4cHJlc3Npb24uCi0KLSAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tBZ2FpbiA9IGZhbHNlLCBza2lwUGF0dGVybnMgPSBmYWxzZTsKLSAgICAgICAgICAgIENTVE5vZGUgdG9wMCA9IG51bGwsIHRvcDEgPSBudWxsLCB0b3AyID0gbnVsbDsKLSAgICAgICAgICAgIGludCBuZXh0UHJlY2VkZW5jZSA9IDAsIHRvcDFQcmVjZWRlbmNlID0gMDsKLQotICAgICAgICAgICAgUkVEVUNFOiBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhc3RhY2sudG9wSXNBbkV4cHJlc3Npb24oKSAmJiAhRXhwcmVzc2lvblN1cHBvcnQuaXNBUG90ZW50aWFsVHlwZU5hbWUoc3RhY2sudG9wKCksIGZhbHNlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gV2UgcmVkdWNlIGF0IG1vc3Qgb25jZSBwZXIgaXRlcmF0aW9uLCBzbyB3ZSBjb2xsZWN0IGluZm8gaGVyZS4KLQotICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gICA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHNraXBQYXR0ZXJucyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgdG9wMCA9IHN0YWNrLnRvcCgpOwotICAgICAgICAgICAgICAgIHRvcDEgPSBzdGFjay50b3AoMSk7Ci0gICAgICAgICAgICAgICAgdG9wMiA9IHN0YWNrLnRvcCgyKTsKLQotICAgICAgICAgICAgICAgIG5leHQgPSBsYSggc3RhY2sgKTsKLQotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggImV4cHJlc3Npb24oKSBzdGFjayBmb3IgcmVkdWNlOiAiICsgc3RhY2sgKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJleHByZXNzaW9uKCkgbmV4dCB0b2tlbiBmb3IgcmVkdWNlOiAiICsgbmV4dCApOwotCi0gICAgICAgICAgICAgICAgbmV4dFByZWNlZGVuY2UgPSBUeXBlcy5nZXRQcmVjZWRlbmNlKCBuZXh0LmdldE1lYW5pbmcoKSwgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICB0b3AxUHJlY2VkZW5jZSA9IFR5cGVzLmdldFByZWNlZGVuY2UoIHRvcDEuZ2V0TWVhbmluZygpLCBmYWxzZSApOwotCi0KLQotICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAvLyBVTlVTVUFMIFNUVUZGIEZJUlNUCi0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gTm90IHJlYWxseSBhbiBvcGVyYXRvciBhdCBhbGwsIGlmIHRvcDEgaXMgYSAiKCIgYW5kIG5leHQgaXMgYW4gIikiLAotICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWR1Y2UuICBFeHRyYSBwcm9jZXNzaW5nIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSAiKCIgaXMgbm90Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbi4KLQotICAgICAgICAgICAgICAgIGlmKCB0b3AxLmlzQShUeXBlcy5MRUZUX1BBUkVOVEhFU0lTKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggbmV4dC5pc0EoVHlwZXMuUklHSFRfUEFSRU5USEVTSVMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gc2ltcGxpZnkgdGhpbmdzLCBjYXN0IG9wZXJhdG9ycyBNVVNUIGFwcGVhciBvbiB0aGUgc2FtZSBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgc3RhcnQgb2YgdGhlaXIgb3BlcmFuZHMuICBXaXRob3V0IG5hbWUgbG9va3VwLCB3ZSBjYW4ndAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgc3VyZSB0aGF0IGV2ZW4gdGhpbmdzIHRoYXQgbG9vayBsaWtlIGNhc3RzIGFyZSwgYnV0IHdlIGFzc3VtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgYW5kIGxldCBsYXRlciBwaGFzZXMgY29ycmVjdCwgd2hlcmUgbmVjZXNzYXJ5LgotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbGEodHJ1ZSk7IC8vIFhYWCB0aGUgcHJlY2x1ZGVzIGlzIHRydWUgZm9yIEdTdHJpbmcuIFNlZW1zIHdyb25nCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhc3RQcmVjbHVkZWQgPSBuZXh0LmlzQShUeXBlcy5ORVdMSU5FKSB8fCBuZXh0LmlzQShUeXBlcy5QUkVDTFVERVNfQ0FTVF9PUEVSQVRPUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBFeHByZXNzaW9uU3VwcG9ydC5pc0FQb3RlbnRpYWxUeXBlTmFtZSh0b3AwLCBmYWxzZSkgJiYgIWNhc3RQcmVjbHVkZWQgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVE5vZGUgICBuYW1lID0gc3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdWN0aW9uIGNhc3QgPSAoKFRva2VuKXN0YWNrLnBvcCgpKS5hc1JlZHVjdGlvbiggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Quc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfQ0FTVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIGNhc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1ROb2RlIHN1YmV4cHJlc3Npb24gPSBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCBzdWJleHByZXNzaW9uICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgTE9PUCBDT05UUk9MIDw8PDw8PDw8PAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFBhdHRlcm5zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBIaWdoZXN0IHByZWNlZGVuY2U6ICJuZXciLiAgSWYgaXQgaXMgcHJlY2VlZGVkIG9uIHRoZSBzdGFjayBieQotICAgICAgICAgICAgICAgIC8vIGEgIi4iLCB3aGF0IHByZWNlZWRzIHRoZSAiLiIgaXMgdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcsIGFuZAotICAgICAgICAgICAgICAgIC8vIHdlJ2xsIGhhdmUgdG8gZG8gc29tZSByZXdyaXRpbmcuLi4uICBOb3RlIHRoYXQgU0hJRlQgd2lsbCBvbmx5Ci0gICAgICAgICAgICAgICAgLy8gc2hpZnQgYSAibmV3IiBpZiBpdCBpcyBwcmVjZWVkZWQgYnkgbm90aGluZyBvciBhbiBvcGVyYXRvciwKLSAgICAgICAgICAgICAgICAvLyBhbmQgaXQgd2lsbCBvbmx5IHNoaWZ0IGEgIi4iIGlmIGl0IGlzIHByZWNlZWRlZCBieSBhbiBleHByZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgY2FuIGFzc3VtZSBhbnkgcHJlY2VlZGluZyAiLiIgaXMgYW4gb3BlcmF0b3IuCi0KLSAgICAgICAgICAgICAgICBpZiggdG9wMC5pc0EoVHlwZXMuS0VZV09SRF9ORVcpICYmICF0b3AwLmlzQW5FeHByZXNzaW9uKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9wMC5tYXJrQXNFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHRvcDEuaXNBKFR5cGVzLkRPVCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1ROb2RlIHRoZU5ldyAgPSBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENTVE5vZGUgdGhlRG90ICA9IHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ1NUTm9kZSBjb250ZXh0ID0gc3RhY2sucG9wKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZU5ldy5zZXQoIDEsIGNvbnRleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goIHRoZU5ldyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FnYWluID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IExPT1AgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBOb3QgdW51c3VhbCwgYnV0IGhhbmRsZWQgaGVyZSB0byBzaW1wbGlmeSBwcmVjZW5kZW5jZSBoYW5kbGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgdW51c3VhbCBzdHVmZjogZGVyZWZlcmVuY2Ugb3BlcmF0b3JzIGFyZSBsZWZ0LWFzc29jaWF0aXZlLgotCi0gICAgICAgICAgICAgICAgaWYoIHRvcDEuaXNBKFR5cGVzLkRFUkVGRVJFTkNFX09QRVJBVE9SKSAmJiAhdG9wMC5oYXNDaGlsZHJlbigpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlZHVjZSggMywgMSwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgTE9PUCBDT05UUk9MIDw8PDw8PDw8PAotICAgICAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIE5leHQgcHJlY2VkZW5jZSwgYXJyYXkgb2Zmc2V0cy4gIEJlY2F1c2Ugd2UgYWxsb3cgbGlzdHMgYW5kIHJhbmdlcwotICAgICAgICAgICAgICAgIC8vIGFuZCBzdWNoIGluc2lkZSBsaXN0IGV4cHJlc3Npb25zLCBhbGwgbGlzdHMgd2lsbCBoYXZlIGJlZW4gcHJvY2Vzc2VkCi0gICAgICAgICAgICAgICAgLy8gdG8gYSBTWU5USF9MSVNUSCBkdXJpbmcgU0hJRlQuICBIZXJlIHdlIGRvIHNvbWUgcmV3cml0aW5nLCB3aGVyZQotICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeS4gIEVtcHR5IGFycmF5IG9mZnNldHMgYXJlIG9ubHkgYWxsb3dlZCBvbiB0eXBlcywgYW5kIHdlCi0gICAgICAgICAgICAgICAgLy8gcnVuIHRoZSBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIGluIHRoYXQgY2FzZS4KLQotICAgICAgICAgICAgICAgIGlmKCB0b3AwLmlzQShUeXBlcy5TWU5USF9MSVNUKSAmJiB0b3AxLmlzQW5FeHByZXNzaW9uKCkgfHwgRXhwcmVzc2lvblN1cHBvcnQuaXNBUG90ZW50aWFsVHlwZU5hbWUodG9wMSwgZmFsc2UpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEVtcHR5IGxpc3QgaXMgYW4gYXJyYXkgdHlwZQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAhdG9wMC5oYXNDaGlsZHJlbigpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0eXBlUHJlY2VlZHMgICA9IEV4cHJlc3Npb25TdXBwb3J0LmlzQVBvdGVudGlhbFR5cGVOYW1lKHRvcDEsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcG90ZW50aWFsQ2FzdCAgPSB0b3AyLmlzQShUeXBlcy5MRUZUX1BBUkVOVEhFU0lTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcG90ZW50aWFsRGVjbCAgPSB0b3AyLmlzQShUeXBlcy5MRUZUX1BBUkVOVEhFU0lTKSB8fCB0b3AyLmlzQShUeXBlcy5VTktOT1dOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2xhc3NSZWZlcmVuY2UgPSBuZXh0LmlzQShUeXBlcy5ET1QpICYmIGxhKDIpLmlzQShUeXBlcy5LRVlXT1JEX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhKHR5cGVQcmVjZWVkcyAmJiAocG90ZW50aWFsQ2FzdCB8fCBwb3RlbnRpYWxEZWNsIHx8IGNsYXNzUmVmZXJlbmNlKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCAiZW1wdHkgc3F1YXJlIGJyYWNrZXRzIGFyZSBvbmx5IHZhbGlkIG9uIHR5cGUgbmFtZXMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPa2F5LCB3ZSBoYXZlIGFuIGFycmF5IHR5cGUuICBXZSBub3cgY29udmVydCB0aGUgbGlzdCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gdG8gYW4gYXJyYXkgdHlwZSwgYW5kIHNsdXJwIGFueSBmdXJ0aGVyIGRpbWVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZiB0aGUgbG9va2FoZWFkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWR1Y3Rpb24gYXJyYXkgPSBzdGFjay5wb3AoKS5hc1JlZHVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuc2V0TWVhbmluZyggVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuYWRkKCBzdGFjay5wb3AoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggbHQodHJ1ZSkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBjb25zdW1lKCBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUICkuYXNSZWR1Y3Rpb24oIGFycmF5ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuUklHSFRfU1FVQVJFX0JSQUNLRVQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIGxhc3QgZGVjaXNpb246IHZhcmlhYmxlIHR5cGUgZGVjbGFyYXRpb24sIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXN0LCBvciBjbGFzcyByZWZlcmVuY2UuLi4KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNsYXNzUmVmZXJlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1ROb2RlIHJlZmVyZW5jZSA9IGNvbnN1bWUoVHlwZXMuRE9UKS5hc1JlZHVjdGlvbihhcnJheSwgY29uc3VtZShUeXBlcy5LRVlXT1JEX0NMQVNTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLm1hcmtBc0V4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCByZWZlcmVuY2UgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbHQodHJ1ZSkgPT0gVHlwZXMuSURFTlRJRklFUiAmJiBsdCgyKSA9PSBUeXBlcy5FUVVBTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oYXJyYXkpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzdGFjay50b3AoKS5pc0EoVHlwZXMuTEVGVF9QQVJFTlRIRVNJUykgJiYgbGEodHJ1ZSkuaXNBKFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUTm9kZSBjYXN0ID0gKChUb2tlbilzdGFjay5wb3AoKSkuYXNSZWR1Y3Rpb24oIGFycmF5ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdC5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9DQVNUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggY2FzdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoICJmb3VuZCBhcnJheSB0eXBlIHdoZXJlIG5vbmUgZXhwZWN0ZWQiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vbi1lbXB0eSBsaXN0IGlzIGFuIG9mZnNldCAocHJvYmFibHkpCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1ROb2RlIGxpc3QgPSBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENTVE5vZGUgYmFzZSA9IHN0YWNrLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWR1Y3Rpb24gcmVzdWx0ID0gKChUb2tlbilsaXN0LmdldCgwKSkuZHVwKCkuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRNZWFuaW5nKCBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBiYXNlICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsaXN0LmNoaWxkcmVuKCkgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggbGlzdC5nZXQoMSkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBsaXN0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tYXJrQXNFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCByZXN1bHQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgTE9PUCBDT05UUk9MIDw8PDw8PDw8PAotCi0gICAgICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gTmV4dCBwcmVjZWRlbmNlOiB0eXBlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICBJZiB0aGUgdG9wIG9mIHN0YWNrCi0gICAgICAgICAgICAgICAgLy8gaXNBUG90ZW50aWFsVHlwZU5hbWUoKSwgbGEodHJ1ZSkgaXMgYW4gaWRlbnRpZmllciwgYW5kIGxhKDIpIGlzCi0gICAgICAgICAgICAgICAgLy8gYW4gIj0iLCBpdCdzIGEgZGVjbGFyYXRpb24uCi0KLSAgICAgICAgICAgICAgICBpZiggbGEodHJ1ZSkuaXNBKFR5cGVzLklERU5USUZJRVIpICYmIGx0KDIpID09IFR5cGVzLkVRVUFMUyAmJiBFeHByZXNzaW9uU3VwcG9ydC5pc0FQb3RlbnRpYWxUeXBlTmFtZSh0b3AwLCBmYWxzZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oc3RhY2sucG9wKCkpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hlY2tBZ2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw8PCBMT09QIENPTlRST0wgPDw8PDw8PDw8Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBnZXR0aW5nIHRvIG1ldGhvZCBjYWxsIGhhbmRsaW5nIHByb3Blciwgd2Ugc2hvdWxkIGNoZWNrIGZvciBhbnkKLSAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIGJvb2trZWVwaW5nLiAgSWYgdGhlIHRvcCBvZiBzdGFjayBpcyBhIGNsb3N1cmUgYW5kIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0IGlzIGEgbWV0aG9kIGNhbGwsIHRoZSBjbG9zdXJlIGlzIGVpdGhlciBvbmUgb2YgaXRzIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyBvciBhbiBlcnJvci4KLQotICAgICAgICAgICAgICAgIGlmKCB0b3AxLmlzQShUeXBlcy5TWU5USF9NRVRIT0RfQ0FMTCkgJiYgdG9wMC5pc0EoVHlwZXMuU1lOVEhfQ0xPU1VSRSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ1NUTm9kZSBwYXJhbWV0ZXJzID0gdG9wMS5nZXQoMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGxhc3QgPSBwYXJhbWV0ZXJzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBsYXN0ID4gMCAmJiBwYXJhbWV0ZXJzLmdldChsYXN0KS5pc0EoVHlwZXMuU1lOVEhfQ0xPU1VSRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggInlvdSBtYXkgb25seSBwYXNzIG9uZSBjbG9zdXJlIHRvIGEgbWV0aG9kIGltcGxpY2l0bHkiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZCggc3RhY2sucG9wKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBjaGVja0FnYWluID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IExPT1AgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gTmV4dCBwcmVjZWRlbmNlOiBtZXRob2QgY2FsbHMgYW5kIHR5cGVkIGRlY2xhcmF0aW9ucy4gIElmIHRoZSB0b3Agb2Ygc3RhY2sKLSAgICAgICAgICAgICAgICAvLyBpc0ludm9rYWJsZSgpIGFuZCBsYShzdGFjaykgaXMgYW4gIigiLCBhbiAieyIsIG9yIGEgc2ltcGxlIGV4cHJlc3Npb24sIGl0J3MKLSAgICAgICAgICAgICAgICAvLyBhIG1ldGhvZCBjYWxsLiAgV2UgbGVhdmUgdGhlIGNsb3N1cmUgZm9yIHRoZSBuZXh0IFNISUZULgotCi0gICAgICAgICAgICAgICAgaWYoIEV4cHJlc3Npb25TdXBwb3J0LmlzSW52b2thYmxlKHRvcDApICYmIChuZXh0LmlzQShUeXBlcy5MRUZUX0NVUkxZX0JSQUNFKSB8fCBsYSh0cnVlKS5pc0EoVHlwZXMuTUVUSE9EX0NBTExfU1RBUlRFUlMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJtYWtpbmcgYSBtZXRob2QgY2FsbCBvZiAiICsgdG9wMCApOwotCi0gICAgICAgICAgICAgICAgICAgIENTVE5vZGUgbmFtZSA9IHN0YWNrLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIFJlZHVjdGlvbiBtZXRob2QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIG5leHQuZ2V0TWVhbmluZygpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNvbnN1bWUoKS5hc1JlZHVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGQoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuYWRkKCBsYSgpLmlzQShUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUykgPyBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCkgOiBwYXJhbWV0ZXJMaXN0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gVG9rZW4ubmV3U3ltYm9sKCBUeXBlcy5MRUZUX1BBUkVOVEhFU0lTLCBuZXh0LmdldFN0YXJ0TGluZSgpLCBuZXh0LmdldFN0YXJ0Q29sdW1uKCkgKS5hc1JlZHVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGQoIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuYWRkKCBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBUb2tlbi5uZXdTeW1ib2woIFR5cGVzLkxFRlRfUEFSRU5USEVTSVMsIG5leHQuZ2V0U3RhcnRMaW5lKCksIG5leHQuZ2V0U3RhcnRDb2x1bW4oKSApLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFkZCggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGQoIHBhcmFtZXRlckxpc3QoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnNldE1lYW5pbmcoIFR5cGVzLlNZTlRIX01FVEhPRF9DQUxMICk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5tYXJrQXNFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggbWV0aG9kICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGx0KCkgIT0gVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IExPT1AgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHBvc3RmaXggb3BlcmF0b3JzIG5leHQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBhY2NlcHRhYmxlCi0gICAgICAgICAgICAgICAgLy8gcHJlY2VkZW5jZSBiZWZvcmUgZG9pbmcgaXQuICBBbGwgdGhlIGhpZ2hlciBwcmVjZWRlbmNlIHJlZHVjdGlvbnMKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLgotCi0gICAgICAgICAgICAgICAgaWYoIG5leHQuaXNBKFR5cGVzLlBPU1RGSVhfT1BFUkFUT1IpICYmIHN0YWNrLnRvcElzQW5FeHByZXNzaW9uKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICFFeHByZXNzaW9uU3VwcG9ydC5pc0FWYXJpYWJsZShzdGFjay50b3AoKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggImluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgVHlwZXMubWFrZVBvc3RmaXgoIG5leHQsIHRydWUgKTsKLQotICAgICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCgpOwotICAgICAgICAgICAgICAgICAgICBzdGFjay5yZWR1Y2UoIDIsIDAsIHRydWUgKTsKLQotICAgICAgICAgICAgICAgICAgICBjaGVja0FnYWluID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IExPT1AgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gVGhlIHRlcm5hcnkgb3BlcmF0b3Igd2lsbCBiZSBzZWVuIHR3aWNlLiAgVGhlIGZpcnN0IHJlZHVjdGlvbiBpcwotICAgICAgICAgICAgICAgIC8vIGluZml4IHdoZW4gdGhlcmUgaXMgYSAiOiIgb24gbG9va2FoZWQuICBUaGUgc2Vjb25kIHJlZHVjdGlvbiBpcwotICAgICAgICAgICAgICAgIC8vIHByZWZpeCB3aGVuIHRoZXJlIGlzIGEgbG93ZXItcHJlY2VkZW5jZSBvcGVyYXRvciBvbiBsb29rYWhlZC4KLSAgICAgICAgICAgICAgICAvLyBUaGUgdGVybmFyeSBvcGVyYXRvciBpcyByaWdodC1hc3NvY2lhdGl2ZS4gIE5vdGUgdGhhdAotICAgICAgICAgICAgICAgIC8vIFR5cGVzLmdldFByZWNlZGVuY2UoKSBvbiBhIHRlcm5hcnkgb3BlcmF0b3IgcmV0dXJucyAxMC4KLQotICAgICAgICAgICAgICAgIGlmKCB0b3AxLmlzQShUeXBlcy5RVUVTVElPTikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWR1Y2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbGEoKS5pc0EoVHlwZXMuQ09MT04pICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRvcDEuaGFzQ2hpbGRyZW4oKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoICJ0ZXJuYXJ5IG9wZXJhdG9yIGNhbiBoYXZlIG9ubHkgdGhyZWUgY2xhdXNlcyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVkdWNlKCAzLCAxLCBmYWxzZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBZ2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggVHlwZXMuZ2V0UHJlY2VkZW5jZShuZXh0LmdldE1lYW5pbmcoKSwgZmFsc2UpIDwgMTAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZWR1Y2UoIDIsIDEsIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay50b3AoKS5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9URVJOQVJZICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FnYWluID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IExPT1AgQ09OVFJPTCA8PDw8PDw8PDwKLSAgICAgICAgICAgICAgICB9Ci0KLQotCi0KLSAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgLy8gUEFUVEVSTiBTVFVGRiBTRUNPTkQKLQotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgYmVjYXVzZSBvZiB0aGUgbG9vcCBjb250cm9sIGFib3ZlLCB3ZSBnZXQgaGVyZSBvbmx5IGlmIG5vbmUKLSAgICAgICAgICAgICAgICAvLyBvZiB0aGUgYWJvdmUgb3B0aW9ucyBtYXRjaGVkLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gU28sIGV2ZXJ5dGhpbmcgZWxzZSB3ZSBoYW5kbGUgZ2VuZXJpY2FsbHk6IHRvcDEgd2lsbCBiZSBhbiBvcGVyYXRvciwgYW5kCi0gICAgICAgICAgICAgICAgLy8gd2lsbCBiZSByZWR1Y2VkIG9yIG5vdCB3aXRoIHRvcDAgYW5kIHBvc3NpYmx5IHRvcDIsIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgICAgICAgICAgICAvLyBjYXJkaW5hbGl0eSBhbmQgYXNzb2NpYXRpdml0eSBvZiB0aGUgb3BlcmF0b3IsIGFuZCB0aGUgdHlwZSBvZiBsYSgpLgotCi0gICAgICAgICAgICAgICAgaWYoIHNraXBQYXR0ZXJucyB8fCAhRXhwcmVzc2lvblN1cHBvcnQuaXNBbk9wZXJhdG9yKHRvcDEsIGZhbHNlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgTE9PUCBDT05UUk9MIDw8PDw8PDw8PAotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgc3dpdGNoKCB0b3AxLmdldE1lYW5pbmdBcyhFWFBSRVNTSU9OX1JFRFVDRV9IQU5ETEVSUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gUHJlZml4IGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIGFyZW4ndCBhbHdheXMgdmFsaWQsIHNvIHdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgc2VwYXJhdGVseSBmcm9tIHRoZSBvdGhlciBwcmVmaXggb3BlcmF0b3JzLgotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuUFJFRklYX1BMVVNfUExVUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5QUkVGSVhfTUlOVVNfTUlOVVM6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXh0UHJlY2VkZW5jZSA8IHRvcDFQcmVjZWRlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIUV4cHJlc3Npb25TdXBwb3J0LmlzQVZhcmlhYmxlKHN0YWNrLnRvcCgpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggImluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlZHVjZSggMiwgMSwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWdhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBwcmVmaXggb3BlcmF0b3JzLiAgVGhleSBhcmUgYWxsIHJpZ2h0LWFzc29jaWF0aXZlLgotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuUFVSRV9QUkVGSVhfT1BFUkFUT1I6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXh0UHJlY2VkZW5jZSA8IHRvcDFQcmVjZWRlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZWR1Y2UoIDIsIDEsIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FnYWluID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgYXNzaWdubWVudCBvcGVyYXRvcnMuICBUaGV5IGFyZSBhbGwgcmlnaHQtYXNzb2NpYXRpdmUuCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5BU1NJR05NRU5UX09QRVJBVE9SOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV4dFByZWNlZGVuY2UgPCB0b3AxUHJlY2VkZW5jZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVkdWNlKCAzLCAxLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBZ2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGluc3RlbmNlb2Yga2V5d29yZC4gIFRoZSByaHMgaGFzIHRvIGJlIGEgcG90ZW50aWFsIHR5cGUuCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0lOU1RBTkNFT0Y6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXh0UHJlY2VkZW5jZSA8IHRvcDFQcmVjZWRlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIUV4cHJlc3Npb25TdXBwb3J0LmlzQVBvdGVudGlhbFR5cGVOYW1lKHRvcDAsIGZhbHNlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciggImluc3RhbmNlb2YgcmlnaHQtaGFuZCBzaWRlIG11c3QgYmUgYSB2YWxpZCB0eXBlIG5hbWUiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVkdWNlKCAzLCAxLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBZ2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYWxsIG90aGVyIGluZml4IG9wZXJhdG9ycy4gIFRoZXkgYXJlIGFsbCBsZWZ0LWFzc29jaWF0aXZlLgotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5GSVhfT1BFUkFUT1I6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuZXh0UHJlY2VkZW5jZSA8PSB0b3AxUHJlY2VkZW5jZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVkdWNlKCAzLCAxLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBZ2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBBbnl0aGluZyBlbHNlIGluIHRvcDEgaXMgYW4gYnVnLgotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImZvdW5kIHVuZXhwZWN0ZWQgdG9rZW4gZHVyaW5nIFJFRFVDRSBbIiArIHRvcDEuZ2V0TWVhbmluZygpICsgIl0iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gd2hpbGUoIGNoZWNrQWdhaW4gKTsKLQotICAgICAgICB9IHdoaWxlKCB0cnVlICk7Ci0KLQotICAgICAgICBpZiggc3RhY2suc2l6ZSgpID09IDEgJiYgc3RhY2sudG9wSXNBbkV4cHJlc3Npb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBzdGFjay5wb3AoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yKCAiZXhwcmVzc2lvbiBpbmNvbXBsZXRlIiApOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJFWElUSU5HIEVYUFJFU1NJT04gIiArIGlkICk7Ci0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUFJFU1NJT05fU0hJRlRfSEFORExFUlNbXSA9IHsKLSAgICAgICAgICBUeXBlcy5HU1RSSU5HX1NUQVJUCi0gICAgICAgICwgVHlwZXMuQ1JFQVRBQkxFX1BSSU1JVElWRV9UWVBFCi0gICAgICAgICwgVHlwZXMuU0lNUExFX0VYUFJFU1NJT04KLSAgICAgICAgLCBUeXBlcy5LRVlXT1JEX0lERU5USUZJRVIKLSAgICAgICAgLCBUeXBlcy5BU1NJR05NRU5UX09QRVJBVE9SCi0gICAgICAgICwgVHlwZXMuUFJFRklYX09SX0lORklYX09QRVJBVE9SCi0gICAgICAgICwgVHlwZXMuUFJFRklYX09QRVJBVE9SCi0gICAgICAgICwgVHlwZXMuUVVFU1RJT04KLSAgICAgICAgLCBUeXBlcy5JTkZJWF9PUEVSQVRPUgotICAgICAgICAsIFR5cGVzLkxFRlRfUEFSRU5USEVTSVMKLSAgICAgICAgLCBUeXBlcy5MRUZUX0NVUkxZX0JSQUNFCi0gICAgICAgICwgVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVAotICAgICAgICAsIFR5cGVzLktFWVdPUkRfTkVXCi0gICAgICAgICwgVHlwZXMuS0VZV09SRF9JTlNUQU5DRU9GCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBSRVNTSU9OX1JFRFVDRV9IQU5ETEVSU1tdID0gewotICAgICAgICAgIFR5cGVzLlBSRUZJWF9QTFVTX1BMVVMKLSAgICAgICAgLCBUeXBlcy5QUkVGSVhfTUlOVVNfTUlOVVMKLSAgICAgICAgLCBUeXBlcy5QVVJFX1BSRUZJWF9PUEVSQVRPUgotICAgICAgICAsIFR5cGVzLkFTU0lHTk1FTlRfT1BFUkFUT1IKLSAgICAgICAgLCBUeXBlcy5LRVlXT1JEX0lOU1RBTkNFT0YKLSAgICAgICAgLCBUeXBlcy5JTkZJWF9PUEVSQVRPUgotICAgIH07Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSB0eXBlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbi4gIFdpdGhvdXQgdGhlIHR5cGUsIGl0J3MgYQotICAgICogIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpbnN0ZWFkIChubyBjb21tYSBzdXBwb3J0KS4gIFRoZSBkYXRhdHlwZQotICAgICogIGhhcyBhbHJlYWR5IGJlZW4gaWRlbnRpZmllZCBhbmQgaXMgcGFzc2VkIGluLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KLSAgICAqICAgICAgICA9IGRhdGF0eXBlIChuYW1lRGVjbGFyYXRpb24gIj0iIGV4cHJlc3Npb24pCi0gICAgKiAgICAgICAgICAgICAgICAgICAoIiwiIG5hbWVEZWNsYXJhdGlvbiAiPSIgZXhwcmVzc2lvbikqCi0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHN0YXRlbWVudCAgID0geyA6PFNZTlRIX1ZBUklBQkxFX0RFQ0xBUkFUSU9OPiBkYXRhdHlwZSBkZWNsYXJhdGlvbisgfQotICAgICogICAgIGRlY2xhcmF0aW9uID0geyA8aWRlbnRpZmllcj4gZXhwcmVzc2lvbiB9Ci0gICAgKgotICAgICogICAgIHNlZSBleHByZXNzaW9uKCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiggQ1NUTm9kZSBkYXRhdHlwZSApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWR1Y3Rpb24gZXhwcmVzc2lvbiA9ICgoVG9rZW4pZGF0YXR5cGUuZ2V0KDApKS5kdXAoKS5hc1JlZHVjdGlvbiggZGF0YXR5cGUgKTsgIC8vIGRvbmUgZm9yIGxpbmUgbnVtYmVyIG9uIFNZTlRICi0gICAgICAgIGV4cHJlc3Npb24uc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfVkFSSUFCTEVfREVDTEFSQVRJT04gKTsKLQotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVkdWN0aW9uIGRlY2xhcmF0aW9uID0gKFJlZHVjdGlvbilleHByZXNzaW9uLmFkZCggbmFtZURlY2xhcmF0aW9uKGZhbHNlKS5hc1JlZHVjdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgY29uc3VtZSggVHlwZXMuRVFVQUwgKTsKLSAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIFN5bnRheEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKCBlICk7Ci0gICAgICAgICAgICAgICAgcmVjb3ZlciggVHlwZXMuQU5ZX0VORF9PRl9TVEFURU1FTlQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuQ09NTUEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLkNPTU1BICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSB3aGlsZSggIWRvbmUgKTsKLQotCi0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIEdTdHJpbmcuCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBnc3RyaW5nID0gKDx0ZXh0Pj8gIiQiICJ7IiBleHByZXNzaW9uICJ9IiA8dGV4dD4/KSoKLSAgICAqICA8L3ByZT4KLSAgICAqICA8cD4KLSAgICAqICBDU1Q6IDxwcmU+Ci0gICAgKiAgICAgZ3N0cmluZyA9IHsgPGZ1bGwtdGV4dD46U1lOVEhfR1NUUklORyAoc2VnbWVudHxleHByZXNzaW9uKSogfQotICAgICoKLSAgICAqICAgICBzZWUgZXhwcmVzc2lvbigpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gZ3N0cmluZygpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBpbnQgaWQgPSBuZXN0Q291bnQrKzsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiRU5URVJJTkcgR1NUUklORyAiICsgaWQgKTsKLQotICAgICAgICBSZWR1Y3Rpb24gZGF0YSA9IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKTsKLQotICAgICAgICBjb25zdW1lKCBUeXBlcy5HU1RSSU5HX1NUQVJUICk7Ci0KLSAgICAgICAgd2hpbGUoIGx0KCkgIT0gVHlwZXMuR1NUUklOR19FTkQgJiYgbHQoKSAhPSBUeXBlcy5FT0YgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIGx0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICBkYXRhLmFkZCggY29uc3VtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5HU1RSSU5HX0VYUFJFU1NJT05fU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5HU1RSSU5HX0VYUFJFU1NJT05fRU5EICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiZ3N0cmluZyBmb3VuZCBpbnZhbGlkIHRva2VuOiAiICsgbGEoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUmVkdWN0aW9uIGNvbXBsZXRlID0gY29uc3VtZSggVHlwZXMuR1NUUklOR19FTkQgKS5hc1JlZHVjdGlvbigpOwotICAgICAgICBjb21wbGV0ZS5hZGRDaGlsZHJlbk9mKCBkYXRhICk7Ci0KLSAgICAgICAgY29tcGxldGUuc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfR1NUUklORyApOwotCi0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIkVYSVRJTkcgR1NUUklORyAiICsgaWQgKTsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXRlOwotICAgIH0KLQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgTk9OLUVNUFRZIHBhcmFtZXRlciBsaXN0LCBhcyBzdXBwbGllZCBvbiBlaXRoZXIgYSBtZXRob2QgaW52b2thdGlvbiBvcgotICAgICogIGEgY2xvc3VyZSBpbnZva2F0aW9uLiAgUmVhZHMgcGFyYW1ldGVycyB1bnRpbCBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGJlbG9uZwotICAgICogIGlzIGZvdW5kLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgcGFyYW1ldGVyTGlzdCA9IChyZWd1bGFyICIsIiBuYW1lZCkgfCBuYW1lZAotICAgICogICAgIHJlZ3VsYXIgPSBwYXJhbWV0ZXIgKCIsIiBwYXJhbWV0ZXIpKgotICAgICogICAgIG5hbWVkICAgPSBuYW1lUmVmZXJlbmNlICI6IiBwYXJhbWV0ZXIgKCIsIiBuYW1lUmVmZXJlbmNlICI6IiBwYXJhbWV0ZXIpKgotICAgICoKLSAgICAqICAgICBwYXJhbWV0ZXIgPSBleHByZXNzaW9uCi0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIHBhcmFtZXRlckxpc3QgPSB7IDxudWxsPiByZWd1bGFyKiBuYW1lZCogfQotICAgICogICAgIHJlZ3VsYXIgPSBleHByZXNzaW9uCi0gICAgKiAgICAgbmFtZWQgICA9IHsgIjoiIDxpZGVudGlmaWVyPiBleHByZXNzaW9uIH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIHBhcmFtZXRlckxpc3QoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gaW50IGlkID0gbmVzdENvdW50Kys7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIkVOVEVSSU5HIFBBUkFNRVRFUiBMSVNUICIgKyBpZCApOwotCi0gICAgICAgIFJlZHVjdGlvbiBsaXN0ICA9IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKTsKLSAgICAgICAgUmVkdWN0aW9uIG5hbWVkID0gbnVsbDsKLQotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbGEoKS5jYW5NZWFuKFR5cGVzLklERU5USUZJRVIpICYmIGxhKDIpLmlzQShUeXBlcy5DT0xPTikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBuYW1lZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVkID0gVG9rZW4ubmV3UGxhY2Vob2xkZXIoVHlwZXMuU1lOVEhfTUFQKS5hc1JlZHVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCggbmFtZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBUb2tlbiBuYW1lID0gbmFtZVJlZmVyZW5jZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbmFtZS5zZXRNZWFuaW5nKCBUeXBlcy5TVFJJTkcgKTsKLQotICAgICAgICAgICAgICAgIG5hbWVkLmFkZCggY29uc3VtZShUeXBlcy5DT0xPTikuYXNSZWR1Y3Rpb24obmFtZSwgZXhwcmVzc2lvbigpKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBleHByZXNzaW9uKCkgKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5DT01NQSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSB3aGlsZSggIWRvbmUgKTsKLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJFWElUSU5HIFBBUkFNRVRFUiBMSVNUICIgKyBpZCApOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBQcm9jZXNzZXMgYSAibmV3IiBleHByZXNzaW9uLiAgSGFuZGxlcyBvcHRpb25hbCBjb25zdHJ1Y3RvcnMsIGFycmF5Ci0gICAgKiAgaW5pdGlhbGl6YXRpb25zLCBjbG9zdXJlIGFyZ3VtZW50cywgYW5kIGFub255bW91cyBjbGFzc2VzLiAgSW4gb3JkZXIKLSAgICAqICB0byBzdXBwb3J0IGFub255bW91cyBjbGFzc2VzLCBhbm9ueW1vdXMgY2xvc3VyZXMgYXJlIG5vdCBhbGxvd2VkLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgbmV3RXhwcmVzc2lvbiA9ICJuZXciIHNjYWxhckRhdGF0eXBlIChhcnJheXxpbml0KT8KLSAgICAqICAgICBhcnJheSA9ICggIlsiIGV4cHJlc3Npb24gIl0iICkrIHwgKCAoIlsiICJdIikrIG5ld0FycmF5SW5pdGlhbGl6ZXIgKQotICAgICogICAgIGluaXQgID0gIigiIHBhcmFtZXRlckxpc3Q/ICIpIiAodHlwZUJvZHkgfCBjbG9zdXJlRXhwcmVzc2lvbik/Ci0gICAgKiAgPC9wcmU+Ci0gICAgKiAgPHA+Ci0gICAgKiAgQ1NUOiA8cHJlPgotICAgICogICAgIG5ldyA9IHsgIm5ldyIgYXJyYXlUeXBlICAgICBkaW1lbnNpb25zIG5ld0FycmF5SW5pdGlhbGl6ZXI/IH0KLSAgICAqICAgICAgICAgfCB7ICJuZXciIHNjYWxhckRhdGF5cGUgKHBhcmFtZXRlckxpc3R8ezxudWxsPn0pIHR5cGVCb2R5PyB9Ci0gICAgKgotICAgICogICAgIGFycmF5VHlwZSAgPSB7ICJ7IiAoYXJyYXlUeXBlIHwgc2NhbGFyRGF0YXR5cGUpIH0KLSAgICAqICAgICBkaW1lbnNpb25zID0geyA8bnVsbD4gZXhwcmVzc2lvbisgfSB8IHt9Ci0gICAgKgotICAgICogICAgIHNlZSBleHByZXNzaW9uKCkKLSAgICAqICAgICBzZWUgc2NhbGFyRGF0YXR5cGUoKQotICAgICogICAgIHNlZSB0eXBlQm9keSgpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gbmV3RXhwcmVzc2lvbigpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBpbnQgaWQgPSBuZXN0Q291bnQrKzsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiRU5URVJJTkcgTkVXICIgKyBpZCApOwotCi0gICAgICAgIFJlZHVjdGlvbiBleHByZXNzaW9uID0gY29uc3VtZShUeXBlcy5LRVlXT1JEX05FVykuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgQ1NUTm9kZSAgIHNjYWxhclR5cGUgPSBzY2FsYXJEYXRhdHlwZShmYWxzZSk7Ci0KLSAgICAgICAgaWYoIGx0KHRydWUpID09IFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRmlyc3QgdXAsIGZpZ3VyZSBvdXQgdGhlIGFjdHVhbCB0eXBlIGFuZCBhbnkKLSAgICAgICAgICAgIC8vIHN0YXRlZCBkaW1lbnNpb25zLgotCi0gICAgICAgICAgICBib29sZWFuICAgaW1wbGljaXQgICA9IChsdCgyKSA9PSBUeXBlcy5SSUdIVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgICAgICAgICBSZWR1Y3Rpb24gZGltZW5zaW9ucyA9IGltcGxpY2l0ID8gUmVkdWN0aW9uLkVNUFRZIDogUmVkdWN0aW9uLm5ld0NvbnRhaW5lcigpOwotICAgICAgICAgICAgaW50ICAgICAgIGNvdW50ICAgICAgPSAwOwotICAgICAgICAgICAgQ1NUTm9kZSAgIGFycmF5VHlwZSAgPSBzY2FsYXJUeXBlOwotCi0gICAgICAgICAgICB3aGlsZSggbHQodHJ1ZSkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJyYXlUeXBlID0gY29uc3VtZShUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUKS5hc1JlZHVjdGlvbiggYXJyYXlUeXBlICk7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGlmKCAhaW1wbGljaXQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucy5hZGQoIGV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN1bWUoVHlwZXMuUklHSFRfU1FVQVJFX0JSQUNLRVQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHByZXNzaW9uLmFkZCggYXJyYXlUeXBlICk7Ci0gICAgICAgICAgICBleHByZXNzaW9uLmFkZCggZGltZW5zaW9ucyApOwotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgaW1wbGljaXQsIHRoZXJlIG11c3QgYmUgaW5pdGlhbGl6YXRpb24gZGF0YQotCi0gICAgICAgICAgICBpZiggaW1wbGljaXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uYWRkKCB0dXBsZUV4cHJlc3Npb24oMCwgY291bnQpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXhwcmVzc2lvbi5hZGQoIHNjYWxhclR5cGUgKTsKLQotCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgY29uc3RydWN0b3IgY2FsbAotCi0gICAgICAgICAgICBSZWR1Y3Rpb24gcGFyYW1ldGVycyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGNvbnN1bWUoIFR5cGVzLkxFRlRfUEFSRU5USEVTSVMgKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAobHQoKSA9PSBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyA/IFJlZHVjdGlvbi5uZXdDb250YWluZXIoKSA6IHBhcmFtZXRlckxpc3QoKSk7Ci0gICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgICAgICBleHByZXNzaW9uLmFkZCggcGFyYW1ldGVycyApOwotCi0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJZiBhICJ7IiBmb2xsb3dzLCBpdCdzIGEgY2xhc3MgYm9keSBvciBhIGNsb3N1cmUuLi4KLQotICAgICAgICAgICAgaWYoIGx0KCkgPT0gVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGx0KDIpID09IFR5cGVzLlBJUEUgfHwgbHQoMikgPT0gVHlwZXMuRE9VQkxFX1BJUEUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQoIGNsb3N1cmVFeHByZXNzaW9uKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5hZGQoIHR5cGVCb2R5KHRydWUsIGZhbHNlLCBmYWxzZSkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJFWElUSU5HIE5FVyAiICsgaWQgKTsKLSAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgIm5ldyIgYXJyYXkgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KLSAgICAqICA8cD4KLSAgICAqICBHcmFtbWFyOiA8cHJlPgotICAgICogICAgIHR1cGxlRXhwcmVzc2lvbiA9ICJ7IiAodHVwbGVFeHByZXNzaW9uIHwgKGV4cHJlc3Npb24gKCIsIiBleHByZXNzaW9uKSk/ICJ9IgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBpbml0aWFsaXplciA9IHsgInsiOlNZTlRIX1RVUExFIChpbml0aWFsaXplcip8ZXhwcmVzc2lvbiopIH0KLSAgICAqCi0gICAgKiAgICAgc2VlIGV4cHJlc3Npb24oKQotICAgICogIDwvcHJlPgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgUmVkdWN0aW9uIHR1cGxlRXhwcmVzc2lvbiggaW50IGxldmVsLCBpbnQgZGVwdGggKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIGRhdGEgPSBjb25zdW1lKFR5cGVzLkxFRlRfQ1VSTFlfQlJBQ0UpLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgIGRhdGEuc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfVFVQTEUgKTsKLQotICAgICAgICBpZiggbHQoKSAhPSBUeXBlcy5SSUdIVF9DVVJMWV9CUkFDRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCAgICBjaGlsZCA9IGxldmVsICsgMTsKLSAgICAgICAgICAgIGJvb2xlYW4gbGVhZiA9IChjaGlsZCA9PSBkZXB0aCk7Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YS5hZGQoIGxlYWYgPyBleHByZXNzaW9uKCkgOiB0dXBsZUV4cHJlc3Npb24oY2hpbGQsIGRlcHRoKSApOwotCi0gICAgICAgICAgICB9IHdoaWxlKCBsdCgpID09IFR5cGVzLkNPTU1BICYmIChjb25zdW1lKCkgIT0gbnVsbCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX0NVUkxZX0JSQUNFICk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgUHJvY2Vzc2VzIGEgY2xvc3VyZSBleHByZXNzaW9uLgotICAgICogIDxwPgotICAgICogIEdyYW1tYXI6IDxwcmU+Ci0gICAgKiAgICAgY2xvc3VyZUV4cHJlc3Npb24gPSAieyIgcGFyYW1ldGVycyBzdGF0ZW1lbnQqICJ9IgotICAgICogICAgIHBhcmFtZXRlcnMgPSAoInwiIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCAifCIpPwotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBpbml0aWFsaXplciA9IHsgInsiOlNZTlRIX0NMT1NVUkUgcGFyYW1ldGVycyBzdGF0ZW1lbnRzIH0KLSAgICAqICAgICBwYXJhbWV0ZXJzICA9IHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCB8IHsgPG51bGw+IH0KLSAgICAqICAgICBzdGF0ZW1lbnRzICA9IHsgPG51bGw+IHN0YXRlbWVudCogfQotICAgICoKLSAgICAqICAgICBzZWUgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KCkKLSAgICAqICAgICBzZWUgc3RhdGVtZW50KCkKLSAgICAqICA8L3ByZT4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBjbG9zdXJlRXhwcmVzc2lvbiggKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gaW50IGlkID0gbmVzdENvdW50Kys7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIkVOVEVSSU5HIENMT1NVUkUgRVhQUkVTU0lPTiAiICsgaWQgKTsKLQotICAgICAgICBSZWR1Y3Rpb24gY2xvc3VyZSA9IGNvbnN1bWUoVHlwZXMuTEVGVF9DVVJMWV9CUkFDRSkuYXNSZWR1Y3Rpb24oKTsKLSAgICAgICAgY2xvc3VyZS5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9DTE9TVVJFICk7Ci0gICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkID0gKGx0KCkgPT0gVHlwZXMuUElQRSkgfHwgKGx0KCkgPT0gVHlwZXMuRE9VQkxFX1BJUEUpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIERFUFJFQ0FURUQ6IHRoZSBvbGQgc3ludGF4IGZvciBwYXJhbWV0ZXJzIGhhZCBhIHwgb25seQotICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gIFRoZSBuZXcgc3ludGF4IGhhcwotICAgICAgICAvLyB0d28gcGlwZXMgb3Igbm9uZS4gIEZvciBub3csIHdlIGF0dGVtcHQgdG8gc3VwcG9ydCB0aGUKLSAgICAgICAgLy8gb2xkIHN5bnRheC4gIEl0IGNhbiBtaXN0YWtlIGEgdmFyaWFibGUgZGVjbGFyYXRpb24KLSAgICAgICAgLy8gZm9yIGEgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLCB0aG91Z2gsIHNvIGl0IG1heSBjYXVzZSBtb3JlCi0gICAgICAgIC8vIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgVGhpcyBpZigpIGFuZCB0aGUgb25lIGJlbG93Ci0gICAgICAgIC8vIChhbHNvIG1hcmtlZCkgc2hvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIHYxLjAuCi0KLSAgICAgICAgaWYoICFzcGVjaWZpZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRUb2tlblN0cmVhbSgpLmNoZWNrcG9pbnQoKTsKLSAgICAgICAgICAgIENTVE5vZGUgdHlwZSA9IG9wdGlvbmFsRGF0YXR5cGUoIHRydWUsIGZhbHNlICk7Ci0gICAgICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5JREVOVElGSUVSICYmIChsdCgyKSA9PSBUeXBlcy5QSVBFIHx8IGx0KDIpID09IFR5cGVzLkNPTU1BKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3BlY2lmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0VG9rZW5TdHJlYW0oKS5yZXN0b3JlKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBzcGVjaWZpZWQsIHByb2Nlc3MgaXQuCi0KLSAgICAgICAgaWYoIHNwZWNpZmllZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkRPVUJMRV9QSVBFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdW1lKCBUeXBlcy5ET1VCTEVfUElQRSApOwotICAgICAgICAgICAgICAgIGNsb3N1cmUuYWRkKCBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IGZ1cnRoZXIgc3VwcG9ydCBmb3Igbm90ZSBhYm92ZSwgdGhpcyBjb25zdW1lKCkKLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIGNvbmRpdGlvbmFsIGFmdGVyIHRoZSBhYm92ZSBjb2RlIGlzIHJlbW92ZWQuCi0KLSAgICAgICAgICAgICAgICBpZiggbHQoKSA9PSBUeXBlcy5QSVBFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoVHlwZXMuUElQRSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xvc3VyZS5hZGQoIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCgpICk7Ci0gICAgICAgICAgICAgICAgY29uc3VtZShUeXBlcy5QSVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsb3N1cmUuYWRkKCBSZWR1Y3Rpb24ubmV3Q29udGFpbmVyKCkgKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRmluYWxseSwgcHJvY2VzcyB0aGUgc3RhdGVtZW50cy4KLQotICAgICAgICBjbG9zdXJlLmFkZCggc3RhdGVtZW50c1VudGlsUmlnaHRDdXJseSgpICk7Ci0gICAgICAgIGNvbnN1bWUoIFR5cGVzLlJJR0hUX0NVUkxZX0JSQUNFICk7Ci0KLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiRVhJVElORyBDTE9TVVJFIEVYUFJFU1NJT04gIiArIGlkICk7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFByb2Nlc3NlcyBhIGxpc3Qgb3IgbWFwIGV4cHJlc3Npb24uCi0gICAgKiAgPHA+Ci0gICAgKiAgR3JhbW1hcjogPHByZT4KLSAgICAqICAgICBsaXN0T3JNYXBFeHByZXNzaW9uID0gbGlzdCB8IG1hcAotICAgICoKLSAgICAqICAgICBsaXN0ID0gIlsiIChleHByZXNzaW9uICgiLCIgZXhwcmVzc2lvbikqKT8gIl0iCi0gICAgKgotICAgICogICAgIG1hcCAgICAgPSAiWyIgKCI6IiB8IG1hcHBpbmcrKSAiXSIKLSAgICAqICAgICBtYXBwaW5nID0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbgotICAgICogIDwvcHJlPgotICAgICogIDxwPgotICAgICogIENTVDogPHByZT4KLSAgICAqICAgICBsaXN0ICAgID0geyAiWyI6U1lOVEhfTElTVCBleHByZXNzaW9uKiB9Ci0gICAgKiAgICAgbWFwICAgICA9IHsgIlsiOlNZTlRIX01BUCAgbWFwcGluZyogfQotICAgICogICAgIG1hcHBpbmcgPSB7ICI6IiBleHByZXNzaW9uIGV4cHJlc3Npb24gfQotICAgICoKLSAgICAqICAgICBzZWUgZXhwcmVzc2lvbigpCi0gICAgKiAgPC9wcmU+Ci0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gbGlzdE9yTWFwRXhwcmVzc2lvbiggYm9vbGVhbiBpc01hcCwgYm9vbGVhbiBpbnNpc3QgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVkdWN0aW9uIGV4cHJlc3Npb24gPSBjb25zdW1lKFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQpLmFzUmVkdWN0aW9uKCk7Ci0gICAgICAgIGV4cHJlc3Npb24uc2V0TWVhbmluZyggVHlwZXMuU1lOVEhfTElTVCApOwotCi0gICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkNPTE9OICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICFpc01hcCAmJiBpbnNpc3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycm9yKCAiZXhwZWN0ZWQgbGlzdCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaXNNYXAgPSB0cnVlOwotICAgICAgICAgICAgZXhwcmVzc2lvbi5zZXRNZWFuaW5nKCBUeXBlcy5TWU5USF9NQVAgKTsKLSAgICAgICAgICAgIGNvbnN1bWUoKTsKLSAgICAgICAgICAgIGlmKCBsdCgpICE9IFR5cGVzLlJJR0hUX1NRVUFSRV9CUkFDS0VUICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJvciggImV4cGVjdGVkIGVtcHR5IG1hcCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YS4gIE9uIHRoZSBmaXJzdCBvbmUsIGNoZWNrIGlmIHdlIGFyZQotICAgICAgICAvLyBwcm9jZXNzaW5nIGEgbWFwLiAgV2UgYXNzdW1lIG5vdCBnb2luZyBpbiwgYXMgdGhlIGVtcHR5Ci0gICAgICAgIC8vIG1hcCBpc24ndCByZWxldmFudC4uLgotCi0gICAgICAgIGJvb2xlYW4gZG9uZSA9IChsdCgpID09IFR5cGVzLlJJR0hUX1NRVUFSRV9CUkFDS0VUKTsKLQotICAgICAgICB3aGlsZSggIWRvbmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU1ROb2RlIGVsZW1lbnQgPSBleHByZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgIGlmKCAhaW5zaXN0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNpc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkNPTE9OICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zZXRNZWFuaW5nKFR5cGVzLlNZTlRIX01BUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaXNNYXAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBjb25zdW1lKFR5cGVzLkNPTE9OKS5hc1JlZHVjdGlvbiggZWxlbWVudCwgZXhwcmVzc2lvbigpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4cHJlc3Npb24uYWRkKCBlbGVtZW50ICk7Ci0KLSAgICAgICAgICAgIGlmKCBsdCgpID09IFR5cGVzLkNPTU1BICkgeyBjb25zdW1lKCk7IH0gZWxzZSB7IGRvbmUgPSB0cnVlOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdW1lKFR5cGVzLlJJR0hUX1NRVUFSRV9CUkFDS0VUKTsKLQotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTeW5vbnltIGZvciA8Y29kZT5saXN0T3JNYXBFeHByZXNzaW9uKCBmYWxzZSwgZmFsc2UgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBSZWR1Y3Rpb24gbGlzdE9yTWFwRXhwcmVzc2lvbiggKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxpc3RPck1hcEV4cHJlc3Npb24oIGZhbHNlLCBmYWxzZSApOwotICAgIH0KLQotCi0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRVJST1IgUkVQT1JUSU5HCi0KLQotICAgLyoqCi0gICAgKiAgUmVwb3J0cyBhbiBlcnJvciBhc3NlbWJsZWQgZnJvbSBwYXJ0cy4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiBlcnJvciggVG9rZW4gZm91bmQsIGludFtdIGV4cGVjdGVkVHlwZXMsIGJvb2xlYW4gdGhyb3dJdCwgU3RyaW5nIGNvbW1lbnQgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCi0gICAgewotICAgICAgICBVbmV4cGVjdGVkVG9rZW5FeGNlcHRpb24gZSA9IG5ldyBVbmV4cGVjdGVkVG9rZW5FeGNlcHRpb24oIGZvdW5kLCBleHBlY3RlZFR5cGVzLCBjb21tZW50ICk7Ci0KLSAgICAgICAgaWYoIHRocm93SXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogIFJlcG9ydHMgYW4gZXJyb3IgYnkgZ2VuZXJhdGluZyBhbmQgb3B0aW9uYWxseSB0aHJvd2luZyBhbgotICAgICogIDxjb2RlPlVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbjwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBVbmV4cGVjdGVkVG9rZW5FeGNlcHRpb24gZXJyb3IoIGludFtdIGV4cGVjdGVkVHlwZXMsIGJvb2xlYW4gdGhyb3dJdCwgaW50IGssIFN0cmluZyBjb21tZW50ICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJvciggbGEoayksIGV4cGVjdGVkVHlwZXMsIHRocm93SXQsIGNvbW1lbnQgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPmVycm9yKCBleHBlY3RlZFR5cGVzLCB0aHJvd0l0LCBrLCBudWxsICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIGVycm9yKCBpbnRbXSBleHBlY3RlZFR5cGVzLCBib29sZWFuIHRocm93SXQsIGludCBrICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJvciggZXhwZWN0ZWRUeXBlcywgdGhyb3dJdCwgaywgbnVsbCApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+ZXJyb3IoIGV4cGVjdGVkVHlwZXMsIHRydWUsIDEsIG51bGwgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKCBpbnRbXSBleHBlY3RlZFR5cGVzICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IGVycm9yKCBleHBlY3RlZFR5cGVzLCBmYWxzZSwgMSwgbnVsbCApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+ZXJyb3IoIG51bGwsIHRydWUsIDEsIG51bGwgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IGVycm9yKCBudWxsLCB0cnVlLCAxLCBudWxsICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgQSBzeW5vbnltIGZvciA8Y29kZT5lcnJvciggbnVsbCwgdHJ1ZSwgMSwgY29tbWVudCApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXJyb3IoIFN0cmluZyBjb21tZW50ICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IGVycm9yKCBudWxsLCB0cnVlLCAxLCBjb21tZW50ICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgQSBzeW5vbnltIGZvciA8Y29kZT5lcnJvciggZm91bmQsIG51bGwsIHRydWUsIGNvbW1lbnQgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGVycm9yKCBUb2tlbiBmb3VuZCwgU3RyaW5nIGNvbW1lbnQgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBlcnJvciggZm91bmQsIG51bGwsIHRydWUsIGNvbW1lbnQgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHNjYWxhciBzeW5vbnltIG9mIDxjb2RlPmVycm9yKCBleHBlY3RlZFR5cGVzICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlcnJvciggaW50IGV4cGVjdGVkVHlwZSApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBlcnJvciggbmV3IGludFtdIHsgZXhwZWN0ZWRUeXBlIH0gKTsKLSAgICB9Ci0KLQotCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRVJST1IgUkVDT1ZFUlkKLQotCi0gICAvKioKLSAgICAqICBBdHRlbXB0cyB0byByZWNvdmVyIGZyb20gYW4gZXJyb3IgYnkgZGlzY2FyZGluZyBpbnB1dCB1bnRpbCBhCi0gICAgKiAga25vd24gdG9rZW4gaXMgZm91bmQuICBJdCBmdXJ0aGVyIGd1YXJhbnRlZXMgdGhhdCAvYXQgbGVhc3QvCi0gICAgKiAgb25lIHRva2VuIHdpbGwgYmUgZWF0ZW4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY292ZXIoIGludFtdIHNhZmUsIGJvb2xlYW4gaWdub3JlTmV3bGluZXMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVG9rZW4gbGVhZGluZyA9IGxhKCBpZ25vcmVOZXdsaW5lcyApOwotCi0gICAgICAgIHdoaWxlKCB0cnVlICkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW4gbmV4dCA9IGxhKCBpZ25vcmVOZXdsaW5lcyApOwotICAgICAgICAgICAgaWYoIG5leHQuaXNBKFR5cGVzLkVPRikgfHwgbmV4dC5pc09uZU9mKHNhZmUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdW1lKCBpZ25vcmVOZXdsaW5lcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGxhKGlnbm9yZU5ld2xpbmVzKSA9PSBsZWFkaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3VtZSggaWdub3JlTmV3bGluZXMgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc2NhbGFyIHZlcnNpb24gb2YgPGNvZGU+cmVjb3ZlciggaW50W10sIGJvb2xlYW4gKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY292ZXIoIGludCBzYWZlLCBib29sZWFuIGlnbm9yZU5ld2xpbmVzICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuIGxlYWRpbmcgPSBsYSggaWdub3JlTmV3bGluZXMgKTsKLQotICAgICAgICB3aGlsZSggdHJ1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRva2VuIG5leHQgPSBsYSggaWdub3JlTmV3bGluZXMgKTsKLSAgICAgICAgICAgIGlmKCBuZXh0LmlzQShUeXBlcy5FT0YpIHx8IG5leHQuaXNBKHNhZmUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdW1lKCBpZ25vcmVOZXdsaW5lcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGxhKGlnbm9yZU5ld2xpbmVzKSA9PSBsZWFkaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3VtZSggaWdub3JlTmV3bGluZXMgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+cmVjb3Zlciggc2FmZSwgZmFsc2UgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY292ZXIoIGludFtdIHNhZmUgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmVjb3Zlciggc2FmZSwgZmFsc2UgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ubSBmb3IgdGhlIHNjYWxhciA8Y29kZT5yZWNvdmVyKCBzYWZlLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcmVjb3ZlciggaW50IHNhZmUgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmVjb3Zlciggc2FmZSwgZmFsc2UgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBBIHN5bm9ueW0gZm9yIDxjb2RlPnJlY292ZXIoIFR5cGVzLkFOWV9FTkRfT0ZfU1RBVE1FTlQsIHRydWUgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHJlY292ZXIoICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJlY292ZXIoIFR5cGVzLkFOWV9FTkRfT0ZfU1RBVEVNRU5ULCB0cnVlICk7Ci0gICAgfQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRPS0VOIExPT0tBSEVBRAotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgKHdpdGhvdXQgY29uc3VtaW5nKSB0aGUgbmV4dCBrdGggdG9rZW4gaW4gdGhlIHVuZGVybHlpbmcKLSAgICAqICB0b2tlbiBzdHJlYW0uICBZb3UgY2FuIG1ha2UgbmV3bGluZXMgc2lnbmlmaWNhbnQgYXMgbmVlZGVkLgotICAgICogIFJldHVybnMgVG9rZW4uRU9GIG9uIGVuZCBvZiBzdHJlYW0uICBrIGlzIGNvdW50ZWQgZnJvbSAxLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gbGEoIGludCBrLCBib29sZWFuIHNpZ25pZmljYW50TmV3bGluZXMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5OVUxMOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENvdW50IGRvd24gb24gayB3aGlsZSBjb3VudGluZyB1cCBvbiBzdHJlYW1LLgotICAgICAgICAvLyBOT1RFOiBrIHN0YXJ0aW5nIGF0IGxlc3MgdGhhbiAxIGlzIGEgbWlzdGFrZS4uLgotICAgICAgICAvLyBUaGlzIHJvdXRpbmUgd2lsbCByZWxpYWJseSBOT1QgcmV0dXJuIFRva2VuLk5VTEwKLSAgICAgICAgLy8gL3VubGVzcy8gaXQgaXMgYWN0dWFsbHkgaW4gdGhlIHN0cmVhbS4KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHN0cmVhbUsgPSAxOwotICAgICAgICAgICAgd2hpbGUoIGsgPiAwICYmIHRva2VuLmdldE1lYW5pbmcoKSAhPSBUeXBlcy5FT0YgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRva2VuID0gZ2V0VG9rZW5TdHJlYW0oKS5sYSggc3RyZWFtSyApOwotICAgICAgICAgICAgICAgIHN0cmVhbUsgKz0gMTsKLQotICAgICAgICAgICAgICAgIGlmKCB0b2tlbiA9PSBudWxsICApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IFRva2VuLkVPRjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggdG9rZW4uZ2V0TWVhbmluZygpID09IFR5cGVzLk5FV0xJTkUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHNpZ25pZmljYW50TmV3bGluZXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgayAtPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggUmVhZEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udHJvbGxlci5hZGRGYXRhbEVycm9yKCBuZXcgU2ltcGxlTWVzc2FnZShlLmdldE1lc3NhZ2UoKSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTeW5vbnltIGZvciA8Y29kZT5sYSggaywgZmFsc2UgKTwvY29kZT4uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUb2tlbiBsYSggaW50IGsgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhKCBrLCBmYWxzZSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFN5bm9ueW0gZm9yIDxjb2RlPmxhKCAxLCBzaWduaWZpY2FudE5ld2xpbmVzICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gbGEoIGJvb2xlYW4gc2lnbmlmaWNhbnROZXdsaW5lcyApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbGEoIDEsIHNpZ25pZmljYW50TmV3bGluZXMgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqIFN5bm9ueW0gZm9yIDxjb2RlPmxhKCAxLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRva2VuIGxhKCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBsYSggMSwgZmFsc2UgKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBTcGVjaWFsIDxjb2RlPmxhKCk8L2NvZGU+IHVzZWQgYnkgdGhlIGV4cHJlc3Npb24gcGFyc2VyLiAgSXQgd2lsbCBnZXQgdGhlIG5leHQgdG9rZW4KLSAgICAqICBpbiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICBJZiB0aGUgbmV4dCB0b2tlbiBpcyBwYXN0IGEgbGluZSBib3VuZGFyeSBhbmQgbWlnaHQgYmUKLSAgICAqICB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc3RhdGVtZW50LCBpdCB3b24ndCBjcm9zcyB0aGUgbGluZSB0byBnZXQgaXQuCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUb2tlbiBsYSggRXhwcmVzc2lvblN0YWNrIHN0YWNrICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuIG5leHQgPSBsYSgpOwotCi0gICAgICAgIGlmKCBzdGFjay5jYW5Db21wbGV0ZSgpICYmIG5leHQuaXNBKFR5cGVzLlVOU0FGRV9PVkVSX05FV0xJTkVTKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBsYSh0cnVlKS5nZXRNZWFuaW5nKCkgPT0gVHlwZXMuTkVXTElORSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGxhKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgfQotCi0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBtZWFuaW5nIG9mIHRoZSA8Y29kZT5sYSggaywgc2lnbmlmaWNhbnROZXdsaW5lcyApPC9jb2RlPiB0b2tlbi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGludCBsdCggaW50IGssIGJvb2xlYW4gc2lnbmlmaWNhbnROZXdsaW5lcyApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbGEoaywgc2lnbmlmaWNhbnROZXdsaW5lcykuZ2V0TWVhbmluZygpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIG1lYW5pbmcgb2YgdGhlIDxjb2RlPmxhKCBrICk8L2NvZGU+IHRva2VuLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgaW50IGx0KCBpbnQgayApIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbGEoaykuZ2V0TWVhbmluZygpOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIFJldHVybnMgdGhlIG1lYW5pbmcgb2YgdGhlIDxjb2RlPmxhKCBzaWduaWZpY2FudE5ld2xpbmVzICk8L2NvZGU+IHRva2VuLgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgaW50IGx0KCBib29sZWFuIHNpZ25pZmljYW50TmV3bGluZXMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhKHNpZ25pZmljYW50TmV3bGluZXMpLmdldE1lYW5pbmcoKTsKLSAgICB9Ci0KLQotCi0gICAvKioKLSAgICAqICBSZXR1cm5zIHRoZSBtZWFuaW5nIG9mIHRoZSA8Y29kZT5sYSgpPC9jb2RlPiB0b2tlbi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIGludCBsdCgpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbGEoKS5nZXRNZWFuaW5nKCk7Ci0gICAgfQotCi0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRPS0VOIENPTlNVTVBUSU9OCi0KLQotICAgLyoqCi0gICAgKiAgQ29uc3VtZXMgKGFuZCByZXR1cm5zKSB0aGUgbmV4dCB0b2tlbiBpZiBpdCBpcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgKiAgSWYgPGNvZGU+c2lnbmlmaWNhbnROZXdsaW5lczwvY29kZT4gaXMgc2V0LCBuZXdsaW5lcyB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5Ci0gICAgKiAgYmUgY29uc3VtZWQ7IG90aGVyd2lzZSB0aGV5IHdpbGwuICBUaHJvd3MgPGNvZGU+VW5leHBlY3RlZFRva2VuRXhjZXB0aW9uPC9jb2RlPgotICAgICogIGlmIHRoZSB0eXBlIGRvZXNuJ3QgbWF0Y2guCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUb2tlbiBjb25zdW1lKCBpbnQgdHlwZSwgYm9vbGVhbiBzaWduaWZpY2FudE5ld2xpbmVzICkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggIWxhKHNpZ25pZmljYW50TmV3bGluZXMpLmlzQSh0eXBlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIHR5cGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICFzaWduaWZpY2FudE5ld2xpbmVzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggbHQodHJ1ZSkgPT0gVHlwZXMuTkVXTElORSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRUb2tlblN0cmVhbSgpLmNvbnN1bWUoVHlwZXMuTkVXTElORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZ2V0VG9rZW5TdHJlYW0oKS5jb25zdW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBSZWFkRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmFkZEZhdGFsRXJyb3IoIG5ldyBTaW1wbGVNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAidGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIiApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+Y29uc3VtZSggdHlwZSwgZmFsc2UgKTwvY29kZT4uICBJZiB0eXBlIGlzIFR5cGVzLk5FV0xJTkUsCi0gICAgKiAgZXF1aXZhbGVudCB0byA8Y29kZT5jb25zdW1lKCBUeXBlcy5ORVdMSU5FLCB0cnVlICk8L2NvZGU+LgotICAgICovCi0KLSAgICBwcm90ZWN0ZWQgVG9rZW4gY29uc3VtZSggaW50IHR5cGUgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWUoIHR5cGUsIHR5cGUgPT0gVHlwZXMuTkVXTElORSApOwotICAgIH0KLQotCi0KLSAgIC8qKgotICAgICogIEEgc3lub255bSBmb3IgPGNvZGU+Y29uc3VtZSggVHlwZXMuQU5ZLCBmYWxzZSApPC9jb2RlPi4KLSAgICAqLwotCi0gICAgcHJvdGVjdGVkIFRva2VuIGNvbnN1bWUoKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWUoIGx0KCksIGZhbHNlICk7Ci0gICAgfQotCi0KLQotICAgLyoqCi0gICAgKiAgQSBzeW5vbnltIGZvciA8Y29kZT5jb25zdW1lKCBUeXBlcy5BTlksIHNpZ25pZmljYW50TmV3bGluZXMgKTwvY29kZT4uCi0gICAgKiAgSWYgeW91IHBhc3MgdHJ1ZSwgaXQgd2lsbCBjb25zdW1lIGV4YWN0bHkgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUKLSAgICAqICBzdHJlYW0uCi0gICAgKi8KLQotICAgIHByb3RlY3RlZCBUb2tlbiBjb25zdW1lKCBib29sZWFuIHNpZ25pZmljYW50TmV3bGluZXMgKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWUoIGx0KHNpZ25pZmljYW50TmV3bGluZXMpLCBzaWduaWZpY2FudE5ld2xpbmVzICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9Ub2tlblN0cmVhbS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvamF2YS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvVG9rZW5TdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiOGNhNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9Ub2tlblN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVhZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci0KLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi0KLS8qKgotICogIFByb3ZpZGVzIGEgc3RyZWFtIG9mIGxleGVyIHRva2VucyBmb3IgdXNlIGJ5IChwcmltYXJpbHkpIHRoZSBwYXJzaW5nCi0gKiAgc3lzdGVtcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFRva2VuU3RyZWFtCi17Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vICAgICBJbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKiogCi0gICAgICogIExvb2tzLWFoZWFkIHRvIHRoZSBuZXh0IHRva2VuLgotICAgICAqCi0gICAgICogIDxwPgotICAgICAqICBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPmxhKDEpPC9jb2RlPi4KLSAgICAgKiAgPC9wPgotICAgICAqCi0gICAgICogIEBzZWUgI2xhKGludCkKLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBuZXh0IHRva2VuIG9yIG51bGwgaWYgbm8gbW9yZSB0b2tlbnMKLSAgICAgKiAgICAgICAgICBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWFkRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGxvb2thaGVhZAotICAgICAqICAgICAgICAgIGEgdG9rZW4uCi0gICAgICovCi0KLSAgICBUb2tlbiBsYSgpIHRocm93cyBSZWFkRXhjZXB0aW9uLCBTeW50YXhFeGNlcHRpb247Ci0KLQotICAgIC8qKiAKLSAgICAgKiAgTG9va3MtYWhlYWQgdG8gdGhlIDxjb2RlPms8L2NvZGU+PGk+dGg8L2k+IHRva2VuLgotICAgICAqCi0gICAgICogIEBwYXJhbSBrIE51bWJlciBvZiB0b2tlbiB0byBsb29rIGFoZWFkLgotICAgICAqCi0gICAgICogIEByZXR1cm4gdGhlIDxjb2RlPms8L2NvZGU+PGk+dGg8L2k+IHRva2VuIG9yIG51bGwgaWYgbm8KLSAgICAgKiAgICAgICAgICBtb3JlIHRva2VucyBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiAgQHRocm93cyBSZWFkRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyBhdHRlbXB0aW5nIHRvIGxvb2thaGVhZAotICAgICAqICAgICAgICAgIGEgdG9rZW4uCi0gICAgICovCi0KLSAgICBUb2tlbiBsYShpbnQgaykgdGhyb3dzIFJlYWRFeGNlcHRpb24sIFN5bnRheEV4Y2VwdGlvbjsKLQotCi0gICAgLyoqIAotICAgICAqICBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbi4KLSAgICAgKgotICAgICAqICBAcGFyYW0gdHlwZSBUaGUgdG9rZW4gdHlwZS4KLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBjb25zdW1lZCB0b2tlbiBvciBudWxsIGlmIG5vIG1vcmUgdG9rZW5zCi0gICAgICogICAgICAgICAgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogIEB0aHJvd3MgUmVhZEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgYXR0ZW1wdGluZyB0byBjb25zdW1lCi0gICAgICogICAgICAgICAgYSB0b2tlbi4KLSAgICAgKi8KLQotICAgIFRva2VuIGNvbnN1bWUoaW50IHR5cGUpIHRocm93cyBSZWFkRXhjZXB0aW9uLCBTeW50YXhFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqICBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZSBsb2NhdGlvbiAodHlwaWNhbGx5IGEgZmlsZSBwYXRoKS4KLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrcG9pbnRzIGEgcG9pbnQgaW4gdGhlIHN0cmVhbSB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvCi0gICAgICovCi0KLSAgICB2b2lkIGNoZWNrcG9pbnQoKTsKLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgdG8gdGhlIHByZXZpb3VzIGNoZWNrcG9pbnQKLSAgICAgKi8KLQotICAgIHZvaWQgcmVzdG9yZSgpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBvdXQgb2YgdG9rZW5zLCBwb3NzaWJseQotICAgICAqIGlnbm9yaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gICAgICovCi0KLSAgICBib29sZWFuIGF0RW5kKCBib29sZWFuIGlnbm9yaW5nV2hpdGVzcGFjZSApOwotCi0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIG91dCBvZiB0b2tlbnMuICAKLSAgICAgKi8KLQotICAgIGJvb2xlYW4gYXRFbmQoICk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL3BhY2thZ2UuaHRtbCBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL2phdmEvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwMTZkNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy9qYXZhL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyLio8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxwPgotICAgICAgVGhlIG1haW4gcGFyc2VyIG9mIEdyb292eSBjb2RlIGludG8gdGhlIEdyb292eSBBU1QgbW9kZWwgKEFic3RyYWN0IFN5bnRheCBUcmVlKQotICAgIDwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9SRUFETUUudHh0IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzY5YTkyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVRFU1QgT1JHQU5JU0FUSU9OCi09PT09PT09PT09PT09PT09PQotCi1XZSdsbCBiZSBtYWluYWluaW5nIENsYXNzaWMgYW5kIE5ldyBHcm9vdnkgZm9yIGEgY291cGxlIG9mIHJlbGVhc2VzIHNvIGlmIHlvdSBhcmUgZ29ubmEgYWRkL21vZGlmeSBhIHRlc3QsIHBsZWFzZQotZm9sbG93IHRoZXNlIGd1aWRlbGluZXMuLi4KLQotZ3Jvb3Z5LWNvcmUvc3JjL3Rlc3Qtb2xkICAgIGlzIGZvciBDbGFzc2ljIEdyb292eSB0ZXN0IGNhc2VzCi1ncm9vdnktY29yZS9zcmMvdGVzdCAgICAgICAgaXMgZm9yIE5ldyBHcm9vdnkgdGVzdCBjYXNlcwotCi0qIGFsbCBuZXcgdGVzdHMgZ28gaW4gdGhlaXIgcmVndWxhciBwbGFjZSBpbiBncm9vdnktY29yZS9zcmMvdGVzdAotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9VYmVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjY2YyZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKgotICogdG8gcHJldmVudCBhIEpWTSBzdGFydHVwLXNodXRkb3duIHRpbWUgcGVyIHRlc3QsIGl0IHNob3VsZCBiZSBtb3JlIGVmZmljaWVudCB0bwotICogY29sbGVjdCB0aGUgdGVzdHMgdG9nZXRoZXIgaW50byBhIHN1aXRlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLXB1YmxpYyBjbGFzcyBVYmVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBbWJpZ3VvdXNJbnZvY2F0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUF1dG9ib3hpbmdUZXN0LmNsYXNzKTsgICAgICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlQYXJhbU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFzc2VydE51bWJlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXNzZXJ0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBc3NpZ25tZW50SW5zaWRlRXhwcmVzc2lvbkJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBdXRvYm94aW5nT2ZDb21wYXJpc29uc0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCYWRTY3JpcHROYW1lQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJhc2U2NFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmVuY2htYXJrQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpZ0RlY2ltYWxPcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpbmRpbmdUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJpdHdpc2VPcGVyYXRpb25zVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCbG9ja0FzQ2xvc3VyZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCb29sZWFuQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5PcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ5dGVJbmRleEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCeXRlY29kZTJCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnl0ZWNvZGUzQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ5dGVjb2RlNEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCeXRlY29kZTVCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnl0ZWNvZGU2QnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ5dGVjb2RlN0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCeXRlY29kZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDYWxsSW5uZXJDbGFzc0N0b3JUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENhbGxpbmdDbG9zdXJlc1dpdGhDbG9zdXJlc0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDYXN0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDYXN0V2hlblVzaW5nQ2xvc3VyZXNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2F0ZWdvcnlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluZWRBc3NpZ25tZW50LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENocmlzdG9mc1Byb3BlcnR5QnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzRXhwcmVzc2lvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NJbk5hbWVkUGFyYW1zQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzTG9hZGVyQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlQXNQYXJhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvc3VyZUNsYXNzTG9hZGVyQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsb3N1cmVDbG9uZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvc3VyZUNvbXBhcmF0b3JUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsb3N1cmVDdXJyeVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvc3VyZUluQ2xvc3VyZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlSW5DbG9zdXJlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlSW5TdGF0aWNNZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsb3N1cmVNZXRob2RDYWxsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlUGFyYW1ldGVyUGFzc2luZ0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlUmV0dXJuVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlUmV0dXJuV2l0aG91dFJldHVyblN0YXRlbWVudFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvc3VyZVN1Z2FyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlVHlwZWRWYXJpYWJsZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlVXNpbmdPdXRlclZhcmlhYmxlc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvc3VyZVZhcmlhYmxlQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsb3N1cmVXaXRoRGVmYXVsdFBhcmFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb21wYXJlVG9UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBpbGVyRXJyb3JUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENvbnN0cnVjdG9yQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERhdGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERlZlZhcmlhYmxlQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRQYXJhbUNsb3N1cmVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRQYXJhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRG9sbGFyRXNjYXBpbmdUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERvdWJsZU9wZXJhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXNjYXBlZE1ldGFDaGFyYWN0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVzY2FwZWRVbmljb2RlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFeGNlcHRpb25JbkNsb3N1cmVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEV4cGFuZG9Qcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyTGluZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRm9yQW5kU3FsQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZvckxvb3BCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRm9yTG9vcFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRm9yTG9vcFdpdGhMb2NhbFZhcmlhYmxlc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRnVsbHlRdWFsaWZpZWRDbGFzc0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHUGF0aFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR1N0cmluZ1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhdG9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHZXR0ZXJCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR2xvYmFsUHJpbnRsblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR3Jvb3Z5MjM5X0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHcm9vdnkyNDlfQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eTI1Ml9CdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR3Jvb3Z5Mzg5X0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHcm9vdnk1MTNfQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eU1ldGhvZHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEd1aWxsYXVtZXNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR3VpbGxhdW1lc01hcEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIZXJlZG9jc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSG9tZXBhZ2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElmRWxzZUNvbXBhY3RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElmRWxzZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSWZQcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSWZUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKElmV2l0aE1ldGhvZENhbGxUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEltbXV0YWJsZU1vZGlmaWNhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW1wb3J0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbmNvbnNpc3RlbnRTdGFja0hlaWdodEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnN0YW5jZW9mVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnZva2VOb3JtYWxNZXRob2RGcm9tQnVpbGRlcl9CdWc2NTcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW52b2tlTm9ybWFsTWV0aG9kc0ZpcnN0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnRlZ2VyT3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJdGVyYXRlT3ZlckN1c3RvbVR5cGVCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdEl0ZXJhdGluZ1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGl0ZXJhbFR5cGVzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMaXR0bGVDbG9zdXJlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhbEZpZWxkVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhbFZhcmlhYmxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2dUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2ljVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb29wQnJlYWtUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1hcENvbnN0cnVjdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwUHJvcGVydHlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1hcFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFya3VwQW5kTWV0aG9kQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZENhbGxUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZENhbGxXaXRob3V0UGFyZW5zSW5TdGF0aWNNZXRob2RCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnRoZXNpc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kRGlzcGF0Y2hCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kUGFyYW1ldGVyQWNjZXNzV2l0aGluQ2xvc3VyZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWluTWF4VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNaW51c0VxdWFsc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTW9kdWxvVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb3JnYW5zQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE11bHRpbGluZVN0cmluZ1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTXVsdGlwbHlEaXZpZGVFcXVhbHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkUGFyYW1ldGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOYXZpZ2F0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOZWdhdGVMaXN0c1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTmVnYXRpb25UZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOZXN0ZWRDbG9zdXJlMkJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOZXN0ZWRDbG9zdXJlQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5lc3RlZENsb3N1cmVCdWdUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5ld0V4cHJlc3Npb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5vUGFja2FnZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTm9kZUdQYXRoVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsQ29tcGFyZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsUHJvcGVydHlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE51bWJlck1hdGhUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE51bWJlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT3B0aW9uYWxSZXR1cm5UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE9yZGVyQnlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE92ZXJsb2FkSW52b2tlTWV0aG9kQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE92ZXJsb2FkSW52b2tlTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPdmVycmlkZVByb3BlcnR5R2V0dGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQbHVzRXF1YWxzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQb3N0Zml4VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQb3dlck9wZXJhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZml4VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcmltaXRpdmVBcnJheXNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1pdGl2ZVR5cGVGaWVsZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbWl0aXZlVHlwZXNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFByaW50VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcmludGxuV2l0aE5ld0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcml2YXRlVmFyaWFibGVBY2Nlc3NGcm9tQW5vdGhlckluc3RhbmNlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcm9jZXNzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlUZXN0Mi5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eVdpdGhvdXREb3RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJhbmdlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkTGluZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUmVndWxhckV4cHJlc3Npb25zVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSZXR1cm5UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJvZHNCb29sZWFuQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJvZHNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2FmZU5hdmlnYXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlcmlhbGl6ZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2hlbGxUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNtYWxsVHJlZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU29ja2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljTWFya3VwQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY1ByaW50bG5UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY1RoaXNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ09wZXJhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdWJzY3JpcHRBbmRFeHByZXNzaW9uQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN1YnNjcmlwdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3VwZXJNZXRob2QyQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN1cGVyTWV0aG9kQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN3aXRjaFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3dpdGNoV2l0aERpZmZlcmVudFR5cGVzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZWRzQ2xvc3VyZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXJuYXJ5T3BlcmF0b3JUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRleHRQcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVGhyb3dUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRvQXJyYXlCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVG9TdHJpbmdCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJpcGxlUXVvdGVkU3RyaW5nVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUcnlDYXRjaDJCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJ5Q2F0Y2hCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJ5Q2F0Y2hUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFR5cGVzYWZlTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVbmFyeU1pbnVzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVbmtub3duVmFyaWFibGVCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVW5zYWZlTmF2aWdhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVXNlQ2xvc3VyZUluQ2xvc3VyZUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVc2VTdGF0aWNJbkNsb3N1cmVCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVmFyaWFibGVTY29waW5nQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZhcmlibGVQcmVjZWRlbmNlLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZlcmJhdGltR1N0cmluZ1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVmVyYm9zZVRyZWVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFdoaWxlTG9vcFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWm9oYXJzQnVnLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotLy8gIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcHBlYXIgaW4gdGFyZ2V0L3Rlc3QtY2xhc3NlcyBidXQgZG8gbm90IGV4dGVuZCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKLS8vCi0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFub3RoZXJNb2NrSW5wdXRTdHJlYW0uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCZWFuLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQmVhbjI0OS5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5CZWFuLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FsbEFub3RoZXJTY3JpcHQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc1dpdGhTY3JpcHQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb21wYXJhYmxlRm9vLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ3JlYXRlRGF0YS5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEVudHJ5LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRXZhbEluU2NyaXB0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRmVlZC5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZvby5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEhlbGxvV29ybGQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIZWxsb1dvcmxkMi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEh0bWwyV2lraS5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEludGVnZXJDYXRlZ29yeS5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKExvb3AuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb29wMi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1hcEZyb21MaXN0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWFya3VwVGVzdFNjcmlwdC5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFRlc3RTY3JpcHQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrSW5wdXRTdHJlYW0uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrUHJvY2Vzcy5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1vY2tTb2NrZXQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPdmVybG9hZEEuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPdmVybG9hZEIuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOYXZUb1dpa2kuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzb24uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTYW1wbGVNYWluLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2NyaXB0V2l0aEZ1bmN0aW9ucy5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNob3dBcmdzLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nQ2F0ZWdvcnkuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdXBlckJhc2UuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdXBlckRlcml2ZWQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0QmFzZS5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RDYXNlQnVnLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVGVzdERlcml2ZWQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUaW55QWdlbnQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVbml0VGVzdEFzU2NyaXB0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVXNlQ2xvc3VyZUluU2NyaXB0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWC5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGNyZWF0ZUxvb3AuY2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9VYmVyVGVzdENhc2UyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExNzg1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioKLSAqIHRvIHByZXZlbnQgYSBKVk0gc3RhcnR1cC1zaHV0ZG93biB0aW1lIHBlciB0ZXN0LCBpdCBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8KLSAqIGNvbGxlY3QgdGhlIHRlc3RzIHRvZ2V0aGVyIGludG8gYSBzdWl0ZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1wdWJsaWMgY2xhc3MgVWJlclRlc3RDYXNlMiBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5idWdzLkFycmF5TWV0aG9kQ2FsbEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5DbGFzc0dlbmVyYXRvckZpeGVzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5DbGFzc0luU2NyaXB0QnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5idWdzLkNsb3N1cmVzSW5TY3JpcHRCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuQ2xvc3VyZVdpdGhTdGF0aWNWYXJpYWJsZXNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuQ29uc3RydWN0b3JQYXJhbWV0ZXJCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuRG91YmxlU2l6ZVBhcmFtZXRlcnNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5Mjc4X0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5Hcm9vdnkzMDNfQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5idWdzLkdyb292eTMwOF9CdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NTU4XzYxNl9CdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NTkzX0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5Hcm9vdnk2NjZfQnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5idWdzLkdyb292eTY3NV9CdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NzcwX0J1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5JYW5NYWNleXNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuSW50ZXJmYWNlSW1wbEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5NYXJrdXBJblNjcmlwdEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5QcmltaXRpdmVQcm9wZXJ0eUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5TY3JpcHRCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuU2VhbnNCdWcuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuU3RhdGljTWV0aG9kQ2FsbEJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5TdWJzY3JpcHRPblByaW1pdGl2ZVR5cGVBcnJheUJ1Zy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5TdWJzY3JpcHRPblN0cmluZ0FycmF5QnVnLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5sYW5nLkdyb292eVNoZWxsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkubGFuZy5HU3RyaW5nVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkubGFuZy5JbnRSYW5nZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkubGFuZy5SYW5nZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmxhbmcuU2NyaXB0SW50ZWdlckRpdmlkZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmxhbmcuU2NyaXB0UHJpbnRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5sYW5nLlNjcmlwdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmxhbmcuU2VxdWVuY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5sYW5nLlR1cGxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkubW9jay5leGFtcGxlLlNhbmR3aWNoTWFrZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5tb2NrLk1vY2tUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5tb2RlbC5UYWJsZU1vZGVsVGVzdC5jbGFzcyk7Ci0vL3RvZG8gLSBlcnJvciBpbiBzb21lIHRlc3QgZW52aXJvbm1lbnRzICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNlY3VyaXR5LlJ1bkFsbEdyb292eVNjcmlwdHNTdWl0ZS5jbGFzcyk7Ci0vL3RvZG8gLSBlcnJvciBpbiBzb21lIHRlc3QgZW52aXJvbm1lbnRzICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNlY3VyaXR5LlJ1bk9uZUdyb292eVNjcmlwdC5jbGFzcyk7Ci0vL3RvZG8gLSBlcnJvciBpbiBzb21lIHRlc3QgZW52aXJvbm1lbnRzICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNlY3VyaXR5LlNlY3VyaXR5VGVzdC5jbGFzcyk7Ci0vL3RvZG8gLSBlcnJvciBpbiBzb21lIHRlc3QgZW52aXJvbm1lbnRzICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNlY3VyaXR5LlNlY3VyaXR5VGVzdFN1cHBvcnQuY2xhc3MpOwotLy90b2RvIC0gZXJyb3IgaW4gc29tZSB0ZXN0IGVudmlyb25tZW50cyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zZWN1cml0eS5TaWduZWRKYXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zcWwuUGVyc29uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlNxbENvbXBsZXRlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlNxbENvbXBsZXRlV2l0aG91dERhdGFTb3VyY2VUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zcWwuU3FsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlNxbFdpdGhCdWlsZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlNxbFdpdGhUeXBlZFJlc3VsdHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zcWwuU3FsUm93c1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnRleHQuVGVtcGxhdGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS50cmVlLk5vZGVQcmludGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkudHhuLlRyYW5zYWN0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkudXRpbC5FbXB0eVNjcmlwdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuTUJlYW5UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS51dGlsLk5vZGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS51dGlsLlhtbFBhcnNlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS54bWwuZG9tLkRPTVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnhtbC5ET01UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS54bWwuTWFya3VwVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkueG1sLk1hcmt1cFdpdGhXcml0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS54bWwuTmFtZXNwYWNlRE9NVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkueG1sLlNBWFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnhtbC5TbWFsbE5hbWVzcGFjZURPTVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnhtbC5WZXJib3NlRE9NVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkueG1sLlhtbFRlc3QuY2xhc3MpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLS8vIG5vIHRlc3RzIGluc2lkZSAoc2hvdWxkIHdlIGhhdmUgYW4gQWJzdHJhY3RHcm9vdnlUZXN0Q2FzZT8/PykKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuVGVzdFN1cHBvcnQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlRlc3RIZWxwZXIuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3dpbmcuRGVtby5jbGFzcyk7Ci0KLS8vICBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXBwZWFyIGluIHRhcmdldC90ZXN0LWNsYXNzZXMgYnV0IGRvIG5vdCBleHRlbmQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlCi0vLwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShjaGVlc2UuQ2hlZGRhci5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGNoZWVzZS5Qcm92b2xvbmUuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5DaGVlc2UuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuYnVncy5NeVJhbmdlLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmJ1Z3MuU2Nob2xhc3RpYy5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5idWdzLlNpbXBsZU1vZGVsLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LkR1bW15SW50ZXJmYWNlLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LkR1bW15TWV0aG9kcy5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5ncmF2eS5CdWlsZC5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5qMmVlLkoyZWVDb25zb2xlLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LmxhbmcuRGVyaXZlZFNjcmlwdC5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5sYW5nLkR1bW15R1N0cmluZy5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5sYW5nLk1vY2tXcml0ZXIuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkubW9jay5leGFtcGxlLkNoZWVzZVNsaWNlci5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5tb2NrLmV4YW1wbGUuU2FuZHdpY2hNYWtlci5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5tb2RlbC5NdmNEZW1vLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5Lk91dGVyVXNlci5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zY3JpcHQuQXRvbVRlc3RTY3JpcHQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc2NyaXB0LkVudHJ5LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNjcmlwdC5GZWVkLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNjcmlwdC5QYWNrYWdlU2NyaXB0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnNjcmlwdC5QZXJzb24uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3FsLlBlcnNvbi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zd2luZy5NeVRhYmxlTW9kZWwuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkuc3dpbmcuU3dpbmdEZW1vLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnN3aW5nLlRhYmxlRGVtby5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS5zd2luZy5UYWJsZUxheW91dERlbW8uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkudHhuLlRyYW5zYWN0aW9uQmVhbi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGdyb292eS50eG4uVHJhbnNhY3Rpb25CdWlsZGVyLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuRHVtbXkuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShncm9vdnkudXRpbC5EdW1teU1CZWFuLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuU3Bvb2ZUYXNrLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuU3Bvb2ZUYXNrQ29udGFpbmVyLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnhtbC5UZXN0WG1sU3VwcG9ydC5jbGFzcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvVWJlclRlc3RDYXNlMy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9VYmVyVGVzdENhc2UzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODQ4MzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9VYmVyVGVzdENhc2UzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioKLSAqIHRvIHByZXZlbnQgYSBKVk0gc3RhcnR1cC1zaHV0ZG93biB0aW1lIHBlciB0ZXN0LCBpdCBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8KLSAqIGNvbGxlY3QgdGhlIHRlc3RzIHRvZ2V0aGVyIGludG8gYSBzdWl0ZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1wdWJsaWMgY2xhc3MgVWJlclRlc3RDYXNlMyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTW9kdWxlTm9kZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5CeXRlY29kZUhlbHBlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5DYWxsQ2xvc3VyZUZpZWxkQXNNZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uQ2FwaXRhbGl6ZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5Db25zdHJ1Y3Rvcklzc3VlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkNvbnN0cnVjdG9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkZvclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5HZXRQcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5Hcm9vdnlDbGFzc0xvYWRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5HU3RyaW5nVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLklmRWxzZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5NYWluVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLk1ldGFDbGFzc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5NZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uUHJvcGVydHlUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uUnVuR3Jvb3Z5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlR1cGxlTGlzdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5WZXJpZmllckNvZGVWaXNpdG9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VDb25zdHJ1Y3RvclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZUdyb292eU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRob2RGYWlsdXJlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTWV0aG9kS2V5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTmV3U3RhdGljTWV0YU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlR1cGxlTGlzdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuWG1sU2x1cnBlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguQWJzdHJhY3RUb2tlblN0cmVhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuQWJzdHJhY3RDaGFyU3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlci5MZXhlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuTGV4ZXJUb2tlblN0cmVhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuU3RyaW5nQ2hhclN0cmVhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyLkFic3RyYWN0TWV0aG9kQ2hlY2tUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5DU1ROb2RlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuUGFyc2VyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuUmV0dXJuVHlwZUVycm9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Db21waWxlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS50b29scy5GaWxlU3lzdGVtQ29tcGlsZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMueG1sLkRvbVRvR3Jvb3Z5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5Lndpa2kuVGVzdENhc2VSZW5kZXJFbmdpbmVUZXN0LmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotLy8gdG9kbyAtIEFyZSB3ZSBzdGlsbCB1c2luZyB3aWtpIHRlc3RzIGFzIG5vbmUgdHVybiB1cCBvbiBteSBidWlsZD8/PwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5Lndpa2kuUnVuV2lraVRlc3QuY2xhc3MpOwotCi0vLyBubyB0ZXN0cyBpbnNpZGUgKHNob3VsZCB3ZSBoYXZlIGFuIEFic3RyYWN0R3Jvb3Z5VGVzdENhc2U/Pz8pCi0vLwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bW15VGVzdERlcml2YXRpb24uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0LmNsYXNzKTsKLQotLy8gIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcHBlYXIgaW4gdGFyZ2V0L3Rlc3QtY2xhc3NlcyBidXQgZG8gbm90IGV4dGVuZCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKLS8vCi0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRGVyaXZlZEJlYW4uY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bW15UmVmbGVjdG9yLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5EdW1wQ2xhc3MuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bXBDbGFzczIuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bXBDbGFzczMuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bXBDbGFzczQuY2xhc3MpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bXBpbmdDbGFzc0xvYWRlci5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uTWFpbi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uTXlCZWFuLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5TaW1wbGVCZWFuLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5kdW1teS5Gb29IYW5kbGVyLmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkR1bW15QmVhbi5jbGFzcyk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5Nb2NrR3Jvb3Z5T2JqZWN0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyLlRlc3RQYXJzZXJTdXBwb3J0LmNsYXNzKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Eb2NHZW5lcmF0b3JNYWluLmNsYXNzKTsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9VYmVyVGVzdENhc2VMb25nUnVubmluZ1Rlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUxvbmdSdW5uaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkZTlhNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUxvbmdSdW5uaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKgotICogVGhlIHRlc3RzIGNvbGxlY3RlZCBoZXJlIGFsbCB0YWtlIGEgJ3NpZ25pZmljYW50JyBsZW5ndGggb2YgdGltZSB0byBleGVjdXRlLAotICogaS5lLiBncmVhdGVyIHRoYW4gMiBzZWNvbmRzIGVsYXBzZWQgb24gbXkgbWFjaGluZS4KLSAqCi0gKiB0byBwcmV2ZW50IGEgSlZNIHN0YXJ0dXAtc2h1dGRvd24gdGltZSBwZXIgdGVzdCwgaXQgc2hvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvCi0gKiBjb2xsZWN0IHRoZSB0ZXN0cyB0b2dldGhlciBpbnRvIGEgc3VpdGUuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotcHVibGljIGNsYXNzIFViZXJUZXN0Q2FzZUxvbmdSdW5uaW5nVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbG9zdXJlTGlzdGVuZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNjcmlwdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoZ3Jvb3Z5LnV0aWwuQW50VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJzZi5CU0ZUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuYnNmLkNhY2hlQlNGVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlJlZmxlY3RvckdlbmVyYXRvclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5SdW5CdWdzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlJ1bkNsb3N1cmVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5Qcm9wZXJ0eVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94Lm1hcmt1cC5TdHJlYW1pbmdNYXJrdXBUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5BU1RCdWlsZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuQ29tcGlsZXJFcnJvclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS53aWtpLlJ1bkh0bWwyV2lraVRlc3QuY2xhc3MpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS8uY3ZzaWdub3JlIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzYjBmOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLkRTX1N0b3JlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9BbWJpZ3VvdXNJbnZvY2F0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9BbWJpZ3VvdXNJbnZvY2F0aW9uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDljZDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQW1iaWd1b3VzSW52b2NhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqCi0gKiB0byBwcm92ZSBHUk9PVlktNDY3IGlzIG5vIGxvbmdlciBhbiBpc3N1ZSAgICAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1pbXBvcnQgZ3Jvb3Z5LkR1bW15TWV0aG9kcwotCi1jbGFzcyBBbWJpZ3VvdXNJbnZvY2F0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsgCi0gICAgcHJvcGVydHkgZHVtbXkKLSAgICAKLSAgICB2b2lkIHNldFVwKCkgewotICAgIAlkdW1teSA9IG5ldyBEdW1teU1ldGhvZHMoKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RBbWJpZ3VvdXNJbnZvY2F0aW9uV2l0aEZsb2F0cygpIHsKLSAgIAlhc3NlcnQgImZsb2F0IGFyZ3MiID09IGR1bW15LmZvbygiYmFyIiwxLjBmLDIuMGYpCi0gICAJYXNzZXJ0ICJmbG9hdCBhcmdzIiA9PSBkdW1teS5mb28oImJhciIsKGZsb2F0KTEsKGZsb2F0KTIpCi0gICAJYXNzZXJ0ICJmbG9hdCBhcmdzIiA9PSBkdW1teS5mb28oImJhciIsKEZsb2F0KTEsKEZsb2F0KTIpCi0gICAgfQotICAgIHZvaWQgdGVzdEFtYmlndW91c0ludm9jYXRpb25XaXRoSW50cygpIHsKLSAgIAlhc3NlcnQgImludCBhcmdzIiA9PSBkdW1teS5mb28oImJhciIsMSwyKQotICAgCWFzc2VydCAiaW50IGFyZ3MiID09IGR1bW15LmZvbygiYmFyIiwoaW50KTEsKGludCkyKQotICAgCWFzc2VydCAiaW50IGFyZ3MiID09IGR1bW15LmZvbygiYmFyIiwoSW50ZWdlcikxLChJbnRlZ2VyKTIpCi0gICAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9BcnJheUF1dG9ib3hpbmdUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5QXV0b2JveGluZ1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTM0YmM4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5QXV0b2JveGluZ1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotY2xhc3MgQXJyYXlBdXRvYm94aW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RVbndhbnRlZEF1dG9ib3hpbmdXaGVuSW52b2tpbmdNZXRob2RzKCkgewotICAgICAgY2wgPSBibGFoMihuZXcgaW50WzIqMl0pCi0gICAgICBhc3NlcnQgY2wgPT0gIltJIgotICAgICAgY2wgPSBibGFoMihuZXcgbG9uZ1syKjJdKQotICAgICAgYXNzZXJ0IGNsID09ICJbSiIKLSAgICAgIGNsID0gYmxhaDIobmV3IHNob3J0WzIqMl0pCi0gICAgICBhc3NlcnQgY2wgPT0gIltTIgotICAgICAgY2wgPSBibGFoMihuZXcgYm9vbGVhblsyKjJdKQotICAgICAgYXNzZXJ0IGNsID09ICJbWiIKLSAgICAgIGNsID0gYmxhaDIobmV3IGNoYXJbMioyXSkKLSAgICAgIGFzc2VydCBjbCA9PSAiW0MiCi0gICAgICBjbCA9IGJsYWgyKG5ldyBkb3VibGVbMioyXSkKLSAgICAgIGFzc2VydCBjbCA9PSAiW0QiCi0gICAgICBjbCA9IGJsYWgyKG5ldyBmbG9hdFsyKjJdKQotICAgICAgYXNzZXJ0IGNsID09ICJbRiIKLSAgICB9Ci0gICAgCi0gICAgYmxhaDIoT2JqZWN0IG8pIHsKLSAgICAgICByZXR1cm4gby5jbGFzcy5uYW1lCi0gICAgfQotICAgICAgICAKLX0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXJyYXlQYXJhbU1ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXJyYXlQYXJhbU1ldGhvZFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDIyMGVhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5UGFyYW1NZXRob2RUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLWltcG9ydCBncm9vdnkuRHVtbXlJbnRlcmZhY2UKLQotY2xhc3MgQXJyYXlQYXJhbU1ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSBpbXBsZW1lbnRzIER1bW15SW50ZXJmYWNlIHsKLQotICAgIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB7Ci0gICAgICAgIGFycmF5ID0gImEgYiBjIi5zcGxpdCgnICcpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKLSAgICAgICAgCi0gICAgICAgIG1ldGhvZFdpdGhBcnJheVBhcmFtKGFycmF5KQotCX0KLSAgICAKLSAgICB2b2lkIG1ldGhvZFdpdGhBcnJheVBhcmFtKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgcHJpbnRsbigiZmlyc3QgaXRlbTogJHthcmdzWzBdfSIpCi0gICAgICAgIAotICAgICAgICAvLyBsZXRzIHR1cm4gaXQgaW50byBhIGxpc3QKLSAgICAgICAgbGlzdCA9IGFyZ3MudG9MaXN0KCkKLSAgICAgICAgYXNzZXJ0IGxpc3QgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdAotICAgICAgICBsaXN0WzRdID0gImUiCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbGlzdCA9PSBbImEiLCAiYiIsICJjIiwgbnVsbCwgImUiXQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQ3JlYXRlZCBsaXN0ICR7bGlzdH0iKQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9BcnJheVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXJyYXlUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyZDlkNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9BcnJheVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLWNsYXNzIEFycmF5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEZpeGVkU2l6ZSgpIHsKLSAgICAgICAgYXJyYXkgPSBuZXcgU3RyaW5nWzEwXQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAxMAotICAgICAgICAKLSAgICAgICAgYXJyYXlbMF0gPSAiSGVsbG8iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gIkhlbGxvIgotICAgICAgICAKLSAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCBhcnJheSAke2FycmF5Lmluc3BlY3QoKX0gd2l0aCB0eXBlICR7YXJyYXkuY2xhc3N9IgotCX0KLSAgICAKLSAgICB2b2lkIHRlc3RBcnJheVdpdGhJbml0aWFsaXplcigpIHsKLSAgICAgICAgYXJyYXkgPSBuZXcgU3RyaW5nW10geyAibmljZSIsICJjaGVlc2UiLCAiZ3JvbWl0IiB9Ci0gICAgICAgIAotICAgICAgICBwcmludGxuICJDcmVhdGVkIGFycmF5ICR7YXJyYXkuaW5zcGVjdCgpfSB3aXRoIHR5cGUgJHthcnJheS5jbGFzc30iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKLSAgICAgICAgYXNzZXJ0IGFycmF5WzBdID09ICJuaWNlIiA6IGFycmF5Lmluc3BlY3QoKQotICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gImNoZWVzZSIKLSAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09ICJncm9taXQiCi0gICAgfQotCi0Jdm9pZCB0ZXN0Q2hhckFycmF5Q3JlYXRlKCkgewotICAgCQlhcnJheSAgPSBuZXcgY2hhclszXQotICAgCQlhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKLQl9Ci0JCi0gICAgdm9pZCB0ZXN0Q2hhckFycmF5V2l0aEluaXRpYWxpemVyKCkgewotICAgICAgICBhcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH0KLSAgICAgICAgCi0gICAgICAgIHByaW50bG4gIkNyZWF0ZWQgYXJyYXkgJHthcnJheS5pbnNwZWN0KCl9IHdpdGggdHlwZSAke2FycmF5LmNsYXNzfSIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gMwotICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gJ2EnIDogYXJyYXkuaW5zcGVjdCgpCi0gICAgICAgIGFzc2VydCBhcnJheVsxXSA9PSAnYicKLSAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09ICdjJwotICAgIH0KLSAgICAKLQl2b2lkIHRlc3RCeXRlQXJyYXlDcmVhdGUoKSB7Ci0JCWFycmF5ID0gbmV3IGJ5dGVbMTAwXQotCQlhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDEwMDsKLQl9Ci0JCi0gICAgdm9pZCB0ZXN0Qnl0ZUFycmF5V2l0aEluaXRpYWxpemVyKCkgewotICAgICAgICBhcnJheSA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzIH0KLSAgICAgICAgCi0gICAgICAgIHByaW50bG4gIkNyZWF0ZWQgYXJyYXkgJHthcnJheS5pbnNwZWN0KCl9IHdpdGggdHlwZSAke2FycmF5LmNsYXNzfSIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gNAotICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gMCA6IGFycmF5Lmluc3BlY3QoKQotICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gMQotICAgICAgICBhc3NlcnQgYXJyYXlbMl0gPT0gMgotICAgICAgICBhc3NlcnQgYXJyYXlbM10gPT0gMwotICAgIH0KLQotICAgIHZvaWQgdGVzdEJ5dGVBcnJheVdpdGhJbml0aWFsaXplckFuZEFzc2lnbm1lbnRPZk51bWJlcigpIHsKLQkJYXJyYXkgPSBuZXcgYnl0ZVtdIHsgMiwgNH0KLSAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCBhcnJheSAke2FycmF5Lmluc3BlY3QoKX0gd2l0aCB0eXBlICR7YXJyYXkuY2xhc3N9IgotCQlhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDIKLQkJYXNzZXJ0IGFycmF5WzBdID09IDIKLQkJYXNzZXJ0IGFycmF5WzFdID09IDQKLQkJCi0JCWFycmF5WzBdID0gNzYKLQkJYXJyYXlbMV0gPSAzMgotCQlhc3NlcnQgYXJyYXlbMF0gPT0gNzYKLQkJYXNzZXJ0IGFycmF5WzFdID09IDMyCi0JCQotCQlhcnJheS5wdXRBdCgwLCA0NSkKLQkJYXJyYXkucHV0QXQoMSwgNjcpCi0JCWFzc2VydCBhcnJheVswXSA9PSA0NQotCQlhc3NlcnQgYXJyYXlbMV0gPT0gNjcKLQl9Ci0JCQotCXZvaWQgdGVzdERvdWJsZUFycmF5Q3JlYXRlKCkgewotICAgCQlhcnJheSAgPSBuZXcgZG91YmxlWzNdCi0gICAJCWFzc2VydCBhcnJheS5zaXplKCkgPT0gMwotCX0KLQkKLSAgICB2b2lkIHRlc3REb3VibGVBcnJheVdpdGhJbml0aWFsaXplcigpIHsKLSAgICAgICAgYXJyYXkgPSBuZXcgZG91YmxlW10geyAxLjMsIDMuMTQsIDIuNyB9Ci0gICAgICAgIAotICAgICAgICBwcmludGxuICJDcmVhdGVkIGFycmF5ICR7YXJyYXkuaW5zcGVjdCgpfSB3aXRoIHR5cGUgJHthcnJheS5jbGFzc30iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKLSAgICAgICAgYXNzZXJ0IGFycmF5WzBdID09IDEuMyA6IGFycmF5Lmluc3BlY3QoKQotICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gMy4xNAotICAgICAgICBhc3NlcnQgYXJyYXlbMl0gPT0gMi43Ci0gICAgfQkJCi0KLSAgICAJCi0gICAgdm9pZCB0ZXN0SW50QXJyYXlDcmVhdGUoKSB7Ci0gICAgICAgIGFycmF5ID0gbmV3IGludFs1XQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSA1Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0SW50QXJyYXlXaXRoSW5pdGlhbGl6ZXIoKSB7Ci0JCWFycmF5ID0gbmV3IGludFtdIHsgNDIsIC01LCAzNjAgfQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCBhcnJheSAke2FycmF5Lmluc3BlY3QoKX0gd2l0aCB0eXBlICR7YXJyYXkuY2xhc3N9IgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCi0gICAgICAgIGFzc2VydCBhcnJheVswXSA9PSA0MiA6IGFycmF5Lmluc3BlY3QoKQotICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gLTUKLSAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09IDM2MAotICAgIH0KLQkKLQkKLQkKLS8qCi0gICAgdm9pZCB0ZXN0QXJyYXlEZWNsYXJhdGlvbigpIHsKLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5ne30geyAiYSIsICJiIiwgImMiIH0KLQotICAgICAgICBhcnJheS5lYWNoIHsgfGVsZW1lbnR8IHByaW50bG4oIGVsZW1lbnQgKSB9Ci0KLSAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCi0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgewotICAgICAgICBvID0gbmV3IEFycmF5VGVzdCgpOwotCi0gICAgICAgIG8udGVzdEFycmF5RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0TnVtYmVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Bc3NlcnROdW1iZXJUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYmM4Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Bc3NlcnROdW1iZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLWNsYXNzIEFzc2VydE51bWJlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcm9wZXJ0eSB4Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q29tcGFyZSgpIHsKLSAgICAgICAgYXNzZXJ0IHggPT0gbnVsbAotICAgCQlhc3NlcnQgeCAhPSA0MzIKLSAgIAkJYXNzZXJ0IHggIT0gNDIzLjIzNDIKLSAgIAkJICAgICAKLSAgICAgICAgeCA9IDEyMwotCi0gICAgICAgIGFzc2VydCB4ICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IHggIT0gNDMyCi0gICAgICAgIGFzc2VydCB4ICE9IDQyMy4yMzQyCi0gICAgICAgIGFzc2VydCB4ID09IDEyMwotCQkKLSAgICAgICAgeCA9IDQyLjIzNDIKLQotICAgICAgICBhc3NlcnQgeCAhPSBudWxsCi0gICAJCWFzc2VydCB4ICE9IDQzMgotICAgCQlhc3NlcnQgeCAhPSA0MjMuMjM0MgotCQlhc3NlcnQgeCA9PSA0Mi4yMzQyCi0JfQotCQotCXZvaWQgdGVzdExlc3NUaGFuKCkgewotCSAgICB4ID0gMTIzCi0JICAgIAotICAgICAgICBhc3NlcnQgeCA8IDIwMAotICAgICAgICBhc3NlcnQgeCA8PSAyMDAKLSAgICAgICAgYXNzZXJ0IHggPD0gMTIzCi0JICAgIAotCX0KLQotICAgIHZvaWQgdGVzdEdyZWF0ZXJUaGFuKCkgewotICAgICAgICB4ID0gMTIzCi0JICAgIAotICAgICAgICBhc3NlcnQgeCA+IDEwCi0gICAgICAgIGFzc2VydCB4ID49IDEwCi0gICAgICAgIGFzc2VydCB4ID49IDEyMwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Fzc2VydFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjQ4N2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1jbGFzcyBBc3NlcnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QXNzZXJ0KCkgewotICAgICAgICB4ID0gbnVsbAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gbnVsbAotICAgICAgICBhc3NlcnQgeCAhPSAiYWJjIgotICAgICAgICBhc3NlcnQgeCAhPSAiZm9vIgotCSAgICAKLSAgICAgICAgeCA9ICJhYmMiCi0KLSAgICAgICAgYXNzZXJ0IHggIT0gImZvbyIKLSAgICAgICAgYXNzZXJ0IHggIT0gIG51bGwKLSAgICAgICAgYXNzZXJ0IHggIT0gImRlZiIKLSAgICAgICAgYXNzZXJ0IHggPT0gImFiYyIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4LmVxdWFscygiYWJjIikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCAheC5lcXVhbHMoImRlZiIpCi0gICAgICAgIGFzc2VydCAhZmFsc2UKLSAgICAgICAgYXNzZXJ0ICEoMT09MikKLSAgICAgICAgYXNzZXJ0ICEoMT4zKQotICAgICAgICBhc3NlcnQgISgxIT0xKQotCX0KLQkKLQl2b2lkIHRlc3RBc3NlcnRGYWlsKCkgewotCSAgICB4ID0gMTIzNAotCSAgICAKLQkgICAgcnVuQ29kZSA9IGZhbHNlCi0gICAgICAgIHRyeSB7Ci0JICAgICAgICBydW5Db2RlID0gdHJ1ZQotCSAgICAJYXNzZXJ0IHggPT0gNQotCSAgICAJCi0JICAgIAlmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIikKLQkgICAgfQotCSAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotCSAgICAgICAgLy9tc2cgPSAiRXhwcmVzc2lvbjogKHggPT0gNSkuIFZhbHVlczogeCA9IDEyMzQiCi0JICAgICAgICAvL2Fzc2VydCBlLmdldE1lc3NhZ2UoKSA9PSBtc2cKLQkgICAgICAgIC8vYXNzZXJ0IGUubWVzc2FnZSA9PSBtc2cKLQkgICAgfQotCSAgICBhc3NlcnQgcnVuQ29kZSA6ICJoYXMgbm90IHJhbiB0aGUgdHJ5IC8gY2F0Y2ggYmxvY2sgY29kZSIKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2NTlmMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBjaGVlc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcCBhcyBHb29iZXI7Ci0KLWNsYXNzIENoZWRkYXIgZXh0ZW5kcyBHb29iZXIgaW1wbGVtZW50cyBSdW5uYWJsZQotewotICAgIHByb3BlcnR5IEdvb2JlciB0aGVNYXA7Ci0gICAgcHJvdGVjdGVkIHByb3BlcnR5IGNoZWVzaWVyOwotICAgIHB1YmxpYyBzdGF0aWMgcHJvcGVydHkgY2hlZXNpZXN0OwotCi0gICAgY2hlZXNlSXQoKSB7ICB9Ci0KLSAgICBTdHJpbmcgZ2V0U3RyaW5nQ2hlZXNlKCkgeyB9Ci0gICAgU3RyaW5nIGdldE90aGVyQ2hlZXNlKGZvbyxiYXIpIHsgfQotCi0gICAgdm9pZCBydW4oKSB7IGNoZWVzZUl0KCkgfQotCi0gICAgc3RhdGljIEdvb2JlciBtdXRhdGVHb29iZXIoR29vYmVyIHRoZUdvb2JlcikgeyB9Ci0gICAKLX0KLQotY2xhc3MgUHJvdm9sb25lCi17Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Jhc2U2NFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmFzZTY0VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMWIzMmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmFzZTY0VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1jbGFzcyBCYXNlNjRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0Q29kZWMoKSB7Ci0gICAJCXRlc3RTdHJpbmcgPSKnMTIzNDU2Nzg5MC09sSFAoyQlXiYqKClfK3F3ZXJ0eXVpb3BbXVFXRVJUWVVJT1B7fWFzZGZnaGprbDsnXFxBU0RGR0hKS0w6XCJ8YHp4Y3Zibm0sLi9+WlhDVkJOTTw+P1x1MDAwMFx1MDBmZlx1MDBmMFx1MDAwZiIKLQotCQkvLyBnZXQgYSBieXRlIGFycmF5IHVzaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBlaWd0aCBiaXRzIG9mIGVhY2ggY2FoYXJhY3RlcgotICAgCQl0ZXN0Qnl0ZXMgPSB0ZXN0U3RyaW5nLmdldEJ5dGVzKCJJU08tODg1OS0xIikKLSAgIAkJCi0gICAJCS8vIHR1cm4gdGhlIGJ5dGVzIGJhY2sgaW50byBhIHN0cmluZyBmb3IgbGF0ZXIgY29tcGFyaXNvbgotICAgIAkJdGVzdFN0cmluZyA9IG5ldyBTdHJpbmcodGVzdEJ5dGVzLCAiSVNPLTg4NTktMSIpCi0gICAgCQkKLSAgICAJCS8vIGVuY29kZSB0aGUgYnl0ZXMgYXMgYmFzZTY0LiBUaGlzIHByb2R1Y2VzIGEgV3JpdGFibGUgb2JqZWN0IGNvbnZlcnQgaXQgdG8gYSBTdHJpbmcKLSAgICAJCWVuY29kZWRCeXRlcyA9IHRlc3RCeXRlcy5lbmNvZGVCYXNlNjQoKS50b1N0cmluZygpCi0gICAgCQkKLSAgICAJCS8vIGRlY29kZSB0aGUgYmFzZTY0IGJhY2sgdG8gYSBieXRlIGFycmF5Ci0gICAgCQlkZWNvZGVkQnl0ZXMgPSBlbmNvZGVkQnl0ZXMuZGVjb2RlQmFzZTY0KCkKLSAgICAJCQotICAgIAkJLy8gdHVybiB0aGUgYnl0ZSBhcnJheSBiYWNrIHRvIGEgU3RyaW5nIGZvciBjYW9tcGFyaXNvbgotICAgIAkJZGVjb2RlZFN0cmluZyA9IG5ldyBTdHJpbmcoZGVjb2RlZEJ5dGVzLCAiSVNPLTg4NTktMSIpCi0gICAgCQkKLSAgICAJCWFzc2VydCBkZWNvZGVkU3RyaW5nLmVxdWFscyh0ZXN0U3RyaW5nKQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmlnRGVjaW1hbE9wZXJhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmlnRGVjaW1hbE9wZXJhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJhNjVlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0JpZ0RlY2ltYWxPcGVyYXRpb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotY2xhc3MgQmlnRGVjaW1hbE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcm9wZXJ0eSB4Ci0gICAgcHJvcGVydHkgeQotCi0gICAgdm9pZCB0ZXN0UGx1cygpIHsKLSAgICAgICAgeCA9IC4xICsgMS4xCi0gICAgICAgIGFzc2VydCB4ID09IDEuMgotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0KLSAgICAgICAgeCA9IDMgKyAyLjIKLSAgICAgICAgYXNzZXJ0IHggPT0gNS4yCi0KLSAgICAgICAgeCA9IDIuMiArIDQKLSAgICAgICAgYXNzZXJ0IHggPT0gNi4yCi0KLSAgICAgICAgeSA9IHggKyAxCi0gICAgICAgIGFzc2VydCB5ID09IDcuMgotCi0gICAgICAgIHogPSB5ICsgeCArIDEgKyAyCi0gICAgICAgIGFzc2VydCB6ID09IDE2LjQKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNaW51cygpIHsKLSAgICAgICAgeCA9IDEuMS0wLjAxCi0gICAgICAgIGFzc2VydCB4ID09IDEuMDkKLQotICAgICAgICB4ID0gNiAtIDIuMgotICAgICAgICBhc3NlcnQgeCA9PSAzLjgKLQotICAgICAgICB4ID0gNS44IC0gMgotICAgICAgICBhc3NlcnQgeCA9PSAzLjgKLQotICAgICAgICB5ID0geCAtIDEKLSAgICAgICAgYXNzZXJ0IHkgPT0gMi44Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0TXVsdGlwbHkoKSB7Ci0gICAgICAgIHggPSAzICogMi4wCi0gICAgICAgIGFzc2VydCB4ID09IDYuMAotCi0gICAgICAgIHggPSAzLjAgKiAyCi0gICAgICAgIGFzc2VydCB4ID09IDYuMAotCi0gICAgICAgIHggPSAzLjAgKiAyLjAKLSAgICAgICAgYXNzZXJ0IHggPT0gNi4wCi0KLSAgICAgICAgeSA9IHggKiAyCi0gICAgICAgIGFzc2VydCB5ID09IDEyLjAKLQotICAgICAgICB5ID0gMTEgKiAzLjMzMwotICAgICAgICBhc3NlcnQgeSA9PSAzNi42NjMgOiAieSA9ICIgKyB5Ci0KLSAgICAgICAgeSA9IDMuMzMzICogMTEKLSAgICAgICAgYXNzZXJ0IHkgPT0gMzYuNjYzIDogInkgPSAiICsgeQotICAgIH0KLQotICAgIHZvaWQgdGVzdERpdmlkZSgpIHsKLSAgICAgICAgeCA9IDgwLjAgLyA0Ci0gICAgICAgIGFzc2VydCB4ID09IDIwLjAgOiAieCA9ICIgKyB4Ci0KLSAgICAgICAgeCA9IDgwIC8gNC4wCi0gICAgICAgIGFzc2VydCB4ID09IDIwLjAgOiAieCA9ICIgKyB4Ci0KLSAgICAgICAgeSA9IHggLyAyCi0gICAgICAgIGFzc2VydCB5ID09IDEwLjAgOiAieSA9ICIgKyB5Ci0gICAgICAgIGFzc2VydCB5ID09IDEwIDogInkgPSAiICsgeQotCi0gICAgICAgIHkgPSAzNCAvIDMuMDAwCi0gICAgICAgIGFzc2VydCB5ID09IDExLjMzMzMzMzMzMzMgOiAieSA9ICIgKyB5Ci0KLSAgICAgICAgeSA9IDM0LjAwMDAwMDAwMDAwIC8gMwotICAgICAgICBhc3NlcnQgeSA9PSAxMS4zMzMzMzMzMzMzMyA6ICJ5ID0gIiArIHkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9CaW5kaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9CaW5kaW5nVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjYyNzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQmluZGluZ1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotY2xhc3MgQmluZGluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgewotICAgIAliID0gbmV3IEJpbmRpbmcoKQotICAgIAliLnNldFZhcmlhYmxlKCJmb28iLCAxMjMpCi0gICAgCQotICAgIAlhc3NlcnQgYi5mb28gPT0gMTIzCi0gICAgCQotICAgIAliLmJhciA9IDQ1NgotICAgIAkKLSAgICAJYXNzZXJ0IGIuZ2V0VmFyaWFibGUoImJhciIpID09IDQ1NgotICAgIAlhc3NlcnQgYlsiYmFyIl0gPT0gNDU2Ci0gICAgCQotICAgIAliWyJhLmIuYyJdID0gJ2FiYycKLSAgICAJCi0gICAgCWFzc2VydCBiLmdldFZhcmlhYmxlKCJhLmIuYyIpID09ICdhYmMnCi0gICAgCWFzc2VydCBiWyJhLmIuYyJdID09ICdhYmMnCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQml0d2lzZU9wZXJhdGlvbnNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0JpdHdpc2VPcGVyYXRpb25zVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmM1ZWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQml0d2lzZU9wZXJhdGlvbnNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKiogCi0gKiBUZXN0IEJpdHdpc2UgT3BlcmF0aW9ucyBpbiBDbGFzc2ljL05ldyBHcm9vdnkKLSAqIAotICogQGF1dGhvciBQaWxobyBLaW0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQml0d2lzZU9wZXJhdGlvbnNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZVNoaWZ0KCkgewotICAgICAgICBhID0gNAotICAgICAgICBiID0gLTQKLSAgICAgICAgYXNzZXJ0IGEgPDwgMSA9PSA4Ci0gICAgICAgIGFzc2VydCBhIDw8IDIgPT0gMTYKLSAgICAgICAgYXNzZXJ0IGEgPj4gMSA9PSAyCi0gICAgICAgIGFzc2VydCBhID4+IDIgPT0gMQotICAgICAgICBhc3NlcnQgYSA+Pj4gMSA9PSAyCi0gICAgICAgIGFzc2VydCBhID4+PiAyID09IDEKLSAgICAgICAgYXNzZXJ0IGIgPDwgMSA9PSAtOAotICAgICAgICBhc3NlcnQgYiA8PCAyID09IC0xNgotICAgICAgICBhc3NlcnQgYiA+PiAxID09IC0yCi0gICAgICAgIGFzc2VydCBiID4+IDIgPT0gLTEKLSAgICAgICAgYXNzZXJ0IGIgPj4+IDEgPT0gMHg3RkZGRkZGRQotICAgICAgICBhc3NlcnQgYiA+Pj4gMiA9PSAweDNGRkZGRkZGCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZVNoaWZ0RVFVQUwoKSB7Ci0gICAgICAgIGEgPSA0Ci0gICAgICAgIGEgPDw9IDEKLSAgICAgICAgYXNzZXJ0IGEgPT0gOAotICAgICAgICBhIDw8PSAyCi0gICAgICAgIGFzc2VydCBhID09IDMyCi0gICAgICAgIGEgPj49IDEKLSAgICAgICAgYXNzZXJ0IGEgPT0gMTYKLSAgICAgICAgYSA+Pj0gMgotICAgICAgICBhc3NlcnQgYSA9PSA0Ci0KLSAgICAgICAgYiA9IC00Ci0gICAgICAgIGIgPDw9IDEKLSAgICAgICAgYXNzZXJ0IGIgPT0gLTgKLSAgICAgICAgYiA8PD0gMgotICAgICAgICBhc3NlcnQgYiA9PSAtMzIKLSAgICAgICAgYiA+Pj0gMQotICAgICAgICBhc3NlcnQgYiA9PSAtMTYKLSAgICAgICAgYiA+Pj0gMgotICAgICAgICBhc3NlcnQgYiA9PSAtNAotCi0gICAgICAgIGIgPSAtNAotICAgICAgICBiID4+Pj0gMQotICAgICAgICBhc3NlcnQgYiA9PSAweDdGRkZGRkZFCi0gICAgICAgIGIgPSAtOAotICAgICAgICBiID4+Pj0gMgotICAgICAgICBhc3NlcnQgYiA9PSAweDNGRkZGRkZFCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZUFuZCgpIHsKLSAgICAgICAvKgotICAgICAgICAvLyBPcHJhdG9yIFByZWNlZGVuY2UgUHJvYmxlbQotICAgICAgICAvLyBeLCAmLCB8IHNob3VsZCBiZSBwcmlvciB0byA9PSwgPCwgPiwgPD0sID49Ci0gICAgICAgIGEgPSAxMwotICAgICAgICBhc3NlcnQgYSAmIDMgPT0gMSAgICAvLyAweDAwMDAwMDBEICYgMHgwMDAwMDAwMwotICAgICAgICBhc3NlcnQgYSAmIDcgPT0gNSAgICAvLyAweDAwMDAwMDBEICYgMHgwMDAwMDAwNwotICAgICAgICBiID0gLTEzCi0gICAgICAgIGFzc2VydCBiICYgMyA9PSAzICAgIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDAzCi0gICAgICAgIGFzc2VydCBiICYgNyA9PSAzICAgIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDA3Ci0gICAgICAgKi8KLQotICAgICAgICBhID0gMTMKLSAgICAgICAgYXNzZXJ0IChhICYgMykgPT0gMSAgICAvLyAweDAwMDAwMDBEICYgMHgwMDAwMDAwMwotICAgICAgICBhc3NlcnQgKGEgJiA3KSA9PSA1ICAgIC8vIDB4MDAwMDAwMEQgJiAweDAwMDAwMDA3Ci0gICAgICAgIGIgPSAtMTMKLSAgICAgICAgYXNzZXJ0IChiICYgMykgPT0gMyAgICAvLyAweEZGRkZGRkYzICYgMHgwMDAwMDAwMwotICAgICAgICBhc3NlcnQgKGIgJiA3KSA9PSAzICAgIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDA3Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZUFuZEVxdWFsKCkgewotICAgICAgICBhID0gMTMKLSAgICAgICAgYSAmPSAzCi0gICAgICAgIGFzc2VydCBhID09IDEgICAgLy8gMHgwMDAwMDAwRCAmIDB4MDAwMDAwMDMKLSAgICAgICAgYSAmPSA0Ci0gICAgICAgIGFzc2VydCBhID09IDAgICAgLy8gMHgwMDAwMDAwMSAmIDB4MDAwMDAwMDQKLSAgICAgICAgYiA9IC0xMwotICAgICAgICBiICY9IDMKLSAgICAgICAgYXNzZXJ0IGIgPT0gMyAgICAvLyAweEZGRkZGRkYzICYgMHgwMDAwMDAwMwotICAgICAgICBiICY9IDcKLSAgICAgICAgYXNzZXJ0IGIgPT0gMyAgICAvLyAweDAwMDAwMDAzICYgMHgwMDAwMDAwNwotICAgIH0KLQotICAgIHZvaWQgdGVzdEJpdHdpc2VPcigpIHsKLSAgICAgICAvKgotICAgICAgICAvLyBPcHJhdG9yIFByZWNlZGVuY2UgUHJvYmxlbQotICAgICAgICAvLyBeLCAmLCB8IHNob3VsZCBiZSBwcmlvciB0byA9PSwgPCwgPiwgPD0sID49Ci0gICAgICAgIGEgPSAxMwotICAgICAgICBhc3NlcnQgYSB8IDggPT0gMTMgICAgICAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAwOAotICAgICAgICBhc3NlcnQgYSB8IDE2ID09IDI5ICAgICAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAxMAotICAgICAgICBiID0gLTEzCi0gICAgICAgIGFzc2VydCBiIHwgOCA9PSAtNSAgICAgIC8vIDB4RkZGRkZGRjMgfCAweDAwMDAwMDA4Ci0gICAgICAgIGFzc2VydCBiIHwgMTYgPT0gLTEzICAgIC8vIDB4RkZGRkZGRjMgfCAweDAwMDAwMDEwCi0gICAgICAgKi8KLQotICAgICAgICBhID0gMTMKLSAgICAgICAgYXNzZXJ0IChhIHwgOCkgPT0gMTMgICAgICAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAwOAotICAgICAgICBhc3NlcnQgKGEgfCAxNikgPT0gMjkgICAgIC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMDEwCi0gICAgICAgIGIgPSAtMTMKLSAgICAgICAgYXNzZXJ0IChiIHwgOCkgPT0gLTUgICAgICAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAwOAotICAgICAgICBhc3NlcnQgKGIgfCAxNikgPT0gLTEzICAgIC8vIDB4RkZGRkZGRjMgfCAweDAwMDAwMDEwCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZU9yRXF1YWwoKSB7Ci0gICAgICAgIGEgPSAxMwotICAgICAgICBhIHw9IDIKLSAgICAgICAgYXNzZXJ0IGEgPT0gMTUgICAgIC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMDAyCi0gICAgICAgIGEgfD0gMTYKLSAgICAgICAgYXNzZXJ0IGEgPT0gMzEgICAgIC8vIDB4MDAwMDAwMEYgfCAweDAwMDAwMDFGCi0gICAgICAgIGIgPSAtMTMKLSAgICAgICAgYiB8PSA4Ci0gICAgICAgIGFzc2VydCBiID09IC01ICAgICAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAwOAotICAgICAgICBiIHw9IDEKLSAgICAgICAgYXNzZXJ0IGIgPT0gLTUgICAgIC8vIDB4RkZGRkZGRkIgfCAweDAwMDAwMDAxCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZVhvcigpIHsKLSAgICAgICAvKgotICAgICAgICAvLyBPcHJhdG9yIFByZWNlZGVuY2UgUHJvYmxlbQotICAgICAgICAvLyBeLCAmLCB8IHNob3VsZCBiZSBwcmlvciB0byA9PSwgPCwgPiwgPD0sID49Ci0gICAgICAgIGEgPSAxMwotICAgICAgICBhc3NlcnQgYSBeIDEwID09IDcgICAgIC8vIDB4MDAwMDAwMEQgXiAweDAwMDAwMDBBID0gMHgwMDAwMDAwMDcKLSAgICAgICAgYXNzZXJ0IGEgXiAxNSA9PSAyICAgICAvLyAweDAwMDAwMDBEIF4gMHgwMDAwMDAwRiA9IDB4MDAwMDAwMDAyCi0gICAgICAgIGIgPSAtMTMKLSAgICAgICAgYXNzZXJ0IGIgXiAxMCA9PSAtNyAgICAvLyAweEZGRkZGRkYzIF4gMHgwMDAwMDAwQSA9IDB4RkZGRkZGRjkKLSAgICAgICAgYXNzZXJ0IGIgXiAxNSA9PSAtNCAgICAvLyAweEZGRkZGRkYzIF4gMHgwMDAwMDAwRiA9IDB4RkZGRkZGRkMKLSAgICAgICAqLwotCi0gICAgICAgIGEgPSAxMwotICAgICAgICBhc3NlcnQgKGEgXiAxMCkgPT0gNyAgICAgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMEEgPSAweDAwMDAwMDAwNwotICAgICAgICBhc3NlcnQgKGEgXiAxNSkgPT0gMiAgICAgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMEYgPSAweDAwMDAwMDAwMgotICAgICAgICBiID0gLTEzCi0gICAgICAgIGFzc2VydCAoYiBeIDEwKSA9PSAtNyAgICAvLyAweEZGRkZGRkYzIF4gMHgwMDAwMDAwQSA9IDB4RkZGRkZGRjkKLSAgICAgICAgYXNzZXJ0IChiIF4gMTUpID09IC00ICAgIC8vIDB4RkZGRkZGRjMgXiAweDAwMDAwMDBGID0gMHhGRkZGRkZGQwotICAgIH0KLQotICAgIHZvaWQgdGVzdEJpdHdpc2VYb3JFcXVhbCgpIHsKLSAgICAgICAgYSA9IDEzCi0gICAgICAgIGEgXj0gOAotICAgICAgICBhc3NlcnQgYSA9PSA1ICAgICAgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMDggPSAweDAwMDAwMDAwNQotICAgICAgICBhIF49IDE2Ci0gICAgICAgIGFzc2VydCBhID09IDIxICAgICAvLyAweDAwMDAwMDA1IF4gMHgwMDAwMDAxMCA9IDB4MDAwMDAwMDE1Ci0gICAgICAgIGIgPSAtMTMKLSAgICAgICAgYiBePSA4Ci0gICAgICAgIGFzc2VydCBiID09IC01ICAgICAvLyAweEZGRkZGRkYzIF4gMHgwMDAwMDAwOCA9IDB4RkZGRkZGRkIKLSAgICAgICAgYiBePSAxNgotICAgICAgICBhc3NlcnQgYiA9PSAtMjEgICAgLy8gMHhGRkZGRkZGQiBeIDB4MDAwMDAwMTAgPSAweEZGRkZGRkVCCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZU9ySW5DbG9zdXJlKCkgewotICAgICAgICBjMSA9IHsgeCwgeSB8IHggfCB5IH0KLSAgICAgICAgYXNzZXJ0IGMxKDE0LCA1KSA9PSAxNSAgICAgICAgICAvLyAweDAwMDAwMDBFIHwgMHgwMDAwMDAwNSA9IDB4MDAwMDAwMEYKLSAgICAgICAgYXNzZXJ0IGMxKDB4MEQsIDB4RkUpID09IDI1NSAgICAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDBGRSA9IDB4MDAwMDAwRkYKLQotICAgICAgICBjMiA9IHsgfHgsIHl8IHggfCB5IH0KLSAgICAgICAgYXNzZXJ0IGMyKDE0LCA1KSA9PSAxNSAgICAgICAgICAvLyAweDAwMDAwMDBFIHwgMHgwMDAwMDAwNSA9IDB4MDAwMDAwMEYKLSAgICAgICAgYXNzZXJ0IGMyKDB4MEQsIDB4RkUpID09IDI1NSAgICAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDBGRSA9IDB4MDAwMDAwRkYKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBbWJpZ3VpdHlPZkJpdHdpc2VPcigpIHsKLSAgICAgICAgYzEgPSB7IHgsIHkgfCB4IHwgeSB9Ci0gICAgICAgIGFzc2VydCBjMSgxNCwgNSkgPT0gMTUgICAgICAgICAgLy8gMHgwMDAwMDAwRSB8IDB4MDAwMDAwMDUgPSAweDAwMDAwMDBGCi0gICAgICAgIGFzc2VydCBjMSgweDBELCAweEZFKSA9PSAyNTUgICAgLy8gMHgwMDAwMDAwRCB8IDB4MDAwMDAwRkUgPSAweDAwMDAwMEZGCi0KLSAgICAgICAgYzIgPSB7IHx4LCB5fCB4IHwgeSB9Ci0gICAgICAgIGFzc2VydCBjMigxNCwgNSkgPT0gMTUgICAgICAgICAgLy8gMHgwMDAwMDAwRSB8IDB4MDAwMDAwMDUgPSAweDAwMDAwMDBGCi0gICAgICAgIGFzc2VydCBjMigweDBELCAweEZFKSA9PSAyNTUgICAgLy8gMHgwMDAwMDAwRCB8IDB4MDAwMDAwRkUgPSAweDAwMDAwMEZGCi0KLSAgICAgICAgeCA9IDMKLSAgICAgICAgeSA9IDUKLSAgICAgICAgYzEgPSB7IHggfCB5IH0gICAgICAvLyB8IGlzIGEgcGlwZQotICAgICAgICBjMiA9IHsgeCAmIHkgfSAgICAgIC8vICYgaXMgYSBiaXRBbmQKLSAgICAgICAgYzMgPSB7IHggXiB5IH0gICAgICAvLyAmIGlzIGEgYml0WG9yCi0gICAgICAgIGMxMSA9IHsKLSAgICAgICAgICAgICB4IHwgeSAgICAgICAgICAvLyB8IGlzIGEgcGlwZQotICAgICAgICB9Ci0gICAgICAgIGMxMiA9IHsKLSAgICAgICAgICAgICAoeCB8IHkpICAgICAgICAvLyB8IGlzIGEgYml0T3IKLSAgICAgICAgfQotICAgICAgICBjMTMgPSB7fCB4IHwgeSAgICAgIC8vIHR3byB8J3MgYXJlIHBpcGVzCi0gICAgICAgIH0KLSAgICAgICAgYzE0ID0ge3x8IHggfCB5ICAgICAvLyBsYXN0IHwgaXMgYSBiaXRPcgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGMxKCkgPT0gNQotICAgICAgICBhc3NlcnQgYzIoKSA9PSAxCi0gICAgICAgIGFzc2VydCBjMygpID09IDYKLSAgICAgICAgYXNzZXJ0IGMxMSgpID09IDUKLSAgICAgICAgYXNzZXJ0IGMxMigpID09IDcKLSAgICAgICAgYXNzZXJ0IGMxMygpID09IDUKLSAgICAgICAgYXNzZXJ0IGMxNCgpID09IDcKLQotICAgICAgICB4ID0gMHgwMwotCi0gICAgICAgIGQxID0geyB4IHwgeCB9ICAgICAgLy8gfCBpcyBhIHBpcGUKLSAgICAgICAgZDIgPSB7IHggJiB4IH0gICAgICAvLyAmIGlzIGEgYml0QW5kCi0gICAgICAgIGQzID0geyB4IF4geCB9ICAgICAgLy8gJiBpcyBhIGJpdFhvcgotICAgICAgICBkMTEgPSB7Ci0gICAgICAgICAgICAgeCB8IHggICAgICAgICAgLy8gfCBpcyBhIHBpcGUKLSAgICAgICAgfQotICAgICAgICBkMTIgPSB7Ci0gICAgICAgICAgICAgKHggfCB4KSAgICAgICAgLy8gfCBpcyBhIGJpdE9yCi0gICAgICAgIH0KLSAgICAgICAgZDEzID0ge3wgeCB8IHggICAgICAvLyB0d28gfCdzIGFyZSBwaXBlcwotICAgICAgICB9Ci0gICAgICAgIGQxNCA9IHt8fCB4IHwgeCAgICAgLy8gbGFzdCB8IGlzIGEgYml0T3IKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgZDEoMHhGMCkgPT0gMHhGMAotICAgICAgICBhc3NlcnQgZDIoMHhGMCkgPT0gMHgwMwotICAgICAgICBhc3NlcnQgZDMoMHhGMCkgPT0gMAotICAgICAgICBhc3NlcnQgZDExKDB4RjApID09IDB4RjAKLSAgICAgICAgYXNzZXJ0IGQxMigweEYwKSA9PSAweDAzCi0gICAgICAgIGFzc2VydCBkMTMoMHhGMCkgPT0gMHhGMAotICAgICAgICBhc3NlcnQgZDE0KDB4RjApID09IDB4MDMKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCaXR3aXNlTmVnYXRpb24oKSB7Ci0gICAgICAgIGFzc2VydCB+MSA9PSAtMiAgICAgLy8gfjB4MDAwMDAwMDEgPSAweEZGRkZGRkZFCi0gICAgICAgIGFzc2VydCB+LTEgPT0gMCAgICAgLy8gfjB4RkZGRkZGRkYgPSAweDAwMDAwMDAwCi0gICAgICAgIGFzc2VydCB+fjUgPT0gNSAgICAgLy8gfn4weDAwMDAwMDA1ID0gfjB4RkZGRkZGRkEgPSAweEZGRkZGRkY1Ci0gICAgICAgIGEgPSAxMwotICAgICAgICBhc3NlcnQgfmEgID09IC0xNCAgICAgLy8gfjB4MDAwMDAwMEQgPSAweEZGRkZGRkYyCi0gICAgICAgIGFzc2VydCB+fmEgID09IDEzICAgICAvLyB+fjB4MDAwMDAwMEQgPSB+MHhGRkZGRkZGMiA9IDB4MDAwMDAwMEQKLSAgICAgICAgYXNzZXJ0IC1+YSAgPT0gMTQgICAgIC8vIC1+MHgwMDAwMDAwRCA9IC0weEZGRkZGRkYyID0gMHgwMDAwMDAwRQotICAgIH0KLQotICAgIHZvaWQgdGVzdEJpdHdpc2VOZWdhdGlvblR5cGUoKSB7Ci0gICAgICAgIHggPSB+NwotICAgICAgICBhc3NlcnQgeC5jbGFzcyA9PSBqYXZhLmxhbmcuSW50ZWdlcgotCi0gICAgICAgIHkgPSB+ImZvbyIKLSAgICAgICAgYXNzZXJ0IHkuY2xhc3MgPT0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KLQotICAgICAgICB6ID0gfiIke3h9IgotICAgICAgICBhc3NlcnQgei5jbGFzcyA9PSBqYXZhLnV0aWwucmVnZXguUGF0dGVybgotICAgIH0KLQotICAgIHZvaWQgdGVzdEJpdHdpc2VOZWdhdGlvblR5cGVDYWxsRnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIGludGVnZXIgdGVzdAotICAgICAgICBhc3NlcnQgbmVnKDIpLmNsYXNzID09IGphdmEubGFuZy5JbnRlZ2VyCi0gICAgICAgIGFzc2VydCBuZWcoMikgaW5zdGFuY2VvZiBqYXZhLmxhbmcuSW50ZWdlcgotICAgICAgICBhc3NlcnQgbmVnKDIpID09IH4yCi0KLSAgICAgICAgLy8gbG9uZyB0ZXN0Ci0gICAgICAgIGFzc2VydCBuZWcoMkwpLmNsYXNzID09IGphdmEubGFuZy5Mb25nCi0gICAgICAgIGFzc2VydCBuZWcoMkwpIGluc3RhbmNlb2YgamF2YS5sYW5nLkxvbmcKLSAgICAgICAgYXNzZXJ0IG5lZygyTCkgPT0gfjIKLQotICAgICAgICAvLyBCaWdJbnRlZ2VyIHRlc3QKLSAgICAgICAgYXNzZXJ0IG5lZyhuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIjIiKSkuY2xhc3MgPT0gamF2YS5tYXRoLkJpZ0ludGVnZXIKLSAgICAgICAgYXNzZXJ0IG5lZyhuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIjIiKSkgaW5zdGFuY2VvZiBqYXZhLm1hdGguQmlnSW50ZWdlcgotICAgICAgICBhc3NlcnQgbmVnKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMiIpKSA9PSB+MgotCi0gICAgICAgIC8vIEJpZ0ludGVnZXIgdGVzdAotICAgICAgICBhc3NlcnQgbmVnKDJHKS5jbGFzcyA9PSBqYXZhLm1hdGguQmlnSW50ZWdlcgotICAgICAgICBhc3NlcnQgbmVnKDJHKSBpbnN0YW5jZW9mIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0gICAgICAgIGFzc2VydCBuZWcoMkcpID09IH4yCi0KLSAgICAgICAgYXNzZXJ0IG5lZygiZm9vIikuY2xhc3MgPT0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KLSAgICAgICAgYXNzZXJ0IG5lZygiZm9vIikgaW5zdGFuY2VvZiBqYXZhLnV0aWwucmVnZXguUGF0dGVybgotICAgIH0KLQotICAgIE9iamVjdCBuZWcobikgewotICAgICAgICBpZiAobiBpbnN0YW5jZW9mIGphdmEubGFuZy5JbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gfm4KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuIGluc3RhbmNlb2YgamF2YS5sYW5nLkxvbmcpIHsKLSAgICAgICAgICAgIHJldHVybiB+bgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBqYXZhLm1hdGguQmlnSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuIH5uCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgcmV0dXJuIH5uLnRvU3RyaW5nKCkKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Cb29sZWFuT3BlcmF0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Cb29sZWFuT3BlcmF0aW9uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjViMzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQm9vbGVhbk9wZXJhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotY2xhc3MgQm9vbGVhbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDb21wYXJpc29ucygpIHsKLSAgICAgICAgYXNzZXJ0IHRydWUKLSAgICAgICAgYXNzZXJ0IHRydWUgIT0gZmFsc2UKLSAgICAgICAgCi0gICAgICAgIHggPSB0cnVlCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeAotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0gICAgICAgIGFzc2VydCB4ICE9IGZhbHNlCi0gICAgICAgIAotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09IGZhbHNlCi0gICAgICAgIGFzc2VydCB4ICE9IHRydWUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCAheAotICAgICAgICAKLSAgICAgICAgeSA9IGZhbHNlICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0geQotICAgICAgICAKLSAgICAgICAgeSA9IHRydWUKLSAgICAgICAgYXNzZXJ0IHggIT0geQotICAgIH0KLSAgICAKLSAgICAKLSAgICB2b2lkIHRlc3RJZkJyYW5jaCgpIHsKLSAgICAgICAgeCA9IGZhbHNlCi0gICAgICAgIHIgPSBmYWxzZQotICAgICAgICAKLSAgICAgICAgaWYgKCB4ICkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHIKLSAgICAgICAgCi0gICAgICAgIHggPSB0cnVlCi0gICAgICAgIHIgPSBmYWxzZQotICAgICAgICAKLSAgICAgICAgaWYgKCB4ICkgewotICAgICAgICAgICAgciA9IHRydWUKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCByCi0gICAgICAgIAotICAgICAgICBpZiAoICF4ICkgewotICAgICAgICAgICAgciA9IGZhbHNlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByID0gdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcgotICAgIH0KLQotCi0Jdm9pZCB0ZXN0Qm9vbGVhbkV4cHJlc3Npb24oKSB7Ci0JICAgIHggPSA1Ci0JICAgIHZhbHVlID0geCA+IDIKLQkgICAgYXNzZXJ0IHZhbHVlCi0JICAgIAotCSAgICB2YWx1ZSA9IHggPCAyCi0JICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NhbGxJbm5lckNsYXNzQ3RvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2FsbElubmVyQ2xhc3NDdG9yVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWIyMjAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2FsbElubmVyQ2xhc3NDdG9yVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5Lk91dGVyVXNlcgotCi0vKioKLSAqIENoZWNrcyB0aGF0IGl0J3MgcG9zc2libGUgdG8gY2FsbCBpbm5lciBjbGFzc2VzIGNvbnN0cnVjdG9yIGZyb20gZ3Jvb3Z5Ci0gKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCi0gKi8KLWNsYXNzIENhbGxJbm5lckNsYXNzQ3RvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDYWxsQ3RvcigpIHsKLSAgICAgICAgdXNlciA9IG5ldyBncm9vdnkuT3V0ZXJVc2VyKCkKLSAgICAgICAgdXNlci5uYW1lID0gIkd1aWxsYXVtZSIKLSAgICAgICAgdXNlci5hZ2UgPSAyNwotCi0gICAgICAgIGFzc2VydCB1c2VyLm5hbWUgPT0gIkd1aWxsYXVtZSIKLSAgICAgICAgYXNzZXJ0IHVzZXIuYWdlID09IDI3Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FsbElubmVyQ3RvcigpIHsKLSAgICAgICAgYWRkcmVzcyA9IG5ldyBncm9vdnkuT3V0ZXJVc2VyLklubmVyQWRkcmVzcygpCi0gICAgICAgIGFkZHJlc3MuY2l0eSA9ICJNZXVkb24iCi0gICAgICAgIGFkZHJlc3MuemlwY29kZSA9IDkyMzYwCi0KLSAgICAgICAgYXNzZXJ0IGFkZHJlc3MuY2l0eSA9PSAiTWV1ZG9uIgotICAgICAgICBhc3NlcnQgYWRkcmVzcy56aXBjb2RlID09IDkyMzYwCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FsbElubmVySW5uZXJDdG9yKCkgewotICAgICAgICBhZGRyZXNzID0gbmV3IGdyb292eS5PdXRlclVzZXIuSW5uZXJBZGRyZXNzLlN0cmVldCgpCi0gICAgICAgIGFkZHJlc3MubmFtZSA9ICJydWUgZGUgbGEgcGFpeCIKLSAgICAgICAgYWRkcmVzcy5udW1iZXIgPSAxNwotCi0gICAgICAgIGFzc2VydCBhZGRyZXNzLm5hbWUgPT0gInJ1ZSBkZSBsYSBwYWl4IgotICAgICAgICBhc3NlcnQgYWRkcmVzcy5udW1iZXIgPT0gMTcKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DYXN0VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DYXN0VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTE5NTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2FzdFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLWNsYXNzIENhc3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgU2hvcnQgYiA9IDEKLSAgICAKLSAgICB2b2lkIHRlc3RDYXN0KCkgewotICAgICAgICB4ID0gKFNob3J0KSA1Ci0KLSAgICAgICAgcHJpbnRsbigiQ2FzdCBJbnRlZ2VyIHRvICR7eH0gd2l0aCB0eXBlICR7eC5jbGFzc30iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHguY2xhc3MgPT0gU2hvcnQKLSAgICAgICAgCi0gICAgICAgIG1ldGhvZFdpdGhTaG9ydCh4KQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RJbXBsaWNpdENhc3QoKSB7Ci0gICAgICAgIFNob3J0IHggPSA2Ci0gICAgICAgIAotICAgICAgICBwcmludGxuKCJDcmVhdGVkICR7eH0gd2l0aCB0eXBlICR7eC5jbGFzc30iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHguY2xhc3MgPT0gU2hvcnQgOiAiVHlwZSBpcyAke3guY2xhc3N9IgotICAgICAgICAKLQkJbWV0aG9kV2l0aFNob3J0KHgpCi0gICAgICAgIAotICAgICAgICB4ID0gNwotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiVXBkYXRlZCAke3h9IHdpdGggdHlwZSAke3guY2xhc3N9IikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4LmNsYXNzID09IFNob3J0IDogIlR5cGUgaXMgJHt4LmNsYXNzfSIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RJbXBsaWNpdENhc3RPZkZpZWxkKCkgewotCi0gICAgICAgIHByaW50bG4oIkZpZWxkIGlzICR7Yn0gd2l0aCB0eXBlICR7Yi5jbGFzc30iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGIuY2xhc3MgPT0gU2hvcnQgOiAiVHlwZSBpcyAke2IuY2xhc3N9IgotICAgICAgICAKLSAgICAgICAgYiA9IDUKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4oIlVwZGF0ZWQgZmllbGQgJHtifSB3aXRoIHR5cGUgJHtiLmNsYXNzfSIpCi0gCi0gICAgICAgIGFzc2VydCBiLmNsYXNzID09IFNob3J0IDogIlR5cGUgaXMgJHtiLmNsYXNzfSIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0SW50Q2FzdCgpIHsKLSAgICAgICAgaSA9IChJbnRlZ2VyKSAneCcKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBpIGluc3RhbmNlb2YgSW50ZWdlcgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDaGFyQ29tcGFyZSgpIHsKLSAgICAgICAgaSA9IChJbnRlZ2VyKSAneCcKLSAgICAgICAgYyA9ICd4JwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGkgPT0gYwotICAgICAgICBhc3NlcnQgaSA9PSd4JwotICAgICAgICBhc3NlcnQgYyA9PSAneCcKLQkJYXNzZXJ0IGkgPT0gaQotCQlhc3NlcnQgYyA9PSBjCi0KLSAgICAgICAgYXNzZXJ0ICd4JyA9PSAneCcKLSAgICAgICAgYXNzZXJ0ICd4JyA9PSBjCi0gICAgICAgIGFzc2VydCAneCcgPT0gaQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDaGFyQ2FzdCgpIHsKLSAgICAgICAgYyA9IChDaGFyYWN0ZXIpICd4JwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGMgaW5zdGFuY2VvZiBDaGFyYWN0ZXIKLSAgICAgICAgCi0gICAgICAgIGMgPSAoQ2hhcmFjdGVyKTEwCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYyBpbnN0YW5jZW9mIENoYXJhY3RlcgotICAgIH0KLSAgICAKLSAgICB2b2lkIG1ldGhvZFdpdGhTaG9ydChTaG9ydCBzKSB7Ci0gICAgICAgIHByaW50bG4oIkNhbGxlZCB3aXRoICR7c30gd2l0aCB0eXBlICR7cy5jbGFzc30iKQotICAgICAgICBhc3NlcnQgcy5jbGFzcyA9PSBTaG9ydAotICAgIH0KLSAgICAKLSAgICB2b2lkIG1ldGhvZFdpdGhDaGFyKENoYXJhY3RlciB4KSB7Ci0gICAgICAgIHByaW50bG4oIkNhbGxlZCB3aXRoICR7eH0gd2l0aCB0eXBlICR7cy5jbGFzc30iKQotICAgICAgICAKLSAgICAgICAgdGV4dCA9ICJ0ZXh0IgotICAgICAgICBpZHggPSB0ZXh0LmluZGV4T2YoeCkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBpZHggPT0gMgotICAgIH0KLSAgICAvLyBicgotICAgIHZvaWQgdGVzdFByaW1pdGl2ZUNhc3RpbmcoKSB7Ci0gICAgICAgIGQgPSAxLjIzCi0gICAgICAgIGkxID0gKGludClkCi0gICAgICAgIGkyID0gKEludGVnZXIpZAotICAgICAgICBhc3NlcnQgaTEuY2xhc3MubmFtZSA9PSAnamF2YS5sYW5nLkludGVnZXInCi0gICAgICAgIGFzc2VydCBpMi5jbGFzcy5uYW1lID09ICdqYXZhLmxhbmcuSW50ZWdlcicKLQotICAgICAgICBjaCA9IChjaGFyKSBpMQotICAgICAgICBhc3NlcnQgY2guY2xhc3MubmFtZSA9PSAnamF2YS5sYW5nLkNoYXJhY3RlcicKLQotICAgICAgICBkZCA9IChkb3VibGUpZAotICAgICAgICBhc3NlcnQgZGQuY2xhc3MubmFtZSA9PSAnamF2YS5sYW5nLkRvdWJsZScKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2F0ZWdvcnlUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NhdGVnb3J5VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzc2ZmYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2F0ZWdvcnlUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLWNsYXNzIENhdGVnb3J5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgewotICAgIHVzZSAoU3RyaW5nQ2F0ZWdvcnkpIHsKLSAgICAgIGFzc2VydCAiU2FtIi5sb3dlcigpID09ICJzYW0iOwotICAgICAgdXNlIChJbnRlZ2VyQ2F0ZWdvcnkpIHsKLSAgICAgICAgYXNzZXJ0ICJTYW0iLmxvd2VyKCkgPT0gInNhbSI7Ci0gICAgICAgIGFzc2VydCAxLmluYygpID09IDI7Ci0gICAgICB9Ci0gICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwgeyAxLmluYygpIH0pOwotICAgIH0KLSAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHsgIlNhbSIubG93ZXIoKSB9KTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIG1haW4oYXJncykgewotICAgIHQgPSBuZXcgQ2F0ZWdvcnlUZXN0KCk7Ci0gICAgdC50ZXN0Q2F0ZWdvcmllcygpOwotICB9Ci19Ci0KLWNsYXNzIFN0cmluZ0NhdGVnb3J5IHsKLSAgc3RhdGljIFN0cmluZyBsb3dlcihTdHJpbmcgc3RyaW5nKSB7Ci0gICAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpOwotICB9Ci19Ci0KLWNsYXNzIEludGVnZXJDYXRlZ29yeSB7Ci0gIHN0YXRpYyBJbnRlZ2VyIGluYyhJbnRlZ2VyIGkpIHsKLSAgICByZXR1cm4gaSArIDE7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DaGFpbmVkQXNzaWdubWVudC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DaGFpbmVkQXNzaWdubWVudC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDBhOTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2hhaW5lZEFzc2lnbm1lbnQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotY2xhc3MgQ2hhaW5lZEFzc2lnbm1lbnQgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBkdW1teSh2KSB7Ci0gICAgICAgIHByaW50IHYKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RDb21wYXJlKCkgewotICAgICAgICBpID0gMTIzCi0gICAgICAgIHMgPSAiaGVsbG8iCi0KLSAgICAgICAgaTEgPSBpMiA9IGk7Ci0gICAgICAgIGFzc2VydCBpMSA9PSAxMjMKLSAgICAgICAgYXNzZXJ0IGkyID09IDEyMwotCi0gICAgICAgIGR1bW15KHMxID0gcykKLSAgICAgICAgYXNzZXJ0ICBzMSA9PSAiaGVsbG8iCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NFeHByZXNzaW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbGFzc0V4cHJlc3Npb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5ZWRmYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbGFzc0V4cHJlc3Npb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKiAKLSAqIFRlc3RzIHRoZSB1c2Ugb2YgY2xhc3NlcyBhcyB2YXJpYWJsZSBleHByZXNzaW9ucwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDbGFzc0V4cHJlc3Npb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0VXNlT2ZDbGFzcygpIHsKLSAgICAgICAgeCA9IFN0cmluZwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4OiAiICsgeCkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ICE9IG51bGwKLQotICAgICAgICBhc3NlcnQgeC5nZXROYW1lKCkuZW5kc1dpdGgoJ1N0cmluZycpCi0gICAgICAgIGFzc2VydCB4Lm5hbWUuZW5kc1dpdGgoJ1N0cmluZycpCi0KLSAgICAgICAgeCA9IEludGVnZXIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IHgubmFtZS5lbmRzV2l0aCgnSW50ZWdlcicpCi0gICAgICAgIAotICAgICAgICB4ID0gR3Jvb3Z5VGVzdENhc2UKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IHgubmFtZS5lbmRzV2l0aCgnR3Jvb3Z5VGVzdENhc2UnKQotICAgICAgICAKLSAgICAgICAgeCA9IENsYXNzRXhwcmVzc2lvblRlc3QKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ICE9IG51bGwKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIng6ICIgKyB4KQotICAgIH0KLQotICAgIHZvaWQgdGVzdENsYXNzUHN1ZWRvUHJvcGVydHkoKSB7Ci0KLSAgICAgICAgeCA9ICJjaGVlc2UiOwotCi0gICAgICAgIGFzc2VydCB4LmNsYXNzICE9IG51bGwKLQotICAgICAgICBhc3NlcnQgeC5jbGFzcyA9PSB4LmdldENsYXNzKCk7Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAieC5jbGFzczogIiArIHguY2xhc3MgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbGFzc0xvYWRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbGFzc0xvYWRlckJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNWNjYTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotY2xhc3MgQ2xhc3NMb2FkZXJCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0gICAgICAgIGdzdCA9IG5ldyBDbGFzc0xvYWRlckJ1ZygpOwotICAgICAgICBnc3QudGVzdFdpdGhPbmVWYXJpYWJsZSgpOwotICAgIH0KLQotICAgIHZvaWQgdGVzdFdpdGhPbmVWYXJpYWJsZSgpIHsKLSAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1ldGhvZCIpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjViNDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWNsYXNzIENsYXNzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdENsYXNzRXhwcmVzc2lvbigpIHsKLSAgICAJYyA9IFN0cmluZy5jbGFzcwotICAgIAlwcmludGxuIGMKLSAgICAJYXNzZXJ0IGMgaW5zdGFuY2VvZiBDbGFzcwotICAgIAlhc3NlcnQgYy5uYW1lID09ICJqYXZhLmxhbmcuU3RyaW5nIiA6IGMubmFtZQotICAgIAkKLSAgICAJYyA9IEdyb292eVRlc3RDYXNlLmNsYXNzCi0gICAgCXByaW50bG4gYwotICAgIAlhc3NlcnQgYyBpbnN0YW5jZW9mIENsYXNzCi0gICAgCWFzc2VydCBjLm5hbWUuZW5kc1dpdGgoIkdyb292eVRlc3RDYXNlIikgOiBjLm5hbWUKLSAgICAJCi0gICAgCWMgPSBDbGFzc1Rlc3QuY2xhc3MKLSAgICAJcHJpbnRsbiBjCi0gICAgCWFzc2VydCBjIGluc3RhbmNlb2YgQ2xhc3MKLSAgICAJYXNzZXJ0IGMubmFtZS5lbmRzV2l0aCgiQ2xhc3NUZXN0IikgOiBjLm5hbWUKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQXNQYXJhbVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUFzUGFyYW1UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyY2NhYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQXNQYXJhbVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqIAotICogVGVzdHMgQ2xvc3VyZXMgaW4gR3Jvb3Z5Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVBc1BhcmFtVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFNpbXBsZUJsb2NrQ2FsbCgpIHsKLSAgICAgICAgYXNzZXJ0Q2xvc3VyZSh7b3duZXJ8IHByaW50bG4ob3duZXIpIH0pCi0gICAgfQotICAKLQlhc3NlcnRDbG9zdXJlKENsb3N1cmUgYmxvY2spIHsKLQkgICAgYXNzZXJ0IGJsb2NrICE9IG51bGwKLQkgICAgYmxvY2suY2FsbCgiaGVsbG8hIikKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQ2xvbmVUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDbG9uZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmMxNTM1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDbG9uZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQ2xvc3VyZUNsb25lVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdENsb25lT2ZDbG9zdXJlKCkgewotCQlmYWN0b3IgPSAyICAgICAgICAKLSAgICAgICAgY2xvc3VyZSA9IHsgaXQgKiBmYWN0b3IgfQotCQkKLQkJdmFsdWUgPSBjbG9zdXJlKDUpCi0JCWFzc2VydCB2YWx1ZSA9PSAxMAotCQkKLQkJLy8gbm93IGxldHMgY2xvbmUgdGhlIGNsb3N1cmUKLQkJYzIgPSBjbG9zdXJlLmNsb25lKCkKLQkJYXNzZXJ0IGMyICE9IG51bGwKLQkJCi0JCXZhbHVlID0gYzIoNikKLQkJYXNzZXJ0IHZhbHVlID09IDEyCi0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQ29tcGFyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUNvbXBhcmF0b3JUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNmRiMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQ29tcGFyYXRvclRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLS8qKgotICogVGVzdHMgZm9yIENsb3N1cmVDb21wYXJhdG9yCi0gKgotICogQGF1dGhvciBBbGV4ZXkgVmVya2hvdnNreQotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0gY2xhc3MgQ2xvc3VyZUNvbXBhcmF0b3JUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0KLSAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVDb21wYXJhdG9yRm9yR3Jvb3Z5T2JqZWN0cygpIHsKLQotICAgIGNvbXBhcmF0b3IgPSBuZXcgQ2xvc3VyZUNvbXBhcmF0b3IoKSB7Ci0gICAgICB8IG9uZSwgYW5vdGhlcnwKLSAgICAgIG9uZS5ncmVhdGVyVGhhbihhbm90aGVyKQotICAgIH0KLQotICAgIG9uZSA9IG5ldyBDb21wYXJhYmxlRm9vKDUpCi0gICAgYW5vdGhlciA9IG5ldyBDb21wYXJhYmxlRm9vKC01KQotCi0gICAgYXNzZXJ0RXF1YWxzKDEwTCwgY29tcGFyYXRvci5jb21wYXJlKG9uZSwgYW5vdGhlcikpCi0gICAgYXNzZXJ0RXF1YWxzKDBMLCBjb21wYXJhdG9yLmNvbXBhcmUob25lLCBvbmUpKQotICAgIGFzc2VydEVxdWFscygtMTBMLCBjb21wYXJhdG9yLmNvbXBhcmUoYW5vdGhlciwgb25lKSkKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVDb21wYXJhdG9yRm9yTnVtZXJpY1R5cGVzKCkgewotCi0gICAgY29tcGFyYXRvciA9IG5ldyBDbG9zdXJlQ29tcGFyYXRvcigpIHsKLSAgICAgIHwgb25lLCBhbm90aGVyfAotICAgICAgb25lIC0gYW5vdGhlcgotICAgIH0KLQotICAgIGFzc2VydEVxdWFscygxTCwgY29tcGFyYXRvci5jb21wYXJlKEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRS0xKSkKLSAgICBhc3NlcnRFcXVhbHMoMEwsIGNvbXBhcmF0b3IuY29tcGFyZShEb3VibGUuTUlOX1ZBTFVFLCBEb3VibGUuTUlOX1ZBTFVFKSkKLSAgICBhc3NlcnRFcXVhbHMoLTFMLCBjb21wYXJhdG9yLmNvbXBhcmUoTG9uZy5NSU5fVkFMVUUsIExvbmcuTUlOX1ZBTFVFKzEpKQotICB9Ci0KLX0KLQotY2xhc3MgQ29tcGFyYWJsZUZvbyB7Ci0gIGxvbmcgdmFsdWUKLQotICBwdWJsaWMgQ29tcGFyYWJsZUZvbyhsb25nIHRoZVZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHRoZVZhbHVlCi0gIH0KLQotICBncmVhdGVyVGhhbihhbm90aGVyRm9vKSB7Ci0gICAgcmV0dXJuICh0aGlzLnZhbHVlIC0gYW5vdGhlckZvby52YWx1ZSkKLSAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQ3VycnlUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDdXJyeVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJjMzliLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDdXJyeVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqIAotICogQGF1dGhvciBIYWxsdmFyZCBUcr50dGViZXJnCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVDdXJyeVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDdXJyeSgpIHsKLQkJY2xvczEgPSB7czEsIHMyIHwgczEgKyBzMn0KLQkJY2xvczIgPSBjbG9zMS5jdXJyeSgiaGkiKQotCQl2YWx1ZSA9IGNsb3MyKCJ0aGVyZSIpIAotCQlhc3NlcnQgdmFsdWUgPT0gImhpdGhlcmUiCi0JCQotCQljbG9zMyA9IHtzMSwgczIsIHMzIHwgczEgKyBzMiArIHMzfQotCQljbG9zNCA9IGNsb3MzLmN1cnJ5KCdhJykKLQkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpCi0JCWNsb3M2ID0gY2xvczQuY3VycnkoJ3gnKQotCQljbG9zNyA9IGNsb3M0LmN1cnJ5KCdmJywgJ2cnKQotCQl2YWx1ZSA9IGNsb3M1KCdjJykKLQkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCi0JCXZhbHVlID0gY2xvczYoJ2MnKQotCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKLQkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKLQkJYXNzZXJ0IHZhbHVlID09ICJheXoiCi0JCXZhbHVlID0gY2xvczcoKQotCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKLQkJCi0JCWNsb3MzID0ge3MxLCBzMiwgczMgfCBzMSArIHMyICsgczN9LmFzV3JpdGFibGUoKQotCQljbG9zNCA9IGNsb3MzLmN1cnJ5KCdhJykKLQkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpCi0JCWNsb3M2ID0gY2xvczQuY3VycnkoJ3gnKQotCQljbG9zNyA9IGNsb3M0LmN1cnJ5KCdmJywgJ2cnKQotCQl2YWx1ZSA9IGNsb3M1KCdjJykKLQkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCi0JCXZhbHVlID0gY2xvczYoJ2MnKQotCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKLQkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKLQkJYXNzZXJ0IHZhbHVlID09ICJheXoiCi0JCXZhbHVlID0gY2xvczcoKQotCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKLQkJCi0JCWNsb3MzID0ge3MxLCBzMiwgczMgfCBzMSArIHMyICsgczN9Ci0JCWNsb3M0ID0gY2xvczMuY3VycnkoJ2EnKS5hc1dyaXRhYmxlKCkKLQkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpLmFzV3JpdGFibGUoKQotCQljbG9zNiA9IGNsb3M0LmN1cnJ5KCd4JykuYXNXcml0YWJsZSgpCi0JCWNsb3M3ID0gY2xvczQuY3VycnkoJ2YnLCAnZycpLmFzV3JpdGFibGUoKQotCQl2YWx1ZSA9IGNsb3M1KCdjJykKLQkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCi0JCXZhbHVlID0gY2xvczYoJ2MnKQotCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKLQkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKLQkJYXNzZXJ0IHZhbHVlID09ICJheXoiCi0JCXZhbHVlID0gY2xvczcoKQotCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKLQkJCi0JCWNsb3MzID0ge3MxLCBzMiwgczMgfCBzMSArIHMyICsgczN9Ci0JCWNsb3M0ID0gY2xvczMuY3VycnkoJ2EnKS5jbG9uZSgpCi0JCWNsb3M1ID0gY2xvczQuY3VycnkoJ2InKS5jbG9uZSgpCi0JCWNsb3M2ID0gY2xvczQuY3VycnkoJ3gnKS5jbG9uZSgpCi0JCWNsb3M3ID0gY2xvczQuY3VycnkoJ2YnLCAnZycpLmNsb25lKCkKLQkJdmFsdWUgPSBjbG9zNSgnYycpCi0JCWFzc2VydCB2YWx1ZSA9PSAiYWJjIgotCQl2YWx1ZSA9IGNsb3M2KCdjJykKLQkJYXNzZXJ0IHZhbHVlID09ICJheGMiCi0JCXZhbHVlID0gY2xvczQoJ3knLCAneicpCi0JCWFzc2VydCB2YWx1ZSA9PSAiYXl6IgotCQl2YWx1ZSA9IGNsb3M3KCkKLQkJYXNzZXJ0IHZhbHVlID09ICJhZmciCi0JCQotCQljbG9zMyA9IHtzMSwgczIsIHMzIHwgczEgKyBzMiArIHMzfQotCQljbG9zNCA9IGNsb3MzLmN1cnJ5KCdhJykuYXNXcml0YWJsZSgpLmNsb25lKCkKLQkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpLmFzV3JpdGFibGUoKS5jbG9uZSgpCi0JCWNsb3M2ID0gY2xvczQuY3VycnkoJ3gnKS5hc1dyaXRhYmxlKCkuY2xvbmUoKQotCQljbG9zNyA9IGNsb3M0LmN1cnJ5KCdmJywgJ2cnKS5hc1dyaXRhYmxlKCkuY2xvbmUoKQotCQl2YWx1ZSA9IGNsb3M1KCdjJykKLQkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCi0JCXZhbHVlID0gY2xvczYoJ2MnKQotCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKLQkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKLQkJYXNzZXJ0IHZhbHVlID09ICJheXoiCi0JCXZhbHVlID0gY2xvczcoKQotCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjM2RlYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlSW5DbG9zdXJlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioKLSAqIEJ1ZyBpbGx1c3RyYXRpbmcgdGhlIG5lc3RlZCBjbG9zdXJlcyB2YXJpYWJsZSBzY29wZSB2aXNpYmlsaXR5IGlzc3VlLgotICogbC5lYWNoIGlzIENsb3N1cmVJbkNsb3N1cmVCdWckMSBhbmQgaXQuZWFjaCBpcyBDbG9zdXJlSW5DbG9zdXJlQnVnJDIKLSAqIFRoZSB2YXJpYWJsZSB0ZXh0IGlzIG5vdCB2aXNpYmxlIGZyb20gQ2xvc3VyZUluQ2xvc3VyZUJ1ZyQyLgotICogSW5kZWVkLCBhIGNsb3N1cmUgY2FuIG9ubHkgc2VlIHRoZSB2YXJpYWJsZSBkZWZpbmVkIG91dHNpZGUgdGhpcyBjbG9zdXJlIChvbmUgbGV2ZWwgdXApCi0gKiBidXQgY2Fubm90IHNlZSB3aGF0J3MgaW4gdGhlIHNlY29uZCBsZXZlbC4KLSAqCi0gKiBJbiBvcmRlciB0byBtYWtlIHRoZSB0ZXN0IHdvcmssIGRvIG5vdCBmb3JnZXQgdG8gdW5jb21tZW50IHRoZSBsaW5lICJwcmludGxuKHRleHQpIgotICoKLSAqIEBhdXRob3VyIEd1aWxsYXVtZSBMYWZvcmdlCi0gKi8KLWNsYXNzIENsb3N1cmVJbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKLXsKLQl2b2lkIHRlc3RJbnZpc2libGVWYXJpYWJsZSgpCi0JewotCQl0ZXh0ID0gInRlc3QgIgotCi0JCWwgPSBbMS4uMTEsIDIuLjEyLCAzLi4xMywgNC4uMTRdCi0KLQkJbC5lYWNoewotCQkJaXQuZWFjaHsKLQkJCSAgICBwcmludGxuKHRleHQpCi0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBtYWluKGFyZ3MpCi0JewotCQlidWcgPSBuZXcgQ2xvc3VyZUluQ2xvc3VyZVRlc3QoKQotCQlidWcudGVzdEludmlzaWJsZVZhcmlhYmxlKCkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUluU3RhdGljTWV0aG9kVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlSW5TdGF0aWNNZXRob2RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNDRmOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlSW5TdGF0aWNNZXRob2RUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVJblN0YXRpY01ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDbG9zdXJlSW5TdGF0aWNNZXRob2QoKSB7Ci0gICAgICAgIGNsb3N1cmUgPSBjbG9zdXJlSW5TdGF0aWNNZXRob2QoKQotICAgICAgICBhc3NlcnRDbG9zdXJlKGNsb3N1cmUpICAgIAotICAgIH0KLQotICAgIHZvaWQgdGVzdE1ldGhvZENsb3N1cmVJblN0YXRpY01ldGhvZCgpIHsKLSAgICAgICAgY2xvc3VyZSA9IG1ldGhvZENsb3N1cmVJblN0YXRpY01ldGhvZCgpCi0gICAgICAgIGFzc2VydENsb3N1cmUoY2xvc3VyZSkgICAgCi0gICAgfQotICAgIAotICAgIHN0YXRpYyBjbG9zdXJlSW5TdGF0aWNNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiB7IHByaW50bG4oaXQpIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgbWV0aG9kQ2xvc3VyZUluU3RhdGljTWV0aG9kKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGFzc2VydENsb3N1cmUoQ2xvc3VyZSBibG9jaykgewotICAgICAgICBhc3NlcnQgYmxvY2sgIT0gbnVsbAotICAgICAgICBibG9jay5jYWxsKCJoZWxsbyEiKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVMaXN0ZW5lclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUxpc3RlbmVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGU2ODcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUxpc3RlbmVyVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbgotaW1wb3J0IGphdmEudXRpbC5BcnJheXMKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVMaXN0ZW5lclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEFkZGluZ0FuZFJlbW92aW5nQUNsb3N1cmVMaXN0ZW5lcigpIHsKLSAgICAgICAgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoJ2phdmEuYXd0LmhlYWRsZXNzJykKLSAgICAgICAgcHJpbnRsbigiVmFsdWUgb2YgamF2YS5hd3QuaGVhZGxlc3MgPSAke3ZhbHVlfSIpCi0gICAgICAgIAotICAgICAgICBiID0gbmV3IEpCdXR0b24oImZvbyIpCi0gICAgICAgIGIuYWN0aW9uUGVyZm9ybWVkID0geyBwcmludGxuKCJGb3VuZCAke2l0fSIpIH0KLQotICAgICAgICBzaXplID0gYi5hY3Rpb25MaXN0ZW5lcnMuc2l6ZSgpCi0gICAgICAgIGFzc2VydCBzaXplID09IDEKLSAgICAgICAgCi0gICAgICAgIGwgPSBiLmFjdGlvbkxpc3RlbmVyc1swXQotCQljb2RlID0gbC5oYXNoQ29kZSgpCi0gICAgICAgIAotICAgICAgICBwcmludGxuKCJsaXN0ZW5lcjogJHtsfSB3aXRoIGhhc2hDb2RlIGNvZGUgJHtjb2RlfSIpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbC50b1N0cmluZygpICE9ICJudWxsIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGwuZXF1YWxzKGIpID09IGZhbHNlCi0gICAgICAgIGFzc2VydCBsLmVxdWFscyhsKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGwuaGFzaENvZGUoKSAhPSAwCi0gICAgICAgIAotICAgICAgICBiLnJlbW92ZUFjdGlvbkxpc3RlbmVyKGwpCi0gICAgICAgIAotICAgICAgICBwcmludGxuKGIuYWN0aW9uTGlzdGVuZXJzKQotICAgICAgICAKLSAgICAgICAgc2l6ZSA9IGIuYWN0aW9uTGlzdGVuZXJzLnNpemUoKQotICAgICAgICBhc3NlcnQgc2l6ZSA9PSAwCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEdldHRpbmdBTGlzdGVuZXJQcm9wZXJ0eSgpIHsKLSAgICAJYiA9IG5ldyBKQnV0dG9uKCJmb28iKQotICAgIAlmb28gPSBiLmFjdGlvblBlcmZvcm1lZAotICAgIAlhc3NlcnQgZm9vID09IG51bGwKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZENhbGxUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RDYWxsVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjlmYzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZENhbGxUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVNZXRob2RDYWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdENhbGxpbmdDbG9zdXJlV2l0aE11bHRpcGxlQXJndW1lbnRzKCkgewotICAgICAgICBjbG9zdXJlID0geyBhLCBiIHwgZm9vID0gImhlbGxvICR7YX0gYW5kICR7Yn0iLnRvU3RyaW5nKCkgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGNsb3N1cmUoImphbWVzIiwgImJvYiIpCi0KLSAgICAgICAgYXNzZXJ0IGZvbyA9PSAiaGVsbG8gamFtZXMgYW5kIGJvYiIKLQotICAgICAgICBjbG9zdXJlLmNhbGwoInNhbSIsICJqYW1lcyIpCi0KLSAgICAgICAgYXNzZXJ0IGZvbyA9PSAiaGVsbG8gc2FtIGFuZCBqYW1lcyIKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgdm9pZCB0ZXN0U3lzdGVtT3V0UHJpbnRsbkFzQUNsb3N1cmUoKSB7Ci0gICAgICAgIGNsb3N1cmUgPSBTeXN0ZW0ub3V0LnByaW50bG4KLSAgICAgICAgY2xvc3VyZSgiSGVsbG8gd29ybGQiKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmZmU5Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotaW1wb3J0IGphdmEuaW8uRmlsZQotCi0vKiogCi0gKiBUZXN0cyB0aGUgdmFyaW91cyBDbG9zdXJlIG1ldGhvZHMgaW4gR3Jvb3Z5Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVNZXRob2RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TGlzdENvbGxlY3QoKSB7Ci0gICAgICAgIGxpc3QgPSBbMSwgMiwgMywgNF0KLSAgICAgICAgYW5zd2VyID0gbGlzdC5jb2xsZWN0KCB7aXRlbXwgcmV0dXJuIGl0ZW0gKiAyIH0gKQotCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKLSAgICAgICAgCi0gICAgICAgIGV4cGVjdGVkID0gWzIsIDQsIDYsIDhdCi0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNYXBDb2xsZWN0KCkgewotICAgICAgICBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQotICAgICAgICBhbnN3ZXIgPSBtYXAuY29sbGVjdCgge2V8IHJldHVybiBlLmtleSArIGUudmFsdWUgfSApCi0JCQotCQkvLyBsZXN0IHNvcnQgdGhlIHJlc3VsdHMgc2luY2UgbWFwcyBhcmUgaW4gaGFzaCBjb2RlIG9yZGVyCi0JCWFuc3dlciA9IGFuc3dlci5zb3J0KCkKLQkJCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbMywgNiwgOSwgMTJdCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDApID09IDMKLSAgICAgICAgYXNzZXJ0IGFuc3dlci5nZXQoMSkgPT0gNgotICAgICAgICBhc3NlcnQgYW5zd2VyLmdldCgyKSA9PSA5Ci0gICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDMpID09IDEyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGlzdEZpbmQoKSB7Ci0gICAgICAgIGxpc3QgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgICAgYW5zd2VyID0gbGlzdC5maW5kKCB7aXRlbXwgcmV0dXJuIGl0ZW0gPT0gImIiIH0pCi0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gImIiCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBsaXN0LmZpbmR7aXRlbXwgcmV0dXJuIGl0ZW0gPT0gInoiIH0KLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE1hcEZpbmQoKSB7Ci0gICAgICAgIG1hcCA9IFsxOjIsIDI6NCwgMzo2LCA0OjhdCi0gICAgICAgIGFuc3dlciA9IG1hcC5maW5kKCB7ZW50cnl8IHJldHVybiBlbnRyeS52YWx1ZSA9PSA2IH0pCi0gICAgICAgIGFzc2VydCBhbnN3ZXIgIT0gbnVsbAotICAgICAgICBhc3NlcnQgYW5zd2VyLmtleSA9PSAzCi0gICAgICAgIGFzc2VydCBhbnN3ZXIudmFsdWUgPT0gNgotICAgICAgICAKLSAgICAgICAgYW5zd2VyID0gbWFwLmZpbmR7ZW50cnl8IHJldHVybiBlbnRyeS52YWx1ZSA9PSAwIH0KLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGlzdEZpbmRBbGwoKSB7Ci0gICAgICAgIGxpc3QgPSBbMjAsIDUsIDQwLCAyXQotICAgICAgICBhbnN3ZXIgPSBsaXN0LmZpbmRBbGwoIHtpdGVtfCByZXR1cm4gaXRlbSA8IDEwIH0gKQotCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDIKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbNSwgMl0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWFwRmluZEFsbCgpIHsKLSAgICAgICAgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KLSAgICAgICAgYW5zd2VyID0gbWFwLmZpbmRBbGwoIHtlbnRyeXwgcmV0dXJuIGVudHJ5LnZhbHVlID4gNSB9KQotCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDIKLSAgICAgICAgCi0gICAgICAgIGtleXMgPSBhbnN3ZXIuY29sbGVjdCgge2VudHJ5fCByZXR1cm4gZW50cnkua2V5IH0pCi0gICAgICAgIHZhbHVlcyA9IGFuc3dlci5jb2xsZWN0IHtlbnRyeXwgcmV0dXJuIGVudHJ5LnZhbHVlIH0KLQotICAgICAgICBwcmludGxuKCJrZXlzICIgKyBrZXlzICsgIiB2YWx1ZXMgIiArIHZhbHVlcykKLQkJCi0gICAgICAgIC8vIG1hcHMgYXJlIGluIGhhc2ggb3JkZXIgc28gbGV0cyBzb3J0IHRoZSByZXN1bHRzICAgICAgIAotICAgICAgICBrZXlzLnNvcnQoKSAKLSAgICAgICAgdmFsdWVzLnNvcnQoKSAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBrZXlzID09IFszLCA0XQotICAgICAgICBhc3NlcnQgdmFsdWVzID09IFs2LCA4XQotICAgIH0KLQotICAgIHZvaWQgdGVzdExpc3RFYWNoKCkgewotICAgICAgICBjb3VudCA9IDAKLQotICAgICAgICBsaXN0ID0gWzEsIDIsIDMsIDRdCi0gICAgICAgIGxpc3QuZWFjaCh7aXRlbXwgY291bnQgPSBjb3VudCArIGl0ZW0gfSkKLQkJCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxMAotCi0gICAgICAgIGxpc3QuZWFjaHtpdGVtfCBjb3VudCA9IGNvdW50ICsgaXRlbSB9Ci0JCQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMjAKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNYXBFYWNoKCkgewotICAgICAgICBjb3VudCA9IDAKLQotICAgICAgICBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQotICAgICAgICBtYXAuZWFjaCh7ZXwgY291bnQgPSBjb3VudCArIGUudmFsdWUgfSkKLQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMjAKLSAgICAgICAgCi0gICAgICAgIG1hcC5lYWNoKHtlfCBjb3VudCA9IGNvdW50ICsgZS52YWx1ZSArIGUua2V5IH0pCi0JCQotICAgICAgICBhc3NlcnQgY291bnQgPT0gNTAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWFwRWFjaFdpdGgyUGFyYW1zKCkgewotICAgICAgICBjb3VudCA9IDAKLQotICAgICAgICBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQotICAgICAgICBtYXAuZWFjaCB7a2V5LCB2YWx1ZSB8IGNvdW50ID0gY291bnQgKyB2YWx1ZSB9Ci0KLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIwCi0gICAgICAgIAotICAgICAgICBtYXAuZWFjaCB7a2V5LCB2YWx1ZSB8IGNvdW50ID0gY291bnQgKyB2YWx1ZSArIGtleSB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgY291bnQgPT0gNTAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TGlzdEV2ZXJ5KCkgewotICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmV2ZXJ5IHtpfCByZXR1cm4gaSA8IDUgfQotICAgICAgICBhc3NlcnQgWzEsIDIsIDcsIDRdLmV2ZXJ5IHtpfCByZXR1cm4gaSA8IDUgfSA9PSBmYWxzZQotICAgIH0KLQotICAgIHZvaWQgdGVzdExpc3RBbnkoKSB7Ci0gICAgICAgIGFzc2VydCBbMSwgMiwgMywgNF0uYW55IHtpfCByZXR1cm4gaSA8IDUgfQotICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmFueSB7aXwgcmV0dXJuIGkgPiAzIH0KLSAgICAgICAgYXNzZXJ0IFsxLCAyLCAzLCA0XS5hbnkge2l8IHJldHVybiBpID4gNSB9ID09IGZhbHNlCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEpvaW4oKSB7Ci0gICAgICAgIHZhbHVlID0gWzEsIDIsIDNdLmpvaW4oJy0nKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gIjEtMi0zIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RMaXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgdmFsdWUgPSBbMSwgMiwgMywgNF0ucmV2ZXJzZSgpCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSBbNCwgMywgMiwgMV0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TGlzdEluamVjdCgpIHsKLSAgICAgICAgdmFsdWUgPSBbMSwgMiwgM10uaW5qZWN0KCdjb3VudGluZzogJykgeyBzdHIsIGl0ZW0gfCBzdHIgKyBpdGVtIH0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09ICJjb3VudGluZzogMTIzIgotCi0gICAgICAgIHZhbHVlID0gWzEsIDIsIDNdLmluamVjdCgwKSB7IGMsIGl0ZW0gfCBjICsgaXRlbSB9Ci0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSA2Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdER1bXAoKSB7Ci0gICAgICAgIHRleHQgPSBkdW1wKCkKLSAgICAgICAgcHJpbnRsbigiRHVtcGluZyBvYmplY3QgJHt0ZXh0fSIpCi0gICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGwgJiYgdGV4dC5zdGFydHNXaXRoKCI8IikKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RJbnNwZWN0KCkgewotICAgICAgICB0ZXh0ID0gWzEsIDIsICd0aHJlZSddLmluc3BlY3QoKQotICAgICAgICBwcmludGxuKCJJbnNwZWN0aW5nICR7dGV4dH0iKQotICAgICAgICBhc3NlcnQgdGV4dCA9PSAnWzEsIDIsICJ0aHJlZSJdJwotICAgIH0KLQotICAgIHZvaWQgdGVzdEVhY2hMaW5lKCkgewotICAgICAgICBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IikKLSAgICAgICAgaWYoZmlsZS5leGlzdHMoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiQmFyLmdyb292eSIpCi0gICAgICAgIAotICAgICAgICBwcmludGxuKCJDb250ZW50cyBvZiBmaWxlOiAiICsgZmlsZSkKLSAgICAgICAgCi0gICAgICAgIGZpbGUuZWFjaExpbmUgeyBsaW5lIHwgcHJpbnRsbihsaW5lKSB9Ci0gICAgICAgIAotICAgICAgICBwcmludGxuKCIiKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RGb3JFYWNoTGluZSgpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eSIpCi0gICAgICAgIGlmKGZpbGUuZXhpc3RzKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIkJhci5ncm9vdnkiKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiRm9yIGxvb3AgdG8gZGlzcGxheSBjb250ZW50cyBvZiBmaWxlOiAiICsgZmlsZSkKLSAgICAgICAgCi0gICAgICAgIGZvciAobGluZSBpbiBmaWxlKSB7IHByaW50bG4obGluZSkgfQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UmVhZExpbmVzKCkgewotICAgICAgICBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IikKLSAgICAgICAgaWYoZmlsZS5leGlzdHMoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiQmFyLmdyb292eSIpCi0KLQkJbGluZXMgPSBmaWxlLnJlYWRMaW5lcygpCi0JCQotCQlhc3NlcnQgbGluZXMgIT0gbnVsbAotCQlhc3NlcnQgbGluZXMuc2l6ZSgpID4gMAotCi0gICAgICAgIHByaW50bG4oIkZpbGUgaGFzOiAiICsgbGluZXMuc2l6ZSgpICsgIiBsaW5lKHMpIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RWFjaEZpbGUoKSB7Ci0gICAgICAgIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5IikKLSAgICAgICAgaWYoIWZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIi4iKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQ2xvc3VyZSBsb29wIHRvIGRpc3BsYXkgY29udGVudHMgb2YgZGlyOiAiICsgZmlsZSkKLSAgICAgICAgCi0gICAgICAgIGZpbGUuZWFjaEZpbGUgeyBmIHwgcHJpbnRsbihmLmdldE5hbWUoKSkgfQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VG9rZW5pemUoKSB7Ci0gICAgICAgIHRleHQgPSAiaGVsbG8tdGhlcmUtaG93LWFyZS15b3UiCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBbXQotICAgICAgICBmb3IgKGkgaW4gdGV4dC50b2tlbml6ZSgnLScpKSB7Ci0gICAgICAgICAgICBhbnN3ZXIuYWRkKGkpCi0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbJ2hlbGxvJywgJ3RoZXJlJywgJ2hvdycsICdhcmUnLCAneW91J10KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VXB0bygpIHsKLSAgICAgICAgYW5zd2VyID0gW10KLSAgICAgICAgCi0gICAgICAgIDEudXB0byg1KSB7IGFuc3dlci5hZGQoaXQpIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gWzEsIDIsIDMsIDQsIDVdCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVyblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTZiNTRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVSZXR1cm5UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKiAKLSAqIFRlc3RzIENsb3N1cmVzIGluIEdyb292eQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDbG9zdXJlUmV0dXJuVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFJldHVyblZhbHVlcygpIHsKLSAgICAgICAgYmxvY2sgPSB7eHwgcmV0dXJuIHggPiA1fQotICAgICAgICAKLSAgICAgICAgdmFsdWUgPSBibG9jay5jYWxsKDEwKQotICAgICAgICBhc3NlcnQgdmFsdWUKLQkgICAgCi0gICAgICAgIHZhbHVlID0gYmxvY2suY2FsbCgzKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gZmFsc2UKLSAgICB9Ci0JCi0gICAgdm9pZCB0ZXN0UmV0dXJuVmFsdWVVc2luZ0Z1bmN0aW9uKCkgewotICAgICAgICBibG9jayA9IHt4fCByZXR1cm4gc29tZUZ1bmN0aW9uKHgpIH0KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gYmxvY2suY2FsbCgxMCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlCi0KLSAgICAgICAgdmFsdWUgPSBibG9jay5jYWxsKDMpCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQotICAgIH0KLSAgICAKLSAgICBzb21lRnVuY3Rpb24oeCkgewotICAgICAgICByZXR1cm4geCA+IDUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlUmV0dXJuV2l0aG91dFJldHVyblN0YXRlbWVudFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVybldpdGhvdXRSZXR1cm5TdGF0ZW1lbnRUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZGUxZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlUmV0dXJuV2l0aG91dFJldHVyblN0YXRlbWVudFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotY2xhc3MgQ2xvc3VyZVJldHVybldpdGhvdXRSZXR1cm5TdGF0ZW1lbnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0UmV0dXJuVmFsdWVzKCkgewotICAgICAgICBibG9jayA9IHt4fCB4ID4gNX0KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gYmxvY2suY2FsbCgxMCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlCi0JICAgIAotICAgICAgICB2YWx1ZSA9IGJsb2NrLmNhbGwoMykKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IGZhbHNlCi0gICAgfQotCQotICAgIHZvaWQgdGVzdFJldHVyblZhbHVlVXNpbmdGdW5jdGlvbigpIHsKLSAgICAgICAgYmxvY2sgPSB7eHwgc29tZUZ1bmN0aW9uKHgpIH0KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gYmxvY2suY2FsbCgxMCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlCi0KLSAgICAgICAgdmFsdWUgPSBibG9jay5jYWxsKDMpCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQotICAgIH0KLSAgICAKLSAgICBzb21lRnVuY3Rpb24oeCkgewotICAgICAgICB4ID4gNQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVTdWdhclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVN1Z2FyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWVmMDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVN1Z2FyVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1jbGFzcyBDbG9zdXJlU3VnYXJUZXN0Ci0JZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQotewotICAgIHByb3BlcnR5IGNvdW50OwotCi0gICAgdm9pZCB0ZXN0Q2xvc3VyZVN1Z2FyKCkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gMTE7Ci0KLSAgICAgICAgc3VnYXIgewotICAgICAgICAgICAgIGNvdW50ID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMjA7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0TWl4ZWRDbG9zdXJlU3VnYXIoKQotICAgIHsKLSAgICAgICAgY291bnQgPSAxMTsKLQotICAgICAgICBtaXhlZFN1Z2FyICg1KXthfAotICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBhOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDE2OwotCi0gICAgfQotCi0gICAgbWl4ZWRTdWdhcihpbmNyQnksIENsb3N1cmUgY2xvc3VyZSkKLSAgICB7Ci0gICAgICAgIGNsb3N1cmUuY2FsbCggaW5jckJ5ICk7IAotICAgIH0KLQotICAgIHN1Z2FyKENsb3N1cmUgY2xvc3VyZSkKLSAgICB7Ci0gICAgICAgIGNsb3N1cmUuY2FsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZTYxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9DbG9zdXJlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqIAotICogVGVzdHMgQ2xvc3VyZXMgaW4gR3Jvb3Z5Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0JcHJvcGVydHkgY291bnQKLQotICAgIHZvaWQgdGVzdFNpbXBsZUJsb2NrQ2FsbCgpIHsKLSAgICAgICAgY291bnQgPSAwCi0KLSAgICAgICAgYmxvY2sgPSB7b3duZXJ8IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydENsb3N1cmUoYmxvY2spCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxCi0KLSAgICAgICAgYXNzZXJ0Q2xvc3VyZSh7b3duZXJ8IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0pCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0VmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJMaXN0KCkgewotCi0gICAgICAgIGMxID0ge3wgT2JqZWN0W10gYXJncyB8IGFyZ3MuZWFjaHtjb3VudCArPSBpdH19Ci0gICAgICAgIAotICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgYzEoMSwgMiwgMykKLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDYKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMAotICAgICAgICBjMSgxKQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMQotICAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMAotICAgICAgICBjMShuZXcgT2JqZWN0W117MSwgMiwgM30pCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSA2Ci0KLSAgICAgICAgYzIgPSB7fCBhLCBPYmplY3RbXSBhcmdzIHwgY291bnQgKz0gYTsgYXJncy5lYWNoe2NvdW50ICs9IGl0fX0KLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMAotICAgICAgICBjMigxLCAyLCAzKQotICAgICAgICBhc3NlcnQgY291bnQgPT0gNgotICAgICAgICAKLSAgICAgICAgY291bnQgPSAwCi0gICAgICAgIGMyKDEpCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxCi0gICAgICAgICAKLSAgICAgICAgY291bnQgPSAwCi0gICAgICAgIGMyKDEsIG5ldyBPYmplY3RbXXsyLCAzfSkKLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDYKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCbG9ja0FzUGFyYW1ldGVyKCkgewotICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgCi0gICAgICAgIGNhbGxCbG9jayg1LCB7b3duZXJ8IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0pCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSA2Ci0KLSAgICAgICAgY2FsbEJsb2NrMig1LCB7b3duZXJ8IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0pCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxMgotICAgIH0KLSAgCi0gICAgdm9pZCB0ZXN0TWV0aG9kQ2xvc3VyZSgpIHsKLSAgICAgICAgYmxvY2sgPSB0aGlzLmluY3JlbWVudENhbGxDb3VudAotCi0gICAgICAgIGNvdW50ID0gMAotICAJICAgIAotICAgICAgICBibG9jay5jYWxsKCkKLSAgCSAgICAKLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDEKLSAgCSAgICAgICAgCi0gICAgICAgIGJsb2NrID0gU3lzdGVtLm91dC5wcmludGxuCi0gIAkgICAgCi0gICAgICAgIGJsb2NrLmNhbGwoIkkganVzdCBpbnZva2VkIGEgY2xvc3VyZSEiKQotICAgIH0KLSAgCi0gICAgaW5jcmVtZW50Q2FsbENvdW50KCkgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaW52b2tlZCBpbmNyZW1lbnQgbWV0aG9kISIpCi0gICAgICAgIGNvdW50ID0gY291bnQgKyAxCi0gICAgfQotCQotICAgIGFzc2VydENsb3N1cmUoQ2xvc3VyZSBibG9jaykgewotICAgICAgICBhc3NlcnQgYmxvY2sgIT0gbnVsbAotICAgICAgICBibG9jay5jYWxsKHRoaXMpCi0gICAgfQotCQotICAgIHByb3RlY3RlZCBjYWxsQmxvY2soSW50ZWdlciBudW0sIENsb3N1cmUgYmxvY2spIHsKLSAgICAgICAgZm9yICggaSBpbiAwLi5udW0gKSB7Ci0gICAgICAgICAgICBibG9jay5jYWxsKHRoaXMpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgY2FsbEJsb2NrMihudW0sIGJsb2NrKSB7Ci0gICAgICAgIGZvciAoIGkgaW4gMC4ubnVtICkgewotICAgICAgICAgICAgYmxvY2suY2FsbCh0aGlzKQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpbnQgbnVtQWdlbnRzID0gNAotICAgIGJvb2xlYW4gdGVzdERvbmUgPSBmYWxzZQotCi0gICAgdm9pZCB0ZXN0SW50RmllbGRBY2Nlc3MoKSB7Ci0gICAgICAgIGFnZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbnVtQWdlbnRzLnRpbWVzIHsKLSAgICAgICAgICAgIFRpbnlBZ2VudCBidG4gPSBuZXcgVGlueUFnZW50KCkKLSAgICAgICAgICAgIHRlc3REb25lID0gdHJ1ZQotICAgICAgICAgICAgYnRuLnggPSBudW1BZ2VudHMKLSAgICAgICAgICAgIGFnZW50cy5hZGQoYnRuKQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBhZ2VudHMuc2l6ZSgpID09IG51bUFnZW50cwotICAgIH0KLX0KLQotcHVibGljIGNsYXNzIFRpbnlBZ2VudCB7Ci0gICAgaW50IHgKLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVVzaW5nT3V0ZXJWYXJpYWJsZXNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVVc2luZ091dGVyVmFyaWFibGVzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZGIxNzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVVzaW5nT3V0ZXJWYXJpYWJsZXNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVVc2luZ091dGVyVmFyaWFibGVzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RVc2VPZk91dGVyVmFyaWFibGUoKSB7Ci0gICAgICAgIAotICAgICAgICB4ID0gMTIzCi0gICAgICAgIHkgPSAiaGVsbG8iCi0gICAgICAgIAotICAgICAgICBjbG9zdXJlID0geyBpIHwgCi0gICAgICAgICAgICBwcmludGxuKCJ4ICR7eH0iKQotICAgICAgICAgICAgcHJpbnRsbigieSAke3l9IikKLSAgICAgICAgICAgIHByaW50bG4oImkgJHtpfSIpCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgeCA9PSAxMjMKLSAgICAgICAgICAgIGFzc2VydCB5ID09ICdoZWxsbycKLSAgICAgICAgfQotICAgICAgICBjbG9zdXJlLmNhbGwoMzIxKQotCX0KLQotICAgICB2b2lkIHRlc3RJbm5lclZhcmlhYmxlc1Zpc2libGVJbk91dGVyU2NvcGUoKSB7Ci0gICAgICAgIAotICAgICAgICBjbG9zdXJlID0geyB6ID0gNDU2IH0gCi0gICAgICAgIGNsb3N1cmUuY2FsbCgzMjEpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeiA9PSA0NTYKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TW9kaWZ5aW5nT3V0ZXJWYXJpYWJsZSgpIHsKLSAgICAgICAgCi0gICAgICAgIG0gPSAxMjMKLSAgICAgICAgCi0gICAgICAgIGNsb3N1cmUgPSB7IG0gPSA0NTYgfSAKLSAgICAgICAgY2xvc3VyZS5jYWxsKDMyMSkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBtID09IDQ1NgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDb3VudGluZygpIHsKLSAgICAgICAgc3VtID0gMAotCi0gICAgICAgIFsxLCAyLCAzLCA0XS5lYWNoIHsgc3VtID0gc3VtICsgaXQgfQotCi0gICAgICAgIGFzc2VydCBzdW0gPT0gMTAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RXhhbXBsZVVzZU9mQ2xvc3VyZVNjb3BlcygpIHsKLSAgICAgICAgYSA9IDEyMwotCQkKLSAgICAgICAgYyA9IHsgYiA9IGEgKyBpdCB9Ci0gICAgICAgIGMoNSkKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4oYikKLSAgICAgICAgYXNzZXJ0IGIgPT0gYSArIDUKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RFeGFtcGxlVXNlT2ZDbG9zdXJlU2NvcGVzVXNpbmdFYWNoKCkgewotICAgICAgICBhID0gMTIzCi0gICAgICAgIAotICAgICAgICBbNV0uZWFjaCB7IGIgPSBhICsgaXQgfQotCi0gICAgICAgIGFzc2VydCBiID09IGEgKyA1Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVXaXRoRGVmYXVsdFBhcmFtVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDQ3YmIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi1pbXBvcnQgamF2YS5pby5GaWxlCi0KLS8qKiAKLSAqIERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IG5hbWVkIHBhcmFtZXRlciBpbiBhIGNsb3N1cmUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TGlzdENvbGxlY3QoKSB7Ci0gICAgICAgIGxpc3QgPSBbMSwgMiwgMywgNF0KLSAgICAgICAgYW5zd2VyID0gbGlzdC5jb2xsZWN0IHsgaXQgKiAyIH0KLQotICAgICAgICBhc3NlcnQgYW5zd2VyLnNpemUoKSA9PSA0Ci0gICAgICAgIAotICAgICAgICBleHBlY3RlZCA9IFsyLCA0LCA2LCA4XQotICAgICAgICBhc3NlcnQgYW5zd2VyID09IGV4cGVjdGVkCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TWFwQ29sbGVjdCgpIHsKLSAgICAgICAgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KLSAgICAgICAgYW5zd2VyID0gbWFwLmNvbGxlY3QgeyBpdC5rZXkgKyBpdC52YWx1ZSB9Ci0JCQotCQkvLyBsZXN0IHNvcnQgdGhlIHJlc3VsdHMgc2luY2UgbWFwcyBhcmUgaW4gaGFzaCBjb2RlIG9yZGVyCi0JCWFuc3dlciA9IGFuc3dlci5zb3J0KCkKLQkJCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbMywgNiwgOSwgMTJdCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDApID09IDMKLSAgICAgICAgYXNzZXJ0IGFuc3dlci5nZXQoMSkgPT0gNgotICAgICAgICBhc3NlcnQgYW5zd2VyLmdldCgyKSA9PSA5Ci0gICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDMpID09IDEyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGlzdEZpbmQoKSB7Ci0gICAgICAgIGxpc3QgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgICAgYW5zd2VyID0gbGlzdC5maW5kIHtpdCA9PSAiYiIgfQotICAgICAgICBhc3NlcnQgYW5zd2VyID09ICJiIgotICAgICAgICAKLSAgICAgICAgYW5zd2VyID0gbGlzdC5maW5kIHtpdCA9PSAieiIgfQotICAgICAgICBhc3NlcnQgYW5zd2VyID09IG51bGwKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWFwRmluZCgpIHsKLSAgICAgICAgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KLSAgICAgICAgYW5zd2VyID0gbWFwLmZpbmQge2l0LnZhbHVlID09IDYgfQotICAgICAgICBhc3NlcnQgYW5zd2VyICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IGFuc3dlci5rZXkgPT0gMwotICAgICAgICBhc3NlcnQgYW5zd2VyLnZhbHVlID09IDYKLSAgICAgICAgCi0gICAgICAgIGFuc3dlciA9IG1hcC5maW5kIHtpdC52YWx1ZSA9PSAwIH0KLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGlzdEZpbmRBbGwoKSB7Ci0gICAgICAgIGxpc3QgPSBbMjAsIDUsIDQwLCAyXQotICAgICAgICBhbnN3ZXIgPSBsaXN0LmZpbmRBbGwge2l0IDwgMTAgfQotCi0gICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDIKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbNSwgMl0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWFwRmluZEFsbCgpIHsKLSAgICAgICAgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KLSAgICAgICAgYW5zd2VyID0gbWFwLmZpbmRBbGwge2l0LnZhbHVlID4gNSB9Ci0KLSAgICAgICAgYXNzZXJ0IGFuc3dlci5zaXplKCkgPT0gMgotICAgICAgICAKLSAgICAgICAga2V5cyA9IGFuc3dlci5jb2xsZWN0IHtpdC5rZXkgfQotICAgICAgICB2YWx1ZXMgPSBhbnN3ZXIuY29sbGVjdCB7aXQudmFsdWUgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigia2V5cyAiICsga2V5cyArICIgdmFsdWVzICIgKyB2YWx1ZXMpCi0JCQotICAgICAgICAvLyBtYXBzIGFyZSBpbiBoYXNoIG9yZGVyIHNvIGxldHMgc29ydCB0aGUgcmVzdWx0cyAgICAgICAKLSAgICAgICAga2V5cy5zb3J0KCkgCi0gICAgICAgIHZhbHVlcy5zb3J0KCkgCi0gICAgICAgIAotICAgICAgICBhc3NlcnQga2V5cyA9PSBbMywgNF0KLSAgICAgICAgYXNzZXJ0IHZhbHVlcyA9PSBbNiwgOF0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RMaXN0RWFjaCgpIHsKLSAgICAgICAgY291bnQgPSAwCi0KLSAgICAgICAgbGlzdCA9IFsxLCAyLCAzLCA0XQotICAgICAgICBsaXN0LmVhY2ggeyBjb3VudCA9IGNvdW50ICsgaXQgfQotCQkKLSAgICAgICAgYXNzZXJ0IGNvdW50ID09IDEwCi0KLSAgICAgICAgbGlzdC5lYWNoIHsgY291bnQgPSBjb3VudCArIGl0IH0KLQkJCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAyMAotICAgIH0KLQotICAgIHZvaWQgdGVzdE1hcEVhY2goKSB7Ci0gICAgICAgIGNvdW50ID0gMAotCi0gICAgICAgIG1hcCA9IFsxOjIsIDI6NCwgMzo2LCA0OjhdCi0gICAgICAgIG1hcC5lYWNoIHsgY291bnQgPSBjb3VudCArIGl0LnZhbHVlIH0KLQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMjAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TGlzdEV2ZXJ5KCkgewotICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmV2ZXJ5IHsgaXQgPCA1IH0KLSAgICAgICAgYXNzZXJ0IFsxLCAyLCA3LCA0XS5ldmVyeSB7IGl0IDwgNSB9ID09IGZhbHNlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGlzdEFueSgpIHsKLSAgICAgICAgYXNzZXJ0IFsxLCAyLCAzLCA0XS5hbnkgeyBpdCA8IDUgfQotICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmFueSB7IGl0ID4gMyB9Ci0gICAgICAgIGFzc2VydCBbMSwgMiwgMywgNF0uYW55IHsgaXQgPiA1IH0gPT0gZmFsc2UKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Sm9pbigpIHsKLSAgICAgICAgdmFsdWUgPSBbMSwgMiwgM10uam9pbignLScpCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiMS0yLTMiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdExpc3RSZXZlcnNlKCkgewotICAgICAgICB2YWx1ZSA9IFsxLCAyLCAzLCA0XS5yZXZlcnNlKCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IFs0LCAzLCAyLCAxXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RFYWNoTGluZSgpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eSIpCi0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRlbnRzIG9mIGZpbGU6ICIgKyBmaWxlKQotICAgICAgICAKLSAgICAgICAgZmlsZS5lYWNoTGluZSB7IHByaW50bG4oaXQpIH0KLSAgICAgICAgCi0gICAgICAgIHByaW50bG4oIiIpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFJlYWRMaW5lcygpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eSIpCi0KLQkJbGluZXMgPSBmaWxlLnJlYWRMaW5lcygpCi0JCQotCQlhc3NlcnQgbGluZXMgIT0gbnVsbAotCQlhc3NlcnQgbGluZXMuc2l6ZSgpID4gMAotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBoYXMgbnVtYmVyIG9mIGxpbmVzOiAiICsgbGluZXMuc2l6ZSgpKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RFYWNoRmlsZSgpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkiKQotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50cyBvZiBkaXI6ICIgKyBmaWxlKQotICAgICAgICAKLSAgICAgICAgZmlsZS5lYWNoRmlsZSB7IHByaW50bG4oaXQuZ2V0TmFtZSgpKSB9Ci0gICAgICAgIAotICAgICAgICBwcmludGxuKCIiKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVUb1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZVRvVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODY3YWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZVRvVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1jbGFzcyBDb21wYXJlVG9UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgewotCi0gICAgICAgIGEgPSAxMgotICAgICAgICBiID0gMjAKLSAgICAgICAgYyA9IDMwCi0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBhIDw9PiBiCi0gICAgICAgIGFzc2VydCByZXN1bHQgPCAwCi0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBhIDw9PiAxMgotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IDAKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGMgPD0+IGIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA+IDAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhIDw9PiBiIDwgMAotICAgICAgICBhc3NlcnQgYSA8PT4gMTIgPT0gMAotICAgICAgICBhc3NlcnQgYyA8PT4gYiA+IDAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TnVsbENvbXBhcmVzKCkgewotICAgIAotICAgIAlhID0gMTIzCi0gICAgCWIgPSBudWxsCi0gICAgCQotICAgIAlyZXN1bHQgPSBhIDw9PiBiCi0gICAgCWFzc2VydCByZXN1bHQgPiAwCi0gICAgCQotICAgIAlyZXN1bHQgPSBiIDw9PiBhCi0gICAgCWFzc2VydCByZXN1bHQgPCAwCi0gICAgCQotICAgIAlyZXN1bHQgPSBiIDw9PiBudWxsCi0gICAgCWFzc2VydCByZXN1bHQgPT0gMAotICAgCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVUeXBlc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZVR5cGVzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMThiOGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZVR5cGVzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgTnVtYmVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsgCi0gICAgdm9pZCB0ZXN0Q29tcGFyZUJ5dGVUb0ludCgpIHsgCi0gICAgICAgIEJ5dGUgYSA9IDEyCi0gICAgICAgIEludGVnZXIgYiA9IDEwCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYSBpbnN0YW5jZW9mIEJ5dGUKLSAgICAgICAgYXNzZXJ0IGIgaW5zdGFuY2VvZiBJbnRlZ2VyCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYSA+IGIKLSAgICB9IAotICAgIAotICAgIHZvaWQgdGVzdENvbXBhcmVCeXRlVG9Eb3VibGUoKSB7IAotICAgICAgICBCeXRlIGEgPSAxMgotICAgICAgICBEb3VibGUgYiA9IDEwCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYSBpbnN0YW5jZW9mIEJ5dGUKLSAgICAgICAgYXNzZXJ0IGIgaW5zdGFuY2VvZiBEb3VibGUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhID4gYgotICAgIH0gCi0gICAgIAotICAgIHZvaWQgdGVzdENvbXBhcmVMb25nVG9Eb3VibGUoKSB7IAotICAgICAgICBMb25nIGEgPSAxMgotICAgICAgICBEb3VibGUgYiA9IDEwCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYSBpbnN0YW5jZW9mIExvbmcKLSAgICAgICAgYXNzZXJ0IGIgaW5zdGFuY2VvZiBEb3VibGUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhID4gYgotICAgIH0gCi0gICAgIAotICAgIHZvaWQgdGVzdENvbXBhcmVMb25nVG9CeXRlKCkgeyAKLSAgICAgICAgTG9uZyBhID0gMTIKLSAgICAgICAgQnl0ZSBiID0gMTAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgTG9uZwotICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIEJ5dGUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhID4gYgotICAgIH0gCi0gICAgIAotICAgIHZvaWQgdGVzdENvbXBhcmVJbnRlZ2VyVG9CeXRlKCkgeyAKLSAgICAgICAgSW50ZWdlciBhID0gMTIKLSAgICAgICAgQnl0ZSBiID0gMTAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgSW50ZWdlcgotICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIEJ5dGUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBhID4gYgotICAgIH0gCi19IAotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBpbGVyRXJyb3JUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBpbGVyRXJyb3JUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOGMwOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Db21waWxlckVycm9yVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1jbGFzcyBDb21waWxlckVycm9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEJhZE1ldGhvZE5hbWUoKSB7Ci0KLSAgICAgICAgc2hvdWxkRmFpbCB7Ci0gICAgICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCi0gICAgICAgICAgICB0ZXh0ID0gJ3ByaW50bG4gJHtuYW1lfScKLSAgICAgICAgICAgIHByaW50bG4gIkFib3V0IHRvIHRlc3Qgc2NyaXB0ICR7dGV4dH0iCi0gICAgICAgICAgICBzaGVsbC5ldmFsdWF0ZSB0ZXh0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCYWRQcm9wZXJ0eU5hbWUoKSB7Ci0KLSAgICAgICAgc2hvdWxkRmFpbCB7Ci0gICAgICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCi0gICAgICAgICAgICBzaGVsbC5ldmFsdWF0ZSAiIiIKLSAgICAgICAgICAgICAgICB4ID0gWzpdCi0gICAgICAgICAgICAgICAgeC4kZm9vID0gMTIzCi0gICAgICAgICAgICAiIiIKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdGVzdEJhZFZhcmlhYmxlTmFtZSgpIHsKLQotICAgICAgICBzaG91bGRGYWlsIHsKLSAgICAgICAgICAgIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCkKLSAgICAgICAgICAgIHNoZWxsLmV2YWx1YXRlICIiIgotICAgICAgICAgICAgICAgICR4ID0gMTIzCi0gICAgICAgICAgICAiIiIKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RhdGVUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RhdGVUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxYTJmOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9EYXRlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkRhdGUKLQotY2xhc3MgRGF0ZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gIAotICAgIHZvaWQgdGVzdE5leHRQcmV2aW91cygpIHsKLSAgICAgICAgeCA9IG5ldyBEYXRlKCkKLSAgICAgICAgeSA9IHggKyAyCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA8IHkKLSAgICAgICAgeCsrCi0gICAgICAgIHktLQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0geQotICAgICAgICB4ICs9IDIKLSAgICAgICAgYXNzZXJ0IHggPiB5Ci0gICAgICAgIAotICAgICAgICBwcmludGxuICJoYXZlIGRhdGVzICR7eH0gYW5kICR7eX0iCi0JfQotICAgIAotICAgIHZvaWQgdGVzdERhdGVSYW5nZSgpIHsKLSAgICAgICAgCi0gICAgICAgIHRvZGF5ID0gbmV3IERhdGUoKQotICAgICAgICBsYXRlciA9IHRvZGF5ICsgMwotICAgICAgICAKLSAgICAgICAgZXhwZWN0ZWQgPSBbdG9kYXksIHRvZGF5ICsgMSwgdG9kYXkgKyAyLCB0b2RheSArIDNdCi0gICAgICAgIAotICAgICAgICBsaXN0ID0gW10KLSAgICAgICAgZm9yIChkIGluIHRvZGF5Li5sYXRlcikgewotICAgICAgICAgICAgbGlzdCA8PCBkCi0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGxpc3QgPT0gZXhwZWN0ZWQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9EZWZhdWx0UGFyYW1DbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9EZWZhdWx0UGFyYW1DbG9zdXJlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjhkZGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRGVmYXVsdFBhcmFtQ2xvc3VyZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotY2xhc3MgRGVmYXVsdFBhcmFtQ2xvc3VyZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3REZWZhdWx0UGFyYW1ldGVycygpIHsKLSAgICAvKiogQHRvZG8gZ2V0IGRlZmF1bHQgcGFyYW1ldGVycyB3b3JraW5nIGZvciBjbG9zdXJlcyAKLQkJZG9Tb21ldGhpbmcgPSB7IHwgYSwgYiA9ICdkZWZCJywgYyA9ICdkZWZDJyB8Ci0JCQlwcmludGxuICJDYWxsZWQgd2l0aCBhOiAke2F9LCBiICR7Yn0sIGMgJHtjfSIKLQkJCQotCQkJcmV0dXJuIGEgKyAiLSIgKyBiICsgIi0iICsgYwotCQl9Ci0JCi0gICAgCXZhbHVlID0gZG9Tb21ldGhpbmcoIlgiLCAiWSIsICJaIikKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktWiIKLSAgICAJCi0gICAgCXZhbHVlID0gZG9Tb21ldGhpbmcoIlgiLCAiWSIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1ZLWRlZkMiCi0gICAgCQotICAgIAl2YWx1ZSA9IGRvU29tZXRoaW5nKCJYIikKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJYLWRlZkItZGVmQyIKLSAgICAJCi0gICAgCXNob3VsZEZhaWwgeyBkb1NvbWV0aGluZygpIH0KLSAgICAgKi8KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3REZWZhdWx0VHlwZWRQYXJhbWV0ZXJzKCkgewotCQkvKiogQHRvZG8gcGFyc2VyIHRvIGhhbmRsZSB0eXBlZCBwYXJhbWV0ZXJzIAotCQkKLQkJZG9UeXBlZFNvbWV0aGluZyA9IHsgfCBTdHJpbmcgYSA9ICdkZWZBJywgU3RyaW5nIGIgPSAnZGVmQicsIFN0cmluZyBjID0gJ2RlZkMnIHwKLQkJCXByaW50bG4gIkNhbGxlZCB0eXBlZCBtZXRob2Qgd2l0aCBhOiAke2F9LCBiICR7Yn0sIGMgJHtjfSIKLQkJCQotCQkJcmV0dXJuIGEgKyAiLSIgKyBiICsgIi0iICsgYwotCQl9Ci0JCi0gICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygiWCIsICJZIiwgIloiKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1aIgotICAgIAkKLSAgICAJdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nKCJYIiwgIlkiKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1kZWZDIgotICAgIAkKLSAgICAJdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nKCJYIikKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJYLWRlZkItZGVmQyIKLSAgICAJCi0gICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiZGVmQS1kZWZCLWRlZkMiCi0JKi8KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9EZWZhdWx0UGFyYW1UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2U1ZWNiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotY2xhc3MgRGVmYXVsdFBhcmFtVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdERlZmF1bHRQYXJhbWV0ZXJzKCkgewotICAgIAotICAgIAl2YWx1ZSA9IGRvU29tZXRoaW5nKCJYIiwgIlkiLCAiWiIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1ZLVoiCi0gICAgCQotICAgIAl2YWx1ZSA9IGRvU29tZXRoaW5nKCJYIiwgIlkiKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1kZWZDIgotICAgIAkKLSAgICAJdmFsdWUgPSBkb1NvbWV0aGluZygiWCIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1kZWZCLWRlZkMiCi0gICAgCQotICAgIAlzaG91bGRGYWlsIHsgZG9Tb21ldGhpbmcoKSB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0RGVmYXVsdFR5cGVkUGFyYW1ldGVycygpIHsKLSAgICAJdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nKCJYIiwgIlkiLCAiWiIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1ZLVoiCi0gICAgCQotICAgIAl2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoIlgiLCAiWSIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1ZLWRlZkMiCi0gICAgCQotICAgIAl2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoIlgiKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtZGVmQi1kZWZDIgotICAgIAkKLSAgICAJdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nKCkKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJkZWZBLWRlZkItZGVmQyIKLSAgICB9Ci0KLQotCWRvU29tZXRoaW5nKGEsIGIgPSAnZGVmQicsIGMgPSAnZGVmQycpIHsKLQkJcHJpbnRsbiAiQ2FsbGVkIHdpdGggYTogJHthfSwgYiAke2J9LCBjICR7Y30iCi0JCQotCQlyZXR1cm4gYSArICItIiArIGIgKyAiLSIgKyBjCi0JfQotCi0JU3RyaW5nIGRvVHlwZWRTb21ldGhpbmcoU3RyaW5nIGEgPSAnZGVmQScsIFN0cmluZyBiID0gJ2RlZkInLCBTdHJpbmcgYyA9ICdkZWZDJykgewotCQlwcmludGxuICJDYWxsZWQgdHlwZWQgbWV0aG9kIHdpdGggYTogJHthfSwgYiAke2J9LCBjICR7Y30iCi0JCQotCQlyZXR1cm4gYSArICItIiArIGIgKyAiLSIgKyBjCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RvbGxhckVzY2FwaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Eb2xsYXJFc2NhcGluZ1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk0NmYzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RvbGxhckVzY2FwaW5nVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1jbGFzcyBEb2xsYXJFc2NhcGluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RFc2NhcGluZygpIHsKLSAgICAgICAgZm9vID0gImhlbGxvIFwke2Zvb30iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vIGluc3RhbmNlb2YgU3RyaW5nCi0gICAgICAgIAotICAgICAgICBjID0gZm9vLmNvdW50KCIkIikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjID09IDEgOiBmb28KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Eb3VibGVPcGVyYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RvdWJsZU9wZXJhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA4ODFiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0RvdWJsZU9wZXJhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotY2xhc3MgRG91YmxlT3BlcmF0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3BlcnR5IHgKLSAgICBwcm9wZXJ0eSB5Ci0gICAgCi0gICAgdm9pZCB0ZXN0UGx1cygpIHsKLSAgICAgICAgeCA9IDIuMSArIDIuMQotICAgICAgICBhc3NlcnQgeCA9PSA0LjIKLSAgICAgICAgCi0gICAgICAgIHggPSAzICsgMi4yCi0gICAgICAgIGFzc2VydCB4ID09IDUuMgotICAgICAgICAKLSAgICAgICAgeCA9IDIuMiArIDQKLSAgICAgICAgYXNzZXJ0IHggPT0gNi4yCi0gICAgICAgIAotICAgICAgICB5ID0geCArIDEKLSAgICAgICAgYXNzZXJ0IHkgPT0gNy4yICAgICAgIAotICAgICAgICAJCi0gICAgICAgIHogPSB5ICsgeCArIDEgKyAyCi0gICAgICAgIGFzc2VydCB6ID09IDE2LjQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWludXMoKSB7Ci0gICAgICAgIHggPSA2IC0gMi4yCi0gICAgICAgIGFzc2VydCB4ID09IDMuOAotICAgICAgICAKLSAgICAgICAgeCA9IDUuOCAtIDIKLSAgICAgICAgYXNzZXJ0IHggPT0gMy44Ci0gICAgICAgIAotICAgICAgICB5ID0geCAtIDEKLQkJYXNzZXJ0IHkgPT0gMi44ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TXVsdGlwbHkoKSB7Ci0gICAgICAgIHggPSAzICogMi4wCi0gICAgICAgIGFzc2VydCB4ID09IDYuMAotICAgICAgICAKLSAgICAgICAgeCA9IDMuMCAqIDIKLSAgICAgICAgYXNzZXJ0IHggPT0gNi4wCi0gICAgICAgIAotICAgICAgICB4ID0gMy4wICogMi4wCi0gICAgICAgIGFzc2VydCB4ID09IDYuMAotICAgICAgICB5ID0geCAqIDIKLSAgICAgICAgYXNzZXJ0IHkgPT0gMTIuMCAgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdERpdmlkZSgpIHsKLSAgICAgICAgeCA9IDgwLjAgLyA0Ci0gICAgICAgIGFzc2VydCB4ID09IDIwLjAgOiAieCA9ICIgKyB4Ci0gICAgICAgIAotICAgICAgICB4ID0gODAgLyA0LjAKLSAgICAgICAgYXNzZXJ0IHggPT0gMjAuMCA6ICJ4ID0gIiArIHgKLSAgICAgICAgCi0gICAgICAgIHkgPSB4IC8gMgotICAgICAgICBhc3NlcnQgeSA9PSAxMC4wIDogInkgPSAiICsgeSAgICAgCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TWV0aG9kTm90Rm91bmQoKSB7Ci0gICAgCXRyeSB7Ci0gICAgCQlwcmludGxuKCBNYXRoLnNpbigiZm9vIiwgNykgKTsKLQkgICAgCWZhaWwoIlNob3VsZCBjYXRjaCBhIE1pc3NpbmdNZXRob2RFeGNlcHRpb24iKTsKLSAgICAJfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKLSAgICAJfQotICAgIH0KLSAgICAgICAgCi0gICAgdm9pZCB0ZXN0Q29lcmNlKCkgewotICAgIAl4eXogPSBNYXRoLnNpbigxLjEpOwotICAgIAlhc3NlcnQgeHl6IGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgeHl6ID09IE1hdGguc2luKDEuMUQpOwotICAgIAkKLSAgICAgICAgLy9Ob3RlIHRoYXQgKDcuM0YpLmRvdWJsZVZhbHVlKCkgIT0gNy4zRAotICAgIAl4ID0gTWF0aC5zaW4oNy4zRik7Ci0gICAgCWFzc2VydCB4IGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgeCA9PSBNYXRoLnNpbigoNy4zRikuZG91YmxlVmFsdWUoKSk7Ci0KLSAgICAJeCA9IE1hdGguc2luKDcpOwotICAgIAlhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IHggPT0gTWF0aC5zaW4oNy4wRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRHVtbXlJbnRlcmZhY2UuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWRkYzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRHVtbXlJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBncm9vdnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHVtbXlJbnRlcmZhY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kV2l0aEFycmF5UGFyYW0oU3RyaW5nW10gYXJncyk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9EdW1teU1ldGhvZHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15TWV0aG9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQ5NzY5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15TWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqCi0gKiBtZXRob2RzIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVycyAoZS5nLiBwcmltaXRpdmVzKQotICogZm9yIHVzZSB3aXRoIGdyb292eSB0ZXN0cwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wYWNrYWdlIGdyb292eTsKLQotcHVibGljIGNsYXNzIER1bW15TWV0aG9kcyB7Ci0gICAgcHVibGljIFN0cmluZyBmb28oU3RyaW5nIGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKLSAgICAJcmV0dXJuICJmbG9hdCBhcmdzIjsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBmb28oU3RyaW5nIGEsIGludCBiLCBpbnQgYykgewotICAgIAlyZXR1cm4gImludCBhcmdzIjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRXNjYXBlZFVuaWNvZGVUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0VzY2FwZWRVbmljb2RlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmQ2Y2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRXNjYXBlZFVuaWNvZGVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLVx1MDA2M1x1MDA2Y1x1MDA2MVx1MDA3M1x1MDA3M1x1MDAyMFx1MDA0NVx1MDA3M1x1MDA2M1x1MDA2MVx1MDA3MFx1MDA2NVx1MDA2NFx1MDA1NVx1MDA2ZVx1MDA2OVx1MDA2M1x1MDA2Zlx1MDA2NFx1MDA2NVx1MDA1NFx1MDA2NVx1MDA3M1x1MDA3NFx1MDAyMFx1MDA2NVx1MDA3OFx1MDA3NFx1MDA2NVx1MDA2ZVx1MDA2NFx1MDA3M1x1MDAyMFx1MDA0N1x1MDA3Mlx1MDA2Zlx1MDA2Zlx1MDA3Nlx1MDA3OVx1MDA1NFx1MDA2NVx1MDA3M1x1MDA3NFx1MDA0M1x1MDA2MVx1MDA3M1x1MDA2NVx1MDAyMFx1MDA3YgotCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNzZcdTAwNmZcdTAwNjlcdTAwNjRcdTAwMjBcdTAwNzRcdTAwNjVcdTAwNzNcdTAwNzRcdTAwNDFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjhcdTAwMjlcdTAwMjBcdTAwN2IKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA3OFx1MDAyMFx1MDAzZFx1MDAyMFx1MDAyMlx1MDA2MVx1MDA2Mlx1MDA2M1x1MDAyMgotCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNjFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjBcdTAwNzhcdTAwMjBcdTAwMjFcdTAwM2RcdTAwMjBcdTAwMjJcdTAwNjZcdTAwNmZcdTAwNmZcdTAwMjIKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2MVx1MDA3M1x1MDA3M1x1MDA2NVx1MDA3Mlx1MDA3NFx1MDAyMFx1MDA3OFx1MDAyMFx1MDAyMVx1MDAzZFx1MDAyMFx1MDAyMFx1MDA2ZVx1MDA3NVx1MDA2Y1x1MDA2YwotXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDc4XHUwMDIwXHUwMDIxXHUwMDNkXHUwMDIwXHUwMDIyXHUwMDY0XHUwMDY1XHUwMDY2XHUwMDIyCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNjFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjBcdTAwNzhcdTAwMjBcdTAwM2RcdTAwM2RcdTAwMjBcdTAwMjJcdTAwNjFcdTAwNjJcdTAwNjNcdTAwMjIKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMAotXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDc4XHUwMDJlXHUwMDY1XHUwMDcxXHUwMDc1XHUwMDYxXHUwMDZjXHUwMDczXHUwMDI4XHUwMDIyXHUwMDYxXHUwMDYyXHUwMDYzXHUwMDIyXHUwMDI5Ci1cdTAwMDlcdTAwN2QKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMAotXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDc2XHUwMDZmXHUwMDY5XHUwMDY0XHUwMDIwXHUwMDc0XHUwMDY1XHUwMDczXHUwMDc0XHUwMDU1XHUwMDZlXHUwMDZiXHUwMDZlXHUwMDZmXHUwMDc3XHUwMDZlXHUwMDU2XHUwMDYxXHUwMDcyXHUwMDY5XHUwMDYxXHUwMDYyXHUwMDZjXHUwMDY1XHUwMDI4XHUwMDI5XHUwMDIwXHUwMDdiCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNzRcdTAwNzJcdTAwNzlcdTAwMjBcdTAwN2IKLVx1MDAwOVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA3OVx1MDAyMFx1MDAzZFx1MDAyMFx1MDA3OAotXHUwMDA5XHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDY2XHUwMDYxXHUwMDY5XHUwMDZjXHUwMDI4XHUwMDIyXHUwMDc4XHUwMDIwXHUwMDY5XHUwMDczXHUwMDIwXHUwMDc1XHUwMDZlXHUwMDY0XHUwMDY1XHUwMDY2XHUwMDY5XHUwMDZlXHUwMDY1XHUwMDY0XHUwMDJjXHUwMDIwXHUwMDczXHUwMDY4XHUwMDZmXHUwMDc1XHUwMDZjXHUwMDY0XHUwMDIwXHUwMDc0XHUwMDY4XHUwMDcyXHUwMDZmXHUwMDc3XHUwMDIwXHUwMDYxXHUwMDZlXHUwMDIwXHUwMDY1XHUwMDc4XHUwMDYzXHUwMDY1XHUwMDcwXHUwMDc0XHUwMDY5XHUwMDZmXHUwMDZlXHUwMDIyXHUwMDI5Ci1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwN2QKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2M1x1MDA2MVx1MDA3NFx1MDA2M1x1MDA2OFx1MDAyMFx1MDAyOFx1MDA0ZFx1MDA2OVx1MDA3M1x1MDA3M1x1MDA2OVx1MDA2ZVx1MDA2N1x1MDA1MFx1MDA3Mlx1MDA2Zlx1MDA3MFx1MDA2NVx1MDA3Mlx1MDA3NFx1MDA3OVx1MDA0NVx1MDA3OFx1MDA2M1x1MDA2NVx1MDA3MFx1MDA3NFx1MDA2OVx1MDA2Zlx1MDA2ZVx1MDAyMFx1MDA2NVx1MDAyOVx1MDAyMFx1MDA3YgotXHUwMDA5XHUwMDA5XHUwMDA5XHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDY1XHUwMDJlXHUwMDY3XHUwMDY1XHUwMDc0XHUwMDUwXHUwMDcyXHUwMDZmXHUwMDcwXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDc5XHUwMDI4XHUwMDI5XHUwMDIwXHUwMDNkXHUwMDNkXHUwMDIwXHUwMDIyXHUwMDc4XHUwMDIyXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNzRcdTAwNjVcdTAwNzhcdTAwNzRcdTAwMjBcdTAwM2RcdTAwMjBcdTAwNjVcdTAwMmVcdTAwNmRcdTAwNjVcdTAwNzNcdTAwNzNcdTAwNjFcdTAwNjdcdTAwNjUKLVx1MDAwOVx1MDAwOVx1MDAwOVx1MDAyZlx1MDAyZlx1MDA2NVx1MDAyZVx1MDA3MFx1MDA3Mlx1MDA2OVx1MDA2ZVx1MDA3NFx1MDA1M1x1MDA3NFx1MDA2MVx1MDA2M1x1MDA2Ylx1MDA1NFx1MDA3Mlx1MDA2MVx1MDA2M1x1MDA2NVx1MDAyOFx1MDAyOQotXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDc0XHUwMDY1XHUwMDc4XHUwMDc0XHUwMDIwXHUwMDNkXHUwMDNkXHUwMDIwXHUwMDIyXHUwMDRlXHUwMDZmXHUwMDIwXHUwMDczXHUwMDc1XHUwMDYzXHUwMDY4XHUwMDIwXHUwMDcwXHUwMDcyXHUwMDZmXHUwMDcwXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDc5XHUwMDNhXHUwMDIwXHUwMDc4XHUwMDIwXHUwMDY2XHUwMDZmXHUwMDcyXHUwMDIwXHUwMDYzXHUwMDZjXHUwMDYxXHUwMDczXHUwMDczXHUwMDNhXHUwMDIwXHUwMDQ1XHUwMDczXHUwMDYzXHUwMDYxXHUwMDcwXHUwMDY1XHUwMDY0XHUwMDU1XHUwMDZlXHUwMDY5XHUwMDYzXHUwMDZmXHUwMDY0XHUwMDY1XHUwMDU0XHUwMDY1XHUwMDczXHUwMDc0XHUwMDIyCi1cdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwN2QKLVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA3ZAotXHUwMDA5XHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwCi1cdTAwN2QKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0V4Y2VwdGlvbkluQ2xvc3VyZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRXhjZXB0aW9uSW5DbG9zdXJlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmE1YzcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRXhjZXB0aW9uSW5DbG9zdXJlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiogCi0gKiBUZXN0cyBleGNlcHRpb24gaGFuZGxpbmcgaW5zaWRlIG9mIGEgY2xvc3VyZQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBFeGNlcHRpb25JbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0Q2FsbGluZ09mRmFpbGVkQ2xvc3VyZSgpIHsKLSAgICAgICAgY2xvc3VyZSA9IHsgaXQgfCBpdC5mb28oKSB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotCSAgICAgICAgY2xvc3VyZS5jYWxsKCJjaGVlc2UiKQotCSAgICAgICAgCi0JICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIGJ5IG5vdyIpCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gZSkgewotICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKSAgICAKLSAgIAkJCQotICAgCQkJYXNzZXJ0IGUubWV0aG9kID09ICJmb28iCi0JCQlhc3NlcnQgZS50eXBlID09IFN0cmluZyAgIAkJCQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRXhwYW5kb1Byb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9FeHBhbmRvUHJvcGVydHlUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhZjZiZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9FeHBhbmRvUHJvcGVydHlUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLWNsYXNzIEV4cGFuZG9Qcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RFeHBhbmRvUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvbyA9IG5ldyBFeHBhbmRvKCkKLSAgICAgICAgCi0gICAgICAgIGZvby5jaGVlc2UgPSAiQ2hlZGRhciIKLSAgICAgICAgZm9vLm5hbWUgPSAiR3JvbWl0IgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvby5jaGVlc2UgPT0gIkNoZWRkYXIiCi0gICAgICAgIGFzc2VydCBmb28ubmFtZSA9PSAiR3JvbWl0IgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvby5leHBhbmRvUHJvcGVydGllcy5zaXplKCkgPT0gMgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RFeHBhbmRvTWV0aG9kcygpIHsKLSAgICAgICAgZm9vID0gbmV3IEV4cGFuZG8oKQotCi0gICAgICAgIGZvby5jaGVlc2UgPSAiQ2hlZGRhciIKLSAgICAgICAgZm9vLmZ1bGxOYW1lID0gIkdyb21pdCIKLSAgICAgICAgZm9vLm5hbWVMZW5ndGggPSB7IHJldHVybiBmdWxsTmFtZS5sZW5ndGgoKSB9Ci0gICAgICAgIGZvby5tdWx0aVBhcmFtID0geyBhLCBiLCBjIHwgcHJpbnRsbigiQ2FsbGVkIHdpdGggJHthfSwgJHtifSwgJHtjfSIpOyByZXR1cm4gYSArIGIgKyBjIH0KLQotICAgICAgICBhc3NlcnQgZm9vLmNoZWVzZSA9PSAiQ2hlZGRhciIKLSAgICAgICAgYXNzZXJ0IGZvby5mdWxsTmFtZSA9PSAiR3JvbWl0IgotICAgICAgICBhc3NlcnQgZm9vLm5hbWVMZW5ndGgoKSA9PSA2IDogZm9vLm5hbWVMZW5ndGgoKQotICAgICAgICBhc3NlcnQgZm9vLm11bHRpUGFyYW0oMSwgMiwgMykgPT0gNgotICAgICAgICAKLSAgICAgICAgLy8gbGV0cyB0ZXN0IHVzaW5nIHdyb25nIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gICAgICAgIHNob3VsZEZhaWwgeyBmb28ubXVsdGlQYXJhbSgxKSB9Ci0gICAgICAgIHNob3VsZEZhaWwgeyBmb28ubmFtZUxlbmd0aCgxLCAyKSB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRmlsdGVyTGluZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRmlsdGVyTGluZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDhjYWUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ZpbHRlckxpbmVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogY2hlY2sgdGhhdCB0aGUgbmV3IGZpbHRlckxpbmUoKSBtZXRob2Qgb24gSW5wdXRTdHJlYW0gaXMgb2sKLSAqIChhbmQgaW5kaXJlY3RseSB0ZXN0IG5ld1JlYWRlcigpIG1ldGhvZCBvbiBJbnB1dFN0cmVhbSkKLSAqIGFzIHNwZWNpZmllZCBpbiBHUk9PVlktNjI0IGFuZCBHUk9PVlktNjI1Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qCi0KLWNsYXNzIEZpbHRlckxpbmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCXByb3BlcnR5IG15RmlsZQotCXByb3BlcnR5IG15SW5wdXQKLQlwcm9wZXJ0eSBteU91dHB1dAotCi0Jdm9pZCBzZXRVcCgpIHsKLQkgICAgbXlGaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9GaWx0ZXJMaW5lVGVzdC5ncm9vdnkiKQotCQlteUlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShteUZpbGUpCi0JCW15T3V0cHV0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpCi0JfQotCi0Jdm9pZCB0ZXN0RmlsdGVyTGluZU9uRmlsZVJldHVybmluZ0FXcml0YWJsZSgpIHsKLQkJd3JpdGFibGUgPSBteUZpbGUuZmlsdGVyTGluZSgpIHtpdC5jb250YWlucygidGVzdEZpbHRlckxpbmVPbkZpbGVSZXR1cm5pbmdBV3JpdGFibGUiKX0KLQkJd3JpdGFibGUud3JpdGVUbyhteU91dHB1dCkKLQkJYXNzZXJ0IDMgPT0gbXlPdXRwdXQudG9TdHJpbmcoKS5jb3VudCgidGVzdEZpbHRlckxpbmVPbkZpbGVSZXR1cm5pbmdBV3JpdGFibGUiKQotCX0KLQotCXZvaWQgdGVzdEZpbHRlckxpbmVPbkZpbGVVc2luZ0FuT3V0cHV0U3RyZWFtKCkgewotCQlteUZpbGUuZmlsdGVyTGluZShteU91dHB1dCkge2l0LmNvbnRhaW5zKCJ0ZXN0RmlsdGVyTGluZU9uRmlsZVVzaW5nQW5PdXRwdXRTdHJlYW0iKX0KLQkJYXNzZXJ0IDMgPT0gbXlPdXRwdXQudG9TdHJpbmcoKS5jb3VudCgidGVzdEZpbHRlckxpbmVPbkZpbGVVc2luZ0FuT3V0cHV0U3RyZWFtIikKLQl9Ci0KLQl2b2lkIHRlc3RGaWx0ZXJMaW5lT25JbnB1dFN0cmVhbVJldHVybmluZ0FXcml0YWJsZSgpIHsKLQkJd3JpdGFibGUgPSBteUlucHV0LmZpbHRlckxpbmUoKSB7aXQuY29udGFpbnMoInRlc3RGaWx0ZXJMaW5lT25JbnB1dFN0cmVhbVJldHVybmluZ0FXcml0YWJsZSIpfQotCQl3cml0YWJsZS53cml0ZVRvKG15T3V0cHV0KQotCQlhc3NlcnQgMyA9PSBteU91dHB1dC50b1N0cmluZygpLmNvdW50KCJ0ZXN0RmlsdGVyTGluZU9uSW5wdXRTdHJlYW1SZXR1cm5pbmdBV3JpdGFibGUiKQotCX0KLQotCXZvaWQgdGVzdEZpbHRlckxpbmVPbklucHV0U3RyZWFtVXNpbmdBbk91dHB1dFN0cmVhbSgpIHsKLQkJbXlJbnB1dC5maWx0ZXJMaW5lKG15T3V0cHV0KSB7aXQuY29udGFpbnMoInRlc3RGaWx0ZXJMaW5lT25JbnB1dFN0cmVhbVVzaW5nQW5PdXRwdXRTdHJlYW0iKX0KLQkJYXNzZXJ0IDMgPT0gbXlPdXRwdXQudG9TdHJpbmcoKS5jb3VudCgidGVzdEZpbHRlckxpbmVPbklucHV0U3RyZWFtVXNpbmdBbk91dHB1dFN0cmVhbSIpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvby5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Gb28uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTliYTM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGUKLQotLyoqIAotICogQSBkdW1teSBiZWFuIGZvciB0ZXN0aW5nIHRoZSB1c2Ugb2YgcHJvcGVydGllcyBpbiBHcm9vdnkKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgRm9vIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIC8vIHB1YmxpYyBwcm9wZXJ0aWVzCi0gICAgbmFtZSA9ICJKYW1lcyIKLSAgICBjb3VudAotICAgIFN0cmluZyBsb2NhdGlvbiA9ICJMb25kb24iCi0gICAgCi0gICAgLy8gZGVjbGFyZSBwcml2YXRlIHZhcmlhYmxlcwotCXByaXZhdGUgYmxhaCA9IDkKLQlwcml2YXRlIGludmlzaWJsZSA9ICJpbnZpc2libGUiCi0KLSAgICAvLyBkZWNsYXJlIGEgcHJvdGVjdGVkIHZhcmlhYmxlCi0gICAgcHJvdGVjdGVkIHByb3QgPSAiaGlkZSBtZSEiCi0KLSAJLy8gcHJvdmlkZSBhIGdldHRlciBtZXRob2QKLSAJZ2V0Q291bnQoKSB7Ci0gCSAgICBpZiAoY291bnQgPT0gbnVsbCkgewotIAkgICAgICAgIGNvdW50ID0gMQotIAkgICAgfQotIAkgICAgcmV0dXJuIGNvdW50Ci0gCX0KLSAgICAgCi0JZ2V0QmxhaCgpIHsKLSAJICAgIHJldHVybiBibGFoCi0gCX0KLQkKLSAgICAvLyBkZWNsYXJlIGEgYmVhbiB3aXRoIGV4cGxpY2l0IHR5cGluZwotICAgIHByaXZhdGUgU3RyaW5nIGJvZHkKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYm9keQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpIHsKLSAgICAgICAgdGhpcy5ib2R5ID0gYm9keQotICAgIH0KLQotCVN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIG5hbWU6ICR7bmFtZX0gbG9jYXRpb246ICR7bG9jYXRpb259IgotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvckxvb3BUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvckxvb3BUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Yzg3YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Gb3JMb29wVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotaW1wb3J0IGdyb292eS5idWdzLlRlc3RTdXBwb3J0Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yCi0KLWNsYXNzIEZvckxvb3BUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0JcHJvcGVydHkgeAotCQotICAgIHZvaWQgdGVzdFJhbmdlKCkgewotICAgICAgICB4ID0gMAotCi0gICAgICAgIGZvciAoIGkgaW4gMC4uOSApIHsKLSAgICAgICAgICAgIHggPSB4ICsgaQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gNDUKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RSYW5nZVdpdGhUeXBlKCkgewotICAgICAgICB4ID0gMAotCi0gICAgICAgIGZvciAoIEludGVnZXIgaSBpbiAwLi45ICkgewotICAgICAgICAJYXNzZXJ0IGkuY2xhc3MgPT0gSW50ZWdlcgotICAgICAgICAgICAgeCA9IHggKyBpCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSA0NQotICAgIH0KLQotCXZvaWQgdGVzdFJhbmdlV2l0aEpkazE1U3R5bGUoKSB7Ci0gICAgICAgIHggPSAwCi0KLSAgICAgICAgZm9yICggaSA6IDAuLjkgKSB7Ci0gICAgICAgICAgICB4ID0geCArIGkKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IDQ1Ci0JfQotCQotCXZvaWQgdGVzdFJhbmdlV2l0aEpkazE1U3R5bGVBbmRUeXBlKCkgewotICAgICAgICB4ID0gMAotCi0gICAgICAgIGZvciAoIEludGVnZXIgaSA6IDAuLjkgKSB7Ci0gICAgICAgIAlhc3NlcnQgaS5jbGFzcyA9PSBJbnRlZ2VyCi0gICAgICAgICAgICB4ID0geCArIGkKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IDQ1Ci0JfQotCQotICAgIHZvaWQgdGVzdExpc3QoKSB7Ci0gICAgICAgIHggPSAwCi0JCQotICAgICAgICBmb3IgKCBpIGluIFswLCAxLCAyLCAzLCA0XSApIHsKLSAgICAgICAgICAgIHggPSB4ICsgaQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gMTAKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBcnJheSgpIHsKLSAgICAgICAgYXJyYXkgPSAoMC4uNCkudG9BcnJheSgpCi0gICAgICAgIAotICAgICAgICBwcmludGxuICJDbGFzczogJHthcnJheS5jbGFzc30gZm9yIGFycmF5ICR7YXJyYXl9IgotICAgICAgICAKLSAgICAgICAgeCA9IDAKLSAgICAgICAgCi0gICAgICAgIGZvciAoIGkgaW4gYXJyYXkgKSB7Ci0gICAgICAgICAgICB4ID0geCArIGkKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IDEwCi0JfQotICAgIAotICAgIHZvaWQgdGVzdEludEFycmF5KCkgewotICAgICAgICBhcnJheSA9IFRlc3RTdXBwb3J0LmdldEludEFycmF5KCkKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4gIkNsYXNzOiAke2FycmF5LmNsYXNzfSBmb3IgYXJyYXkgJHthcnJheX0iCi0gICAgICAgIAotICAgICAgICB4ID0gMAotICAgICAgICAKLSAgICAgICAgZm9yICggaSBpbiBhcnJheSApIHsKLSAgICAgICAgICAgIHggPSB4ICsgaQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gMTUKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3RyaW5nKCkgewotICAgICAgICB0ZXh0ID0gImFiYyIKLSAgICAgICAgCi0gICAgICAgIGxpc3QgPSBbXQotICAgICAgICBmb3IgKGMgaW4gdGV4dCkgewotICAgICAgICAgICAgbGlzdC5hZGQoYykKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWyJhIiwgImIiLCAiYyJdCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFZlY3RvcigpIHsKLSAgICAgICAgdmVjdG9yID0gbmV3IFZlY3RvcigpCi0gICAgICAgIHZlY3Rvci5hZGRBbGwoIFsxLCAyLCAzXSApCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBbXQotICAgICAgICBmb3IgKGkgaW4gdmVjdG9yLmVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGFuc3dlciA8PCBpCi0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbMSwgMiwgM10KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Gb3JMb29wV2l0aExvY2FsVmFyaWFibGVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Gb3JMb29wV2l0aExvY2FsVmFyaWFibGVzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTJiMjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvRm9yTG9vcFdpdGhMb2NhbFZhcmlhYmxlc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqCi0gKiBUZXN0cyBpdGVyYXRpbmcgd2l0aCBsb2NhbCB2YXJpYWJsZXMKLSAqLwotY2xhc3MgRm9yTG9vcFdpdGhMb2NhbFZhcmlhYmxlc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RGb3JMb29wKCkgewotICAgICAgICB4ID0gbnVsbAotCi0gICAgICAgIGZvciAoIGkgaW4gMC4uOSApIHsKLSAgICAgICAgICAgIHggPSBpCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSA5Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR1N0cmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR1N0cmluZ1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2VmZDc4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0dTdHJpbmdUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi1jbGFzcyBHU3RyaW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFdpdGhPbmVWYXJpYWJsZSgpIHsKLSAgICAgICAgCi0gICAgICAgIG5hbWUgPSAiQm9iIgotICAgICAgICAKLSAgICAgICAgdGVtcGxhdGUgPSAiaGVsbG8gJHtuYW1lfSBob3cgYXJlIHlvdT8iCi0JCQkJCi0JCWFzc2VydCB0ZW1wbGF0ZSBpbnN0YW5jZW9mIEdTdHJpbmcKLQkJCQkJCQkJCQkJIAotCSAJY291bnQgPSB0ZW1wbGF0ZS5nZXRWYWx1ZUNvdW50KCkKLQkJYXNzZXJ0IGNvdW50ID09IDEKLQkJYXNzZXJ0IHRlbXBsYXRlLmdldFZhbHVlKDApID09ICJCb2IiCi0JCQkJCQkJCQkJCSAKLQkJc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQotCQlhc3NlcnQgc3RyaW5nID09ICJoZWxsbyBCb2IgaG93IGFyZSB5b3U/IgotCX0KLSAgICAKLSAgICB2b2lkIHRlc3RXaXRoVmFyaWFibGVBdEVuZCgpIHsKLSAgICAgICAgbmFtZSA9ICJCb2IiCi0gICAgICAgIHRlbXBsYXRlID0gImhlbGxvICR7bmFtZX0iCi0gICAgICAgIHN0cmluZyA9IHRlbXBsYXRlLnRvU3RyaW5nKCkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzdHJpbmcgPT0gImhlbGxvIEJvYiIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0V2l0aFZhcmlhYmxlQXRCZWdpbm5pbmcoKSB7Ci0gICAgICAgIG5hbWUgPSAiQm9iIgotICAgICAgICB0ZW1wbGF0ZSA9ICIke25hbWV9IGhleSIKLSAgICAgICAgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHN0cmluZyA9PSAiQm9iIGhleSIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RXaXRoSnVzdFZhcmlhYmxlKCkgewotICAgICAgICBuYW1lID0gIkJvYiIKLSAgICAgICAgdGVtcGxhdGUgPSAiJHtuYW1lfSIKLSAgICAgICAgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHN0cmluZyA9PSAiQm9iIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RXaXRoVHdvVmFyaWFibGVzKCkgewotICAgICAgICBuYW1lID0gIkJvYiIKLSAgICAgICAgdGVtcGxhdGUgPSAiJHtuYW1lfSR7bmFtZX0iCi0gICAgICAgIHN0cmluZyA9IHRlbXBsYXRlLnRvU3RyaW5nKCkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzdHJpbmcgPT0gIkJvYkJvYiIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0V2l0aFR3b1ZhcmlhYmxlc1dpdGhTcGFjZSgpIHsKLSAgICAgICAgbmFtZSA9ICJCb2IiCi0gICAgICAgIHRlbXBsYXRlID0gIiR7bmFtZX0gJHtuYW1lfSIKLSAgICAgICAgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHN0cmluZyA9PSAiQm9iIEJvYiIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0QXBwZW5kU3RyaW5nKCkgewotICAgICAgICBhID0gImRvZyIgCi0gICAgICAgIGIgPSAiYSAke2F9IgotICAgICAgICAKLQkJYyA9IGIgKyAiIGNhdCIKLQotICAgICAgICBwcmludGxuKCJDcmVhdGVkICR7Y30iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGMudG9TdHJpbmcoKSA9PSAiYSBkb2cgY2F0IiA6IGMKLSAgICAgICAgCi0gICAgICAgIGIgKz0gIiBjYXQiCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYi50b1N0cmluZygpID09ICJhIGRvZyBjYXQiIDogYgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RBcHBlbmRHU3RyaW5nKCkgewotICAgICAgICBhID0gImRvZyIgCi0gICAgICAgIGIgPSAiYSAke2F9IiAKLSAgICAgICAgYiArPSAiIGNhdCR7YX0iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgYi50b1N0cmluZygpID09ICJhIGRvZyBjYXRkb2ciIDogYgotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQ3JlYXRlZCAke2J9IikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UmV0dXJuU3RyaW5nKCkgewotICAgICAgICB2YWx1ZSA9IGR1bW15TWV0aG9kKCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09ICJIZWxsbyBHcm9taXQhIgotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgZHVtbXlNZXRob2QoKSB7Ci0gICAgICAgIG5hbWUgPSAiR3JvbWl0IgotICAgICAgICByZXR1cm4gIkhlbGxvICR7bmFtZX0hIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDb2VyY2UoKSB7Ci0gICAgICAgIGl0ID0gIlVTLUFTQ0lJIgotICAgICAgICB2YWx1ZSA9ICJ0ZXN0Ii5nZXRCeXRlcygiJHtpdH0iKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCAke3ZhbHVlfSIKLSAgICAgICAgYXNzZXJ0IHZhbHVlICE9IG51bGwKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0R3Jvb3Z5NDQxKCkgewotCQlhcmcgPSAidGVzdCIgCi0JCWNvbnRlbnQgPSAiJHthcmd9ID0iIAotCi0JCWlmIChhcmcgIT0gInNvbWV0aGluZyIpIAotCQl7IAotCQkJY29udGVudCArPSAiPyIgCi0JCX0KLQotCQljb250ZW50ICs9ICI9ICR7YXJnfS4iIAotCi0JCWFzc2VydCBjb250ZW50ID09ICJ0ZXN0ID0/PSB0ZXN0LiIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RUd29TdHJpbmdzSW5NaWRkbGUoKSB7Ci0gICAgICAgIGEgPSAiLS0tIgotICAgICAgICBiID0gIiR7YX0gOiIKLSAgICAgICAgYiArPSAiPDwiCi0gICAgICAgIGIgKz0gIj4+IgotICAgICAgICBiICs9ICI6ICR7YX0iCi0gICAgICAgIGFzc2VydCBiID09ICItLS0gOjw8Pj46IC0tLSIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBbHRlcm5hdGluZ0dTdHJpbmdzKCkgewotICAgICAgICBhID0gIi0tLSIKLSAgICAgICAgYiA9ICIke2F9IDoiCi0gICAgICAgIGIgKz0gIjw8IgotICAgICAgICBiICs9ICIgW1ske2F9XV0gIgotICAgICAgICBiICs9ICI+PiIKLSAgICAgICAgYiArPSAiOiAke2F9IgotICAgICAgICBhc3NlcnQgYiA9PSAiLS0tIDo8PCBbWy0tLV1dID4+OiAtLS0iCi0gICAgfQotIH0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0dlbmVyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR2VuZXJhdG9yVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDFlOGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR2VuZXJhdG9yVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0KLWNsYXNzIEdlbmVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RHZW5lcmF0b3IoKSB7Ci0gICAgICAgIHggPSB0aGlzLnNhbXBsZUdlbmVyYXRvcgotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigieDogIiArIHgpCi0JCQotICAgICAgICByZXN1bHQgPSAnJwotICAgICAgICBmb3IgKGkgaW4geCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgaQotICAgICAgICB9Ci0JICAgIAotICAgICAgICBhc3NlcnQgcmVzdWx0ID09ICJBQkMiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0RmluZEFsbCgpIHsKLSAgICAgICAgeCA9IHRoaXMuc2FtcGxlR2VuZXJhdG9yCi0gCSAgICAKLSAgICAgICAgdmFsdWUgPSB4LmZpbmRBbGwgeyBpdGVtIHwgcmV0dXJuIGl0ZW0gPT0gIkMiIH0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IFsiQyJdCi0gCSAgICAKLSAgICAgICAgdmFsdWUgPSB4LmZpbmRBbGwgeyBpdGVtIHwgcmV0dXJuIGl0ZW0gIT0gIkIiIH0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IFsiQSIsICJDIl0KLSAgICB9Ci0gICAgCi0JCi0gICAgdm9pZCB0ZXN0RWFjaCgpIHsKLSAgICAgICAgeCA9IHRoaXMuc2FtcGxlR2VuZXJhdG9yCi0gCSAgICAKLSAgICAgICAgdmFsdWUgPSB4LmVhY2ggeyBwcmludGxuKGl0KSB9Ci0gICAgfQotICAgIAotCQotICAgIHZvaWQgdGVzdE1pc3NpbmdUaGlzQnVnKCkgewotICAgICAgICByZXN1bHQgPSAnJwotICAgICAgICBmb3IgKGkgaW4gc2FtcGxlR2VuZXJhdG9yKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBpCi0gICAgICAgIH0KLQkgICAgCi0gICAgICAgIGFzc2VydCByZXN1bHQgPT0gIkFCQyIKLSAgICB9Ci0JCi0Jdm9pZCBzYW1wbGVHZW5lcmF0b3IoY2xvc3VyZSkgewotCSAgICAvLyBraW5kYSBsaWtlIHlpZWxkIHN0YXRlbWVudHMKLQkgICAgY2xvc3VyZS5jYWxsKCJBIikKLQkgICAgY2xvc3VyZS5jYWxsKCJCIikKLQkgICAgY2xvc3VyZS5jYWxsKCJDIikKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9HbG9iYWxQcmludGxuVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9HbG9iYWxQcmludGxuVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDA4ZWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR2xvYmFsUHJpbnRsblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotY2xhc3MgR2xvYmFsUHJpbnRsblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RHbG9iYWxQcmludGxuKCkgewotICAgICAgICBwcmludGxuKCJIZWxsbyBXb3JsZCEiKQotCX0KLQotICAgIHZvaWQgdGVzdEdsb2JhbFByaW50KCkgewotICAgICAgICBwcmludCgiSGVsbG8gIikKLSAgICAgICAgcHJpbnRsbigiV29ybGQhIikKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5TWV0aG9kc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5TWV0aG9kc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWMwZmY0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0dyb292eU1ldGhvZHNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcgotCi0vKiogCi0gKiBUZXN0cyB0aGUgdmFyaW91cyBuZXcgR3Jvb3Z5IG1ldGhvZHMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgR3Jvb3Z5TWV0aG9kc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0Jdm9pZCB0ZXN0Q29sbGVjdCgpIHsKLQkJYXNzZXJ0IFsyLCA0LCA2XS5jb2xsZWN0IHsgaXQgKiAyfSA9PSBbNCwgOCwgMTJdCi0JCQotCQlhbnN3ZXIgPSBbMiwgNCwgNl0uY29sbGVjdChuZXcgVmVjdG9yKCkpIHsgaXQgKiAyfQotCQkKLQkJYXNzZXJ0IGFuc3dlclswXSA9PSA0Ci0JCWFzc2VydCBhbnN3ZXJbMV0gPT0gOAotCQlhc3NlcnQgYW5zd2VyWzJdID09IDEyCi0JfQotCi0gICAgdm9pZCB0ZXN0Sm9pbigpIHsKLSAgICAgICAgYXNzZXJ0IFsyLCA0LCA2XS5qb2luKCItIikgPT0gIjItNC02IgotICAgICAgICBhc3NlcnQgWyJlZGFtIiwgImNoZWRkYXIiLCAiYnJpZSJdLmpvaW4oIiwgIikgPT0gJ2VkYW0sIGNoZWRkYXIsIGJyaWUnCi0gICAgICAgIAotICAgICAgICBwcmludGxuKCBbImFiYyIsIDUsIDIuMzRdLmpvaW4oIiwgIikgKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUaW1lcygpIHsKLSAgICAgICAgY291bnQgPSAwCi0gICAgICAgIDUudGltZXMgeyBpIHwgY291bnQgPSBjb3VudCArIGkgfQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMTAKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMAotICAgICAgICB0ZW1wID0gNQotICAgICAgICB0ZW1wLnRpbWVzIHsgaSB8IGNvdW50ID0gY291bnQgKyBpIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxMAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RBcnJheVN1YnNjcmlwdCgpIHsKLSAgICAgICAgbGlzdCA9IFsxLCAyLCAzLCA0XQotICAgICAgICBhcnJheSA9IGxpc3QudG9BcnJheSgpCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IGFycmF5WzJdCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMwotICAgICAgICAKLSAgICAgICAgYXJyYXlbMF0gPSA5Ci0gICAgICAgIAotICAgICAgIAlhc3NlcnQgYXJyYXlbMF0gPT0gOQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUb0NoYXJhY3Rlck1ldGhvZCgpIHsKLSAgICAJcyA9ICdjJwotICAgIAl4ID0gcy50b0NoYXJhY3RlcigpCi0gICAgCQotICAgIAlhc3NlcnQgeCBpbnN0YW5jZW9mIENoYXJhY3RlcgotICAgIH0KLQotICAgIHZvaWQgdGVzdExpc3RHcmVwKCkgewotICAgICAgICBsaXN0ID0gWyJKYW1lcyIsICJCb2IiLCAiR3VpbGxhdW1lIiwgIlNhbSJdCi0gICAgICAgIGFuc3dlciA9IGxpc3QuZ3JlcCh+Ii4qYS4qIikKLQotICAgICAgICBhc3NlcnQgYW5zd2VyID09IFsiSmFtZXMiLCAiR3VpbGxhdW1lIiwgIlNhbSJdCi0KLSAgICAgICAgYW5zd2VyID0gbGlzdC5ncmVwKH4iQi5iIikKLQotICAgICAgICBhc3NlcnQgYW5zd2VyID09IFsiQm9iIl0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RDb2xsZWN0aW9uVG9MaXN0KCkgewotICAgICAgICBjID0gWzEsIDIsIDMsIDQsIDVdIC8vIGJ1dCBpdCdzIGEgbGlzdAotICAgICAgICBsID0gYy50b0xpc3QoKQotCi0gICAgICAgIGFzc2VydCBsLmNvbnRhaW5zQWxsKGMpCi0gICAgICAgIGFzc2VydCBjLnNpemUoKSA9PSBsLnNpemUoKQotICAgIH0KLQotICAgIHZvaWQgdGVzdEpvaW5TdHJpbmcoKSB7Ci0gICAgICAgIGFyciA9IG5ldyBTdHJpbmdbXSB7ImEiLCAiYiIsICJjIiwgImQifQotICAgICAgICBqb2luZWQgPSBhcnIuam9pbigiLCAiKQotCi0gICAgICAgIGFzc2VydCBqb2luZWQgPT0gImEsIGIsIGMsIGQiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0UmV2ZXJzZUVhY2goKSB7Ci0gICAgICAgIGwgPSBbImNoZWVzZSIsICJsb3ZlcyIsICJHdWlsbGF1bWUiXQotICAgICAgICBleHBlY3RlZCA9IFsiR3VpbGxhdW1lIiwgImxvdmVzIiwgImNoZWVzZSJdCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBbXQotICAgICAgICBsLnJldmVyc2VFYWNoeyBhbnN3ZXIgPDwgaXQgfQotCi0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0R3JlcCgpIHsKLQkgICAgCWxpc3QgPSBbIkd1aWxsYXVtZSIsICJsb3ZlcyIsICJjaGVlc2UiXQotCSAgICAJCi0JICAgIAlhbnN3ZXIgPSBsaXN0LmdyZXAofiIuKmVlLioiKQotCSAgICAJYXNzZXJ0IGFuc3dlciA9PSBbImNoZWVzZSJdCi0JICAgIAkKLQkgICAgCWxpc3QgPSBbMTIzLCAiYWJjIiwgNC41Nl0KLQkgICAgCWFuc3dlciA9IGxpc3QuZ3JlcChTdHJpbmcpCi0JICAgIAlhc3NlcnQgYW5zd2VyID09IFsiYWJjIl0KLQkgICAgCQotCSAgICAJbGlzdCA9IFs0LCAyLCA3LCAzLCA2LCAyXQotCSAgICAJYW5zd2VyID0gbGlzdC5ncmVwKDIuLjMpCi0JICAgIAlhc3NlcnQgYW5zd2VyID09IFsyLCAzLCAyXQotCX0KLSAgICAKLSAgICB2b2lkIHRlc3RNYXBHZXRXaXRoRGVmYXVsdCgpIHsKLSAgICAJCW1hcCA9IFs6XQotICAgIAkJCi0gICAgCQlhc3NlcnQgbWFwLmZvbyA9PSBudWxsCi0gICAgCQkKLSAgICAJCW1hcC5nZXQoImZvbyIsIFtdKS5hZGQoMTIzKQotICAgIAkJCi0gICAgCQlhc3NlcnQgbWFwLmZvbyA9PSBbMTIzXQotICAgIAkJCi0gICAgCQltYXAuZ2V0KCJiYXIiLCBbOl0pLmdldCgieHl6IiwgWzpdKS5jaGVlc2UgPSAxMjMKLSAgICAJCQotICAgIAkJYXNzZXJ0IG1hcC5iYXIueHl6LmNoZWVzZSA9PSAxMjMKLSAgICAJCWFzc2VydCBtYXAuc2l6ZSgpID09IDIKLSAgICAJfQotICAgIAkJCi0gICAgdm9pZCBESVNBQkxFX3Rlc3RFeGVjdXRlQ29tbWFuZExpbmVQcm9jZXNzVXNpbmdBU3RyaW5nKCkgewotCSAgICAJLyoqIEB0b2RvIHdoeSBkb2VzIHRoaXMgbm90IHdvcmsKLQkgICAgCWphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnLCAnJykKLQkgICAgCWNtZCA9ICIke2phdmFIb21lfS9iaW4vamF2YSAtdmVyc2lvbiIKLQkgICAgCSovCi0JICAgIAkKLQkgICAgCWNtZCA9ICJscyAtbCIKLQkgICAgCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoJ29zLm5hbWUnLCAnJykuY29udGFpbnMoJ1dpbicpKSB7Ci0JICAgIAkJY21kID0gImRpciIKLQkgICAgCX0KLQkgICAgCQotCSAgICAJcHJpbnRsbiAiZXhlY3V0aW5nIGNvbW1hbmQ6ICR7Y21kfSIKLQkgICAgCQotCSAgICAJcHJvY2VzcyA9IGNtZC5leGVjdXRlKCkKLQkgICAgCS8vcHJvY2VzcyA9ICJscyAtbCIuZXhlY3V0ZSgpCi0JICAgIAkKLQkgICAgCS8vIGxldHMgaGF2ZSBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMhCi0JICAgIAljb3VudCA9IDAKLQkgICAgCQotCSAgICAJcHJpbnRsbiAiUmVhZCB0aGUgZm9sbG93aW5nIGxpbmVzLi4uIgotCQotCSAgICAJLyoqIEB0b2RvIHdlIHNob3VsZCBzaW1wbGlmeSB0aGUgZm9sbG93aW5nIGxpbmUhISEgKi8KLQkgICAgCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmluKS5lYWNoTGluZSB7IGxpbmUgfAotCSAgICAJCXByaW50bG4gbGluZQotCSAgICAJCWNvdW50KysKLQkgICAgCX0KLQkgICAgCXByaW50bG4gIiIKLQkgICAgCQotCSAgICAJcHJvY2Vzcy53YWl0Rm9yKCkKLQkgICAgCXZhbHVlID0gcHJvY2Vzcy5leGl0VmFsdWUoKQotCSAgICAJcHJpbnRsbiAiRXhpdCB2YWx1ZSBvZiBjb21tYW5kIGxpbmUgaXMgJHt2YWx1ZX0iCi0JICAgIAkKLQkgICAgCWFzc2VydCBjb3VudCA+IDEKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBESVNBQkxFRF90ZXN0RXhlY3V0ZUNvbW1hbmRMaW5lUHJvY2Vzc0FuZFVzZVdhaXRGb3JPcktpbGwoKSB7Ci0gICAgCS8qKiBAdG9kbyB3aHkgZG9lcyB0aGlzIG5vdCB3b3JrCi0gICAgCWphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnLCAnJykKLSAgICAJY21kID0gIiR7amF2YUhvbWV9L2Jpbi9qYXZhIC12ZXJzaW9uIgotICAgIAkqLwotICAgIAkKLSAgICAJY21kID0gImxzIC1sIgotICAgIAlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCdvcy5uYW1lJywgJycpLmNvbnRhaW5zKCdXaW4nKSkgewotICAgIAkJY21kID0gImRpciIKLSAgICAJfQotICAgIAkKLSAgICAJcHJpbnRsbiAiZXhlY3V0aW5nIGNvbW1hbmQ6ICR7Y21kfSIKLSAgICAJCi0gICAgCXByb2Nlc3MgPSBjbWQuZXhlY3V0ZSgpCi0gICAgCQotICAgIAlwcm9jZXNzLndhaXRGb3JPcktpbGwoMTAwMCkKLSAgICAJdmFsdWUgPSBwcm9jZXNzLmV4aXRWYWx1ZSgpCi0gICAgCXByaW50bG4gIkV4aXQgdmFsdWUgb2YgY29tbWFuZCBsaW5lIGlzICR7dmFsdWV9IgotICAgIAkKLSAgICAJCi0gICAgCXByb2Nlc3MgPSBjbWQuZXhlY3V0ZSgpCi0gICAgCQotICAgIAlwcm9jZXNzLndhaXRGb3JPcktpbGwoMSkKLSAgICAJdmFsdWUgPSBwcm9jZXNzLmV4aXRWYWx1ZSgpCi0gICAgCXByaW50bG4gIkV4aXQgdmFsdWUgb2YgY29tbWFuZCBsaW5lIGlzICR7dmFsdWV9IgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3REaXNwbGF5U3lzdGVtUHJvcGVydGllcygpIHsKLSAgICAJcHJpbnRsbiAiU3lzdGVtIHByb3BlcnRpZXMgYXJlLi4uIgotICAgIAlwcm9wZXJ0aWVzID0gU3lzdGVtLnByb3BlcnRpZXMKLSAgICAJa2V5cyA9IHByb3BlcnRpZXMua2V5U2V0KCkuc29ydCgpCi0gICAgCWZvciAoayBpbiBrZXlzKSB7IAotICAgIAkJcHJpbnRsbiAiJHtrfSA9ICR7cHJvcGVydGllc1trXX0iCi0gICAgCX0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNYXgoKSB7Ci0gICAgICAgIGFzc2VydCBbLTUsIC0zLCAtMSwgMCwgMiwgNF0ubWF4eyBpdCAqIGl0IH0gPT0gLTUKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RNaW4oKSB7Ci0gICAgICAgIGFzc2VydCBbLTUsIC0zLCAtMSwgMCwgMiwgNF0ubWlueyBpdCAqIGl0IH0gPT0gMAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTb3J0KCkgewotICAgIAlhc3NlcnQgWy01LCAtMywgLTEsIDAsIDIsIDRdLnNvcnQgeyBpdCppdCB9ID09IFswLCAtMSwgMiwgLTMsIDQsIC01XQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0hlcmVkb2NzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9IZXJlZG9jc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjUwNDljLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0hlcmVkb2NzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1jbGFzcyBIZXJlZG9jc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RIZXJlZG9jcygpIHsKLSAgICAgICAgbmFtZSA9ICJKYW1lcyIKLSAgICAgICAgcyA9IDw8PEVPRgotYWJjZAotZWZnCi0KLWhpamsKLSAgICAgCi1oZWxsbyAke25hbWV9Ci0gICAgICAgIAotRU9GCi0gICAgICAgIHByaW50bG4gcwotCQlhc3NlcnQgcyAhPSBudWxsCi0JCWFzc2VydCBzIGluc3RhbmNlb2YgR1N0cmluZwotCi0JCWFzc2VydCBzLmNvbnRhaW5zKCJpIikKLQkJYXNzZXJ0IHMuY29udGFpbnMoIkphbWVzIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RG9sbGFyRXNjYXBpbmcoKSB7Ci0gICAgICAgIHMgPSA8PDxFT0YKLWhlbGxvICQke25hbWV9Ci1FT0YKLQkJcHJpbnRsbiBzCi0JCWFzc2VydCBzICE9IG51bGwKLQkJYXNzZXJ0IHMuY29udGFpbnMoIiQiKQotCQljID0gcy5jb3VudCgiJCIpCi0JCWFzc2VydCBjID09IDEKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Ib21lcGFnZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSG9tZXBhZ2VUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjYjMyOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Ib21lcGFnZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1jbGFzcyBIb21lcGFnZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQl2b2lkIHRlc3RIb21lUGFnZSgpIHsKLQkgICAgCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSWZFbHNlQ29tcGFjdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSWZFbHNlQ29tcGFjdFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U3ZTVjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZUNvbXBhY3RUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLWNsYXNzIElmRWxzZUNvbXBhY3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0SWZfTm9FbHNlKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotCi0gICAgICAgIGlmICggdHJ1ZSApIHt4ID0gdHJ1ZX0KLQotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VfTWF0Y2hJZigpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgeSA9IGZhbHNlCi0KLSAgICAgICAgaWYgKCB0cnVlICkge3ggPSB0cnVlfSBlbHNlIHt5ID0gdHJ1ZX0KLQotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0gICAgICAgIGFzc2VydCB5ID09IGZhbHNlCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JZkVsc2VUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzAxMmVkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLWNsYXNzIElmRWxzZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RJZl9Ob0Vsc2UoKSB7Ci0KLSAgICAgICAgeCA9IGZhbHNlCi0KLSAgICAgICAgaWYgKCB0cnVlICkgewotICAgICAgICAgICAgeCA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IHRydWUKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RJZl9XaXRoRWxzZV9NYXRjaElmKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotICAgICAgICB5ID0gZmFsc2UKLQotICAgICAgICBpZiAoIHRydWUgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeSA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IHRydWUKLSAgICAgICAgYXNzZXJ0IHkgPT0gZmFsc2UKLQotICAgIH0KLQotICAgIHZvaWQgdGVzdElmX1dpdGhFbHNlX01hdGNoRWxzZSgpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgeSA9IGZhbHNlCi0KLSAgICAgICAgaWYgKCBmYWxzZSApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB5ID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeCApCi0gICAgICAgIGFzc2VydEVxdWFscyggdHJ1ZSwgeSApCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9NYXRjaElmKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotICAgICAgICB5ID0gZmFsc2UKLQotICAgICAgICBpZiAoIHRydWUgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9IGVsc2UgaWYgKCBmYWxzZSApIHsKLSAgICAgICAgICAgIHkgPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0gICAgICAgIGFzc2VydCB5ID09IGZhbHNlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9NYXRjaEVsc2VJZigpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgeSA9IGZhbHNlCi0KLSAgICAgICAgaWYgKCBmYWxzZSApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0gZWxzZSBpZiAoIHRydWUgKSB7Ci0gICAgICAgICAgICB5ID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeCApCi0gICAgICAgIGFzc2VydEVxdWFscyggdHJ1ZSwgeSApCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9XaXRoRWxzZV9NYXRjaElmKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotICAgICAgICB5ID0gZmFsc2UKLSAgICAgICAgeiA9IGZhbHNlCi0KLSAgICAgICAgaWYgKCB0cnVlICkgewotICAgICAgICAgICAgeCA9IHRydWUKLSAgICAgICAgfSBlbHNlIGlmICggZmFsc2UgKSB7Ci0gICAgICAgICAgICB5ID0gdHJ1ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeiA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IHRydWUKLSAgICAgICAgYXNzZXJ0IHkgPT0gZmFsc2UKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeiApCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9XaXRoRWxzZV9NYXRjaEVsc2VJZigpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgeSA9IGZhbHNlCi0gICAgICAgIHogPSBmYWxzZQotCi0gICAgICAgIGlmICggZmFsc2UgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9IGVsc2UgaWYgKCB0cnVlICkgewotICAgICAgICAgICAgeSA9IHRydWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHogPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGZhbHNlLCB4ICkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCB0cnVlLCB5ICkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeiApCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9XaXRoRWxzZV9NYXRjaEVsc2UoKSB7Ci0KLSAgICAgICAgeCA9IGZhbHNlCi0gICAgICAgIHkgPSBmYWxzZQotICAgICAgICB6ID0gZmFsc2UKLQotICAgICAgICBpZiAoIGZhbHNlICkgewotICAgICAgICAgICAgeCA9IHRydWUKLSAgICAgICAgfSBlbHNlIGlmICggZmFsc2UgKSB7Ci0gICAgICAgICAgICB5ID0gdHJ1ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeiA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyggZmFsc2UsIHggKQotICAgICAgICBhc3NlcnQgeSA9PSBmYWxzZQotICAgICAgICBhc3NlcnRFcXVhbHMoIHRydWUsIHogKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmUHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmUHJvcGVydHlUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxNmMxMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JZlByb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1jbGFzcyBJZlByb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQkKLSAgICBkdW1teQotICAgIAotCS8vIFRoaXMgaXMgYmVjYXVzZSBub3JtYWwgY2xhc3NlcyBhcmUgbm90IGV4dGVuc2libGUsIGJ1dCBzY3JpcHRzIGFyZSBleHRlbnNpYmxlIGJ5IGRlZmF1bHQuCi0JT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0JICAgIHByaW50bG4oImFza2luZyBmb3IgcHJvcGVydHkgIiArIGtleSkKLQkJcmV0dXJuIGR1bW15Ci0JfQotCQotCXZvaWQgc2V0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCSAgICBwcmludGxuKCJzZXR0aW5nIHRoZSBwcm9wZXJ0eSAiICsga2V5ICsgIiB0bzogIiArIHZhbHVlKQotCSAgICBkdW1teSA9IHZhbHVlCi0JfQotCi0gICAgdm9pZCB0ZXN0SWZOdWxsUHJvcGVydHlTZXQoKSB7Ci0gICAgICAgIGlmIChjaGVlc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hlZXNlID0gMQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGVlc2UgIT0gMSkgewotICAgICAgICAgICAgZmFpbCgiRGlkbid0IGNoYW5nZSBjaGVlc2UiKQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBjaGVlc2UgPT0gMQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RJZk51bGxQcm9wZXJ0eVNldFJlY2hlY2soKSB7Ci0JCWlmIChjaGVlc2UgPT0gbnVsbCkgewotCQkJY2hlZXNlID0gMQotCQl9Ci0JCWlmIChjaGVlc2UgPT0gMSkgewotCQkJY2hlZXNlID0gMgotCQl9Ci0JCWFzc2VydCBjaGVlc2UgPT0gMgotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JZlRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmEyNzBhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1jbGFzcyBJZlRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RVc2luZ051bWJlcigpIHsKLQkJeCA9IDEKLQkJCi0JCWlmICh4KSB7Ci0JCQlwcmludGxuICIke3h9IGlzIHRydWUiCi0JCX0KLQkJZWxzZSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGJlIGZhbHNlIikKLQkJfQotCQkKLQkJeCA9IDAKLQkJCi0JCWlmICh4KSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGJlIHRydWUiKQotCQl9Ci0JCWVsc2UgewotCQkJcHJpbnRsbiAiJHt4fSBpcyBmYWxzZSIKLQkJfQotCQkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RVc2luZ1N0cmluZygpIHsKLQkJeCA9ICJhYmMiCi0JCQotCQlpZiAoeCkgewotCQkJcHJpbnRsbiAiJHt4fSBpcyB0cnVlIgotCQl9Ci0JCWVsc2UgewotCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBmYWxzZSIpCi0JCX0KLQkJCi0JCXggPSAwCi0JCQotCQlpZiAoeCkgewotCQkJZmFpbCgic2hvdWxkIG5vdCBiZSB0cnVlIikKLQkJfQotCQllbHNlIHsKLQkJCXByaW50bG4gIiR7eH0gaXMgZmFsc2UiCi0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JZldpdGhNZXRob2RDYWxsLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmV2l0aE1ldGhvZENhbGwuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJlNGEzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0lmV2l0aE1ldGhvZENhbGwuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotY2xhc3MgSWZXaXRoTWV0aG9kQ2FsbFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQl2b2lkIHRlc3RJZldpdGhNZXRob2RDYWxsKCkgewotCSAgICB4ID0gWyJmb28iLCAiY2hlZXNlIl0KLQkgICAgCi0gICAgICAgIGlmICggeC5jb250YWlucygiY2hlZXNlIikgKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJ4IHNob3VsZCBjb250YWluIGNoZWVzZSEiCi0gICAgICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbW11dGFibGVNb2RpZmljYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ltbXV0YWJsZU1vZGlmaWNhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWMzODYzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ltbXV0YWJsZU1vZGlmaWNhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqCi0gKiBjaGVjayB0aGF0IHRoZSBuZXcgYXNJbW11dGFibGUoKSBtZXRob2Qgd29ya3MKLSAqIGFzIHNwZWNpZmllZCBpbiBHUk9PVlktNjIzCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1jbGFzcyBJbW11dGFibGVNb2RpZmljYXRpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCXZvaWQgdGVzdENvbGxlY3Rpb25Bc0ltbXV0YWJsZSgpIHsKLQkgICAgY2hhbGxlbmdlciA9IFsiVGVsc29uIiwgIlNoYXJuYSIsICJEYXJ2IiwgIkFzdHJhIl0KLQkgICAgaG9wZWZ1bGx5SW1tdXRhYmxlID0gY2hhbGxlbmdlci5hc0ltbXV0YWJsZSgpCi0JICAgIHRyeSB7Ci0JICAgICAgICBjaGFsbGVuZ2VyLmFkZCgiQW5nZWwgT25lIikKLQkgICAgICAgIGNoYWxsZW5nZXIgPDwgIkFuZ2VsIFR3byIKLQotCSAgICAgICAgLy8gQHRvZG8gZmFpbCgiJ2NoYWxsZW5nZXInIGlzIHN1cHBvc2VkIHRvIGJlIGFuIGltbXV0YWJsZSBjb2xsZWN0aW9uLiIpCi0KLQkgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCSAgICAgICAgLy8gc3VjY2VzcyBpZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgICAgICAgIGFzc2VydCA0ID09IGNoYWxsZW5nZXIuc2l6ZSgpCi0JICAgIH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSW1wb3J0VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbXBvcnRUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmOTA4Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbXBvcnRUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWltcG9ydCBqYXZhLmlvLioKLWltcG9ydCBqYXZhLnV0aWwuTWFwLCBMaXN0Ci0KLWNsYXNzIEltcG9ydFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RJbXBvcnRBbGwoKSB7Ci0gICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiZm9vLnR4dCIpCi0JCWFzc2VydCBmaWxlIGluc3RhbmNlb2YgRmlsZQotCQlhc3NlcnQgZmlsZS5jbGFzcy5uYW1lID09ICJqYXZhLmlvLkZpbGUiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEltcG9ydEJ5TmFtZSgpIHsKLSAgICAgICAgeCA9IFs6XQotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIE1hcAotICAgICAgICAvKiogQHRvZG8gCi0gICAgICAgIGFzc2VydCB4LmNsYXNzICE9IG51bGwgCi0gICAgICAgICovCi0gICAgICAgIGFzc2VydCB4LmdldENsYXNzKCkubmFtZS5zdGFydHNXaXRoKCJqYXZhLnV0aWwuIikKLSAgICAgICAgCi0gICAgICAgIHkgPSBbMSwgMiwgM10KLSAgICAgICAgYXNzZXJ0IHkgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgIGFzc2VydCB5LmdldENsYXNzKCkubmFtZS5zdGFydHNXaXRoKCJqYXZhLnV0aWwuIikKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbnN0YW5jZW9mVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbnN0YW5jZW9mVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOGQzNDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSW5zdGFuY2VvZlRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5NYXAKLQotY2xhc3MgSW5zdGFuY2VvZlRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RUcnVlKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotCQlvID0gMTIKLSAgICAgICAgCi0gICAgICAgIGlmICggbyBpbnN0YW5jZW9mIEludGVnZXIgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gdHJ1ZQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RGYWxzZSgpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgbyA9IDEyCi0gICAgICAgIAotICAgICAgICBpZiAoIG8gaW5zdGFuY2VvZiBEb3VibGUgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gZmFsc2UKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0SW1wb3J0ZWRDbGFzcygpIHsKLSAgICAgICAgbSA9IFsxOjJdCi0gICAgICAgIGFzc2VydCBtIGluc3RhbmNlb2YgTWFwCi0gICAgICAgIGFzc2VydCAhKG0gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKG0gaW5zdGFuY2VvZiBNYXApCi0gICAgICAgIGFzc2VydEZhbHNlKG0gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB7Ci0gICAgICAgIGwgPSBbMSwgMiwgM10KLSAgICAgICAgYXNzZXJ0IGwgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdAotICAgICAgICBhc3NlcnQgIShsIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShsIGluc3RhbmNlb2YgamF2YS51dGlsLkxpc3QpCi0gICAgICAgIGFzc2VydEZhbHNlKGwgaW5zdGFuY2VvZiBNYXApCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSW50ZWdlck9wZXJhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvSW50ZWdlck9wZXJhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJhNDMzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ludGVnZXJPcGVyYXRpb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi1jbGFzcyBJbnRlZ2VyT3BlcmF0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3BlcnR5IHgKLSAgICBwcm9wZXJ0eSB5Ci0gICAgCi0gICAgdm9pZCB0ZXN0UGx1cygpIHsKLSAgICAgICAgeCA9IDIgKyAyCi0gICAgICAgIGFzc2VydCB4ID09IDQKLSAgICAgICAgCi0gICAgICAgIHkgPSB4ICsgMQotCQlhc3NlcnQgeSA9PSA1Ci0JCQotCQl6ID0geSArIHggKyAxICsgMgotCQlhc3NlcnQgeiA9PSAxMiAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q2hhcmFjdGVyUGx1cygpIHsKLSAgICAJQ2hhcmFjdGVyIGMxID0gMQotICAgIAlDaGFyYWN0ZXIgYzIgPSAyCi0gICAgCQotICAgICAgICB4ID0gYzIgKyAyCi0gICAgICAgIGFzc2VydCB4ID09IDQKLSAgICAJCi0gICAgICAgIHggPSAyICsgYzIKLSAgICAgICAgYXNzZXJ0IHggPT0gNAotICAgIAkKLSAgICAgICAgeCA9IGMyICsgYzIKLSAgICAgICAgYXNzZXJ0IHggPT0gNAotICAgICAgICAgIAotICAgICAgICB5ID0geCArIGMxCi0JCWFzc2VydCB5ID09IDUKLSAgICAgICAgICAKLSAgICAgICAgeSA9IGMxICsgeAotCQlhc3NlcnQgeSA9PSA1Ci0JCQotCQl6ID0geSArIHggKyBjMSArIDIKLQkJYXNzZXJ0IHogPT0gMTIgCi0JCQotCQl6ID0geSArIHggKyAxICsgYzIKLQkJYXNzZXJ0IHogPT0gMTIgCi0JCQotCQl6ID0geSArIHggKyBjMSArIGMyCi0JCWFzc2VydCB6ID09IDEyIAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNaW51cygpIHsKLSAgICAgICAgeCA9IDYgLSAyCi0gICAgICAgIGFzc2VydCB4ID09IDQKLSAgICAgICAgCi0gICAgICAgIHkgPSB4IC0gMQotCQlhc3NlcnQgeSA9PSAzICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q2hhcmFjdGVyTWludXMoKSB7Ci0gICAgCUNoYXJhY3RlciBjMSA9IDEKLSAgICAJQ2hhcmFjdGVyIGMyID0gMgotICAgIAlDaGFyYWN0ZXIgYzYgPSA2Ci0gICAgCQotICAgICAgICB4ID0gYzYgLSAyCi0gICAgICAgIGFzc2VydCB4ID09IDQKLSAgICAJCi0gICAgICAgIHggPSA2IC0gYzIKLSAgICAgICAgYXNzZXJ0IHggPT0gNAotICAgIAkKLSAgICAgICAgeCA9IGM2IC0gYzIKLSAgICAgICAgYXNzZXJ0IHggPT0gNAotICAgICAgICAKLSAgICAgICAgeSA9IHggLSBjMQotCQlhc3NlcnQgeSA9PSAzICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TXVsdGlwbHkoKSB7Ci0gICAgICAgIHggPSAzICogMgotICAgICAgICBhc3NlcnQgeCA9PSA2Ci0gICAgICAgIAotICAgICAgICB5ID0geCAqIDIKLSAgICAgICAgYXNzZXJ0IHkgPT0gMTIgICAgICAgIAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3REaXZpZGUoKSB7Ci0gICAgICAgIHggPSA4MCAvIDQKLSAgICAgICAgYXNzZXJ0IHggPT0gMjAuMCA6ICJ4ID0gIiArIHgKLSAgICAgICAgCi0gICAgICAgIHkgPSB4IC8gMgotICAgICAgICBhc3NlcnQgeSA9PSAxMC4wIDogInkgPSAiICsgeSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEludGVnZXJEaXZpZGUoKSB7Ci0gICAgICAgIHggPSA1MiBcIDMKLSAgICAgICAgYXNzZXJ0IHggPT0gMTcgOiAieCA9ICIgKyB4Ci0gICAgICAgIAotICAgICAgICB5ID0geCBcIDIKLSAgICAgICAgYXNzZXJ0IHkgPT0gOCA6ICJ5ID0gIiArIHkgCi0gICAgICAgIAotICAgICAgICB5ID0gMTEKLSAgICAgICAgeSBcPSAzCi0gICAgICAgIGFzc2VydCB5ID09IDMgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE1vZCgpIHsKLSAgICAJeCA9IDEwMCAlIDMKLSAgICAJCi0gICAgCWFzc2VydCB4ID09IDEKLSAgICAJCi0gICAgCXkgPSAxMQotICAgIAl5ICU9IDMKLSAgICAJYXNzZXJ0IHkgPT0gMgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RBbmQoKSB7Ci0gICAgCS8qKiBAdG9kbyBwYXJzZXIgCi0gICAgCXggPSAxICYgMwotICAgIAkKLSAgICAJYXNzZXJ0IHggPT0gMQotICAgIAkqLwotICAgIAkKLSAgICAJeCA9IDEuYW5kKDMpCi0gICAgCQotICAgIAlhc3NlcnQgeCA9PSAxCi0gICAgfQotICAgICAKLSAgICAgdm9pZCB0ZXN0T3IoKSB7Ci0gICAgIAkvKiogQHRvZG8gcGFyc2VyCi0gICAgIAl4ID0gMSB8IDMKLSAgICAgCQotICAgICAJYXNzZXJ0IHggPT0gMwotICAgICAJCi0gICAgIAl4ID0gMSB8IDQKLSAgICAgCQotICAgICAJYXNzZXJ0IHggPT0gNQotICAgICAJKi8KLSAgICAgCQotICAgICAJeCA9IDEub3IoMykKLSAgICAgCQotICAgICAJYXNzZXJ0IHggPT0gMwotICAgICAJCi0gICAgIAl4ID0gMS5vcig0KQotICAgICAJCi0gICAgIAlhc3NlcnQgeCA9PTUKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U2hpZnRPcGVyYXRvcnMoKSB7Ci0KLSAgICAJeCA9IDggPj4gMQotICAgIAlhc3NlcnRUcnVlKHggPT0gNCkKLSAgICAJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgSW50ZWdlcikKLQotICAgIAl4ID0gOCA8PCAyCi0gICAgCWFzc2VydFRydWUoeCA9PSAzMikKLSAgICAJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgSW50ZWdlcikKLQotICAgIAl4ID0gOEwgPDwgMgotICAgIAlhc3NlcnRUcnVlKHggPT0gMzIpCi0gICAgCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIExvbmcpCi0KLQkJeCA9IC0xNiA+PiA0Ci0JCWFzc2VydFRydWUoeCA9PSAtMSkKLQotCQl4ID0gLTE2ID4+PiA0Ci0JCWFzc2VydFRydWUoeCA9PSAweEZGRkZGRkYpCi0JCQotCQkvL0Vuc3VyZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSByaWdodCBvcGVyYW5kIChzaGlmdCBkaXN0YW5jZSkgaXMgaWdub3JlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZQotCQkvL3Jlc3VsdC4gIFRoaXMgaXMgaG93IGphdmEgd29ya3MsIGFuZCBmb3IgdGhlc2Ugb3BlcmF0b3JzLCBpdCBtYWtlcyBzZW5zZSB0byBrZWVwIHRoYXQgYmVoYXZpb3IuCi0JCXggPSBJbnRlZ2VyLk1BWF9WQUxVRSA8PCAxTAotCQlhc3NlcnRUcnVlKHggPT0gLTIpCi0gICAgCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgCQotCQl4ID0gbmV3IExvbmcoSW50ZWdlci5NQVhfVkFMVUUpLmxvbmdWYWx1ZSgpIDw8IDEKLQkJYXNzZXJ0VHJ1ZSh4ID09IDB4ZmZmZmZmZmUpCi0gICAgCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIExvbmcpCi0gICAgCQotICAgIAkvL1RoZSBsZWZ0IG9wZXJhbmQgKHNoaWZ0IHZhbHVlKSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKLSAgICAJdHJ5IHsKLSAgICAJCXggPSA4LjBGID4+IDIKLSAgICAJCWZhaWwoIlNob3VsZCBjYXRjaCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIAl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKLSAgICAJfSAKLQotICAgIAkvL1RoZSByaWdodCBvcGVyYW5kIChzaGlmdCBkaXN0YW5jZSkgbXVzdCBiZSBhbiBpbnRlZ3JhbCB0eXBlCi0gICAgCXRyeSB7Ci0gICAgCQl4ID0gOCA+PiAyLjAKLSAgICAJCWZhaWwoIlNob3VsZCBjYXRjaCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIAl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKLSAgICAJfSAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9JbnZva2VOb3JtYWxNZXRob2RzRmlyc3RUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ludm9rZU5vcm1hbE1ldGhvZHNGaXJzdFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTc5ZTNmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0ludm9rZU5vcm1hbE1ldGhvZHNGaXJzdFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCi0vKioKLSAqIEludm9rZSBub3JtYWwgbWV0aG9kcyBmaXJzdDogaWYgbm8gc3RhdGljYWxseSB0eXBlZCBtZXRob2QgZXhpc3QsIHVzZSBpbnZva2VNZXRob2QoKS4KLSAqCi0gKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCi0gKi8KLWNsYXNzIEludm9rZU5vcm1hbE1ldGhvZHNGaXJzdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RQcmludGxuKCkgewotICAgICAgICBwcmludGxuICJjYWxsIGdsb2JhbCBwcmludGxuIGZ1bmN0aW9uIgotICAgIH0KLQotICAgIHZvaWQgdGVzdFN0YXRpY01ldGhvZE9uSmRrT2JqZWN0KCkgewotICAgICAgICBteVN0cmluZyA9ICIgc3RhdGljIG1ldGhvZCAiCi0gICAgICAgIG5ld1N0cmluZyA9IG15U3RyaW5nLnRyaW0oKQotCi0gICAgICAgIGFzc2VydCBuZXdTdHJpbmcgPT0gInN0YXRpYyBtZXRob2QiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FsbENsb3N1cmUoKSB7Ci0gICAgICAgIGNsb3MgPSB7IHxtc2d8IHJldHVybiBtc2cgKyAiIGlzIEdyb292eSIgfQotICAgICAgICBzdHIgPSBjbG9zKCJHdWlsbGF1bWUiKQotCi0gICAgICAgIGFzc2VydCBzdHIgPT0gIkd1aWxsYXVtZSBpcyBHcm9vdnkiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FsbE5vcm1hbE1ldGhvZEZyb21BR3Jvb3Z5RGVmaW5lZENsYXNzKCkgewotICAgICAgICBwID0gbmV3IFByaW50ZXIoKQotICAgICAgICBzdHIgPSAiR3VpbGxhdW1lIgotICAgICAgICByZXN1bHQgPSBwLnJldHVyblNlbGYoc3RyKQotCi0gICAgICAgIGFzc2VydCByZXN1bHQgPT0gc3RyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2FsbE5vcm1hbE1ldGhvZEZpcnN0RnJvbVdhY2t5T2JqZWN0KCkgewotICAgICAgICB3ID0gbmV3IFdhY2t5KCkKLSAgICAgICAgc3RyID0gIkdyb292eSIKLSAgICAgICAgc3RhdGljUmVzdWx0ID0gdy5yZXR1cm5TZWxmKHN0cikKLSAgICAgICAgaW52b2tlUmVzdWx0ID0gdy5ub25FeGlzdGluZ01ldGhvZChzdHIpCi0KLSAgICAgICAgYXNzZXJ0IHN0YXRpY1Jlc3VsdCA9PSBzdHIKLSAgICAgICAgYXNzZXJ0IGludm9rZVJlc3VsdCA9PSAiaW52b2tlck1ldGhvZCBjYWxsIgotICAgIH0KLX0KLQotY2xhc3MgUHJpbnRlciB7Ci0gICAgU3RyaW5nIHJldHVyblNlbGYobXNnKSB7Ci0gICAgICAgIHJldHVybiBtc2cKLSAgICB9Ci19Ci0KLWNsYXNzIFdhY2t5IHsKLSAgICBTdHJpbmcgcmV0dXJuU2VsZihtc2cpIHsKLSAgICAgICAgcmV0dXJuIG1zZwotICAgIH0KLQotICAgIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiAiaW52b2tlck1ldGhvZCBjYWxsIgotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXN0SXRlcmF0aW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXN0SXRlcmF0aW5nVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDk3YTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTGlzdEl0ZXJhdGluZ1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3QKLQotLyoqIAotICogVGVzdHMgaXRlcmF0aW5nIHVzaW5nIEdyb292eQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBMaXN0SXRlcmF0aW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotLyoqIEB0b2RvIHBhcnNlcgotICAgIHRlc3RJdGVyYXRpbmdXaXRoVHVwbGVzKCkgewotICAgICAgICBzID0gMSwgMiwgMywgNAotICAgICAgICBhc3NlcnRTZXF1ZW5jZShzKQotICAgIH0KLQotICAgIHRlc3RJdGVyYXRpbmdXaXRoVHVwbGVzQXNQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIGFzc2VydFNlcXVlbmNlKDEsIDIsIDMsIDQpCi0gICAgfQotKi8KLQotICAgIHZvaWQgdGVzdEl0ZXJhdGluZ1dpdGhTZXF1ZW5jZXMoKSB7Ci0gICAgICAgIHMgPSBbMSwgMiwgMywgNCBdCi0gICAgICAgIGFzc2VydFNlcXVlbmNlKHMpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEl0ZXJhdGluZ1dpdGhTZXF1ZW5jZXNBc1BhcmFtZXRlcigpIHsKLSAgICAgICAgYXNzZXJ0U2VxdWVuY2UoWzEsIDIsIDMsIDQgXSkKLSAgICB9Ci0gICAgCi0gICAgdGVzdEl0ZXJhdGluZ1dpdGhMaXN0KCkgewotICAgICAgICBzID0gbmV3IEFycmF5TGlzdCgpCi0gICAgICAgIHMuYWRkKDEpCi0gICAgICAgIHMuYWRkKDIpCi0gICAgICAgIHMuYWRkKDMpCi0gICAgICAgIHMuYWRkKDQpCi0gICAgICAgIGFzc2VydFNlcXVlbmNlKHMpCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFzc2VydFNlcXVlbmNlKHMpIHsKLSAgICAgICAgcmVzdWx0ID0gMAotICAgICAgICBmb3IgKCBpIGluIHMgKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBpCi0gICAgICAgIH0KLQkgICAgCi0gICAgICAgIGFzc2VydChyZXN1bHQgPT0gMTApCi0gICAgICAgIGFzc2VydChzLnNpemUoKSA9PSA0KQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0KHNbMl0gPT0gMykKLSAgICAgICAgLyoqIEB0b2RvIHBhcnNlcgotICAgICAgICByZXN1bHQgPSAwCi0gICAgICAgIGZvciAoIGkgaW4gc1sxOjJdICkgewotICAgICAgICAgICAgcmVzdWx0ICs9IGkKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQocmVzdWx0ID09IDIrMykKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXN0VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXN0VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDEwN2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTGlzdFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLWNsYXNzIExpc3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TGlzdCgpIHsKLSAgICAgICAgeCA9IFsxMCwgMTFdCi0JCQotCQlhc3NlcnQgeC5zaXplKCkgPT0gMgotCQkKLQkJeC5hZGQoImNoZWVzZSIpCi0JCQotCQlhc3NlcnQgeC5zaXplKCkgPT0gMwotCQkKLSAgICAgICAgYXNzZXJ0IHguY29udGFpbnMoMTApCi0gICAgICAgIGFzc2VydCB4LmNvbnRhaW5zKDExKQotCQlhc3NlcnQgeC5jb250YWlucygiY2hlZXNlIikKLQotCi0gICAgICAgIGFzc2VydCB4LmdldCgwKSA9PSAxMAotICAgICAgICBhc3NlcnQgeC5nZXQoMSkgPT0gMTEKLSAgICAgICAgYXNzZXJ0IHguZ2V0KDIpID09ICJjaGVlc2UiCi0KLQkJLy8gc3Vic2NyaXB0IG9wZXJhdG9yCi0JCWFzc2VydCB4WzBdID09IDEwCi0gICAgICAgIGFzc2VydCB4WzFdID09IDExCi0gICAgICAgIGFzc2VydCB4WzJdID09ICJjaGVlc2UiCi0JCQotICAgICAgICB4WzNdID0gMTIKLQkJCi0JCWFzc2VydCB4WzNdID09IDEyCi0JCQotCQkKLQkJaWYgKCB4LmNvbnRhaW5zKCJjaGVlc2UiKSApIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInggc2hvdWxkIGNvbnRhaW4gY2hlZXNlISIKLSAgICAgICAgfQotCQkKLSAgICAgICAgaWYgKCB4LmNvbnRhaW5zKDEwKSApIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInggc2hvdWxkIGNvbnRhaW4gMSEiCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RW1wdHlMaXN0KCkgewotICAgICAgICB4ID0gW10KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4LnNpemUoKSA9PSAwCi0gICAgICAgIAotICAgICAgIAl4LmFkZCgiY2hlZXNlIikKLSAgICAgICAJCi0gICAgICAgCWFzc2VydCB4LmdldCgwKSA9PSAiY2hlZXNlIgotCi0gICAgICAgIGFzc2VydCB4LnNpemUoKSA9PSAxCi0KLSAgICAgICAJYXNzZXJ0IHhbMF0gPT0gImNoZWVzZSIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3Vic2NyaXB0KCkgewotICAgICAgICB4ID0gW10KLSAgICAgICAgeFsxXSA9ICdjaGVlc2UnCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeFswXSA9PSBudWxsCi0gICAgICAgIGFzc2VydCB4WzFdID09ICdjaGVlc2UnCi0gICAgICAgIAotICAgICAgICB4WzJdID0gJ2dyb21pdCcKLSAgICAgICAgeFszXSA9ICd3YWxsYWNlJwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHguc2l6ZSgpID09IDQKLSAgICAgICAgCi0gICAgICAgIHhbLTFdID0gJ25pY2UnCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeFszXSA9PSAnbmljZScKLSAgICAgICAgCi0gICAgICAgIHhbLTJdID0gJ2NoZWVzZScKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4WzJdID09ICdjaGVlc2UnCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdENsb3N1cmUoKSB7Ci0gICAgICAgIGwgPSBbMSwgMiwgMywgImFiYyJdCi0gICAgICAgIGJsb2NrID0ge2l8IHByaW50bG4oaSkgfQotICAgICAgICBsLmVhY2goYmxvY2spCi0gICAgICAgIAotICAgICAgICBsLmVhY2gge2l8IHByaW50bG4oaSkgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNYXgoKSB7Ci0gICAgICAgIGwgPSBbMSwgMiwgNSwgMywgNywgMV0gICAgICAgIAotICAgICAgICBhc3NlcnQgbC5tYXgoKSA9PSA3Ci0gICAgICAgIAotICAgICAgICBsID0gWzcsIDIsIDNdCi0gICAgICAgIGFzc2VydCBsLm1heCgpID09IDcKLSAgICAgICAgCi0gICAgICAgIGwgPSBbMSwgMiwgN10KLSAgICAgICAgYXNzZXJ0IGwubWF4KCkgPT0gNwotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNaW4oKSB7Ci0gICAgICAgIGwgPSBbNiwgNCwgNSwgMSwgNywgMl0gICAgICAgIAotICAgICAgICBhc3NlcnQgbC5taW4oKSA9PSAxCi0gICAgICAgIAotICAgICAgICBsID0gWzcsIDEsIDNdCi0gICAgICAgIGFzc2VydCBsLm1pbigpID09IDEKLSAgICAgICAgCi0gICAgICAgIGwgPSBbMSwgMiwgN10KLSAgICAgICAgYXNzZXJ0IGwubWluKCkgPT0gMQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RQbHVzKCkgewotICAgICAgICBsMSA9IFs2LCA0LCA1LCAxLCA3LCAyXSAgICAgICAgCi0gICAgICAgIGwyID0gWzYsIDQsIDUsIDEsIDcsIFs0LDVdXQotICAgICAgICBhc3NlcnQgbDEgKyBsMiA9PSBbNiwgNCwgNSwgMSwgNywgMiwgNiwgNCwgNSwgMSwgNywgWzQsNV1dICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFBsdXNPbmVFbGVtZW50KCkgewotICAgICAgICBsMSA9IFs2LCA0LCA1LCAxLCA3LCAyXSAgICAgICAgCi0gICAgICAgIGwyID0gImVyZXJlcmVyIgotICAgICAgICBhc3NlcnQgbDEgKyBsMiA9PSBbNiwgNCwgNSwgMSwgNywgMiwgImVyZXJlcmVyIl0gICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TGlzdEFwcGVuZCgpIHsKLSAgICAgICAgbGlzdCA9IFsxLCAyXQotICAgICAgICAKLSAgICAgICAgbGlzdCA8PCAzIDw8IDQgPDwgNQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzEsIDIsIDMsIDQsIDVdCi0gICAgICAgIAotICAgICAgICB4ID0gW10gPDwgJ2EnIDw8ICdoZWxsbycgPDwgWzIsIDNdIDw8IDUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09IFsnYScsICdoZWxsbycsIFsyLCAzXSwgNV0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VGltZXMoKSB7Ci0gICAgICAgIGwgPSBbNCw3LDhdCi0gICAgICAgIGFzc2VydCBsICogMyA9PSBbNCwgNywgOCwgNCwgNywgOCwgNCwgNywgOF0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWludXMoKSB7Ci0gICAgICAgIGwxID0gWzEsIDEsIDIsIDIsIDMsIDMsIDMsIDQsIDVdIAotICAgICAgICBsMiA9IFsxLCAyLCA0XSAKLSAgICAgICAgYXNzZXJ0IGwxIC0gbDIgPT0gWzMsIDVdIAotICAgIH0KLQotICAgIHZvaWQgdGVzdE1pbnVzRGlmZmVyZW50VHlwZXMoKSB7Ci0gICAgICAgIGwxID0gWzEsIDEsICJ3cmVyIiwgMiwgMywgMywgIndyZXdlciIsIDQsIDUsICJ3IiwgInciXSAKLSAgICAgICAgbDIgPSBbMSwgMiwgInciXSAKLSAgICAgICAgYXNzZXJ0IGwxIC0gbDIgPT0gWyJ3cmVyIiwgMywgIndyZXdlciIsIDQsIDVdIAotICAgIH0gIAotICAgICAKLSAgICB2b2lkIHRlc3RJbnRlcnNlY3QoKSB7Ci0gICAgICAgIGwxID0gWzEsIDEsICJ3cmVyIiwgMiwgMywgMywgIndyZXdlciIsIDQsIDUsICJ3IiwgInciXSAKLSAgICAgICAgbDIgPSBbMSwgMiwgImYiLCAidyJdIAotICAgICAgICBhc3NlcnQgbDEuaW50ZXJzZWN0KGwyKSA9PSBbMSwgMiwgInciXSAKLSAgICB9Ci0gICAgICAKLSAgICB2b2lkIHRlc3RGbGF0dGVuKCkgewotICAgICAgICBsPSBbW1s0LCA1LCA2LCBbNDYsIDcsICJlcmVyIl1dLCA0LCBbMywgNiwgNzhdXSwgNF0KLSAgICAgICAgYXNzZXJ0IGwuZmxhdHRlbigpID09IFs0LCA1LCA2LCA0NiwgNywgImVyZXIiLCA0LCAzLCA2LCA3OCwgNF0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RmxhdHRlbldpdGhSYW5nZXMoKSB7Ci0gICAgICAgIGZsYXQgPSBbMSwgMywgMjAuLjI0LCAzM10uZmxhdHRlbigpCi0gICAgICAgIGFzc2VydCBmbGF0ID09IFsxLCAzLCAyMCwgMjEsIDIyLCAyMywgMjQsIDMzXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RMaXN0c0FuZFJhbmdlc0NvbXBhcmUoKSB7Ci0gICAgICAgIGwgPSBbMSwgMiwgM10KLSAgICAgICAgciA9IDEuLjMKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByID09IGwKLSAgICAgICAgYXNzZXJ0IGwgPT0gcgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0gICAgICAgIGwgPSBbJ2EnLCAnYicsICdjJ10KLSAgICAgICAgCi0gICAgICAgIGwucmVtb3ZlKDEpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbCA9PSBbJ2EnLCAnYyddCi0gICAgICAgIAotICAgICAgICBsLnJlbW92ZSgwKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGwgPT0gWydjJ10KLSAgICAgICAgYXNzZXJ0IGwuc2l6ZSgpID09IDEKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UG9wKCkgewotICAgICAgICBsID0gW10KLSAgICAgICAgbCA8PCAnYScgPDwgJ2InCi0gICAgICAgIHZhbHVlID0gbC5wb3AoKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2InCi0gICAgICAgIGFzc2VydCBsID09IFsnYSddCi0gICAgICAgIAotICAgICAgICBsLmFkZCgnYycpCi0gICAgICAgIHZhbHVlID0gbC5wb3AoKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2MnCi0gICAgICAgIHZhbHVlID0gbC5wb3AoKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2EnCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGwucG9wKCkKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcmludGxuICJXb3JrZWQ6IGNhdWdodCBleHBlY3RlZCBleGNlcHRpb246ICR7ZX0iCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXRlcmFsVHlwZXNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xpdGVyYWxUeXBlc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRlOTY2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xpdGVyYWxUeXBlc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBUZXN0IG51bWVyaWMgbGl0ZXJhbCB0eXBlcyAod2l0aCBhbmQgd2l0aG91dCBzdWZmaXhlcykKLSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyL0FTVEJ1aWxkZXIjY3JlYXRlSW50ZWdyYWxOdW1iZXIoKQotICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIvQVNUQnVpbGRlciNjcmVhdGVEZWNpbWFsTnVtYmVyKCkKLSAqCi0gKiBAYXV0aG9yIEJyaWFuIExhcnNvbgotICovCi1jbGFzcyBMaXRlcmFsVHlwZXNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0SW50ZWdyYWwoKSB7Ci0gICAgICAgIHggPSA0MjsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOwotCi0gICAgICAgIHggPSA0Mkk7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcjsKLQotICAgICAgICB4ID0gNDJpOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEludGVnZXI7Ci0KLSAgICAgICAgeCA9IDQyTDsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nOwotCi0gICAgICAgIHggPSA0Mkc7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKLQotICAgICAgICB4ID0gMHhGRjsgLy9IZXgKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgSW50ZWdlcigiMjU1Iik7Ci0KLSAgICAgICAgeCA9IDB4RkZMOyAvL0hleAotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7Ci0gICAgICAgIGFzc2VydCB4ID09IG5ldyBMb25nKCIyNTUiKTsKLQotICAgICAgICB4ID0gMHhGRkc7IC8vSGV4Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0ludGVnZXIoIkZGIiwxNik7Ci0KLSAgICAgICAgeCA9IDB4OTAwMDAwMDAwMDAwMDAwMDsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnSW50ZWdlcigiOTAwMDAwMDAwMDAwMDAwMCIsMTYpOwotCi0gICAgICAgIHggPSAwNzc7IC8vb2N0YWwKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgSW50ZWdlcigiNjMiKTsKLQotICAgICAgICB4ID0gMDc3bDsgLy9vY3RhbAotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7Ci0gICAgICAgIGFzc2VydCB4ID09IG5ldyBMb25nKCI2MyIpOwotCi0gICAgICAgIHggPSAwNzdnOyAvL29jdGFsCi0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0ludGVnZXIoIjc3Iiw4KTsKLQotICAgICAgICB4ID0gMjE0NzQ4MzY0NzsgICAgICAgICAgIC8vIG1heCBpbnRlZ2VyIHZhbHVlCi0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcjsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEludGVnZXIoIjIxNDc0ODM2NDciKTsKLQotICAgICAgICB4ID0gLTIxNDc0ODM2NDg7ICAgICAgICAgIC8vIG1pbiBpbnRlZ2VyIGNvbnN0YW50Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcjsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEludGVnZXIoIi0yMTQ3NDgzNjQ4Iik7Ci0KLSAgICAgICAgeCA9IC0yMTQ3NDgzNjQ5OyAgICAgICAgICAvLyBtaW4gaW50ZWdlciB2YWx1ZSAtIDEKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IExvbmcoIi0yMTQ3NDgzNjQ5Iik7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgTG9uZzsKLQotICAgICAgICB4ID0gMjE0NzQ4MzY0ODsgICAgICAgICAgIC8vIDEgKyBtYXggaW50ZWdlciB2YWx1ZQotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgTG9uZygiMjE0NzQ4MzY0OCIpOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7Ci0KLSAgICAgICAgeCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7ICAvLyBtYXggbG9uZyB2YWx1ZQotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgTG9uZygiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7Ci0KLSAgICAgICAgeCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4OyAvLyBtaW4gbG9uZyB2YWx1ZQotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgTG9uZygiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKTsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nOwotCi0gICAgICAgIHggPSAtOTIyMzM3MjAzNjg1NDc3NTgwOTsgLy8gbWluIGxvbmcgdmFsdWUgLSAxCi0gICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdJbnRlZ2VyKCItOTIyMzM3MjAzNjg1NDc3NTgwOSIpOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0ludGVnZXI7Ci0KLSAgICAgICAgeCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDg7ICAvLyAxICsgbWF4IGxvbmcgdmFsdWUKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0ludGVnZXIoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKTsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOwotCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0RGVjaW1hbCgpIHsKLSAgICAgICAgeCA9IDMuMjsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnRGVjaW1hbCgiMy4yIik7Ci0KLSAgICAgICAgeCA9IDMuMkc7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0RlY2ltYWwoIjMuMiIpOwotCi0gICAgICAgIHggPSAzLjJnOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdEZWNpbWFsKCIzLjIiKTsKLQotICAgICAgICB4ID0gLTMuMjsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnRGVjaW1hbCgiLTMuMiIpOwotCi0gICAgICAgIHggPSAzLjJEOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IERvdWJsZSgiMy4yIik7Ci0KLSAgICAgICAgeCA9IC0zLjJkOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IERvdWJsZSgiLTMuMiIpOwotCi0gICAgICAgIHggPSAzLjJGOwotICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEZsb2F0OwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgRmxvYXQoIjMuMiIpOwotCi0gICAgICAgIHggPSAtMy4yZjsKLSAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBGbG9hdDsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEZsb2F0KCItMy4yIik7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0RXhwb25lbnRpYWwoKSB7Ci0gICAgICAgIHggPSAzLjE0MTU5MjY1MzVlNDI7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0RlY2ltYWwoIjMuMTQxNTkyNjUzNWU0MiIpOwotCi0gICAgICAgIHggPSAzLjJlKzI7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0RlY2ltYWwoIjMuMmUrMiIpOwotCi0gICAgICAgIHggPSAzLjJlLTI7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0RlY2ltYWwoIjMuMmUtMiIpOwotCi0gICAgICAgIHggPSAzLjJlMmQ7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgRG91YmxlOwotICAgICAgICBhc3NlcnQgeCA9PSBuZXcgRG91YmxlKCIzLjJlMiIpOwotCi0gICAgICAgIHggPSAzLjJlMmY7Ci0gICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgRmxvYXQ7Ci0gICAgICAgIGFzc2VydCB4ID09IG5ldyBGbG9hdCgiMy4yZTIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9MaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGQzNzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTGl0dGxlQ2xvc3VyZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1jbGFzcyBMaXR0bGVDbG9zdXJlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdENsb3N1cmUoKSB7Ci0gICAgICAgIGJsb2NrID0ge3h8IHJldHVybiB4ID4gNX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb2NhbEZpZWxkVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb2NhbEZpZWxkVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzMzOWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9jYWxGaWVsZFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotY2xhc3MgTG9jYWxGaWVsZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHgKLQkKLQl2b2lkIHRlc3RBc3NlcnQoKSB7Ci0gICAgICAgIC8qKiBAdG9kbwotICAgICAgICB0aGlzLnggPSAiYWJjIgotCSAgICAKLQkgICAgYXNzZXJ0IHRoaXMueCA9PSAiYWJjIgotCSAgICBhc3NlcnQgdGhpcy54ICE9ICJkZWYiCi0gICAgICAgICAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvY2FsUHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvY2FsUHJvcGVydHlUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkOGQ1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb2NhbFByb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1jbGFzcyBMb2NhbFByb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3BlcnR5IHgKLSAgICAKLQl2b2lkIHRlc3ROb3JtYWxQcm9wZXJ0eUFjY2VzcygpIHsKLQkgICAgeCA9ICJhYmMiCi0JICAgIAotCSAgICBhc3NlcnQgeCA9PSAiYWJjIgotICAgICAgICBhc3NlcnQgeCAhPSAiZGVmIgotCX0KLQkKLQl2b2lkIHRlc3RQcm9wZXJ0eVdpdGhUaGlzKCkgewotICAgICAgICB0aGlzLnggPSAiYWJjIgotCSAgICAKLQkgICAgYXNzZXJ0IHRoaXMueCA9PSAiYWJjIgotCSAgICBhc3NlcnQgdGhpcy54ICE9ICJkZWYiCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9jYWxWYXJpYWJsZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9jYWxWYXJpYWJsZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQzMjU4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvY2FsVmFyaWFibGVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLWNsYXNzIExvY2FsVmFyaWFibGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QXNzZXJ0KCkgewotICAgICAgICB4ID0gImFiYyIKLQotICAgICAgICBhc3NlcnQgeCAhPSAiZm9vIgotICAgICAgICBhc3NlcnQgeCAhPSAgbnVsbAotICAgICAgICBhc3NlcnQgeCAhPSAiZGVmIgotICAgICAgICBhc3NlcnQgeCA9PSAiYWJjIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHguZXF1YWxzKCJhYmMiKQotCX0KLSAgICAKLSAgICB2b2lkIHRlc3RVbmtub3duVmFyaWFibGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICB5ID0geAotCSAgICAgICAgZmFpbCgieCBpcyB1bmRlZmluZWQsIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24iKQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0IGUuZ2V0UHJvcGVydHkoKSA9PSAieCIgICAgICAgICAgICAKLSAgICAgICAgICAgIHRleHQgPSBlLm1lc3NhZ2UKLQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKQotICAgICAgICAgICAgYXNzZXJ0IHRleHQgPT0gIk5vIHN1Y2ggcHJvcGVydHk6IHggZm9yIGNsYXNzOiBMb2NhbFZhcmlhYmxlVGVzdCIKLSAgICAgICAgfQotICAgIH0KLQkgICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb2dUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvZ1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjU5NTRmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvZ1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqIAotICogVGVzdHMgdGhlIHVzZSBvZiBHcm9vdnlMb2cKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgTG9nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotCXZvaWQgdGVzdFVzZUxvZygpIHsKLQkgICAgZmlsZSA9ICJzb21ldGhpbmcudHh0IgotCSAgICAKLSAgICAgICAgbG9nID0gR3Jvb3Z5TG9nLm5ld0luc3RhbmNlKGdldENsYXNzKCkpCi0gICAgICAgIAotICAgICAgICBsb2cuc3RhcnRpbmcoIkhleSBJJ20gc3RhcnRpbmcgdXAuLi4iKQotICAgICAgICAKLQkgICAgbG9nLm9wZW5GaWxlKCJBbSBhYm91dCB0byBvcGVuIGZpbGUgJHtmaWxlfSIpCi0JICAgIAotCSAgICAvLyAuLi4KLQkgICAgCi0JICAgIGxvZy5jbG9zZUZpbGUoIkhhdmUgY2xvc2VkIHRoZSBmaWxlICR7ZmlsZX0iKQotCi0gICAgICAgIGxvZy5zdG9wcGluZygiLi5GaW5pc2hlZCIpCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9naWNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L0xvZ2ljVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjM2MWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9naWNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLWNsYXNzIExvZ2ljVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEFuZFdpdGhUcnVlKCkgewotCi0gICAgICAgIHggPSBmYWxzZQotICAgICAgICBuID0gMgotICAgICAgICAKLSAgICAgICAgaWYgKCBuID4gMSAmJiBuIDwgMTAgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHggPT0gdHJ1ZQotICAgIH0KLQotICAgIHZvaWQgdGVzdEFuZFdpdGhGYWxzZSgpIHsKLQotICAgICAgICB4ID0gZmFsc2UKLSAgICAgICAgbiA9IDIwCi0gICAgICAgIAotICAgICAgICBpZiAoIG4gPiAxICYmIG4gPCAxMCApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSBmYWxzZQotCi0gICAgICAgIG4gPSAwCi0gICAgICAgIAotICAgICAgICBpZiAoIG4gPiAxICYmIG4gPCAxMCApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSBmYWxzZQotCX0KLQotICAgIHZvaWQgdGVzdE9yV2l0aFRydWUoKSB7Ci0KLSAgICAgICAgeCA9IGZhbHNlCi0gICAgICAgIG4gPSAyCi0gICAgICAgIAotICAgICAgICBpZiAoIG4gPiAxIHx8IG4gPCAxMCApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0KLSAgICAgICAgeCA9IGZhbHNlCi0gICAgICAgIG4gPSAwCi0gICAgICAgIAotICAgICAgICBpZiAoIG4gPiAxIHx8IG4gPT0gMCApIHsKLSAgICAgICAgICAgIHggPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0T3JXaXRoRmFsc2UoKSB7Ci0KLSAgICAgICAgeCA9IGZhbHNlCi0gICAgICAgIG4gPSAxMQotICAgICAgICAKLSAgICAgICAgaWYgKCBuIDwgMTAgfHwgbiA+IDIwICkgewotICAgICAgICAgICAgeCA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCB4ID09IGZhbHNlCi0KLSAgICAgICAgbiA9IDExCi0gICAgICAgIAotICAgICAgICBpZiAoIG4gPCAxMCB8fCBuID4gMjAgKSB7Ci0gICAgICAgICAgICB4ID0gdHJ1ZQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGFzc2VydCB4ID09IGZhbHNlCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTG9vcEJyZWFrVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb29wQnJlYWtUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjZDBmYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Mb29wQnJlYWtUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWNsYXNzIExvb3BCcmVha1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RXaGlsZVdpdGhCcmVhaygpIHsKLSAgICAgICAgeCA9IDAKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmICh4ID09IDUpIHsKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCsrCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCB4IDwgMTAgOiAiU2hvdWxkIG5ldmVyIGdldCBoZXJlIgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcmludGxuICJ3b3JrZWQ6IHdoaWxlIGNvbXBsZXRlZCB3aXRoIHZhbHVlICR7eH0iCi0JfQotICAgIAotICAgIAotICAgIHZvaWQgdGVzdERvV2hpbGVXaXRoQnJlYWsoKSB7Ci0gICAgICAgIHggPSAwCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIC8vcHJpbnRsbiAiaW4gZG8td2hpbGUgbG9vcCBhbmQgeCA9ICR7eH0iCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh4ID09IDUpIHsKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCsrCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCB4IDwgMTAgOiAiU2hvdWxkIG5ldmVyIGdldCBoZXJlIgotICAgICAgICB9Ci0gICAgCXdoaWxlICh0cnVlKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbiAid29ya2VkOiBkby13aGlsZSBjb21wbGV0ZWQgd2l0aCB2YWx1ZSAke3h9IgotICAgIH0KLQotICAgIHZvaWQgdGVzdEZvcldpdGhCcmVhaygpIHsKLSAgICAgICAgLyoqIEB0b2RvIGNvbW1lbnRpbmcgb3V0IHRoZSB4ID0gMCBjYXVzZXMgYnl0ZWNvZGUgZ2VuIGVycm9yICovCi0gICAgICAgIHggPSAwCi0gICAgICAgIGZvciAoeCBpbiAwLi4yMCkgewotICAgICAgICAgICAgaWYgKHggPT0gNSkgewotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnQgeCA8IDEwIDogIlNob3VsZCBuZXZlciBnZXQgaGVyZSIKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbiAid29ya2VkOiBmb3IgbG9vcCBjb21wbGV0ZWQgd2l0aCB2YWx1ZSAke3h9IgotICAgIH0KLSB9CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NYXBDb25zdHJ1Y3Rpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcENvbnN0cnVjdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDEwNzIyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcENvbnN0cnVjdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwCi1pbXBvcnQgamF2YS51dGlsLk1hcAotCi0vKiogCi0gKiBUZXN0cyBjcmVhdGluZyBNYXBzIGluIEdyb292eQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBNYXBDb25zdHJ1Y3Rpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TWFwKCkgewotICAgICAgICBtID0gWyAxIDogJ2FiYycsIDIgOiAnZGVmJywgMyA6ICd4eXonIF0KLQotICAgICAgICBwcmludGxuKG0pCi0KLSAgICAgICAgbXRvbyA9IFsgMSA6IFsgImlubmVyS2V5IiA6ICJpbm5lclZhbHVlIiBdLCAyIDogbSBdCi0KLSAgICAgICAgcHJpbnRsbihtdG9vKQotCi0gICAgICAgIGFzc2VydE1hcChtKQotICAgIH0KLQotICAgIHRlc3RNYXBBc1BhcmFtZXRlcigpIHsKLSAgICAgICAgYXNzZXJ0TWFwKFsgMSA6ICdhYmMnLCAyIDogJ2RlZicsIDMgOiAneHl6JyBdKQotICAgIH0KLQotICAgIHRlc3RNYXBWaWFIYXNoTWFwKCkgewotICAgICAgICBtID0gbmV3IEhhc2hNYXAoKQotICAgICAgICBtLnB1dCgxLCAnYWJjJykKLSAgICAgICAgbS5wdXQoMiwgJ2RlZicpCi0gICAgICAgIG0ucHV0KDMsICd4eXonKQotICAgICAgICBhc3NlcnRNYXAobSkKLSAgICB9Ci0KLSAgICBhc3NlcnRNYXAobSkgewotICAgICAgICBhc3NlcnQgbSBpbnN0YW5jZW9mIE1hcAotICAgICAgICBhc3NlcnQgbS5nZXRDbGFzcygpLmdldE5hbWUoKSA9PSAiamF2YS51dGlsLkhhc2hNYXAiCi0KLSAgICAgICAgcmVzdWx0ID0gMAotICAgICAgICB0ZXh0ID0gIiIKLSAgICAgICAgZm9yICggZSBpbiBtICkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgZS5rZXkKLSAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgZS52YWx1ZQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCByZXN1bHQgPT0gNgotICAgICAgICBhc3NlcnQgdGV4dCA9PSAiYWJjZGVmeHl6IgotCSAgICAKLSAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDMKLQotICAgICAgICBhc3NlcnQgbVsyXSA9PSAnZGVmJwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFByb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NYXBQcm9wZXJ0eVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM3NzYxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFByb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBNYXBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RHZXRBbmRTZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBtID0gWyAnbmFtZScgOiAnSmFtZXMnLCAnbG9jYXRpb24nIDogJ0xvbmRvbicsICdpZCc6MSBdCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbS5uYW1lID09ICdKYW1lcycKLSAgICAgICAgYXNzZXJ0IG0ubG9jYXRpb24gPT0gJ0xvbmRvbicKLSAgICAgICAgYXNzZXJ0IG0uaWQgPT0gMQotICAgICAgICAKLSAgICAgICAgbS5uYW1lID0gJ0JvYicKLSAgICAgICAgbS5sb2NhdGlvbiA9ICdBdGxhbnRhJwotICAgICAgICBtLmlkID0gMgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IG0ubmFtZSA9PSAnQm9iJwotICAgICAgICBhc3NlcnQgbS5sb2NhdGlvbiA9PSAnQXRsYW50YScKLSAgICAgICAgYXNzZXJ0IG0uaWQgPT0gMgotICAgIH0KLQotICAgIHZvaWQgdGVzdFNldHVwQW5kRW1wdHlNYXAoKSB7Ci0gICAgICAgIG0gPSBbOl0KLSAgICAgICAgCi0gICAgICAgIG0ubmFtZSA9ICdCb2InCi0gICAgICAgIG0ubG9jYXRpb24gPSAnQXRsYW50YScKLSAgICAgICAgbS5pZCA9IDIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBtLm5hbWUgPT0gJ0JvYicKLSAgICAgICAgYXNzZXJ0IG0ubG9jYXRpb24gPT0gJ0F0bGFudGEnCi0gICAgICAgIGFzc2VydCBtLmlkID09IDIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NYXBUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhjZDFlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotY2xhc3MgTWFwVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdE1hcCgpIHsKLQotICAgICAgICBtID0gWzE6J29uZScsICcyJzondHdvJywgMzondGhyZWUnXQotCi0JCWFzc2VydCBtLnNpemUoKSA9PSAzCi0JCWFzc2VydCBtLmdldCgxKSA9PSAnb25lJwotICAgICAgICBhc3NlcnQgbS5nZXQoJzInKSA9PSAndHdvJwotICAgICAgICBhc3NlcnQgbS5nZXQoMykgPT0gJ3RocmVlJwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IG0uY29udGFpbnNLZXkoMSkKLSAgICAgICAgYXNzZXJ0IG0uY29udGFpbnNLZXkoJzInKQotICAgICAgICBhc3NlcnQgbS5jb250YWluc0tleSgzKQotCQotICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCdvbmUnKQotICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCd0d28nKQotICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCd0aHJlZScpCi0JCi0gICAgICAgIGFzc2VydCBtLmtleVNldCgpLnNpemUoKSA9PSAzCi0gICAgICAgIGFzc2VydCBtLnZhbHVlcygpLnNpemUoKSA9PSAzCi0gICAgICAgIGFzc2VydCBtLmtleVNldCgpLmNvbnRhaW5zKDEpCi0gICAgICAgIGFzc2VydCBtLnZhbHVlcygpLmNvbnRhaW5zKCdvbmUnKQotCQotICAgICAgICBtLnJlbW92ZSgxKQotICAgICAgICBtLnJlbW92ZSgnMicpCi0JCQotICAgICAgICBhc3NlcnQgbS5zaXplKCkgPT0gMQotICAgICAgICBhc3NlcnQgbS5nZXQoJzEnKSA9PSBudWxsCi0gICAgICAgIGFzc2VydCBtLmdldCgnMicpID09IG51bGwKLSAgICAgICAgCi0JCW0ucHV0KCdjaGVlc2UnLCAnY2hlZGRhcicpCi0JCQotICAgICAgICBhc3NlcnQgbS5zaXplKCkgPT0gMgotCi0gICAgICAgIGFzc2VydCBtLmNvbnRhaW5zS2V5KCJjaGVlc2UiKQotICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCJjaGVkZGFyIikKLQkJCi0JCQotCQlpZiAoIG0uY29udGFpbnNLZXkoImNoZWVzZSIpICkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAic2hvdWxkIGNvbnRhaW4gY2hlZXNlISIKLSAgICAgICAgfQotCQkKLSAgICAgICAgaWYgKCBtLmNvbnRhaW5zS2V5KDMpICkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAic2hvdWxkIGNvbnRhaW4gMyEiCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RW1wdHlNYXAoKSB7Ci0gICAgCW0gPSBbOl0KLSAgICAJCi0gICAgCWFzc2VydCBtLnNpemUoKSA9PSAwCi0gICAgCWFzc2VydCAhbS5jb250YWluc0tleSgiY2hlZXNlIikKLSAgICAJCi0gICAgCW0ucHV0KCJjaGVlc2UiLCAiY2hlZGRhciIpCi0KLSAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDEKLSAgICAgICAgYXNzZXJ0IG0uY29udGFpbnNLZXkoImNoZWVzZSIpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE1hcE11dGF0aW9uKCkgeyAgICAKLSAgICAgICAgbSA9IFsgJ2FiYycgOiAnZGVmJywgJ2RlZicgOiAxMzQsICd4eXonIDogJ3p6eicgXQotCSAgICAKLQkgICAgYXNzZXJ0IG1bJ3Vua25vd24nXSA9PSBudWxsCi0JICAgIAotCSAgICBhc3NlcnQgbVsnZGVmJ10gPT0gMTM0Ci0JICAgIAotICAgICAgICBwcmludGxuKG1bJ3h5eiddKQotICAgICAgICAKLSAgICAgICAgbVsnZGVmJ10gPSAnY2FmZWJhYmUnCi0JICAgIAotICAgICAgICBhc3NlcnQgbVsnZGVmJ10gPT0gJ2NhZmViYWJlJwotCSAgICAKLSAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDMKLQkgICAgCi0gICAgICAgIG0ucmVtb3ZlKCdkZWYnKQotCSAgICAKLSAgICAgICAgYXNzZXJ0IG1bJ2RlZiddID09IG51bGwKLSAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NZXRob2RDYWxsVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NZXRob2RDYWxsVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYTM5ZGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotY2xhc3MgTWV0aG9kQ2FsbFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJoZWxsbyIpCi0gICAgICAgIHByaW50bG4oIndvcmxkISIpCi0JfQotCQotICAgIHZvaWQgdGVzdE9iamVjdE1ldGhvZENhbGwoKSB7Ci0gICAgICAgIGMgPSBnZXRDbGFzcygpCi0gICAgICAgIGFzc2VydCBjICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IGMubmFtZS5lbmRzV2l0aCgiTWV0aG9kQ2FsbFRlc3QiKQotICAgICAgICBhc3NlcnQgYy5nZXROYW1lKCkuZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKLSAgICB9Ci0JCi0gICAgdm9pZCB0ZXN0T2JqZWN0TWV0aG9kQ2FsbDIoKSB7Ci0gICAgICAgIHMgPSAiaGVsbG8iCi0gICAgICAgIGMgPSBzLmdldENsYXNzKCkKLSAgICAgICAgYXNzZXJ0IGMgIT0gbnVsbAotICAgICAgICBhc3NlcnQgYy5uYW1lID09ICJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICBhc3NlcnQgYy5nZXROYW1lKCkgPT0gImphdmEubGFuZy5TdHJpbmciCi0gICAgfQotCQotCXZvaWQgdGVzdEdldE5hbWVCdWcoKSB7Ci0JICAgIGMgPSBnZXRDbGFzcygpCi0JICAgIG4gPSBjLmdldE5hbWUoKQotICAgICAgICBhc3NlcnQgYy5nZXROYW1lKCkuZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKLSAgICAgICAgYXNzZXJ0IG4uZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NZXRob2RDYWxsV2l0aG91dFBhcmVudGhlc2lzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NZXRob2RDYWxsV2l0aG91dFBhcmVudGhlc2lzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjBmOGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnRoZXNpc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotY2xhc3MgTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnRoZXNpc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBmbGFnID0gZmFsc2UKLSAgICAKLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aE9uZVBhcmFtKCkgewotICAgICAgICBmbGFnID0gZmFsc2UKLSAgICAgICAgCi0gICAgICAgIG1ldGhvZFdpdGhPbmVQYXJhbSAiaGVsbG8iCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZmxhZwotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aE9uZVBhcmFtVXNpbmdUaGlzKCkgewotICAgICAgICBmbGFnID0gZmFsc2UKLSAgICAgICAgCi0gICAgICAgIHRoaXMubWV0aG9kV2l0aE9uZVBhcmFtICJoZWxsbyIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBmbGFnCi0gICAgfQotICAgIAotICAgIHZvaWQgbWV0aG9kV2l0aE9uZVBhcmFtKHRleHQpIHsKLSAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1ldGhvZCB3aXRoIHBhcmFtZXRlciAke3RleHR9IikKLSAgICAgICAgYXNzZXJ0IHRleHQgPT0gImhlbGxvIgotICAgICAgICBmbGFnID0gdHJ1ZQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aFR3b1BhcmFtcygpIHsKLSAgICAgICAgdmFsdWUgPSBtZXRob2RXaXRoVHdvUGFyYW1zIDUsIDYKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxMQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aFR3b1BhcmFtc1VzaW5nVGhpcygpIHsKLSAgICAgICAgdmFsdWUgPSB0aGlzLm1ldGhvZFdpdGhUd29QYXJhbXMgNSwgNgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDExCi0gICAgfQotICAgIAotICAgIG1ldGhvZFdpdGhUd29QYXJhbXMoYSwgYikgewotICAgICAgICBwcmludGxuKCJDYWxsZWQgbWV0aG9kIHdpdGggcGFyYW1ldGVycyAke2F9IGFuZCAke2J9IikKLSAgICAgICAgYSArIGIKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kUGFyYW1ldGVyQWNjZXNzV2l0aGluQ2xvc3VyZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kUGFyYW1ldGVyQWNjZXNzV2l0aGluQ2xvc3VyZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRjYTVmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01ldGhvZFBhcmFtZXRlckFjY2Vzc1dpdGhpbkNsb3N1cmVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKgotICogVG8gdGVzdCBhY2Nlc3MgdG8gbWV0aG9kIHNjb3BlZCB2YXJpYWJsZSB3aXRoaW4gY2xvc3VyZQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLWNsYXNzIE1ldGhvZFBhcmFtZXRlckFjY2Vzc1dpdGhpbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKLSAgICBwcm9wZXJ0eSBjaGVlc2UKLSAgICBwcm9wZXJ0eSBzaG9wCi0gICAgICAgCi0gICAgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgY2hlZXNlID0gbnVsbAotICAgICAgICBzaG9wID0gWyJ3ZW5zbGV5ZGFsZSJdCi0gICAgfSAgICAgICAgICAgICAgCi0gICAgdm9pZCB0ZXN0U2ltcGxlTWV0aG9kUGFyYW1ldGVyQWNjZXNzKCkgeyAKLSAgICAgICAgYXNzZXJ0ICJ3ZW5zbGV5ZGFsZSIgPT0gdmVuZG9yMSgid2Vuc2xleWRhbGUiKSAKLSAgICB9Ci0gICAgdm9pZCB0ZXN0TWV0aG9kUGFyYW1ldGVyV2l0aERpZmZlcmVudE5hbWVUb1Byb3BlcnR5VXNpbmdDbG9zdXJlKCkgewotICAgICAgICBhc3NlcnQgIndlbnNsZXlkYWxlIiA9PSB2ZW5kb3IyKCJ3ZW5zbGV5ZGFsZSIpCi0gICAgfQotICAgIHZvaWQgdGVzdE1ldGhvZFBhcmFtZXRlcldpdGhTYW1lTmFtZUFzUHJvcGVydHlVc2luZ0Nsb3N1cmUoKSB7Ci0gICAgICAgIC8vQHRvZG8gZmFpbHMgaW4gMS4wYjYgICAKLSAgICAgICAgLy9hc3NlcnQgIndlbnNsZXlkYWxlIiA9PSB2ZW5kb3IzKCJ3ZW5zbGV5ZGFsZSIpCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHZlbmRvcjEoY2hlZXNlKSB7Ci0gICAgICAgIGNoZWVzZQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyB2ZW5kb3IyKGFDaGVlc2UpIHsKLSAgICAgICAgc2hvcC5maW5kKCkge2l0ID09IGFDaGVlc2V9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHZlbmRvcjMoY2hlZXNlKSB7Ci0gICAgICAgIC8vIHByb2JsZW0gaXMgdGhhdCBjaGVlc2UgaGVyZSByZWZlcnMgdG8gcHJvcGVydHkgJ2NoZWVzZScKLSAgICAgICAgLy8gYW5kIG5vdCB0aGUgbWV0aG9kIHBhcmFtZXRlciAnY2hlZXNlJwotICAgICAgICBzaG9wLmZpbmQoKSB7aXQgPT0gY2hlZXNlfSAgICAgIAotICAgIH0KLX0gCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NaW5NYXhUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01pbk1heFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdmMzUxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L01pbk1heFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqIAotICogVGVzdHMgdGhlIG1pbigpIGFuZCBtYXgoKSBmdW5jdGlvbnMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgTWluTWF4VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFNpbXBsZU1pbk1heCgpIHsKLSAgICAgICAgbGlzdCA9IFs1LCAyLCA2LCAxLCA5LCA4XQotICAgICAgICAKLSAgICAgICAgbiA9IGxpc3QubWluKCkKLSAgICAgICAgYXNzZXJ0IG4gPT0gMQotICAgICAgICAKLSAgICAgICAgbiA9IGxpc3QubWF4KCkKLSAgICAgICAgYXNzZXJ0IG4gPT0gOQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNaW5NYXhXaXRoQ29tcGFyYXRvcigpIHsKLQkJcGVvcGxlID0gZ2V0UGVvcGxlKCkKLQkJCi0JCS8vIGxldHMgZmluZCB0aGUgbWF4aW11bSBieSBuYW1lCi0JCQotCQlvcmRlciA9IG5ldyBPcmRlckJ5KCB7IGl0LmdldCgnQGNoZWVzZScpIH0gKQotCQkKLQkJcHJpbnRsbigiUGVvcGxlICR7cGVvcGxlfSIpCi0JCQotCQlwID0gcGVvcGxlLm1pbihvcmRlcikKLQkJCi0JCXByaW50bG4oIkZvdW5kICR7cH0iKQotCQkKLQkJYXNzZXJ0IHAuZ2V0KCJAbmFtZSIpID09ICJKb2UiIDogImZvdW5kIHBlcnNvbiAke3B9IgotCQkKLQkJcCA9IHBlb3BsZS5tYXgob3JkZXIpCi0JCWFzc2VydCBwLmdldCgiQG5hbWUiKSA9PSAiQ2hyaXMiIDogImZvdW5kIHBlcnNvbiAke3B9IgotCX0KLSAgICAKLSAgICBnZXRQZW9wbGUoKSB7Ci0gICAgICAgIGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoKQotICAgICAgICB0cmVlID0gYnVpbGRlci5wZW9wbGUgewotICAgICAgICAgICAgcGVyc29uKG5hbWU6J0phbWVzJywgY2hlZXNlOidFZGFtJywgbG9jYXRpb246J0xvbmRvbicpCi0gICAgICAgICAgICBwZXJzb24obmFtZTonQm9iJywgY2hlZXNlOidDaGVkZGFyJywgbG9jYXRpb246J0F0bGFudGEnKQotICAgICAgICAgICAgcGVyc29uKG5hbWU6J0NocmlzJywgY2hlZXNlOidSZWQgTGVpY2VzdGVyJywgbG9jYXRpb246J0xvbmRvbicpCi0gICAgICAgICAgICBwZXJzb24obmFtZTonSm9lJywgY2hlZXNlOidCcmllJywgbG9jYXRpb246J0xvbmRvbicpCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cmVlLmNoaWxkcmVuKCkKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NaW51c0VxdWFsc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTWludXNFcXVhbHNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzZmYxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NaW51c0VxdWFsc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotY2xhc3MgTWludXNFcXVhbHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0SW50ZWdlck1pbnVzRXF1YWxzKCkgewotICAgICAgICB4ID0gNAotICAgICAgICB5ID0gMgotICAgICAgICB4IC09IHkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09IDIKLSAgICAgICAgCi0gICAgICAgIHkgLT0gMQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gMQotICAgIH0KLQotICAgIHZvaWQgdGVzdENoYXJhY3Rlck1pbnVzRXF1YWxzKCkgewotICAgICAgICBDaGFyYWN0ZXIgeCA9IDQKLSAgICAgICAgQ2hhcmFjdGVyIHkgPSAyCi0gICAgICAgIHggLT0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMgotICAgICAgICAKLSAgICAgICAgeSAtPSAxCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeSA9PSAxCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE51bWJlck1pbnVzRXF1YWxzKCkgewotICAgICAgICB4ID0gNC4yCi0gICAgICAgIHkgPSAyCi0gICAgICAgIHggLT0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMi4yCi0gICAgICAgIAotICAgICAgICB5IC09IDAuMQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gMS45Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFN0cmluZ01pbnVzRXF1YWxzKCkgewotICAgICAgICBmb28gPSAibmljZSBjaGVlc2UiCi0gICAgICAgIGZvbyAtPSAiY2hlZXNlIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvbyA9PSAibmljZSAiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTW9kdWxvVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Nb2R1bG9UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhYmZiOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Nb2R1bG9UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLWNsYXNzIE1vZHVsb1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gIGludCBtb2R1bG8gPSAxMDAKLQotICB2b2lkIHRlc3RNb2R1bG9MZXNzZXIoKSB7Ci0gICAgZm9yIChpIGluIDAuLm1vZHVsby0xKSB7Ci0gICAgICBhc3NlcnQgKGklbW9kdWxvKT09aQotICAgIH0KLSAgfQotCi0gIHZvaWQgdGVzdE1vZHVsb0VxdWFsKCkgewotICAgIGZvciAoaSBpbiAwLi5tb2R1bG8pIHsKLSAgICAgIGFzc2VydCAoKGkqbW9kdWxvKSAlIG1vZHVsbyk9PTAKLSAgICB9Ci0gIH0KLQotICB2b2lkIHRlc3RNb2R1bG9CaWdnZXIoKSB7Ci0gICAgZm9yIChpIGluIDAuLm1vZHVsby0xKSB7Ci0gICAgICBhc3NlcnQgKChpKm1vZHVsbytpKSAlIG1vZHVsbyk9PWkKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTXVsdGlsaW5lU3RyaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NdWx0aWxpbmVTdHJpbmdUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNTA0NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9NdWx0aWxpbmVTdHJpbmdUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWNsYXNzIE11bHRpbGluZVN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RNdWx0aWxpbmVTdHJpbmcoKSB7Ci0gICAgICAgIHMgPSAiYWJjZAotZWZnCi0KLSAgICAgICAgaGlqawotICAgICAgICAKLSIKLSAgICAgICAgcHJpbnRsbihzKQotCQlhc3NlcnQgcyAhPSBudWxsCi0gICAgICAgIGlkeCA9IHMuaW5kZXhPZigiaSIpCi0JCWFzc2VydCBpZHggPiAwCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTXVsdGlwbHlEaXZpZGVFcXVhbHNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L011bHRpcGx5RGl2aWRlRXF1YWxzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzNhOWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTXVsdGlwbHlEaXZpZGVFcXVhbHNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLWNsYXNzIE11bHRpcGx5RGl2aWRlRXF1YWxzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEludGVnZXJNdWx0aXBseUVxdWFscygpIHsKLSAgICAgICAgeCA9IDIKLSAgICAgICAgeSA9IDMKLSAgICAgICAgeCAqPSB5Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA9PSA2Ci0gICAgICAgIAotICAgICAgICB5ICo9IDQKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDEyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2hhcmFjdGVyTXVsdGlwbHlFcXVhbHMoKSB7Ci0gICAgICAgIENoYXJhY3RlciB4ID0gMgotICAgICAgICBDaGFyYWN0ZXIgeSA9IDMKLSAgICAgICAgeCAqPSB5Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA9PSA2Ci0gICAgICAgIAotICAgICAgICB5ICo9IDQKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDEyCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE51bWJlck11bHRpcGx5RXF1YWxzKCkgewotICAgICAgICB4ID0gMS4yCi0gICAgICAgIHkgPSAyCi0gICAgICAgIHggKj0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMi40Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFN0cmluZ011bHRpcGx5RXF1YWxzKCkgewotICAgICAgICB4ID0gImJiYyIKLSAgICAgICAgeSA9IDIKLSAgICAgICAgeCAqPSB5Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA9PSAiYmJjYmJjIgotCi0gICAgICAgIHggPSAiR3VpbGxhdW1lIgotICAgICAgICB5ID0gMAotICAgICAgICB4ICo9IHkKLSAgICAgICAgYXNzZXJ0IHggPT0gIiIKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgdm9pZCB0ZXN0SW50ZWdlckRpdmlkZUVxdWFscygpIHsKLSAgICAgICAgeCA9IDE4Ci0gICAgICAgIHkgPSA2Ci0gICAgICAgIHggLz0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMy4wCi0gICAgICAgIAotICAgICAgICB5IC89IDMKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDIuMAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDaGFyYWN0ZXJEaXZpZGVFcXVhbHMoKSB7Ci0gICAgICAgIENoYXJhY3RlciB4ID0gMTgKLSAgICAgICAgQ2hhcmFjdGVyIHkgPSA2Ci0gICAgICAgIHggLz0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gMy4wCi0gICAgICAgIAotICAgICAgICB5IC89IDMKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDIuMAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3ROdW1iZXJEaXZpZGVFcXVhbHMoKSB7Ci0gICAgICAgIHggPSAxMC40Ci0gICAgICAgIHkgPSAyCi0gICAgICAgIHggLz0geQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gNS4yCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTmFtZWRQYXJhbWV0ZXJUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05hbWVkUGFyYW1ldGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmY0ZTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTmFtZWRQYXJhbWV0ZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWNsYXNzIE5hbWVkUGFyYW1ldGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFBhc3NpbmdOYW1lZFBhcmFtZXRlcnNUb01ldGhvZCgpIHsKLSAgICAgICAgc29tZU1ldGhvZChuYW1lOiJncm9taXQiLCBlYXRpbmc6Im5pY2UgY2hlZXNlIiwgdGltZXM6MikKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHNvbWVNZXRob2QoYXJncykgewotICAgICAgICBhc3NlcnQgYXJncy5uYW1lID09ICJncm9taXQiCi0gICAgICAgIGFzc2VydCBhcmdzLmVhdGluZyA9PSAibmljZSBjaGVlc2UiCi0gICAgICAgIGFzc2VydCBhcmdzLnRpbWVzID09IDIKLSAgICAgICAgYXNzZXJ0IGFyZ3Muc2l6ZSgpID09IDMKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OZWdhdGVMaXN0c1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTmVnYXRlTGlzdHNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMjI1My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OZWdhdGVMaXN0c1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqIAotICogVGVzdCB0byBuZWdhdGUgbGlzdHMgaW4gQ2xhc3NpYyBHcm9vdnkuCi0gKiBUZXN0IHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmdW5jdGlvbiBpcyBldmVuL29kZCBvbiBhIGdpdmVuIGRvbWFpbi4KLSAqIAotICogQGF1dGhvciBQaWxobyBLaW0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgTmVnYXRlTGlzdHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TmVnYXRlTGlzdCgpIHsKLSAgICAgICAgYXNzZXJ0IC1bMSwgMiwgM10gPT0gWy0xLCAtMiwgLTNdCi0KLSAgICAgICAgeCA9IFsxLCAyLCAzXQotICAgICAgICBhc3NlcnQgLXggPT0gWy0xLCAtMiwgLTNdCi0gICAgICAgIGFzc2VydCB4ID09IC1bLTEsIC0yLCAtM10KLSAgICAgICAgYXNzZXJ0IC0oLXgpID09IHgKLQotICAgICAgICB5ID0gWy0xLCAtMiwgLTNdCi0gICAgICAgIGFzc2VydCAteCA9PSB5Ci0gICAgICAgIGFzc2VydCB4ID09IC15Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qml0d2lzZU5lZ2F0ZUxpc3QoKSB7Ci0gICAgICAgIGFzc2VydCB+WzEsIDIsIDNdID09IFstMiwgLTMsIC00XQotCi0gICAgICAgIHggPSBbMSwgMiwgM10KLSAgICAgICAgYXNzZXJ0IH54ID09IFstMiwgLTMsIC00XQotICAgICAgICBhc3NlcnQgeCA9PSB+Wy0yLCAtMywgLTRdCi0gICAgICAgIGFzc2VydCB+fnggPT0geAotICAgICAgICBhc3NlcnQgfih+eCkgPT0geAotCi0gICAgICAgIHkgPSBbLTIsIC0zLCAtNF0KLSAgICAgICAgYXNzZXJ0IH54ID09IFstMiwgLTMsIC00XQotICAgICAgICBhc3NlcnQgeCA9PSB+eQotICAgIH0KLQotICAgIHZvaWQgdGVzdEV2ZW5GdW5jdGlvbigpIHsKLSAgICAgICAgUEkgPSBNYXRoLlBJCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIEEgY2FzZSBvZiBwYXJ0aXRpb24gaGF2aW5nIDEwIHN1YmludGVydmFscy4KLSAgICAgICAgLy8geCA9IFswLjAqUEkvMiwgMC4xKlBJLzIsIDAuMipQSS8yLCAwLjMqUEkvMiwgMC40KlBJLzIsIDAuNSpQSS8yLCAKLSAgICAgICAgLy8gICAgICAgICAgICAgICAwLjYqUEkvMiwgMC43KlBJLzIsIDAuOCpQSS8yLCAwLjkqUEkvMiwgMS4wKlBJLzJdCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIEdlbmVyYXRlIGEgZG9tYWluIG9mIGZ1bmN0aW9uIHVzZWQgb20gdGVzdGluZy4KLSAgICAgICAgbiA9IDEwMDAgICAgLy8gdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIGZvciB0aGUgaW50ZXJ2YWwgMC4uMi9QSQotICAgICAgICB4ID0gW10KLSAgICAgICAgZm9yIChpIGluIDAuLm4pIHsKLSAgICAgICAgICAgIHggPDwgaSpQSS9uCi0gICAgICAgIH0KLSAgICAgICAgLy8gcHJpbnRsbiB4Ci0KLSAgICAgICAgY29zID0geyBNYXRoLmNvcyhpdCkgfQotICAgICAgICBhc3NlcnRUcnVlKGlzRXZlbkZuKGNvcywgeCkpCi0KLSAgICAgICAgc2luID0geyBNYXRoLnNpbihpdCkgfQotICAgICAgICBhc3NlcnRUcnVlKGlzT2RkRm4oc2luLCB4KSkKLQotICAgICAgICB0YW4gPSB7IE1hdGgudGFuKGl0KSB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNPZGRGbih0YW4sIHgpKQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNFdmVuRm4oZiwgZG9tYWluKSB7Ci0gICAgICAgIC8vIHByaW50bG4gZG9tYWluLmNvbGxlY3QoZikKLSAgICAgICAgLy8gcHJpbnRsbiggKC1kb21haW4pLmNvbGxlY3QoZikgKQotICAgICAgICBwcmludGxuKCAoZG9tYWluLmNvbGxlY3QoZikpID09ICgoLWRvbWFpbikuY29sbGVjdChmKSkgKQotICAgICAgICByZXR1cm4gKGRvbWFpbi5jb2xsZWN0KGYpKSA9PSAoKC1kb21haW4pLmNvbGxlY3QoZikpCi0gICAgfQotCi0gICAgYm9vbGVhbiBpc09kZEZuKGYsIGRvbWFpbikgewotICAgICAgICAvLyBwcmludGxuIGRvbWFpbi5jb2xsZWN0KGYpCi0gICAgICAgIC8vIHByaW50bG4oICAoLWRvbWFpbikuY29sbGVjdChmKSApCi0gICAgICAgIHByaW50bG4oIGRvbWFpbi5jb2xsZWN0KGYpID09IC0oKC1kb21haW4pLmNvbGxlY3QoZikpICkKLSAgICAgICAgcmV0dXJuIGRvbWFpbi5jb2xsZWN0KGYpID09IC0oKC1kb21haW4pLmNvbGxlY3QoZikpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05lZ2F0aW9uVGVzdHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTmVnYXRpb25UZXN0cy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTQ3OGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTmVnYXRpb25UZXN0cy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1jbGFzcyBOZWdhdGlvblRlc3RzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0Jdm9pZCB0ZXN0TmVnYXRlSW50ZWdlcigpIHsKLQkJYSA9IC0xCi0JCWFzc2VydCBhID09IC0xCi0JfQotCi0Jdm9pZCB0ZXN0TmVnYXRlSW50ZWdlckV4cHJlc3Npb24oKSB7Ci0JCWEgPSAtMQotCQlhID0gLWEKLQkJYXNzZXJ0IGEgPT0gMQotCX0KLQotCXZvaWQgdGVzdE5lZ2F0ZURvdWJsZSgpIHsKLQkJYSA9IC0xLjAKLQkJYXNzZXJ0IGEgPT0gLTEuMAotCX0KLQotCXZvaWQgdGVzdE5lZ2F0ZURvdWJsZUV4cHJlc3Npb24oKSB7Ci0JCWEgPSAtMS4wCi0JCWEgPSAtYQotCQlhc3NlcnQgYSA9PSAxLjAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05ld0V4cHJlc3Npb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05ld0V4cHJlc3Npb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1NDhkYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OZXdFeHByZXNzaW9uVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkR1bW15QmVhbgotCi1jbGFzcyBOZXdFeHByZXNzaW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdE5ld0luc3RhbmNlKCkgewotICAgICAgICBjaGVlc2UgPSBuZXcgU3RyaW5nKCAiaGV5IHlvdSBob3NlcnMiICkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjaGVlc2UgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgcHJpbnRsbihjaGVlc2UpCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TmV3QmVhbk5vQXJncygpIHsKLSAgICAgICAgYmVhbiA9IG5ldyBEdW1teUJlYW4oKQotICAgICAgICBhc3NlcnQgYmVhbi5uYW1lID09ICJKYW1lcyIKLSAgICAgICAgYXNzZXJ0IGJlYW4uaSA9PSAxMjMKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3ROZXdCZWFuMUFyZ3MoKSB7Ci0gICAgICAgIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCJCb2IiKQotICAgICAgICBhc3NlcnQgYmVhbi5uYW1lID09ICJCb2IiCi0gICAgICAgIGFzc2VydCBiZWFuLmkgPT0gMTIzCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TmV3QmVhbjJBcmdzKCkgewotICAgICAgICBiZWFuID0gbmV3IER1bW15QmVhbigiQm9iIiwgMTcwNykKLSAgICAgICAgYXNzZXJ0IGJlYW4ubmFtZSA9PSAiQm9iIgotICAgICAgICBhc3NlcnQgYmVhbi5pID09IDE3MDcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Ob1BhY2thZ2VUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05vUGFja2FnZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU4N2NmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L05vUGFja2FnZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jbGFzcyBOb1BhY2thZ2VUZXN0Ci0JZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQotewotICAgIHZvaWQgdGVzdENsYXNzRGVmKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBnZXRDbGFzcygpLm5hbWUgPT0gIk5vUGFja2FnZVRlc3QiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTnVsbFByb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OdWxsUHJvcGVydHlUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NWRlZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OdWxsUHJvcGVydHlUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qKgotICogQGF1dGhvciBKZXJlbXkgUmF5bmVyIAotICovCi1jbGFzcyBOdWxsUHJvcGVydHlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKLSAgICB3ZW5zbGV5ZGFsZSA9IG51bGwgCi0KLSAgICB2b2lkIHRlc3ROdWxsUHJvcGVydHkoKSB7IAotICAgICAgICBhc3NlcnQgd2Vuc2xleWRhbGUgPT0gbnVsbCAKLSAgICB9IAotfSAKLQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OdW1iZXJNYXRoVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9OdW1iZXJNYXRoVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmRlZWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvTnVtYmVyTWF0aFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqIAotICogQmFzaWMgTnVtYmVyTWF0aCB0ZXN0LgotICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTnVtYmVyTWF0aAotICovCi1jbGFzcyBOdW1iZXJNYXRoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFByb21vdGlvbnMoKSB7Ci0gICAgCUMgPSAnMScudG9DaGFyYWN0ZXIoKTsKLSAgICAJQiA9IG5ldyBCeXRlKCIxIik7Ci0gICAgCUkgPSBuZXcgSW50ZWdlcigxKTsKLSAgICAJTCA9IG5ldyBMb25nKDEpOwotICAgIAlGID0gbmV3IEZsb2F0KCIxLjAiKTsKLSAgICAJRCA9IG5ldyBEb3VibGUoIjEuMCIpOwotICAgIAlCSSA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7Ci0gICAgCUJEID0gbmV3IEJpZ0RlY2ltYWwoIjEuMCIpOwotICAgIAkKLSAgICAJLy8rLCAtLCBhbmQgKiBhbGwgcHJvbW90ZSB0aGUgc2FtZSB3YXksIHNvIHNhbXBsZSB0aGUgbWF0cml4Ci0gICAgCWFzc2VydCBDK0IgaW5zdGFuY2VvZiBJbnRlZ2VyOwotICAgIAlhc3NlcnQgQy1CRCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBCK0YgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCWFzc2VydCBCK0kgaW5zdGFuY2VvZiBJbnRlZ2VyOwotICAgIAkKLSAgICAJYXNzZXJ0IEkrSSBpbnN0YW5jZW9mIEludGVnZXI7Ci0gICAgCWFzc2VydCBJLUYgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCWFzc2VydCBJKkQgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCWFzc2VydCBJK0JJIGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKLSAgICAJYXNzZXJ0IEktQkQgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgIAkKLSAgICAJYXNzZXJ0IEYqTCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEQrTCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEJJLUwgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOwotICAgIAlhc3NlcnQgQkQqTCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCQotICAgIAlhc3NlcnQgRitGIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgRi1CSSBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEYqQkQgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCQotICAgIAlhc3NlcnQgRitEIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgQkktRCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEJEKkQgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCQotICAgIAlhc3NlcnQgQkkrQkkgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOwotICAgIAlhc3NlcnQgQkQtQkkgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgIAlhc3NlcnQgQkQqQkQgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgIAkKLSAgICAJLy9EaXZpc2lvbiAoLykgcHJvbW90ZXMgZGlmZmVyZW50bHkgc28gY2hhbmdlIHRoZSBleHBlY3RlZCByZXN1bHRzOgotICAgIAlhc3NlcnQgSS9JIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAJYXNzZXJ0IEkvRiBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEkvRCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJYXNzZXJ0IEkvQkkgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgIAlhc3NlcnQgSS9CRCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCQotICAgIAlhc3NlcnQgRi9MIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgRC9MIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgQkkvTCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBCRC9MIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAJCi0gICAgCWFzc2VydCBGL0YgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCWFzc2VydCBGL0JJIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgRi9CRCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJCi0gICAgCWFzc2VydCBGL0QgaW5zdGFuY2VvZiBEb3VibGU7Ci0gICAgCWFzc2VydCBCSS9EIGluc3RhbmNlb2YgRG91YmxlOwotICAgIAlhc3NlcnQgQkQvRCBpbnN0YW5jZW9mIERvdWJsZTsKLSAgICAJCi0gICAgCWFzc2VydCBCSS9CSSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBCRC9CSSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBCRC9CRCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE9wZXJhdGlvbnMoKSB7Ci0gICAgCUkxID0gbmV3IEludGVnZXIoMSk7Ci0gICAgCUkyID0gbmV3IEludGVnZXIoMik7Ci0gICAgCUkzID0gbmV3IEludGVnZXIoMyk7Ci0gICAgCUwxID0gbmV3IExvbmcoMSk7Ci0gICAgCUwyID0gbmV3IExvbmcoMik7Ci0gICAgCUwzID0gbmV3IExvbmcoMyk7Ci0gICAgCUYxID0gbmV3IEZsb2F0KCIxLjAiKTsKLSAgICAJRjIgPSBuZXcgRmxvYXQoIjIuMCIpOwotICAgIAlEMSA9IG5ldyBEb3VibGUoIjEuMCIpOwotICAgIAlEMiA9IG5ldyBEb3VibGUoIjIuMCIpOwotICAgIAlCSTEgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotICAgIAlCSTIgPSBuZXcgQmlnSW50ZWdlcigiMiIpOwotICAgIAlCRDEgPSBuZXcgQmlnRGVjaW1hbCgiMS4wIik7Ci0gICAgCUJEMiA9IG5ldyBCaWdEZWNpbWFsKCIyLjAiKTsKLSAgICAJQkQyMCA9IG5ldyBCaWdEZWNpbWFsKCIyLjAwIik7Ci0KLSAgICAJCi0gICAgCWFzc2VydCBJMS9JMiBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBJMS9JMiA9PSBuZXcgQmlnRGVjaW1hbCgiMC41Iik7Ci0KLSAgICAJYXNzZXJ0IEkxXEkyIGluc3RhbmNlb2YgSW50ZWdlcjsKLSAgICAJYXNzZXJ0IEkxXEkyID09IDA7Ci0KLSAgICAJYXNzZXJ0IEkzXEkyIGluc3RhbmNlb2YgSW50ZWdlcjsKLSAgICAJYXNzZXJ0IEkzXEkyID09IDE7Ci0gICAgCQotICAgIAlhc3NlcnQgTDFcSTIgaW5zdGFuY2VvZiBMb25nOwotICAgIAlhc3NlcnQgTDFcSTIgPT0gMDsKLQotICAgIAlhc3NlcnQgTDNcTDIgaW5zdGFuY2VvZiBMb25nOwotICAgIAlhc3NlcnQgTDNcTDIgPT0gMTsKLSAgICAJCi0gICAgCWFzc2VydCBCSTFcQkkyIGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKLSAgICAJYXNzZXJ0IEJJMVxCSTIgPT0gMDsKLSAgICAJCi0gICAgCWFzc2VydCBJMS9JMyBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7Ci0gICAgCWFzc2VydCBJMS9JMyA9PSBuZXcgQmlnRGVjaW1hbCgiMC4zMzMzMzMzMzMzIik7Ci0gICAgCQotICAgIAlhc3NlcnQgSTIvSTMgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOwotICAgIAlhc3NlcnQgSTIvSTMgPT0gbmV3IEJpZ0RlY2ltYWwoIjAuNjY2NjY2NjY2NyIpOwotICAgIAkgICAgCQotICAgIAlhc3NlcnQgSTEvQkQyIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKLSAgICAJCi0gICAgCS8vVGVzdCBrZWVwaW5nIG1heCBzY2FsZSBvZiAoTCwgUiBvciAxMCkKLSAgICAJQkJEMSA9IG5ldyBCaWdEZWNpbWFsKCIwLjEyMzQ1Njc4OTAxMjM0NTY3Iik7Ci0gICAgCWFzc2VydCBCRDEgKyBCQkQxID09IG5ldyBCaWdEZWNpbWFsKCIxLjEyMzQ1Njc4OTAxMjM0NTY3Iik7Ci0KLSAgICAJQkJEMiA9IG5ldyBCaWdEZWNpbWFsKCIuMDAwMDAwMDAwMDAwMDAwMDA4Iik7Ci0gICAgCWFzc2VydCBCQkQxICsgQkJEMiA9PSBuZXcgQmlnRGVjaW1hbCgiMC4xMjM0NTY3ODkwMTIzNDU2NzgiKTsKLQl9Ci0JCi0Jdm9pZCB0ZXN0VW5zdXBwb3J0ZWRJbnREaXZpc2lvbigpIHsKLQkgICAJdHJ5IHsKLSAgICAJCTEuMCBcIDM7Ci0gICAgCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgewotICAgIAkJcmV0dXJuCi0gICAgCX0KLSAgICAJZmFpbCgiU2hvdWxkIGNhdGNoIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIikKLSAgICAJCi0JICAgCXRyeSB7Ci0gICAgCQkxLjBHIFwgMzsKLSAgICAJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW9lKSB7Ci0gICAgCQlyZXR1cm4KLSAgICAJfQotICAgIAlmYWlsKCJTaG91bGQgY2F0Y2ggYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKQotCX0gCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9PcHRpb25hbFJldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvT3B0aW9uYWxSZXR1cm5UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmZGVhNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9PcHRpb25hbFJldHVyblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLWNsYXNzIE9wdGlvbmFsUmV0dXJuVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotCXByb3BlcnR5IHkKLQkKLSAgICB2b2lkIHRlc3RTaW5nbGVFeHByZXNzaW9uKCkgewotICAgICAgICB2YWx1ZSA9IGZvbygpCi0JCQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2Zvb1JldHVybicKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RMYXN0RXhwcmVzc2lvbklzU2ltcGxlKCkgewotICAgICAgICB2YWx1ZSA9IGJhcigpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2JhclJldHVybicKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RMYXN0RXhwcmVzc2lvbklzQm9vbGVhbkV4cHJlc3Npb24oKSB7Ci0gICAgICAgIHZhbHVlID0gZm9vMigpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUKLQotICAgICAgICB2YWx1ZSA9IGZvbzMoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IGZhbHNlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGFzdEV4cHJlc3Npb25Jc0Fzc2lnbm1lbnQoKSB7Ci0gICAgICAgIHZhbHVlID0gYXNzaWduKCkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAnYXNzaWduUmV0dXJuJwotICAgICAgICAKLSAgICAgICAgdmFsdWUgPSBhc3NpZ25GaWVsZCgpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2Fzc2lnbkZpZWxkUmV0dXJuJwotICAgIH0KLQotICAgIHZvaWQgdGVzdExhc3RFeHByZXNzaW9uSXNNZXRob2RDYWxsKCkgewotICAgICAgICB2YWx1ZSA9IG1ldGhvZENhbGwoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdmb29SZXR1cm4nCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0RW1wdHlFeHByZXNzaW9uKCkgewotICAgICAgICB2YWx1ZSA9IG51bGxSZXR1cm4oKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IG51bGwKLSAgICB9Ci0KLS8vICBub3cgaXMgIGEgY29tcGlsZSB0aW1lIGVycm9yCi0vLyAgICB2b2lkIHRlc3RWb2lkTWV0aG9kKCkgewotLy8gICAgICAgIHZhbHVlID0gdm9pZE1ldGhvZCgpCi0vLwotLy8gICAgICAgIGFzc2VydCB2YWx1ZSA9PSBudWxsCi0vLyAgICB9Ci0KLSAgICB2b2lkIHRlc3ROb25Bc3NpZ25tZW50TGFzdEV4cHJlc3Npb25zKCkgewotICAgICAgICB2YWx1ZSA9IGxhc3RJc0Fzc2VydCgpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gbnVsbAotICAgIH0KLQotICAgIGZvbygpIHsKLSAgICAgICAgJ2Zvb1JldHVybicKLSAgICB9CQotCQotICAgIGJhcigpIHsKLSAgICAgICAgeCA9ICdiYXJSZXR1cm4nCi0gICAgICAgIHgKLSAgICB9Ci0JCi0gICAgZm9vMigpIHsKLSAgICAgICAgeCA9ICdjaGVlc2UnCi0gICAgICAgIHggPT0gJ2NoZWVzZScKLSAgICB9Ci0JCi0gICAgZm9vMygpIHsKLSAgICAgICAgeCA9ICdjaGVlc2UnCi0gICAgICAgIHggPT0gJ2VkYW0nCi0gICAgfQotCQotICAgIGFzc2lnbigpIHsKLSAgICAgICAgeCA9ICdhc3NpZ25SZXR1cm4nCi0gICAgfQotCQotICAgIGFzc2lnbkZpZWxkKCkgewotICAgICAgICB5ID0gJ2Fzc2lnbkZpZWxkUmV0dXJuJwotICAgIH0KLSAgICAKLSAgICBudWxsUmV0dXJuKCkgewotICAgIH0KLQotICAgIGxhc3RJc0Fzc2VydCgpIHsKLSAgICAgICAgYXNzZXJ0IDEgPT0gMQotICAgIH0KLQotICAgIG1ldGhvZENhbGwoKSB7Ci0gICAgICAgIGZvbygpCi0gICAgfQotICAgIAotICAgIHZvaWQgdm9pZE1ldGhvZCgpIHsKLSAgICAgICAgZm9vKCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9PdXRlclVzZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L091dGVyVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzMwMDU0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L091dGVyVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBncm9vdnk7Ci0KLS8qKgotICogPHA+U2FtcGxlIGNsYXNzIHVzZWQgZm9yIHRlc3RpbmcgdGhhdCBncm9vdnkgY2FuIGNhbGwgaW5uZXIgY2xhc3NlcyBjb250cnVjdG9ycy48L3A+Ci0gKiAKLSAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAqIAotICogQGN2cy5yZXZpc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRlclVzZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgSW50ZWdlciBhZ2U7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRBZ2UoKSB7Ci0gICAgICAgIHJldHVybiBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWdlKEludGVnZXIgYWdlKSB7Ci0gICAgICAgIHRoaXMuYWdlID0gYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJBZGRyZXNzCi0gICAgewotICAgICAgICBwcml2YXRlIFN0cmluZyBjaXR5OwotICAgICAgICBwcml2YXRlIEludGVnZXIgemlwY29kZTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2l0eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRaaXBjb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIHppcGNvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRaaXBjb2RlKEludGVnZXIgemlwY29kZSkgewotICAgICAgICAgICAgdGhpcy56aXBjb2RlID0gemlwY29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWV0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBudW1iZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihpbnQgbnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9PdmVybG9hZEludm9rZU1ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvT3ZlcmxvYWRJbnZva2VNZXRob2RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMDBiNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9PdmVybG9hZEludm9rZU1ldGhvZFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIE92ZXJsb2FkSW52b2tlTWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHZhbHVlID0gZm9vKDEyMykKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDI0NgotICAgIH0KLQotICAgIC8qKgotICAgICAqIExldHMgb3ZlcmxvYWQgdGhlIGludm9rZU1ldGhvZCgpIG1lY2hhbmlzbSB0byBwcm92aWRlIGFuIGFsaWFzCi0gICAgICogdG8gYW4gZXhpc3RpbmcgbWV0aG9kCi0gICAgICovCi0gICAgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgbmFtZSwgYXJncykKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAnZm9vJykgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHRoaXMsICdiYXInLCBhcmdzKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGJhcihwYXJhbSkgewotICAgICAgICByZXR1cm4gcGFyYW0gKiAyCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvT3ZlcnJpZGVQcm9wZXJ0eUdldHRlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvT3ZlcnJpZGVQcm9wZXJ0eUdldHRlclRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYyMzIwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L092ZXJyaWRlUHJvcGVydHlHZXR0ZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogdGVzdCB0byBlbnN1cmUgdGhhdCBvdmVycmlkaW5nIGdldHRlciBkb2Vzbid0IHRocm93IGEgTlBFIG9uIGFjY2VzcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLWNsYXNzIE92ZXJyaWRlUHJvcGVydHlHZXR0ZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKLSAgICBwcm9wZXJ0eSBjaGVlc2UKLSAgICAgICAKLSAgICB2b2lkIHRlc3RTaW1wbGVNZXRob2RQYXJhbWV0ZXJBY2Nlc3MoKSB7IAotICAgICAgICBvID0gbmV3IE92ZXJyaWRlUHJvcGVydHlHZXR0ZXJUZXN0KCkKLSAgICAgICAgcCA9IG5ldyBPdmVycmlkZVByb3BlcnR5R2V0dGVyVGVzdCgpCi0gICAgICAgIHRyeSB7ICAgICAgICAgIAotICAgICAgICAgICAgLy9AdG9kbwotICAgICAgICAgICAgLy9wLmNoZWVzZSA9IG8uY2hlZXNlCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlZXNlKCkgewotICAgICAgICByZXR1cm4gY2hlZXNlCi0gICAgfQotfSAKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1BsdXNFcXVhbHNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1BsdXNFcXVhbHNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZGFlYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9QbHVzRXF1YWxzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1jbGFzcyBQbHVzRXF1YWxzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEludGVnZXJQbHVzRXF1YWxzKCkgewotICAgICAgICB4ID0gMQotICAgICAgICB5ID0gMgotICAgICAgICB4ICs9IHkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09IDMKLSAgICAgICAgCi0gICAgICAgIHkgKz0gMTAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDEyCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q2hhcmFjdGVyUGx1c0VxdWFscygpIHsKLSAgICAgICAgQ2hhcmFjdGVyIHggPSAxCi0gICAgICAgIENoYXJhY3RlciB5ID0gMgotICAgICAgICB4ICs9IHkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09IDMKLSAgICAgICAgCi0gICAgICAgIHkgKz0gMTAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDEyCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE51bWJlclBsdXNFcXVhbHMoKSB7Ci0gICAgICAgIHggPSAxLjIKLSAgICAgICAgeSA9IDIKLSAgICAgICAgeCArPSB5Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA9PSAzLjIKLSAgICAgICAgCi0gICAgICAgIHkgKz0gMTAuMQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gMTIuMQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTdHJpbmdQbHVzRXF1YWxzKCkgewotICAgICAgICB4ID0gImJiYyIKLSAgICAgICAgeSA9IDIKLSAgICAgICAgeCArPSB5Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCA9PSAiYmJjMiIKLSAgICAgICAgCi0gICAgICAgIGZvbyA9ICJuaWNlIGNoZWVzZSIKLSAgICAgICAgZm9vICs9ICIgZ3JvbWl0IgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvbyA9PSAibmljZSBjaGVlc2UgZ3JvbWl0IgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Bvc3RmaXhUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Bvc3RmaXhUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3MTgxNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qb3N0Zml4VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1jbGFzcyBQb3N0Zml4VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEludGVnZXJQb3N0Zml4KCkgewotICAgICAgICB4ID0gMQotICAgICAgICAKLSAgICAgICAgeSA9IHgrKwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gMQotICAgICAgICBhc3NlcnQgeCA9PSAyCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgeCsrID09IDIKLSAgICAgICAgYXNzZXJ0IHggPT0gMwotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3REb3VibGVQb3N0Zml4KCkgewotICAgICAgICB4ID0gMS4yCi0gICAgICAgIHkgPSB4KysKLQotICAgICAgICBhc3NlcnQgeSA9PSAxLjIKLSAgICAgICAgYXNzZXJ0IHgrKyA9PSAyLjIKLSAgICAgICAgYXNzZXJ0IHggPT0gMy4yCi0gICAgfQotCi0gICAgLyoKLSAgICAgdm9pZCB0ZXN0U3RyaW5nUG9zdGZpeCgpIHsKLSAgICAgICAgeCA9ICJiYmMiCi0gICAgICAgIHgrKwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gImJiZCIKLSAgICB9Ci0gICAgKi8KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Bvd2VyT3BlcmF0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qb3dlck9wZXJhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZkMDI2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Bvd2VyT3BlcmF0aW9uVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiogCi0gKiBUZXN0IE1hdGggUG93ZXIgT3BlcmF0aW9uIGluIENsYXNzaWMvTmV3IEdyb292eQotICogCi0gKiBAYXV0aG9yIFBpbGhvIEtpbQotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBQb3dlck9wZXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RDb25zdGFudFBvd2VyT3BlcmF0aW9uKCkgewotICAgICAgICBhc3NlcnQgMioqNSA9PSAzMgotICAgICAgICBhc3NlcnQgLTIqKjUgPT0gLTMyCi0gICAgICAgIGFzc2VydCAzKio0ID09IDgxCi0gICAgICAgIGFzc2VydCAtMyoqNCA9PSAtODEKLSAgICAgICAgYXNzZXJ0IDMqKi00ID09IDMucG93ZXIoLTQpCi0gICAgICAgIGFzc2VydCAtMyoqLTQgPT0gLTMucG93ZXIoLTQpCi0gICAgICAgIGFzc2VydCA3KioyIC0gNyozICsgMiA9PSAzMCAgICAgICAgIC8vICA0OSAtIDIxICsgMiA9IDMwCi0gICAgICAgIGFzc2VydCAtNyoqMiAtIDcqMyArIDIgPT0gLTY4ICAgICAgIC8vIC00OSAtIDIxICsgMiA9IC02OAotICAgICAgICBhc3NlcnQgLSg3KioyKSAtIDcqMyArIDIgPT0gLTY4ICAgICAvLyAtNDkgLSAyMSArIDIgPSAtNjgKLSAgICAgICAgYXNzZXJ0ICgtNykqKjIgLSA3KjMgKyAyID09IDMwICAgICAvLyAgNDkgLSAyMSArIDIgPSAzMAotICAgIH0KLQotICAgIHZvaWQgdGVzdFBvd2VyT3BlcmF0aW9uKCkgewotICAgICAgICB4ID0gOQotICAgICAgICAtLXgKLSAgICAgICAgYXNzZXJ0IHggPT0gOAotICAgICAgICBwcmludGxuKC0teCkKLSAgICAgICAgYXNzZXJ0IHggPT0gNwotICAgICAgICBwcmludGxuKC0teCkKLSAgICAgICAgYXNzZXJ0IHggPT0gNgotICAgICAgICBwcmludGxuKCgtLXgpKiozKQotICAgICAgICBhc3NlcnQgeCA9PSA1Ci0gICAgICAgIGFzc2VydCAoLS14KSoqMyA9PSA2NAotICAgICAgICBhc3NlcnQgKC14KiozKSA9PSAtNjQKLSAgICAgICAgYXNzZXJ0IHggPT0gNAotICAgICAgICBhc3NlcnQgKCsreCkqKjMgPT0gMTI1Ci0gICAgICAgIGFzc2VydCB4ID09IDUKLSAgICAgICAgYXNzZXJ0ICh4KyspKiozID09IDEyNQotICAgICAgICBhc3NlcnQgeCA9PSA2Ci0gICAgICAgIHByaW50bG4oKHgrKykqKjMpCi0gICAgICAgIGFzc2VydCB4ID09IDcKLSAgICAgICAgcHJpbnRsbih4KQotICAgICAgICBwcmludGxuKCIke3gqKjJ9IikKLSAgICAgICAgcHJpbnRsbigiJHsteCoqMn0iKQotICAgICAgICBhc3NlcnQgeCA9PSA3Ci0gICAgICAgIHByaW50bG4oIiR7KC0teCkqKjJ9IikKLSAgICAgICAgYXNzZXJ0IHggPT0gNgotICAgICAgICBhc3NlcnQgKC0teCkqKjIgKyB4KjIgLSAxID09IDM0ICAgICAgLy8gNSoqMiArIDUqMiAtIDEgPSAzNAotICAgICAgICBhc3NlcnQgeCA9PSA1Ci0gICAgICAgIGFzc2VydCAoeC0tKSoqMiArIHgqMiAtIDEgPT0gMzIgICAgICAvLyA1KioyICsgNCoyIC0gMSA9IDMyCi0gICAgICAgIGFzc2VydCB4ID09IDQKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RDb25zdGFudFBvd2VyQXNzaWdubWVudE9wZXJhdGlvbigpIHsKLSAgICAgICAgeCA9IDUKLSAgICAgICAgeCAqKj0gMgotICAgICAgICBhc3NlcnQgeCA9PSAyNQotICAgICAgICBhc3NlcnQgeCoqMiA9PSA2MjUKLSAgICAgICAgYXNzZXJ0IC14KioyICE9IDYyNQotICAgICAgICBhc3NlcnQgLXgqKjIgPT0gLTYyNQotICAgIH0KLQotICAgIHZvaWQgdGVzdFBvd2VyQXNzaWdubWVudE9wZXJhdGlvbigpIHsKLSAgICAgICAgeCA9IDUKLSAgICAgICAgeSA9IDIKLSAgICAgICAgeCAqKj0geQotICAgICAgICBhc3NlcnQgeCA9PSAyNQotICAgICAgICBhc3NlcnQgeCoqeSA9PSA2MjUKLSAgICAgICAgYXNzZXJ0IHgqKi0xID09IDEvMjUKLSAgICAgICAgYXNzZXJ0IHgqKi15ID09IDEvNjI1Ci0gICAgICAgIGFzc2VydCB4KioteSA9PSB4KiooLXkpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByZWZpeFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJlZml4VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzM5ZWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJlZml4VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jbGFzcyBQcmVmaXhUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0SW50ZWdlclByZWZpeCgpIHsKLSAgICAgICAgeCA9IDEKLSAgICAgICAgCi0gICAgICAgIHkgPSArK3gKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDIKLSAgICAgICAgYXNzZXJ0IHggPT0gMgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0ICsreCA9PSAzCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdERvdWJsZVByZWZpeCgpIHsKLSAgICAgICAgeCA9IDEuMgotICAgICAgICB5ID0gKyt4Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgeSA9PSAyLjIKLSAgICAgICAgYXNzZXJ0IHggPT0gMi4yCi0gICAgICAgIGFzc2VydCArK3ggPT0gMy4yCi0gICAgICAgIGFzc2VydCB4ID09IDMuMgotICAgIH0KLQotICAgIHZvaWQgdGVzdFN0cmluZ1ByZWZpeCgpIHsKLSAgICAgICAgeCA9ICJiYmMiCi0gICAgICAgIHgrKwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gImJiZCIKLSAgICAgICAgCi0gICAgICAgIHgtLQotICAgICAgICB4LS0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4ID09ICJiYmIiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlQXJyYXlzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVBcnJheXNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNTJhMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVBcnJheXNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi1jbGFzcyBQcmltaXRpdmVBcnJheXNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgYzFGaWVsZCA9IG5ldyBjaGFyW117fQotICAgIGNoYXJbXSBjMkZpZWxkID0gbmV3IGNoYXJbXXt9Ci0gICAgCi0gICAgaTFGaWVsZCA9IG5ldyBpbnRbXXt9Ci0gICAgaW50W10gaTJGaWVsZCA9IG5ldyBpbnRbXXt9Ci0gICAgCi0KLSAgICBkMUZpZWxkID0gbmV3IGRvdWJsZVtde30KLSAgICBkb3VibGVbXSBkMkZpZWxkID0gbmV3IGRvdWJsZVtde30KLQotICAgIGYxRmllbGQgPSBuZXcgZmxvYXRbXXt9Ci0gICAgZmxvYXRbXSBmMkZpZWxkID0gbmV3IGZsb2F0W117fQotICAgIAotICAgIGwxRmllbGQgPSBuZXcgbG9uZ1tde30KLSAgICBsb25nW10gbDJGaWVsZCA9IG5ldyBsb25nW117fSAgICAKLQotCi0gICAgYjFGaWVsZCA9IG5ldyBieXRlW117fQotICAgIGJ5dGVbXSBiMkZpZWxkID0gbmV3IGJ5dGVbXXt9Ci0gICAgCi0gICAgCi0gICAgczFGaWVsZCA9IG5ldyBzaG9ydFtde30KLSAgICBzaG9ydFtdIHMyRmllbGQgPSBuZXcgc2hvcnRbXXt9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q2hhcigpIHsKLSAgICAgICAgYXNzZXJ0IGMxRmllbGQuY2xhc3MgPT0gYzJGaWVsZC5jbGFzcwotICAgICAgICBjYSA9IG5ldyBjaGFyW117J2wnLCdsJ30KLSAgICAgICAgY2hhcltdIGNiID0gbmV3IGNoYXJbXXsnbCcsJ2wnfQotICAgICAgICBhc3NlcnQgY2EuY2xhc3MgPT0gY2IuY2xhc3MKLSAgICAgICAgYXNzZXJ0IGMxRmllbGQuY2xhc3MgPT0gY2EuY2xhc3MKLSAgICAgICAgYXNzZXJ0IGNhLmNsYXNzLm5hbWUgPT0gIltDIgotICAgICAgICAKLSAgICAgICAgY2EuZWFjaHsgYXNzZXJ0IGl0PT0nbCcgfQotICAgICAgICBjYi5lYWNoeyBhc3NlcnQgaXQ9PSdsJyB9Ci0gICAgfQotCi0KLSAgICB2b2lkIHRlc3RJbnQoKSB7Ci0gICAgICAgIGFzc2VydCBpMUZpZWxkLmNsYXNzID09IGkyRmllbGQuY2xhc3MKLSAgICAgICAgaWEgPSBuZXcgaW50W117MSwxfQotICAgICAgICBpbnRbXSBpYiA9IG5ldyBpbnRbXXsxLDF9Ci0gICAgICAgIGFzc2VydCBpYS5jbGFzcyA9PSBpYi5jbGFzcwotICAgICAgICBhc3NlcnQgaTFGaWVsZC5jbGFzcyA9PSBpYS5jbGFzcwotICAgICAgICBhc3NlcnQgaWEuY2xhc3MubmFtZSA9PSAiW0kiCi0gICAgICAgIAotICAgICAgICBpYS5lYWNoeyBhc3NlcnQgaXQ9PTEgfQotICAgICAgICBpYi5lYWNoeyBhc3NlcnQgaXQ9PTEgfQotICAgIH0KLQotCi0gICAgdm9pZCB0ZXN0TG9uZygpIHsKLSAgICAgICAgYXNzZXJ0IGwxRmllbGQuY2xhc3MgPT0gbDJGaWVsZC5jbGFzcwotICAgICAgICBsYSA9IG5ldyBsb25nW117MSwxfQotICAgICAgICBsb25nW10gbGIgPSBuZXcgbG9uZ1tdezEsMX0KLSAgICAgICAgYXNzZXJ0IGxhLmNsYXNzID09IGxiLmNsYXNzCi0gICAgICAgIGFzc2VydCBsMUZpZWxkLmNsYXNzID09IGxhLmNsYXNzCi0gICAgICAgIGFzc2VydCBsYS5jbGFzcy5uYW1lID09ICJbSiIKLSAgICAgICAgCi0gICAgICAgIGxhLmVhY2h7IGFzc2VydCBpdD09MWwgfQotICAgICAgICBsYi5lYWNoeyBhc3NlcnQgaXQ9PTFsIH0KLSAgICB9Ci0KLQotICAgIHZvaWQgdGVzdFNob3J0KCkgewotICAgICAgICBhc3NlcnQgczFGaWVsZC5jbGFzcyA9PSBzMkZpZWxkLmNsYXNzCi0gICAgICAgIHNhID0gbmV3IHNob3J0W117MSwxfSAKLSAgICAgICAgc2hvcnRbXSBzYiA9IG5ldyBzaG9ydFtdezEsMX0KLSAgICAgICAgYXNzZXJ0IHNhLmNsYXNzID09IHNiLmNsYXNzCi0gICAgICAgIGFzc2VydCBzMUZpZWxkLmNsYXNzID09IHNhLmNsYXNzCi0gICAgICAgIGFzc2VydCBzYS5jbGFzcy5uYW1lID09ICJbUyIKLSAgICAgICAgCi0gICAgICAgIHNhLmVhY2h7IGFzc2VydCBpdD09MSB9Ci0gICAgICAgIHNiLmVhY2h7IGFzc2VydCBpdD09MSB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Qnl0ZSgpIHsKLSAgICAgICAgYXNzZXJ0IGIxRmllbGQuY2xhc3MgPT0gYjJGaWVsZC5jbGFzcwotICAgICAgICBiYSA9IG5ldyBieXRlW117MSwxfQotICAgICAgICBieXRlW10gYmIgPSBuZXcgYnl0ZVtdezEsMX0KLSAgICAgICAgYXNzZXJ0IGJhLmNsYXNzID09IGJiLmNsYXNzCi0gICAgICAgIGFzc2VydCBiMUZpZWxkLmNsYXNzID09IGJhLmNsYXNzCi0gICAgICAgIGFzc2VydCBiYS5jbGFzcy5uYW1lID09ICJbQiIKLSAgICAgICAgCi0gICAgICAgIGJhLmVhY2h7IGFzc2VydCBpdD09MSB9Ci0gICAgICAgIGJiLmVhY2h7IGFzc2VydCBpdD09MSB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHZvaWQgdGVzdERvdWJsZSgpIHsKLSAgICAgICAgYXNzZXJ0IGQxRmllbGQuY2xhc3MgPT0gZDJGaWVsZC5jbGFzcwotICAgICAgICBkYSA9IG5ldyBkb3VibGVbXXsxLDF9Ci0gICAgICAgIGRvdWJsZVtdIGRiID0gbmV3IGRvdWJsZVtdezEsMX0KLSAgICAgICAgYXNzZXJ0IGRhLmNsYXNzID09IGRiLmNsYXNzCi0gICAgICAgIGFzc2VydCBkMUZpZWxkLmNsYXNzID09IGRhLmNsYXNzCi0gICAgICAgIGFzc2VydCBkYS5jbGFzcy5uYW1lID09ICJbRCIKLSAgICAgICAgCi0gICAgICAgIGRhLmVhY2h7IGFzc2VydCBpdD09MS4wZCB9Ci0gICAgICAgIGRiLmVhY2h7IGFzc2VydCBpdD09MS4wZCB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0RmxvYXQoKSB7Ci0gICAgICAgIGFzc2VydCBmMUZpZWxkLmNsYXNzID09IGYyRmllbGQuY2xhc3MKLSAgICAgICAgZmEgPSBuZXcgZmxvYXRbXXsxLDF9Ci0gICAgICAgIGZsb2F0W10gZmIgPSBuZXcgZmxvYXRbXXsxLDF9Ci0gICAgICAgIGFzc2VydCBmYS5jbGFzcyA9PSBmYi5jbGFzcwotICAgICAgICBhc3NlcnQgZjFGaWVsZC5jbGFzcyA9PSBmYS5jbGFzcwotICAgICAgICBhc3NlcnQgZmEuY2xhc3MubmFtZSA9PSAiW0YiCi0gICAgICAgIAotICAgICAgICBmYS5lYWNoeyBhc3NlcnQgaXQ9PTEuMGYgfQotICAgICAgICBmYi5lYWNoeyBhc3NlcnQgaXQ9PTEuMGYgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZVR5cGVGaWVsZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlVHlwZUZpZWxkVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOWRkOTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlVHlwZUZpZWxkVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1jbGFzcyBQcmltaXRpdmVUeXBlRmllbGRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCXByaXZhdGUgbG9uZyBsb25nRmllbGQKLQlwcml2YXRlIHN0YXRpYyBzaG9ydCBzaG9ydEZpZWxkCi0JCi0Jdm9pZCBzZXRWYWx1ZSgpIHsKLQkJbG9uZ0ZpZWxkID0gMQotCX0KLQotCWdldFZhbHVlKCkgewotCQl4ID0gbG9uZ0ZpZWxkCi0JCXJldHVybiB4Ci0JfQotCi0Jdm9pZCB0ZXN0UHJpbWl0aXZlRmllbGQoKSB7Ci0JCXNldFZhbHVlKCkKLQkJCi0JCXZhbHVlID0gZ2V0VmFsdWUoKQotCQlhc3NlcnQgdmFsdWUgPT0gMQotCQkKLQkJYXNzZXJ0IGxvbmdGaWVsZCA9PSAxCi0JfQotCi0Jdm9pZCB0ZXN0SW50UGFyYW1CdWcoKSB7Ci0JCWFzc2VydCBidWdNZXRob2QoMTIzKSA9PSAyNDYKLQkJYXNzZXJ0IGJ1Z01ldGhvZDIoMTIzKSA9PSAyNDYKLQkJCi0JCS8vIEB0b2RvIEdST09WWS0xMzMgCi0JCWNsb3N1cmUgPSB7IGludCB4IHwgeCAqIDIgfQotCQlhc3NlcnQgY2xvc3VyZS5jYWxsKDEyMykgPT0gMjQ2Ci0KLQl9Ci0JCi0JaW50IGJ1Z01ldGhvZChpbnQgeCkgewotCQl4ICogMgotCX0KLQkKLQlidWdNZXRob2QyKGludCB4KSB7Ci0JCXggKiAyCi0JfQotCXZvaWQgdGVzdFN0YXRpY1ByaW1pdGl2ZUZpZWxkKCkgewotCQlzaG9ydEZpZWxkID0gKFNob3J0KSAxMjMKLQkJCi0JCWFzc2VydCBzaG9ydEZpZWxkID09IDEyMwotCX0KLQotICAgIHZvaWQgdGVzdEludExvY2FsVmFyaWFibGUoKSB7Ci0gICAgCQlpbnQgeCA9IDEyMwotICAgIAkJeSA9IHggKyAxCi0gICAgCQlhc3NlcnQgeSA9PSAxMjQKLSAgICAJfQotICAgIHZvaWQgdGVzdExvbmdMb2NhbFZhcmlhYmxlKCkgewotICAgICAgICBsb25nIHggPSAxMjMKLSAgICAgICAgeSA9IHggKyAxCi0gICAgICAgIGFzc2VydCB5ID09IDEyNAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZVR5cGVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVUeXBlc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQxZmM0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZVR5cGVzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1jbGFzcyBQcmltaXRpdmVUeXBlc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQlpbnQgZ2V0SW50KCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JCi0Jc2hvcnQgZ2V0U2hvcnQoKSB7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlib29sZWFuIGdldEJvb2xlYW4oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlkb3VibGUgZ2V0RG91YmxlKCkgewotCQlyZXR1cm4gMS4wOwotCX0KLQkKLQlmbG9hdCBnZXRGbG9hdCgpIHsKLQkJcmV0dXJuIDEuMDsKLQl9Ci0JCi0JYnl0ZSBnZXRCeXRlKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JbG9uZyBnZXRMb25nKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQljaGFyIGdldENoYXIoKSB7Ci0JCXJldHVybiAnYSc7Ci0JfQotCQotCWludCBnZXROZXh0SW50KGludCBpKSB7Ci0JCXJldHVybiBpICsgMQotCX0KLQkKLQlzaG9ydCBnZXROZXh0U2hvcnQoc2hvcnQgaSkgewotCQlyZXR1cm4gaSArIDEKLQl9Ci0JCi0Jdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZXMoKSB7Ci0JCWFzc2VydCAxID09IGdldEludCgpCi0JCWFzc2VydCAxID09IGdldFNob3J0KCkKLQkJYXNzZXJ0IDEgPT0gZ2V0Qnl0ZSgpCi0JCWFzc2VydCAxID09IGdldExvbmcoKQotCQlhc3NlcnQgZ2V0Qm9vbGVhbigpCi0JCWFzc2VydCBnZXREb3VibGUoKSA+IDAuOTkKLQkJYXNzZXJ0IGdldEZsb2F0KCkgPiAwLjk5Ci0JCWFzc2VydCAnYScgPT0gZ2V0Q2hhcigpCi0JfQotCi0Jdm9pZCB0ZXN0UHJpbWl0aXZlUGFyYW1ldGVycygpIHsJCQotCQlhc3NlcnQgZ2V0TmV4dEludCgxKSA9PSAyCi0JCWFzc2VydCAzID09IGdldE5leHRJbnQoMikKLQkJCi0JCWFzc2VydCBnZXROZXh0U2hvcnQoKFNob3J0KSAxKSA9PSAyCi0JCWFzc2VydCAzID09IGdldE5leHRTaG9ydCgoU2hvcnQpIDIpCi0JfQotCQkKLQlzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLQkJbmV3IFByaW1pdGl2ZVR5cGVzVGVzdCgpLnRlc3RQcmltaXRpdmVUeXBlcygpCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpbnRUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW50VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2E0MzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpbnRUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLWNsYXNzIFByaW50VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIC8qCi0gICAgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0gICAgICAgIGFzc2VydFRvU3RyaW5nKCJoZWxsbyIsICdoZWxsbycpCi0gICAgICAgIAotICAgICAgICBhc3NlcnRUb1N0cmluZyhbXSwgIltdIikKLSAgICAgICAgYXNzZXJ0VG9TdHJpbmcoWzEsIDIsICJoZWxsbyJdLCAnWzEsIDIsIGhlbGxvXScpCi0gICAgICAgIAotICAgICAgICBhc3NlcnRUb1N0cmluZyhbMToyMCwgMjo0MCwgMzonY2hlZXNlJ10sICdbMT0yMCwgMj00MCwgMz1jaGVlc2VdJykKLSAgICAgICAgYXNzZXJ0VG9TdHJpbmcoWzpdLCAiWzpdIikKLQotICAgICAgICBhc3NlcnRUb1N0cmluZyhbWydib2InOidkcm9vbHMnLCAnamFtZXMnOidnZXJvbmltbyddXSwgJ1tbamFtZXM6Z2Vyb25pbW8sIGJvYjpkcm9vbHNdXScpCi0gICAgICAgIGFzc2VydFRvU3RyaW5nKFs1LCBbImJvYiIsICJqYW1lcyJdLCBbImJvYiI6ImRyb29scyIsICJqYW1lcyI6Imdlcm9uaW1vIl0sICJjaGVlc2UiXSwgJ1s1LCBbYm9iLCBqYW1lc10sIFtqYW1lczpnZXJvbmltbywgYm9iOmRyb29sc10sIGNoZWVzZV0nKQotICAgIH0KLSAgICAqLwotCi0gICAgdm9pZCB0ZXN0SW5zcGVjdCgpIHsKLSAgICAgICAgYXNzZXJ0SW5zcGVjdCgiaGVsbG8iLCAnImhlbGxvIicpCi0gICAgICAgIAotICAgICAgICBhc3NlcnRJbnNwZWN0KFtdLCAiW10iKQotICAgICAgICBhc3NlcnRJbnNwZWN0KFsxLCAyLCAiaGVsbG8iXSwgJ1sxLCAyLCAiaGVsbG8iXScpCi0gICAgICAgIAotICAgICAgICBhc3NlcnRJbnNwZWN0KFsxOjIwLCAyOjQwLCAzOidjaGVlc2UnXSwgJ1sxOjIwLCAyOjQwLCAzOiJjaGVlc2UiXScpCi0gICAgICAgIGFzc2VydEluc3BlY3QoWzpdLCAiWzpdIikKLQotICAgICAgICBhc3NlcnRJbnNwZWN0KFtbJ2JvYic6J2Ryb29scycsICdqYW1lcyc6J2dlcm9uaW1vJ11dLCAnW1siamFtZXMiOiJnZXJvbmltbyIsICJib2IiOiJkcm9vbHMiXV0nKQotICAgICAgICBhc3NlcnRJbnNwZWN0KFs1LCBbImJvYiIsICJqYW1lcyJdLCBbImJvYiI6ImRyb29scyIsICJqYW1lcyI6Imdlcm9uaW1vIl0sICJjaGVlc2UiXSwgJ1s1LCBbImJvYiIsICJqYW1lcyJdLCBbImphbWVzIjoiZ2Vyb25pbW8iLCAiYm9iIjoiZHJvb2xzIl0sICJjaGVlc2UiXScpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdENQbHVzUGx1c1N0eWxlUHJpbnRpbmcoKSB7Ci0gICAgICAgIGVuZGwgPSAiXG4iCi0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0IDw8ICJIZWxsbyB3b3JsZCEiIDw8IGVuZGwKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNmZjkwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaXZhdGVWYXJpYWJsZUFjY2Vzc0Zyb21Bbm90aGVySW5zdGFuY2VUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogdGVzdCB0byBlbnN1cmUgdGhhdCBwcml2YXRlIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgdmlzaWJsZSB0byAKLSAqIG90aGVyIGluc3RhbmNlIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBjbGFzcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLWNsYXNzIFByaXZhdGVWYXJpYWJsZUFjY2Vzc0Zyb21Bbm90aGVySW5zdGFuY2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgaW1wbGVtZW50cyBDbG9uZWFibGUgeyAKLSAgICBwcm9wZXJ0eSBmb28KLSAgICBwcml2YXRlIGJhcgotICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKCkKLSAgICAgICAgZm9vID0gImZvbyIKLSAgICAgICAgYmFyID0gImJhciIKLSAgICB9Ci0gICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBQcml2YXRlVmFyaWFibGVBY2Nlc3NGcm9tQW5vdGhlckluc3RhbmNlVGVzdCgpCi0gICAgICAgIHJlc3VsdC5mb28gPSBmb28KLSAgICAgICAgcmVzdWx0LmJhciA9IGJhcgotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdENsb25lKCkgewotICAgICAgICBmcmVkID0gbmV3IFByaXZhdGVWYXJpYWJsZUFjY2Vzc0Zyb21Bbm90aGVySW5zdGFuY2VUZXN0KCkKLSAgICAgICAgLy9AdG9kbyBmYWlscyBkdWUgdG8gcHJpdmF0ZSBhY2Nlc3MgdG8gJ2JhcicKLSAgICAgICAgLy9iYXJuZXkgPSBmcmVkLmNsb25lKCkKLSAgICAgICAgLy9hc3NlcnQgIShiYXJuZXkgPT09IGZyZWQpCi0gICAgfQotfSAKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb2Nlc3NUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb2Nlc3NUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MThhYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qcm9jZXNzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioKLSAqIGNoZWNrIHRoYXQgZ3Jvb3Z5IFByb2Nlc3MgbWV0aG9kcyBkbyB0aGVpciBqb2IuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qCi1pbXBvcnQgamF2YS51dGlsLioKLQotY2xhc3MgUHJvY2Vzc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgcHJvcGVydHkgbXlQcm9jZXNzCi0gICAgCi0gICAgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgbXlQcm9jZXNzID0gbmV3IE1vY2tQcm9jZXNzKCkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UHJvY2Vzc0FwcGVuZEJ5dGVzKCkgewotICAgICAgICBteUJ5dGVzID0gIm1vb2t5Ii5nZXRCeXRlcygpCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgbXlQcm9jZXNzIDw8IG15Qnl0ZXMKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBteVByb2Nlc3Mub3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkgICAgICAgICAgCi0gICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbAotICAgICAgICBhc3NlcnQgQXJyYXlzLmVxdWFscyhteUJ5dGVzLHJlc3VsdCkKLSAgICB9Ci0gICAgdm9pZCB0ZXN0UHJvY2Vzc0FwcGVuZFR3b0J5dGVBcnJheXMoKSB7Ci0gICAgICAgIG15Qnl0ZXMxID0gImZvbyIuZ2V0Qnl0ZXMoKQotICAgICAgICBteUJ5dGVzMiA9ICJiYXIiLmdldEJ5dGVzKCkKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBteVByb2Nlc3MgPDwgbXlCeXRlczEgPDwgbXlCeXRlczIKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBteVByb2Nlc3Mub3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsCi0gICAgICAgIGFzc2VydCByZXN1bHQuc2l6ZSgpID09IG15Qnl0ZXMxLnNpemUoKSArIG15Qnl0ZXMyLnNpemUoKSAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UHJvY2Vzc0FwcGVuZCgpIHsKLSAgICAgICAgbXlQcm9jZXNzIDw8ICJtb29reSIKLSAgICAgICAgYXNzZXJ0ICJtb29reSIgPT0gbXlQcm9jZXNzLm91dHB1dFN0cmVhbS50b1N0cmluZygpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFByb2Nlc3NJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgYXNzZXJ0IG15UHJvY2Vzcy5pbiBpbnN0YW5jZW9mIElucHV0U3RyZWFtCi0gICAgICAgIGFzc2VydCBteVByb2Nlc3MuaW4gIT0gbnVsbAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RQcm9jZXNzVGV4dCgpIHsKLSAgICAgICAgYXNzZXJ0ICIiID09IG15UHJvY2Vzcy50ZXh0Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFByb2Nlc3NFcnJvclN0cmVhbSgpIHsKLSAgICAgICAgYXNzZXJ0IG15UHJvY2Vzcy5lcnIgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbQotICAgICAgICBhc3NlcnQgbXlQcm9jZXNzLmVyciAhPSBudWxsCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFByb2Nlc3NPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgIGFzc2VydCBteVByb2Nlc3Mub3V0IGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtCi0gICAgICAgIGFzc2VydCBteVByb2Nlc3Mub3V0ICE9IG51bGwKLSAgICB9Ci0gICAgCi0gICAgLy8gQHRvZG8gLSBwcy53YWl0Rm9yT3JLaWxsKHNlY3MpIGNyZWF0ZXMgaXQncyBvd24gdGhyZWFkLCBsZWF2ZSB0aGlzIG91dCBvZiB0ZXN0IHN1aXRlIGZvciBub3cuLi4KLSAgICAKLSAgICB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBteVByb2Nlc3MuZGVzdHJveSgpCi0gICAgfQotfQotCi0vKioKLSAqIHNpbXBsZSBQcm9jZXNzLCB1c2VkIHB1cmVseSBmb3IgdGVzdCBjYXNlcwotICovCi1jbGFzcyBNb2NrUHJvY2VzcyBleHRlbmRzIFByb2Nlc3MgewotICAgIHByaXZhdGUgZQotICAgIHByaXZhdGUgaQotICAgIHByaXZhdGUgbwotICAgIHB1YmxpYyBNb2NrUHJvY2VzcygpIHsKLSAgICAgICAgZSA9IG5ldyBBbm90aGVyTW9ja0lucHV0U3RyZWFtKCkKLSAgICAgICAgaSA9IG5ldyBBbm90aGVyTW9ja0lucHV0U3RyZWFtKCkKLSAgICAgICAgbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQotICAgIH0KLSAgICB2b2lkIGRlc3Ryb3koKSB7fQotICAgIGludCBleGl0VmFsdWUoKSB7IHJldHVybiAwIH0KLSAgICBJbnB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpIHsgcmV0dXJuIGUgfQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsgcmV0dXJuIGkgfQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeyByZXR1cm4gbyB9Ci0gICAgaW50IHdhaXRGb3IoKSB7IHJldHVybiAwIH0KLX0KLQotLyoqCi0gKiBvbmx5IG5lZWRlZCBmb3Igd29ya2Fyb3VuZCBpbiBncm9vdnksIAotICogICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShteUJ5dGVBcnJheSkgZG9lc24ndCB3b3JrIGF0IG1vLi4uICgyOC1TZXAtMjAwNCkKLSAqLwotY2xhc3MgQW5vdGhlck1vY2tJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLSAgICBpbnQgcmVhZCgpIHsgcmV0dXJuIC0xIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNjN2JkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqIAotICogVGVzdHMgdGhlIHVzZSBvZiBwcm9wZXJ0aWVzIGluIEdyb292eQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3ROb3JtYWxQcm9wZXJ0eUdldHRlcnNBbmRTZXR0ZXJzKCkgewotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQWJvdXQgdG8gY3JlYXRlIEZvbyIpCi0gICAgICAgIAotICAgICAgICBmb28gPSBuZXcgRm9vKCkKLQotICAgICAgICBwcmludGxuKCJjcmVhdGVkICR7Zm9vfSIpCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IGZvby5nZXRNZXRhQ2xhc3MoKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigibWV0YUNsYXNzICR7dmFsdWV9IikKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4oZm9vLmluc3BlY3QoKSkKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4oIm5hbWUgJHtmb28ubmFtZX0sIGJsYWggJHtmb28uYmxhaH0iKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvby5uYW1lID09ICJKYW1lcyIKLSAgICAgICAgYXNzZXJ0IGZvby5nZXROYW1lKCkgPT0gIkphbWVzIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvby5sb2NhdGlvbiA9PSAiTG9uZG9uIgotICAgICAgICBhc3NlcnQgZm9vLmdldExvY2F0aW9uKCkgPT0gIkxvbmRvbiIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBmb28uYmxhaCA9PSA5Ci0gICAgICAgIGFzc2VydCBmb28uZ2V0QmxhaCgpID09IDkKLSAgICAgICAgCi0gICAgICAgIGZvby5uYW1lID0gIkJvYiIKLSAgICAgICAgZm9vLmxvY2F0aW9uID0gIkF0bGFudGEiCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vLm5hbWUgPT0gIkJvYiIKLSAgICAgICAgYXNzZXJ0IGZvby5nZXROYW1lKCkgPT0gIkJvYiIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBmb28ubG9jYXRpb24gPT0gIkF0bGFudGEiCi0gICAgICAgIGFzc2VydCBmb28uZ2V0TG9jYXRpb24oKSA9PSAiQXRsYW50YSIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0T3ZlcmxvYWRlZEdldHRlcigpIHsKLSAgICAgICAgCi0gICAgICAgIGZvbyA9IG5ldyBGb28oKQotCi0gICAgICAgIHByaW50bG4oImNvdW50ICR7Zm9vLmNvdW50fSIpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vLmdldENvdW50KCkgPT0gMQotICAgICAgICBhc3NlcnQgZm9vLmNvdW50ID09IDEKLSAgICAgICAgCi0gICAgICAgIGZvby5jb3VudCA9IDcKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBmb28uY291bnQgPT0gNwotICAgICAgICBhc3NlcnQgZm9vLmdldENvdW50KCkgPT0gNwotICAgIH0KLQotICAgIHZvaWQgdGVzdE5vU2V0dGVyQXZhaWxhYmxlT25Qcml2YXRlUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvbyA9IG5ldyBGb28oKQotICAgICAgICAKLSAgICAgICAgLy8gbWV0aG9kcyBzaG91bGQgZmFpbCBvbiBub24tZXhpc3RlbnQgbWV0aG9kIGNhbGxzCi0gICAgICAgIHNob3VsZEZhaWwgeyBmb28uYmxhaCA9IDQgfQotICAgICAgICBzaG91bGRGYWlsIHsgZm9vLnNldEJsYWgoNCkgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RDYW5ub3RTZWVQcml2YXRlUHJvcGVydGllcygpIHsKLQkgICAgZm9vID0gbmV3IEZvbygpCi0JICAgIAotCSAgICAvLyBwcm9wZXJ0eSBhY2Nlc3MgZmFpbHMgb24gbm9uLWV4aXN0ZW50IHByb3BlcnR5Ci0JCXNob3VsZEZhaWwgeyB4ID0gZm9vLmludmlzaWJsZSB9CQkJCQkJCQkJCQkJCQkKLQkgICAgCi0JICAgIC8vIG1ldGhvZHMgc2hvdWxkIGZhaWwgb24gbm9uLWV4aXN0ZW50IG1ldGhvZCBjYWxscwotCSAgICBzaG91bGRGYWlsIHsgZm9vLmdldFEoKSB9Ci0JfQotCi0gICAgdm9pZCB0ZXN0Q29uc3RydWN0b3JXaXRoTmFtZWRQcm9wZXJ0aWVzKCkgewotICAgICAgICBmb28gPSBuZXcgRm9vKG5hbWU6J0dyb21pdCcsIGxvY2F0aW9uOidNb29uJykKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBmb28ubmFtZSA9PSAnR3JvbWl0JwotICAgICAgICBhc3NlcnQgZm9vLmxvY2F0aW9uID09ICdNb29uJwotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiY3JlYXRlZCBiZWFuICR7Zm9vLmluc3BlY3QoKX0iKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUb1N0cmluZygpIHsKLSAgICAgICAgZm9vID0gbmV3IEZvbyhuYW1lOidHcm9taXQnLCBsb2NhdGlvbjonTW9vbicpCi0KLQkJcHJpbnRsbiBmb28KLQl9Ci0KLSAgICB2b2lkIHRlc3RBcnJheUxlbmd0aFByb3BlcnR5KCkgewotCQkvLyBjcmVhdGUgdHdvIGFycmF5cywgc2luY2UgYWxsIHVzZSB0aGUgc2FtZSBNZXRhQXJyYXlMZW5ndGhQcm9wZXJ0eSBvYmplY3QgLQotCQkvLyBtYWtlIHN1cmUgaXQgY2FuIHdvcmsgZm9yIGFsbCB0eXBlcyBhbmQgc2l6ZXMKLQkJaSA9IG5ldyBJbnRlZ2VyWzVdCi0JCXMgPSBuZXcgU3RyaW5nWzEwXQotCQkKLQkJLy8gcHV0IHNvbWV0aGluZyBpbiBpdCB0byBtYWtlIHN1cmUgd2UncmUgcmV0dXJuaW5nIHRoZSAqYWxsb2NhdGVkKiBsZW5ndGgsIGFuZAotCQkvLyBub3QgdGhlICp1c2VkKiBsZW5ndGgKLQkJc1swXSA9ICJoZWxsbyIKLQkJCi0JCWFzc2VydCBpLmxlbmd0aCA9PSA1Ci0JCWFzc2VydCBzLmxlbmd0aCA9PSAxMAotCQkKLQkJLy8gdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBtZWFuIHRoZXJlIGlzIGEgZ2V0TGVuZ3RoKCkgbWV0aG9kCi0JCXNob3VsZEZhaWwgeyBpLmdldExlbmd0aCgpIH0KLQkJCi0JCS8vIHZlcmlmeSB3ZSBjYW4ndCBzZXQgdGhpcyBwcm9wZXJ0eSwgaXQncyByZWFkLW9ubHkKLQkJc2hvdWxkRmFpbCB7IGkubGVuZ3RoID0gNiB9Ci0JfQotCi0gICAgdm9pZCB0ZXN0R3N0cmluZ0Fzc2lnbm1lbnQoKSB7Ci0gICAgICAgIGZvbyA9IG5ldyBGb28oKQotICAgICAgICBmb28uYm9keSA9ICIke2Zvby5uYW1lfSIKLSAgICAgICAgYXNzZXJ0IGZvby5ib2R5ID09ICJKYW1lcyIKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5VGVzdDIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHlUZXN0Mi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjRhYzUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHlUZXN0Mi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiogCi0gKiBUZXN0cyB0aGUgdXNlIG9mIG5ldyBwcm9wZXJ0eSBtZXRob2RzIGluIEdyb292eTogZWFjaFByb3BlcnR5KCksIGVhY2hQcm9wZXJ0eU5hbWUoKSwgYW5kCi0gKiBhbGxQcm9wZXJ0aWVzKCkKLSAqIAotICogQGF1dGhvciBqb2huIHN0dW1wCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFByb3BlcnR5VGVzdDIgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RFYWNoUHJvcGVydHlOYW1lKCkgewotICAgICAgICBmb28gPSBuZXcgRm9vKCkKLQkJCi0JCS8vIHRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB0aGVyZQotCQlwcm9wcyA9IFsnbmFtZScsICdjb3VudCcsICdsb2NhdGlvbicsICdibGFoJ10KLQkJZm9vLmVhY2hQcm9wZXJ0eU5hbWUgeyB8cHJvcHwKLQkJCS8vcHJpbnRsbiAibG9va2luZyBmb3IgJHtwcm9wfSBpbiAke3Byb3BzfSIKLQkJCQotCQkJLy8gd2Ugc2hvdWxkIG5vdCBzZWUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgcHJvcGVydGllcwotCQkJYXNzZXJ0IHByb3AgIT0gImludmlzaWJsZSIKLQkJCWFzc2VydCBwcm9wICE9ICJwcm90IgotCQkJCi0JCQkvLyByZW1vdmUgdGhpcyBvbmUgZnJvbSB0aGUgbGlzdAotCQkJcHJvcHMgPSBwcm9wcyAtIFtwcm9wXQotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUgbGVmdCBvdmVyCi0JCS8vcHJpbnRsbiAiY291bnQgbGVmdCBpbiBwcm9wcyBsaXN0IGlzICR7cHJvcHMuY291bnQoKX0iCi0JCWFzc2VydCBwcm9wcy5jb3VudCgpID09IDAKLSAgICB9Ci0JCi0Jdm9pZCB0ZXN0RWFjaFByb3BlcnR5KCkgewotICAgICAgICBmb28gPSBuZXcgRm9vKCkKLQkJCi0JCS8vIHRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyBhbmQgdGhlaXIgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHRoZXJlCi0JCXByb3BzID0gWyduYW1lJzonSmFtZXMnLCAnY291bnQnOjEsICdsb2NhdGlvbic6J0xvbmRvbicsICdibGFoJzo5XQotCQlmb28uZWFjaFByb3BlcnR5IHsgfHByb3B8Ci0JCQkvL3ByaW50bG4gImxvb2tpbmcgZm9yICR7cHJvcC5uYW1lfSBpbiAke3Byb3BzfSIKLQkJCQotCQkJLy8gd2Ugc2hvdWxkIG5vdCBzZWUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgcHJvcGVydGllcwotCQkJYXNzZXJ0IHByb3AubmFtZSAhPSAiaW52aXNpYmxlIgotCQkJYXNzZXJ0IHByb3AubmFtZSAhPSAicHJvdCIKLQkJCQotCQkJdmFsdWUgPSBwcm9wc1twcm9wLm5hbWVdCi0JCQlpZih2YWx1ZSAhPSBudWxsKQotCQkJCWFzc2VydCBwcm9wLnZhbHVlID09IHZhbHVlCi0JCQkKLQkJCS8vIHJlbW92ZSB0aGlzIG9uZSBmcm9tIHRoZSBtYXAKLQkJCXByb3BzLnJlbW92ZShwcm9wLm5hbWUpCi0JCX0KLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSBsZWZ0IG92ZXIKLQkJLy9wcmludGxuICJjb3VudCBsZWZ0IGluIHByb3BzIG1hcCBpcyAke3Byb3BzLnNpemUoKX0iCi0JCWFzc2VydCBwcm9wcy5zaXplKCkgPT0gMAotCX0KLQkKLQl2b2lkIHRlc3RBbGxQcm9wZXJ0aWVzKCkgewotICAgICAgICBmb28gPSBuZXcgRm9vKCkKLQkJCi0JCS8vIHRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB0aGVyZQotCQlwcm9wcyA9IFsnbmFtZScsICdjb3VudCcsICdsb2NhdGlvbicsICdibGFoJ10KLQkJCi0JCWZvby5hbGxQcm9wZXJ0aWVzKCkuZWFjaCB7IHByb3BzIC09IFtpdC5uYW1lXSB9Ci0JCQotCQkvLyB0aGVyZSBzaG91bGQgYmUgbm9uZSBsZWZ0Ci0JCS8vcHJpbnRsbiBwcm9wcwotCQlhc3NlcnQgcHJvcHMuc2l6ZSgpID09IDAKLQl9Ci0JCi0JLy8gbWFrZSBzdXJlIGFsbFByb3BlcnRpZXMoKSB3b3JrcyB3aXRoIGV4cGFuZG8gb2JqZWN0cyB0b28KLSAgICB2b2lkIHRlc3RBbGxQcm9wZXJ0aWVzRXhwYW5kbygpIHsKLSAgICAgICAgZm9vID0gbmV3IEV4cGFuZG8oKQotCQkKLQkJZm9vLm5hbWUgPSAnSm9obicKLQkJZm9vLmxvY2F0aW9uID0gJ0NvbG9yYWRvJwotCQlmb28uY291bnQgPSAyMwotCQlmb28uYmxhaCA9IHRydWUKLQkJCi0JCS8vIHRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB0aGVyZQotCQlwcm9wcyA9IFsnbmFtZScsICdjb3VudCcsICdsb2NhdGlvbicsICdibGFoJ10KLQkJZm9vLmFsbFByb3BlcnRpZXMoKS5lYWNoIHsgcHJvcHMgLT0gW2l0Lm5hbWVdIH0KLQkJCi0JCS8vIHRoZXJlIHNob3VsZCBiZSBub25lIGxlZnQKLQkJLy9wcmludGxuIHByb3BzCi0JCWFzc2VydCBwcm9wcy5zaXplKCkgPT0gMAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHlXaXRob3V0RG90VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVdpdGhvdXREb3RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MTEwMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVdpdGhvdXREb3RUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWNsYXNzIFByb3BlcnR5V2l0aG91dERvdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgZ2V0Rm9vKCkgewotICAgICAgICByZXR1cm4gImNoZWVzZSIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UHJvcGVydHkoKSB7Ci0gICAgICAgIHZhbHVlID0gZm9vCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNoZWVzZSIKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUmFuZ2VUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1JhbmdlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmFkMWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUmFuZ2VUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi1jbGFzcyBSYW5nZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0JCi0Jdm9pZCB0ZXN0UmFuZ2UoKSB7Ci0JICAgIHggPSAwCi0KLQkgICAgZm9yICggaSBpbiAwLi45ICkgewotCSAgICAgICAgeCA9IHggKyBpCi0JICAgIH0KLQotCSAgICBhc3NlcnQgeCA9PSA0NQotCSAgICAKLQkgICAgeCA9IDAKLQotCSAgICBmb3IgKCBpIGluIDAuLi4xMCApIHsKLQkgICAgICAgIHggPSB4ICsgaQotCSAgICB9Ci0KLQkgICAgYXNzZXJ0IHggPT0gNDUKLQkgICAgCi0JICAgIHggPSAwCi0KLQkgICAgZm9yICggaSBpbiAwLi4nXHUwMDA5JyApIHsKLQkgICAgICAgIHggPSB4ICsgaQotCSAgICB9Ci0KLQkgICAgYXNzZXJ0IHggPT0gNDUKLQl9Ci0JCi0Jdm9pZCB0ZXN0UmFuZ2VFYWNoKCkgewotCSAgICB4ID0gMAotCi0JICAgICgwLi45KS5lYWNoIHsKLQkgICAgICAgIHggPSB4ICsgaXQKLQkgICAgfQotCi0JICAgIGFzc2VydCB4ID09IDQ1Ci0JICAgIAotCSAgICB4ID0gMAotCi0JICAgICgwLi4uMTApLmVhY2ggewotCSAgICAgICAgeCA9IHggKyBpdAotCSAgICB9Ci0KLQkgICAgYXNzZXJ0IHggPT0gNDUKLQl9Ci0KLQl2b2lkIHRlc3RJbnRTdGVwKCkgewotCSAgICBhc3NlcnRTdGVwKDAuLjksIDMsIFswLCAzLCA2LCA5XSkKLQkgICAgYXNzZXJ0U3RlcCgwLi4uMTAsIDMsIFswLCAzLCA2LCA5XSkKLQkgICAgCi0JICAgIGFzc2VydFN0ZXAoOS4uMCwgMywgWzksIDYsIDMsIDBdKQotCSAgICBhc3NlcnRTdGVwKDkuLi4wLCAzLCBbOSwgNiwgM10pCi0JfQotCQotCXZvaWQgdGVzdE9iamVjdFN0ZXAoKSB7Ci0JICAgIGFzc2VydFN0ZXAoJ2EnLi4nZicsIDIsIFsnYScsICdjJywgJ2UnXSkKLQkgICAgYXNzZXJ0U3RlcCgnYScuLi4nZScsIDIsIFsnYScsICdjJ10pCi0JICAgIAotCSAgICBhc3NlcnRTdGVwKCd6Jy4uJ3YnLCAyLCBbJ3onLCAneCcsICd2J10pCi0JICAgIGFzc2VydFN0ZXAoJ3onLi4uJ3YnLCAyLCBbJ3onLCAneCddKQotCX0KLQkKLQl2b2lkIHRlc3RJdGVyYXRlSW50UmFuZ2UoKSB7Ci0JICAgIGFzc2VydEl0ZXJhdGUoMC4uOSwgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKQotCSAgICBhc3NlcnRJdGVyYXRlKDEuLi44LCBbMSwgMiwgMywgNCwgNSwgNiwgN10pCi0JICAgIGFzc2VydEl0ZXJhdGUoNy4uMSwgWzcsIDYsIDUsIDQsIDMsIDIsIDFdKQotCSAgICBhc3NlcnRJdGVyYXRlKDYuLi4xLCBbNiwgNSwgNCwgMywgMl0pCi0JfQotCQotCXZvaWQgdGVzdEl0ZXJhdGVPYmplY3RSYW5nZSgpIHsKLQkgICAgYXNzZXJ0SXRlcmF0ZSgnYScuLidkJywgWydhJywgJ2InLCAnYycsICdkJ10pCi0JICAgIGFzc2VydEl0ZXJhdGUoJ2EnLi4uJ2QnLCBbJ2EnLCAnYicsICdjJ10pCi0JICAgIGFzc2VydEl0ZXJhdGUoJ3onLi4neCcsIFsneicsICd5JywgJ3gnXSkKLQkgICAgYXNzZXJ0SXRlcmF0ZSgneicuLi4neCcsIFsneicsICd5J10pCi0JfQotCQotCXZvaWQgdGVzdFJhbmdlQ29udGFpbnMoKSB7Ci0JICAgIHJhbmdlID0gMC4uMTAKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDApCi0JICAgIGFzc2VydCByYW5nZS5jb250YWlucygxMCkKLQkgICAgCi0JICAgIHJhbmdlID0gMC4uLjUKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDApCi0JICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKDUpCi0JfQotCQotCXZvaWQgdGVzdEJhY2t3YXJkc1JhbmdlQ29udGFpbnMoKSB7Ci0JICAgIHJhbmdlID0gMTAuLjAKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDApCi0JICAgIGFzc2VydCByYW5nZS5jb250YWlucygxMCkKLQkgICAgCi0JICAgIHJhbmdlID0gNS4uLjEKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDUpCi0JICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKDEpCi0JfQotCQotCXZvaWQgdGVzdE9iamVjdFJhbmdlQ29udGFpbnMoKSB7Ci0JICAgIHJhbmdlID0gJ2EnLi4neCcKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCdhJykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCd4JykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCd6JykgPT0gZmFsc2UKLQkgICAgCi0JICAgIHJhbmdlID0gJ2InLi4uJ2YnCi0JICAgIGFzc2VydCByYW5nZS5jb250YWlucygnYicpCi0JICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKCdnJykKLQkgICAgYXNzZXJ0ICEgcmFuZ2UuY29udGFpbnMoJ2YnKQotCSAgICBhc3NlcnQgISByYW5nZS5jb250YWlucygnYScpCi0JfQotCQotCXZvaWQgdGVzdEJhY2t3YXJkc09iamVjdFJhbmdlQ29udGFpbnMoKSB7Ci0JICAgIHJhbmdlID0gJ3gnLi4nYScKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCdhJykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCd4JykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCd6JykgPT0gZmFsc2UKLQkgICAgCi0JICAgIHJhbmdlID0gJ2YnLi4uJ2InCi0JICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKCdnJykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCdmJykKLQkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKCdjJykKLQkgICAgYXNzZXJ0ICEgcmFuZ2UuY29udGFpbnMoJ2InKQotCX0KLQkKLQl2b2lkIHRlc3RJbnRSYW5nZVRvU3RyaW5nKCkgewotCSAgICBhc3NlcnRUb1N0cmluZygwLi4xMCwgIjAuLjEwIikKLQkgICAgYXNzZXJ0VG9TdHJpbmcoWzEsIDQuLjEwLCA5XSwgIlsxLCA0Li4xMCwgOV0iKQotCSAgICAKLQkgICAgYXNzZXJ0VG9TdHJpbmcoMC4uLjExLCAiMC4uMTAiKQotCSAgICBhc3NlcnRUb1N0cmluZyhbMSwgNC4uLjExLCA5XSwgIlsxLCA0Li4xMCwgOV0iKQotCSAgICAKLQkgICAgCi0JICAgIGFzc2VydFRvU3RyaW5nKDEwLi4wLCAiMTAuLjAiKQotCSAgICBhc3NlcnRUb1N0cmluZyhbMSwgMTAuLjQsIDldLCAiWzEsIDEwLi40LCA5XSIpCi0JICAgIAotCSAgICBhc3NlcnRUb1N0cmluZygxMS4uLjAsICIxMS4uMSIpCi0JICAgIGFzc2VydFRvU3RyaW5nKFsxLCAxMS4uLjQsIDldLCAiWzEsIDExLi41LCA5XSIpCi0JfQotCQotCXZvaWQgdGVzdE9iamVjdFJhbmdlVG9TdHJpbmcoKSB7Ci0JICAgIGFzc2VydFRvU3RyaW5nKCdhJy4uJ2QnLCAnYS4uZCcsICciYSIuLiJkIicpCi0JICAgIGFzc2VydFRvU3RyaW5nKCdhJy4uLidkJywgJ2EuLmMnLCAnImEiLi4iYyInKQotCSAgICBhc3NlcnRUb1N0cmluZygneicuLid4JywgJ3ouLngnLCAnInoiLi4ieCInKQotCSAgICBhc3NlcnRUb1N0cmluZygneicuLi4neCcsICd6Li55JywgJyJ6Ii4uInkiJykKLQl9Ci0JCi0Jdm9pZCB0ZXN0UmFuZ2VTaXplKCkgewotCSAgICBhc3NlcnRTaXplKDEuLjEwLCAxMCkKLQkgICAgYXNzZXJ0U2l6ZSgxMS4uLjIxLCAxMCkKLQkgICAgYXNzZXJ0U2l6ZSgzMC4uMjEsIDEwKQotCSAgICBhc3NlcnRTaXplKDQwLi4uMzAsIDEwKQotCX0KLQkKLQl2b2lkIHRlc3RTdHJpbmdSYW5nZSgpIHsKLQkgICAgcmFuZ2UgPSAnYScuLidkJwotCSAgICAKLQkgICAgbGlzdCA9IFtdCi0JICAgIHJhbmdlLmVhY2ggeyBsaXN0IDw8IGl0IH0KLQkgICAgYXNzZXJ0IGxpc3QgPT0gWydhJywgJ2InLCAnYycsICdkJ10KLQkgICAgCi0JICAgIHMgPSByYW5nZS5zaXplKCkKLQkgICAgYXNzZXJ0IHMgPT0gNAotCX0KLQkKLQl2b2lkIHRlc3RCYWNrd2FyZHNTdHJpbmdSYW5nZSgpIHsKLQkgICAgcmFuZ2UgPSAnZCcuLidhJwotCSAgICAKLQkgICAgbGlzdCA9IFtdCi0JICAgIHJhbmdlLmVhY2ggeyBsaXN0IDw8IGl0IH0KLQkgICAgYXNzZXJ0IGxpc3QgPT0gWydkJywgJ2MnLCAnYicsICdhJ10KLQkgICAgCi0JICAgIHMgPSByYW5nZS5zaXplKCkKLQkgICAgYXNzZXJ0IHMgPT0gNAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJdGVyYXRlKHJhbmdlLCBleHBlY3RlZCkgewotCSAgICBsaXN0ID0gW10KLQkgICAgZm9yIChpdCBpbiByYW5nZSkgewotCSAgICAgICAgbGlzdCA8PCBpdAotCSAgICB9Ci0JICAgIGFzc2VydCBsaXN0ID09IGV4cGVjdGVkIDogImZvciBsb29wIG9uICR7cmFuZ2V9IgotCSAgICAKLQkJbGlzdCA9IFtdCi0JICAgIHJhbmdlLmVhY2ggeyBsaXN0IDw8IGl0fQotCSAgICBhc3NlcnQgbGlzdCA9PSBleHBlY3RlZCA6ICJlYWNoKCkgb24gJHtyYW5nZX0iCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFNpemUocmFuZ2UsIGV4cGVjdGVkKSB7Ci0JICAgIHNpemUgPSByYW5nZS5zaXplKCkKLQkgICAgYXNzZXJ0IHNpemUgPT0gZXhwZWN0ZWQgOiByYW5nZQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUb1N0cmluZyhyYW5nZSwgZXhwZWN0ZWQpIHsKLQkgICAgdGV4dCA9IHJhbmdlLnRvU3RyaW5nKCkKLQkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWQgOiAidG9TdHJpbmcoKSBmb3IgJHtyYW5nZX0iCi0JICAgIHRleHQgPSByYW5nZS5pbnNwZWN0KCkKLQkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWQgOiAiaW5zcGVjdCgpIGZvciAke3JhbmdlfSIKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9TdHJpbmcocmFuZ2UsIGV4cGVjdGVkU3RyaW5nLCBleHBlY3RlZEluc3BlY3QpIHsKLQkgICAgdGV4dCA9IHJhbmdlLnRvU3RyaW5nKCkKLQkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWRTdHJpbmcgOiAidG9TdHJpbmcoKSBmb3IgJHtyYW5nZX0iCi0JICAgIHRleHQgPSByYW5nZS5pbnNwZWN0KCkKLQkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWRJbnNwZWN0IDogImluc3BlY3QoKSBmb3IgJHtyYW5nZX0iCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFN0ZXAocmFuZ2UsIHN0ZXBWYWx1ZSwgZXhwZWN0ZWQpIHsKLQkgICAgbGlzdCA9IFtdCi0JICAgIHJhbmdlLnN0ZXAoc3RlcFZhbHVlKSB7Ci0JICAgICAgICBsaXN0IDw8IGl0Ci0JICAgIH0KLQkgICAgYXNzZXJ0IGxpc3QgPT0gZXhwZWN0ZWQKLQotCSAgICBsaXN0ID0gW10KLQkgICAgZm9yIChpdCBpbiByYW5nZS5zdGVwKHN0ZXBWYWx1ZSkpIHsKLQkgICAgICAgIGxpc3QgPDwgaXQKLQkgICAgfQotCSAgICBhc3NlcnQgbGlzdCA9PSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9SZWFkTGluZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTMyM2Q0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1pbXBvcnQgamF2YS5pby5GaWxlCi0KLS8qKgotICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkTGluZSgpIG1ldGhvZCB3b3JrcyBvbiBSZWFkZXIvSW5wdXRTdHJlYW0KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1jbGFzcyBSZWFkTGluZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgcHJvcGVydHkgZmlsZQotICAgIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkiKQotICAgIH0KLSAgICB2b2lkIHRlc3RSZWFkT25lTGluZUZyb21SZWFkZXIoKSB7Ci0gICAgICAgIGZpbGUud2l0aFJlYWRlcigpIHtsaW5lID0gaXQucmVhZExpbmUoKX0KLSAgICAgICAgYXNzZXJ0IGxpbmUgPT0gImltcG9ydCBqYXZhLmlvLkZpbGUiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFJlYWRPbmVMaW5lRnJvbUlucHV0U3RyZWFtKCkgewotICAgICAgICBmaWxlLndpdGhJbnB1dFN0cmVhbSgpIHtsaW5lID0gaXQucmVhZExpbmUoKX0KLSAgICAgICAgYXNzZXJ0IGxpbmUgPT0gImltcG9ydCBqYXZhLmlvLkZpbGUiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUmVndWxhckV4cHJlc3Npb25zVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9SZWd1bGFyRXhwcmVzc2lvbnNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwNmJkMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9SZWd1bGFyRXhwcmVzc2lvbnNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioKLSAqIFRlc3RzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4LgotICoKLSAqIEBhdXRob3IgU2FtIFB1bGxhcmEKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLSAKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcgotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCi0KLWNsYXNzIFJlZ3VsYXJFeHByZXNzaW9uc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gCQotIAl2b2lkIHRlc3RGaW5kUmVnZXgoKSB7Ci0KLSAJCWFzc2VydCAiY2hlZXNlIiA9fiAiY2hlZXNlIgotIAkJCi0gCQlyZWdleCA9ICJjaGVlc2UiCi0gCQlzdHJpbmcgPSAiY2hlZXNlIgotIAkJYXNzZXJ0IHN0cmluZyA9fiByZWdleAotIAkJCi0gCQlpID0gMAotIAkJbSA9ICJjaGVlc2VjaGVlc2UiID1+ICJjaGVlc2UiCi0gCQkKLSAJCWFzc2VydCBtIGluc3RhbmNlb2YgTWF0Y2hlcgotIAkJCi0gCQl3aGlsZShtKSB7IGkgPSBpICsgMSB9Ci0gCQlhc3NlcnQgaSA9PSAyCi0gCQkKLSAJCWkgPSAwCi0gCQltID0gImNoZWVzZWNoZWVzZSIgPX4gImUrIgotIAkJd2hpbGUobSkgeyBpID0gaSArIDEgfQotIAkJYXNzZXJ0IGkgPT0gNAotIAkJCi0gCQltLnJlc2V0KCkKLSAJCW0uZmluZCgpCi0gCQltLmZpbmQoKQotIAkJbS5maW5kKCkKLSAJCWFzc2VydCBtLmdyb3VwKCkgPT0gImVlIgotIAl9Ci0gCQotIAl2b2lkIHRlc3RNYXRjaFJlZ2V4KCkgewotIAkKLSAJCWFzc2VydCAiY2hlZXNlIiA9PX4gImNoZWVzZSIKLSAJCQotIAkJYXNzZXJ0ICEoImNoZWVzZWNoZWVzZSIgPT1+ICJjaGVlc2UiKQotIAkJCi0gCX0KLSAJCi0gCXByb3BlcnR5IGkKLSAJCi0gCXZvaWQgdGVzdFJlZ2V4RWFjaCgpIHsKLSAJCWkgPSAwCi0gCQkoImNoZWVzZWNoZWVzZSIgPX4gImNoZWVzZSIpLmVhY2gge3ZhbHVlIHwgcHJpbnRsbih2YWx1ZSk7IGkgPSBpICsgMX0KLSAJCWFzc2VydCBpID09IDIKLQotIAkJaSA9IDAKLSAJCSgiY2hlZXNlY2hlZXNlIiA9fiAiZWUrIikuZWFjaCB7IHByaW50bG4oaXQpOyBpID0gaSArIDF9Ci0gCQlhc3NlcnQgaSA9PSAyCi0gCX0KLSAJCi0gCXZvaWQgdGVzdFBhdHRlcm5zKCkgewotIAkJcGF0dGVybiA9IH4iZm9vIgotIAkJYXNzZXJ0IHBhdHRlcm4gaW5zdGFuY2VvZiBQYXR0ZXJuCi0gCQlhc3NlcnQgcGF0dGVybi5tYXRjaGVyKCJmb28iKS5tYXRjaGVzKCkKLSAJCWFzc2VydCAhcGF0dGVybi5tYXRjaGVyKCJiYXIiKS5tYXRjaGVzKCkKLSAJCQotIAkJcGF0dGVybiA9IH48PDxFT1MKLWZvbwotRU9TCi0gCQlhc3NlcnQgcGF0dGVybi5tYXRjaGVyKCJmb28iKS5tYXRjaGVzKCkKLSAJCWFzc2VydCAhcGF0dGVybi5tYXRjaGVyKCJiYXIiKS5tYXRjaGVzKCkKLSAJCQotIAkJYXNzZXJ0ICJmb29mb29mb28iID1+IH4iZm9vIgotIAl9Ci0gCQotIAl2b2lkIHRlc3RNYXRjaGVyKCkgewotIAkgICAgbWF0Y2hlciA9ICJjaGVlc2UtY2hlZXNlIiA9fiAiY2hlZXNlIgotIAkgICAgYW5zd2VyID0gbWF0Y2hlci5yZXBsYWNlQWxsKCJlZGFtIikKLSAJICAgIGFzc2VydCBhbnN3ZXIgPT0gJ2VkYW0tZWRhbScKLSAJICAgIAotIAkgICAgY2hlZXNlID0gKCJjaGVlc2UgY2hlZXNlISIgPX4gImNoZWVzZSIpLnJlcGxhY2VGaXJzdCgibmljZSIpCi0gCSAgICBhc3NlcnQgY2hlZXNlID09ICJuaWNlIGNoZWVzZSEiCi0gCX0KLSAJCi0gCXZvaWQgdGVzdFN1YnNjcmlwdCgpIHsKLSAJICAgIGEgPSAiY2hlZXNlY2hlZXNlIgotIAkgICAgYiA9IGEgPX4gImUrIgotIAkgICAgdmFsdWUgPSBiWzJdCi0gCSAgICBhc3NlcnQgdmFsdWUgPT0gImVlIgotIAkgICAgCi0gCSAgICB2YWx1ZSA9IGJbMCwgMl0KLSAJICAgIAotIAkgICAgYXNzZXJ0IHZhbHVlID09ICJlZWVlIgotIAkgICAgCi0gCSAgICB2YWx1ZSA9IGJbMCwgMS4uMl0KLSAJICAgIAotIAkgICAgYXNzZXJ0IHZhbHVlID09ICJlZWVlZSIKLSAJfQotCi0gICAgdm9pZCB0ZXN0R2V0TGFzdE1hdGNoZXIoKSB7Ci0gICAgICAgIGFzc2VydCAiY2hlZXNlIiA9PX4gImNoZWVzZSIKLSAgICAgICAgYXNzZXJ0IE1hdGNoZXIuZ2V0TGFzdE1hdGNoZXIoKS5tYXRjaGVzKCkKLQotICAgICAgICBzd2l0Y2goImNoZWVzZWZvbyIpIHsKLSAgICAgICAgICAgIGNhc2UgfiJjaGVlc2VjaGVlc2UiOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIGNhc2UgfiIoY2hlZXNlKShmb28pIjoKLSAgICAgICAgICAgICAgICBtID0gTWF0Y2hlci5nZXRMYXN0TWF0Y2hlcigpOwotICAgICAgICAgICAgICAgIGFzc2VydCBtLmdyb3VwKDApID09ICJjaGVlc2Vmb28iCi0gICAgICAgICAgICAgICAgYXNzZXJ0IG0uZ3JvdXAoMSkgPT0gImNoZWVzZSIKLSAgICAgICAgICAgICAgICBhc3NlcnQgbS5ncm91cCgyKSA9PSAiZm9vIgotICAgICAgICAgICAgICAgIGFzc2VydCBtLmdyb3VwQ291bnQoKSA9PSAyCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZQotICAgICAgICB9Ci0gICAgfQotCi0gCXN0YXRpYyB2b2lkIG1haW4oYXJncykgewotIAkgICAgcmVnZXh0ZXN0ID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uc1Rlc3QoKTsKLSAJICAgIHJlZ2V4dGVzdC50ZXN0RmluZFJlZ2V4KCk7Ci0gCSAgICByZWdleHRlc3QudGVzdE1hdGNoUmVnZXgoKTsKLSAJICAgIHJlZ2V4dGVzdC50ZXN0UmVnZXhFYWNoKCk7Ci0gCSAgICByZWdleHRlc3QudGVzdFBhdHRlcm5zKCk7Ci0gCSAgICByZWdleHRlc3QudGVzdE1hdGNoZXIoKTsKLSAJICAgIHJlZ2V4dGVzdC50ZXN0U3Vic2NyaXB0KCk7Ci0gCSAgICByZWdleHRlc3QudGVzdEdldExhc3RNYXRjaGVyKCk7Ci0gCX0KLSB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvUmV0dXJuVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9SZXR1cm5UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5Yjg3MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9SZXR1cm5UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKiAKLSAqIFRlc3RzIHRoZSB1c2Ugb2YgcmV0dXJucyBpbiBHcm9vdnkKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgUmV0dXJuVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICB2b2lkIHRlc3RJbnRlZ2VyUmV0dXJuVmFsdWVzKCkgewotICAgICAgICB2YWx1ZSA9IGZvbyg1KQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMTAKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCb29sZWFuUmV0dXJuVmFsdWVzKCkgewotICAgICAgICB2YWx1ZSA9IGJhcig2KQotICAgICAgICBhc3NlcnQgdmFsdWUKLSAgICB9Ci0KLQlmb28oeCkgewotCSAgICByZXR1cm4gKCB4ICogMiApCi0JfQotCQotICAgIGJhcih4KSB7Ci0gICAgICAgIHJldHVybiB4ID4gNQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RWb2lkUmV0dXJuKCkgewotICAgIAlleHBsaWNpdFZvaWRSZXR1cm4oKQotICAgIAlpbXBsaWNpdFZvaWRSZXR1cm4oKQotCQlleHBsaWNpdFZvaWRSZXR1cm5XaXRob3V0RmluYWxSZXR1cm4oKQotCQlpbXBsaWNpdFZvaWRSZXR1cm5XaXRob3V0RmluYWxSZXR1cm4oKQotCX0KLQkgCi0Jdm9pZCBleHBsaWNpdFZvaWRSZXR1cm4oKSB7Ci0JCXJldHVybgotCX0KLQotCWltcGxpY2l0Vm9pZFJldHVybigpIHsKLQkJcmV0dXJuCi0JfQotCQotICAgIHZvaWQgZXhwbGljaXRWb2lkUmV0dXJuV2l0aG91dEZpbmFsUmV0dXJuKCkgewotICAgIAlyZXR1cm47Ci0gICAgCXggPSA0OwotICAgIAlpZiAoeCA9PSAzKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQl0cnkgewotICAgIAkJCXggPSAzOwotICAgIAkJCXJldHVybjsKLSAgICAJCX0gZmluYWxseSB7Ci0gICAgCQkJLy9kbyBub3RoaW5nCi0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBpbXBsaWNpdFZvaWRSZXR1cm5XaXRob3V0RmluYWxSZXR1cm4oKSB7Ci0gICAgCXggPSA0OwotICAgIAlpZiAoeCA9PSAzKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQl0cnkgewotICAgIAkJCXggPSAzOwotICAgIAkJCXJldHVybjsKLSAgICAJCX0gZmluYWxseSB7Ci0gICAgCQkJLy9kbyBub3RoaW5nCi0gICAgCQl9Ci0gICAgCX0KLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2FmZU5hdmlnYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NhZmVOYXZpZ2F0aW9uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTNjYzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2FmZU5hdmlnYXRpb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWNsYXNzIFNhZmVOYXZpZ2F0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdE5vcm1hbFByb3BlcnR5TmF2aWdhdGlvbigpIHsKLSAgICAgICAgeCA9IFsnZm9vJzpbJ2Jhcic6MTIzLCAneCc6NDU2XSwgJ3onOjk5XQotICAgICAgICAKLSAgICAgICAgeSA9IHgtPmZvby0+YmFyCi0gICAgICAgIAotICAgICAgICBwcmludGxuKCJmb3VuZCB5ICR7eC0+Zm9vLT5iYXJ9IikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IDEyMwotICAgIH0KLQotICAgIHZvaWQgdGVzdE51bGxQcm9wZXJ0eU5hdmlnYXRpb24oKSB7Ci0gICAgICAgIHggPSBudWxsCi0gICAgICAgIAotCQl5ID0geC0+Zm9vLT5iYXIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5ID09IG51bGwKLQotCi0gICAgICAgamF2YS5hd3QuQ29sb3IgY29sb3IgPSBudWxsCi0gICAgICAgIGEgPSBjb2xvci0+YWxwaGEKLSAgICAgICAgYXNzZXJ0IGEgPT0gbnVsbAotCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE5vcm1hbE1ldGhvZENhbGwoKSB7Ci0gICAgICAgIHggPSAxMjM0Ci0gICAgICAgIAotICAgICAgICB5ID0geC0+dG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gIjEyMzQiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TnVsbE1ldGhvZENhbGwoKSB7Ci0gICAgICAgIHggPSBudWxsCi0gICAgICAgIAotICAgICAgICB5ID0geC0+dG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHkgPT0gbnVsbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NhbXBsZU1haW4uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2FtcGxlTWFpbi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWViMmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2FtcGxlTWFpbi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWNsYXNzIFNhbXBsZU1haW4gewotICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgewotICAgICAgICBmb3IgKGFyZyBpbiBhcmdzKSB7Ci0gICAgICAgICAgICBwcmludGxuKCJBcmd1bWVudDogIiArIGFyZykKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NlcmlhbGl6ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2VyaWFsaXplVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDAyYWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2VyaWFsaXplVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbQotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtCi0KLWNsYXNzIFNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RGb28oKSB7Ci0gICAgICAgIGZvbyA9IG5ldyBGb28oKQotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQ3JlYXRlZCAke2Zvb30iKQotICAgICAgICAKLSAgICAgICAgZm9vLm5hbWUgPSAiR3JvbWl0IgotICAgICAgICBmb28ubG9jYXRpb24gPSAiTW9vbiIKLSAgICAgICAgCi0gICAgICAgIGJ1ZmZlciA9IHdyaXRlKGZvbykKLSAgICAgICAgb2JqZWN0ID0gcmVhZChidWZmZXIpCi0gICAgICAgIAotICAgICAgICBwcmludGxuKCJGb3VuZCAke29iamVjdH0iKQotICAgICAgICBwcmludGxuKCJGb3VuZCAke29iamVjdH0gd2l0aCBuYW1lICR7b2JqZWN0Lm5hbWV9IGFuZCBsb2NhdGlvbiAke29iamVjdC5sb2NhdGlvbn0iKQotICAgICAgICBhc3NlcnQgb2JqZWN0ICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IG9iamVjdC5nZXRNZXRhQ2xhc3MoKSAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbWV0YWNsYXNzISIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBvYmplY3QubmFtZSA9PSAiR3JvbWl0IgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IG9iamVjdC5jbGFzcy5uYW1lID09ICJGb28iIAotICAgICAgICBhc3NlcnQgb2JqZWN0IGluc3RhbmNlb2YgRm9vCi0gICAgICAgIGFzc2VydCBvYmplY3QubG9jYXRpb24gPT0gIk1vb24iCi0gICAgfQotICAgIAotICAgIAotICAgIHdyaXRlKG9iamVjdCkgewotICAgICAgICBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKLSAgICAgICAgb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShidWZmZXIpCi0gICAgICAgIG91dC53cml0ZU9iamVjdChvYmplY3QpCi0gICAgICAgIG91dC5jbG9zZSgpCi0gICAgICAgIHJldHVybiBidWZmZXIudG9CeXRlQXJyYXkoKQotICAgIH0KLSAgICAKLSAgICByZWFkKGJ1ZmZlcikgewotICAgICAgICBpbnB1dCA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKSkKLSAgICAgICAgb2JqZWN0ID0gaW5wdXQucmVhZE9iamVjdCgpCi0gICAgICAgIGlucHV0LmNsb3NlKCkKLSAgICAgICAgcmV0dXJuIG9iamVjdAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2hlbGxUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NoZWxsVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGY0YTUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU2hlbGxUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWNsYXNzIFNoZWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFJlYWRBbmRXcml0ZVZhcmlhYmxlKCkgewotICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCi0gICAgICAgIAotICAgICAgICBzaGVsbC5mb28gPSAxCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IHNoZWxsLmV2YWx1YXRlKDw8PEVPRgotcHJpbnRsbignZm9vIGlzIGN1cnJlbnRseSAnICsgZm9vKQotZm9vID0gMiAKLXByaW50bG4oJ2ZvbyBpcyBub3cgJyArIGZvbykgICAgICAgICAgICAgICAgCi1yZXR1cm4gZm9vCi1FT0YsICJEdW1teTEuZ3Jvb3Z5IikKLQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDIKLSAgICAgICAgYXNzZXJ0IHNoZWxsLmZvbyA9PSAyIDogIlZhbHVlIGlzIG5vdyAke3NoZWxsLmZvb30iCi0JfQotICAgIAotICAgIHZvaWQgdGVzdERlZmluZU5ld1ZhcmlhYmxlKCkgewotICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IHNoZWxsLmV2YWx1YXRlKCA8PDxFT0YyCi1iYXIgPSAzIAotcHJpbnRsbignYmFyIGlzIG5vdyAnICsgYmFyKSAgICAgICAgICAgICAgICAKLXJldHVybiBiYXIKLUVPRjIsICJEdW1teTIuZ3Jvb3Z5IikKLQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDMKLSAgICAgICAgYXNzZXJ0IHNoZWxsLmJhciA9PSAzIDogIlZhbHVlIGlzIG5vdyAke3NoZWxsLmJhcn0iCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NvY2tldFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU29ja2V0VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OTkzOWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU29ja2V0VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioKLSAqIGNoZWNrIHRoYXQgZ3Jvb3Z5IFNvY2tldCBtZXRob2RzIGRvIHRoZWlyIGpvYi4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLWltcG9ydCBqYXZhLmlvLioKLWltcG9ydCBqYXZhLm5ldC4qCi0KLWNsYXNzIFNvY2tldFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgcHJvcGVydHkgbXlTb2NrZXQKLSAgICAKLSAgICB2b2lkIHNldFVwKCkgewotICAgICAgICBteVNvY2tldCA9IG5ldyBNb2NrU29ja2V0KCkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U29ja2V0QXBwZW5kQnl0ZXMoKSB7Ci0gICAgICAgIG15Qnl0ZXMgPSAibW9va3kiLmdldEJ5dGVzKCkKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBteVNvY2tldCA8PCBteUJ5dGVzCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbXlTb2NrZXQub3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkgICAgICAgICAgCi0gICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbAotICAgICAgICBhc3NlcnQgQXJyYXlzLmVxdWFscyhteUJ5dGVzLHJlc3VsdCkKLSAgICB9Ci0gICAgdm9pZCB0ZXN0U29ja2V0QXBwZW5kVHdvQnl0ZUFycmF5cygpIHsKLSAgICAgICAgbXlCeXRlczEgPSAiZm9vIi5nZXRCeXRlcygpCi0gICAgICAgIG15Qnl0ZXMyID0gImJhciIuZ2V0Qnl0ZXMoKQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG15U29ja2V0IDw8IG15Qnl0ZXMxIDw8IG15Qnl0ZXMyCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbXlTb2NrZXQub3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsCi0gICAgICAgIGFzc2VydCByZXN1bHQuc2l6ZSgpID09IG15Qnl0ZXMxLnNpemUoKSArIG15Qnl0ZXMyLnNpemUoKSAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U29ja2V0QXBwZW5kKCkgewotICAgICAgICBteVNvY2tldCA8PCAibW9va3kiCi0gICAgICAgIGFzc2VydCAibW9va3kiID09IG15U29ja2V0Lm91dHB1dFN0cmVhbS50b1N0cmluZygpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFNvY2tldFdpdGhTdHJlYW1zQ2xvc3VyZSgpIHsKLSAgICAgICAgbXlTb2NrZXQud2l0aFN0cmVhbXMge2ksb3wKLSAgICAgICAgICAgIGFzc2VydCBpIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIGFzc2VydCBpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBvIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IG8gIT0gbnVsbCAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBteVNvY2tldC5jbG9zZSgpCi0gICAgfQotfQotCi0vKioKLSAqIHNpbXBsZSwgdW5jb25uZWN0ZWQgU29ja2V0LCB1c2VkIHB1cmVseSBmb3IgdGVzdCBjYXNlcwotICovCi1jbGFzcyBNb2NrU29ja2V0IGV4dGVuZHMgU29ja2V0IHsKLSAgICBwcml2YXRlIGkKLSAgICBwcml2YXRlIG8KLSAgICBwdWJsaWMgTW9ja1NvY2tldCgpIHsKLSAgICAgICAgaSA9IG5ldyBNb2NrSW5wdXRTdHJlYW0oKQotICAgICAgICBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCi0gICAgfQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsgcmV0dXJuIGkgfQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeyByZXR1cm4gbyB9Ci19Ci0KLS8qKgotICogb25seSBuZWVkZWQgZm9yIHdvcmthcm91bmQgaW4gZ3Jvb3Z5LCAKLSAqICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXlCeXRlQXJyYXkpIGRvZXNuJ3Qgd29yayBhdCBtby4uLiAoMjgtU2VwLTIwMDQpCi0gKi8KLWNsYXNzIE1vY2tJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLSAgICBpbnQgcmVhZCgpIHsgcmV0dXJuIC0xIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NvcnRUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1NvcnRUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxOTU1Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Tb3J0VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBTb3J0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFNvcnRXaXRoT3JkZXJCeSgpIHsKLSAgICAgICAgbGlzdCA9IGdldFBlb3BsZSgpCi0gICAgICAgIG9yZGVyID0gbmV3IE9yZGVyQnkoIHsgaXQuY2hlZXNlIH0gKQotICAgICAgICBsaXN0LnNvcnQob3JkZXIpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbGlzdFswXS5uYW1lID09ICdKb2UnCi0gICAgICAgIGFzc2VydCBsaXN0Wy0xXS5uYW1lID09ICdDaHJpcycKLSAgICAgICAgYXNzZXJ0IGxpc3QubmFtZSA9PSBbJ0pvZScsICdCb2InLCAnSmFtZXMnLCAnQ2hyaXMnXQotCi0gICAgICAgIHByaW50bG4gIlNvcnRlZCBieSBjaGVlZWUiCi0gICAgICAgIGxpc3QuZWFjaCB7IHByaW50bG4gaXQuZHVtcCgpIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U29ydFdpdGhDbG9zdXJlKCkgewotICAgICAgICBsaXN0ID0gZ2V0UGVvcGxlKCkKLSAgICAgICAgbGlzdC5zb3J0IHsgaXQuY2hlZXNlIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBsaXN0Lm5hbWUgPT0gWydKb2UnLCAnQm9iJywgJ0phbWVzJywgJ0NocmlzJ10KLQotICAgICAgICBwcmludGxuICJTb3J0ZWQgYnkgY2hlZWVlIgotICAgICAgICBsaXN0LmVhY2ggeyBwcmludGxuIGl0LmR1bXAoKSB9Ci0gICAgfQotICAgIAotICAgIGdldFBlb3BsZSgpIHsKLSAgICAgICAgYW5zd2VyID0gW10KLSAgICAgICAgYW5zd2VyIDw8IG5ldyBFeHBhbmRvKG5hbWU6J0phbWVzJywgY2hlZXNlOidFZGFtJywgbG9jYXRpb246J0xvbmRvbicpCi0gICAgICAgIGFuc3dlciA8PCBuZXcgRXhwYW5kbyhuYW1lOidCb2InLCBjaGVlc2U6J0NoZWRkYXInLCBsb2NhdGlvbjonQXRsYW50YScpCi0gICAgICAgIGFuc3dlciA8PCBuZXcgRXhwYW5kbyhuYW1lOidDaHJpcycsIGNoZWVzZTonUmVkIExlaWNlc3RlcicsIGxvY2F0aW9uOidMb25kb24nKQotICAgICAgICBhbnN3ZXIgPDwgbmV3IEV4cGFuZG8obmFtZTonSm9lJywgY2hlZXNlOidCcmllJywgbG9jYXRpb246J0xvbmRvbicpCi0gICAgICAgIHJldHVybiBhbnN3ZXIKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdGF0aWNUaGlzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdGF0aWNUaGlzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mzk4NTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU3RhdGljVGhpc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotY2xhc3MgU3RhdGljVGhpc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQl2b2lkIHRlc3RUaGlzRmFpbCgpIHsKLQkJc3RhdGljTWV0aG9kKCkKLQl9Ci0JCi0Jc3RhdGljIHN0YXRpY01ldGhvZCgpIHsKLQkgICAgZm9vID0gdGhpcwotCSAgICAKLQkgICAgYXNzZXJ0IGZvbyAhPSBudWxsCi0JICAgIGFzc2VydCBmb28ubmFtZS5lbmRzV2l0aCgiU3RhdGljVGhpc1Rlc3QiKQotCSAgICAKLQkgICAgcHJpbnRsbigidGhpczogIiArIHRoaXMpCi0JICAgIAotCSAgICBzID0gc3VwZXIKLQkgICAgCi0JICAgIGFzc2VydCBzICE9IG51bGwKLQkgICAgYXNzZXJ0IHMubmFtZS5lbmRzV2l0aCgiR3Jvb3Z5VGVzdENhc2UiKQotCi0gICAgICAgIHByaW50bG4oInN1cGVyOiAiICsgc3VwZXIpCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU3RyaW5nT3BlcmF0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdHJpbmdPcGVyYXRpb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyYWUxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdHJpbmdPcGVyYXRpb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLWNsYXNzIFN0cmluZ09wZXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcm9wZXJ0eSB4Ci0gICAgcHJvcGVydHkgeQotICAgIAotICAgIHZvaWQgdGVzdFBsdXMoKSB7Ci0gICAgICAgIHggPSAiaGVsbG8gIiArICJ0aGVyZSIKLSAgICAgICAgYXNzZXJ0IHggPT0gImhlbGxvIHRoZXJlIgotICAgICAgICAKLSAgICAgICAgeCA9ICJoZWxsbyAiICsgMgotICAgICAgICBhc3NlcnQgeCA9PSAiaGVsbG8gMiIKLSAgICAgICAgCi0gICAgICAgIHggPSAiaGVsbG8gIiArIDEuMgotICAgICAgICBhc3NlcnQgeCA9PSAiaGVsbG8gMS4yIgotICAgICAgICAKLSAgICAgICAgeSA9IHggKyAxCi0gICAgICAgIGFzc2VydCB5ID09ICJoZWxsbyAxLjIxIiAgICAgICAgCi0gICAgfQotCi0Jdm9pZCB0ZXN0TG9uZ1BsdXMoKSB7Ci0JICAgIHggPSAiaGVsbG8iICsgIiAiICsgInRoZXJlIiArICIgbmljZSIgKyAiIGRheSIKLQkgICAgCi0JICAgIGFzc2VydCB4ID09ICJoZWxsbyB0aGVyZSBuaWNlIGRheSIKLQl9Ci0JCi0gICAgdm9pZCB0ZXN0TWludXMoKSB7Ci0JCXggPSAidGhlIHF1aWNrIGJyb3duIGZveCIgLSAicXVpY2sgIgotCQkKLQkJYXNzZXJ0IHggPT0gInRoZSBicm93biBmb3giCi0JCQotCQl5ID0geCAtICJicm93biAiCi0JCQotCQlhc3NlcnQgeSA9PSAidGhlIGZveCIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0T3BlcmF0aW9uc09uQ29uc3RhbnRTdHJpbmcoKSB7Ci0gICAgICAgIGFzc2VydCAiaGVsbG8iLnNpemUoKSA9PSA1Ci0KLSAgICAgICAgYXNzZXJ0ICJ0aGUgcXVpY2sgYnJvd24iLnN1YnN0cmluZyg0KS5zdWJzdHJpbmcoMCw1KSA9PSAicXVpY2siCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU3RyaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdHJpbmdUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1MzBiNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdHJpbmdUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNsYXNzIFN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RTdHJpbmcoKSB7Ci0gICAgICAgIHMgPSAiYWJjZCIKLSAgICAgICAgYXNzZXJ0IHMubGVuZ3RoKCkgPT0gNAotICAgICAgICBhc3NlcnQgNCA9PSBzLmxlbmd0aCgpCi0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHBvbHltb3JwaGljIHNpemUoKSBtZXRob2QgbGlrZSBjb2xsZWN0aW9ucwotICAgICAgICBhc3NlcnQgcy5zaXplKCkgPT0gNAotICAgICAgICAKLSAgICAgICAgcyA9IHMgKyAiZWZnIiArICJoaWprIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHMuc2l6ZSgpID09IDExCi0gICAgICAgIGFzc2VydCAiYWJjZGVmIi5zaXplKCkgPT0gNgotICAgIH0KLQotICAgIHZvaWQgdGVzdFN0cmluZ1BsdXNOdWxsKCkgewotICAgICAgICB5ID0gbnVsbAotICAgICAgICAKLSAgICAgICAgeCA9ICJoZWxsbyAiICsgeQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gImhlbGxvIG51bGwiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdE5leHRQcmV2aW91cygpIHsKLSAgICAJeCA9ICdhJwotICAgIAl5ID0geC5uZXh0KCkgCi0gICAgCWFzc2VydCB5ID09ICdiJwotICAgIAotICAgIAl6ID0gJ3onLnByZXZpb3VzKCkKLSAgICAJYXNzZXJ0IHogPT0gJ3knCi0gICAgCQotICAgIAl6ID0gJ3onCi0gICAgCWIgPSB6Lm5leHQoKQotICAgIAlhc3NlcnQgYiAhPSAneicKLSAgICAJCi0gICAgCXByaW50bG4oei5jaGFyQXQoMCkpCi0gICAgCXByaW50bG4oYi5jaGFyQXQoMCkpCi0gICAgCQotICAgIAlhc3NlcnQgYiA+IHoKLSAgICAJCi0gICAgCXByaW50bG4gIkluY3JlbWVudGVkIHo6ICIgKyBiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEFwcHBlbmRUb1N0cmluZygpIHsKLSAgICAgICAgbmFtZSA9ICJHcm9taXQiCi0gICAgICAgIHJlc3VsdCA9ICJoZWxsbyAiIDw8IG5hbWUgPDwgIiEiIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJlc3VsdC50b1N0cmluZygpID09ICJoZWxsbyBHcm9taXQhIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RBcHBwZW5kVG9TdHJpbmdCdWZmZXIoKSB7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKQotICAgICAgICAKLSAgICAgICAgbmFtZSA9ICJHcm9taXQiCi0gICAgICAgIGJ1ZmZlciA8PCAiaGVsbG8gIiA8PCBuYW1lIDw8ICIhIiAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBidWZmZXIudG9TdHJpbmcoKSA9PSAiaGVsbG8gR3JvbWl0ISIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9TdWJzY3JpcHRUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1N1YnNjcmlwdFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmJkOTQ4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1N1YnNjcmlwdFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLWNsYXNzIFN1YnNjcmlwdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RMaXN0UmFuZ2UoKSB7Ci0gICAgICAgIGxpc3QgPSBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddCi0JCQotICAgICAgICBzdWIgPSBsaXN0WzIuLjRdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydjJywgJ2QnLCAnZSddCi0gICAgICAgIAotICAgICAgICBzdWIgPSBsaXN0WzIuLi41XQotICAgICAgICBhc3NlcnQgc3ViID09IFsnYycsICdkJywgJ2UnXQotICAgICAgICAKLSAgICAgICAgdmFsdWUgPSBsaXN0Wy0xXQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2UnCi0gICAgICAgIAotICAgICAgICBzdWIgPSBsaXN0Wy00Li4tMl0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2InLCAnYycsICdkJ10KLSAgICAgICAgCi0gICAgICAgIC8vIGJhY2t3YXJkcyByYW5nZXMKLSAgICAgICAgc3ViID0gbGlzdFstMS4uLTNdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydlJywgJ2QnLCAnYyddCi0gICAgICAgIAotICAgICAgICBzdWIgPSBsaXN0Wy0zLi4tMV0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2MnLCAnZCcsICdlJ10KLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbMy4uMV0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2QnLCAnYycsICdiJ10KLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbMS4uLTNdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydiJywgJ2MnXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RPYmplY3RSYW5nZVJhbmdlKCkgewotICAgICAgICBsaXN0ID0gJ2EnLi4nZScKLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbMi4uNF0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2MnLCAnZCcsICdlJ10KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gbGlzdFstMV0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdlJwotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFstNC4uLTJdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydiJywgJ2MnLCAnZCddCi0gICAgICAgIAotICAgICAgICAvLyBiYWNrd2FyZHMgcmFuZ2VzCi0gICAgICAgIHN1YiA9IGxpc3RbLTEuLi0zXQotICAgICAgICBhc3NlcnQgc3ViID09IFsnZScsICdkJywgJ2MnXQotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFszLi4xXQotICAgICAgICBhc3NlcnQgc3ViID09IFsnZCcsICdjJywgJ2InXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTdHJpbmdBcnJheVJhbmdlKCkgewotICAgICAgICBsaXN0ID0gbmV3IFN0cmluZ1tdIHsnYScsICdiJywgJ2MnLCAnZCcsICdlJ30KLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbMi4uNF0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2MnLCAnZCcsICdlJ10KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gbGlzdFstMV0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdlJwotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFstNC4uLTJdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydiJywgJ2MnLCAnZCddCi0gICAgICAgIAotICAgICAgICAvLyBiYWNrd2FyZHMgcmFuZ2VzCi0gICAgICAgIHN1YiA9IGxpc3RbLTEuLi0zXQotICAgICAgICBhc3NlcnQgc3ViID09IFsnZScsICdkJywgJ2MnXQotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFszLi4xXQotICAgICAgICBhc3NlcnQgc3ViID09IFsnZCcsICdjJywgJ2InXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RJbnRSYW5nZVJhbmdlKCkgewotICAgICAgICBsaXN0ID0gMTAuLjE1Ci0gICAgICAgIAotICAgICAgICBzdWIgPSBsaXN0WzIuLjRdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWzEyLCAxMywgMTRdCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IGxpc3RbLTFdCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxNQotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFstNC4uLTJdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWzEyLCAxMywgMTRdCi0gICAgICAgIAotICAgICAgICAvLyBiYWNrd2FyZHMgcmFuZ2VzCi0gICAgICAgIHN1YiA9IGxpc3RbLTEuLi0zXQotICAgICAgICBhc3NlcnQgc3ViID09IFsxNSwgMTQsIDEzXQotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFszLi4xXQotICAgICAgICBhc3NlcnQgc3ViID09IFsxMywgMTIsIDExXQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RJbnRBcnJheVJhbmdlKCkgewotICAgICAgICBsaXN0ID0gbmV3IEludGVnZXJbXSB7IDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfQotICAgICAgICAKLSAgICAgICAgc3ViID0gbGlzdFsyLi40XQotICAgICAgICBhc3NlcnQgc3ViID09IFsxMiwgMTMsIDE0XQotICAgICAgICAKLSAgICAgICAgdmFsdWUgPSBsaXN0Wy0xXQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMTUKLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbLTQuLi0yXQotICAgICAgICBhc3NlcnQgc3ViID09IFsxMiwgMTMsIDE0XQotICAgICAgICAKLSAgICAgICAgLy8gYmFja3dhcmRzIHJhbmdlcwotICAgICAgICBzdWIgPSBsaXN0Wy0xLi4tM10KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbMTUsIDE0LCAxM10KLSAgICAgICAgCi0gICAgICAgIHN1YiA9IGxpc3RbMy4uMV0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbMTMsIDEyLCAxMV0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3RyaW5nU3Vic2NyaXB0KCkgewotICAgICAgICB0ZXh0ID0gIm5pY2UgY2hlZXNlIGdyb21pdCEiCi0gICAgICAgIAotICAgICAgICB4ID0gdGV4dFsyXQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHggPT0gImMiCi0gICAgICAgIGFzc2VydCB4LmNsYXNzID09IFN0cmluZwotICAgICAgICAKLSAgICAgICAgc3ViID0gdGV4dFs1Li4xMF0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSAnY2hlZXNlJwotICAgICAgICAKLSAgICAgICAgc3ViID0gdGV4dFsxMC4uNV0KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSAnZXNlZWhjJwotICAgICAgICAKLSAgICAgICAgc3ViID0gdGV4dFstMi4uLTddCi0gICAgICAgIGFzc2VydCBzdWIgPT0gJ3RpbW9yZycKLSAgICAgICAgCi0gICAgICAgIHN1YiA9IHRleHRbMS4uLTNdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gImljZSBjaGVlc2UgZ3JvbWkiCi0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RMaXN0U3Vic2NyaXB0V2l0aExpc3QoKSB7Ci0gICAgICAgIGxpc3QgPSBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddCi0gICAgICAgIAotICAgICAgICBpbmRpY2VzID0gWzAsIDIsIDRdCi0gICAgICAgIHN1YiA9IGxpc3RbaW5kaWNlc10KLSAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2EnLCAnYycsICdlJ10KLSAgICAgICAgCi0gICAgICAgIC8vIHZlcmJvc2UgYnV0IHZhbGlkCi0gICAgICAgIHN1YiA9IGxpc3RbWzEsIDNdXQotICAgICAgICBhc3NlcnQgc3ViID09IFsnYicsICdkJ10KLSAgICAgCi0gICAgICAgIC8vIHN5bnRheCBzdWdhcgotICAgICAgICBzdWIgPSBsaXN0WzIsIDRdCi0gICAgICAgIGFzc2VydCBzdWIgPT0gWydjJywgJ2UnXQotICAgIH0KLSAgICAKLSAgICAKLQl2b2lkIHRlc3RMaXN0U3Vic2NyaXB0V2l0aExpc3RBbmRSYW5nZSgpIHsKLQkgICAgbGlzdCA9IDEwMC4uMjAwCi0JICAgIAotCSAgICBzdWIgPSBsaXN0WzEsIDMsIDIwLi4yNSwgMzNdCi0JICAgIGFzc2VydCBzdWIgPT0gWzEwMSwgMTAzLCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMzNdCi0JICAgIAotCSAgICAvLyBub3cgbGV0cyB0cnkgaXQgb24gYW4gYXJyYXkKLQkgICAgYXJyYXkgPSBsaXN0LnRvQXJyYXkoKQotCSAgICAKLQkgICAgc3ViID0gYXJyYXlbMSwgMywgMjAuLjI1LCAzM10KLQkgICAgYXNzZXJ0IHN1YiA9PSBbMTAxLCAxMDMsIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEzM10KLQl9Ci0JCi0gICAgdm9pZCB0ZXN0U3RyaW5nV2l0aFN1YnNjcmlwdExpc3QoKSB7Ci0gICAgICAgIHRleHQgPSAibmljZSBjaGVlc2UgZ3JvbWl0ISIKLSAgICAgICAgCi0gICAgICAgIHN1YiA9IHRleHRbMSwgMiwgMywgNS4uMTBdCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgc3ViID09ICJpY2VjaGVlc2UiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFN1Yk1hcCgpIHsKLSAgICAgICAgbWFwID0gWydhJzoxMjMsICdiJzo0NTYsICdjJzo3ODldCi0gICAgICAgIAotICAgICAgICBrZXlzID0gWydiJywgJ2EnXQotICAgICAgICBzdWIgPSBtYXAuc3ViTWFwKGtleXMpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgc3ViLnNpemUoKSA9PSAyCi0gICAgICAgIGFzc2VydCBzdWJbJ2EnXSA9PSAxMjMKLSAgICAgICAgYXNzZXJ0IHN1YlsnYiddID09IDQ1NgotICAgICAgICBhc3NlcnQgISBzdWIuY29udGFpbnNLZXkoJ2MnKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RMaXN0V2l0aGluQUxpc3RTeW50YXgoKSB7Ci0gICAgICAgIGxpc3QgPSBbMSwgMiwgMywgNC4uMTAsIDUsIDZdCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbGlzdC5zaXplKCkgPT0gNgotICAgICAgICBzdWJsaXN0ID0gbGlzdFszXQotICAgICAgICBhc3NlcnQgc3VibGlzdCA9PSA0Li4xMAotICAgICAgICBhc3NlcnQgc3VibGlzdCA9PSBbNCwgNSwgNiwgNywgOCwgOSwgMTBdCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJlYW5Qcm9wZXJ0aWVzKCkgewotICAgIAlmb28gPSBuZXcgRm9vKCkKLSAgICAJCi0gICAgCWZvb1snbmFtZSddID0gJ0dyb21pdCcKLSAgICAJCi0gICAgCWFzc2VydCBmb28ubmFtZSA9PSAnR3JvbWl0JwotICAgIAkKLSAgICAJdmFsdWUgPSBmb29bJ25hbWUnXQotICAgIAlhc3NlcnQgdmFsdWUgPT0gJ0dyb21pdCcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Td2l0Y2hUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI2Y2Y4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotY2xhc3MgU3dpdGNoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFN3aXRjaCgpIHsKLSAgICAgICAgY2FsbFN3aXRjaCgiZm9vIiwgImZvbyIpCi0gICAgICAgIGNhbGxTd2l0Y2goImJhciIsICJiYXJmb28iKQotICAgICAgICBjYWxsU3dpdGNoKCJ4eXoiLCAieHl6RGVmYXVsdCIpCi0gICAgICAgIGNhbGxTd2l0Y2goInp6eiIsICJEZWZhdWx0IikKLSAgICAgICAgY2FsbFN3aXRjaCg0LCAiTGlzdCIpCi0gICAgICAgIGNhbGxTd2l0Y2goNSwgIkxpc3QiKQotICAgICAgICBjYWxsU3dpdGNoKDYsICJMaXN0IikKLSAgICAgICAgY2FsbFN3aXRjaCgiaW5MaXN0IiwgIkxpc3QiKQotICAgICAgICBjYWxsU3dpdGNoKDEsICJJbnRlZ2VyIikKLSAgICAgICAgY2FsbFN3aXRjaCgxLjIsICJOdW1iZXIiKQotICAgIH0KLSAgICAKLSAgICBjYWxsU3dpdGNoKHgsIGV4cGVjdGVkKSB7Ci0JCXByaW50bG4oIkNhbGxpbmcgc3dpdGNoIHdpdGggJHt4fSIpCi0JCQotCQlyZXN1bHQgPSAiIgotCQkKLSAgICAgICAgc3dpdGNoICh4KSB7Ci0gICAgICAgICAgICBjYXNlICJiYXIiOgotCSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICJiYXIiCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlICJmb28iOgotICAgIAkgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICJmb28iCi0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgY2FzZSBbNCwgNSwgNiwgJ2luTGlzdCddOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJMaXN0IgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIEludGVnZXI6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gIkludGVnZXIiCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgTnVtYmVyOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJOdW1iZXIiCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgInh5eiI6Ci0gICAgICAgIAkgICAgcmVzdWx0ID0gcmVzdWx0ICsgInh5eiIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgIkRlZmF1bHQiCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkganVzdCB0ZXN0aW5nIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRsbigiRm91bmQgcmVzdWx0ICR7cmVzdWx0fSIpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkIDogIndoZW4gY2FsbGluZyBzd2l0Y2ggd2l0aCAke3h9IgotICAgIH0KLQotICAgIC8vIHRlc3QgdGhlIGNvbnRpbnVlIGluIHN3aXRjaCwgd2hpY2ggc2hvdWxkIGp1bXAgdG8gdGhlIHRoZSB3aGlsZSBzdGFydAotICAgIHZvaWQgdGVzdFN3aXRjaFNjb3BlKCkgewotICAgICAgICBpID0gMAotICAgICAgICBqID0gMAotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgc3dpdGNoKGkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBqICs9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gNSkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGogPT0gNgotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFdpdGhEaWZmZXJlbnRUeXBlc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU3dpdGNoV2l0aERpZmZlcmVudFR5cGVzVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWZkNzcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvU3dpdGNoV2l0aERpZmZlcmVudFR5cGVzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotCi1pbXBvcnQgamF2YS51dGlsLkRhdGUKLQotLyoqIAotICogQSB0ZXN0IGNhc2UgZm9yIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aCBkaWZmZXJlbnQgdHlwZXMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgU3dpdGNoV2l0aERpZmZlcmVudFR5cGVzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhJbnRWYWx1ZXMoKSB7Ci0gICAgICAgIGFzc2VydFN3aXRjaCgxLCAyLCAzLCA0KQotICAgIH0KLQotICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhEb3VibGVWYWx1ZXMoKSB7Ci0gICAgICAgIGFzc2VydFN3aXRjaCgxLjUsIDIuNCwgMy4yLCA0LjEpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhTdHJpbmdWYWx1ZXMoKSB7Ci0gICAgICAgIGFzc2VydFN3aXRjaCgiYWJjIiwgImRlZiIsICJ4eXoiLCAidW5rbm93biIpCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0U3dpdGNoV2l0aE1peGVkVHlwZVZhbHVlcygpIHsKLSAgICAgICAgYXNzZXJ0U3dpdGNoKCJhYmMiLCBuZXcgRGF0ZSgpLCA1LjMyLCAyMykKLSAgICB9Ci0KLQotICAgIGFzc2VydFN3aXRjaChhLCBiLCBjLCBkKSB7Ci0gICAgICAgIGFzc2VydFN3aXRjaE1hdGNoMShhLCBhLCBiLCBjKQotICAgICAgICBhc3NlcnRTd2l0Y2hNYXRjaDIoYiwgYSwgYiwgYykKLSAgICAgICAgYXNzZXJ0U3dpdGNoTWF0Y2gzKGMsIGEsIGIsIGMpCi0gICAgICAgIGFzc2VydFN3aXRjaE1hdGNoRGVmYXVsdChkLCBhLCBiLCBjKQotICAgIH0KLSAgICAKLSAgICBhc3NlcnRTd2l0Y2hNYXRjaDEodmFsdWUsIGNhc2UxVmFsdWUsIGNhc2UyVmFsdWUsIGNhc2UzVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICAgICAgY2FzZSBjYXNlMVZhbHVlOiAKLSAgICAgICAgICAgICAgICAvLyB3b3JrZWQKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSBjYXNlMlZhbHVlOiAKLSAgICAgICAgICAgICAgICBmYWlsTm90RXF1YWxzKHZhbHVlLCBjYXNlMlZhbHVlKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBjYXNlIGNhc2UzVmFsdWU6IAotICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UzVmFsdWUpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbE5vdERlZmF1bHQodmFsdWUpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydFN3aXRjaE1hdGNoMih2YWx1ZSwgY2FzZTFWYWx1ZSwgY2FzZTJWYWx1ZSwgY2FzZTNWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIGNhc2UxVmFsdWU6IAotICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UxVmFsdWUpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgY2FzZTJWYWx1ZTogCi0JICAgICAgICAgICAgLy8gd29ya2VkCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgY2FzZTNWYWx1ZTogCi0gICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTNWYWx1ZSkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsTm90RGVmYXVsdCh2YWx1ZSkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGFzc2VydFN3aXRjaE1hdGNoMyh2YWx1ZSwgY2FzZTFWYWx1ZSwgY2FzZTJWYWx1ZSwgY2FzZTNWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIGNhc2UxVmFsdWU6IAotICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UxVmFsdWUpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgY2FzZTJWYWx1ZTogCi0gICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTJWYWx1ZSkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSBjYXNlM1ZhbHVlOiAKLQkgICAgICAgICAgICAvLyB3b3JrZWQKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsTm90RGVmYXVsdCh2YWx1ZSkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGFzc2VydFN3aXRjaE1hdGNoRGVmYXVsdCh2YWx1ZSwgY2FzZTFWYWx1ZSwgY2FzZTJWYWx1ZSwgY2FzZTNWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIGNhc2UxVmFsdWU6IAotICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UxVmFsdWUpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgY2FzZTJWYWx1ZTogCi0gICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTJWYWx1ZSkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSBjYXNlM1ZhbHVlOiAKLSAgICAgICAgICAgICAgICBmYWlsTm90RXF1YWxzKHZhbHVlLCBjYXNlM1ZhbHVlKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBkZWZhdWx0OgotCSAgICAgICAgICAgIC8vIHdvcmtlZAotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0KLSAgICB9Ci0KLQlmYWlsTm90RXF1YWxzKHZhbHVlLCBleHBlY3RlZENhc2VWYWx1ZSkgewotCSAgICBmYWlsKCJ2YWx1ZTogIiArIHZhbHVlICsgIiBpcyBub3QgZXF1YWwgdG8gY2FzZSB2YWx1ZTogIiArIGV4cGVjdGVkQ2FzZVZhbHVlKQotCX0KLQkKLQlmYWlsTm90RGVmYXVsdCh2YWx1ZSkgewotCSAgICBmYWlsKCJ2YWx1ZTogIiArIHZhbHVlICsgIiBzaG91bGQgbm90IG1hdGNoIHRoZSBkZWZhdWx0IHN3aXRjaCBjbGF1c2UiICkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVGVybmFyeU9wZXJhdG9yVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UZXJuYXJ5T3BlcmF0b3JUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZDBjMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UZXJuYXJ5T3BlcmF0b3JUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWNsYXNzIFRlcm5hcnlPcGVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQl2b2lkIHRlc3RTaW1wbGVVc2UoKSB7Ci0JICAgIHkgPSA1Ci0JICAgIAotCSAgICB4ID0gKHkgPiAxKSA/ICJ3b3JrZWQiIDogImZhaWxlZCIKLQkJYXNzZXJ0IHggPT0gIndvcmtlZCIJCQkKLQkJCQkJCi0JCQkJCQotCQl4ID0gKHkgPCA0KSA/ICJmYWlsZWQiIDogIndvcmtlZCIKLQkJYXNzZXJ0IHggPT0gIndvcmtlZCIJCQkKLQl9Ci0JCi0Jdm9pZCB0ZXN0VXNlSW5QYXJhbWV0ZXJDYWxsaW5nKCkgewotCSAgICB6ID0gMTIzCi0JICAgIGFzc2VydENhbGxlZFdpdGhGb28oeiA+IDEwMCA/ICJmb28iIDogImJhciIpCi0JICAgIGFzc2VydENhbGxlZFdpdGhGb28oeiA8IDEwMCA/ICJiYXIiIDogImZvbyIpCi0JICAgfQotCQotCWFzc2VydENhbGxlZFdpdGhGb28ocGFyYW0pIHsKLQkgICAgcHJpbnRsbiAiY2FsbGVkIHdpdGggcGFyYW0gJHtwYXJhbX0iCi0JICAgIGFzc2VydCBwYXJhbSA9PSAiZm9vIgotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1RleHRQcm9wZXJ0eVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVGV4dFByb3BlcnR5VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTI1NzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVGV4dFByb3BlcnR5VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIGNoZWNrIHRoYXQgdGV4dCBwcm9wZXJ0eSBpcyBhdmFpbGFibGUgb24uLi4gCi0gKgotICogbXlGaWxlLnRleHQsICBteUZpbGUudGV4dChjaGFyc2V0KSwgIAotICogbXlVUkwudGV4dCwgIG15VVJMLnRleHQoY2hhcnNldCksCi0gKiBteUlucHV0U3RyZWFtLnRleHQsICBteUlucHV0U3RyZWFtLnRleHQoY2hhcnNldCksCi0gKiBteVJlYWRlci50ZXh0LAotICogbXlCdWZmZXJlZFJlYWRlci50ZXh0LAotICogbXlQcm9jZXNzLnRleHQKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qCi0KLWNsYXNzIFRleHRQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgcHJvcGVydHkgbXlSZWFkZXIKLSAgICBwcm9wZXJ0eSBteUlucHV0U3RyZWFtCi0gICAgcHJvcGVydHkgbXlCaWdFbmRpYW5FbmNvZGVkSW5wdXRTdHJlYW0gICAgCi0gICAgCi0gICAgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgbXlSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKCJkaWdlc3RpdmUiKQotICAgICAgICBteUlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJjaG9jb2xhdGUgY2hpcCIuYnl0ZXMpCi0gICAgICAgIG15QmlnRW5kaWFuRW5jb2RlZElucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJzaG9ydGJyZWFkIi5nZXRCeXRlcygiVVRGLTE2QkUiKSkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0QmlnRW5kaWFuRW5jb2RlZElucHV0U3RyZWFtVGV4dCgpIHsKLSAgICAgICAgYXNzZXJ0ICJzaG9ydGJyZWFkIiA9PSBteUJpZ0VuZGlhbkVuY29kZWRJbnB1dFN0cmVhbS5nZXRUZXh0KCJVVEYtMTZCRSIpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdElucHV0U3RyZWFtVGV4dCgpIHsKLSAgICAgICAgYXNzZXJ0ICJjaG9jb2xhdGUgY2hpcCIgPT0gbXlJbnB1dFN0cmVhbS50ZXh0Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFJlYWRlclRleHQoKSB7Ci0gICAgICAgIGFzc2VydCAiZGlnZXN0aXZlIiA9PSBteVJlYWRlci50ZXh0Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIG15SW5wdXRTdHJlYW0gPSBudWxsCi0gICAgICAgIG15UmVhZGVyID0gbnVsbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Rocm93VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UaHJvd1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxOGU4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1Rocm93VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkFycmF5cwotCi1jbGFzcyBUaHJvd1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0VGhyb3coKSB7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotCSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiYWJjZCIpCi0JICAgICAgICAKLQkgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gYnkgbm93IikKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydCBlLm1lc3NhZ2UgPT0gImFiY2QiCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaW50bG4oIkNhdWdodCBleGNlcHRpb24gJHtlfSIpCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Ub0FycmF5QnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1RvQXJyYXlCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYyNDU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1RvQXJyYXlCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5BcnJheXMKLQotY2xhc3MgVG9BcnJheUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RUb0FycmF5QnVnKCkgewotICAgICAgICAKLSAgICAgICAgYXJyYXkgPSBnZXRBcnJheSgpCi0KLSAgICAgICAgY2FsbEFycmF5TWV0aG9kKGFycmF5KQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZ2V0QXJyYXkoKSB7Ci0gICAgICAgIGxpc3QgPSBbMSwgMiwgMywgNF0KLSAgICAgICAgYXJyYXkgPSBsaXN0LnRvQXJyYXkoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5ICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBhcnJheQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgY2FsbEFycmF5TWV0aG9kKGFycmF5KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGVkIG1ldGhvZCB3aXRoICR7YXJyYXl9IikKLSAgICAgICAgCi0gICAgICAgIGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGxpc3Quc2l6ZSgpID09IDQKLSAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzEsIDIsIDMsIDRdCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVHJpcGxlUXVvdGVkU3RyaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UcmlwbGVRdW90ZWRTdHJpbmdUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MDhhZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UcmlwbGVRdW90ZWRTdHJpbmdUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWNsYXNzIFRyaXBsZVF1b3RlZFN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RUcmlwbGVRdW90ZWRTdHJpbmcoKSB7Ci0gICAgICAgIHMgPSAiIiIKLSAgICAgICAgTG90cyBvZiAndGV4dCcgd2l0aCBhIHZhcmlldHkgb2YgIiJxdW90aW5nICIiIGFuZAotICAgYSBmZXcgbGluZXMKLSAgICBhbmQgc29tZSBlc2NhcGVkIFwiIiIgcXVvdGluZyBhbmQKLSAgICBhbiBlbmRpbmciIiIudHJpbSgpCi0KLSAgICAgICAgcHJpbnRsbihzKQotICAgICAgICBhc3NlcnQgcyAhPSBudWxsCi0gICAgICAgIGlkeCA9IHMuaW5kZXhPZigicXVvdGluZyBhbmQiKQotICAgICAgICBhc3NlcnQgaWR4ID4gMAotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKSB7IAotICAgICAgICBvID0gbmV3IFRyaXBsZVF1b3RlZFN0cmluZ1Rlc3QoKTsKLSAgICAgICAgby50ZXN0VHJpcGxlUXVvdGVkU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVHJ5Q2F0Y2hUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1RyeUNhdGNoVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjJlODAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVHJ5Q2F0Y2hUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLWNsYXNzIFRyeUNhdGNoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3BlcnR5IGV4Y2VwdGlvbkNhbGxlZAotICAgIHByb3BlcnR5IGZpbmFsbHlDYWxsZWQKLQkKLSAgICB2b2lkIHRlc3RUcnlDYXRjaCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZhaWxpbmdNZXRob2QoKQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBvbkV4Y2VwdGlvbihlKQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgb25GaW5hbGx5KCkKLSAgICAgICAgfQotICAgICAgICBhZnRlclRyeUNhdGNoKCkKLSAgICAgICAgYXNzZXJ0IGV4Y2VwdGlvbkNhbGxlZCA6ICJzaG91bGQgaGF2ZSBpbnZva2VkIHRoZSBjYXRjaCBjbGF1c2UiICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZpbmFsbHlDYWxsZWQgOiAic2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgZmluYWxseSBjbGF1c2UiCi0gICAgICAgIHByaW50bG4oIkFmdGVyIHRyeS9jYXRjaCIpCi0gICAgIH0KLQotCi0gICAgIHZvaWQgdGVzdFRyeUZpbmFsbHkoKSB7Ci0gICAgICAgICBCb29sZWFuIHRvdWNoZWQgPSBmYWxzZTsKLSAgICAgICAgIAotICAgICAgICAgdHJ5IHsKLSAgICAgICAgIH0KLSAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlOwotICAgICAgICAgfQotCi0gICAgICAgICBhc3NlcnQgdG91Y2hlZCA6ICJmaW5hbGx5IG5vdCBjYWxsZWQgd2l0aCBlbXB0eSB0cnkiCi0gICAgIH0KLQotCi0KLSAgICAgdm9pZCB0ZXN0V29ya2luZ01ldGhvZCgpIHsKLSAgICAgICAgIC8qKiBAdG9kbyBjYXVzZXMgaW5jb25zaXN0ZW50IHN0YWNrIGhlaWdodAotICAgICAgICAgIGFzc2VydCBleGNlcHRpb25DYWxsZWQgPT0gZmFsc2UgOiAic2hvdWxkIG5vdCBpbnZva2VkIHRoZSBjYXRjaCBjbGF1c2UiICAgICAgICAKLSAgICAgICAgICAqLwotICAgICAgICAgCi0gICAgICAgICB0cnkgewotCSAgICAJIHdvcmtpbmdNZXRob2QoKQotCSAgICAgfQotCSAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLQkJICAgICBvbkV4Y2VwdGlvbihlKQotCSAgICAgfQotCSAgICAgZmluYWxseSB7Ci0JCSAgICAgb25GaW5hbGx5KCkKLQkgICAgIH0KLQkgICAgIGFzc2VydCBleGNlcHRpb25DYWxsZWQgPT0gZmFsc2UgOiAic2hvdWxkIG5vdCBpbnZva2VkIHRoZSBjYXRjaCBjbGF1c2UiICAgICAgICAKLQkgICAgIGFzc2VydCBmaW5hbGx5Q2FsbGVkIDogInNob3VsZCBoYXZlIGludm9rZWQgdGhlIGZpbmFsbHkgY2xhdXNlIgotCSAgICAgcHJpbnRsbigiQWZ0ZXIgdHJ5L2NhdGNoIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBmYWlsaW5nTWV0aG9kKCkgewotICAgICAgICBhc3NlcnQgZmFsc2UgOiAiRmFpbGluZyBvbiBwdXJwb3NlIgotCX0KLQkKLSAgICB2b2lkIHdvcmtpbmdNZXRob2QoKSB7Ci0gICAgICAgIGFzc2VydCB0cnVlIDogIlNob3VsZCBuZXZlciBmYWlsIgotICAgIH0KLSAgICAKLSAgICB2b2lkIG9uRXhjZXB0aW9uKGUpIHsKLQkgICAgYXNzZXJ0IGUgIT0gbnVsbAotCSAgICBleGNlcHRpb25DYWxsZWQgPSB0cnVlCi0JfQotCQotICAgIHZvaWQgb25GaW5hbGx5KCkgewotICAgICAgICBmaW5hbGx5Q2FsbGVkID0gdHJ1ZQotCX0KLQotICAgIHZvaWQgYWZ0ZXJUcnlDYXRjaCgpIHsKLSAgICAgICAgYXNzZXJ0IGV4Y2VwdGlvbkNhbGxlZCA6ICJzaG91bGQgaGF2ZSBpbnZva2VkIHRoZSBjYXRjaCBjbGF1c2UiICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZpbmFsbHlDYWxsZWQgOiAic2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgZmluYWxseSBjbGF1c2UiCi0gICAgICAgIHByaW50bG4oIkFmdGVyIHRyeS9jYXRjaCIpCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotICAgICAgICBleGNlcHRpb25DYWxsZWQgPSBmYWxzZQotICAgICAgICBmaW5hbGx5Q2FsbGVkID0gZmFsc2UKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UeXBlc2FmZU1ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVHlwZXNhZmVNZXRob2RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViZDBhOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9UeXBlc2FmZU1ldGhvZFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotY2xhc3MgVHlwZXNhZmVNZXRob2RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0VHlwZXNhZmVNZXRob2QoKSB7Ci0gICAgICAgIHkgPSBzb21lTWV0aG9kKDEpCi0KLSAgICAgICAgYXNzZXJ0IHkgPT0gMgotICAgIH0KLQotICAgIEludGVnZXIgc29tZU1ldGhvZChJbnRlZ2VyIGkpIHsKLSAgICAgICAgcmV0dXJuIGkgKyAxCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVW5hcnlNaW51c1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVW5hcnlNaW51c1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEyOWI0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1VuYXJ5TWludXNUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0Ci0KLWNsYXNzIFVuYXJ5TWludXNUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgdm9pZCB0ZXN0VW5hcnlNaW51cygpIHsKLSAgICAgICAgdmFsdWUgPSAtMQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IC0xCi0gICAgICAgIAotICAgICAgICB4ID0gdmFsdWUgKyAyCi0gICAgICAgIGFzc2VydCB4ID09IDEKLSAgICAgICAgCi0gICAgICAgIHkgPSAtdmFsdWUKLSAgICAgICAgYXNzZXJ0IHkgPT0gMQotCX0gICAKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIGEgPSAxCi0gICAgICAgIGIgPSAtYQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGIgPT0gLTEKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U2hlbGxCdWcoKSB7Ci0gICAgICAgIGFzc2VydFNjcmlwdCgiCi1hID0gMQotYiA9IC1hCi1hc3NlcnQgYiA9PSAtMSAgICAgICAgICAgIAotIikKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVW5pdFRlc3RBc1NjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Vbml0VGVzdEFzU2NyaXB0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwZjkzYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9Vbml0VGVzdEFzU2NyaXB0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYSA9IDEyMwotYSAqPSAyCi1wcmludGxuICJSdW5uaW5nIHVuaXQgdGVzdCB3aXRoIGEgPSAke2F9IgotYXNzZXJ0IGEgPT0gMjQ2CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9VbnNhZmVOYXZpZ2F0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9VbnNhZmVOYXZpZ2F0aW9uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjAxZjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvVW5zYWZlTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotY2xhc3MgVW5zYWZlTmF2aWdhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RVbnNhZmVQcm9wZXJ0eU5hdmlnYXRpb25zKCkgewotICAgICAgICB4ID0gbnVsbAotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLQkgICAgICAgIHkgPSB4LmZvbwotCSAgICAgICAgZmFpbCgic2hvdWxkIGZhaWwiKQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnQgZSAhPSBudWxsCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9WZXJiYXRpbUdTdHJpbmdUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ZlcmJhdGltR1N0cmluZ1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjFkZDIwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L1ZlcmJhdGltR1N0cmluZ1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotY2xhc3MgVmVyYmF0aW1HU3RyaW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFdpdGhPbmVWYXJpYWJsZSgpIHsKLSAgICAgICAgCi0gICAgICAgIG5hbWUgPSA8PDxFT0YKLUJvYgotRU9GCi0gICAgICAgIAotICAgICAgICB0ZW1wbGF0ZSA9IDw8PEVPRgotaGVsbG8gJHtuYW1lfSBob3cgYXJlIHlvdT8KLUVPRgotCQkJCQotCQlhc3NlcnQgdGVtcGxhdGUgaW5zdGFuY2VvZiBHU3RyaW5nCi0JCQkJCQkJCQkJCSAKLQkgCWNvdW50ID0gdGVtcGxhdGUuZ2V0VmFsdWVDb3VudCgpCi0JCWFzc2VydCBjb3VudCA9PSAxCi0JCWFzc2VydCB0ZW1wbGF0ZS5nZXRWYWx1ZSgwKSA9PSAiQm9iIgotCQkJCQkJCQkJCQkgCi0JCXN0cmluZyA9IHRlbXBsYXRlLnRvU3RyaW5nKCkKLQkJYXNzZXJ0IHN0cmluZyA9PSAiaGVsbG8gQm9iIGhvdyBhcmUgeW91PyIKLQl9Ci0gICAgCi0gICAgdm9pZCB0ZXN0V2l0aFZhcmlhYmxlQXRFbmQoKSB7Ci0gICAgICAgIG5hbWUgPSA8PDxFT1MKLUJvYgotRU9TCi0gICAgICAgIHRlbXBsYXRlID0gPDw8RU9TCi1oZWxsbyAke25hbWV9Ci1FT1MKLQotICAgICAgICBzdHJpbmcgPSB0ZW1wbGF0ZS50b1N0cmluZygpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgc3RyaW5nID09ICJoZWxsbyBCb2IiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFdpdGhWYXJpYWJsZUF0QmVnaW5uaW5nKCkgewotICAgICAgICBuYW1lID0gPDw8RU9TCi1Cb2IKLUVPUwotCi0gICAgICAgIHRlbXBsYXRlID0gPDw8RU9TCi0ke25hbWV9IGhleSwKLWhlbGxvCi1FT1MKLSAgICAgICAgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZpeEVPTHMoc3RyaW5nKSA9PSAiQm9iIGhleSxcbmhlbGxvIgotICAgIH0KLQotICAgIHZvaWQgdGVzdFdpdGhKdXN0VmFyaWFibGUoKSB7Ci0gICAgICAgIG5hbWUgPSA8PDxFT1MKLUJvYgotRU9TCi0KLSAgICAgICAgdGVtcGxhdGUgPSA8PDxFT1MKLSR7bmFtZX0KLUVPUwotICAgICAgICBzdHJpbmcgPSB0ZW1wbGF0ZS50b1N0cmluZygpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgc3RyaW5nID09ICJCb2IiCi0gICAgfQotCi0Jdm9pZCB0ZXN0SW50ZXJlc3RpbmdDYXNlcygpIHsKLQkJbmFtZSA9IDw8PEVPU0VPU0VPUwotQm9iCi1FT1MKLUVPU0VPU0VPCi1FT1NFT1NFT1MKLQotCQlhc3NlcnQgZml4RU9McyhuYW1lKSA9PSAiQm9iXG5FT1NcbkVPU0VPU0VPIgotCQkKLQkJcGVybCA9IDw8PF9fRU5EX18KLVNhbQotX19FTkRfXwotCi0JCWFzc2VydCBwZXJsID09ICJTYW0iCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvV2hpbGVMb29wVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9XaGlsZUxvb3BUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2OGUyMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9XaGlsZUxvb3BUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLWNsYXNzIFdoaWxlTG9vcFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQl2b2lkIHRlc3RWZXJ5U2ltcGxlV2hpbGUoKSB7Ci0JICAgIHZhbCA9IGRvV2hpbGVNZXRob2QoMCwgNSkKLSAgICAgICAgcHJpbnRsbih2YWwpCi0JfQotCQotCXZvaWQgdGVzdE1vcmVDb21wbGV4V2hpbGUoKSB7Ci0JICAgIHggPSAwCi0JICAgIHkgPSA1Ci0KLQkgICAgd2hpbGUgKCB5ID4gMCApIHsKLQkgICAgICAgIHggPSB4ICsgMQotCSAgICAgICAgeSA9IHkgLSAxCi0JICAgIH0KLQotCSAgICBhc3NlcnQgeCA9PSA1Ci0JfQotCi0Jdm9pZCB0ZXN0RG9XaGlsZVdoaWxlKCkgewotCSAgICB4ID0gMAotCSAgICB5ID0gNQotCi0JICAgIGRvIHsKLQkgICAgICAgIHggPSB4ICsgMQotCSAgICAgICAgeSA9IHkgLSAxCi0JICAgIH0gCi0JICAgIHdoaWxlICggeSA+IDAgKQotCi0JICAgIGFzc2VydCB4ID09IDUKLQl9Ci0KLQlkb1doaWxlTWV0aG9kKHgsIG0pIHsKLSAgICAgICAgd2hpbGUgKCB4IDwgbSApIHsKLSAgICAgICAgICAgIHggPSBpbmNyZW1lbnQoeCkKLSAgICAgICAgfQotCi0JCXJldHVybiB4Ci0gICAgfQotCQotCWluY3JlbWVudCh4KSB7Ci0JICAgIHggKyAxCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9jcmVhdGVMb29wLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvY3JlYXRlTG9vcC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTU3MjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9jcmVhdGVMb29wLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAoteyBuIHwgCi0gIGZvciAoaSBpbiAxLi5uKXsKLSAgICB4ID0gbmV3IE9iamVjdCgpCi0gIH0KLX0uY2FsbCgzMDAwMCkKLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9sb29wLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvbG9vcC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmQ4NmIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9sb29wLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ci0KLWNsYXNzIExvb3AgewotICBwcm9wZXJ0eSBhcnJheSA9IG5ldyBBcnJheUxpc3QoKQotICBwcm9wZXJ0eSBwb3MgPSAwCi0KLSAgdm9pZCBwdXNoKG9iail7Ci0gICAgIGFycmF5W3Bvc10gPSBvYmoKLSAgICAgcG9zID0gcG9zICsgMQotICB9Ci0gIE9iamVjdCBwb3AoKXsKLSAgICAgcG9zID0gcG9zIC0gMQotICAgICByZXR1cm4gYXJyYXlbcG9zXQotICB9Ci0KLSAgc3RhdGljIHZvaWQgbWFpbihhcmdzKXsKLSAgICAgcyA9IG5ldyBMb29wKCkKLSAgICAgZm9yIChpIGluIDEuLjEwMDAwMDApewotICAgICAgIHMucHVzaChpKQotICAgICB9Ci0gICAgIGZvciAoaSBpbiAxLi4xMDAwMDAwKXsKLSAgICAgICBzLnBvcCgpCi0gICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9iZW5jaG1hcmtzL2xvb3AyLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvbG9vcDIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTFmZmVkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvbG9vcDIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3QKLQotY2xhc3MgTG9vcDIgewotICBwcml2YXRlIGFycmF5ID0gbmV3IEFycmF5TGlzdCgpCi0gIHByaXZhdGUgcG9zID0gMAotCi0gIHZvaWQgcHVzaChvYmopewotICAgICBhcnJheVtwb3NdID0gb2JqCi0gICAgIHBvcyA9IHBvcyArIDEKLSAgfQotICBPYmplY3QgcG9wKCl7Ci0gICAgIHBvcyA9IHBvcyAtIDEKLSAgICAgcmV0dXJuIGFycmF5W3Bvc10KLSAgfQotCi0gIHN0YXRpYyB2b2lkIG1haW4oYXJncyl7Ci0gICAgICBwcmludGxuICJTdGFydGluZyB0aGUgTG9vcDIgdGVzdCIKLSAgICAgIAotICAgICBzID0gbmV3IExvb3AyKCkKLSAgICAgZm9yIChpIGluIDEuLjEwMDAwMDApewotICAgICAgIHMucHVzaChpKQotICAgICB9Ci0gICAgIGZvciAoaSBpbiAxLi4xMDAwMDAwKXsKLSAgICAgICBzLnBvcCgpCi0gICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0FycmF5TWV0aG9kQ2FsbEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0FycmF5TWV0aG9kQ2FsbEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjA2MWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9BcnJheU1ldGhvZENhbGxCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuYnVncwotCi1jbGFzcyBBcnJheU1ldGhvZENhbGxCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICB2b2lkIHRlc3RNZXRob2RDYWxsaW5nV2l0aEFycmF5QnVnKCkgewotICAgICAgICBhcnJheSA9IGdldE1vY2tBcmd1bWVudHMoKQotICAgICAgICAKLSAgICAgICAgZHVtbXlNZXRob2QoYXJyYXkpCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBkdW1teU1ldGhvZChhcnJheSkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Fzc2lnbm1lbnRJbnNpZGVFeHByZXNzaW9uQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXNzaWdubWVudEluc2lkZUV4cHJlc3Npb25CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUyNmYyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXNzaWdubWVudEluc2lkZUV4cHJlc3Npb25CdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEFzc2lnbm1lbnRJbnNpZGVFeHByZXNzaW9uQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgaWYgKCh4ID0gc29tZU1ldGhvZCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludGxuIHgKLSAgICAgICAgfQotICAgICAgICBpZiAoKHkgPSBnZXRGb28oKSkgPiA1KSB7Ci0gICAgICAgICAgICBwcmludGxuICJ5IGlzIGdyZWF0ZXIgdGhhbiA1IgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiogQHRvZG8gdW5jb21tZW50IHdoZW4gdGhlIHBhcnNlciBhbGxvd3MgdGhpcwotICAgICAgICBhID0gYiA9IDEyMwotICAgICAgICBhc3NlcnQgYSA9PSAxMjMKLSAgICAgICAgYXNzZXJ0IGIgPT0gMTIzCi0gICAgICAgICovCi0gICAgfQotCi0gICAgc29tZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuICJ3b3JrZWQhIgotICAgIH0KLSAgICAKLSAgICBnZXRGb28oKSB7Ci0gICAgICAgIHJldHVybiA3Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXV0b2JveGluZ09mQ29tcGFyaXNvbnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9BdXRvYm94aW5nT2ZDb21wYXJpc29uc0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDJlMjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9BdXRvYm94aW5nT2ZDb21wYXJpc29uc0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1jbGFzcyBBdXRvYm94aW5nT2ZDb21wYXJpc29uc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHkgPSB0cnVlCi0gICAgICAgIHggPSB5ID09IHRydWUKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB4Ci0gICAgICAgIAotICAgICAgICBwcmludGxuKHkgPT0gdHJ1ZSkKLSAgICAgICAgcHJpbnRsbih5ICE9IGZhbHNlKQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0JhZFNjcmlwdE5hbWVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CYWRTY3JpcHROYW1lQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2NTY3ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0JhZFNjcmlwdE5hbWVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIFNlcmdleSBVZG92ZW5rbyAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQmFkU2NyaXB0TmFtZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7IAotCQljbC5wYXJzZUNsYXNzKCJwcmludGxuICdvb3BzISciLCAiL3NjcmlwdC5ncm9vdnkiKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CZW5jaG1hcmtCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CZW5jaG1hcmtCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0MDg4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmVuY2htYXJrQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQSBsaXR0bGUgcGVyZm9ybWFuY2UgdGVzdAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBCZW5jaG1hcmtCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0UGVyZm9ybWFuY2UoKSB7Ci0JCXN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKLQkJCi0JCXRvdGFsID0gMAotCQlzaXplID0gMTAwMDAKLQkJZm9yIChpIGluIDAuLnNpemUpIHsKLQkJICAgIHRvdGFsID0gdG90YWwgKyBjYWxsU29tZU1ldGhvZCgiaGVsbG8iLCB0b3RhbCkKLQkJfSAKLQkJCi0JCWVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCi0JCQotCQl0aW1lID0gZW5kIC0gc3RhcnQKLQkJCi0JCXByaW50bG4gIlBlcmZvcm1lZCAke3NpemV9IGl0ZXJhdGlvbnMgaW4gJHt0aW1lIC8gMTAwMH0gc2Vjb25kcyB3aGljaCBpcyAke3RpbWUgLyBzaXplfSBtcyBwZXIgaXRlcmF0aW9uIgotCQkKLQkJYXNzZXJ0IHRvdGFsID09IHNpemUgKiAxMCArIDEwCi0gICAgfQotICAgIAotICAgIGNhbGxTb21lTWV0aG9kKHRleHQsIHRvdGFsKSB7Ci0gICAgICAgIHJldHVybiAxMAotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Jsb2NrQXNDbG9zdXJlQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmxvY2tBc0Nsb3N1cmVCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI3ZTFhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmxvY2tBc0Nsb3N1cmVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJsb2NrQXNDbG9zdXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBjID0gMCAKLSAgICAgICAgCi0gICAgICAgIGJsb2NrOiB7IAotICAgICAgICAgICAgYyA9IDkgCi0gICAgICAgIH0gCi0KLSAgICAgICAgcHJpbnRsbihjKSAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjID09IDkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3RhdGljQnVnKCkgewotICAgICAgICBtYWluKG51bGwpCQkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Tm9uVm9pZE1ldGhvZCgpIHsKLSAgICAgICAgZm9vKCkJCQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLSAgICAgICAgYyA9IDAgCi0gICAgICAgIAotICAgICAgICBibG9jazogewotICAgICAgICAgICAgYyA9IDkgCi0gICAgICAgIH0KLQotICAgICAgICBwcmludGxuKGMpIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGMgPT0gOQotICAgIH0KLSAgICAKLSAgICBmb28oKSB7Ci0gICAgICAgIGMgPSAwIAotICAgICAgICAKLSAgICAgICAgYmxvY2s6IHsgCi0gICAgICAgICAgICBjID0gOSAKLSAgICAgICAgfSAKLSAgICAgICAgcHJpbnRsbihjKSAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjID09IDkKLSAgICAgICAgcmV0dXJuIDUKLSAgICB9Ci0gICB9CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Jvb2xlYW5CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Cb29sZWFuQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxZjdmMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Jvb2xlYW5CdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJvb2xlYW5CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICB4ID0gbmV3IEJvb2xlYW5CZWFuKG5hbWU6J0phbWVzJywgZm9vOnRydWUpCi0gICAgICAgIHkgPSBuZXcgQm9vbGVhbkJlYW4obmFtZTonQm9iJywgZm9vOmZhbHNlKQotCi0gICAgICAgIGFzc2VydCB4LmZvbwotICAgICAgICBhc3NlcnQgISB5LmZvbwotICAgICAgICB5LmZvbyA9IHRydWUKLSAgICAgICAgYXNzZXJ0IHkuZm9vCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJ1ZzIoKSB7Ci0gICAgICAgIEJvb2xlYW5CZWFuIGJlYW4gPSBuZXcgQm9vbGVhbkJlYW4obmFtZTonR3JvbWl0JywgZm9vOmZhbHNlKQotICAgICAgICB2YWx1ZSA9IGlzQXBwbGljYWJsZVRvKGJlYW4pCi0gICAgICAgIGFzc2VydCB2YWx1ZQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhCb29sZWFuQmVhbiBmaWVsZCkgewotICAgICAgICByZXR1cm4gIWZpZWxkLmlzRm9vKCk7Ci0gICAgfQotCi19Ci0KLWNsYXNzIEJvb2xlYW5CZWFuIHsKLSAgICBTdHJpbmcgbmFtZQotICAgIGJvb2xlYW4gZm9vCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlSW5kZXhCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlSW5kZXhCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA1ZDY0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZUluZGV4QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKgotICogQGF1dGhvciBSb2JlcnQgRnVsbGVyIAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBCeXRlSW5kZXhCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8PDxGT09cbiIpCi0JCWZvciAoaiBpbiAwLi4xMjcpeyAvLyAxMjYgaXMgb2theS4KLQkJCXNiLmFwcGVuZCgnJCcpLmFwcGVuZCgie3h9IikKLQkJfQotCQlzYi5hcHBlbmQoIlxuRk9PXG4iKQotCQkKLQkJYiA9IG5ldyBCaW5kaW5nKHg6bnVsbCkKLQkJCi0JCW5ldyBHcm9vdnlTaGVsbChiKS5ldmFsdWF0ZShzYi50b1N0cmluZygpLCJmb28iKQotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUyQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUyQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5OTBlYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlMkJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQnl0ZWNvZGUyQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgSW50ZWdlciBjb3VudCA9IDAKLSAgICAKLSAgICB2b2lkIHRlc3RCeXRlY29kZUJ1ZygpIHsKLQkJZ2V0Q29sbGVjdGlvbigpLmVhY2ggeyBjb3VudCArPSBpdCB9ICAgICAgIAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUZWRzQnl0ZWNvZGVCdWcoKSB7Ci0gICAgICAgIC8vZG9UZXN0KGdldENvbGxlY3Rpb24oKSkKLSAgICAgICAgYSA9IFsxLCAyLCAzLCA0XQotICAgICAgICBkb1Rlc3QoYSkKLQotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvVGVzdChhcmdzKSB7Ci0gICAgICAgIG0gPSBbOl0KLSAgICAgICAgaSA9IDEKLSAgICAgICAgYXJncy5lYWNoIHsgbS5wdXQoaXQsIGkrKykgfSAgICAgCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbVsxXSA9PSAxCi0gICAgICAgIGFzc2VydCBtWzJdID09IDIKLSAgICAgICAgYXNzZXJ0IG1bM10gPT0gMwotICAgICAgICBhc3NlcnQgbVs0XSA9PSA0Ci0gICAgICAgIAotICAgICAgICBwcmludGxuKCJjcmVhdGVkOiAke219IikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBpID09IDUKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgdm9pZCB0ZXN0VGVkc0J5dGVjb2RlMkJ1ZygpIHsKLSAgICAgICAgbSA9IFs6XQotICAgICAgICBpID0gMQotICAgICAgICBnZXRDb2xsZWN0aW9uKCkuZWFjaCB7IG0ucHV0KGl0LCBpKyspIH0gICAgIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IG1bMV0gPT0gMQotICAgICAgICBhc3NlcnQgbVsyXSA9PSAyCi0gICAgICAgIGFzc2VydCBtWzNdID09IDMKLSAgICAgICAgYXNzZXJ0IG1bNF0gPT0gNAotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiY3JlYXRlZDogJHttfSIpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgaSA9PSA1Ci0gICAgfQotICAgIAotICAgIGdldENvbGxlY3Rpb24oKSB7Ci0gICAgICAgIFsxLCAyLCAzLCA0XQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlM0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlM0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDZmZjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTNCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJ5dGVjb2RlM0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICBjb3VudAotICAgICAgICAgCi0gICAgdm9pZCB0ZXN0SW5jcmVtZW50UHJvcGVydHlJbmNsb3N1cmUoKSB7Ci0gICAgICAgIGFyZ3MgPSBbMSwgMiwgM10KLSAgICAgICAgbSA9IFs6XQotICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgZG9Mb29wKGFyZ3MsIG0pCi0gICAJCWFzc2VydCBjb3VudCA9PSAzCi0gICAgfQotICAgIAotICAgIHZvaWQgZG9Mb29wKGFyZ3MsIG0pIHsKLSAgICAgICAgYXJncy5lYWNoIHsgCi0gICAgICAgICAgICBtLnB1dChpdCwgY291bnQrKykKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzE3OWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTRCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJ5dGVjb2RlNEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIGNvdW50ID0gMAotICAgICAKLSAgICB2b2lkIHRlc3RJbmplY3QoKSB7Ci0gICAgICAgIHggPSBbMSwgMiwgM10uaW5qZWN0KDApIHsgYywgcyB8IGMgKz0gcyB9Ci0gICAgICAgIGFzc2VydCB4ID09IDYKLSAgICB9Ci0gICAgIAotICAgIHZvaWQgdGVzdFVzaW5nUHJvcGVydHkoKSB7Ci0gICAgICAgIGNvdW50ID0gMAotICAgICAgICBnZXRDb2xsZWN0aW9uKCkuZWFjaCB7IGNvdW50ICs9IGl0IH0gICAgICAgCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxMAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RVc2luZ0luY3JlbWVudGluZ1Byb3BlcnR5KCkgewotICAgICAgICBjb3VudCA9IDAKLSAgICAgICAgZ2V0Q29sbGVjdGlvbigpLmVhY2ggeyBjb3VudCsrIH0gICAgICAgCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSA0Ci0gICAgfQotICAgIAotICAgIGdldENvbGxlY3Rpb24oKSB7Ci0gICAgICAgIFsxLCAyLCAzLCA0XQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNUJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMmYzMzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJ5dGVjb2RlNUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFVzaW5nTG9jYWxWYXIoKSB7Ci0gICAgICAgIGMgPSAwCi0gICAgICAgIGdldENvbGxlY3Rpb24oKS5lYWNoIHsgYyArPSBpdCB9ICAgICAgIAotICAgICAgICBhc3NlcnQgYyA9PSAxMAotICAgIH0KLSAgICAKLSAgICBnZXRDb2xsZWN0aW9uKCkgewotICAgICAgICBbMSwgMiwgMywgNF0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTZCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTZCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYxYjJlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGU2QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBCeXRlY29kZTZCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RQb3N0Rml4UmV0dXJuKCkgewotICAgICAgICBpID0gMQotICAgICAgICBjbG9zdXJlID0geyBpKysgfQotICAgICAgICB2YWx1ZSA9IGNsb3N1cmUoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDEKLSAgICAgICAgYXNzZXJ0IGkgPT0gMgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RQcmVGaXhSZXR1cm4oKSB7Ci0gICAgICAgIGkgPSAxCi0gICAgICAgIGNsb3N1cmUgPSB7IHJldHVybiArK2kgfQotICAgICAgICB2YWx1ZSA9IGNsb3N1cmUoKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDIKLSAgICAgICAgYXNzZXJ0IGkgPT0gMgotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlN0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlN0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOWI5ZTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTdCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEJ5dGVjb2RlN0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdER1cGxpY2F0ZVZhcmlhYmxlcygpIHsKLQkJaWYgKHRydWUpIHsKLQkJCWEgPSAxMjMKLQkJfQotCQlpZiAodHJ1ZSkgewotCQkJYSA9IDQ1NgotCQl9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0RHVwbGljYXRlVmFyaWFibGVzSW5DbG9zdXJlcygpIHsKLSAgICAJCWNvbGwgPSBbMV0KLSAgICAJCQotCQljb2xsLmVhY2ggewotCQkJYSA9IDEyMwotCQl9Ci0JCWNvbGwuZWFjaCB7Ci0JCQlhID0gNDU2Ci0JCX0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkMDkzNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBCeXRlY29kZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAgCi0gICAgdm9pZCB0ZXN0VGVkc0J5dGVjb2RlQnVnKCkgewotICAgICAgICAvL2EgPSBbJ3RvbScsJ2RpY2snLCdoYXJyeSddCi0gICAgICAgIGEgPSBbMSwgMiwgMywgNF0KLSAgICAgICAgZG9UZXN0KGEpCi0gICAgfQotICAgIAotICAgIHZvaWQgZG9UZXN0KGFyZ3MpIHsKLSAgICAgICAgbSA9IFs6XQotICAgICAgICBpID0gMQotICAgICAgICBhcmdzLmVhY2ggeyAKLSAgICAgICAgICAgIHRhbGsoaXQpCi0gICAgICAgICAgICBtLnB1dChpdCwgaSsrKQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBpID09IDUKLSAgICAgICAgbS5lYWNoIHsKLSAgICAgICAgICAgIHByaW50bG4oaXQpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdGFsayhhKSB7Ci0gICAgICAgIHByaW50bG4oImhlbGxvICIrYSkKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYWxsaW5nQ2xvc3VyZXNXaXRoQ2xvc3VyZXNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYWxsaW5nQ2xvc3VyZXNXaXRoQ2xvc3VyZXNCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgxN2Q2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2FsbGluZ0Nsb3N1cmVzV2l0aENsb3N1cmVzQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDYWxsaW5nQ2xvc3VyZXNXaXRoQ2xvc3VyZXNCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIGEgPSB7MX0KLSAgICAgICAgLy8gb2xkIHdvcmthcm91bmQKLSAgICAgICAgLy9iID0ge2EuY2FsbCgpfQotICAgICAgICBiID0ge2EoKX0KLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gYigpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nhc3RXaGVuVXNpbmdDbG9zdXJlc0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nhc3RXaGVuVXNpbmdDbG9zdXJlc0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGQ0OGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYXN0V2hlblVzaW5nQ2xvc3VyZXNCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENhc3RXaGVuVXNpbmdDbG9zdXJlc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgYSA9IDEKLSAgICAgICAgWzFdLmVhY2ggeyBhID0gaXQgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NocmlzdG9mc1Byb3BlcnR5QnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2hyaXN0b2ZzUHJvcGVydHlCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM5NjA3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2hyaXN0b2ZzUHJvcGVydHlCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENocmlzdG9mc1Byb3BlcnR5QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgICAKLSAgICB2b2lkIHRlc3RDaHJpc3RvZnNQcm9wZXJ0eUJ1ZygpIHsKLSAgICAJdGhpcy5taXhlZENhc2VQcm9wZXJ0eSA9ICJ0ZXN0IgotICAgIAlzaG91bGRGYWlsKHt0aGlzLm1peGVkY2FzZXByb3BlcnR5ID0gInRlc3QifSkKLSAgICB9Ci0gICAgCi0gICAgbWl4ZWRDYXNlUHJvcGVydHkKLQkKLSAgICBnZXRNaXhlZENhc2VQcm9wZXJ0eSgpICAgIHsgbWl4ZWRDYXNlUHJvcGVydHkgfQotICAgIHNldE1peGVkQ2FzZVByb3BlcnR5KHZhbCkgeyB0aGlzLm1peGVkQ2FzZVByb3BlcnR5ID0gdmFsIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzR2VuZXJhdG9yRml4ZXNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NHZW5lcmF0b3JGaXhlc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTRiYzAzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NHZW5lcmF0b3JGaXhlc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuYnVncwotCi0KLWNsYXNzIENsYXNzR2VuZXJhdG9yRml4ZXNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIHBmKGludCBwKSB7Ci0gICAgICAgIGludCBpID0gcAotICAgICAgICBib29sZWFuIGIgPSB0cnVlCi0gICAgfQotCi0Jdm9pZCB0ZXN0UHJpbWl0dmVzSW5GdW5jKCkgeyAvLyBncm9vdnktMzczLCA0NTMsIDM4NSwgNDUxLCAxOTkKLQkJcGYoMTApCi0JfQotCi0gICAgY291bnQgPSAwOwotCi0gICAgdm9pZCB0ZXN0UGx1c0VxdWFsKCkgeyAvLyAzNzIKLSAgICAgICAgY291bnQgKz0gMQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMQotCi0gICAgICAgIGZvbyA9Ci0gICAgICAgICAgICB7aXwKLSAgICAgICAgICAgICAgICB7anwKLSAgICAgICAgICAgICAgICAgICAgaSArPSBqCi0gICAgICAgICAgICAgICAgICAgIGkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHggPSBmb28oMSkKLSAgICAgICAgeCg1KQotICAgICAgICBmb28oMykKLSAgICAgICAgcHJpbnRsbiB4KDIuMykKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RJZkFuZFN3aXRjaEluQ2xvc3VyZSAoKXsgLy8gMzIxLCAzMjQsIDQxMgotCi0gICAgICAgIGEgPSAxCi0gICAgICAgIDEudGltZXMgewotICAgICAgICAgICAgaWYgKGEgPT0xKSB7Ci0gICAgICAgICAgICAgICAgYSA9IDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG5vbmVZZXQ9dHJ1ZTsKLSAgICAgICAgWyJhIiwiYiIsImMiLCJkIl0uZWFjaCB7IGMgfAotICAgICAgICAgIGlmIChub25lWWV0KSB7Ci0gICAgICAgICAgICBub25lWWV0PWZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludCgiID4gIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByaW50KCBjICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhID0gMQotICAgICAgICBzd2l0Y2ggKGEpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgYSA9IDI7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJldHVyblZvaWQoKSB7Ci0gICAgICAgIHJldHVybgotICAgIH0KLSAgICB2b2lkIHRlc3RSZXR1cm5Wb2lkKCkgeyAvLyBncm9vdnktNDA1LCAzODcKLSAgICAgICAgcmV0dXJuVm9pZCgpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJvb2xlYW5WYWx1ZSgpIHsgLy8gZ3Jvb3Z5LTM4NQotICAgIAkJLyoqIEB0b2RvCi0gICAgCQlib29sZWFuIHZhbHVlCi0gICAgCQkqLwotICAgIAl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbGFzc0luTmFtZWRQYXJhbXNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbGFzc0luTmFtZWRQYXJhbXNCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlmNmYwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NJbk5hbWVkUGFyYW1zQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuTWFwCi0KLWNsYXNzIENsYXNzSW5OYW1lZFBhcmFtc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIGZvbyA9IG1ldGhvZChjbGFzczonY2hlZXNlJywgbmFtZTonY2hlZGRhcicpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vLm5hbWUgPT0gImNoZWRkYXIiCi0gICAgICAgIGFzc2VydCBmb28uY2xhc3MgPT0gImNoZWVzZSIKLSAgICAgICAgCi0gICAgICAgIGZvbyA9IG1ldGhvZChuYW1lOidjaGVkZGFyJywgY2xhc3M6J2NoZWVzZScpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vLm5hbWUgPT0gImNoZWRkYXIiCi0gICAgICAgIGFzc2VydCBmb28uY2xhc3MgPT0gImNoZWVzZSIKLSAgICB9Ci0gICAgCi0gICAgbWV0aG9kKE1hcCBkYXRhKSB7Ci0gICAgICAgIGRhdGEKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbGFzc0luU2NyaXB0QnVnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzSW5TY3JpcHRCdWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyNzY0MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzSW5TY3JpcHRCdWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0luU2NyaXB0QnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTY3JpcHQoICJjbGFzcyBYIHt9XG54ID0gbmV3IFgoKVxucHJpbnRsbih4KSIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVJbkNsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlSW5DbG9zdXJlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmYWM5NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVJbkNsb3N1cmVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqCi0gKiBCdWcgaWxsdXN0cmF0aW5nIHRoZSBuZXN0ZWQgY2xvc3VyZXMgdmFyaWFibGUgc2NvcGUgdmlzaWJpbGl0eSBpc3N1ZS4KLSAqIGwuZWFjaCBpcyBDbG9zdXJlSW5DbG9zdXJlQnVnJDEgYW5kIGl0LmVhY2ggaXMgQ2xvc3VyZUluQ2xvc3VyZUJ1ZyQyCi0gKiBUaGUgdmFyaWFibGUgdGV4dCBpcyBub3QgdmlzaWJsZSBmcm9tIENsb3N1cmVJbkNsb3N1cmVCdWckMi4KLSAqIEluZGVlZCwgYSBjbG9zdXJlIGNhbiBvbmx5IHNlZSB0aGUgdmFyaWFibGUgZGVmaW5lZCBvdXRzaWRlIHRoaXMgY2xvc3VyZSAob25lIGxldmVsIHVwKQotICogYnV0IGNhbm5vdCBzZWUgd2hhdCdzIGluIHRoZSBzZWNvbmQgbGV2ZWwuCi0gKgotICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgdGVzdCB3b3JrLCBkbyBub3QgZm9yZ2V0IHRvIHVuY29tbWVudCB0aGUgbGluZSAicHJpbnRsbih0ZXh0KSIKLSAqCi0gKiBAYXV0aG91ciBHdWlsbGF1bWUgTGFmb3JnZQotICovCi1jbGFzcyBDbG9zdXJlSW5DbG9zdXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKLXsKLQl2b2lkIHRlc3RJbnZpc2libGVWYXJpYWJsZSgpCi0JewotCQl0ZXh0ID0gInRlc3QgIgotCi0JCWwgPSBbMS4uMTEsIDIuLjEyLCAzLi4xMywgNC4uMTRdCi0KLQkJbC5lYWNoewotCQkJLy9wcmludGxuKHRleHQpCi0JCQlpdC5lYWNoewotCQkJCXByaW50bG4odGV4dCkKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIG1haW4oYXJncykKLQl7Ci0JCWJ1ZyA9IG5ldyBDbG9zdXJlSW5DbG9zdXJlQnVnKCkKLQkJYnVnLnRlc3RJbnZpc2libGVWYXJpYWJsZSgpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVBhcmFtZXRlclBhc3NpbmdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlUGFyYW1ldGVyUGFzc2luZ0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWZlYjIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlUGFyYW1ldGVyUGFzc2luZ0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydAotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgQ2xvc3VyZVBhcmFtZXRlclBhc3NpbmdCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnSW5NZXRob2QoKSB7Ci0JCWMgPSB7IHggfCAKLQkJCXkgPSAxMjMKLQkJCWMxID0geyAKLQkJCQlwcmludGxuIHkKLQkJCQlwcmludGxuIHgKLQkJCQlwcmludGxuIHhbMF0gCi0JCQl9IAotCQkJCi0JCQljMSgpIAotCQl9IAotCi0JCWMoWzFdKSAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgIAlhc3NlcnRTY3JpcHQgPDw8RU9GCi1jID0geyB4IHwgCi0JeSA9IDEyMwotCWMxID0geyAKLQkJYXNzZXJ0IHggIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBhIHZhbHVlIGZvciB4IgotCQlhc3NlcnQgeSA9PSAxMjMgOiAiQ291bGQgbm90IGZpbmQgYSB2YWx1ZSBmb3IgeSIKLQkJcHJpbnRsbiB4WzBdIAotCX0gCi0JCi0JYzEoKSAKLX0gCi0KLWMoWzFdKSAKLUVPRiAgICAJCi0JfQotICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVHlwZWRWYXJpYWJsZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVUeXBlZFZhcmlhYmxlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxOWM2OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVUeXBlZFZhcmlhYmxlQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDbG9zdXJlVHlwZWRWYXJpYWJsZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcyKCkgewotICAgCQljb3VudCA9IG1ha2VDbG9zdXJlKDApCi0gICAgICAgIGFzc2VydCBjb3VudCA9PSAxCi0gICAgICAgIAotICAgCQljb3VudCA9IG1ha2VDbG9zdXJlMigwKQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMQotICAgIH0KLQotCi0gICAgbWFrZUNsb3N1cmUoTnVtYmVyIGNvdW50KSB7Ci0gICAgCWNsb3N1cmUgPSB7IGNvdW50ID0gaXQgfQotICAgIAljbG9zdXJlKDEpCi0gICAgCXJldHVybiBjb3VudAotICAgIH0KLQotICAgIG1ha2VDbG9zdXJlMihOdW1iZXIgYykgewotICAgIAljb3VudCA9IGMKLSAgICAJY2xvc3VyZSA9IHsgY291bnQgPSBpdCB9Ci0gICAgCWNsb3N1cmUoMSkKLSAgICAJcmV0dXJuIGNvdW50Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBJbnRlZ2VyIGNvdW50ID0gMAotICAgICAgICBjbG9zdXJlID0geyBjb3VudCA9IGl0IH0KLSAgICAgICAgY2xvc3VyZSgxKQotICAgICAgICBhc3NlcnQgY291bnQgPT0gMQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RCdWczKCkgewotICAgIAljbG9zdXJlID0gZ2V0RWxlbWVudENsb3N1cmUoInAiKQotICAgIAlhbnN3ZXIgPSBjbG9zdXJlKCJiIikKLSAgICAJdmFsdWUgPSBhbnN3ZXIoImMiKQotICAgIAlwcmludGxuICJyZXR1cm5lZCA6ICR7dmFsdWV9IgotICAgIH0KLSAgICAKLSAgICBDbG9zdXJlIGdldEVsZW1lbnRDbG9zdXJlKHRhZykgewotCQlyZXR1cm4geyBib2R5IHwKLQkJCWlmICh0cnVlKSB7Ci0JCQkJcmV0dXJuIHsiJHtib2R5fSJ9Ci0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJYm9keSA9IG51bGwKLQkJCX0KLQkJfQotCX0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVmFyaWFibGVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVmFyaWFibGVCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjE4NzMwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVZhcmlhYmxlQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDbG9zdXJlVmFyaWFibGVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q2xvc3VyZVBhc3NpbmdCdWcoKSB7Ci0gICAgICAgIGNvdW50ID0gMAotICAgICAgICBjbG9zdXJlID0geyBhc3NlcnQgY291bnQgPT0gaXQgfQotICAgICAgICBjbG9zdXJlKDApCi0gICAgICAgIAotICAgICAgICBjb3VudCA9IDEKLSAgICAgICAgY2xvc3VyZSgxKQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RQYXNzaW5nQ2xvc3VyZUFzTmFtZWRQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHggPSAxMjMKLSAgICAgICAgCi0gICAgICAgIGZvbyA9IG5ldyBFeHBhbmRvKGE6e3h9LCBiOjQ1NikKLSAgICAKLSAgICAJYXNzZXJ0IGZvby5hICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIHByaW50bG4gIkZvbyBoYXMgYSA9ICR7Zm9vLmF9IgotICAgICAgICAKLSAgICAJdmFsdWUgPSBmb28uYSgpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAxMjMKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgIAl2YWx1ZSA9IGNhbGxDbG9zdXJlKFsxLCAyXSkKLSAgICAJYXNzZXJ0IHZhbHVlID09IDIKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEludGVnZXIgY2FsbENsb3N1cmUoY29sbGVjdGlvbikgewotICAgIAkvKiogQHRvZG8KLSAgICAJSW50ZWdlciB4Ci0gICAgCSovCi0gICAgCUludGVnZXIgeCA9IDAKLSAgICAJY29sbGVjdGlvbi5lYWNoIHsgeCA9IGl0IH0KLSAgICAJcmV0dXJuIHgKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlV2l0aFN0YXRpY1ZhcmlhYmxlc0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoU3RhdGljVmFyaWFibGVzQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1Mzg4MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoU3RhdGljVmFyaWFibGVzQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIENsb3N1cmVXaXRoU3RhdGljVmFyaWFibGVzQnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotICAgIAotICAgIHN0YXRpYyB5ID0gWzpdCi0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotCQljID0geyB4IHwKLQkJCXJldHVybiB7Ci0JCQkgICAgZm9vID0gQ2hlZXNlLnoKLQkJCSAgICBwcmludGxuIGZvbwotCQkJICAgIGFzc2VydCBmb28uc2l6ZSgpID09IDAKLQkJCSAgICAKLSAgICAJCSAgICBwcmludGxuIHkKLSAgICAJCSAgICBhc3NlcnQgeS5zaXplKCkgPT0gMAotICAgIAkJICAgIAotICAgIAkJICAgIHJldHVybiA2Ci0JCQl9Ci0JCX0KLQkJYzIgPSBjKDUpCi0JCWFuc3dlciA9IGMyKCkKLQkJYXNzZXJ0IGFuc3dlciA9PSA2Ci0gICAgfQotfQotCi1jbGFzcyBDaGVlc2UgewotICAgIHN0YXRpYyB6ID0gWzpdCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlc0luU2NyaXB0QnVnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVzSW5TY3JpcHRCdWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlYzFhMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVzSW5TY3JpcHRCdWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9zdXJlc0luU2NyaXB0QnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTY3JpcHQoICJhID0gMVxuIFsyXS5lYWNoIHsgYSA9IGl0IH1cbiBhc3NlcnQgYSA9PSAyIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ29uc3RydWN0b3JCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Db25zdHJ1Y3RvckJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWU2NTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Db25zdHJ1Y3RvckJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXIKLWltcG9ydCBqYXZhLmlvLkZpbGUKLQotLyoqCi0gKiBAYXV0aG9yIEphc29uIFRob21hcwotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBDb25zdHJ1Y3RvckJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHR5cGUgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKS5wYXJzZUNsYXNzKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0QmFzZS5ncm9vdnkiKSkKLSAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbAotCi0gICAgICAgIHByaW50bG4gImNyZWF0ZWQgdHlwZTogJHt0eXBlfSIKLSAgICAgICAgCi0gICAgICAgIHR5cGUgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKS5wYXJzZUNsYXNzKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0RGVyaXZlZC5ncm9vdnkiKSkKLSAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbAotCi0gICAgICAgIHByaW50bG4gImNyZWF0ZWQgdHlwZTogJHt0eXBlfSBvZiB0eXBlOiAke3R5cGUuY2xhc3N9IgotCi0gICAgICAgIG15dGVzdCA9IEludm9rZXJIZWxwZXIuaW52b2tlQ29uc3RydWN0b3JPZih0eXBlLCBuZXcgT2JqZWN0W10geyAiSGVsbG8iIH0pCi0gICAgICAgIGFzc2VydCBteXRlc3QuZm9vID09ICJIZWxsbyIKLSAgICAgICAgLyoqIEB0b2RvIGZpeCBidWcKLSAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIHRlc3QgPSB0eXBlLm5ld0luc3RhbmNlKCkKLSAgICAgICAgYXNlcnQgdGVzdC5mb28gPT0gbnVsbAotICAgICAgICAqLwotICAgICAgICAKLS8vZm9vID0gbmV3IHR5cGUoJ2hlbGxvJykKLSAgICAgICAgLyoKLSAgICAgICAgKi8KLSAgICAgICAgbXl0ZXN0ID0gbmV3IFRlc3REZXJpdmVkKCJIZWxsbyIpCi0gICAgICAgIGFzc2VydCBteXRlc3QuZm9vID09ICJIZWxsbyIKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Db25zdHJ1Y3RvclBhcmFtZXRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yUGFyYW1ldGVyQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlNTdmNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yUGFyYW1ldGVyQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotY2xhc3MgQ29uc3RydWN0b3JQYXJhbWV0ZXJCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RNZXRob2RXaXRoTmF0aXZlQXJyYXkoKSB7Ci0gICAgICAgIHZhbHVlID0gbmV3IGludFsyKjJdCi0gICAgICAgIHByaW50bG4gIiR7dmFsdWV9IG9mIHR5cGUgJHt2YWx1ZS5jbGFzc30iCi0gICAgICAgIC8qKiBAdG9kbyBmaXhtZSEKLSAgICAJYmxhaDIodmFsdWUpCi0gICAgCSovCi0gICAgfQotCi0gICAgYmxhaDIoaW50W10gd29iYmxlKSB7Ci0gICAgICAgcHJpbnRsbih3b2JibGUpCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0RlZlZhcmlhYmxlQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRGVmVmFyaWFibGVCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ4YTQxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRGVmVmFyaWFibGVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIERlZlZhcmlhYmxlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLQotICAgICAvKiBjcG9pcmllciAtICJkZWYiIGNhbiBiZSByZWZlcmVkIHRvIGFzIGEgdmFyaWFibGUgbmFtZSwKLSAgICAgICAgYnV0IGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBvbmUgKGR1ZSB0byBhbWJpZ3VpdGllcykKLQotICAgICAgICBkZWYgPSAxMjMKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBkZWYgPT0gMTIzCi0gICAgICovCi0gICAgICAgIAotICAgICAgICBmb28gPSBuZXcgRXhwYW5kbyhhOjEyMywgZGVmOjQ1NikKLSAgICAgICAgYXNzZXJ0IGZvby5kZWYgPT0gNDU2Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Eb3VibGVTaXplUGFyYW1ldGVyc0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0RvdWJsZVNpemVQYXJhbWV0ZXJzQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZWUwZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0RvdWJsZVNpemVQYXJhbWV0ZXJzQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBEb3VibGVTaXplUGFyYW1ldGVyc0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCAiIiIKLWRlZiBmb28oZG91YmxlIHgsIHkpIHsKLSAgIHkKLX0KLQotZm9vKDEwLjBkLCAwKQotIiIiICk7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yQW5kU3FsQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yQW5kU3FsQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYTQ5ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0ZvckFuZFNxbEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnNxbC5UZXN0SGVscGVyCi0KLS8qKgotICogQGF1dGhvciBKb25hdGhhbiBDYXJsc29uCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEZvckFuZFNxbEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWdJbk5vcm1hbE1ldGhvZCgpIHsKLSAgICAgICAgc3FsID0gVGVzdEhlbHBlci5tYWtlU3FsKCkKLSAgICAgICAgCi0gICAgICAgIGxpID0gWyJhIiwgImIiXQotICAgICAgICBmb3IgKHggaW4gbGkpIHsKLSAgICAgICAgICAgIHNxbC5lYWNoUm93KCJTRUxFQ1QgY291bnQoKikgRlJPTSBGT09EIikgeyBlIHwKLSAgICAgICAgICAgIAlwcmludGxuICIgJHt4fSIKLSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGFzc2VydCB4ICE9IG51bGwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RCdWdJbnNpZGVTY3JpcHQoKSB7Ci0gICAgICAgIGFzc2VydFNjcmlwdCggPDw8RU9GCi1pbXBvcnQgZ3Jvb3Z5LnNxbC5UZXN0SGVscGVyCi1zcWwgPSBUZXN0SGVscGVyLm1ha2VTcWwoKQotCi1saSA9IFsiYSIsICJiIl0KLWZvciAoeCBpbiBsaSkgewotICAgIHNxbC5lYWNoUm93KCJTRUxFQ1QgY291bnQoKikgRlJPTSBGT09EIikgeyBlIHwKLSAgICAJcHJpbnRsbiAiIFwke3h9IgotICAgIAkKLSAgICAJYXNzZXJ0IHggIT0gbnVsbAotICAgIH0KLX0KLUVPRikgICAgICAgIAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Gb3JMb29wQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yTG9vcEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTQzYjIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Gb3JMb29wQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKgotICogQGF1dGhvciBKb2huIFdpbHNvbgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBGb3JMb29wQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCA8PDxFT0YKLWxpc3QgPSBbXQotYSA9IDEKLWIgPSA1Ci1mb3IgKGMgaW4gYS4uYikgewotICAgIGxpc3QgPDwgYwotfQotYXNzZXJ0IGxpc3QgPT0gWzEsIDIsIDMsIDQsIDVdCi1FT0YpICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U2VhbnNCdWcoKSB7Ci0gICAgICAgIGFzc2VydFNjcmlwdCggPDw8RU9GCi1mb3IgKGkgaW4gMS4uMTApIHsKLSAgICBwcmludGxuIGkKLX0KLUVPRikgICAgICAgIAotICAgIH0KLQotICAgIHZvaWQgdGVzdE5vcm1hbE1ldGhvZCgpIHsKLSAgICAgICAgbGlzdCA9IFtdCi0gICAgICAgIGEgPSAxCi0gICAgICAgIGIgPSA1Ci0gICAgICAgIGZvciAoYyBpbiBhLi5iKSB7Ci0gICAgICAgICAgICBsaXN0IDw8IGMKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMSwgMiwgMywgNCwgNV0KLSAgICB9Ci0gICAgCi0gICAgIHZvaWQgdGVzdEJ5dGVjb2RlR2VuQnVnKCkgewotICAgICAgICBhID0gMQotICAgICAgICBiID0gNQotCi0gICAgICAgIGZvciAoaSBpbiBhLi5iKSB7Ci0gICAgICAgICAgICBwcmludGxuIGkKLSAgICAgICAgfQotICAgICAgICBhID0gaQotICAgICAgICAKLQkJYXNzZXJ0IGEgPT0gNQotICAgIH0KLQotCi0gICAgdm9pZCB0ZXN0VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCA8PDxFT0YKLQotYXJyYXkgPSBbIHRydWUsIHRydWUsIHRydWUgXTsKLWZvciggYm9vbGVhbiBpIGluIGFycmF5ICkgewotICAgMS50aW1lcyB7Ci0gICAgICAgYXNzZXJ0IGkgPT0gdHJ1ZTsKLSAgIH0KLX0KLUVPRikgICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZENsYXNzQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRnVsbHlRdWFsaWZpZWRDbGFzc0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZmQyMTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZENsYXNzQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBGdWxseVF1YWxpZmllZENsYXNzQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmVyci5wcmludGxuKCJIZWxsbyB3b3JsZCIpCi0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR2V0dGVyQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR2V0dGVyQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhOGVmNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dldHRlckJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgR2V0dGVyQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgICAKLSAgICBTdHJpbmcgZm9vCi0gICAgCi0gICAgU3RyaW5nIGdldEZvbygpIHsKLSAgICAJaWYgKGZvbyA9PSBudWxsKSB7IAotICAgIAkJZm9vID0gIkphbWVzIgotICAgIAl9Ci0gICAgCXJldHVybiBmb28KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRGb28oU3RyaW5nIGZvbykgewotICAgIAl0aGlzLmZvbyA9IGZvbwotICAgCX0KLSAgICAKLSAgICB2b2lkIHRlc3RUeXBlZEdldHRlckFuZFNldHRlcigpIHsKLSAgICAJcHJpbnRsbiAiUnVubmluZyB0ZXN0IgotICAgIAkKLSAgICAJdmFsdWUgPSBnZXRGb28oKQotICAgIAkKLSAgICAJcHJpbnRsbiAiVmFsdWUgaXMgJHt2YWx1ZX0iCi0gICAgCQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIkphbWVzIgotICAgIAkKLSAgICAJc2V0Rm9vKCJCb2IiKQotICAgIAkKLSAgICAJdmFsdWUgPSBnZXRGb28oKQotICAgIAkKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJCb2IiCi0gICAgfQotICAgIAotICAgIGJhcgotICAgIAotICAgIGdldEJhcigpIHsKLSAgICAJaWYgKHRoaXMuYmFyID09IG51bGwpIHsKLSAgICAJCXRoaXMuYmFyID0gIkphbWVzIgotICAgIAl9Ci0gICAgCWJhcgotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldEJhcihiYXIpIHsKLSAgICAJdGhpcy5iYXIgPSBiYXIKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgdm9pZCB0ZXN0VW50eXBlZEdldHRlckFuZFNldHRlcigpIHsKLSAgICAJcHJpbnRsbiAiUnVubmluZyB0ZXN0IgotICAgIAkKLSAgICAJdmFsdWUgPSBnZXRCYXIoKQotICAgIAkKLSAgICAJcHJpbnRsbiAiVmFsdWUgaXMgJHt2YWx1ZX0iCi0gICAgCQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIkphbWVzIgotICAgIAkKLSAgICAJc2V0QmFyKCJCb2IiKQotICAgIAkKLSAgICAJdmFsdWUgPSBnZXRCYXIoKQotICAgIAkKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJCb2IiCi0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM5X0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTIzOV9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY0NjcyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM5X0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgR3Jvb3Z5MjM5X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0JCWEgPSBtYWtlQ2xvc3VyZSgpCi0JCWIgPSBtYWtlQ2xvc3VyZSgpCi0JCWMgPSBtYWtlQ2xvc3VyZSgpCi0JCQotCQlhKCkgewotCQkJcHJpbnRsbigiQSIpCi0JCQliKCkgewotCQkJCXByaW50bG4oIkIiKQotCQkJCWMoKSB7Ci0JCQkJCXByaW50bG4oIkMiKQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCW1ha2VDbG9zdXJlKCkgewotCQlyZXR1cm4geyBpdCgpIH0KLQl9Ci0JCQotICAgIHZvaWQgdGVzdEJ1ZzIoKSB7Ci0JCWEgPSB7IGl0KCkgfQotCQliID0geyBpdCgpIH0KLQkJYyA9IHsgaXQoKSB9Ci0JCQotCQlhKCkgewotCQkJYigpIHsKLQkJCQljKCkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLSAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjQ5X0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTI0OV9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVlYWE5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjQ5X0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCi0KLS8qKgotICogQGF1dGhvciBNZXJyaWNrIFNjaGluY2FyaW9sIAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBHcm9vdnkyNDlfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotCQl0ID0gbmV3IEJlYW4yNDkoKQotCQl0LmIgPSAiaGVsbG8iCi0JCXByaW50bG4gdC5iCi0JCXByaW50bG4gInRlc3Q6ICR7dC5ifSIKLQkJCi0JCXhtbCA9IG5ldyBNYXJrdXBCdWlsZGVyKCkKLQkJcm9vdCA9IHhtbC5mb28gewotCQkJYmFyIHsKLQkJCQkvLyB3b3JrcwotCQkJCWJheigidGVzdCIpCi0JCQkJLy8gZmFpbHMKLQkJCQliYXoodC5iKQotCQkJCS8vIGZhaWxzCi0JCQkJYmF6KCIke3QuYn0iKQotCQkJfQotCQl9IAotCX0KLQkKLS8qKiBAdG9kbyBkb24ndCBrbm93IHdoeSB0aGlzIGZhaWxzCi0KLSAgICB2b2lkIHRlc3RCdWdJblNjcmlwdCgpIHsKLSAgICAJYXNzZXJ0U2NyaXB0IDw8PEVPRgotCQkJaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlcjsKLQkJCQotCQkJY2xhc3MgQmVhbiB7Ci0JCQkJU3RyaW5nIGIKLQkJCX07Ci0JCQkKLQkJCXQgPSBuZXcgQmVhbigpCi0JCQl0LmIgPSAiaGVsbG8iCi0JCQlwcmludGxuIHQuYgotCQkJcHJpbnRsbiAidGVzdDogJHt0LmJ9IgotCQkJCi0JCQl4bWwgPSBuZXcgTWFya3VwQnVpbGRlcigpCi0JCQlyb290ID0geG1sLmZvbyB7Ci0JCQkJYmFyIHsKLQkJCQkJLy8gd29ya3MKLQkJCQkJYmF6KCJ0ZXN0IikKLQkJCQkJLy8gZmFpbHMKLQkJCQkJYmF6KHQuYikKLQkJCQkJLy8gZmFpbHMKLQkJCQkJYmF6KCIke3QuYn0iKQotCQkJCX0KLQkJCX0gCi0KLUVPRiAgICAJCi0JfQotKi8KLSAgIAotfQotCi1jbGFzcyBCZWFuMjQ5IHsKLQlTdHJpbmcgYgotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNTJfQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjUyX0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc4MDEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNTJfQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBHcm9vdnkyNTJfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIGNvdW50ID0gMAotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgdmFsdWUgPSBmKCkKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IG51bGwKLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gZygpCi0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSBudWxsCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IGgoKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gbnVsbAotICAgIH0KLSAgICAKLSAgICAKLSAgICBmKCkgewotICAgICAgICAgaWYgKGNvdW50KysgPT0gNSkKLSAgICAgICAgICAgIHJldHVybiBudWxsCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbAotICAgIH0gCi0gICAgCi0gICAgZygpIHsKLSAgICAgICAgIGNvdW50KysKLQkgICAgIHJldHVybiBudWxsCi0gICAgfSAKLSAgICAKLSAgICBoKCkgewotICAgICAgICAgKytjb3VudAotCSAgICAgcmV0dXJuIG51bGwKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNzhfQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mjc4X0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2UzY2QuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNzhfQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEdyb292eTI3OF9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICB2YWx1ZSA9IG5ldyBNeVJhbmdlKCkKLSAgICAgICAgcHJpbnRsbiB2YWx1ZQotICAgICAgICBhc3NlcnQgdmFsdWUgIT0gbnVsbAotICAgIH0KLX0KLQotCi1jbGFzcyBNeVJhbmdlIGV4dGVuZHMgSW50UmFuZ2UgewotICAgIE15UmFuZ2UoKSB7Ci0gICAgICAgIHN1cGVyKDEsIDIpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwM19CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWZhNDhjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIGdyb292eS5idWdzCi0KLWltcG9ydCBqYXZhLmF3dC4qCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuKgotaW1wb3J0IGphdmF4LnN3aW5nLioKLQotCi0vKioKLSAqIEBhdXRob3IgQmluZyBSYW4KLSAqIEBhdXRob3IgQW5keSBEd2VsbHkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgR3Jvb3Z5MzAzX0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHRyeSB7Ci0JCQlzY2hvbGFzdGljID0gbmV3IFNjaG9sYXN0aWMoKQotICAgICAgIAkJc2Nob2xhc3RpYy5jcmVhdGVVSSgpCi0gICAgICAgCX0KLSAgICAgICAJY2F0Y2ggKEhlYWRsZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAJCS8vIGNhbGxlZCBmcm9tIGEgbm9uLVVJIGVudmlyb25tZW50Ci0gICAgICAgCX0KLSAgICB9Ci19Ci0KLQotY2xhc3MgU2Nob2xhc3RpYyBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLQotICAgIHZvaWQgY3JlYXRlVUkoKSB7Ci0gICAgICAgcHJpbnRsbignY3JlYXRlVUkgY2FsbGVkJykKLSAgICAgICBmcmFtZSA9IG5ldyBKRnJhbWUoIkhlbGxvIFdvcmxkIikKLSAgICAgICBjb250ZW50cyA9IGZyYW1lLmdldENvbnRlbnRQYW5lKCkKLSAgICAgICBwYW5lID0gbmV3IEpQYW5lbCgpCi0gICAgICAgcGFuZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKQotICAgICAgIGJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJBIGJ1dHRvbiIpCi0gICAgICAgYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpCi0gICAgICAgcGFuZS5hZGQoYnV0dG9uLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKQotICAgICAgIGNvbnRlbnRzLmFkZChwYW5lKQotICAgICAgIGZyYW1lLnNldFNpemUoMTAwLCAxMDApCi0gICAgICAgLy9mcmFtZS5zZXRWaXNpYmxlKHRydWUpCi0gICAgICAgYnV0dG9uLmRvQ2xpY2soKQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgIHByaW50bG4gImhlbGxvIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzA4X0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwOF9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThkNzQxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzA4X0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5idWdzCi0KLWltcG9ydCBqYXZhLmlvLioKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIEdyb292eTMwOF9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgIAlvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCkKLSAgICAJb3V0IDw8ICJoZWxsbyAiIDw8ICJ3b3JsZCEiCi0gICAgCQotICAgIAl2YWx1ZSA9IG91dC50b1N0cmluZygpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiaGVsbG8gd29ybGQhIgotICAgIAkKLSAgICAJb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCi0gICAgCW91dCA8PCAiaGVsbG8gIiA8PCAid29ybGQhIgotCi0JCXZhbHVlID0gbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkKLQkJYXNzZXJ0IHZhbHVlID09ICJoZWxsbyB3b3JsZCEiCi0gICAgCSAgICAJCi0gICAgCVN5c3RlbS5vdXQgPDwgImhlbGxvIiA8PCAiIHdvcmxkISIKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mzg5X0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTM4OV9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk1NjJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mzg5X0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioKLSAqICBWZXJpZmllcyB0aGF0IGNsb3N1cmVzIHdvcmsgaW5zaWRlIGNhc2UgYmxvY2tzLgotICoKLSAqLwotCi1jbGFzcyBHcm9vdnkzODlfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICBhID0gWzEwLCAxMSwgMTJdCi0gICAgICAgYiA9IDAKLSAgICAgICAKLSAgICAgICBzd2l0Y2goICJsaXN0IiApIHsKLSAgICAgICAgICBjYXNlICJsaXN0IjoKLSAgICAgICAgICAgICBhLmVhY2ggeyBiID0gYiArIDEgfQotICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgfQotCi0gICAgICAgYXNzZXJ0IGIgPT0gMwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk1MTNfQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTEzX0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjgxMzUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk1MTNfQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKgotICogIFZlcmlmaWVzIHRoYXQgY29tcGFyaXNvbnMgdG8gSW50ZWdlci5NSU5fVkFMVUUgd29yawotICovCi0KLWNsYXNzIEdyb292eTUxM19CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gCi0gICAgdm9pZCB0ZXN0TWluTWF4VmFsdWVDb21wYXJpc29uKCkgewotICAgIAlhc3NlcnRUcnVlKDggPCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgCWFzc2VydFRydWUoOCA+IEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAJYXNzZXJ0VHJ1ZSg4TCA8IExvbmcuTUFYX1ZBTFVFKTsKLSAgICAJYXNzZXJ0VHJ1ZSg4TCA+IExvbmcuTUlOX1ZBTFVFKTsKLSAgICAJYXNzZXJ0VHJ1ZSg4LjAgPCBEb3VibGUuTUFYX1ZBTFVFKTsKLSAgICAJYXNzZXJ0VHJ1ZSg4LjAgPiBEb3VibGUuTUlOX1ZBTFVFKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTU1OF82MTZfQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTU4XzYxNl9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ0MjkyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTU4XzYxNl9CdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuYnVncwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuRHVtbXkKLQotLyoqCi0gICogRml4ZXMgR1JPT1ZZLTU1OCBhbmQgR1JPT1ZZLTYxNi4KLSAgKiBBIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGVuZGluZyB3aXRoIC5jbGFzcyBvciBub3Qgd2VyZSBub3QgcmVjb2duaXplZCBwcm9wZXJseS4KLSAgKgotICAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQotICAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAgKi8KLWNsYXNzIEdyb292eTU1OF82MTZfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0TGlzdENsYXNzKCkgewotICAgICAgICBhc3NlcnQgamF2YS51dGlsLkFycmF5TGlzdC5jbGFzcyA9PSBBcnJheUxpc3QuY2xhc3MKLSAgICAgICAgYXNzZXJ0IGphdmEudXRpbC5BcnJheUxpc3QuY2xhc3MgPT0gQXJyYXlMaXN0Ci0gICAgICAgIGFzc2VydCBBcnJheUxpc3QgIT0gQ2xhc3MKLSAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKQotICAgICAgICBhc3NlcnQgbGlzdC5jbGFzcyA9PSBBcnJheUxpc3QKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RTdHJpbmdDbGFzcygpIHsKLSAgICAgICAgYXNzZXJ0IGphdmEubGFuZy5TdHJpbmcuY2xhc3MgPT0gU3RyaW5nLmNsYXNzCi0gICAgICAgIGFzc2VydCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzID09IFN0cmluZwotICAgICAgICBhc3NlcnQgU3RyaW5nICE9IENsYXNzCi0gICAgICAgIHN0ID0gIiIKLSAgICAgICAgYXNzZXJ0IHN0LmNsYXNzID09IFN0cmluZwotICAgIH0KLQotICAgIHZvaWQgdGVzdER1bW15Q2xhc3MoKSB7Ci0gICAgICAgIGFzc2VydCBncm9vdnkudXRpbC5EdW1teS5jbGFzcyA9PSBEdW1teS5jbGFzcwotICAgICAgICBhc3NlcnQgZ3Jvb3Z5LnV0aWwuRHVtbXkuY2xhc3MgPT0gRHVtbXkKLSAgICAgICAgYXNzZXJ0IER1bW15ICE9IENsYXNzCi0gICAgICAgIGR1bSA9IG5ldyBEdW1teSgpCi0gICAgICAgIGFzc2VydCBkdW0uY2xhc3MgPT0gRHVtbXkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RGb29DbGFzcygpIHsKLSAgICAgICAgYXNzZXJ0IGdyb292eS5idWdzLkdyb292eTU1OF82MTZfQnVnLmNsYXNzID09IEdyb292eTU1OF82MTZfQnVnCi0gICAgICAgIGFzc2VydCBHcm9vdnk1NThfNjE2X0J1ZyAhPSBDbGFzcwotICAgICAgICBmID0gbmV3IEdyb292eTU1OF82MTZfQnVnKCkKLSAgICAgICAgYXNzZXJ0IGYuY2xhc3MgPT0gR3Jvb3Z5NTU4XzYxNl9CdWcKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTkzX0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTU5M19CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzc2NmYwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTkzX0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5idWdzCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcgotaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlcgotCi0vKiogCi0gKiBUZXN0cyB0aGF0IHNwZWNpYWwgWE1MIGNoYXJzIGFyZSBlbnRpdGl6ZWQgYnkgTWFya3VwQnVpbGRlci4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzY290dHN0aXJsaW5nQHJjbi5jb20iPlNjb3R0IFN0aXJsaW5nPC9hPgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqCi0gKiAgIEZpeCB0aGUgY3IgbGYgaGFuZGxpbmcgb2YgbXVsdGlsaW5lIHN0cmluZ29uIGJvdGggb2YgbGludXggYW5kIFdpbmRvd3MgWFAuCi0gKiAgIFRoaXMgdGVzdCBzaG91bGQgc3VjY2VzcyBvbiBXaW5kb3dzIFhQLgotICoKLSAqICAgQGF1dGhvciBQaWxobyBLaW0KLSAqLwotY2xhc3MgR3Jvb3Z5NTkzX0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpCi0gICAgTWFya3VwQnVpbGRlciBjaGFycyA9IG5ldyBNYXJrdXBCdWlsZGVyKHdyaXRlcikKLSAgICBYbWxQYXJzZXIgcGFyc2VyID0gbmV3IFhtbFBhcnNlcigpCi0gICAgU3RyaW5nIGV4cGVjdGVkWE1MID0gPDw8RU9GCi08Y2hhcnM+Ci0gIDxhbXBlcnNhbmQgYT0nJmFtcDsnPiZhbXA7PC9hbXBlcnNhbmQ+Ci0gIDxxdW90ZT4mcXVvdDs8L3F1b3RlPgotICA8bGVzc3RoYW4gYXR0cj0ndmFsdWUnPmNoYXJzOiAmYW1wOyAmbHQ7ICZndDsgJnF1b3Q7PC9sZXNzdGhhbj4KLSAgPGVsZW1lbnQgYXR0cj0ndmFsdWUgMSAmYW1wOyAyJz5jaGFyczogJmFtcDsgJmx0OyAmZ3Q7ICZxdW90OyBpbiBtaWRkbGU8L2VsZW1lbnQ+Ci0gIDxncmVhdGVydGhhbj4mZ3Q7PC9ncmVhdGVydGhhbj4KLTwvY2hhcnM+Ci1FT0YKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgLy8gWE1MIGNoYXJhY3RlcnMgdG8gdGVzdCB3aXRoCi0gICAgICAgIGNoYXJzLmNoYXJzIHsKLSAgICAgICAgICAgIGFtcGVyc2FuZChhOiAiJiIsICImIikKLSAgICAgICAgICAgIHF1b3RlKCJcJyIpCi0gICAgICAgICAgICBsZXNzdGhhbihhdHRyOiAidmFsdWUiLCAiY2hhcnM6ICYgPCA+IFwnIikgCi0gICAgICAgICAgICBlbGVtZW50KGF0dHI6ICJ2YWx1ZSAxICYgMiIsICJjaGFyczogJiA8ID4gXCcgaW4gbWlkZGxlIikKLSAgICAgICAgICAgIGdyZWF0ZXJ0aGFuKCI+IikKLSAgICAgICAgfQotICAgICAgICAvL0RFQlVHCi0gICAgICAgIC8vcHJpbnRsbiB3cml0ZXIKLQotICAgICAgICAvLyBUZXN0IE1hcmt1cEJ1aWxkZXIgc3RhdGUgd2l0aCBleHBlY3RlZFhNTAotCS8vIEhhbmRsaW5nIHRoZSBjciBsZiBjaGFyYWN0ZXJzLCBkZXBlbmRpbmcgb24gb3BlcmF0aW5nIHN5c3RlbS4gCi0gICAgICAgIG91dHB1dFZhbHVlID0gd3JpdGVyLnRvU3RyaW5nKCkKLSAgICAgICAgaWYgKGV4cGVjdGVkWE1MLmluZGV4T2YoIlxyXG4iKSA+PSAwICYmIG91dHB1dFZhbHVlLmluZGV4T2YoIlxyXG4iKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZXhwZWN0ZWRYTUwucmVwbGFjZUFsbCgiXHJcbiIsICJcbiIpLmxlbmd0aCgpID09IG91dHB1dFZhbHVlLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkWE1MLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKSwgb3V0cHV0VmFsdWUpCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXhwZWN0ZWRYTUwuaW5kZXhPZigiXHJcbiIpIDwgMCAmJiBvdXRwdXRWYWx1ZS5pbmRleE9mKCJcclxuIikgPj0gMCkgewotICAgICAgICAgICAgICAgIGFzc2VydCBleHBlY3RlZFhNTC5sZW5ndGgoKSA9PSBvdXRwdXRWYWx1ZS5yZXBsYWNlQWxsKCJcclxuIiwgIlxuIikubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRYTUwsIG91dHB1dFZhbHVlLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKSkKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlciB3aWxsIHRocm93IGEgU0FYUGFyc2VFeGNlcHRpb24gaWYgWE1MIGlzIG5vdCB2YWxpZAotICAgICAgICBwYXJzZXIucGFyc2VUZXh0KHdyaXRlci50b1N0cmluZygpKQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk2NjZfQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NjY2X0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODA4NDEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk2NjZfQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotLyoqCi0gKiAgQGF1dGhvciBSdXNzZWwgV2luZGVyCi0gKiAgQHZlcnNpb24gJFJldmlzaW9uJAotICovIAotY2xhc3MgR3Jvb3Z5NjY2X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgdm9pZCB0ZXN0UnVuU2NyaXB0KCkgewotICAgIChuZXcgR3Jvb3Z5U2hlbGwgKCkpLmV2YWx1YXRlKCJ4ID0gMSIpCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Njc1X0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY3NV9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2JmMjEyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Njc1X0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5idWdzCi0KLS8qKgotICogIEBhdXRob3IgUGlsaG8gS2ltCi0gKiAgQHZlcnNpb24gJFJldmlzaW9uJAotICovIAotY2xhc3MgR3Jvb3Z5Njc1X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICB2b2lkIHRlc3RTdHJpbmdBbmRHU3RyaW5nKCkgewotCWFzc2VydCAiXFwiIT0iXFxcXCIgCi0JYXNzZXJ0ICJcXCQiPT0iXFwiKyIkIiAKLQlhc3NlcnQgIlxcIisiXFxcXCIgPT0gIlxcIisiXFwiKyJcXCIgJiYgIlxcXFwiKyJcXCIgPT0gIlxcIisiXFwiKyJcXCIKLQlhc3NlcnQgKCJcXFxcIisiXFwiKS5sZW5ndGgoKSA9PSAzCi0JYXNzZXJ0ICJcXDMgJDEkMiIgPT0gIlxcIiArICIzIiArICIgIiArICIkIiArICIxIiArICIkIiArICIyIgotCWFzc2VydCAiXFxcXDMgXFwkMSQyIiA9PSAiXFwiICsgIlxcIiArICIzIiArICIgIiArICJcXCIrICIkIiArICIxIiArICIkIiArICIyIgotCWFzc2VydCAiXFxcXFxcMyBcXFxcJDEkMiIgPT0gIlxcIiArICJcXFxcIiArICIzIiArICIgIiArICJcXFxcIisgIiQiICsgIjEiICsgIiQiICsgIjIiCi0JYXNzZXJ0ICJcXFxcXFxcXDMgXFxcXFxcJDEkMiIgPT0gIlxcXFwiICsgIlxcXFwiICsgIjMiICsgIiAiICsgIlxcXFxcXCIrICIkIiArICIxIiArICIkIiArICIyIgotCi0JYXNzZXJ0ICJcXFxcIiA9PSAiXFwiICsgIlxcIgotCWFzc2VydCAiXFxcXCIubGVuZ3RoKCkgPT0gMgotCi0JeiA9IDEwMCArIDIwMAotCWFzc2VydCAiXFxcXCBcXCAke3p9IiA9PSAiXFxcXCBcXCAzMDAiCi0JYXNzZXJ0ICJcXFxcIFxcICR7en0iID09ICJcXCIgKyAiXFwiICsgIiAiICsgIlxcIiArICIgIiArICIzMDAiCi0JYXNzZXJ0ICJIZWxsb1xcLCBcXFdvcmxkXFwiLmNoYXJBdCg0KSA9PSAibyIuY2hhckF0KDApCi0JYXNzZXJ0ICJIZWxsb1xcLCBcXFdvcmxkXFwiLmNoYXJBdCg1KSA9PSAiXFwiLmNoYXJBdCgwKQotCWFzc2VydCAiSGVsbG9cXCwgXFxXb3JsZFxcIi5jaGFyQXQoNikgPT0gIiwiLmNoYXJBdCgwKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NzcwX0J1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTc3MF9CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGYyMWU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NzcwX0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzCi0KLWNsYXNzIEdyb292eTc3MF9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgYSA9IG5ldyBQYWlyKHN5bToieCIpCi0gICAgICAgIGIgPSBuZXcgUGFpcihzeW06InkiKQotICAgICAgICBjID0gbmV3IFBhaXIoc3ltOiJ5IikKLQotICAgICAgICBsMSA9IFthLCBiXQotICAgICAgICBsMiA9IFtjXQotICAgICAgICBwcmludGxuIChsMSkKLSAgICAgICAgcHJpbnRsbiAobDIpCi0gICAgICAgIHByaW50bG4gKGwxIC0gbDIpCi0gICAgICAgIGFzc2VydCBsMSAtIGwyID09IGwxCi0KLQotICAgICAgICBhID0gbmV3IENQYWlyKHN5bToieCIpCi0gICAgICAgIGIgPSBuZXcgQ1BhaXIoc3ltOiJ5IikKLSAgICAgICAgYyA9IG5ldyBDUGFpcihzeW06InkiKQotICAgICAgICBsMSA9IFthLCBiXQotICAgICAgICBsMiA9IFtjXQotICAgICAgICBwcmludGxuIChsMSkKLSAgICAgICAgcHJpbnRsbiAobDIpCi0gICAgICAgIHByaW50bG4gKGwxIC0gbDIpCi0gICAgICAgIGFzc2VydCBsMSAtIGwyID09IFthXQotICAgIH0KLX0KLQotaW1wb3J0IGphdmEudXRpbC4qCi0KLWNsYXNzIFBhaXIgewotICBTdHJpbmcgc3ltCi19Ci0KLWNsYXNzIENQYWlyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0gIHB1YmxpYyBTdHJpbmcgc3ltCi0gIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLSAgICAgIHJldHVybiBzeW0uY29tcGFyZVRvKCgoQ1BhaXIpIG8pLnN5bSk7Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0d1aWxsYXVtZXNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9HdWlsbGF1bWVzQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2MzVlZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0d1aWxsYXVtZXNCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlIAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBHdWlsbGF1bWVzQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgaWYgKHRydWUpIAotICAgICAgICAgICAgcHJpbnRsbigidHJ1ZSIpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc01hcEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0d1aWxsYXVtZXNNYXBCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhMmU5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc01hcEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgR3VpbGxhdW1lc01hcEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcyKCkgewotICAgICAgICBsaXN0ID0gWzEsIDIsIDNdCi0gICAgICAgIG1hcCA9IFs6XQotICAgICAgICAKLSAgICAgICAgZG9Mb29wKGxpc3QsIG1hcCkKLSAgICAKLSAgICAgICAgYXNzZXJ0IG1hcFswXSA9PSAxIAotICAgICAgICBhc3NlcnQgbWFwWzFdID09IDIgCi0gICAgICAgIGFzc2VydCBtYXBbMl0gPT0gMyAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkb0xvb3AobGlzdCwgbWFwKSB7Ci0gICAgICAgIGkgPSAwCi0gICAgICAgIGZvciAoaXQgaW4gbGlzdCkgewotICAgICAgICAgICAgbWFwW2krK10gPSBpdAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgbGlzdCA9IFsxLCAyLCAzXQotICAgICAgICBtYXAgPSBbOl0KLSAgICAgICAgZG9DbG9zdXJlTG9vcChsaXN0LCBtYXApCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbWFwWzBdID09IDEgCi0gICAgICAgIGFzc2VydCBtYXBbMV0gPT0gMiAKLSAgICAgICAgYXNzZXJ0IG1hcFsyXSA9PSAzIAotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvQ2xvc3VyZUxvb3AobGlzdCwgbWFwKSB7Ci0gICAgICAgIGkgPSAwCi0gICAgICAgIGxpc3QuZWFjaCB7IG1hcFtpKytdID0gaXQgfQotICAgIH0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9JYW5NYWNleXNCdWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSWFuTWFjZXlzQnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGZjNDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9JYW5NYWNleXNCdWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIElhbk1hY2V5c0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFNjcmlwdCgiZHVtbXkgPSAwOyBmb3IgKCBpIGluIDAuLjkgKSB7ICBkdW1teSArPSBpIH1cbiBwcmludGxuICdkb25lJyIsICJkdW1teS5ncm9vdnkiKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBhIHN5bnRheCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZWQuIENhdWdodDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9JbmNvbnNpc3RlbnRTdGFja0hlaWdodEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0luY29uc2lzdGVudFN0YWNrSGVpZ2h0QnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmOWIzMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0luY29uc2lzdGVudFN0YWNrSGVpZ2h0QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBJbmNvbnNpc3RlbnRTdGFja0hlaWdodEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgc2VydmVyID0gMAotICAgICAgICBzZXJ2ZXIgKyAxCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCdWcyKCkgewotICAgICAgICBzZXJ2ZXIgPSAwCi0gICAgICAgIHNlcnZlciA9PSAyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCdWczKCkgewotICAgICAgICBzZXJ2ZXIgPSAwCi0gICAgICAgIHNlcnZlcgotICAgICAgICB0cnkgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW50ZXJmYWNlSW1wbEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0ludGVyZmFjZUltcGxCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNhMDc1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW50ZXJmYWNlSW1wbEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5idWdzCi0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZHVtbXkuRm9vSGFuZGxlcgotCi0vKioKLSAqIEBhdXRob3IgUm9iZXJ0IEZ1bGxlcgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBJbnRlcmZhY2VJbXBsQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgaW1wbGVtZW50cyBGb29IYW5kbGVyIHsKLQotICAgIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB7Ci0JCWhhbmRsZShudWxsKSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgaGFuZGxlKFJlYWRlciByZWFkZXIpewotICAgICAgICBwcmludGxuKCJpbiBoYW5kbGUgbWV0aG9kIikKLSAgICAgICAgY2FsbGVkID0gdHJ1ZQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0ludm9rZU5vcm1hbE1ldGhvZEZyb21CdWlsZGVyX0J1ZzY1Ny5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0ludm9rZU5vcm1hbE1ldGhvZEZyb21CdWlsZGVyX0J1ZzY1Ny5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjUyOTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9JbnZva2VOb3JtYWxNZXRob2RGcm9tQnVpbGRlcl9CdWc2NTcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqCi0gICogPHA+Ci0gICogVGVzdCB0aGF0IGVuc3VyZXMgdGhhdDoKLSAgKiA8dWw+Ci0gICogICA8bGk+aXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYSBidWlsZGVyIGluIEdyb292eTwvbGk+Ci0gICogICA8bGk+aXQgaXMgcG9zc2libGUgdG8gY2FsbCBub3JtYWwgbWV0aG9kcyBmcm9tIHRoZSBidWlsZGVyLAotICAqICAgICAgIHdpdGhvdXQgdGhlIG1ldGhvZHMgYmVpbmcgdHJhcHBlZCBlbmRsZXNzbHkgYnkgY3JlYXRlTm9kZSgpPC9saT4KLSAgKiA8L3VsPgotICAqIDwvcD4KLSAgKgotICAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAgKi8KLWNsYXNzIEludm9rZU5vcm1hbE1ldGhvZEZyb21CdWlsZGVyX0J1ZzY1NyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQl2b2lkIHRlc3RJbnZva2VOb3JtYWxNZXRob2QoKSB7Ci0JCWIgPSBuZXcgQnVpbGRlcigpCi0JCWFzc2VydCBiLmNhbGxOb3JtYWxNZXRob2QoKSA9PSAiZmlyc3QiCi0JCQotCQl2YWx1ZSA9IGIuc29tZU5vZGUoKSB7fQotCQlhc3NlcnQgdmFsdWUgPT0gInNlY29uZCIKLQl9Ci19Ci0KLWNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydCB7Ci0KLQl2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHt9Ci0JCi0JT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpICAgICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVOb2RlKG5hbWUsIFs6XSwgbnVsbCkgfQotCU9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgeyByZXR1cm4gY3JlYXRlTm9kZShuYW1lLCBhdHRyaWJ1dGVzLCBudWxsKSB9Ci0JT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgICB7IHJldHVybiBjcmVhdGVOb2RlKG5hbWUsIFs6XSwgdmFsdWUpIH0KLQkKLQlPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgeyAKLQkJcHJpbnRsbiAiY3JlYXRlICR7bmFtZX0iCi0JCXJldHVybiBjYWxsT3RoZXJTdGF0aWNhbGx5VHlwZWRNZXRob2QoKQotCX0KLQkKLQlTdHJpbmcgY2FsbE5vcm1hbE1ldGhvZCgpICAgICAgICAgICAgICAgeyBwcmludGxuICJub3JtYWxNZXRob2QiOyByZXR1cm4gImZpcnN0IiB9Ci0JU3RyaW5nIGNhbGxPdGhlclN0YXRpY2FsbHlUeXBlZE1ldGhvZCgpIHsgcHJpbnRsbiAib3RoZXJNZXRob2QiOyAgcmV0dXJuICJzZWNvbmQiIH0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0l0ZXJhdGVPdmVyQ3VzdG9tVHlwZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL0l0ZXJhdGVPdmVyQ3VzdG9tVHlwZUJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTM3NzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9JdGVyYXRlT3ZlckN1c3RvbVR5cGVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotaW1wb3J0IGdyb292eS5idWdzLlRlc3RTdXBwb3J0Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBJdGVyYXRlT3ZlckN1c3RvbVR5cGVCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBvYmplY3QgPSB0aGlzCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBbXQotICAgICAgICBmb3IgKGkgaW4gb2JqZWN0KSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPDwgaQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gWydhJywgJ2InLCAnYyddCi0gICAgICAgIAotICAgICAgICBhbnN3ZXIgPSBbXQotICAgICAgICBvYmplY3QuZWFjaCB7IGFuc3dlciA8PCBpdCB9Ci0gICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gWydhJywgJ2InLCAnYyddCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwQW5kTWV0aG9kQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwQW5kTWV0aG9kQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiYmY1Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL01hcmt1cEFuZE1ldGhvZEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0KLQotLyoqCi0gKiBNaXhlcyB2YXJpYWJsZXMsIGNsb3N1cmVzIGFuZCBtZXRob2QgY2FsbHMgaW4gbWFya3VwCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBNYXJrdXBBbmRNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICB0cmVlID0gY3JlYXRlVHJlZSgpCi0KLQkJbmFtZSA9IHRyZWUucGVyc29uWzBdWydAbmFtZSddCi0gICAgICAgIGFzc2VydCBuYW1lID09ICdKYW1lcycKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGNyZWF0ZVRyZWUoKSB7ICAgICAgIAotICAgICAgICBidWlsZGVyID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGJ1aWxkZXIucGVvcGxlKCkgewotICAgICAgICAgICAgcGVyc29uKG5hbWU6Z2V0TmFtZSgpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIGxvY2F0aW9uKG5hbWU6J0xvbmRvbicpCi0gICAgICAgICAgICAgICAgcHJvamVjdHMgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KG5hbWU6J2dlcm9uaW1vJykKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwZXJzb24obmFtZTonQm9iJykgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uKG5hbWU6J0F0bGFudGEnKQotICAgICAgICAgICAgICAgIHByb2plY3RzIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdChuYW1lOidkcm9vbHMnKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290ICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByb290Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBnZXROYW1lKCkgewotICAgIAkiSmFtZXMiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NYXJrdXBJblNjcmlwdEJ1Zy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NYXJrdXBJblNjcmlwdEJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU1MmM0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwSW5TY3JpcHRCdWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE1hcmt1cEluU2NyaXB0QnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTY3JpcHRGaWxlKCAic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9BdG9tVGVzdFNjcmlwdC5ncm9vdnkiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2RDYWxsV2l0aG91dFBhcmVuc0luU3RhdGljTWV0aG9kQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnNJblN0YXRpY01ldGhvZEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjFlYmQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2RDYWxsV2l0aG91dFBhcmVuc0luU3RhdGljTWV0aG9kQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWNsYXNzIE1ldGhvZENhbGxXaXRob3V0UGFyZW5zSW5TdGF0aWNNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHN0YXRpY01ldGhvZCgpCi0gICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIHN0YXRpY01ldGhvZCgpIHsKLSAgICAgICAgcHJpbnRsbiAnaGVsbG8nWzFdCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kRGlzcGF0Y2hCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2REaXNwYXRjaEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzE1YzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2REaXNwYXRjaEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgQ2hyaXMgUG9pcmllcgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBNZXRob2REaXNwYXRjaEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICB2b2lkIGRvaXQoT2JqZWN0IHBhcmFtZXRlcjEsIE9iamVjdCBwYXJhbWV0ZXIyKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdENoaWxkOjpkb2l0KCBPYmplY3QsIE9iamVjdCApIik7Ci0gICAgfQotCi0gICAgdm9pZCBkb2l0KEJvb2xlYW4gcGFyYW1ldGVyMSwgT2JqZWN0IHBhcmFtZXRlcjIpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Q2hpbGQ6OmRvaXQoIEJvb2xlYW4sIE9iamVjdCApIik7Ci0gICAgfQotCi0gICAgdm9pZCBkb2l0KE9iamVjdCBwYXJhbWV0ZXIxLCBCb29sZWFuIHBhcmFtZXRlcjIpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Q2hpbGQ6OmRvaXQoIE9iamVjdCwgQm9vbGVhbiApIik7Ci0gICAgfQotCi0gICAgdm9pZCBkb2l0KEJvb2xlYW4gcGFyYW1ldGVyMSwgQm9vbGVhbiBwYXJhbWV0ZXIyKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdENoaWxkOjpkb2l0KCBCb29sZWFuLCBCb29sZWFuICkiKTsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgLyogQHRvZG8KLSAgICAJc3RyYW5nZSAtIHRoaXMgd29ya3MgZmluZSBpbnNpZGUgZWNsaXBzZSBidXQgZmFpbHMgaW5zaWRlIE1hdmVuCi0gICAgCQotICAgICAgICBvID0gdGhpczsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgVGVzdC5kb2l0KCBCb29sZWFuLCBCb29sZWFuICkgLS0gZXhwZWN0IEJvb2xlYW4sIEJvb2xlYW4iKTsKLSAgICAgICAgby5kb2l0KHRydWUsIHRydWUpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBUZXN0LmRvaXQoIEJvb2xlYW4sIEludGVnZXIgKSAtLSBleHBlY3QgQm9vbGVhbiwgT2JqZWN0Iik7Ci0gICAgICAgIG8uZG9pdCh0cnVlLCA5KTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgVGVzdC5kb2l0KCBJbnRlZ2VyLCBCb29sZWFuICkgLS0gZXhwZWN0IE9iamVjdCwgQm9vbGVhbiIpOwotICAgICAgICBvLmRvaXQoOSwgdHJ1ZSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIFRlc3QuZG9pdCggSW50ZWdlciwgSW50ZWdlciApIC0tIGV4cGVjdCBPYmplY3QsIE9iamVjdCIpOwotICAgICAgICBvLmRvaXQoOSwgOSk7Ci0gICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL01vcmdhbnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Nb3JnYW5zQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiN2RjOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL01vcmdhbnNCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIE1vcmdhbiBIYW5raW5zCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIE1vcmdhbnNCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHJlc3VsdCA9IDQgKyAieCIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAiNHgiCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTmVzdGVkQ2xvc3VyZTJCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlMkJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFhNzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlMkJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydAotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgTmVzdGVkQ2xvc3VyZTJCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0gICAgIAotICAgIGYKLSAgICAgCi0gICAgdm9pZCB0ZXN0RmllbGRCdWcoKSB7Ci0gICAgCWNsb3N1cmUgPSB7Ci0gICAgCQlyZXR1cm4gewotCSAgICAJCWYgPSAxMjMKLQkgICAgCQlyZXR1cm4gbnVsbAotCSAgICAgICAgfQotCSAgICB9Ci0gICAgICAgIHZhbHVlID0gY2xvc3VyZSgpCi0gICAgICAgIHZhbHVlID0gdmFsdWUoKQotICAgICAgICBhc3NlcnQgZiA9PSAxMjMKLSAgICB9Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1Z091dHNpZGVPZlNjcmlwdCgpIHsKLSAgICAJYSA9IDEyMwotICAgIAliID0gNDU2Ci0gICAgCWNsb3N1cmUgPSB7IAotICAgIAkJcHJpbnRsbiBiCi0gICAgCQljID0gOTk5Ci0gICAgCQlyZXR1cm4gewotICAgIAkJCWYgPSAyMjIyMTExCi0gICAgCQkJCi0gICAgCQkJcHJpbnRsbiBmCi0gICAgCQkJCi0gICAgCQkJcHJpbnRsbiBjCi0gICAgCQkJZCA9IDY3OAotICAgIAkJCXJldHVybiB7IAotICAgIAkJCQlwcmludGxuIGYKLSAgICAJCQkJYXNzZXJ0IGYgPT0gMjIyMjExMQotICAgIAkJCQlwcmludGxuIGQKLSAgICAJCQkJcmV0dXJuIGEKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJYzIgPSBjbG9zdXJlKCkKLSAgICAJYzMgPSBjMigpCi0gICAgCXZhbHVlID0gYzMoKQotCi0JCWFzc2VydCBmID09IDIyMjIxMTEgICAgCQotICAgIAlhc3NlcnQgdmFsdWUgPT0gMTIzCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAJYXNzZXJ0U2NyaXB0ICIiIgotCSAgICAJYSA9IDEyMwotCSAgICAJY2xvc3VyZSA9IHsgCi0JICAgIAkJcmV0dXJuIHsKLQkgICAgCQkJcmV0dXJuIHsgCi0JICAgIAkJCQlyZXR1cm4gYQotCSAgICAJCQl9Ci0JICAgIAkJfQotCSAgICAJfQotCSAgICAJYzIgPSBjbG9zdXJlKCkKLQkgICAgCWMzID0gYzIoKQotCSAgICAJdmFsdWUgPSBjMygpCi0JICAgIAkKLQkgICAgCWFzc2VydCB2YWx1ZSA9PSAxMjMKLSIiIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwYWE5Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIE5lc3RlZENsb3N1cmVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAJYSA9IDEyMwotICAgIAlnZXRWYWx1ZXMoKS5lYWNoIHsgCi0gICAgCQlwcmludGxuIGl0Ci0gICAgCQlpdC5lYWNoIHsgCi0gICAgCQkJYXNzZXJ0IGEgPT0gMTIzCi0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgZ2V0VmFsdWVzKCkgewotICAgIAlbNSwgNiwgN10KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9OdWxsQ29tcGFyZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL051bGxDb21wYXJlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMjI5Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL051bGxDb21wYXJlQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBOdWxsQ29tcGFyZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIGFzc2VydCAiZG9nIiA+IG51bGwKLSAgICAgICAgYXNzZXJ0IG51bGwgPCAiZG9nIgotICAgICAgICBhc3NlcnQgbnVsbCA9PSBudWxsCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvT3ZlcmxvYWRJbnZva2VNZXRob2RCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9PdmVybG9hZEludm9rZU1ldGhvZEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlY2UzODAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9PdmVybG9hZEludm9rZU1ldGhvZEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotIAotY2xhc3MgT3ZlcmxvYWRJbnZva2VNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAJYSA9IG5ldyBPdmVybG9hZEEoKQotICAgIAlhLmR1aCgpCi0gICAgCQotICAgIAliID0gbmV3IE92ZXJsb2FkQigpCi0gICAgCWIuZHVoKCkKLSAgICB9Ci0KLX0KLQotY2xhc3MgT3ZlcmxvYWRBIHsKLSAgICAgICAgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHRoaXMsIG5hbWUsIGFyZ3MpCi0gICAgICAgICAgICAgICAgfSBjYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bG4gIk1pc3NpbmcgbWV0aG9kOiAke25hbWV9IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLX0KLQotY2xhc3MgT3ZlcmxvYWRCIGV4dGVuZHMgT3ZlcmxvYWRBIHsKLQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1ByaW1pdGl2ZVByb3BlcnR5QnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJpbWl0aXZlUHJvcGVydHlCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2JlZDc5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJpbWl0aXZlUHJvcGVydHlCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuYnVncwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqCi0gKiBGaXggQnVnIEdST09WWS02ODMKLSAqIEBhdXRob3IgUGlsaG8gS2ltCi0gKi8KLWNsYXNzIFByaW1pdGl2ZVByb3BlcnR5QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgICAKLSAgICBkb3VibGUgeDEKLSAgICBmbG9hdCB4MgotICAgIGxvbmcgeDMKLSAgICBpbnQgeDQKLSAgICBzaG9ydCB4NQotICAgIGJ5dGUgeDYKLSAgICBjaGFyIHg3Ci0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHkgPSBuZXcgUHJpbWl0aXZlUHJvcGVydHlCdWcoKSAKLSAgICAgICAgeS54MSA9IDEwLjAKLSAgICAgICAgeS54MiA9IDEwLjAKLSAgICAgICAgeS54MyA9IDEwLjAKLSAgICAgICAgeS54NCA9IDEwLjAKLSAgICAgICAgeS54NSA9IDEwLjAKLSAgICAgICAgeS54NiA9IDEwLjAKLSAgICAgICAgeS54NyA9IDEwLjAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB5LngxID09IDEwLjAKLSAgICAgICAgYXNzZXJ0IHkueDIgPT0gMTAuMAotICAgICAgICBhc3NlcnQgeS54MyA9PSAxMC4wCi0gICAgICAgIGFzc2VydCB5Lng0ID09IDEwLjAKLSAgICAgICAgYXNzZXJ0IHkueDUgPT0gMTAuMAotICAgICAgICBhc3NlcnQgeS54NiA9PSAxMC4wCi0gICAgICAgIGFzc2VydCB5LngxLmNsYXNzID09IERvdWJsZS5jbGFzcwotICAgICAgICBhc3NlcnQgeS54Mi5jbGFzcyA9PSBGbG9hdC5jbGFzcwotICAgICAgICBhc3NlcnQgeS54My5jbGFzcyA9PSBMb25nLmNsYXNzCi0gICAgICAgIGFzc2VydCB5Lng0LmNsYXNzID09IEludGVnZXIuY2xhc3MKLSAgICAgICAgYXNzZXJ0IHkueDUuY2xhc3MgPT0gU2hvcnQuY2xhc3MKLSAgICAgICAgYXNzZXJ0IHkueDYuY2xhc3MgPT0gQnl0ZS5jbGFzcwotICAgICAgICBhc3NlcnQgeS54Ny5jbGFzcyA9PSBDaGFyYWN0ZXIuY2xhc3MKLSAgICAgICAgYXNzZXJ0IHkueDEgKyB5LngxID09IHkueDEgKiAyCi0gICAgICAgIGFzc2VydCB5LngyIC0gMSA9PSA5LjBmCi0gICAgICAgIGFzc2VydCB5LngzICogMiA9PSAyMEwKLSAgICAgICAgYXNzZXJ0IHkueDQgPT0gMTAKLSAgICAgICAgYXNzZXJ0IHkueDUgPT0gMTAKLSAgICAgICAgYXNzZXJ0IHkueDYgKyAzID09IDEzCi0gICAgICAgIGFzc2VydCAiSGVsbG8iICsgeS54NyArICJXb3JsZCEiID09ICJIZWxsb1xuV29ybGQhIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJpbnRsbldpdGhOZXdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9QcmludGxuV2l0aE5ld0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDA5NjIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9QcmludGxuV2l0aE5ld0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgTWFyayBWb2xrbWFubiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgUHJpbnRsbldpdGhOZXdCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBwcmludGxuKG5ldyBGb28obmFtZTonYWJjJykpIAotICAgICAgICBwcmludGxuIG5ldyBGb28obmFtZTonZGVmJykgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Qcm9wZXJ0eUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Byb3BlcnR5QnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwN2RkNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Byb3BlcnR5QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uCi1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsCi0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBQcm9wZXJ0eUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBwYW5lbCA9IG5ldyBKUGFuZWwoKQotICAgICAgICBiZWFuID0gbmV3IEpCdXR0b24oKQotICAgICAgICAKLSAgICAgICAgcGFuZWwuYWRkKGJlYW4pCi0gICAgICAgIAotICAgICAgICB2YWx1ZSA9IGJlYW4ucGFyZW50Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUm9kc0Jvb2xlYW5CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQm9vbGVhbkJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmE1MmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQm9vbGVhbkJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgUm9kc0Jvb2xlYW5CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBpdGVtID0gImhpIgotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgYXNzZXJ0IGlzSXQoKQotICAgIH0KLSAgICAKLSAgICBpc0l0KCkgewotICAgICAgICByZXR1cm4gaXRlbSAhPSBudWxsICYmIGl0ZW0gPT0gImhpIgotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1JvZHNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzYzU0Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1JvZHNCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIFJvZCBDb3BlCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFJvZHNCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBkb1Rlc3QodHJ1ZSkKLSAgICAgICAgLyoKLSAgICAgICAgIHggPSAxCi0gICAgICAgICBpZiAoeCA+IDApIHsKLSAgICAgICAgIFN0cmluZyBuYW1lID0gIlJvZCIKLSAgICAgICAgIHByaW50bG4obmFtZSkKLSAgICAgICAgIH0KLSAgICAgICAgICovCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJ1ZzIoKSB7Ci0gICAgICAgIHggPSAxCi0gICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgLy9TdHJpbmcgbmFtZSA9ICJSb2QiCi0gICAgICAgICAgICBuYW1lID0gIlJvZCIKLSAgICAgICAgICAgIHByaW50bG4obmFtZSkKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvVGVzdChmbGFnKSB7Ci0gICAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJSb2QiCi0gICAgICAgICAgICAvL25hbWUgPSAiUm9kIgotICAgICAgICAgICAgZG9Bc3NlcnQobmFtZSkKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvVGVzdCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiUm9kIgotICAgICAgICBkb0Fzc2VydChuYW1lKQotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvQXNzZXJ0KHRleHQpIHsKLSAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbAotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1NjcmlwdEJ1Zy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TY3JpcHRCdWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4NTJmNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1NjcmlwdEJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdEJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCAicHJpbnRsbiAnaGVsbG8gd29ybGQnIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2VhbnNCdWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2VhbnNCdWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmMDM3NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1NlYW5zQnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkuYnVnczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiBAYXV0aG9yIFNlYW4gVGltbSAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFNlYW5zQnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29kZSA9ICJmb3IgKGkgaW4gMS4uMTApIFxue1xuICBwcmludGxuKGkpXG59IjsKLSAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKLSAgICAgICAgc2hlbGwuZXZhbHVhdGUoY29kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hcmt1cEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgInBhY2thZ2UgZ3Jvb3Z5LnhtbCIsCi0gICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgImIgPSBuZXcgTWFya3VwQnVpbGRlcigpIiwKLSAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAiYi5yb290MShhOjUsIGI6NykgeyAiLAotICAgICAgICAgICAgICAgICIgICAgZWxlbTEoJ2hlbGxvMScpICIsCi0gICAgICAgICAgICAgICAgIiAgICBlbGVtMignaGVsbG8yJykgIiwKLSAgICAgICAgICAgICAgICAiICAgIGVsZW0zKHg6NykgIiwKLSAgICAgICAgICAgICAgICAifSIgfTsKLSAgICAgICAgU3RyaW5nIGNvZGUgPSBhc0NvZGUobGluZXMpOwotICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOwotICAgICAgICBzaGVsbC5ldmFsdWF0ZShjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgYXJyYXkgb2YgbGluZXMgb2YgdGV4dCBpbnRvIG9uZSBzdHJpbmcgd2l0aCBuZXdsaW5lcwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYXNDb2RlKFN0cmluZ1tdIGxpbmVzKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZXNbaV0pOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TaW1wbGVNb2RlbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TaW1wbGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNkMWQzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2ltcGxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5idWdzOwotCi0vKioKLSAqIEBhdXRob3IgCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbCB7Ci0gICAgcHVibGljIFN0cmluZyBzOwotCi0gICAgU2ltcGxlTW9kZWwgKCkgewotICAgICAgICBzPSJIaSEiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNpbXBsZU1vZGVsIHNpbXAgPSBuZXcgU2ltcGxlTW9kZWwoKTsKLSAgICAgICAgc2ltcC5zaG93KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdlYzVlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljQ2xvc3VyZVByb3BlcnR5QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKiAKLSAqIEBhdXRob3IgUm9iZXJ0IEt1emVsagotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBTdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBzdGF0aWMgb3V0ID0ge1N5c3RlbS5vdXQucHJpbnRsbihpdCl9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q2FsbFN0YXRpY0Nsb3N1cmUoKSB7Ci0gICAgICAgIGNhbGxTdGF0aWNDbG9zdXJlKCkKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGNhbGxTdGF0aWNDbG9zdXJlKCkgewotICAgICAgICBvdXQoIlRFU1QiKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWFya3VwQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWFya3VwQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ZjBkOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01hcmt1cEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCi0KLWNsYXNzIFN0YXRpY01hcmt1cEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgZG9NYXJrdXAobmV3IE1hcmt1cEJ1aWxkZXIoKSkKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZG9NYXJrdXAoYnVpbGRlcikgewotICAgICAgICBidWlsZGVyLmh0bWwgewotICAgICAgICAgICAgaGVhZCB7Ci0gICAgICAgICAgICAgICAgdGl0bGUoIkdyb292eSIpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RDYWxsQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWV0aG9kQ2FsbEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGEzOTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RDYWxsQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotLyoqIAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBTdGF0aWNNZXRob2RDYWxsQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICB2YWx1ZSA9IFRlc3RTdXBwb3J0Lm1vY2tTdGF0aWNNZXRob2QoKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNoZWVzZSIKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3RhdGljUHJvcGVydHkoKSB7Ci0gICAgICAgIHZhbHVlID0gVGVzdFN1cHBvcnQubW9ja1N0YXRpY1Byb3BlcnR5Ci0gICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiY2hlZXNlIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3Vic2NyaXB0QW5kRXhwcmVzc2lvbkJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1N1YnNjcmlwdEFuZEV4cHJlc3Npb25CdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjljYTE1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3Vic2NyaXB0QW5kRXhwcmVzc2lvbkJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jbGFzcyBTdWJzY3JpcHRBbmRFeHByZXNzaW9uQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgZm9vID0gWyJuaWNlIGNoZWVzZSBncm9tbWl0Il0KLSAgICAgICAgCi0gICAgICAgIGNoZWVzZSA9IGZvb1swXS5zdGFydHNXaXRoKCJuaWNlIikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjaGVlc2UgPT0gdHJ1ZQotICAgIH0KLQotICAgIHZvaWQgdGVzdFN1YnNjcmlwdEluY3JlbWVudCgpIHsKLSAgICAgICAgZm9vID0gWzUsIDYsIDddCi0gICAgICAgIGZvb1swXSArPSA1Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgZm9vWzBdID09IDEwCi0gICAgICAgIAotICAgICAgICBpID0gMAotICAgICAgICBmb29baSsrXSA9IDEKLSAgICAgICAgYXNzZXJ0IGZvb1swXSA9PSAxCi0gICAgICAgIGFzc2VydCBpID09IDEKLSAgICAgICAgCi0gICAgICAgIGZvb1tpKytdICs9IDUKLSAgICAgICAgYXNzZXJ0IGkgPT0gMgotICAgICAgICBhc3NlcnQgZm9vWzFdID09IDExCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0TGFyZ2VTdWJzY3JpcHQoKSB7Ci0gICAgICAgIGZvbyA9IFsxXQotICAgICAgICAKLSAgICAgICAgZm9vWzEwXSA9IDEyMwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGZvb1sxMF0gPT0gMTIzCi0gICAgICAgIAotICAgICAgICBmb28ucHV0QXQoMTIsIDU1KQotICAgICAgICBhc3NlcnQgZm9vWzEyXSA9PSA1NQotICAgICAgICAKLSAgICAgICAgaSA9IDIwCi0gICAgICAgIGZvb1tpXSA9IDEKLSAgICAgICAgZm9vW2krK10gKz0gNQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGkgPT0gMjEKLSAgICAgICAgYXNzZXJ0IGZvb1syMF0gPT0gNgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3REb3VibGVTdWJzY3JpcHQoKSB7Ci0gICAgICAgIGZvbyA9IFsibmljZSBjaGVlc2UgZ3JvbW1pdCJdCi0gICAgICAgIAotICAgICAgICBjaGVlc2UgPSBmb29bMF1bNS4uMTBdCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgY2hlZXNlID09ICJjaGVlc2UiCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFN1YnNjcmlwdEFuZFByb3BlcnR5KCkgewotICAgICAgICBmb28gPSBbWydncm9taXQnOidjaGVlc2UnXV0KLSAgICAgICAgCi0gICAgICAgIGNoZWVzZSA9IGZvb1swXS5ncm9taXQKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjaGVlc2UgPT0gImNoZWVzZSIKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblByaW1pdGl2ZVR5cGVBcnJheUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1N1YnNjcmlwdE9uUHJpbWl0aXZlVHlwZUFycmF5QnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmNmQ4Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1N1YnNjcmlwdE9uUHJpbWl0aXZlVHlwZUFycmF5QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotY2xhc3MgU3Vic2NyaXB0T25QcmltaXRpdmVUeXBlQXJyYXlCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0gICAgaW50W10gaWE7ICAvLyB0eXBlIGlzIG5vdCBuZWNlc3NhcnkKLSAgICBpbnQgaTE7Ci0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBhcnJheSA9IGdldEludEFycmF5KCkgLy8gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFtJLCB0cnVlIHByaW1pdGl2ZSBhcnJheQotICAgICAgICAKLSAgICAgICAgdmFsdWUgPSBhcnJheVsyXQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDMKLSAgICAgICAgCi0gICAgICAgIGFycmF5WzJdID0gOAotCi0gICAgICAgIHZhbHVlID0gYXJyYXlbMl0KLSAgICAgICAgYXNzZXJ0IHZhbHVlID09IDgKLSAgICAgICAgCi0gICAgICAgIC8vIGxldHMgdGVzdCBhIHJhbmdlCi0gICAgICAgIHJhbmdlID0gYXJyYXlbMS4uMl0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByYW5nZSA9PSBbMiwgOF0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RHcm9vdnlJbnRBcnJheSgpIHsKLSAgICAgICAgaWEgPSBuZXcgaW50W117MSwgMn0gLy8gdGhpcyBpcyByZWFsbHkgSW50ZWdlcltdCi0gICAgICAgIGludFtdIGlhMSA9IGlhOyAvLyB0eXBlIGlzIG5vdCBuZWNlc3NhcnkKLSAgICAgICAgaTEgPSBpYTFbMF0KLSAgICAgICAgaW50IGkyID0gaTEKLSAgICAgICAgYXNzZXJ0IGkyID09IDEKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblN0cmluZ0FycmF5QnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3Vic2NyaXB0T25TdHJpbmdBcnJheUJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZWY4YjUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblN0cmluZ0FycmF5QnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKLQotY2xhc3MgU3Vic2NyaXB0T25TdHJpbmdBcnJheUJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHZvaWQgdGVzdEFycmF5U3Vic2NyaXB0KCkgewotICAgICAgICBhcnJheSA9IGdldE1vY2tBcmd1bWVudHMoKQotIAotICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gImIiCi0gICAgICAgIAotICAgICAgICBhcnJheVswXSA9ICJkIgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5WzBdID09ICJkIgotICAgICAgICAKLSAgICAgICAgcHJpbnRsbigiQ29udGVudHMgb2YgYXJyYXkgYXJlICR7YXJyYXkuaW5zcGVjdCgpfSIpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFJvYnNUZXN0Q2FzZSgpIHsKLSAgICAgICAgYXJyYXkgPSAib25lIHR3byB0aHJlZSIuc3BsaXQoIiAiKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09ICJ0d28iCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2QyQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2QyQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhOGM2YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1N1cGVyTWV0aG9kMkJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLSAKLWNsYXNzIFN1cGVyTWV0aG9kMkJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgIAliYXNlID0gbmV3IFN1cGVyQmFzZSgpCi0gICAgCXZhbHVlID0gYmFzZS5kb1NvbWV0aGluZygpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiVGVzdEJhc2UiCi0gICAgCQotICAgIAkKLSAgICAJYmFzZSA9IG5ldyBTdXBlckRlcml2ZWQoKQotICAgIAl2YWx1ZSA9IGJhc2UuZG9Tb21ldGhpbmcoKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlRlc3REZXJpdmVkVGVzdEJhc2UiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0QnVnMigpIHsKLSAgICAJYmFzZSA9IG5ldyBTdXBlckJhc2UoKQotICAgIAl2YWx1ZSA9IGJhc2UuZm9vKDIpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiVGVzdEJhc2UyIgotICAgIAkKLSAgICAJCi0gICAgCWJhc2UgPSBuZXcgU3VwZXJEZXJpdmVkKCkKLSAgICAJdmFsdWUgPSBiYXNlLmZvbygzKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gIlRlc3REZXJpdmVkM1Rlc3RCYXNlMyIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCdWczKCkgewotICAgIAliYXNlID0gbmV3IFN1cGVyQmFzZSgpCi0gICAgCXZhbHVlID0gYmFzZS5mb28oMiwzKQotICAgIAlhc3NlcnQgdmFsdWUgPT0gImZvbyh4LHkpQmFzZTIsMyIKLSAgICAJCi0gICAgCQotICAgIAliYXNlID0gbmV3IFN1cGVyRGVyaXZlZCgpCi0gICAgCXZhbHVlID0gYmFzZS5mb28oMyw0KQotICAgIAlhc3NlcnQgdmFsdWUgPT0gImZvbyh4LHkpRGVyaXZlZDMsNGZvbyh4LHkpQmFzZTMsNCIKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RCdWc0KCkgewotICAgIAliYXNlID0gbmV3IFN1cGVyQmFzZSgiQ2hlZXNlIikKLSAgICAJdmFsdWUgPSBiYXNlLm5hbWUKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJDaGVlc2UiCi0gICAgCQotICAgIAkKLSAgICAJYmFzZSA9IG5ldyBTdXBlckRlcml2ZWQoIkNoZWVzZSIpCi0gICAgCXZhbHVlID0gYmFzZS5uYW1lCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiQ2hlZXNlRGVyaXZlZCIKLSAgICB9Ci19Ci0KLWNsYXNzIFN1cGVyQmFzZSB7Ci0gICAgU3RyaW5nIG5hbWUKLQotICAgIFN1cGVyQmFzZSgpIHsKLSAgICB9Ci0gICAgCi0gICAgU3VwZXJCYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWUKLSAgICB9Ci0gICAgCi0gICAgZG9Tb21ldGhpbmcoKSB7Ci0gICAgCSJUZXN0QmFzZSIKLSAgICB9Ci0KLSAgICBmb28ocGFyYW0pIHsKLSAgICAJIlRlc3RCYXNlIiArIHBhcmFtCi0gICAgfQotICAgIAotICAgIGZvbyh4LCB5KSB7Ci0gICAgCSJmb28oeCx5KUJhc2UiICsgeCArICIsIiArIHkKLSAgICB9Ci19Ci0KLWNsYXNzIFN1cGVyRGVyaXZlZCBleHRlbmRzIFN1cGVyQmFzZSB7Ci0gICAgCi0JY2FsbHMgPSAwCi0JCi0JU3VwZXJEZXJpdmVkKCkgewotCX0KLQkKLQlTdXBlckRlcml2ZWQoU3RyaW5nIG5hbWUpIHsKLQkgICAgc3VwZXIobmFtZSArICJEZXJpdmVkIikKLQl9Ci0JCi0gICAgZG9Tb21ldGhpbmcoKSB7Ci0gICAgCS8qKiBAdG9kbyArK2NhbGxzIGNhdXNlcyBidWcgKi8KLSAgICAJLy9jYWxscysrCi0gICAgCS8qCi0gICAgCWNhbGxzID0gY2FsbHMgKyAxCi0gICAgCWFzc2VydCBjYWxscyA8IDMKLSAgICAJKi8KLSAgICAJCi0gICAgCSJUZXN0RGVyaXZlZCIgKyBzdXBlci5kb1NvbWV0aGluZygpCi0gICAgfQotCQotICAgIGZvbyhwYXJhbSkgewotICAgIAkiVGVzdERlcml2ZWQiICsgcGFyYW0gKyBzdXBlci5mb28ocGFyYW0pCi0gICAgfQotCQotICAgIGZvbyh4LCB5KSB7Ci0gICAgCSJmb28oeCx5KURlcml2ZWQiICsgeCArICIsIiArIHkgKyBzdXBlci5mb28oeCwgeSkKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2RCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdXBlck1ldGhvZEJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGYwZWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdXBlck1ldGhvZEJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgU3VwZXJNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAJYmFzZSA9IG5ldyBUZXN0QmFzZSgieXl5IikKLSAgICAJdmFsdWUgPSBiYXNlLmRvU29tZXRoaW5nKCkKLSAgICAJYXNzZXJ0IHZhbHVlID09ICJUZXN0QmFzZSIKLSAgICAJCi0gICAgCWJhc2UgPSBuZXcgVGVzdERlcml2ZWQoImFiYyIpCi0gICAgCXZhbHVlID0gYmFzZS5kb1NvbWV0aGluZygpCi0gICAgCWFzc2VydCB2YWx1ZSA9PSAiVGVzdERlcml2ZWRUZXN0QmFzZSIKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVkc0Nsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZWRzQ2xvc3VyZUJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTdiZDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZWRzQ2xvc3VyZUJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCi0KLS8qKgotICogQGF1dGhvciBUZWQgTGV1bmcKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgVGVkc0Nsb3N1cmVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotCQlmID0gbmV3IEZlZWQoKQotCQkKLQkJZi5hdXRob3IgPSBuZXcgUGVyc29uKG5hbWU6J1RlZCBMZXVuZycsdXJsOidodHRwOi8vd3d3LnNhdXJpYS5jb20vYmxvZycsIGVtYWlsOid0d2xAc2F1cmlhLmNvbScpCi0JCQotCQlmLmVudHJpZXMgPSBbIG5ldyBFbnRyeSh0aXRsZTonb25lJyxzdW1tYXJ5OidmaXJzdCBwb3N0JyksIG5ldyBFbnRyeSh0aXRsZTondHdvJyxzdW1tYXJ5Oid0aGUgc2Vjb25kIHBvc3QnKSwgbmV3IEVudHJ5KHRpdGxlOid0aHJlZScsIHN1bW1hcnk6J3Bvc3QgdGhlIHRoaXJkJyksIG5ldyBFbnRyeSh0aXRsZTonZm91cicsc3VtbWFyeTondGhlIHBvbmRlcm91cyBmb3VydGggcG9zdCcpIF0KLQkJCi0JCS8vZi5lbnRyaWVzLmVhY2ggeyBwcmludGxuIGl0LnRpdGxlIH0KLQkJLy9wcmludGxuIGYuYXV0aG9yLm5hbWUKLQkJCi0JCXhtbCA9IG5ldyBNYXJrdXBCdWlsZGVyKCkKLQkJCi0JCWF0b20gPSB4bWwuYXRvbSgpIHsKLQkJICB0aXRsZSgiVGVkIExldW5nIG9mZiB0aGUgYWlyIikKLQkJICBsaW5rKCJodHRwOi8vd3d3LnNhdXJpYS5jb20vbm9ibG9nIikKLQkJICBhdXRob3IoKSB7Ci0JCSAgICBwZXJzb24oKSB7Ci0JCSAgICAgIG5hbWUoZi5hdXRob3IubmFtZSkKLQkJICAgICAgdXJsKGYuYXV0aG9yLnVybCkKLQkJICAgICAgZW1haWwoZi5hdXRob3IuZW1haWwpCi0JCSAgICB9Ci0JCSAgfQotCQkgIGZvciAoZSBpbiBmLmVudHJpZXMpIHsKLQkJICAgIGVudHJ5KCkgewotCQkgICAgCS8qKiBAdG9kbyBpZiB1c2UgdGhlIG5vbi1leGlzdGVudCB0aXRsZSgpIG1ldGhvZCB0aGVuIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiBpcyB0aHJvd24gKi8KLQkJICAgIAkKLQkJICAgICAgdGl0bGUoZS50aXRsZSkKLQkJICAgICAgc3VtbWFyeShlLnN1bW1hcnkpCi0JCSAgICB9Ci0JCSAgfQotCQl9Ci0JfSAgIAotfQotCi0KLWNsYXNzIEZlZWQgewotICAgIFN0cmluZyB0aXRsZQotICAgIFN0cmluZyBsaW5rCi0gICAgUGVyc29uIGF1dGhvcgotICAgIFN0cmluZyB0YWdsaW5lCi0gICAgU3RyaW5nIGdlbmVyYXRvcgotICAgIFN0cmluZyBjb3B5cmlnaHQKLSAgICBTdHJpbmcgbW9kaWZpZWQKLSAgICBMaXN0IGVudHJpZXMKLX0KLQotY2xhc3MgRW50cnkgewotICAgIFN0cmluZyB0aXRsZQotICAgIFN0cmluZyBsaW5rCi0gICAgU3RyaW5nIGlkCi0gICAgU3RyaW5nIHN1bW1hcnkKLSAgICBTdHJpbmcgY29udGVudAotICAgIFBlcnNvbiBhdXRob3IKLSAgICBTdHJpbmcgY3JlYXRlZAotICAgIFN0cmluZyBpc3N1ZWQKLSAgICBTdHJpbmcgbW9kaWZpZWQKLX0KLQotY2xhc3MgUGVyc29uIHsKLSAgICBTdHJpbmcgbmFtZQotICAgIFN0cmluZyB1cmwKLSAgICBTdHJpbmcgZW1haWwKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdEJhc2UuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0QmFzZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjVjYmIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0QmFzZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdGluZyBjb25zdHJ1Y3RvcnMKLSAqIAotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLSBjbGFzcyBUZXN0QmFzZSB7Ci0KLSAgICAgU3RyaW5nIGZvbwotICAgICAKLSAgICAgVGVzdEJhc2UoKSB7Ci0gICAgIH0KLSAgICAgCi0gICAgIFRlc3RCYXNlKFN0cmluZyBhRm9vKSB7Ci0gICAgICAgICB0aGlzLmZvbyA9IGFGb28KLSAgICAgfQotICAgICAvKiogQHRvZG8gZml4IGJ1ZwotICAgICAqLwotICAgICAKLSAgICAgZG9Tb21ldGhpbmcoKSB7Ci0gICAgIAkiVGVzdEJhc2UiCi0gICAgIH0KLSB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0Q2FzZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RDYXNlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmNjc2My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RDYXNlQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFRlc3RDYXNlQnVnIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIFRlc3RDYXNlQnVnKFN0cmluZyBuYW1lKSB7Ci0gICAgCQlzdXBlcihuYW1lKQotICAgIAl9Ci0gICAgCQotICAgIAl2b2lkIHRlc3REdW1teSgpIHsKLSAgICAJCXByaW50bG4gIndvcmtlZCEiCi0gICAgCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3REZXJpdmVkLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdERlcml2ZWQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRmZDNmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdERlcml2ZWQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqCi0gKiBBIGJhc2UgY2xhc3MgZm9yIHRlc3RpbmcgY29uc3RydWN0b3JzCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotCi0gY2xhc3MgVGVzdERlcml2ZWQgZXh0ZW5kcyBUZXN0QmFzZSB7Ci0KLSAgICAgVGVzdERlcml2ZWQoU3RyaW5nIGFGb28pIHsKLSAgICAgICAgIHN1cGVyKGFGb28pCi0gICAgIH0KLSAgICAgCi0gICAgIGRvU29tZXRoaW5nKCkgewotICAgICAJIlRlc3REZXJpdmVkIiArIHN1cGVyLmRvU29tZXRoaW5nKCkKLSAgICAgfQotIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RTdXBwb3J0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODA4OTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0U3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vY2tBcmd1bWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vY2tTdGF0aWNNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAiY2hlZXNlIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9ja1N0YXRpY1Byb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gImNoZWVzZSI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2V0SW50QXJyYXkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50W10geyAxLCAyLCAzLCA0LCA1IH07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIGN1c3RvbSBpdGVyYXRvcigpIG1ldGhvZCBmb3IgIiArIHRoaXMpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0TW9ja0FyZ3VtZW50cygpKS5pdGVyYXRvcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVG9TdHJpbmdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Ub1N0cmluZ0J1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjkzNGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Ub1N0cmluZ0J1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgVG9TdHJpbmdCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAJcHJpbnRsbiAiU3RhcnRpbmcgdGVzdCIKLSAgICAJCi0gICAgCXZhbHVlID0gdG9TdHJpbmcoKQotICAgIAlhc3NlcnQgdmFsdWUgIT0gbnVsbAotICAgIAkKLSAgICAJcHJpbnRsbiB2YWx1ZQotICAgIAlwcmludGxuICJGb3VuZCB2YWx1ZSAke3ZhbHVlfSIKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbaGV5XSIKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UcnlDYXRjaDJCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UcnlDYXRjaDJCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjcyMmVkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVHJ5Q2F0Y2gyQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKgotICogQGF1dGhvciBNb3JnYW4gSGFua2lucyAKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgVHJ5Q2F0Y2gyQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgCi0gICAgICAgIH0gCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEJ1ZzIoKSB7Ci0gICAgCXRyeSB7Ci0gICAgCQl4ID0gMTIzCi0gICAgCX0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9UcnlDYXRjaEJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4OGFiZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKgotICogQGF1dGhvciBKb2huIFdpbHNvbgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBUcnlDYXRjaEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmludGxuKCJIZWxsbyIpCi0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBwcmludGxuKCJGaW5hbGx5IikKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Vua25vd25WYXJpYWJsZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1Vua25vd25WYXJpYWJsZUJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmM5Y2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Vbmtub3duVmFyaWFibGVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFVua25vd25WYXJpYWJsZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdEJ1ZygpIHsKLSAgICAgICAgc2hvdWxkRmFpbCB7Ci0gICAgICAgICAgICBwcmludGxuKGZvbykKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1VzZUNsb3N1cmVJbkNsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9Vc2VDbG9zdXJlSW5DbG9zdXJlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhNzMxNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1VzZUNsb3N1cmVJbkNsb3N1cmVCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFVzZUNsb3N1cmVJbkNsb3N1cmVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgICAgICBjbG9zdXJlID0geyBwcmludGxuIGl0IH0KLSAgICAgICAgCi0gICAgICAgIGFub3RoZXJDbG9zdXJlID0geyBjbG9zdXJlKGl0KSB9Ci0gICAgICAgIGFub3RoZXJDbG9zdXJlKCJIZWxsbyIpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlU3RhdGljSW5DbG9zdXJlQnVnLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlU3RhdGljSW5DbG9zdXJlQnVnLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjMzQzMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1VzZVN0YXRpY0luQ2xvc3VyZUJ1Zy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotY2xhc3MgVXNlU3RhdGljSW5DbG9zdXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgc3RhdGljIHN0dWZmID0gWzpdCi0KLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIFsxLDIsM10uZWFjaCB7IHN0dWZmW2l0XSA9ICJkb2ciIH0KLQotICAgICAgICBhc3NlcnQgc3R1ZmYuc2l6ZSgpID09IDMKLSAgICAgICAgYXNzZXJ0IHN0dWZmWzJdID09ICJkb2ciCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0QnVnMigpIHsKLSAgICAgICAgZG9TdGF0aWMoKQotICAgIH0KLQotICAgIHN0YXRpYyBkb1N0YXRpYygpIHsKLSAgICAgICAgWzEsMiwzXS5lYWNoIHsgc3R1ZmZbaXRdID0gImRvZyIgfQotCi0gICAgICAgIGFzc2VydCBzdHVmZi5zaXplKCkgPT0gMwotICAgICAgICBhc3NlcnQgc3R1ZmZbMl0gPT0gImRvZyIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlUHJlY2VkZW5jZS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlUHJlY2VkZW5jZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NzhmYTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9WYXJpYWJsZVByZWNlZGVuY2UuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFZhcmlibGVQcmVjZWRlbmNlIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdFZhcmlhYmxlUHJlY2VkZW5jZSgpIHsKLSAKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCA8PDwtRU9GCi0gICAgICAgICAgICBjbGFzcyBWYXJpYWJsZUZvbyB7Ci0gICAgICAgICAgICAgICAgeCA9IDEwMAotICAgICAgICAgICAgICAgIHkgPSA5MwotICAgICAgICAgICAgICAgIGMgPSB7fHh8IGFzc2VydCB4ID09IDE7IGFzc2VydCB5ID09IDkzOyB9Ci0gICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZmb28gPSBuZXcgVmFyaWFibGVGb28oKQotICAgICAgICAgICAgICAgICAgICB2Zm9vLmMuY2FsbCgxKQotCi0gICAgICAgICAgICAgICAgICAgIHogPSA4NzQ7Ci0gICAgICAgICAgICAgICAgICAgIDEudGltZXMgeyBhc3NlcnQgdmZvby54ID09IDEwMDsgYXNzZXJ0IHogPT0gODc0OyB6ID0gMzk7IH0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHogPT0gMzk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdmZvby5sb2NhbCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZvaWQgbG9jYWwoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2FsbCgxKTsKLQotICAgICAgICAgICAgICAgICAgICB6ID0gODc0OwotICAgICAgICAgICAgICAgICAgICAxLnRpbWVzIHsgYXNzZXJ0IHggPT0gMTAwOyBhc3NlcnQgeiA9PSA4NzQ7IHogPSAzOTsgfQotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgeiA9PSAzOTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfQotCi0gICAgICAgIEVPRiApOwotCi0gICAgfQotCi0KLS8qCi0gKiBDVVJSRU5UTFkgQlJPS0VOLiAgVmFyaWFibGUgc2NvcGluZyBuZWVkcyBhbiBvdmVyaGF1bCB0bwotICogZml4IGl0LgotICoKLSAgICB2b2lkIHRlc3RWYXJpYWJsZVByZWNlZGVuY2VJblNjcmlwdCgpIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KCA8PDwtRU9GCi0gICAgICAgICAgICBjID0geyB8eHwgYXNzZXJ0IHggPT0gMTsgYXNzZXJ0IHkgPT0gOTM7IH0KLSAgICAgICAgICAgIHggPSAxMDA7Ci0gICAgICAgICAgICB5ID0gOTM7Ci0KLSAgICAgICAgICAgIGMuY2FsbCgxKTsKLSAgICAgICAgRU9GKTsKLSAgICB9Ci0gKi8KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9WYXJpYWJsZVNjb3BpbmdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9WYXJpYWJsZVNjb3BpbmdCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFmYjYzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVmFyaWFibGVTY29waW5nQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1jbGFzcyBWYXJpYWJsZVNjb3BpbmdCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QnVnKCkgewotICAgIAkvLyB1bmRlY2xhcmVkIHZhcmlhYmxlIHgKLSAgICAJCi0gICAgCXNob3VsZEZhaWwgewotCQkJZm9yICh6IGluIDAuLjIpIHsKLQkgICAgCQl4ID0gbWFrZUNvbGxlY3Rpb24oKQotCQkJfQotCQkgICAJCi0JCSAgIAlmb3IgKHQgaW4gMC4uMykgewotCQkgICAgCWZvciAoeSBpbiB4KSB7Ci0JCSAgICAJCXByaW50bG4geAotCQkgICAgCX0KLQkJICAgCX0KLQkgICAJfQotCX0KLQotICAgIHZvaWQgdGVzdFZhcmlhYmxlUmV1c2UoKSB7Ci0JCWZvciAoeiBpbiAwLi4yKSB7Ci0gICAgCQl4ID0gbWFrZUNvbGxlY3Rpb24oKQotCQl9Ci0JICAgCQotCSAgIAlmb3IgKHQgaW4gMC4uMykgewotICAgIAkgICAgeCA9IDEyMwotICAgIAkJcHJpbnRsbiB4Ci0JICAgCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgbWFrZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBbMSwgMiwgM10KLQl9ICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9ab2hhcnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvYnVncy9ab2hhcnNCdWcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGNlYjljLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvWm9oYXJzQnVnLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKgotICogQGF1dGhvciBab2hhciBNZWxhbWVkCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFpvaGFyc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RCdWcoKSB7Ci0gICAgICAgIHZhbHVlcyA9IFsxLDIsMyw0XQotICAgICAgICByZXN1bHQgPSBibG9vKHZhbHVlcywge2l0ID4gMX0pCi0gICAgICAgIHJlc3VsdC5lYWNoe3ByaW50bG4oaXQpfQotICAgIH0KLSAgICAKLSAgICBibG9vKGEsYil7Ci0gICAgICAgIHJldHVybiBhLmZpbmRBbGx7Yi5jYWxsKGl0KX0KLSAgICB9ICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2dwYXRoL0dQYXRoVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9ncGF0aC9HUGF0aFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTcwNTBkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2dwYXRoL0dQYXRoVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0KLQotLyoqCi0gKiBTb21lIEdQYXRoIHRlc3RzIHVzaW5nIG1hcHMgYW5kIGxpc3RzCi0gKi8KLWNsYXNzIEdQYXRoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RTaW1wbGVHUGF0aEV4cHJlc3Npb25zKCkgewotICAgICAgICB0cmVlID0gY3JlYXRlVHJlZSgpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdHJlZS5wZW9wbGUuZmluZCB7IGl0Lm5hbWUgPT0gJ0phbWVzJyB9LmxvY2F0aW9uID09ICdMb25kb24nCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgdHJlZS5wZW9wbGUubmFtZSA9PSBbJ0phbWVzJywgJ0JvYiddCi0KLSAgICAgICAgZXhwZWN0ZWQgPSBbJ0phbWVzIHdvcmtzIG9uIDIgcHJvamVjdChzKScsICdCb2Igd29ya3Mgb24gMiBwcm9qZWN0KHMpJ10KLSAgICAgICAgYXNzZXJ0IHRyZWUucGVvcGxlLmZpbmRBbGwgeyBpdC5wcm9qZWN0cy5zaXplKCkgPiAxIH0uY29sbGVjdCB7IGl0Lm5hbWUgKyAnIHdvcmtzIG9uICcgKyBpdC5wcm9qZWN0cy5zaXplKCkgKyAiIHByb2plY3QocykiIH0gPT0gZXhwZWN0ZWQKLX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgY3JlYXRlVHJlZSgpIHsgICAgICAgCi0gICAgICAgIHJldHVybiBbCQotICAgICAgICAgICAgJ3Blb3BsZSc6IFsKLSAgICAgICAgICAgICAgICBbJ25hbWUnIDogJ0phbWVzJywgJ2xvY2F0aW9uJzonTG9uZG9uJywgJ3Byb2plY3RzJzpbJ2dlcm9uaW1vJywgJ2dyb292eSddIF0sCi0gICAgICAgICAgICAgICAgWyduYW1lJyA6ICdCb2InLCAnbG9jYXRpb24nOidBdGxhbnRhJywgJ3Byb2plY3RzJzpbJ2Ryb29scycsICdncm9vdnknXSBdCi0JCQldIAotCQldCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvZ3BhdGgvTm9kZUdQYXRoVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9ncGF0aC9Ob2RlR1BhdGhUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3YTFmYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9ncGF0aC9Ob2RlR1BhdGhUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQotCi0vKioKLSAqIFNvbWUgR1BhdGggdGVzdHMgdXNpbmcgdHJlZXMKLSAqLwotY2xhc3MgTm9kZUdQYXRoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RTaW1wbGVHUGF0aEV4cHJlc3Npb25zKCkgewotICAgICAgICB0cmVlID0gY3JlYXRlVHJlZSgpCi0KLSAgICAgICAgYXNzZXJ0IHRyZWUucGVyc29uLmZpbmQgeyBpdFsnQG5hbWUnXSA9PSAnSmFtZXMnIH0ubG9jYXRpb25bMF1bJ0BuYW1lJ10gPT0gJ0xvbmRvbicKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RmluZEFsbCgpIHsKLSAgICAgICAgdHJlZSA9IGNyZWF0ZVRyZWUoKQotICAgICAgICAKLSAgICAgICAgY29sbCA9IHRyZWUucGVyc29uLmZpbmRBbGwgeyBpdFsnQG5hbWUnXSAhPSAnQm9iJyB9Ci0gICAgICAgIGFzc2VydCBjb2xsLnNpemUoKSA9PSAxCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdENvbGxlY3QoKSB7Ci0gICAgICAgIHRyZWUgPSBjcmVhdGVUcmVlKCkKLSAgICAgICAgCi0gICAgICAgIGNvbGwgPSB0cmVlLnBlcnNvbi5jb2xsZWN0IHsgaXRbJ0BuYW1lJ10gfQotICAgICAgICBhc3NlcnQgY29sbCA9PSBbJ0phbWVzJywgJ0JvYiddCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBjcmVhdGVUcmVlKCkgeyAgICAgICAKLSAgICAgICAgYnVpbGRlciA9IE5vZGVCdWlsZGVyLm5ld0luc3RhbmNlKCkKLSAgICAgICAgCi0gICAgICAgIHJvb3QgPSBidWlsZGVyLnBlb3BsZSgpIHsKLSAgICAgICAgICAgIHBlcnNvbihuYW1lOidKYW1lcycpIHsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbihuYW1lOidMb25kb24nKQotICAgICAgICAgICAgICAgIHByb2plY3RzIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdChuYW1lOidnZXJvbmltbycpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVyc29uKG5hbWU6J0JvYicpIHsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbihuYW1lOidBdGxhbnRhJykKLSAgICAgICAgICAgICAgICBwcm9qZWN0cyB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QobmFtZTonZHJvb2xzJykKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290ICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByb290Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvZ3JhdnkvQnVpbGQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvZ3JhdnkvQnVpbGQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI5YWJhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2dyYXZ5L0J1aWxkLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmdyYXZ5Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgYnVpbGQgcHJvY2VzcwotICovCi1jbGFzcyBCdWlsZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlhbnQgPSBuZXcgQW50QnVpbGRlcigpCi0JYXJncwotCXBvbQotCWRlZmF1bHRUYXJnZXRzID0gWydjbGVhbicsICdjb21waWxlJ10KLQkKLQlzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLQkJLy8gYXV0b2dlbmVyYXRlIHRoaXMKLQkJYiA9IG5ldyBCdWlsZChhcmdzKQotCQkvL2IuYXJncyA9IGFyZ3MKLQkJYi5ydW4oKQotCX0KLQkKLQlCdWlsZChzb21lQXJncykgewotCQlhcmdzID0gc29tZUFyZ3M7Ci0JCWlmIChhcmdzIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlhcmdzID0gW2FyZ3NdCi0JCX0KLQkJLyoKLQkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLnNpemUoKSA9PSAwKSB7Ci0JCQlhcmdzID0gZGVmYXVsdFRhcmdldHMKLQkJfQotCQkqLwotCX0KLQkKLQl2b2lkIHJ1bigpIHsKLQkJZm9yIChhIGluIGFyZ3MpIHsKLQkJCXByaW50bG4gIlRhcmdldDogJHthfSIKLQkJCWludm9rZU1ldGhvZChhLnRvU3RyaW5nKCksIG51bGwpCi0JCX0KLQl9Ci0JCi0JZ2V0UG9tKCkgewotCQlpZiAocG9tID09IG51bGwpIHsKLQkJCXBvbSA9IHBhcnNlUE9NKCkKLQkJfQotCQlyZXR1cm4gcG9tCi0JfQotCi0KLQkvLyBEZWZhdWx0IGdvYWxzCi0JY2xlYW4oKSB7Ci0JCWFudC5ybWRpcihkaXI6J2dyYXZ5JykKLQl9Ci0JCi0JY29tcGlsZSgpIHsKLQkJYW50Lm1rZGlyKGRpcjonZ3JhdnkvY2xhc3NlcycpCi0JCWFudC5jb21waWxlKHNyZGlyOidzcmMvbWFpbi9qYXZhJywgZGVzdGRpcjonZ3JhdnkvY2xhc3NlcycpIHsKLQkJCWZpbGVzZXQgewotCQkJCWluY2x1ZGVzKG5hbWU6JyoqLyouamF2YScpCi0JCQl9Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCBwYXJzZVBPTSgpIHsKLQkJcmV0dXJuIG5ldyBYbWxQYXJzZXIoKS5wYXJzZSgicHJvamVjdC54bWwiKQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9qMmVlL0NyZWF0ZURhdGEuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvajJlZS9DcmVhdGVEYXRhLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzMGMwMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9qMmVlL0NyZWF0ZURhdGEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy9pbXBvcnQgamF2YS5pby5GaWxlCi0KLS8vY29udGV4dCA9IHRoaXMuZ2V0UHJvcGVydHkoJ2NvbnRleHQnKQotCi0vL2xvZ0RpciA9IG5ldyBGaWxlKCdsb2dzJykKLS8vbG9nRGlyLm1rZGlyKCkKLQotcHJpbnRsbigiQ2FsbGVkIHdpdGggY29udGV4dDogIiArIGNvbnRleHQpCi0KLWRiID0gY29udGV4dC5sb29rdXAoIi9jbGllbnQvdG9vbHMvRGF0YWJhc2VIb21lIikuY3JlYXRlKCkKLQotcHJpbnRsbigiQWJvdXQgdG8gZG8gcXVlcmllcyBvbjogIiArIGRiKSAKLQotcXVlcmllcyA9IFsgICJDUkVBVEUgVEFCTEUgYWNjb3VudCAoIHNzbiBDSEFSKDExKSBQUklNQVJZIEtFWSwgZmlyc3RfbmFtZSBDSEFSKDIwKSwgbGFzdF9uYW1lIENIQVIoMjApLCBiYWxhbmNlIElOVCkiLAkJCSAKLSJDUkVBVEUgVEFCTEUgZW50aXR5ICggaWQgSU5UIFBSSU1BUlkgS0VZIEFVVE8gSU5DUkVNRU5ULCBmaXJzdF9uYW1lIENIQVIoMjApLCBsYXN0X25hbWUgQ0hBUigyMCkgKSJdCi0KLWZvciAoc3FsIGluIHF1ZXJpZXMpIHsKLSAgICBwcmludGxuKCJldmFsdWF0aW5nOiAiICsgc3FsKQotCWRiLmV4ZWN1dGUoc3FsKQotfQotCi1wcmludGxuKCJjcmVhdGluZyBlbnRpdHkgYmVhbiIpCi0KLWNvbnRleHQubG9va3VwKCIvY2xpZW50L3Rlc3RzL2VudGl0eS9ibXAvQmFzaWNCbXBIb21lIikuY3JlYXRlKCJHcm9vdnkgRGFpbiIpCi0KLXByaW50bG4oIkRvbmUiKQotCi0iT0siClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvajJlZS9KMmVlQ29uc29sZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvajJlZS9KMmVlQ29uc29sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZiMzRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2oyZWUvSjJlZUNvbnNvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkuajJlZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci0KLS8qKgotICogQSBKMkVFIGNvbnNvbGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEoyZWVDb25zb2xlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGhvbWUgW2NvbmZpZ3VhcmF0aW9uXSBbbG9jYWxjb3B5XSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGhvbWUgPSBhcmdzWzBdOwotCi0gICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3BlbmVqYi5ob21lIiwgaG9tZSk7Ci0gICAgICAgIHAucHV0KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksICJvcmcub3BlbmVqYi5jbGllbnQuTG9jYWxJbml0aWFsQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgcC5wdXQoIm9wZW5lamIubG9hZGVyIiwgImVtYmVkIik7Ci0gICAgICAgIHAucHV0KCJvcGVuZWpiLmhvbWUiLCBob21lKTsKLQotICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29uZiA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9wZW5lamIuY29uZmlndXJhdGlvbiIsIGNvbmYpOwotICAgICAgICAgICAgcC5wdXQoIm9wZW5lamIuY29uZmlndXJhdGlvbiIsIGNvbmYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb3B5ID0gYXJnc1syXTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3BlbmVqYi5sb2NhbGNvcHkiLCBjb3B5KTsKLSAgICAgICAgICAgIHAucHV0KCJvcGVuZWpiLmxvY2FsY29weSIsIGNvcHkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbml0aWFsQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbENvbnRleHQocCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCk7Ci0gICAgICAgICAgICBzaGVsbC5zZXRWYXJpYWJsZSgiY29udGV4dCIsIGN0eCk7Ci0gICAgICAgICAgICAvL3NoZWxsLmV2YWx1YXRlKCJzcmMvdGVzdC9ncm9vdnkvajJlZS9DcmVhdGVEYXRhLmdyb292eSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL3NoZWxsLmV2YWx1YXRlKCJzcmMvbWFpbi9ncm9vdnkvdWkvQ29uc29sZS5ncm9vdnkiKTsKLSAgICAgICAgICAgIEdyb292eU9iamVjdCBjb25zb2xlID0gKEdyb292eU9iamVjdCkgSW52b2tlckhlbHBlci5pbnZva2VDb25zdHJ1Y3RvcigiZ3Jvb3Z5LnVpLkNvbnNvbGUiLCBudWxsKTsKLSAgICAgICAgICAgIGNvbnNvbGUuc2V0UHJvcGVydHkoInNoZWxsIiwgc2hlbGwpOwotICAgICAgICAgICAgY29uc29sZS5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICovCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EZXJpdmVkU2NyaXB0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL0Rlcml2ZWRTY3JpcHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMzkwOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL0Rlcml2ZWRTY3JpcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAkSWQkdmVyc2lvbgotICogTm92IDIzLCAyMDAzIDk6MDI6NTUgUE0gJHVzZXIgRXhwICQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIFNhbSBQdWxsYXJhLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KLSAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5Ci0gKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KLSAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCi0gKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKLSAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCi0gKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotcGFja2FnZSBncm9vdnkubGFuZzsKLQotLyoqCi0gKiBBIGRlcml2ZWQgU2NyaXB0IHdoaWNoIGFkZHMgc29tZSAnZ2xvYmFsJyBtZXRob2RzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXJpdmVkU2NyaXB0IGV4dGVuZHMgU2NyaXB0IHsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlZXNlKCkgewotICAgICAgICByZXR1cm4gIkNoZWRkYXIiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGRvU29tZXRoaW5nKFN0cmluZyBmb29kKSB7Ci0gICAgICAgIHJldHVybiAiSSBsaWtlICIgKyBmb29kOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EdW1teUdTdHJpbmcuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvRHVtbXlHU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDVkYjEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EdW1teUdTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR1N0cmluZzsKLWltcG9ydCBncm9vdnkubGFuZy5NZXRhQ2xhc3M7Ci0KLQotLyoqCi0gKiBBIGhhbmQgY3JhZnRlZCBleGFtcGxlIEdTdHJpbmcKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIER1bW15R1N0cmluZyBleHRlbmRzIEdTdHJpbmcgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdHJpbmdzOwotICAgIHByaXZhdGUgTWV0YUNsYXNzIG1ldGFDbGFzczsKLSAgICAKLSAgICBwdWJsaWMgRHVtbXlHU3RyaW5nKE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICB0aGlzKHZhbHVlcywgbmV3IFN0cmluZ1tdIHsgIkhlbGxvICIsICIhIiB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIER1bW15R1N0cmluZyhPYmplY3RbXSB2YWx1ZXMsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgc3VwZXIodmFsdWVzKTsKLSAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5nczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gbWV0YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFDbGFzcyhNZXRhQ2xhc3MgbWV0YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMubWV0YUNsYXNzID0gbWV0YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7Ci0gICAgICAgIHJldHVybiBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHRoaXMsIG5hbWUsIGFyZ3VtZW50cyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9HU3RyaW5nVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9HU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDI4NTVmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR1N0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogJElkJAotICogCi0gKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgotICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKLSAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgotICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KLSAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQotICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKLSAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICogIAotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lmxhbmc7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1c2Ugb2YgdGhlIHN0cnVjdHVyZWQgQXR0cmlidXRlIHR5cGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEdTdHJpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGVPdmVyVGV4dCgpIHsKLSAgICAgICAgRHVtbXlHU3RyaW5nIGNvbXBTdHJpbmcgPSBuZXcgRHVtbXlHU3RyaW5nKG5ldyBPYmplY3RbXSB7ICJKYW1lcyIgfSk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgIkhlbGxvICIsICIhIiB9LCBjb21wU3RyaW5nLmdldFN0cmluZ3MoKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICJKYW1lcyIgfSwgY29tcFN0cmluZy5nZXRWYWx1ZXMoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBKYW1lcyEiLCBjb21wU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRTdHJpbmcoKSB7Ci0gICAgICAgIER1bW15R1N0cmluZyBhID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W10geyAiSmFtZXMiIH0pOwotCi0gICAgICAgIEdTdHJpbmcgcmVzdWx0ID0gYS5wbHVzKCIgaG93IGFyZSB5b3U/Iik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBKYW1lcyEgaG93IGFyZSB5b3U/IiwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRTdHJpbmcyKCkgewotICAgICAgICBEdW1teUdTdHJpbmcgYSA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdIHsgIkphbWVzIiB9LCBuZXcgU3RyaW5nW10geyAiSGVsbG8gIiB9KTsKLQotICAgICAgICBHU3RyaW5nIHJlc3VsdCA9IGEucGx1cygiIGhvdyBhcmUgeW91PyIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyByZXN1bHQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZ3M6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHJlc3VsdC5nZXRTdHJpbmdzKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZXM6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHJlc3VsdC5nZXRWYWx1ZXMoKSkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSmFtZXMgaG93IGFyZSB5b3U/IiwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRHU3RyaW5nKCkgewotICAgICAgICBEdW1teUdTdHJpbmcgYSA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdIHsgIkphbWVzIiB9KTsKLSAgICAgICAgRHVtbXlHU3RyaW5nIGIgPSBuZXcgRHVtbXlHU3RyaW5nKG5ldyBPYmplY3RbXSB7ICJCb2IiIH0pOwotCi0gICAgICAgIEdTdHJpbmcgcmVzdWx0ID0gYS5wbHVzKGIpOwotCi0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kOiAiICsgcmVzdWx0KTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nczogIiArCi0JCS8vIEludm9rZXJIZWxwZXIudG9TdHJpbmcocmVzdWx0LmdldFN0cmluZ3MoKSkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZXM6ICIgKwotCQkvLyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHJlc3VsdC5nZXRWYWx1ZXMoKSkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSmFtZXMhSGVsbG8gQm9iISIsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kR1N0cmluZzIoKSB7Ci0gICAgICAgIER1bW15R1N0cmluZyBhID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W10geyAiSmFtZXMiIH0sIG5ldyBTdHJpbmdbXSB7ICJIZWxsbyAiIH0pOwotICAgICAgICBEdW1teUdTdHJpbmcgYiA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdIHsgIkJvYiIgfSwgbmV3IFN0cmluZ1tdIHsgIkhlbGxvICIgfSk7Ci0KLSAgICAgICAgR1N0cmluZyByZXN1bHQgPSBhLnBsdXMoYik7Ci0KLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyByZXN1bHQpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmdzOiAiICsKLQkJLy8gSW52b2tlckhlbHBlci50b1N0cmluZyhyZXN1bHQuZ2V0U3RyaW5ncygpKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbHVlczogIiArCi0JCS8vIEludm9rZXJIZWxwZXIudG9TdHJpbmcocmVzdWx0LmdldFZhbHVlcygpKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBKYW1lc0hlbGxvIEJvYiIsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGUoKSB7Ci0gICAgICAgIER1bW15R1N0cmluZyBhID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcigxKX0pOwotICAgICAgICBEdW1teUdTdHJpbmcgYiA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdIHsgbmV3IExvbmcoMSl9KTsKLSAgICAgICAgRHVtbXlHU3RyaW5nIGMgPSBuZXcgRHVtbXlHU3RyaW5nKG5ldyBPYmplY3RbXSB7IG5ldyBEb3VibGUoMi4zKX0pOwotCi0gICAgICAgIGFzc2VydFRydWUoImEgPT0gYiIsIGEuZXF1YWxzKGIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBhID09IGIiLCBhLmhhc2hDb2RlKCksIGIuaGFzaENvZGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoImEgIT0gYyIsIGEuZXF1YWxzKGMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzaGNvZGUgYSAhPSBjIiwgYS5oYXNoQ29kZSgpICE9IGMuaGFzaENvZGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIDw9PiBiIiwgMCwgYS5jb21wYXJlVG8oYikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImEgPD0+IGIiLCAtMSwgYS5jb21wYXJlVG8oYykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U2hlbGxUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL0dyb292eVNoZWxsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWEyYTllLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U2hlbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqICRJZCR2ZXJzaW9uCi0gKiBOb3YgMjMsIDIwMDMgOTowMjo1NSBQTSAkdXNlciBFeHAgJAotICogCi0gKiBDb3B5cmlnaHQgMjAwMyAoQykgU2FtIFB1bGxhcmEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgotICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKLSAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgotICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KLSAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQotICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKLSAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICogIAotICovCi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNhbQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlTaGVsbFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzY3JpcHQxID0gInRlc3QgPSAxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoR3Jvb3Z5U2hlbGxUZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVNjcmlwdCgpIHsKLSAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBzaGVsbC5ldmFsdWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2NyaXB0MS5nZXRCeXRlcygpKSwgIlRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3BlcnR5SG9sZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0MiA9ICJ0ZXN0LnByb3AgPSAyXG5yZXR1cm4gdGVzdC5wcm9wIjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU2NyaXB0V2l0aENvbnRleHQoKSB7Ci0gICAgICAgIEJpbmRpbmcgY29udGV4dCA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoInRlc3QiLCBuZXcgUHJvcGVydHlIb2xkZXIoKSk7Ci0gICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGNvbnRleHQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHNoZWxsLmV2YWx1YXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQyLmdldEJ5dGVzKCkpLCAiVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0V2l0aERlcml2ZWRCYXNlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQmluZGluZyBjb250ZXh0ID0gbmV3IEJpbmRpbmcoKTsKLSAgICAgICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgY29uZmlnLnNldFNjcmlwdEJhc2VDbGFzcyhEZXJpdmVkU2NyaXB0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGNvbnRleHQsIGNvbmZpZyk7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBzaGVsbC5ldmFsdWF0ZSgieCA9ICdhYmMnOyBkb1NvbWV0aGluZyhjaGVlc2UpIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSSBsaWtlIENoZWRkYXIiLCByZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGNvbnRleHQuZ2V0VmFyaWFibGUoIngiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9JbnRSYW5nZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50UmFuZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDc0NzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9JbnRSYW5nZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5Lmxhbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRSYW5nZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLSAgICAgICAgSW50UmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDAsIDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByLCAxMSwgci5zaXplKCkpOwotICAgICAgICByID0gY3JlYXRlUmFuZ2UoMCwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSBvZiAiICsgciwgMiwgci5zaXplKCkpOwotICAgICAgICByID0gY3JlYXRlUmFuZ2UoMCwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSBvZiAiICsgciwgMSwgci5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgewotICAgICAgICBJbnRSYW5nZSByID0gY3JlYXRlUmFuZ2UoMCwgMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20iLCAwLCByLmdldEZyb21JbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidG8iLCAxMCwgci5nZXRUb0ludCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotICAgICAgICBJbnRSYW5nZSByID0gY3JlYXRlUmFuZ2UoMTAsIDIwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMTA7IGkrKykgewotICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IChJbnRlZ2VyKSByLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSXRlbSBhdCBpbmRleDogIiArIGksIGkgKyAxMCwgdmFsdWUuaW50VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0T2ZSYW5nZSgpIHsKLSAgICAgICAgSW50UmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHIuZ2V0KC0xKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdvcmtlZAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByLmdldCgxMSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSW5kZXhPdXQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3b3JrZWQKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgewotICAgICAgICBJbnRSYW5nZSByID0gY3JlYXRlUmFuZ2UoMTAsIDIwKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAxMSIsIHIuY29udGFpbnMobmV3IEludGVnZXIoMTEpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIDEwIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigxMCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgMTkiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDE5KSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAyMCIsIHIuY29udGFpbnMobmV3IEludGVnZXIoMjApKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyA5Iiwgci5jb250YWlucyhuZXcgSW50ZWdlcig5KSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgMjEiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDIxKSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgMTAwIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigxMDApKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyAtMSIsIHIuY29udGFpbnMobmV3IEludGVnZXIoLTEpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1Ykxpc3QoKSB7Ci0gICAgICAgIEludFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOwotCi0gICAgICAgIExpc3QgcyA9IHIuc3ViTGlzdCgyLCA0KTsKLQotICAgICAgICBJbnRSYW5nZSBzciA9IChJbnRSYW5nZSkgczsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20iLCAxMiwgc3IuZ2V0RnJvbUludCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0byIsIDEzLCBzci5nZXRUb0ludCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIiwgMiwgc3Iuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVBbmRFcXVhbHMoKSB7Ci0gICAgICAgIEludFJhbmdlIGEgPSBjcmVhdGVSYW5nZSgxLCAxMSk7Ci0gICAgICAgIEludFJhbmdlIGIgPSBjcmVhdGVSYW5nZSgxLCAxMSk7Ci0gICAgICAgIEludFJhbmdlIGMgPSBjcmVhdGVSYW5nZSgyLCAxMSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSIsIGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzaGNvZGUiLCBhLmhhc2hDb2RlKCkgIT0gYy5oYXNoQ29kZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImEgYW5kIGIiLCBhLCBiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImEgIT0gYyIsIGEuZXF1YWxzKGMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEludFJhbmdlIGNyZWF0ZVJhbmdlKGludCBmcm9tLCBpbnQgdG8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRSYW5nZShmcm9tLCB0byk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbXNnLCBpbnQgZXhwZWN0ZWQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBuZXcgSW50ZWdlcihleHBlY3RlZCksIHZhbHVlKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL01ldGFDbGFzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwYmY3Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL01ldGFDbGFzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogJElkJAotICogCi0gKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgotICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKLSAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgotICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KLSAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQotICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKLSAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICogIAotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lmxhbmc7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTWV0YUNsYXNzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhQ2xhc3MoKSB7Ci0gICAgICAgIENsYXNzIGZvbyA9IFN0cmluZ1tdLmNsYXNzOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZm9vICsgIiBuYW1lOiAiICsgZm9vLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKHRoaXMpOwotCi0gICAgICAgIGFzc2VydFRydWUoImdvdCBtZXRhY2xhc3MiLCBtZXRhQ2xhc3MgIT0gbnVsbCk7Ci0KLSAgICAgICAgbWV0YUNsYXNzLmludm9rZU1ldGhvZCh0aGlzLCAiZG9Tb21ldGhpbmciLCBuZXcgT2JqZWN0WzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlID0gbmV3IFN0cmluZ1tdIHsgImhlbGxvIiB9OwotCi0gICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh2YWx1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ290IG1ldGFjbGFzcyIsIG1ldGFDbGFzcyAhPSBudWxsKTsKLQotICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHZhbHVlLCAidG9TdHJpbmciLCBuZXcgT2JqZWN0WzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiaGVsbG8iOwotCi0gICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh2YWx1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ290IG1ldGFjbGFzcyIsIG1ldGFDbGFzcyAhPSBudWxsKTsKLQotICAgICAgICBPYmplY3QgYW5zd2VyID0gbWV0YUNsYXNzLmludm9rZU1ldGhvZCh2YWx1ZSwgInRvU3RyaW5nIiwgbmV3IE9iamVjdFswXSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIGFuc3dlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9iamVjdCgpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh2YWx1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ290IG1ldGFjbGFzcyIsIG1ldGFDbGFzcyAhPSBudWxsKTsKLQotICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHZhbHVlLCAidG9TdHJpbmciLCBuZXcgT2JqZWN0WzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljRmllbGQoKSB7Ci0gICAgICAgIER5bW15Q2xhc3MgZHltbXlDbGFzcyA9IG5ldyBEeW1teUNsYXNzKCk7Ci0gICAgICAgIAotICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoZHltbXlDbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobWV0YUNsYXNzLmdldFByb3BlcnR5KGR5bW15Q2xhc3MsICJ4IiksIG5ldyBJbnRlZ2VyKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGFDbGFzcy5nZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAieSIpLCAibm9uZSIpOwotICAgICAgICAKLSAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJ4IiwgbmV3IEludGVnZXIoMjUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGR5bW15Q2xhc3MueCwgMjUpOwotCi0gICAgICAgIG1ldGFDbGFzcy5zZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAieSIsICJuZXd2YWx1ZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHltbXlDbGFzcy55LCAibmV3dmFsdWUiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5V2l0aEludCgpIHsKLSAgICAgICAgRHltbXlDbGFzcyBkeW1teUNsYXNzID0gbmV3IER5bW15Q2xhc3MoKTsKLSAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKGR5bW15Q2xhc3MpOwotICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgImFuSW50IiwgbmV3IEludGVnZXIoMTApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlXaXRoRG91YmxlQXJyYXkoKSB7Ci0gICAgICAgIER5bW15Q2xhc3MgZHltbXlDbGFzcyA9IG5ldyBEeW1teUNsYXNzKCk7Ci0gICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhkeW1teUNsYXNzKTsKLSAgICAgICAgRG91YmxlW11bXSBtYXRyaXgyID0KLSAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEb3VibGUoMzUpLCBuZXcgRG91YmxlKDUwKSwgbmV3IERvdWJsZSgxMjApCi0gICAgICAgICAgICAgICAgfSwgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERvdWJsZSg3NSksIG5ldyBEb3VibGUoODApLCBuZXcgRG91YmxlKDE1MCkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1ldGFDbGFzcy5zZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAibWF0cml4IiwgbWF0cml4Mik7Ci0gICAgICAgIG1ldGFDbGFzcy5zZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAibWF0cml4MiIsIG1hdHJpeDIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eVdpdGhBcnJheSgpIHsKLSAgICAgICAgRHltbXlDbGFzcyBkeW1teUNsYXNzID0gbmV3IER5bW15Q2xhc3MoKTsKLSAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKGR5bW15Q2xhc3MpOwotCi0gICAgICAgIC8vIHRlc3QgaW50W10KLSAgICAgICAgaW50W10gaW50cyA9IG5ldyBpbnRbXXsKLSAgICAgICAgICAgICAgICAwLCAxLCAyLCAzCi0gICAgICAgIH07Ci0gICAgICAgIG1ldGFDbGFzcy5zZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAiaW50cyIsIGludHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW50cywgbWV0YUNsYXNzLmdldFByb3BlcnR5KGR5bW15Q2xhc3MsICJpbnRzIikpOwotCi0gICAgICAgIC8vIHRlc3QgSW50ZWdlcltdCi0gICAgICAgIEludGVnZXJbXSBpbnRlZ2VycyA9IG5ldyBJbnRlZ2VyW117Ci0gICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMykKLSAgICAgICAgfTsKLSAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJpbnRlZ2VycyIsIGludGVnZXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGludGVnZXJzLCBtZXRhQ2xhc3MuZ2V0UHJvcGVydHkoZHltbXlDbGFzcywgImludGVnZXJzIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eVdpdGhMaXN0KCkgewotICAgICAgICBEeW1teUNsYXNzIGR5bW15Q2xhc3MgPSBuZXcgRHltbXlDbGFzcygpOwotICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoZHltbXlDbGFzcyk7Ci0KLSAgICAgICAgLy8gdGVzdCBsaXN0Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZChuZXcgSW50ZWdlcigxMjApKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTUwKSk7Ci0KLSAgICAgICAgLy8gdGVzdCBpbnRbXQotICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgImludHMiLCBsaXN0KTsKLQotICAgICAgICAvLyB0ZXN0IEludGVnZXJbXQotICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgImludGVnZXJzIiwgbGlzdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxlZCBkb1NvbWV0aGluZygpIik7Ci0gICAgfQotfQotCi0KLWNsYXNzIER5bW15Q2xhc3MgewotICAgIHB1YmxpYyBpbnQgeCA9IDA7Ci0gICAgcHVibGljIFN0cmluZyB5ID0gIm5vbmUiOwotICAgIAotICAgIHByaXZhdGUgaW50IGFuSW50OwotICAgIHByaXZhdGUgaW50W10gaW50czsKLSAgICBwcml2YXRlIEludGVnZXJbXSBpbnRlZ2VyczsKLSAgICBkb3VibGVbXVtdIG1hdHJpeDI7Ci0gICAgRG91YmxlW11bXSBtYXRyaXg7Ci0KLSAgICBwdWJsaWMgSW50ZWdlcltdIGdldEludGVnZXJzKCkgewotICAgICAgICByZXR1cm4gaW50ZWdlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZWdlcnMoSW50ZWdlcltdIGludGVnZXJzKSB7Ci0gICAgICAgIHRoaXMuaW50ZWdlcnMgPSBpbnRlZ2VyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50W10gZ2V0SW50cygpIHsKLSAgICAgICAgcmV0dXJuIGludHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW50cyhpbnRbXSBpbnRzKSB7Ci0gICAgICAgIHRoaXMuaW50cyA9IGludHM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBbkludCgpIHsKLSAgICAgICAgcmV0dXJuIGFuSW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFuSW50KGludCBhbkludCkgewotICAgICAgICB0aGlzLmFuSW50ID0gYW5JbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF0cml4KERvdWJsZVtdW10gbWF0cml4KSB7Ci0gICAgICAgIHRoaXMubWF0cml4ID0gbWF0cml4OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeDIoZG91YmxlW11bXSBtYXRyaXhSZWxvYWRlZCkgewotICAgICAgICB0aGlzLm1hdHJpeDIgPSBtYXRyaXhSZWxvYWRlZDsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Nb2NrV3JpdGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL01vY2tXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMTU2MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL01vY2tXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi0KLS8qKgotICogQSBtb2NrIGNsYXNzIGZvciB0ZXN0aW5nIHdyaXRlciBiYXNlZCBjb2RlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2NrV3JpdGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dDsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dCgpIHsKLSAgICAgICAgU3RyaW5nIGFuc3dlciA9IG91dHB1dDsKLSAgICAgICAgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoU3RyaW5nIG91dHB1dCkgewotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgewotICAgICAgICBzZXRPdXRwdXQoInByaW50bG4oKSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc2V0T3V0cHV0KCJwcmludGxuKCIgKyBvYmplY3QgKyAiKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc2V0T3V0cHV0KCJwcmludCgiICsgb2JqZWN0ICsgIikiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1JhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9SYW5nZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzZGI2Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1JhbmdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotcGFja2FnZSBncm9vdnkubGFuZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotICAgICAgICBSYW5nZSByID0gY3JlYXRlUmFuZ2UoMCwgMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgb2YgIiArIHIsIDExLCByLnNpemUoKSk7Ci0gICAgICAgIHIgPSBjcmVhdGVSYW5nZSgwLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByLCAyLCByLnNpemUoKSk7Ci0gICAgICAgIHIgPSBjcmVhdGVSYW5nZSgwLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByLCAxLCByLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgwLCAxMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZnJvbSIsIDAsIHIuZ2V0RnJvbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0byIsIDEwLCByLmdldFRvKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0gICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSAoSW50ZWdlcikgci5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkl0ZW0gYXQgaW5kZXg6ICIgKyBpLCBpICsgMTAsIHZhbHVlLmludFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dE9mUmFuZ2UoKSB7Ci0gICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByLmdldCgtMSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSW5kZXhPdXQiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3b3JrZWQKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgci5nZXQoMTEpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEluZGV4T3V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd29ya2VkCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLSAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgMTEiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDExKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAxMCIsIHIuY29udGFpbnMobmV3IEludGVnZXIoMTApKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIDE5Iiwgci5jb250YWlucyhuZXcgSW50ZWdlcigxOSkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIDkiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDkpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyAyMSIsIHIuY29udGFpbnMobmV3IEludGVnZXIoMjEpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyAxMDAiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDEwMCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIC0xIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigtMSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKLSAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7Ci0KLSAgICAgICAgTGlzdCBzID0gci5zdWJMaXN0KDIsIDQpOwotCi0gICAgICAgIFJhbmdlIHNyID0gKFJhbmdlKSBzOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiZnJvbSIsIDEyLCBzci5nZXRGcm9tKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRvIiwgMTMsIHNyLmdldFRvKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUiLCAyLCBzci5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUFuZEVxdWFscygpIHsKLSAgICAgICAgUmFuZ2UgYSA9IGNyZWF0ZVJhbmdlKDEsIDExKTsKLSAgICAgICAgUmFuZ2UgYiA9IGNyZWF0ZVJhbmdlKDEsIDExKTsKLSAgICAgICAgUmFuZ2UgYyA9IGNyZWF0ZVJhbmdlKDIsIDExKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImhhc2hjb2RlIiwgYS5oYXNoQ29kZSgpLCBiLmhhc2hDb2RlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJoYXNoY29kZSIsIGEuaGFzaENvZGUoKSAhPSBjLmhhc2hDb2RlKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiYSBhbmQgYiIsIGEsIGIpOwotICAgICAgICBhc3NlcnRGYWxzZSgiYSAhPSBjIiwgYS5lcXVhbHMoYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUmFuZ2UgY3JlYXRlUmFuZ2UoaW50IGZyb20sIGludCB0bykgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFJhbmdlKG5ldyBJbnRlZ2VyKGZyb20pLCBuZXcgSW50ZWdlcih0bykpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1zZywgaW50IGV4cGVjdGVkLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgbmV3IEludGVnZXIoZXhwZWN0ZWQpLCB2YWx1ZSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2NyaXB0SW50ZWdlckRpdmlkZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2NyaXB0SW50ZWdlckRpdmlkZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4OWM0OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdEludGVnZXJEaXZpZGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0SW50ZWdlckRpdmlkZVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLQkvKioKLQkgKiBJZiBhIHNjcmlwdCB0aGF0IGludm9rZXMgaW50ZWdlciBkaXZpc2lvbiBpcyBzcGVjaWZpZWQgYXMgYSBsaXRlcmFsIHN0cmluZywgdGhlCi0JICogZGl2aXNpb24gdG9rZW4gIlwiIG5lZWRzIHRvIGJlIGVzY2FwZWQuIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyRGl2aWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAJCWFzc2VydFNjcmlwdCggImFzc2VydCA0XFwzID09IDEiICk7Ci0gICAgfQotCi0JLyoqCi0JICogSWYgYSBncm9vdnkgc2NyaXB0IGlzIHNwZWMnZCBpbiBhIGxpdGVyYWwgc3RyaW5nLCBhbnkgaW50ZW5kZWQgSW50ZWdlcgotCSAqIGRpdmlzaW9ucyBuZWVkIHRvIGJlIGVzY2FwZWQuICBJbiBjYXNlcyB3aGVyZSB0aGUgaW50ZWdlciBkaXZpc2lvbiB0b2tlbiAiXCIKLQkgKiBpcyBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UgdGhlIGxpdGVyYWwgY2Fubm90IGJlIGNvbnN0cnVjdGVkLCB3aGljaCBpcyBPSy4KLQkgKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgc2Vjb25kIG9wZXJhbmQgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgdG9rZW4sIHRoZSBsaXRlcmFsCi0JICogY2FuIGJlIHNwZWNpZmllZCwgYnV0IHdpbGwgcmVzdWx0IGluIGEgY29tcGlsYXRpb24gZXJyb3IgYXMgdGhlIHRva2VuIGltbWVkaWF0ZWx5Ci0JICogZm9sbG93aW5nIHRoZSBiYWNrc2xhc2ggd2lsbCBiZSB0YWtlbiBhcyB0aGUgZXNjYXBlIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyRGl2aWRlV2l0aEJhZEVzY2FwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAl0cnkgewotICAgIAkJYXNzZXJ0U2NyaXB0KCAiYXNzZXJ0IDRcMyA9PSAxIiApOwotICAgIAl9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJZmFpbCgiU2hvdWxkIGNhdGNoIGEgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFByaW50VGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TY3JpcHRQcmludFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMTA2ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFByaW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lmxhbmc7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRQcmludFRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0V2l0aEN1c3RvbVByaW50bG4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2NyaXB0KAotICAgICAgICAgICAgIm91dCA9IG5ldyBNb2NrV3JpdGVyKCk7IHByaW50bG4oKTsgYXNzZXJ0IG91dC5vdXRwdXQgPT0gJ3ByaW50bG4oKScgOiAndmFsdWUgb2Ygb3V0cHV0IGlzOiAnICsgb3V0Lm91dHB1dFxuIgotICAgICAgICAgICAgICAgICsgInByaW50KCdoZXknKTsgYXNzZXJ0IG91dC5vdXRwdXQgPT0gJ3ByaW50KGhleSknIDogJ3ZhbHVlIGlzOiAnICsgb3V0Lm91dHB1dFxuIgotICAgICAgICAgICAgICAgICsgInByaW50bG4oJ2hleScpOyBhc3NlcnQgb3V0Lm91dHB1dCA9PSAncHJpbnRsbihoZXkpJyA6ICd2YWx1ZSBpczogJyArIG91dC5vdXRwdXRcbiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TY3JpcHRUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlNjM4MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEd1aWxsYXVtZSBMYWZvcmdlLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGhvZENsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRlc3RzIHNvbWUgcGFydGljdWxhciBzY3JpcHQgZmVhdHVyZXMuCi0gKgotICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0Ci17Ci0gICAgLyoqCi0gICAgICogV2hlbiBhIG1ldGhvZCBpcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc2NyaXB0LCBjaGVja3MgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNhbGwgYSBtZXRob2QgY2xvc3VyZSBmcm9tIHRoZSBiaW5kaW5nLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kRmFsbHNUaHJvdWdoVG9NZXRob2RDbG9zdXJlSW5CaW5kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSAiaWYgKG1ldGhvZCgpID09IDMpIHsgcHJpbnRsbiAnc3VjY2VlZGVkJyB9IjsKLQotICAgICAgICBHcm9vdnlDb2RlU291cmNlIGNvZGVTb3VyY2UgPSBuZXcgR3Jvb3Z5Q29kZVNvdXJjZSh0ZXh0LCAiZ3Jvb3Z5LnNjcmlwdCIsICJncm9vdnkuc2NyaXB0Iik7Ci0gICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBsb2FkZXIucGFyc2VDbGFzcyhjb2RlU291cmNlKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9ICgoU2NyaXB0KSBjbGF6ei5uZXdJbnN0YW5jZSgpKTsKLQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQmluZGluZygpOwotICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJtZXRob2QiLCBuZXcgTWV0aG9kQ2xvc3VyZShuZXcgRHVtbXkoKSwgIm1ldGhvZCIpKTsKLSAgICAgICAgc2NyaXB0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICAgICAgc2NyaXB0LnJ1bigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXkgewotICAgICAgICBwdWJsaWMgSW50ZWdlciBtZXRob2QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoMyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NlcXVlbmNlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TZXF1ZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2EyYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9sYW5nL1NlcXVlbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5sYW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1c2Ugb2YgdGhlIHN0cnVjdHVyZWQgQXR0cmlidXRlIHR5cGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFNlcXVlbmNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rpb24oKSB7Ci0gICAgICAgIFNlcXVlbmNlIHNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIHNlcXVlbmNlLmFkZCgiSmFtZXMiKTsKLSAgICAgICAgc2VxdWVuY2UuYWRkKCJCb2IiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUiLCAyLCBzZXF1ZW5jZS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkVsZW1lbnQiLCAiSmFtZXMiLCBzZXF1ZW5jZS5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkVsZW1lbnQiLCAiQm9iIiwgc2VxdWVuY2UuZ2V0KDEpKTsKLQotICAgICAgICAvLyBub3cgbGV0cyB0cnkgc29tZSBtZXRob2RzIG9uIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAotICAgICAgICBMaXN0IGFuc3dlciA9IChMaXN0KSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChzZXF1ZW5jZSwgInN0YXJ0c1dpdGgiLCBuZXcgT2JqZWN0W10geyAiSmEiIH0pOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UgfSwgYW5zd2VyLnRvQXJyYXkoKSk7Ci0KLSAgICAgICAgYW5zd2VyID0gKExpc3QpIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHNlcXVlbmNlLCAibGVuZ3RoIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDUpLCBuZXcgSW50ZWdlcigzKX0sIGFuc3dlci50b0FycmF5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdXcm9uZ1R5cGVGYWlscygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcXVlbmNlIHNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBzZXF1ZW5jZS5hZGQobmV3IEludGVnZXIoNSkpOwotCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZGluZ051bGxGYWlscygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcXVlbmNlIHNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBzZXF1ZW5jZS5hZGQobnVsbCk7Ci0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9UdXBsZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvVHVwbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzBhZmIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbGFuZy9UdXBsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5Lmxhbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBUdXBsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBPYmplY3RbXSBkYXRhID0geyAiYSIsICJiIiwgImMiIH07Ci0gICAgVHVwbGUgdCA9IG5ldyBUdXBsZShkYXRhKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgb2YgIiArIHQsIDMsIHQuc2l6ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImdldCgwKSIsICJhIiwgdC5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImdldCgxKSIsICJiIiwgdC5nZXQoMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRPZlR1cGxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdC5nZXQoLTEpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEluZGV4T3V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd29ya2VkCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHQuZ2V0KDEwKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdvcmtlZAotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIGEiLCB0LmNvbnRhaW5zKCJhIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyBiIiwgdC5jb250YWlucygiYiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKLSAgICAgICAgTGlzdCBzID0gdC5zdWJMaXN0KDEsIDIpOwotCi0gICAgICAgIGFzc2VydFRydWUoImlzIGEgVHVwbGUiLCBzIGluc3RhbmNlb2YgVHVwbGUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygic2l6ZSIsIDEsIHMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVBbmRFcXVhbHMoKSB7Ci0gICAgICAgIFR1cGxlIGEgPSBuZXcgVHVwbGUobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiB9KTsKLSAgICAgICAgVHVwbGUgYiA9IG5ldyBUdXBsZShuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiIH0pOwotICAgICAgICBUdXBsZSBjID0gbmV3IFR1cGxlKG5ldyBPYmplY3RbXSB7ICJkIiwgImIiLCAiYyIgfSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSIsIGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzaGNvZGUiLCBhLmhhc2hDb2RlKCkgIT0gYy5oYXNoQ29kZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImEgYW5kIGIiLCBhLCBiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImEgIT0gYyIsIGEuZXF1YWxzKGMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9tb2NrL01vY2tUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svTW9ja1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZhNDY0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svTW9ja1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkubW9jawotCi1pbXBvcnQgZ3Jvb3Z5Lm1vY2suR3Jvb3Z5TW9jawotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcgotCi1jbGFzcyBNb2NrVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3BlcnR5IG1vY2sKLQotICAgIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIG1vY2sgPSBHcm9vdnlNb2NrLm5ld0luc3RhbmNlKCkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBU2ltcGxlRXhwZWN0YXRpb25DYW5CZVNldEFuZE1ldCgpIHsKLSAgICAgICAgLy8gZXhwZWN0YXRpb24KLSAgICAgICAgbW9jay5kb1NvbWV0aGluZygiaGVsbG8iKQotCi0gICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgbW9jay5pbnN0YW5jZS5kb1NvbWV0aGluZygiaGVsbG8iKQotCi0gICAgICAgIC8vIHZlcmlmeQotICAgICAgICBtb2NrLnZlcmlmeSgpCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0QVNpbXBsZUV4cGVjdGF0aW9uQ2FuQmVTZXRBbmRGYWlsZWQoKSB7Ci0gICAgICAgIC8vIGV4cGVjdGF0aW9uCi0gICAgICAgIG1vY2suZG9Tb21ldGhpbmcoImhlbGxvIikKLQotICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb2NrLmluc3RhbmNlLmRvU29tZXRoaW5nKCJnb29kYnllIikKLSAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZ29vZEV4Y2VwdGlvbikgewotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RBU2ltcGxlRXhwZWN0YXRpb25DYW5CZVNldEJ1dE5ldmVyQ2FsbGVkU29WZXJpZnlGYWlscygpIHsKLSAgICAgICAgLy8gZXhwZWN0YXRpb24KLSAgICAgICAgbW9jay5kb1NvbWV0aGluZygiaGVsbG8iKQotCi0gICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBpdAotCi0gICAgICAgIC8vIHZlcmlmeQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9jay52ZXJpZnkoKQotICAgICAgICAgICAgZmFpbCgic2hvdWxkIG5vdCBoYXZlIHZlcmlmaWVkIikKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZ29vZEV4Y2VwdGlvbikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0QW5FeHBlY3RhdGlvbldpdGhBQ2xvc3VyZUdpdmVzRXJyb3JJRkNhbGxlZEFuZENsb3N1cmVGYWlscygpIHsKLSAgICAgICAgbW9jay5kb1NvbWV0aGluZygge2FyZyB8IGFzc2VydCBhcmc9PSJwb28iIH0gKQotCi0gICAgICAgIC8vIHZlcmlmeQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9jay5pbnN0YW5jZS5kb1NvbWV0aGluZygiaGVsbG8iKQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdmVyaWZ5IHRvIGZhaWwiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9leHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB3YXMgR1JPT1ZZLTc2Ci0gICAgICovCi0gICAgdm9pZCB0ZXN0QW5FeHBlY3RhdGlvbndpdGhBQ2xvc3VyZVBhc3Nlc0lmQ2xvc3VyZVBhc3NlcygpIHsKLSAgICAgICAgbW9jay5kb1NvbWV0aGluZyB7YXJnIHwgYXNzZXJ0IGFyZz09ImhlbGxvIiB9IAotICAgICAgICAKLSAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICBtb2NrLmluc3RhbmNlLmRvU29tZXRoaW5nKCJoZWxsbyIpCi0KLSAgICAgICAgLy92ZXJpZnkKLSAgICAgICAgbW9jay52ZXJpZnkoKQotICAgIH0KLQotICAgIHZvaWQgdGVzdEFuRXhwZWN0YXRpb25XaXRoQUNsb3N1cmVHaXZlc0Vycm9ySUZOb3RDYWxsZWQoKSB7Ci0gICAgICAgIG1vY2suZG9Tb21ldGhpbmcoIHthcmcgfCBhc3NlcnQgYXJnPT0icG9vIiB9ICkKLSAgICAgICAgLy8gdmVyaWZ5Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtb2NrLnZlcmlmeSgpCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCB2ZXJpZnkgdG8gZmFpbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9leHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL0NoZWVzZVNsaWNlci5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvQ2hlZXNlU2xpY2VyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNjkxZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvQ2hlZXNlU2xpY2VyLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBncm9vdnkubW9jay5leGFtcGxlCi0KLWNsYXNzIENoZWVzZVNsaWNlciB7Ci0KLSAgICB2b2lkIHNsaWNlU29tZUNoZWVzZShuYW1lKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigic2xpY2luZyBjaGVlc2UiKQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svZXhhbXBsZS9TYW5kd2ljaE1ha2VyLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svZXhhbXBsZS9TYW5kd2ljaE1ha2VyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhOWY2OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvU2FuZHdpY2hNYWtlci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5tb2NrLmV4YW1wbGUKLQotY2xhc3MgU2FuZHdpY2hNYWtlciB7Ci0KLSAgICBwcm9wZXJ0eSBjaGVlc2VTbGljZXIKLQotICAgIHZvaWQgbWFrZUZhdHR5U2FuZHdpY2goKSB7Ci0gICAgICAgIGNoZWVzZVNsaWNlci5zbGljZUNoZWVzZSgiY2hlZGRhciIpCi0gICAgfQotCi0gICAgdm9pZCBtYWtlTGl0ZVNhbmR3aWNoKCkgewotICAgICAgICBjaGVlc2VTbGljZXIuc2xpY2VDaGVlc2UoImRhaXJ5bGVhIikKLSAgICB9Ci0KLSAgICB2b2lkIG1ha2VDcmFwcHlTYW5kd2ljaCgpIHsKLSAgICAgICAgY2hlZXNlU2xpY2VyLnNsaWNlQ2hlZXNlKCJkYWlyeWxlYSIpCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL1NhbmR3aWNoTWFrZXJUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svZXhhbXBsZS9TYW5kd2ljaE1ha2VyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGI0MTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL1NhbmR3aWNoTWFrZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm1vY2suZXhhbXBsZQotCi1pbXBvcnQgZ3Jvb3Z5Lm1vY2suR3Jvb3Z5TW9jawotCi1jbGFzcyBTYW5kd2ljaE1ha2VyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFN0dWZmKCkgewotCi0gICAgICAgIC8qKiBAdG9kbyBJJ20gbm90IHN1cmUgd2h5IHRoaXMgc3R1ZmYgZmFpbHMKLSAgICAgICAgICogCi0gICAgICAgIG1vY2tDaGVlc2VTbGljZXIgPSBHcm9vdnlNb2NrLm5ld0luc3RhbmNlKCkKLSAgICAgICAgc2FuZHdpY2hNYWtlciA9IG5ldyBTYW5kd2ljaE1ha2VyKCkKLSAgICAgICAgc2FuZHdpY2hNYWtlci5jaGVlc2VTbGljZXIgPSBtb2NrQ2hlZXNlU2xpY2VyLmluc3RhbmNlCi0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24KLSAgICAgICAgbW9ja0NoZWVzZVNsaWNlci5zbGljZUNoZWVzZSB7YXJnIHwgYXNzZXJ0IGFyZy5zdGFydHNXaXRoKCJjaCIpfQotCi0gICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgc2FuZHdpY2hNYWtlci5tYWtlRmF0dHlTYW5kd2ljaCgpCi0KLSAgICAgICAgLy8gdmVyaWZ5Ci0gICAgICAgIG1vY2tDaGVlc2VTbGljZXIudmVyaWZ5KCkKLSAgICAgICAgKi8KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9tb2RlbC9NdmNEZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vZGVsL012Y0RlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVkMTY1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vZGVsL012Y0RlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotcGFja2FnZSBncm9vdnkubW9kZWwKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dAotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkKLWltcG9ydCBncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyCi0vKioKLSAqIAotICovCi1jbGFzcyBNdmNEZW1vIHsKLSAgICAKLSAgICBwcm9wZXJ0eSBmcmFtZQotICAgIHByb3BlcnR5IHN3aW5nCi0gICAgCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICAgIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCi0gICAgICAgIAotICAgICAgICBmcmFtZSA9IHN3aW5nLmZyYW1lKHRpdGxlOidNVkMgRGVtbycsIGxvY2F0aW9uOlsyMDAsMjAwXSwgc2l6ZTpbMzAwLDIwMF0pIHsKLSAgICAgICAgICAgIG1lbnVCYXIgewotCQkgICAgICAgIG1lbnUodGV4dDonSGVscCcpIHsKLQkJICAgICAgICAgICAgbWVudUl0ZW0oKSB7Ci0JCSAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonQWJvdXQnLCBjbG9zdXJlOnsgc2hvd0Fib3V0KCkgfSkKLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJICAgIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKLSAgICAJICAgICAgICBzY3JvbGxQYW5lKGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIpIHsKLSAgICAJICAgICAgICAgICAgdGFibGUoKSB7Ci0gICAgCSAgICAgICAgICAgICAgICB0YWJsZU1vZGVsKGxpc3Q6WyBbJ25hbWUnOidKYW1lcycsICdsb2NhdGlvbic6J0xvbmRvbiddLCBbJ25hbWUnOidCb2InLCAnbG9jYXRpb24nOidBdGxhbnRhJ10gXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKGhlYWRlcjonTmFtZScsIHByb3BlcnR5TmFtZTonbmFtZScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4oaGVhZGVyOidMb2NhdGlvbicsIHByb3BlcnR5TmFtZTonbG9jYXRpb24nKQotICAgIAkgICAgICAgICAgICAgICAgfQotICAgIAkgICAgICAgICAgICB9Ci0gICAgCSAgICAgICAgfQotCQkgICAgfQotCQl9ICAgICAgICAKLQkJZnJhbWUuc2hvdygpCi0gICAgfQotIAotICAgIHNob3dBYm91dCgpIHsKLSAJCXBhbmUgPSBzd2luZy5vcHRpb25QYW5lKG1lc3NhZ2U6J1RoaXMgZGVtbyBzaG93cyBob3cgeW91IGNhbiBjcmVhdGUgVUkgbW9kZWxzIGZyb20gc2ltcGxlIE1WQyBtb2RlbHMnKQotIAkJZGlhbG9nID0gcGFuZS5jcmVhdGVEaWFsb2coZnJhbWUsICdBYm91dCBNVkMgRGVtbycpCi0gCQlkaWFsb2cuc2hvdygpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbW9kZWwvVGFibGVNb2RlbFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvbW9kZWwvVGFibGVNb2RlbFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI3YjM3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L21vZGVsL1RhYmxlTW9kZWxUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm1vZGVsCi0KLWNsYXNzIFRhYmxlTW9kZWxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdFRhYmxlTW9kZWwoKSB7Ci0gICAgICAgIGxpc3QgPSBbIFsnbmFtZSc6J0phbWVzJywgJ2xvY2F0aW9uJzonTG9uZG9uJ10sIFsnbmFtZSc6J0JvYicsICdsb2NhdGlvbic6J0F0bGFudGEnXV0KLSAgICAgICAgCi0gICAgICAgIGxpc3RNb2RlbCA9IG5ldyBWYWx1ZUhvbGRlcihsaXN0KQotICAgICAgICAKLQkgICAgbW9kZWwgPSBuZXcgRGVmYXVsdFRhYmxlTW9kZWwobGlzdE1vZGVsKQotCSAgICByb3dNb2RlbCA9IG1vZGVsLmdldFJvd01vZGVsKCkKLSAgICAgICAgbW9kZWwuYWRkQ29sdW1uKG5ldyBEZWZhdWx0VGFibGVDb2x1bW4oIk5hbWUiLCBuZXcgUHJvcGVydHlNb2RlbChyb3dNb2RlbCwgIm5hbWUiKSkpCi0gICAgICAgIG1vZGVsLmFkZENvbHVtbihuZXcgRGVmYXVsdFRhYmxlQ29sdW1uKCJMb2NhdGlvbiIsIG5ldyBQcm9wZXJ0eU1vZGVsKHJvd01vZGVsLCAibG9jYXRpb24iKSkpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbW9kZWwuZ2V0Um93Q291bnQoKSA9PSAyCi0gICAgICAgIGFzc2VydCBtb2RlbC5nZXRDb2x1bW5Db3VudCgpID09IDIKLSAgICAgICAgYXNzZXJ0VmFsdWVBdChtb2RlbCwgMCwgMCwgJ0phbWVzJykKLSAgICAgICAgYXNzZXJ0VmFsdWVBdChtb2RlbCwgMCwgMSwgJ0xvbmRvbicpCi0gICAgICAgIGFzc2VydFZhbHVlQXQobW9kZWwsIDEsIDAsICdCb2InKQotICAgICAgICBhc3NlcnRWYWx1ZUF0KG1vZGVsLCAxLCAxLCAnQXRsYW50YScpCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbW9kZWwuZ2V0Q29sdW1uTmFtZSgwKSA9PSAnTmFtZScKLSAgICAgICAgYXNzZXJ0IG1vZGVsLmdldENvbHVtbk5hbWUoMSkgPT0gJ0xvY2F0aW9uJwotICAgICAgICAKLSAgICAgICAgLy8gbGV0cyBzZXQgc29tZSB2YWx1ZXMKLSAgICAgICAgbW9kZWwuc2V0VmFsdWVBdCgnQW50aWd1YScsIDAsIDEpCi0gICAgICAgIGFzc2VydFZhbHVlQXQobW9kZWwsIDAsIDEsICdBbnRpZ3VhJykKLSAgICAgICAgCi0gICAgICAgIC8vIGxldHMgY2hlY2sgdGhlIHJlYWwgbW9kZWwgY2hhbmdlZCB0b28KLSAgICAgICAgamFtZXMgPSBsaXN0LmdldCgwKQotICAgICAgICBhc3NlcnQgamFtZXMubG9jYXRpb24gPT0gJ0FudGlndWEnCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBhc3NlcnRWYWx1ZUF0KG1vZGVsLCByb3csIGNvbCwgZXhwZWN0ZWQpIHsKLSAgICAgICAgdmFsdWUgPSBtb2RlbC5nZXRWYWx1ZUF0KHJvdywgY29sKQotICAgICAgICBhc3NlcnQgdmFsdWUgPT0gZXhwZWN0ZWQgOiAiZm9yIHJvdyAiICsgcm93ICsgIiBjb2wgIiArIGNvbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L25vdHdvcmtpbmcvTGlzdEZpbGVzLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L25vdHdvcmtpbmcvTGlzdEZpbGVzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjY2RmNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9ub3R3b3JraW5nL0xpc3RGaWxlcy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkFycmF5cwotCi1wdWJsaWMgY2xhc3MgdGVzdCB7IAotCi0gICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0gICAgICAgIHByaW50bG4oIkNhbGxlZCBtYWluIHdpdGggJHthcmdzfSIpCi0gICAgICAgIGxpc3RGaWxlcyhBcnJheXMuYXNMaXN0KGFyZ3MpKQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nIGdldFBhdGgoZmlsZSkgewotICAgICAgICByZXR1cm4gZmlsZS5hYnNvbHV0ZVBhdGgKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBsaXN0RmlsZXMoZGlycykgewotICAgICAgICBwcmludGxuKCJjYWxsZWQgd2l0aCAke2RpcnN9IikKLSAgICAgICAgCi0gICAgICAgIGZvcihkaXIgaW4gZGlycykgewotICAgICAgICAgICAgcHJpbnRsbigiZGlyOiAke2Rpcn0iKQotICAgICAgICAgICAgCi0JICAgICAgICBmID0gbmV3IGphdmEuaW8uRmlsZShkaXIpCi0KLSAgICAJICAgIGZvciAoZiBpbiBmLmxpc3RGaWxlcygpKSB7Ci0gICAgICAgIAkgICAgcHJpbnRsbihnZXRQYXRoKGYpKQotICAgICAgICAJfSAKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQXRvbVRlc3RTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0F0b21UZXN0U2NyaXB0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhZjU4MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQXRvbVRlc3RTY3JpcHQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc2NyaXB0Ci0KLWltcG9ydCBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXI7Ci0KLS8qKiBub3RlIHlvdSBjb3VsZCB1c2UgRXhwYW5kbyBjbGFzc2VzIGlmIHlvdSBkb24ndCBtaW5kIGJlaW5nIGR5bmFtaWNhbGx5IHR5cGVkIAotZiA9IG5ldyBFeHBhbmRvKCkKLQotZi5hdXRob3IgPSBuZXcgRXhwYW5kbyhuYW1lOidUZWQgTGV1bmcnLHVybDonaHR0cDovL3d3dy5zYXVyaWEuY29tL2Jsb2cnLCBlbWFpbDondHdsQHNhdXJpYS5jb20nKQotCi1mLmVudHJpZXMgPSBbIG5ldyBFeHBhbmRvKHRpdGxlOidvbmUnLHN1bW1hcnk6J2ZpcnN0IHBvc3QnKSwgbmV3IEV4cGFuZG8odGl0bGU6J3R3bycsc3VtbWFyeTondGhlIHNlY29uZCBwb3N0JyksIG5ldyBFeHBhbmRvKHRpdGxlOid0aHJlZScsIHN1bW1hcnk6J3Bvc3QgdGhlIHRoaXJkJyksIG5ldyBFeHBhbmRvKHRpdGxlOidmb3VyJyxzdW1tYXJ5Oid0aGUgcG9uZGVyb3VzIGZvdXJ0aCBwb3N0JykgXQotKi8KLQotZiA9IG5ldyBGZWVkKCkKLQotZi5hdXRob3IgPSBuZXcgUGVyc29uKG5hbWU6J1RlZCBMZXVuZycsdXJsOidodHRwOi8vd3d3LnNhdXJpYS5jb20vYmxvZycsIGVtYWlsOid0d2xAc2F1cmlhLmNvbScpCi0KLWYuZW50cmllcyA9IFsgbmV3IEVudHJ5KHRpdGxlOidvbmUnLHN1bW1hcnk6J2ZpcnN0IHBvc3QnKSwgbmV3IEVudHJ5KHRpdGxlOid0d28nLHN1bW1hcnk6J3RoZSBzZWNvbmQgcG9zdCcpLCBuZXcgRW50cnkodGl0bGU6J3RocmVlJywgc3VtbWFyeToncG9zdCB0aGUgdGhpcmQnKSwgbmV3IEVudHJ5KHRpdGxlOidmb3VyJyxzdW1tYXJ5Oid0aGUgcG9uZGVyb3VzIGZvdXJ0aCBwb3N0JykgXQotCi1mLmVudHJpZXMuZWFjaCB7IHByaW50bG4gaXQudGl0bGUgfQotcHJpbnRsbiBmLmF1dGhvci5uYW1lCi0KLXhtbCA9IG5ldyBNYXJrdXBCdWlsZGVyKCkKLQotYXRvbSA9IHhtbC5hdG9tKCkgewotICB0aXRsZSgiVGVkIExldW5nIG9mZiB0aGUgYWlyIikKLSAgbGluaygiaHR0cDovL3d3dy5zYXVyaWEuY29tL25vYmxvZyIpCi0gIGF1dGhvcigpIHsKLSAgICBwZXJzb24oKSB7Ci0gICAgICBuYW1lKGYuYXV0aG9yLm5hbWUpCi0gICAgICB1cmwoZi5hdXRob3IudXJsKQotICAgICAgZW1haWwoZi5hdXRob3IuZW1haWwpCi0gICAgfQotICB9Ci0KLSAgZm9yIChlIGluIGYuZW50cmllcykgewotICAgIGVudHJ5KCkgewotICAgICAgdGl0bGUoZS50aXRsZSkKLSAgICAgIHN1bW1hcnkoZS5zdW1tYXJ5KQotICAgIH0KLSAgfQotfQotCi0KLWNsYXNzIEZlZWQgewotICAgIFN0cmluZyB0aXRsZQotICAgIFN0cmluZyBsaW5rCi0gICAgUGVyc29uIGF1dGhvcgotICAgIFN0cmluZyB0YWdsaW5lCi0gICAgU3RyaW5nIGdlbmVyYXRvcgotICAgIFN0cmluZyBjb3B5cmlnaHQKLSAgICBTdHJpbmcgbW9kaWZpZWQKLSAgICBMaXN0IGVudHJpZXMKLX0KLQotY2xhc3MgRW50cnkgewotICAgIFN0cmluZyB0aXRsZQotICAgIFN0cmluZyBsaW5rCi0gICAgU3RyaW5nIGlkCi0gICAgU3RyaW5nIHN1bW1hcnkKLSAgICBTdHJpbmcgY29udGVudAotICAgIFBlcnNvbiBhdXRob3IKLSAgICBTdHJpbmcgY3JlYXRlZAotICAgIFN0cmluZyBpc3N1ZWQKLSAgICBTdHJpbmcgbW9kaWZpZWQKLX0KLQotY2xhc3MgUGVyc29uIHsKLSAgICBTdHJpbmcgbmFtZQotICAgIFN0cmluZyB1cmwKLSAgICBTdHJpbmcgZW1haWwKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9DYWxsQW5vdGhlclNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQ2FsbEFub3RoZXJTY3JpcHQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q5MzE3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9DYWxsQW5vdGhlclNjcmlwdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWltcG9ydCBqYXZhLmlvLkZpbGUKLQotcHJpbnRsbigiQWJvdXQgdG8gY2FsbCBhbm90aGVyIHNjcmlwdCIpCi0KLXNjcmlwdCA9IG5ldyBHcm9vdnlTaGVsbCgpCi1zY3JpcHQucnVuKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0hlbGxvV29ybGQuZ3Jvb3Z5IiksIFtdKQotCi1wcmludGxuKCJEb25lIikKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9DbGFzc1dpdGhTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0NsYXNzV2l0aFNjcmlwdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzk4YmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0NsYXNzV2l0aFNjcmlwdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWNsYXNzIFgge30KLXggPSBuZXcgWCgpCi1wcmludGxuKHgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0V2YWxJblNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvRXZhbEluU2NyaXB0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkMzk0MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvRXZhbEluU2NyaXB0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWltcG9ydCBqYXZhLmlvLkZpbGUKLQotYSA9IDEKLWV2YWx1YXRlKCJhID0gMyIpCi1hc3NlcnQgYSA9PSAzCi0KLXByaW50bG4oIkRvbmUgYW5kIG5vdyBzZXQgYSB0byAke2F9IikKLQotCi1wcmludGxuKCJBYm91dCB0byBjYWxsIGFub3RoZXIgc2NyaXB0IikKLQotZXZhbHVhdGUobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9zY3JpcHQvSGVsbG9Xb3JsZC5ncm9vdnkiKSkKLQotcHJpbnRsbigiRG9uZSIpCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvSGVsbG9Xb3JsZC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvSGVsbG9Xb3JsZC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODEzYWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0hlbGxvV29ybGQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLXByaW50bG4gIkhlbGxvIHdvcmxkIgotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkMi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvSGVsbG9Xb3JsZDIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU2ZWYwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkMi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQoteCA9IFsnSmFtZXMnLCAnQm9iJywgJ0JyaWFuJ10KLXguZWFjaCB7IHByaW50bG4oImhlbGxvICIgKyBpdCkgfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFwRnJvbUxpc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcEZyb21MaXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwZWZkZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFwRnJvbUxpc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotY2xhc3MgTWFwRnJvbUxpc3QgewotICAgIHRhbGsoYSkgewotICAgICAgICBwcmludGxuKCJoZWxsbyAiK2EpCi0gICAgfQotCi0gICAgZG9pdChhcmdzKSB7Ci0gICAgICAgIGkgPSAxCi0gICAgICAgIGwgPSBbOl0KLSAgICAgICAgYXJncy5lYWNoIHsgCi0JICAgIHRhbGsoaXQpCi0JICAgIGwucHV0KGl0LGkrKykKLQkgICAgfQotICAgICAgICBsLmVhY2ggewotICAgICAgICAgICBwcmludGxuKGl0KQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0gICAgICAgIGEgPSBbJ3RvbScsJ2RpY2snLCdoYXJyeSddCi0gICAgICAgIHQgPSBuZXcgTWFwRnJvbUxpc3QoKQotICAgICAgICB0LmRvaXQoYSkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFya3VwVGVzdFNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFya3VwVGVzdFNjcmlwdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDU0NDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcmt1cFRlc3RTY3JpcHQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlcjsKLQotY2xhc3MgQmVhbiB7Ci0JU3RyaW5nIGIKLX07Ci0KLXQgPSBuZXcgQmVhbigpCi10LmIgPSAiaGVsbG8iCi1wcmludGxuIHQuYgotcHJpbnRsbiAidGVzdDogJHt0LmJ9IgotCi14bWwgPSBuZXcgTWFya3VwQnVpbGRlcigpCi1yb290ID0geG1sLmZvbyB7Ci0JYmFyIHsKLQkJLy8gd29ya3MKLQkJYmF6KCJ0ZXN0IikKLQkJLy8gZmFpbHMKLQkJYmF6KHQuYikKLQkJLy8gZmFpbHMKLQkJYmF6KCIke3QuYn0iKQotCX0KLX0gCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWV0aG9kVGVzdFNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWV0aG9kVGVzdFNjcmlwdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGYwMTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01ldGhvZFRlc3RTY3JpcHQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR1N0cmluZy5tZXRob2RzLmVhY2ggeyBwcmludGxuIGl0Lm5hbWUgfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1BhY2thZ2VTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1BhY2thZ2VTY3JpcHQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU3NDM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9QYWNrYWdlU2NyaXB0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc2NyaXB0Ci0KLXByaW50bG4oIkhlbGxvIHdvcmxkIikKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9TY3JpcHRUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9TY3JpcHRUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyN2ZjNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1pbXBvcnQgamF2YS5pby5GaWxlCi0KLWNsYXNzIFNjcmlwdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgdm9pZCB0ZXN0U2NyaXB0cygpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvc2NyaXB0IikKLSAgICAgICAgZmlsZS5lYWNoRmlsZSB7Ci0gICAgICAgICAgICBuYW1lID0gaXQubmFtZQotICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoJy5ncm9vdnknKSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ1NjcmlwdFRlc3QnKSkgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIH0KLQkJCQllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAJcnVuU2NyaXB0KGl0KSAKLQkJCQl9Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBydW5TY3JpcHQoZmlsZSkgewotICAgICAgICBwcmludGxuKCJSdW5uaW5nIHNjcmlwdDogIiArIGZpbGUpCi0gICAgICAgIAotICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCi0gICAgICAgIGFyZ3MgPSBbJ2EnLCAnYicsICdjJ10KLSAgICAgICAgCi0gICAgICAgIHNoZWxsLnJ1bihmaWxlLCBhcmdzKQotCi0gICAgICAgIC8qKiBAdG9kbyB0aGlzIGRvZXNuJ3Qgd29yayB3aGVuIHJhbiBpbiBhbiBJREU/Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICBzaGVsbC5ydW4oZmlsZSwgYXJncykKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcmludGxuKCJDYXVnaHQ6ICIgKyBlKQotICAgICAgICB9Ci0gICAgICAgICAqLwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0V2l0aEZ1bmN0aW9ucy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0V2l0aEZ1bmN0aW9ucy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDRiNzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1NjcmlwdFdpdGhGdW5jdGlvbnMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotZGVmIGZvbyhsaXN0LCB2YWx1ZSkgewotICAgIHByaW50bG4gIkNhbGxpbmcgZnVuY3Rpb24gZm9vKCkgd2l0aCBwYXJhbSAke3ZhbHVlfSIKLSAgICBsaXN0IDw8IHZhbHVlCi19Ci0KLXggPSBbXQotZm9vKHgsIDEpCi1mb28oeCwgMikKLWFzc2VydCB4ID09IFsxLCAyXQotCi1wcmludGxuICJDcmVhdGluZyBsaXN0ICR7eH0iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1Nob3dBcmdzLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9TaG93QXJncy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDA1NzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1Nob3dBcmdzLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi1mb3IgKGEgaW4gYXJncykgewotICAgIHByaW50bG4oIkFyZ3VtZW50OiAiICsgYSkKLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1VzZUNsb3N1cmVJblNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvVXNlQ2xvc3VyZUluU2NyaXB0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2OTE5NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zY3JpcHQvVXNlQ2xvc3VyZUluU2NyaXB0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYSA9IDEKLVsxXS5lYWNoIHsgCi0gICAgYSA9IGl0IAotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvUnVuQWxsR3Jvb3Z5U2NyaXB0c1N1aXRlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5BbGxHcm9vdnlTY3JpcHRzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5YjljNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5BbGxHcm9vdnlTY3JpcHRzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciA3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBncm9vdnkuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBSdW4gYWxsIHRoZSAuZ3Jvb3Z5IHNjcmlwdHMgZm91bmQgdW5kZXIgdGhlIHNyYy90ZXN0IHRyZWUgd2l0aCBhIHNlY3VyaXR5IG1hbmFnZXIgYWN0aXZlLgotICogTm90IGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBidWlsZCBiZWNhdXNlIGl0IGFkZHMgYWJvdXQgNCBtaW51dGVzIHRvIHRoZSBidWlsZCBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQotICovCi1wdWJsaWMgY2xhc3MgUnVuQWxsR3Jvb3Z5U2NyaXB0c1N1aXRlIGV4dGVuZHMgU2VjdXJpdHlUZXN0U3VwcG9ydCB7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFsbCBHcm9vdnkgc2NyaXB0IHRlc3QgY2FzZXMgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBleGVjdXRlIHRoZW0gd2l0aCBhIHNlY3VyaXR5IHBvbGljeSBpbiBlZmZlY3QuCi0gICAgICogVGhlIGNvbXBsZXRlIGZpbGVuYW1lIG9mIHRoZSBncm9vdnkgc291cmNlIGZpbGUgaXMgdXNlZCBhcyB0aGUgY29kZWJhc2Ugc28gdGhhdCB0aGUgcHJvcGVyIGdyYW50cyBjYW4gYmUKLSAgICAgKiBtYWRlIGZvciBlYWNoIHNjcmlwdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVGVzdHMoRmlsZSBkaXIsIFRlc3RSZXN1bHQgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotICAgICAgICBMaXN0IHRyYXZlcnNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2VMaXN0LmFkZChmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIlRlc3QuZ3Jvb3Z5IikgfHwgbmFtZS5lbmRzV2l0aCgiQnVnLmdyb292eSIpKSB7Ci0gICAgICAgICAgICAgICAgLy9pZiAobmFtZS5lbmRzV2l0aCgiSWFuTWFjZXlzQnVnLmdyb292eSIpKSB7Ci0gICAgICAgICAgICAgICAgCUNsYXNzIGNsYXp6ID0gcGFyc2VDbGFzcyhmaWxlKTsKLSAgICAgICAgICAgIAkJaWYgKFRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0gICAgICAgICAgICAJCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKGNsYXp6KTsKLSAgICAgICAgICAgIAkJCXN1aXRlLnJ1bihyZXN1bHQpOwotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRyYXZlcnNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4ZWN1dGVUZXN0cygoRmlsZSkgaXRlci5uZXh0KCksIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5U2NyaXB0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpZiAoIWlzU2VjdXJpdHlBdmFpbGFibGUoKSkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAJCVRlc3RSZXN1bHQgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTsKLSAgIAkJZXhlY3V0ZVRlc3RzKG5ldyBGaWxlKCJzcmMvdGVzdCIpLCByZXN1bHQpOwotICAgCQlpZiAoIXJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLSAgIAkJCW5ldyBTZWN1cml0eVRlc3RSZXN1bHRQcmludGVyKFN5c3RlbS5vdXQpLnByaW50KHJlc3VsdCk7Ci0gICAJCQlmYWlsKCJBdCBsZWFzdCBvbmUgZ3Jvb3Z5IHRlc3RjYXNlIGRpZCBub3QgcnVuIHVuZGVyIHRoZSBzZWN1cmUgZ3Jvb3Z5IGVudmlyb25tZW50LiAgUmVzdWx0cyBpbiB0aGUgdGVzdGNhc2Ugb3V0cHV0Iik7Ci0gICAJCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5PbmVHcm9vdnlTY3JpcHQuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1J1bk9uZUdyb292eVNjcmlwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU2MjkwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1J1bk9uZUdyb292eVNjcmlwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgcnVubmluZyBhIHNpbmdsZSBncm9vdnkgc2NyaXB0IHBhcnNlZCBmcm9tIGEgLmdyb292eSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgUnVuT25lR3Jvb3Z5U2NyaXB0IGV4dGVuZHMgU2VjdXJpdHlUZXN0U3VwcG9ydCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmaWxlOwotCQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZmlsZSA9IGFyZ3NbMF07Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgIAlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSdW5PbmVHcm9vdnlTY3JpcHQuY2xhc3MpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY3JpcHQoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2NyaXB0IiwgZmlsZSk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZmlsZW5hbWUgZ2l2ZW4gaW4gdGhlICdzY3JpcHQnIHN5c3RlbSBwcm9wZXJ0eSBzbyBjYW5ub3QgcnVuIGEgR3Jvb3Z5IHNjcmlwdCIpOwotICAgICAgICB9Ci0JCWFzc2VydEV4ZWN1dGUobmV3IEZpbGUoZmlsZU5hbWUpLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TZWN1cml0eVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1NlY3VyaXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U4NDc2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1NlY3VyaXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnNlY3VyaXR5OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q29kZVNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogVGVzdCB0aGUgZWZmZWN0cyBvZiBlbmFibGluZyBzZWN1cml0eSBpbiBHcm9vdnkuICBTb21lIHRlc3RzIGJlbG93IGNoZWNrIGZvciBwcm9wZXIgZnJhbWV3b3JrCi0gKiBiZWhhdmlvciAoZS5nLiBlbnN1cmluZyB0aGF0IEdyb292eUNvZGVTb3VyY2VzIG1heSBvbmx5IGJlIGNyZWF0ZWQgZm9yIHdoaWNoIHByb3BlciBwZXJtaXNzaW9ucyBleGlzdCkuCi0gKiBPdGhlciB0ZXN0cyBydW4gLmdyb292eSBzY3JpcHRzIHVuZGVyIGEgc2VjdXJlIGVudmlyb25tZW50IGFuZCBlbnN1cmUgdGhhdCB0aGUgcHJvcGVyIHBlcm1pc3Npb25zCi0gKiBhcmUgcmVxdWlyZWQgZm9yIHN1Y2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgU3RldmUgR29ldHplCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVRlc3QgZXh0ZW5kcyBTZWN1cml0eVRlc3RTdXBwb3J0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5VGVzdC5jbGFzcyk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdEZvcmJpZGRlblByb3BlcnR5KCkgewotCQlTdHJpbmcgc2NyaXB0ID0gIlN5c3RlbS5nZXRQcm9wZXJ0eShcInVzZXIuaG9tZVwiKSI7Ci0JCWFzc2VydEV4ZWN1dGUoc2NyaXB0LCBudWxsLCBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJ1c2VyLmhvbWUiLCAicmVhZCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuUGFja2FnZSgpIHsKLQkJU3RyaW5nIHNjcmlwdCA9ICJpbXBvcnQgc3VuLm5ldC4qOyBzID0gbmV3IE5ldHdvcmtDbGllbnQoKSI7Ci0JCWFzc2VydEV4ZWN1dGUoc2NyaXB0LCAiL2dyb292eS9zZWN1cml0eS90ZXN0Rm9yYmlkZGVuUGFja2FnZSIsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLioiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZvcmJpZGRlbkNvZGViYXNlKCkgewotCQlhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvZm9yYmlkZGVuQ29kZUJhc2UuZ3Z5IiksIG5ldyBHcm9vdnlDb2RlU291cmNlUGVybWlzc2lvbigiL2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZSIpKTsKLQl9Ci0JCi0JLy9DaGVjayB0aGF0IHRoZSBTZWN1cml0eSBwYWNrYWdlLmFjY2VzcyBjb250cm9sIHdvcmtzLgotCXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlQWNjZXNzKCkgewotCQlTdHJpbmcgc2NyaXB0ID0gIm5ldyBqYXZheC5wcmludC5QcmludEV4Y2VwdGlvbigpOyI7Ci0gICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJwYWNrYWdlLmFjY2VzcyIsICJqYXZheC5wcmludCIpOwotICAgICAgICAvL1RoaXMgc2hvdWxkIHRocm93IGFuIEFDRSBiZWNhdXNlIGl0cyBjb2RlQmFzZSBkb2VzIG5vdCBhbGxvdyBhY2Nlc3MgdG8gamF2YXgucHJpbnQKLQkJYXNzZXJ0RXhlY3V0ZShzY3JpcHQsICIvZ3Jvb3Z5L3NlY3VyaXR5L2phdmF4L3ByaW50L2RlbnkiLCBuZXcgUnVudGltZVBlcm1pc3Npb24oImFjY2Vzc0NsYXNzSW5QYWNrYWdlLmphdmF4LnByaW50IikpOwotCQkvL1RoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbiBBQ0UgYmVjYXVzZSBncm9vdnkucG9saWN5IGdyYW50cyB0aGUgY29kZUJhc2UgYWNjZXNzIHRvIGphdmF4LnByaW50Ci0JCWFzc2VydEV4ZWN1dGUoc2NyaXB0LCAiL2dyb292eS9zZWN1cml0eS9qYXZheC9wcmludC9hbGxvdyIsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFkU2NyaXB0TmFtZUJ1ZygpIHsKLQkJYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmFkU2NyaXB0TmFtZUJ1Zy5ncm9vdnkiKSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb3N1cmVMaXN0ZW5lclRlc3QoKSB7Ci0JCWFzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9DbG9zdXJlTGlzdGVuZXJUZXN0Lmdyb292eSIpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZU1ldGhvZFRlc3QoKSB7Ci0JCWFzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkiKSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdyb292eU1ldGhvZHNUZXN0KCkgewotCQlhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5TWV0aG9kc1Rlc3QuZ3Jvb3Z5IiksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlV2l0aERlZmF1bHRQYXJhbVRlc3QoKSB7Ci0JCWFzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9DbG9zdXJlV2l0aERlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5IiksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHcm9vdnkzMDNfQnVnKCkgewotCQlhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkzMDNfQnVnLmdyb292eSIpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0VGVzdCgpIHsKLQkJYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9TY3JpcHRUZXN0Lmdyb292eSIpLCBudWxsKTsKLQl9Ci0JCi0JLy9JbiBhZGRpdGlvbiB0byByZXF1aXJpbmcgc2V2ZXJhbCBwZXJtaXNzaW9ucywgdGhpcyB0ZXN0IGlzIGFuIGV4YW1wbGUgb2YgdGhlIGNhc2UKLQkvL3doZXJlIHRoZSBncm9vdnkgY2xhc3MgbG9hZGVyIGlzIHJlcXVpcmVkIGF0IHNjcmlwdCBpbnZvY2F0aW9uIHRpbWUgYXMgd2VsbCBhcwotCS8vZHVyaW5nIGNvbXBpbGF0aW9uLgotCXB1YmxpYyB2b2lkIHRlc3RTcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdCgpIHsKLQkJYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkiKSwgbnVsbCk7Ci0JfQotCQotCS8vVGVzdCB0byBwcmV2ZW50IHNjcmlwdHMgZnJvbSBpbnZva2luZyB0aGUgZ3Jvb3Z5IGNvbXBpbGVyLiAgVGhpcyBpcyBkb25lIGJ5IHJlc3RyaWN0aW5nIGFjY2VzcwotCS8vdG8gdGhlIG9yZy5jb2RlaGF1cy5ncm9vdnkgcGFja2FnZXMuCi0JcHVibGljIHZvaWQgdGVzdE1ldGFDbGFzc1Rlc3QoKSB7Ci0gICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJwYWNrYWdlLmFjY2VzcyIsICJvcmcuY29kZWhhdXMuZ3Jvb3Z5Iik7Ci0JCWFzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWV0YUNsYXNzVGVzdC5ncm9vdnkiKSwgbmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJhY2Nlc3NDbGFzc0luUGFja2FnZS5vcmcuY29kZWhhdXMuZ3Jvb3Z5IikpOwotCX0KLQkKLQkvL01haWxpbmcgbGlzdCBwb3N0IGJ5IFJpY2hhcmQgSGVuc2xleSByZXBvcnRpbmcgYSBDb2RlU291cmNlIGJ1Zy4gIEEgR3Jvb3Z5Q29kZVNvdXJjZSBjcmVhdGVkCi0JLy93aXRoIGEgVVJMIHdhcyBjYXVzaW5nIGFuIE5QRS4KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZVNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gewotCQlVUkwgc2NyaXB0ID0gbG9hZGVyLmdldFJlc291cmNlKCJncm9vdnkvQXJyYXlUZXN0Lmdyb292eSIpOwotCQlHcm9vdnlDb2RlU291cmNlIGdjcyA9IG5ldyBHcm9vdnlDb2RlU291cmNlKHNjcmlwdCk7Ci0JCUNsYXNzIHJlc3VsdCA9IGxvYWRlci5wYXJzZUNsYXNzKGdjcyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0U3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0U3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRkMDNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1NlY3VyaXR5VGVzdFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zZWN1cml0eTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q29kZVNvdXJjZTsKLWltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBvbGljeTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5SZXN1bHRQcmludGVyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBTdGV2ZSBHb2V0emUKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5VGVzdFN1cHBvcnQgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY291bnRlciA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZWN1cml0eURpc2FibGVkOyAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlY3VyaXR5QXZhaWxhYmxlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VjdXJpdHlDaGVja2VkID0gZmFsc2U7Ci0KLQlzdGF0aWMgewotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkuc2VjdXJpdHkuZGlzYWJsZWQiKSAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eUF2YWlsYWJsZSA9IGZhbHNlOwotCQkJc2VjdXJpdHlEaXNhYmxlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN1cml0eURpc2FibGVkID0gZmFsc2U7Ci0JCQlTdHJpbmcgZ3Jvb3Z5TGliRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkubGliIik7Ci0JCQlpZiAoZ3Jvb3Z5TGliRGlyID09IG51bGwpIHsKLQkJCQkvL1RyeSB0byBmaW5kIG1hdmVuIHJlcG9zaXRvcnkgaW4gdGhlIGRlZmF1bHQgdXNlci5ob21lIGxvY2F0aW9uCi0JCQkJZ3Jvb3Z5TGliRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArICIvIiArICIubWF2ZW4vcmVwb3NpdG9yeSI7Ci0JCQl9Ci0JCQlpZiAoZ3Jvb3Z5TGliRGlyID09IG51bGwpIHsKLQkJCQkvL1RyeSBhdCB1c2VyLmRpci9saWIKLQkJCQlncm9vdnlMaWJEaXIgPSAibGliIjsKLQkJCX0KLQkJCWlmIChuZXcgRmlsZShncm9vdnlMaWJEaXIpLmV4aXN0cygpKSB7Ci0JCQkJc2VjdXJpdHlBdmFpbGFibGUgPSB0cnVlOwotCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZ3Jvb3Z5LmxpYiIsIGdyb292eUxpYkRpcik7Ci0JCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LnBvbGljeSIsICI9c2VjdXJpdHkvZ3Jvb3Z5LnBvbGljeSIpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWN1cml0eUF2YWlsYWJsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VjdXJpdHlBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBzZWN1cml0eUF2YWlsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWN1cml0eURpc2FibGVkKCkgewotCQlyZXR1cm4gc2VjdXJpdHlEaXNhYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTZWN1cml0eVBvbGljeShTdHJpbmcgcG9saWN5RmlsZVVSTCkgewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkucG9saWN5IiwgcG9saWN5RmlsZVVSTCk7Ci0JCVBvbGljeS5nZXRQb2xpY3koKS5yZWZyZXNoKCk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBTZWN1cml0eVRlc3RSZXN1bHRQcmludGVyIGV4dGVuZHMgUmVzdWx0UHJpbnRlciB7Ci0JCQotCQlwdWJsaWMgU2VjdXJpdHlUZXN0UmVzdWx0UHJpbnRlcihQcmludFN0cmVhbSBzdHJlYW0pIHsKLQkJCXN1cGVyKHN0cmVhbSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJpbnQoVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJCWdldFdyaXRlcigpLnByaW50bG4oIlNlY3VyaXR5IHRlc3Rpbmcgb24gYSBncm9vdnkgdGVzdCBmYWlsZWQ6Iik7Ci0JCSAgICBwcmludEVycm9ycyhyZXN1bHQpOwotCQkgICAgcHJpbnRGYWlsdXJlcyhyZXN1bHQpOwotCQkgICAgcHJpbnRGb290ZXIocmVzdWx0KTsKLQkJfQotCX07Ci0KLSAgICBwcm90ZWN0ZWQgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0gKEdyb292eUNsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLQkJcHVibGljIE9iamVjdCBydW4oKSB7Ci0JCQlyZXR1cm4gbmV3IEdyb292eUNsYXNzTG9hZGVyKFNlY3VyaXR5VGVzdFN1cHBvcnQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IAotCQl9Ci0JfSk7Ci0gICAgCi0JcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3VycmVudENsYXNzTG9hZGVyOwotCi0JcHVibGljIFNlY3VyaXR5VGVzdFN1cHBvcnQoKSB7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgU2VjdXJpdHlTdXBwb3J0IHRvIHNlZSBpZiBzZWN1cml0eSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiAgSWYgbm90LCBmYWlsIHRoZSBmaXJzdAotCSAqIHRlc3QgdGhhdCBydW5zLiAgQWxsIHJlbWFpbmluZyB0ZXN0cyB3aWxsIHJ1biwgYnV0IG5vdCBkbyBhbnkgc2VjdXJpdHkgY2hlY2tpbmcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrU2VjdXJpdHkoKSB7Ci0JCWlmICghc2VjdXJpdHlDaGVja2VkKSB7Ci0JCQlzZWN1cml0eUNoZWNrZWQgPSB0cnVlOwotCQkJaWYgKCFpc1NlY3VyaXR5QXZhaWxhYmxlKCkpIHsKLQkJCQlmYWlsKCJTZWN1cml0eSBpcyBub3QgYXZhaWxhYmxlIC0gc2tpcHBpbmcgc2VjdXJpdHkgdGVzdHMuICBFbnN1cmUgdGhhdCBncm9vdnkubGliIGlzIHNldCBhbmQgcG9pbnRzIHRvIHRoZSBncm9vdnkgZGVwZW5kZW5jeSBqYXJzLiIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1NlY3VyaXR5QXZhaWxhYmxlKCk7Ci0JfQotCi0JLy9QcmVwYXJlIGZvciBlYWNoIHNlY3VyaXR5IHRlc3QuICBGaXJzdCwgY2hlY2sgdG8gc2VlIGlmIGdyb292eS5saWIgY2FuIGJlIGRldGVybWluZWQgdmlhCi0JLy9hIGNhbGwgdG8gY2hlY2tTZWN1cml0eSgpLiAgSWYgbm90LCBmYWlsKCkgdGhlIGZpcnN0IHRlc3QuICBFc3RhYmxpc2ggYSBzZWN1cml0eSBtYW5hZ2VyCi0JLy9hbmQgbWFrZSB0aGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgdGhlIGluaXRpYXRpbmcgY2xhc3MgbG9hZGVyIChhbGEgR3Jvb3Z5U2hlbGwpIHRvIGNvbXBpbGUgQU5ECi0JLy9pbnZva2UgdGhlIHRlc3Qgc2NyaXB0cy4gIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBtdWx0aXBsZSAuZ3Jvb3Z5IHNjcmlwdHMgYXJlIGludm9sdmVkIGluIGEKLQkvL3Rlc3QgY2FzZTogYS5ncm9vdnkgZGVwZW5kcyBvbiBiLmdyb292eTsgYS5ncm9vdnkgaXMgcGFyc2VkIChhbmQgaW4gdGhlIHByb2Nlc3MgdGhlIGdjbAotCS8vbG9hZHMgYi5ncm9vdnkgdmlhIGZpbmRDbGFzcykuICBOb3RlIHRoYXQgYi5ncm9vdnkgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIGdyb292eSBjbGFzcyBsb2FkZXIuCi0JLy9TZWUgCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCWlmIChjaGVja1NlY3VyaXR5KCkpIHsKLQkJCXNlY3VyaXR5TWFuYWdlciA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLQkJCWlmIChzZWN1cml0eU1hbmFnZXIgPT0gbnVsbCkgewotCSAgICAJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKLQkJCX0KLQkJfQotCQljdXJyZW50Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIoc2VjdXJpdHlNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50Q2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBnZW5lcmF0ZUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJ0ZXN0U2VjdXJpdHkiICsgKCsrY291bnRlcik7Ci0gICAgfQotCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBncm9vdnkgc2NyaXB0IGNvbnRhaW5lZCBpbiBmaWxlLiAgSWYgbWlzc2luZ1Blcm1pc3Npb24KLQkgKiBpcyBub24tbnVsbCwgdGhlbiB0aGlzIGludm9jYXRpb24gZXhwZWN0cyBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdpdGggbWlzc2luZ1Blcm1pc3Npb24KLQkgKiBhcyB0aGUgcmVhc29uLiAgSWYgbWlzc2luZ1Blcm1pc3Npb24gaXMgbnVsbCwgdGhlIHNjcmlwdCBpcyBleHBlY3RlZCB0byBleGVjdXRlIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgcGFyc2VDbGFzcyhGaWxlIGZpbGUpIHsKLQkJR3Jvb3Z5Q29kZVNvdXJjZSBnY3MgPSBudWxsOwotCQl0cnkgewotCQkJZ2NzID0gbmV3IEdyb292eUNvZGVTb3VyY2UoZmlsZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQlmYWlsKGZuZmUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlQ2xhc3MoZ2NzKTsKLQl9Ci0KLSAgICAvKgotCSAqIFBhcnNlIHRoZSBHcm9vdnkgY29kZSBjb250YWluZWQgaW4gdGhlIEdyb292eUNvZGVTb3VyY2UgYXMgYSBwcml2aWxlZ2VkIG9wZXJhdGlvbiAoaS5lLiBkbyBub3QKLQkgKiByZXF1aXJlIHRoZSBjb2RlIHNvdXJjZSB0byBoYXZlIHNwZWNpZmljIGNvbXBpbGUgdGltZSBwZXJtaXNzaW9ucykgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBwYXJzZUNsYXNzKGZpbmFsIEdyb292eUNvZGVTb3VyY2UgZ2NzKSB7Ci0JCUNsYXNzIGNsYXp6ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNsYXp6ID0gbG9hZGVyLnBhcnNlQ2xhc3MoZ2NzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gY2xheno7Ci0JfQotICAgIAotICAgIC8qCi0JICogUGFyc2UgdGhlIHNjcmlwdCBjb250YWluZWQgaW4gdGhlIEdyb292eUNvZGVTb3VyY2UgYXMgYSBwcml2aWxlZ2VkIG9wZXJhdGlvbiAoaS5lLiBkbyBub3QKLQkgKiByZXF1aXJlIHRoZSBjb2RlIHNvdXJjZSB0byBoYXZlIHNwZWNpZmljIGNvbXBpbGUgdGltZSBwZXJtaXNzaW9ucykuICBJZiB0aGUgY2xhc3MgcHJvZHVjZWQgaXMgYQotCSAqIFRlc3RDYXNlLCBydW4gdGhlIHRlc3QgaW4gYSBzdWl0ZSBhbmQgZXZhbHVhdGUgYWdhaW5zdCB0aGUgbWlzc2luZ1Blcm1pc3Npb24uCi0JICogT3RoZXJ3aXNlLCBydW4gdGhlIGNsYXNzIGFzIGEgZ3Jvb3Z5IHNjcmlwdCBhbmQgZXZhbHVhdGUgYWdhaW5zdCB0aGUgbWlzc2luZ1Blcm1pc3Npb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQW5kRXhlY3V0ZShmaW5hbCBHcm9vdnlDb2RlU291cmNlIGdjcywgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgewotCQlDbGFzcyBjbGF6eiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGF6eiA9IGxvYWRlci5wYXJzZUNsYXNzKGdjcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKFRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0JCQlleGVjdXRlVGVzdChjbGF6eiwgbWlzc2luZ1Blcm1pc3Npb24pOwotCQl9IGVsc2UgewotCQkJZXhlY3V0ZVNjcmlwdChjbGF6eiwgbWlzc2luZ1Blcm1pc3Npb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRlc3QoQ2xhc3MgdGVzdCwgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0KTsKLSAgICAgICAgVGVzdFJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOwotICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KTsKLSAgICAgICAgaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLSAgICAgICAgCWlmIChtaXNzaW5nUGVybWlzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgIAkJcmV0dXJuOwotICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgCQlmYWlsKCJTZWN1cml0eSB0ZXN0IGV4cGVjdGVkIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb24gIiArIG1pc3NpbmdQZXJtaXNzaW9uICsgIiwgYnV0IGRpZCBub3QgcmVjZWl2ZSBvbmUiKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWlmIChtaXNzaW5nUGVybWlzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgIAkJbmV3IFNlY3VyaXR5VGVzdFJlc3VsdFByaW50ZXIoU3lzdGVtLm91dCkucHJpbnQocmVzdWx0KTsKLSAgICAgICAgCQlmYWlsKCJTZWN1cml0eSB0ZXN0IHdhcyBleHBlY3RlZCB0byBydW4gc3VjY2Vzc2Z1bGx5LCBidXQgZmFpbGVkIChyZXN1bHRzIG9uIFN5c3RlbS5vdXQpIik7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCS8vVGhlcmUgbWF5IGJlIG1vcmUgdGhhbiAxIGZhaWx1cmU6ICBpdGVyYXRlIHRvIGVuc3VyZSB0aGF0IHRoZXkgYWxsIG1hdGNoIHRoZSBtaXNzaW5nUGVybWlzc2lvbi4KLSAgICAgICAgCQlib29sZWFuIG90aGVyRmFpbHVyZSA9IGZhbHNlOwotICAgICAgICAJCWZvciAoRW51bWVyYXRpb24gZSA9IHJlc3VsdC5lcnJvcnMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgIAkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSAoVGVzdEZhaWx1cmUpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgCQkJaWYgKGZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKSB7Ci0gICAgICAgIAkJCQlBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSA9IChBY2Nlc3NDb250cm9sRXhjZXB0aW9uKSBmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpOwotICAgICAgICAJCQkJaWYgKG1pc3NpbmdQZXJtaXNzaW9uLmltcGxpZXMoYWNlLmdldFBlcm1pc3Npb24oKSkpIHsKLSAgICAgICAgCQkJCQljb250aW51ZTsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfQotICAgICAgICAJCQlvdGhlckZhaWx1cmUgPSB0cnVlOyAgICAgICAgCQkJCi0gICAgICAgIAkJfQotICAgICAgICAJCWlmIChvdGhlckZhaWx1cmUpIHsKLSAgICAgICAgCQkJbmV3IFNlY3VyaXR5VGVzdFJlc3VsdFByaW50ZXIoU3lzdGVtLm91dCkucHJpbnQocmVzdWx0KTsKLSAgICAgICAgCQkJZmFpbCgiU2VjdXJpdHkgdGVzdCBleHBlY3RlZCBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIG9uICIgKyBtaXNzaW5nUGVybWlzc2lvbiArICIsIGJ1dCAgZmFpbGVkIGZvciBvdGhlciByZWFzb25zIChyZXN1bHRzIG9uIFN5c3RlbS5vdXQpIik7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVNjcmlwdChDbGFzcyBzY3JpcHRDbGFzcywgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgewotCQl0cnkgewotCQkJU2NyaXB0IHNjcmlwdCA9IEludm9rZXJIZWxwZXIuY3JlYXRlU2NyaXB0KHNjcmlwdENsYXNzLCBuZXcgQmluZGluZygpKTsKLQkJCXNjcmlwdC5ydW4oKTsKLQkJCS8vSW52b2tlckhlbHBlci5ydW5TY3JpcHQoc2NyaXB0Q2xhc3MsIG51bGwpOwotCQl9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgewotCQkJaWYgKG1pc3NpbmdQZXJtaXNzaW9uICE9IG51bGwgJiYgbWlzc2luZ1Blcm1pc3Npb24uaW1wbGllcyhhY2UuZ2V0UGVybWlzc2lvbigpKSkgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZmFpbChhY2UudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1pc3NpbmdQZXJtaXNzaW9uICE9IG51bGwpIHsKLQkJCWZhaWwoIlNob3VsZCBjYXRjaCBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBncm9vdnkgc2NyaXB0IGNvbnRhaW5lZCBpbiBmaWxlLiAgSWYgbWlzc2luZ1Blcm1pc3Npb24KLQkgKiBpcyBub24tbnVsbCwgdGhlbiB0aGlzIGludm9jYXRpb24gZXhwZWN0cyBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdpdGggbWlzc2luZ1Blcm1pc3Npb24KLQkgKiBhcyB0aGUgcmVhc29uLiAgSWYgbWlzc2luZ1Blcm1pc3Npb24gaXMgbnVsbCwgdGhlIHNjcmlwdCBpcyBleHBlY3RlZCB0byBleGVjdXRlIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFeGVjdXRlKEZpbGUgZmlsZSwgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgewotCQlpZiAoIWlzU2VjdXJpdHlBdmFpbGFibGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUdyb292eUNvZGVTb3VyY2UgZ2NzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdjcyA9IG5ldyBHcm9vdnlDb2RlU291cmNlKGZpbGUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJZmFpbChmbmZlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXBhcnNlQW5kRXhlY3V0ZShnY3MsIG1pc3NpbmdQZXJtaXNzaW9uKTsKLQl9Ci0JCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBzY3JpcHQgcmVwcmVzZW50ZWQgYnkgc2NyaXB0U3RyIHVzaW5nIHRoZSBzdXBwbGllZCBjb2RlYmFzZS4gIElmIG1pc3NpbmdQZXJtaXNzaW9uCi0JICogaXMgbm9uLW51bGwsIHRoZW4gdGhpcyBpbnZvY2F0aW9uIGV4cGVjdHMgYW4gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aXRoIG1pc3NpbmdQZXJtaXNzaW9uCi0JICogYXMgdGhlIHJlYXNvbi4gIElmIG1pc3NpbmdQZXJtaXNzaW9uIGlzIG51bGwsIHRoZSBzY3JpcHQgaXMgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXhlY3V0ZShTdHJpbmcgc2NyaXB0U3RyLCBTdHJpbmcgY29kZUJhc2UsIFBlcm1pc3Npb24gbWlzc2luZ1Blcm1pc3Npb24pIHsKLQkJaWYgKCFpc1NlY3VyaXR5QXZhaWxhYmxlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29kZUJhc2UgPT0gbnVsbCkgewotCQkJY29kZUJhc2UgPSAiL2dyb292eS9zZWN1cml0eS90ZXN0IjsKLQkJfQotCQlwYXJzZUFuZEV4ZWN1dGUobmV3IEdyb292eUNvZGVTb3VyY2Uoc2NyaXB0U3RyLCBnZW5lcmF0ZUNsYXNzTmFtZSgpLCBjb2RlQmFzZSksIG1pc3NpbmdQZXJtaXNzaW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TaWduZWRKYXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TaWduZWRKYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTg5ODQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2lnbmVkSmFyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc2VjdXJpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi0KLS8qKgotICogUmVhZCBhIC5ncm9vdnkgZmlsZSBmcm9tIGEgc2lnbmVkIGphciBhbmQgdmVyaWZ5IHRoYXQgYSBwb2xpY3kgZmlsZSBncmFudCB3aXRoIGEgc2lnbmVkQnkgZmllbGQKLSAqIHdvcmtzLiAgVGhlIGZvbGxvd2luZyBzdGVwcyB3ZXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgdGhlIGtleXMgdXNlZCB0byBzaWduIGFuZCByZWFkIHRoZSBqYXI6Ci0gKiA8b2w+Ci0gKiA8bGk+a2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyBncm9vdnkgLWtleXBhc3Mga2V5cGFzcyAta2V5c3RvcmUgZ3Jvb3Z5c3RvcmUgLXN0b3JlcGFzcyBzdG9yZXBhc3MgLXZhbGlkaXR5IDcwMDAKLSAqIDxsaT5rZXl0b29sIC1leHBvcnQgLWtleXN0b3JlIGdyb292eXN0b3JlIC1hbGlhcyBncm9vdnkgLWZpbGUgR3Jvb3Z5RGV2LmNlcgotICogPGxpPmtleXRvb2wgLWltcG9ydCAtYWxpYXMgZ3Jvb3Z5IC1maWxlIEdyb292eURldi5jZXIgLWtleXN0b3JlIGdyb292eWtleXMKLSAqIDwvb2w+Ci0gKiBPbmNlIHRoZSBrZXlzIGFyZSBjb25zdHJ1Y3RlZCwgY3JlYXQgdGhlIGphciBhbmQgc2lnbjoKLSAqIDxvbD4KLSAqIDxsaT5qYXIgLWN2ZiBHcm9vdnkuamFyIGdyb292eQotICogPGxpPmphcnNpZ25lciAta2V5c3RvcmUgZ3Jvb3Z5c3RvcmUgLXNpZ25lZGphciBHcm9vdnlKYXJUZXN0LmphciBHcm9vdnkuamFyIGdyb292eQotICogPC9vbD4KLSAqIEFkZCB0aGUga2V5c3RvcmUgdG8gdGhlIHBvbGljeSBmaWxlIGFuZCB3cml0ZSB0aGUgZ3JhbnQ6Ci0gKiA8b2w+Ci0gKiA8bGk+a2V5c3RvcmUgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2dyb292eWtleXMiOwotICogPC9vbD4KLSAqLwotcHVibGljIGNsYXNzIFNpZ25lZEphclRlc3QgZXh0ZW5kcyBTZWN1cml0eVRlc3RTdXBwb3J0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oIHN1aXRlKCkgKTsKLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCXJldHVybiBuZXcgVGVzdFN1aXRlKFNpZ25lZEphclRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2lnbmVkSmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWlmICghaXNTZWN1cml0eUF2YWlsYWJsZSgpKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoImdyb292eS5zZWN1cml0eS5KYXJUZXN0Iik7Ci0gICAgCWV4ZWN1dGVUZXN0KGMsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2ZvcmJpZGRlbkNvZGVCYXNlLmd2eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2ZvcmJpZGRlbkNvZGVCYXNlLmd2eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMDE0MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZS5ndnkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qCi0gKiBHcm9vdnkgc2NyaXB0IHRvIGJlIHJlYWQgYXMgYSBmaWxlIHRvIHRlc3QgdGhlIGZpbGUgYmFzZWQgY29kZXNvdXJjZSBmZWF0dXJlcyBvZiBncm9vdnkgc2VjdXJpdHkuCi0gKiBUaGUgZmlsZSBleHRlbnNpb24gb2YgLmd2eSBpcyB1c2VkIHRvIHByZXZlbnQgdGhpcyBzY3JpcHQgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgZ3Jvb3Z5IHNjcmlwdCBieSBtYXZlbi4KLSAqLwotIAotbmV3IEdyb292eVNoZWxsKCkuZXZhbHVhdGUoIjErMiIsICJmb3JiaWRkZW5Db2RlQmFzZVRlc3QiLCAiL2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZSIpOwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1BlcnNvbi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvUGVyc29uLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNjIwMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvUGVyc29uLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3FsCi0KLWNsYXNzIFBlcnNvbiB7Ci0KLSAgICBwcm9wZXJ0eSBmaXJzdE5hbWUKLSAgICBwcm9wZXJ0eSBsYXN0TmFtZQotICAgIHByb3BlcnR5IGFnZQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1BlcnNvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1BlcnNvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMyMjQzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9QZXJzb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnNxbAotCi1pbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2UKLQotaW1wb3J0IG9yZy5heGlvbmRiLmpkYmMuQXhpb25EYXRhU291cmNlCi0KLWNsYXNzIFBlcnNvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcm9wZXJ0eSB0eXBlCi0gICAgCi0gICAgdm9pZCB0ZXN0Rm9vKCkgewotICAgICAgICBwZXJzb25zID0gY3JlYXRlRGF0YVNldCgpCi0JCQotICAgICAgICBibG9ncyA9IHBlcnNvbnMuZmluZEFsbCB7IGl0Lmxhc3ROYW1lID09ICJCbG9nZ3MiIH0KLQkJCi0gICAgICAgIGFzc2VydFNxbChibG9ncywgInNlbGVjdCAqIGZyb20gcGVyc29uIHdoZXJlIGxhc3ROYW1lID0gPyIsIFsnQmxvZ2dzJ10pCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0V2hlcmVXaXRoQW5kQ2xhdXNlKCkgewotICAgICAgICBwZXJzb25zID0gY3JlYXRlRGF0YVNldCgpCi0JCQotICAgICAgICBibG9ncyA9IHBlcnNvbnMuZmluZEFsbCB7IGl0Lmxhc3ROYW1lID09ICJCbG9nZ3MiIH0KLSAgICAgICAgCi0gICAgICAgIGJpZ0Jsb2dzID0gYmxvZ3MuZmluZEFsbCB7IGl0LnNpemUgPiAxMDAgfQotCQkKLSAgICAgICAgYXNzZXJ0U3FsKGJpZ0Jsb2dzLCAic2VsZWN0ICogZnJvbSBwZXJzb24gd2hlcmUgbGFzdE5hbWUgPSA/IGFuZCBzaXplID4gPyIsIFsnQmxvZ2dzJywgMTAwXSkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RXaGVyZUNsb3N1cmVXaXRoQW5kKCkgewotICAgICAgICBwZXJzb25zID0gY3JlYXRlRGF0YVNldCgpCi0JCQotICAgICAgICBibG9ncyA9IHBlcnNvbnMuZmluZEFsbCB7IGl0LnNpemUgPCAxMCAmJiBpdC5sYXN0TmFtZSA9PSAiQmxvZ2dzIiB9Ci0JCQotICAgICAgICBhc3NlcnRTcWwoYmxvZ3MsICJzZWxlY3QgKiBmcm9tIHBlcnNvbiB3aGVyZSBzaXplIDwgPyBhbmQgbGFzdE5hbWUgPSA/IiwgWzEwLCAnQmxvZ2dzJ10pCi0gICAgfQotIAotICAgIHByb3RlY3RlZCBjb21wYXJlRm4odmFsdWUpIHsKLSAgICAgICAgdmFsdWUgPiAxICYmIHZhbHVlIDwgMTAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFzc2VydFNxbChkYXRhU2V0LCBleHBlY3RlZFNxbCwgZXhwZWN0ZWRQYXJhbXMpIHsKLSAgICAgICAgc3FsID0gZGF0YVNldC5zcWwKLSAgICAgICAgcGFyYW1zID0gZGF0YVNldC5wYXJhbWV0ZXJzCi0gICAgICAgIGFzc2VydCBzcWwgPT0gZXhwZWN0ZWRTcWwKLSAgICAgICAgYXNzZXJ0IHBhcmFtcyA9PSBleHBlY3RlZFBhcmFtcwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgY3JlYXRlRGF0YVNldCgpIHsKLSAgICAgICAgdHlwZSA9IFBlcnNvbgotCQotICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsIDogImZhaWxlZCB0byBsb2FkIFBlcnNvbiBjbGFzcyIKLSAgICAKLSAgICAgICAgZGF0YVNvdXJjZSA9IGNyZWF0ZURhdGFTb3VyY2UoKQotICAgICAgICBzcWwgPSBuZXcgU3FsKGRhdGFTb3VyY2UpCi0gICAgICAgIAotICAgICAgICByZXR1cm4gc3FsLmRhdGFTZXQodHlwZSkKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIERhdGFTb3VyY2UgY3JlYXRlRGF0YVNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBeGlvbkRhdGFTb3VyY2UoImpkYmM6YXhpb25kYjpmb28iICsgZ2V0TWV0aG9kTmFtZSgpKQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbENvbXBsZXRlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDMxNDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbENvbXBsZXRlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3FsCi0KLWNsYXNzIFNxbENvbXBsZXRlVGVzdCBleHRlbmRzIFRlc3RIZWxwZXIgewotCi0gICAgdm9pZCB0ZXN0U3FsUXVlcnkoKSB7Ci0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpICAgICAKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdHMgPSBbOl0KLSAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gUEVSU09OIikgeyByZXN1bHRzLnB1dChpdC5maXJzdG5hbWUsIGl0Lmxhc3RuYW1lKSB9Ci0gICAgICAgIAotICAgICAgICBleHBlY3RlZCA9IFsiSmFtZXMiOiJTdHJhY2hhbiIsICJCb2IiOiJNY3doaXJ0ZXIiLCAiU2FtIjoiUHVsbGFyYSJdCi0JCQkJCQotICAgICAgICBhc3NlcnQgcmVzdWx0cyA9PSBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhXaGVyZUNsYXVzZSgpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgZm9vID0gImRyaW5rIgotICAgICAgICByZXN1bHRzID0gW10KLSAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gRk9PRCB3aGVyZSB0eXBlPSR7Zm9vfSIpIHsgcmVzdWx0cy5hZGQoaXQubmFtZSkgfQotICAgICAgICAKLSAgICAgICAgZXhwZWN0ZWQgPSBbImJlZXIiLCAiY29mZmVlIl0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U3FsUXVlcnlXaXRoV2hlcmVDbGF1c2VXaXRoMkFyZ3VtZW50cygpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgZm9vID0gImNoZWVzZSIKLSAgICAgICAgYmFyID0gImVkYW0iCi0gICAgICAgIHJlc3VsdHMgPSBbXQotICAgICAgICBzcWwuZWFjaFJvdygic2VsZWN0ICogZnJvbSBGT09EIHdoZXJlIHR5cGU9JHtmb299IGFuZCBuYW1lICE9ICR7YmFyfSIpIHsgcmVzdWx0cy5hZGQoaXQubmFtZSkgfQotICAgICAgICAKLSAgICAgICAgZXhwZWN0ZWQgPSBbImJyaWUiLCAiY2hlZGRhciJdCi0gICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0U3FsUXVlcnlXaXRoMlBhcmFtZXRlcnNVc2luZ1F1ZXN0aW9uTWFya05vdGF0aW9uKCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKSAgICAgCi0gICAgICAgIAotICAgICAgICByZXN1bHRzID0gW10KLSAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gRk9PRCB3aGVyZSB0eXBlPT8gYW5kIG5hbWUgIT0gPyIsIFsiY2hlZXNlIiwgImVkYW0iXSkgeyByZXN1bHRzLmFkZChpdC5uYW1lKSB9Ci0gICAgICAgIAotICAgICAgICBleHBlY3RlZCA9IFsiYnJpZSIsICJjaGVkZGFyIl0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3REYXRhU2V0KCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKSAgICAgCi0gICAgICAgIAotICAgICAgICByZXN1bHRzID0gW10KLSAgICAgICAgcGVvcGxlID0gc3FsLmRhdGFTZXQoIlBFUlNPTiIpCi0gICAgICAgIHBlb3BsZS5lYWNoIHsgcmVzdWx0cy5hZGQoaXQuZmlyc3RuYW1lKSB9Ci0gICAgICAgIAotICAgICAgICBleHBlY3RlZCA9IFsiSmFtZXMiLCAiQm9iIiwgIlNhbSJdCi0gICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdERhdGFTZXRXaXRoQ2xvc3VyZVByZWRpY2F0ZSgpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgcmVzdWx0cyA9IFtdCi0gICAgICAgIGZvb2QgPSBzcWwuZGF0YVNldCgiRk9PRCIpCi0gICAgICAgIGZvb2QuZmluZEFsbCB7IGl0LnR5cGUgPT0gImNoZWVzZSIgfS5lYWNoIHsgcmVzdWx0cy5hZGQoaXQubmFtZSkgfQotICAgICAgICAKLSAgICAgICAgZXhwZWN0ZWQgPSBbImVkYW0iLCAiYnJpZSIsICJjaGVkZGFyIl0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VXBkYXRpbmdEYXRhU2V0KCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKSAgICAgCi0gICAgICAgIAotICAgICAgICByZXN1bHRzID0gW10KLSAgICAgICAgZmVhdHVyZXMgPSBzcWwuZGF0YVNldCgiRkVBVFVSRSIpCi0gICAgICAgIGZlYXR1cmVzLmVhY2ggeyAKLSAgICAgICAgICAgIC8qKiBAdG9kbyBBeGlvbiBkb2Vzbid0IHlldCBzdXBwb3J0IFJlc3VsdFNldCB1cGRhdGluZwotICAgICAgICAgICAgaWYgKGl0LmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICBpdC5uYW1lID0gaXQubmFtZSArICIgUm9ja3MhIgotICAgICAgICAgICAgICAgIHByaW50bG4oIkNoYW5naW5nIG5hbWUgdG8gJHtpdC5uYW1lfSIpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVzdWx0cy5hZGQoaXQubmFtZSkgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV4cGVjdGVkID0gWyJHRE8iLCAiR1BhdGgiLCAiR3Jvb3Z5TWFya3VwIl0KLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0R1N0cmluZ1RvU3FsQ29udmVyc2lvbigpewotICAgICAgIGZvbyA9ICdsb2luY2xvdGgnCi0gICAgICAgYmFyID0gJ3dhc3RlYmFuZCcKLSAgICAgICBzcWwgPSBjcmVhdGVTcWwoKQotICAgICAgIGV4cGVjdGVkID0gIkEgbmFycm93ID8gc3VwcG9ydGVkIGJ5IGEgPyEhIgotICAgICAgIGdzdHJpbmcgPSAiQSBuYXJyb3cgJHtmb299IHN1cHBvcnRlZCBieSBhICR7YmFyfSEhIgotICAgICAgIHJlc3VsdCA9IHNxbC5hc1NxbChnc3RyaW5nLCBnc3RyaW5nLnZhbHVlcy50b0xpc3QoKSkKLSAgICAgICBhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEV4ZWN1dGVVcGRhdGUoKXsKLSAgICAgICAgZm9vPSdmb29kLWRyaW5rJwotICAgICAgICBmb29kID0gJ2Zvb2QnCi0gICAgICAgIGRyaW5rID0gJ2RyaW5rJwotICAgICAgICBiYXI9J2d1aW5uZXNzJwotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKTsKLSAgICAgICAgZXhwZWN0ZWQgPSAwCi0gICAgICAgIHJlc3VsdCA9IHNxbC5leGVjdXRlVXBkYXRlKCJ1cGRhdGUgRk9PRCBzZXQgdHlwZT0/IHdoZXJlIG5hbWU9PyIsW2ZvbyxiYXJdKTsKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBleHBlY3RlZAotICAgICAgICBleHBlY3RlZCAgPSAxCi0gICAgICAgIHJlc3VsdCA9IHNxbC5leGVjdXRlVXBkYXRlKCJpbnNlcnQgaW50byBGT09EICh0eXBlLG5hbWUpIHZhbHVlcyAoJHtmb29kfSwke2Jhcn0pIik7Ci0gICAgCWFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKLSAgICAgICAgcmVzdWx0ID0gc3FsLmV4ZWN1dGVVcGRhdGUoImluc2VydCBpbnRvIEZPT0QgKHR5cGUsbmFtZSkgdmFsdWVzICgke2RyaW5rfSwke2Jhcn0pIik7Ci0gICAgCWFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKLSAgICAgICAgcmVzdWx0ID0gc3FsLmV4ZWN1dGVVcGRhdGUoImluc2VydCBpbnRvIEZPT0QgKHR5cGUsbmFtZSkgdmFsdWVzICgnZHJpbmsnLCdndWlubmVzcycpIik7Ci0gICAgCWFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKLSAgICAgICAgZXhwZWN0ZWQgPSAzCi0gICAgICAgIHJlc3VsdCA9IHNxbC5leGVjdXRlVXBkYXRlKCJ1cGRhdGUgRk9PRCBzZXQgdHlwZT0/IHdoZXJlIG5hbWU9PyIsW2ZvbyxiYXJdKTsKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBleHBlY3RlZAotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsQ29tcGxldGVXaXRob3V0RGF0YVNvdXJjZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbENvbXBsZXRlV2l0aG91dERhdGFTb3VyY2VUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0NDdjMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsQ29tcGxldGVXaXRob3V0RGF0YVNvdXJjZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3FsCi0KLWltcG9ydCBvcmcuYXhpb25kYi5qZGJjLkF4aW9uRHJpdmVyCi1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcgotCi0vKioKLSAqIFRlc3RzIHRoZSB1c2Ugb2YgdGhlIFNxbCBjbGFzcyB1c2luZyBqdXN0IGEgQ29ubmVjdGlvbiAKLSAqIHJhdGhlciB0aGFuIGEgRGF0YVNvdXJjZQotICovCi1jbGFzcyBTcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdCBleHRlbmRzIFNxbENvbXBsZXRlVGVzdCB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIG5ld1NxbChTdHJpbmcgdXJpKSB7Ci0gICAgICAgIGRyaXZlciA9IEF4aW9uRHJpdmVyCi0gICAgICAgIHByaW50bG4oIkxvYWRpbmcgZHJpdmVyICR7ZHJpdmVyfSIpCi0gICAgICAgIHJldHVybiBuZXcgU3FsKERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbih1cmkpKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxSb3dzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsUm93c1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTcyMjRjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxSb3dzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zcWwKLQotaW1wb3J0IG9yZy5heGlvbmRiLmpkYmMuQXhpb25Ecml2ZXIKLQotY2xhc3MgU3FsUm93c1Rlc3QgZXh0ZW5kcyBUZXN0SGVscGVyIHsKLQotICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkKLQotICAgICAgICByZXN1bHRzID0gc3FsLmZpcnN0Um93KCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIFBFUlNPTiB3aGVyZSBpZD0xIikuZmlyc3RuYW1lIAotICAgICAgICBleHBlY3RlZCA9ICJKYW1lcyIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RGaXJzdFJvd1dpdGhQcm9wZXJ0eU5hbWVBbmRQYXJhbXMoKSB7Ci0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpCi0KLSAgICAgICAgcmVzdWx0cyA9IHNxbC5maXJzdFJvdygic2VsZWN0IGZpcnN0bmFtZSwgbGFzdG5hbWUgZnJvbSBQRVJTT04gd2hlcmUgaWQ9PyIsIFsxXSkubGFzdG5hbWUgCi0gICAgICAgIGV4cGVjdGVkID0gIlN0cmFjaGFuIgotICAgICAgICBhc3NlcnQgcmVzdWx0cyA9PSBleHBlY3RlZAotICAgIH0KLQotICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TnVtYmVyKCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKQotCi0gICAgICAgIHJlc3VsdHMgPSBzcWwuZmlyc3RSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPTEiKVswXSAKLSAgICAgICAgZXhwZWN0ZWQgPSAiSmFtZXMiCi0gICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TnVtYmVyQW5kUGFyYW1zKCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKQotCi0gICAgICAgIHJlc3VsdHMgPSBzcWwuZmlyc3RSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPT8iLCBbMV0pWzBdIAotICAgICAgICBleHBlY3RlZCA9ICJKYW1lcyIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0QWxsUm93c1dpdGhQcm9wZXJ0eU51bWJlcigpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkKLQotICAgICAgICByZXN1bHRzID0gc3FsLnJvd3MoInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPTEgb3IgaWQ9MiBvcmRlciBieSBpZCIpCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzBdWzBdID09ICJKYW1lcyIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMF1bMV0gPT0gIlN0cmFjaGFuIgotICAgICAgICBhc3NlcnQgcmVzdWx0c1sxXVswXSA9PSAiQm9iIgotICAgICAgICBhc3NlcnQgcmVzdWx0c1sxXVsxXSA9PSAiTWN3aGlydGVyIgotICAgIH0KLQotICAgIHZvaWQgdGVzdEFsbFJvd3NXaXRoUHJvcGVydHlOdW1iZXJBbmRQYXJhbXMoKSB7Ci0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpCi0KLSAgICAgICAgcmVzdWx0cyA9IHNxbC5yb3dzKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIFBFUlNPTiB3aGVyZSBpZD0/IG9yIGlkPT8gb3JkZXIgYnkgaWQiLCBbMSwyXSkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMF1bMF0gPT0gIkphbWVzIgotICAgICAgICBhc3NlcnQgcmVzdWx0c1swXVsxXSA9PSAiU3RyYWNoYW4iCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzFdWzBdID09ICJCb2IiCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzFdWzFdID09ICJNY3doaXJ0ZXIiCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0QWxsUm93c1dpdGhQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpCi0KLSAgICAgICAgcmVzdWx0cyA9IHNxbC5yb3dzKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIFBFUlNPTiB3aGVyZSBpZD0xIG9yIGlkPTIgb3JkZXIgYnkgaWQiKQotICAgICAgICBhc3NlcnQgcmVzdWx0c1swXS5maXJzdG5hbWUgPT0gIkphbWVzIgotICAgICAgICBhc3NlcnQgcmVzdWx0c1swXS5sYXN0bmFtZSA9PSAiU3RyYWNoYW4iCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzFdLmZpcnN0bmFtZSA9PSAiQm9iIgotICAgICAgICBhc3NlcnQgcmVzdWx0c1sxXS5sYXN0bmFtZSA9PSAiTWN3aGlydGVyIgotICAgIH0KLQotICAgIHZvaWQgdGVzdEFsbFJvd3NXaXRoUHJvcGVydHlOYW1lQW5kUGFyYW1zKCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKQotCi0gICAgICAgIHJlc3VsdHMgPSBzcWwucm93cygic2VsZWN0IGZpcnN0bmFtZSwgbGFzdG5hbWUgZnJvbSBQRVJTT04gd2hlcmUgaWQ9PyBvciBpZD0/IG9yZGVyIGJ5IGlkIiwgWzEsMl0pCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzBdLmZpcnN0bmFtZSA9PSAiSmFtZXMiCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzBdLmxhc3RuYW1lID09ICJTdHJhY2hhbiIKLSAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMV0uZmlyc3RuYW1lID09ICJCb2IiCi0gICAgICAgIGFzc2VydCByZXN1bHRzWzFdLmxhc3RuYW1lID09ICJNY3doaXJ0ZXIiCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTE2ZTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnNxbAotCi1pbXBvcnQgb3JnLmF4aW9uZGIuamRiYy5BeGlvbkRhdGFTb3VyY2UKLQotLyoqCi0gKiBUaGlzIGlzIG1vcmUgb2YgYSBzYW1wbGUgcHJvZ3JhbSB0aGFuIGEgdW5pdCB0ZXN0IGFuZCBpcyBoZXJlIGFzIGFuIGVhc3kKLSAqIHRvIHJlYWQgZGVtbyBvZiBHRE8uIFRoZSBhY3R1YWwgZnVsbCB1bml0IHRlc3QgY2FzZSBpcyBpbiBTcWxDb21wbGV0ZVRlc3QKLSAqLwotY2xhc3MgU3FsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFNxbFF1ZXJ5KCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKSAgICAgCi0gICAgICAgIAotICAgICAgICBzcWwuZWFjaFJvdygic2VsZWN0ICogZnJvbSBQRVJTT04iKSB7IHByaW50bG4oIkhlbGxvICR7aXQuZmlyc3RuYW1lfSAke2l0Lmxhc3RuYW1lfSIpIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UXVlcnlVc2luZ0NvbHVtbkluZGV4KCkgewotCSAgICAJc3FsID0gY3JlYXRlU3FsKCkKLQkgICAgCQotCSAgICAJYW5zd2VyID0gbnVsbAotCSAgICAJCi0JICAgIAlzcWwuZWFjaFJvdygic2VsZWN0IGNvdW50KCopIGZyb20gUEVSU09OIikgeyBhbnN3ZXIgPSBpdFswXSB9Ci0JICAgIAkKLQkgICAgCXByaW50bG4gIkZvdW5kIHRoZSBjb3VudCBvZiAke2Fuc3dlcn0iCi0JICAgIAkKLQkgICAgCWFzc2VydCBhbnN3ZXIgPT0gMwotCSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0UXVlcnlVc2luZ05lZ2F0aXZlQ29sdW1uSW5kZXgoKSB7Ci0JICAgIAlzcWwgPSBjcmVhdGVTcWwoKQotCi0JCWZpcnN0ID0gbnVsbAotCQlsYXN0ID0gbnVsbAotCQkgICAgCQotCSAgICAJc3FsLmVhY2hSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGZpcnN0bmFtZT0nSmFtZXMnIikgeyByb3cgfAotCSAgICAJCWZpcnN0ID0gcm93Wy0yXQotCSAgICAJCWxhc3QgPSByb3dbLTFdCi0JICAgIAl9Ci0JICAgIAkKLQkgICAgCXByaW50bG4gIkZvdW5kIG5hbWUgJHtmaXJzdH0gJHtsYXN0fSIKLSAgICAJCi0JICAgIAlhc3NlcnQgZmlyc3QgPT0gIkphbWVzIgotCSAgICAJYXNzZXJ0IGxhc3QgPT0gIlN0cmFjaGFuIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhXaGVyZUNsYXVzZSgpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgZm9vID0gImRyaW5rIgotICAgICAgICBzcWwuZWFjaFJvdygic2VsZWN0ICogZnJvbSBGT09EIHdoZXJlIHR5cGU9JHtmb299IikgeyBwcmludGxuKCJEcmluayAke2l0Lm5hbWV9IikgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhXaGVyZUNsYXVzZVdpdGgyQXJndW1lbnRzKCkgewotICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKSAgICAgCi0gICAgICAgIAotICAgICAgICBmb28gPSAiY2hlZXNlIgotICAgICAgICBiYXIgPSAiZWRhbSIKLSAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gRk9PRCB3aGVyZSB0eXBlPSR7Zm9vfSBhbmQgbmFtZSAhPSAke2Jhcn0iKSB7IHByaW50bG4oIkZvdW5kIGNoZWVzZSAke2l0Lm5hbWV9IikgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhJbmNvcnJlY3RseVF1b3RlZER5bmFtaWNFeHByZXNzaW9ucygpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgZm9vID0gImNoZWVzZSIKLSAgICAgICAgYmFyID0gImVkYW0iCi0gICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0nJHtmb299JyBhbmQgbmFtZSAhPSAnJHtiYXJ9JyIpIHsgcHJpbnRsbigiRm91bmQgY2hlZXNlICR7aXQubmFtZX0iKSB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdERhdGFTZXQoKSB7Ci0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpICAgICAKLSAgICAgICAgCi0gICAgICAgIHBlb3BsZSA9IHNxbC5kYXRhU2V0KCJQRVJTT04iKQotICAgICAgICBwZW9wbGUuZWFjaCB7IHByaW50bG4oIkhleSAke2l0LmZpcnN0bmFtZX0iKSB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdERhdGFTZXRXaXRoQ2xvc3VyZVByZWRpY2F0ZSgpIHsKLSAgICAgICAgc3FsID0gY3JlYXRlU3FsKCkgICAgIAotICAgICAgICAKLSAgICAgICAgZm9vZCA9IHNxbC5kYXRhU2V0KCJGT09EIikKLSAgICAgICAgZm9vZC5maW5kQWxsIHsgaXQudHlwZSA9PSAiY2hlZXNlIiB9LmVhY2ggeyBwcmludGxuKCJDaGVlc2UgJHtpdC5uYW1lfSIpIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RXhlY3V0ZVVwZGF0ZSgpewotICAgICAgICBmb289J2Zvb2QtZHJpbmsnCi0gICAgICAgIGJhcj0nZ3Vpbm5lc3MnCi0gICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpOwotICAgICAgICBuUm93cyA9IHNxbC5leGVjdXRlVXBkYXRlKCJ1cGRhdGUgRk9PRCBzZXQgdHlwZT0/IHdoZXJlIG5hbWU9PyIsW2ZvbyxiYXJdKTsKLSAgICAgICAgaWYoblJvd3MgPT0gMCl7Ci0gICAgICAgICAgICBzcWwuZXhlY3V0ZVVwZGF0ZSgiaW5zZXJ0IGludG8gRk9PRCAodHlwZSxuYW1lKSB2YWx1ZXMgKCR7Zm9vfSwke2Jhcn0pIik7Ci0gICAgCQl9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBjcmVhdGVTcWwoKSB7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgQXhpb25EYXRhU291cmNlKCJqZGJjOmF4aW9uZGI6Zm9vIiArIGdldE1ldGhvZE5hbWUoKSkKLSAgICAgICAgc3FsID0gbmV3IFNxbChkYXRhU291cmNlKQotICAgICAgICAKLSAgICAgICAgc3FsLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBQRVJTT04gKCBmaXJzdG5hbWUgdmFyY2hhciwgbGFzdG5hbWUgdmFyY2hhciApIikgICAgIAotICAgICAgICBzcWwuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIEZPT0QgKCB0eXBlIHZhcmNoYXIsIG5hbWUgdmFyY2hhcikiKQotICAgICAgICAKLSAgICAgICAgLy8gbm93IGxldHMgcG9wdWxhdGUgdGhlIGRhdGFzZXRzCi0gICAgICAgIHBlb3BsZSA9IHNxbC5kYXRhU2V0KCJQRVJTT04iKQotICAgICAgICBwZW9wbGUuYWRkKCBmaXJzdG5hbWU6IkphbWVzIiwgbGFzdG5hbWU6IlN0cmFjaGFuIiApCi0gICAgICAgIHBlb3BsZS5hZGQoIGZpcnN0bmFtZToiQm9iIiwgbGFzdG5hbWU6Ik1jd2hpcnRlciIgKQotICAgICAgICBwZW9wbGUuYWRkKCBmaXJzdG5hbWU6IlNhbSIsIGxhc3RuYW1lOiJQdWxsYXJhIiApCi0gICAgICAgIAotICAgICAgICBmb29kID0gc3FsLmRhdGFTZXQoIkZPT0QiKQotICAgICAgICBmb29kLmFkZCggdHlwZToiY2hlZXNlIiwgbmFtZToiZWRhbSIgKQotICAgICAgICBmb29kLmFkZCggdHlwZToiY2hlZXNlIiwgbmFtZToiYnJpZSIgKQotICAgICAgICBmb29kLmFkZCggdHlwZToiY2hlZXNlIiwgbmFtZToiY2hlZGRhciIgKQotICAgICAgICBmb29kLmFkZCggdHlwZToiZHJpbmsiLCBuYW1lOiJiZWVyIiApCi0gICAgICAgIGZvb2QuYWRkKCB0eXBlOiJkcmluayIsIG5hbWU6ImNvZmZlZSIgKQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNxbAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxXaXRoQnVpbGRlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhCdWlsZGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWJlMjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhCdWlsZGVyVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zcWwKLQotaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlciAKLQotLyoqCi0gKiBAYXV0aG9yIEJyaWFuIE1jQ2FsbGlzdGVyCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFNxbFdpdGhCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RIZWxwZXIgewotCi0gICAgdm9pZCB0ZXN0U3FsUXVlcnkoKSB7Ci0gICAgICAgICBzcWwgPSBjcmVhdGVTcWwoKQotICAgICAgICAgcHJpbnRsbiAiQ3JlYXRlZCAke3NxbH0iCi0gICAgICAgIAotICAgICAgICAgZG9jID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQotICAgICAgICAKLSAgICAgICAgIGRvYy5wZW9wbGUgewotICAgICAgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIFBFUlNPTiIpIHsKLSAgICAgICAgICAgICAgICAgZG9jLnBlcnNvbihmaXJzdDogaXQuZmlyc3RuYW1lLCBsYXN0OiBpdC5sYXN0bmFtZSwgbG9jYXRpb246IGl0LmxvY2F0aW9uX25hbWUpCi0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgIHNxbC5jbG9zZSgpCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsV2l0aFR5cGVkUmVzdWx0c1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhUeXBlZFJlc3VsdHNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjOTg5MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zcWwvU3FsV2l0aFR5cGVkUmVzdWx0c1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3FsCi0KLWltcG9ydCBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXIgCi0KLS8qKgotICogQGF1dGhvciBUaG9tYXMgSGVsbGVyCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLWNsYXNzIFNxbFdpdGhUeXBlZFJlc3VsdHNUZXN0IGV4dGVuZHMgVGVzdEhlbHBlciB7Ci0KLSAgICB2b2lkIHRlc3RTcWxRdWVyeSgpIHsKLSAgICAgICAgIHNxbCA9IGNyZWF0ZUVtcHR5U3FsKCkKLSAgICAgICAgIAotICAgICAgICAgc3FsLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBncm9vdnl0ZXN0ICggYW5pbnQgaW50ZWdlciwgYXN0cmluZyB2YXJjaGFyICkiKTsKLQotICAgICAgICAgZ3Jvb3Z5dGVzdCA9IHNxbC5kYXRhU2V0KCJncm9vdnl0ZXN0IikKLSAgICAgICAgIGdyb292eXRlc3QuYWRkKCBhbmludDoxLCBhc3RyaW5nOiJHcm9vdnkiICkKLSAgICAgICAgIGdyb292eXRlc3QuYWRkKCBhbmludDoyLCBhc3RyaW5nOiJyb2NrcyIgKQotCi0gICAgICAgICAvLyB0aGlzIGxpbmUgbWVzc2VzIHVwIHRoaW5nczoKLSAgICAgICAgIC8qKiBAdG9kbyB0aGlzIGZhaWxzCi0gICAgICAgICBJbnRlZ2VyIGlkCi0JCSAqLwotICAgICAgICAgSW50ZWdlciBpZCA9IDAKLQkJIAotICAgICAgICAgc3FsLmVhY2hSb3coIlNFTEVDVCAqIEZST00gZ3Jvb3Z5dGVzdCBPUkRFUiBCWSBhbmludCIpIHsgCi0gICAgICAgICAJcHJpbnRsbiAiZm91bmQgJHtpdC5hc3RyaW5nfSBmb3IgaWQgJHtpdC5hbmludH0iCi0gICAgICAgICAJCi0gICAgICAgICAJaWQgPSBpdC5hbmludCAKLSAgICAgICAgIH0KLQotICAgICAgICAgYXNzZXJ0IGlkID09IDIKLSAgICAgICAgCi0gICAgICAgICBzcWwuY2xvc2UoKQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1Rlc3RIZWxwZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3FsL1Rlc3RIZWxwZXIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I4YzY1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9UZXN0SGVscGVyLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnNxbAotCi1pbXBvcnQgb3JnLmF4aW9uZGIuamRiYy5BeGlvbkRhdGFTb3VyY2UKLQotY2xhc3MgVGVzdEhlbHBlciBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHN0YXRpYyBjb3VudGVyID0gMQotICAgIAotICAgIHN0YXRpYyBTcWwgbWFrZVNxbCgpIHsKLSAgICAgICAgZm9vID0gbmV3IFRlc3RIZWxwZXIoKQotICAgICAgICByZXR1cm4gZm9vLmNyZWF0ZVNxbCgpCi0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCBjcmVhdGVFbXB0eVNxbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ld1NxbChnZXRVUkkoKSkKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGNyZWF0ZVNxbCgpIHsKLSAgICAgICAgc3FsID0gbmV3U3FsKGdldFVSSSgpKQotICAgICAgICAKLSAgICAgICAgc3FsLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBQRVJTT04gKCBmaXJzdG5hbWUgdmFyY2hhciwgbGFzdG5hbWUgdmFyY2hhciwgaWQgaW50ZWdlciwgbG9jYXRpb25faWQgaW50ZWdlciwgbG9jYXRpb25fbmFtZSB2YXJjaGFyICkiKSAgICAgCi0gICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgRk9PRCAoIHR5cGUgdmFyY2hhciwgbmFtZSB2YXJjaGFyKSIpCi0gICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgRkVBVFVSRSAoIGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcikiKQotICAgICAgICAKLSAgICAgICAgLy8gbm93IGxldHMgcG9wdWxhdGUgdGhlIGRhdGFzZXRzCi0gICAgICAgIHBlb3BsZSA9IHNxbC5kYXRhU2V0KCJQRVJTT04iKQotICAgICAgICBwZW9wbGUuYWRkKCBmaXJzdG5hbWU6IkphbWVzIiwgbGFzdG5hbWU6IlN0cmFjaGFuIiwgaWQ6MSwgbG9jYXRpb25faWQ6MTAsIGxvY2F0aW9uX25hbWU6J0xvbmRvbicgKQotICAgICAgICBwZW9wbGUuYWRkKCBmaXJzdG5hbWU6IkJvYiIsIGxhc3RuYW1lOiJNY3doaXJ0ZXIiLCBpZDoyLCBsb2NhdGlvbl9pZDoyMCwgbG9jYXRpb25fbmFtZTonQXRsYW50YScgKQotICAgICAgICBwZW9wbGUuYWRkKCBmaXJzdG5hbWU6IlNhbSIsIGxhc3RuYW1lOiJQdWxsYXJhIiwgaWQ6MywgbG9jYXRpb25faWQ6MzAsIGxvY2F0aW9uX25hbWU6J0NhbGlmb3JuaWEnICkKLSAgICAgICAgCi0gICAgICAgIGZvb2QgPSBzcWwuZGF0YVNldCgiRk9PRCIpCi0gICAgICAgIGZvb2QuYWRkKCB0eXBlOiJjaGVlc2UiLCBuYW1lOiJlZGFtIiApCi0gICAgICAgIGZvb2QuYWRkKCB0eXBlOiJjaGVlc2UiLCBuYW1lOiJicmllIiApCi0gICAgICAgIGZvb2QuYWRkKCB0eXBlOiJjaGVlc2UiLCBuYW1lOiJjaGVkZGFyIiApCi0gICAgICAgIGZvb2QuYWRkKCB0eXBlOiJkcmluayIsIG5hbWU6ImJlZXIiICkKLSAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImRyaW5rIiwgbmFtZToiY29mZmVlIiApCi0gICAgICAgIAotICAgICAgICBmZWF0dXJlcyA9IHNxbC5kYXRhU2V0KCJGRUFUVVJFIikKLSAgICAgICAgZmVhdHVyZXMuYWRkKCBpZDoxLCBuYW1lOidHRE8nICkKLSAgICAgICAgZmVhdHVyZXMuYWRkKCBpZDoyLCBuYW1lOidHUGF0aCcgKQotICAgICAgICBmZWF0dXJlcy5hZGQoIGlkOjMsIG5hbWU6J0dyb292eU1hcmt1cCcgKQotICAgICAgICByZXR1cm4gc3FsCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBnZXRVUkkoKSB7Ci0JCWFuc3dlciA9ICJqZGJjOmF4aW9uZGI6Zm9vIgotCQluYW1lID0gZ2V0TWV0aG9kTmFtZSgpCi0JCWlmIChuYW1lID09IG51bGwpIHsgbmFtZSA9ICIiIH0KLQkJbmFtZSArPSBjb3VudGVyKysKLQkJcmV0dXJuIGFuc3dlciArIG5hbWUKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIG5ld1NxbChTdHJpbmcgdXJpKSB7Ci0JICAgIGRhdGFTb3VyY2UgPSBuZXcgQXhpb25EYXRhU291cmNlKHVyaSkKLQkgICAgcmV0dXJuIG5ldyBTcWwoZGF0YVNvdXJjZSkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9EZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9EZW1vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGM5M2QuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvRGVtby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5LnN3aW5nOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBEZW1vIGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERlbW8gZGVtbyA9IG5ldyBEZW1vKCk7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBkZW1vLmNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9zd2luZy9Td2luZ0RlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3N3aW5nL015VGFibGVNb2RlbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvTXlUYWJsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWUwNTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvTXlUYWJsZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5BYnN0cmFjdFRhYmxlTW9kZWw7Ci0KLS8qKiAKLSAqIEEgc2FtcGxlIHRhYmxlIG1vZGVsCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE15VGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihNeVRhYmxlTW9kZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHB1YmxpYyBNeVRhYmxlTW9kZWwoKSB7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7ICJGaXJzdCBOYW1lIiwgIkxhc3QgTmFtZSIsICJTcG9ydCIsICIjIG9mIFllYXJzIiwgIlZlZ2V0YXJpYW4iIH07Ci0gICAgZmluYWwgT2JqZWN0W11bXSBkYXRhID0geyB7ICJNYXJ5IiwgIkNhbXBpb25lIiwgIlNub3dib2FyZGluZyIsIG5ldyBJbnRlZ2VyKDUpLCBuZXcgQm9vbGVhbihmYWxzZSl9LCB7Ci0gICAgICAgICAgICAiQWxpc29uIiwgIkh1bWwiLCAiUm93aW5nIiwgbmV3IEludGVnZXIoMyksIG5ldyBCb29sZWFuKHRydWUpCi0gICAgICAgICAgICB9LCB7Ci0gICAgICAgICAgICAiS2F0aHkiLCAiV2FscmF0aCIsICJDaGFzaW5nIHRvZGRsZXJzIiwgbmV3IEludGVnZXIoMiksIG5ldyBCb29sZWFuKGZhbHNlKQotICAgICAgICAgICAgfSwgewotICAgICAgICAgICAgIk1hcmsiLCAiQW5kcmV3cyIsICJTcGVlZCByZWFkaW5nIiwgbmV3IEludGVnZXIoMjApLCBuZXcgQm9vbGVhbih0cnVlKQotICAgICAgICAgICAgfSwgewotICAgICAgICAgICAgIkFuZ2VsYSIsICJMaWgiLCAiVGVhY2hpbmcgaGlnaCBzY2hvb2wiLCBuZXcgSW50ZWdlcig0KSwgbmV3IEJvb2xlYW4oZmFsc2UpCi0gICAgICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tjb2xdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBkYXRhW3Jvd11bY29sXTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEpUYWJsZSB1c2VzIHRoaXMgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCByZW5kZXJlci8KLSAgICAgKiBlZGl0b3IgZm9yIGVhY2ggY2VsbC4gIElmIHdlIGRpZG4ndCBpbXBsZW1lbnQgdGhpcyBtZXRob2QsCi0gICAgICogdGhlbiB0aGUgbGFzdCBjb2x1bW4gd291bGQgY29udGFpbiB0ZXh0ICgidHJ1ZSIvImZhbHNlIiksCi0gICAgICogcmF0aGVyIHRoYW4gYSBjaGVjayBib3guCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldENvbHVtbkNsYXNzKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUF0KDAsIGMpLmdldENsYXNzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEb24ndCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91ciB0YWJsZSdzCi0gICAgICogZWRpdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICAvL05vdGUgdGhhdCB0aGUgZGF0YS9jZWxsIGFkZHJlc3MgaXMgY29uc3RhbnQsCi0gICAgICAgIC8vbm8gbWF0dGVyIHdoZXJlIHRoZSBjZWxsIGFwcGVhcnMgb25zY3JlZW4uCi0gICAgICAgIGlmIChjb2wgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdW5sZXNzIHlvdXIgdGFibGUncwotICAgICAqIGRhdGEgY2FuIGNoYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBpZiAobG9nLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKLSAgICAgICAgICAgIGxvZy5maW5lKAotICAgICAgICAgICAgICAgICJTZXR0aW5nIHZhbHVlIGF0ICIgKyByb3cgKyAiLCIgKyBjb2wgKyAiIHRvICIgKyB2YWx1ZSArICIgKGFuIGluc3RhbmNlIG9mICIgKyB2YWx1ZS5nZXRDbGFzcygpICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRhWzBdW2NvbF0gaW5zdGFuY2VvZiBJbnRlZ2VyICYmICEodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSkgewotICAgICAgICAgICAgLy9XaXRoIEpGQy9Td2luZyAxLjEgYW5kIEpESyAxLjIsIHdlIG5lZWQgdG8gY3JlYXRlICAgIAotICAgICAgICAgICAgLy9hbiBJbnRlZ2VyIGZyb20gdGhlIHZhbHVlOyBvdGhlcndpc2UsIHRoZSBjb2x1bW4gICAgIAotICAgICAgICAgICAgLy9zd2l0Y2hlcyB0byBjb250YWluIFN0cmluZ3MuICBTdGFydGluZyB3aXRoIHYgMS4zLCAgIAotICAgICAgICAgICAgLy90aGUgdGFibGUgYXV0b21hdGljYWxseSBjb252ZXJ0cyB2YWx1ZSB0byBhbiBJbnRlZ2VyLAotICAgICAgICAgICAgLy9zbyB5b3Ugb25seSBuZWVkIHRoZSBjb2RlIGluIHRoZSAnZWxzZScgcGFydCBvZiB0aGlzIAotICAgICAgICAgICAgLy8naWYnIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy9YWFg6IFNlZSBUYWJsZUVkaXREZW1vLmphdmEgZm9yIGEgYmV0dGVyIHNvbHV0aW9uISEhCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRhdGFbcm93XVtjb2xdID0gbmV3IEludGVnZXIodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZmlyZVRhYmxlQ2VsbFVwZGF0ZWQocm93LCBjb2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJUaGUgXCIiICsgZ2V0Q29sdW1uTmFtZShjb2wpICsgIlwiIGNvbHVtbiBhY2NlcHRzIG9ubHkgaW50ZWdlciB2YWx1ZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkYXRhW3Jvd11bY29sXSA9IHZhbHVlOwotICAgICAgICAgICAgZmlyZVRhYmxlQ2VsbFVwZGF0ZWQocm93LCBjb2wpOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvU3dpbmdEZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3N3aW5nL1N3aW5nRGVtby5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTk5OTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvU3dpbmdEZW1vLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd2luZwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQotaW1wb3J0IGdyb292eS5tb2RlbC5NdmNEZW1vCi0KLWNsYXNzIFN3aW5nRGVtbyB7Ci0KLSAgICBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQotCi0Jc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0JCWRlbW8gPSBuZXcgU3dpbmdEZW1vKCkKLQkJZGVtby5ydW4oKQotCX0KLQkKLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSgKLSAgICAgICAgICAgIHRpdGxlOidUaGlzIGlzIGEgRnJhbWUnLAotICAgICAgICAgICAgbG9jYXRpb246WzEwMCwxMDBdLAotICAgICAgICAgICAgc2l6ZTpbODAwLDQwMF0sCi0gICAgICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246amF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpIHsKLQotICAgICAgICAgICAgbWVudUJhciB7Ci0JCSAgICAgICAgbWVudSh0ZXh0OidGaWxlJykgewotICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidOZXcnLCBjbG9zdXJlOnsgcHJpbnRsbigiY2xpY2tlZCBvbiB0aGUgbmV3IG1lbnUgaXRlbSEiKSB9KQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKG5hbWU6J09wZW4nLCBjbG9zdXJlOnsgcHJpbnRsbigiY2xpY2tlZCBvbiB0aGUgb3BlbiBtZW51IGl0ZW0hIikgfSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidTYXZlJywgZW5hYmxlZDpmYWxzZSwgY2xvc3VyZTp7IHByaW50bG4oImNsaWNrZWQgb24gdGhlIFNhdmUgbWVudSBpdGVtISIpIH0pCi0gICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVudSh0ZXh0OidEZW1vcycpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonU2ltcGxlIFRhYmxlTW9kZWwgRGVtbycsIGNsb3N1cmU6eyBzaG93R3Jvb3Z5VGFibGVEZW1vKCkgfSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidNVkMgRGVtbycsIGNsb3N1cmU6eyBzaG93TVZDRGVtbygpIH0pCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonVGFibGVMYXlvdXQgRGVtbycsIGNsb3N1cmU6eyBzaG93VGFibGVMYXlvdXREZW1vKCkgfSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW51KHRleHQ6J0hlbHAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKG5hbWU6J0Fib3V0JywgY2xvc3VyZTp7IHNob3dBYm91dCgpIH0pCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCSAgICB9Ci0JCSAgICBzcGxpdFBhbmUgewotICAgICAgICAgICAgICAgIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCksIGJvcmRlcjpCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxvd2VyZWRCZXZlbEJvcmRlcigpLCAndGl0bGVkIGJvcmRlcicpKSB7Ci0gICAgCQkJCXZib3goY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0Lk5PUlRIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbChsYXlvdXQ6bmV3IEJvcmRlckxheW91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwodGV4dDonTmFtZScsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5XRVNULCB0b29sVGlwVGV4dDonVGhpcyBpcyB0aGUgbmFtZSBmaWVsZCcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkKHRleHQ6J0phbWVzJywgY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUiwgdG9vbFRpcFRleHQ6J0VudGVyIHRoZSBuYW1lIGludG8gdGhpcyBmaWVsZCcpCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbChsYXlvdXQ6bmV3IEJvcmRlckxheW91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwodGV4dDonTG9jYXRpb24nLCBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuV0VTVCwgdG9vbFRpcFRleHQ6J1RoaXMgaXMgdGhlIGxvY2F0aW9uIGZpZWxkJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21ib0JveChpdGVtczpbJ0F0bGFudGEnLCAnTG9uZG9uJywgJ05ldyBZb3JrJ10sIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIsIHRvb2xUaXBUZXh0OidDaG9vc2UgdGhlIGxvY2F0aW9uIGludG8gdGhpcyBmaWVsZCcpCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidXR0b24odGV4dDonQ2xpY2sgTWUnLCBhY3Rpb25QZXJmb3JtZWQ6e2V2ZW50IHwgcHJpbnRsbigiY2xvc3VyZSBmaXJlZCB3aXRoIGV2ZW50OiAiICsgZXZlbnQpIH0pCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZShjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuQ0VOVEVSLCBib3JkZXI6Qm9yZGVyRmFjdG9yeS5jcmVhdGVSYWlzZWRCZXZlbEJvcmRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAl0ZXh0QXJlYSh0ZXh0OidTb21lIHRleHQgZ29lcyBoZXJlJywgdG9vbFRpcFRleHQ6J1RoaXMgaXMgYSBsYXJnZSB0ZXh0IGFyZWEgdG8gdHlwZSBpbiB0ZXh0JykKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICBzY3JvbGxQYW5lIHsKLQkJICAgICAgICAgICAgdGFibGUobW9kZWw6bmV3IE15VGFibGVNb2RlbCgpKQotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfSAgICAgICAgCi0JCWZyYW1lLnNob3coKQotICAgIH0KLSAgICAKLSAgICBzaG93QWJvdXQoKSB7Ci0gICAgICAgIC8vIHRoaXMgdmVyc2lvbiBkb2Vzbid0IGF1dG8tc2l6ZSAmIHBvc2l0aW9uIHRoZSBkaWFsb2cKLSAgICAgICAgLyoKLSAgICAgICAgZGlhbG9nID0gc3dpbmcuZGlhbG9nKG93bmVyOmZyYW1lLCB0aXRsZTonQWJvdXQgR3Jvb3Z5U3dpbmcnKSB7Ci0gICAgICAgICAgICBvcHRpb25QYW5lKG1lc3NhZ2U6J1dlbGNvbWUgdG8gdGhlIHdvbmRlcmZ1bCB3b3JsZCBvZiBHcm9vdnlTd2luZycpCi0gICAgICAgIH0KLQkJKi8gCQkKLSAJCXBhbmUgPSBzd2luZy5vcHRpb25QYW5lKG1lc3NhZ2U6J1dlbGNvbWUgdG8gdGhlIHdvbmRlcmZ1bCB3b3JsZCBvZiBHcm9vdnlTd2luZycpCi0gCQlkaWFsb2cgPSBwYW5lLmNyZWF0ZURpYWxvZyhmcmFtZSwgJ0Fib3V0IEdyb292eVN3aW5nJykKLSAJCWRpYWxvZy5zaG93KCkKLSAgICB9Ci0gICAgCi0gICAgc2hvd0dyb292eVRhYmxlRGVtbygpIHsKLSAgICAgICAgZGVtbyA9IG5ldyBUYWJsZURlbW8oKQotICAgICAgICBkZW1vLnJ1bigpCi0gICAgfQotCi0gICAgc2hvd01WQ0RlbW8oKSB7Ci0gICAgICAgIGRlbW8gPSBuZXcgTXZjRGVtbygpCi0gICAgICAgIGRlbW8ucnVuKCkKLSAgICB9Ci0KLSAgICBzaG93VGFibGVMYXlvdXREZW1vKCkgewotICAgICAgICBkZW1vID0gbmV3IFRhYmxlTGF5b3V0RGVtbygpCi0gICAgICAgIGRlbW8ucnVuKCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9UYWJsZURlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvVGFibGVEZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjYzIwOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9UYWJsZURlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3dpbmcKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dAotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkKLQotLyoqCi0gKiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgR3Jvb3Z5IFRhYmxlTW9kZWxzIGZvciB2aWV3aW5nIHRhYmxlcyBvZiBhbnkgTGlzdCBvZiBvYmplY3RzCi0gKi8KLWNsYXNzIFRhYmxlRGVtbyB7Ci0gICAgCi0gICAgLy8gcHJvcGVydGllcwotICAgIGZyYW1lOyBzd2luZwotICAgIAotICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgewotICAgICAgICBkZW1vID0gbmV3IFRhYmxlRGVtbygpCi0gICAgICAgIGRlbW8ucnVuKCkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICAgIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCi0gICAgICAgIAotICAgICAgICBmcmFtZSA9IHN3aW5nLmZyYW1lKHRpdGxlOidHcm9vdnkgVGFibGVNb2RlbCBEZW1vJywgbG9jYXRpb246WzIwMCwyMDBdLCBzaXplOlszMDAsMjAwXSkgewotICAgICAgICAgICAgbWVudUJhciB7Ci0JCSAgICAgICAgbWVudSh0ZXh0OidIZWxwJykgewotCQkgICAgICAgICAgICBtZW51SXRlbSgpIHsKLQkJICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidBYm91dCcsIGNsb3N1cmU6eyBzaG93QWJvdXQoKSB9KQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQkgICAgcGFuZWwobGF5b3V0Om5ldyBCb3JkZXJMYXlvdXQoKSkgewotCQkgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUikgewotICAgIAkgICAgICAgICAgICB0YWJsZSgpIHsKLSAgICAJICAgICAgICAgICAgICAgIG1vZGVsID0gW1snbmFtZSc6J0phbWVzJywgJ2xvY2F0aW9uJzonTG9uZG9uJ10sIFsnbmFtZSc6J0JvYicsICdsb2NhdGlvbic6J0F0bGFudGEnXSwgWyduYW1lJzonR2VpcicsICdsb2NhdGlvbic6J05ldyBZb3JrJ11dCi0gICAgCSAgICAgICAgICAgICAgICAKLSAgICAJICAgICAgICAgICAgICAgIHRhYmxlTW9kZWwobGlzdDptb2RlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOidOYW1lJywgcmVhZDp7cm93fCByZXR1cm4gcm93Lm5hbWV9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOidMb2NhdGlvbicsIHJlYWQ6e3Jvd3wgcmV0dXJuIHJvdy5sb2NhdGlvbn0pCi0gICAgCSAgICAgICAgICAgICAgICB9Ci0gICAgCSAgICAgICAgICAgIH0KLSAgICAJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0gICAgICAgIAotCQlmcmFtZS5zaG93KCkKLSAgICB9Ci0gICAgCi0gICAgc2hvd0Fib3V0KCkgewotIAkJcGFuZSA9IHN3aW5nLm9wdGlvblBhbmUobWVzc2FnZTonVGhpcyBkZW1vIHNob3dzIGhvdyBHcm9vdnlTd2luZyBjYW4gdXNlIEdyb292eSBjbG9zdXJlcyB0byBjcmVhdGUgc2ltcGxlIHRhYmxlIG1vZGVscycpCi0gCQlkaWFsb2cgPSBwYW5lLmNyZWF0ZURpYWxvZyhmcmFtZSwgJ0Fib3V0IEdyb292eVN3aW5nJykKLSAJCWRpYWxvZy5zaG93KCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9UYWJsZUxheW91dERlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvVGFibGVMYXlvdXREZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmMTliNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS9zd2luZy9UYWJsZUxheW91dERlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3dpbmcKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dAotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkKLQotLyoqCi0gKiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgdGFibGUgbGF5b3V0Ci0gKi8KLWNsYXNzIFRhYmxlTGF5b3V0RGVtbyB7Ci0gICAgCi0gICAgcHJvcGVydHkgZnJhbWUKLSAgICBwcm9wZXJ0eSBzd2luZwotICAgIAotICAgIHZvaWQgcnVuKCkgewotICAgICAgICBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQotICAgICAgICAKLSAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSh0aXRsZTonVGFibGVMYXlvdXQgRGVtbycsIGxvY2F0aW9uOlsyMDAsMjAwXSwgc2l6ZTpbMzAwLDIwMF0pIHsKLSAgICAgICAgICAgIG1lbnVCYXIgewotCQkgICAgICAgIG1lbnUodGV4dDonSGVscCcpIHsKLQkJICAgICAgICAgICAgbWVudUl0ZW0oKSB7Ci0JCSAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonQWJvdXQnLCBjbG9zdXJlOnsgc2hvd0Fib3V0KCkgfSkKLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJCXRhYmxlTGF5b3V0IHsKLSAgICAgICAgICAgICAgICB0ciB7Ci0gICAgICAgICAgICAgICAgICAgIHRkIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6J25hbWUnKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRkKGNvbGZpbGw6dHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkKHRleHQ6J0phbWVzJykKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ciB7Ci0gICAgICAgICAgICAgICAgICAgIHRkIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6J2xvY2F0aW9uJykKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0ZChjb2xmaWxsOnRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZCh0ZXh0OidMb25kb24nKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyIHsKLSAgICAgICAgICAgICAgICAgICAgdGQoY29sc3BhbjoyLCBhbGlnbjonY2VudGVyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uKHRleHQ6J09LJykKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfSAgICAgICAgCi0JCWZyYW1lLnNob3coKQotICAgIH0KLSAgICAKLSAgICBzaG93QWJvdXQoKSB7Ci0gCQlwYW5lID0gc3dpbmcub3B0aW9uUGFuZShtZXNzYWdlOidUaGlzIGRlbW8gc2hvd3MgaG93IHlvdSBjYW4gdXNlIEhUTUwgc3R5bGUgdGFibGUgbGF5b3V0cyB3aXRoIFN3aW5nIGNvbXBvbmVudHMnKQotIAkJZGlhbG9nID0gcGFuZS5jcmVhdGVEaWFsb2coZnJhbWUsICdBYm91dCBUYWJsZUxheW91dCBEZW1vJykKLSAJCWRpYWxvZy5zaG93KCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90ZXh0L1RlbXBsYXRlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdGV4dC9UZW1wbGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4YzI5Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90ZXh0L1RlbXBsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqICRJZCR2ZXJzaW9uIE1hciA4LCAyMDA0IDE6MzY6MzEgQU0gJHVzZXIgRXhwICQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIFNhbSBQdWxsYXJhLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KLSAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5Ci0gKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KLSAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCi0gKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKLSAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCi0gKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotIHBhY2thZ2UgZ3Jvb3Z5LnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEBhdXRob3Igc2FtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE1peGVkVGVtcGxhdGVUZXh0KCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlMSA9IG5ldyBTaW1wbGVUZW1wbGF0ZUVuZ2luZSgpLmNyZWF0ZVRlbXBsYXRlKCI8JT0gXCJ0ZXN0XCIgJT4gb2YgZXhwciBhbmQgPCUgdGVzdCA9IDEgJT4ke3Rlc3R9IHNjcmlwdC4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9mIGV4cHIgYW5kIDEgc2NyaXB0LiIsIHRlbXBsYXRlMS5tYWtlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZTIgPSBuZXcgR1N0cmluZ1RlbXBsYXRlRW5naW5lKCkuY3JlYXRlVGVtcGxhdGUoIjwlPSBcInRlc3RcIiAlPiBvZiBleHByIGFuZCA8JSB0ZXN0ID0gMSAlPiR7dGVzdH0gc2NyaXB0LiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgb2YgZXhwciBhbmQgMSBzY3JpcHQuIiwgdGVtcGxhdGUyLm1ha2UoKS50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kaW5nKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYmluZGluZy5wdXQoInNhbSIsICJwdWxsYXJhIik7Ci0gICAgICAgIAotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZTEgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKS5jcmVhdGVUZW1wbGF0ZSgiPCU9IHNhbSAlPjwlIHByaW50IHNhbSAlPiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInB1bGxhcmFwdWxsYXJhIiwgdGVtcGxhdGUxLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZTIgPSBuZXcgR1N0cmluZ1RlbXBsYXRlRW5naW5lKCkuY3JlYXRlVGVtcGxhdGUoIjwlPSBzYW0gJT48JSBvdXQgPDwgc2FtICU+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHVsbGFyYXB1bGxhcmEiLCB0ZW1wbGF0ZTIubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL0Nsb3N1cmVDbGFzc0xvYWRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL0Nsb3N1cmVDbGFzc0xvYWRlckJ1Zy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjcwMGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHJlZS9DbG9zdXJlQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCi0KLWNsYXNzIENsb3N1cmVDbGFzc0xvYWRlckJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICBwcm9wZXJ0eSBiCi0KLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIucm9vdDEoIHsKLSAgICAgICAgICAgIGIuZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgIH0pCi0gICAgICAgIAotICAgICAgICBwcmludChyb290KQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL05hdmlnYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI5ZDcwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotCi0KLS8qKgotICogU2ltcGxlIHRlc3Qgb2YgdHJlZSB3YWxraW5nCi0gKi8KLWNsYXNzIE5hdmlnYXRpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdERlcHRoRmlyc3QoKSB7Ci0gICAgICAgIHRyZWUgPSBjcmVhdGVUcmVlKCkKLSAgICAgICAgCi0gICAgICAgIG5hbWVzID0gdHJlZS5kZXB0aEZpcnN0KCkuY29sbGVjdCB7IGl0Lm5hbWUoKSB9Ci0gICAgICAgIGV4cGVjdGVkID0gWydhJywgJ2IxJywgJ2IyJywgJ2MxJywgJ2MyJywgJ2IzJywgJ2I0JywgJ2MzJywgJ2M0JywgJ2I1J10KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBuYW1lcyA9PSBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RCcmVkdGhGaXJzdCgpIHsKLSAgICAgICAgdHJlZSA9IGNyZWF0ZVRyZWUoKQotICAgICAgICAKLSAgICAgICAgbmFtZXMgPSB0cmVlLmJyZWFkdGhGaXJzdCgpLmNvbGxlY3QgeyBpdC5uYW1lKCkgfQotICAgICAgICBleHBlY3RlZCA9IFsnYScsICdiMScsICdiMicsICdiMycsICdiNCcsICdiNScsICdjMScsICdjMicsICdjMycsICdjNCddCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbmFtZXMgPT0gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGNyZWF0ZVRyZWUoKSB7ICAgICAgIAotICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIuYShhOjUsIGI6NykgewotICAgICAgICAgICAgYjEoKQotICAgICAgICAgICAgYjIgewotICAgICAgICAgICAgICAgIGMxKCkKLSAgICAgICAgICAgICAgICBjMigpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiMygpCi0gICAgICAgICAgICBiNCB7Ci0gICAgICAgICAgICAgICAgYzMoKQotICAgICAgICAgICAgICAgIGM0KCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGI1KCkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgcHJpbnRsbihyb290KQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJvb3QKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmVzdGVkQ2xvc3VyZUJ1Z1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWM2ZTFkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmVzdGVkQ2xvc3VyZUJ1Z1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCi0KLS8qKgotICogVGVzdCBjYXNlIGZvciBhIGJ1ZyB3aXRoIG5lc3RlZCBjbG9zdXJlcwotICovCi1jbGFzcyBOZXN0ZWRDbG9zdXJlQnVnVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICBwcm9wZXJ0eSBiCi0KLSAgICB2b2lkIHRlc3ROZXN0ZWRDbG9zdXJlQnVnKCkgewotICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIucm9vdChbJ2EnOid4eXonXSwgewotICAgICAgICAgICAgYi5jaGlsZCh7Ci0gICAgICAgICAgICAgICAgYi5ncmFuZENoaWxkKCkgIAotICAgICAgICAgICAgfSkKLSAgICAgICAgfSkKLQotCQlwcmludGxuKHJvb3QpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTm9kZVByaW50ZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL05vZGVQcmludGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYyMThlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTm9kZVByaW50ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkudHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTm9kZVByaW50ZXJUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS90cmVlL1RyZWVUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VHJlZSIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NlVHJlZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvVmVyYm9zZVRyZWVUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VHJlZSIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTbWFsbFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS90cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUcmVlIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpdHRsZUNsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9MaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdENsb3N1cmUiLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENsb3N1cmVCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS90cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0TmVzdGVkQ2xvc3VyZUJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZUNsYXNzTG9hZGVyQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvdHJlZS9DbG9zdXJlQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUcmVlIiwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nKCkgewotICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGxvZy5pbmZvKCJMb2dnaW5nIHVzaW5nIEpESyAxLjQgbG9nZ2luZyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvU21hbGxUcmVlVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWU3MTUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvU21hbGxUcmVlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1jbGFzcyBTbWFsbFRyZWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHByb3BlcnR5IGIKLQotICAgIHZvaWQgdGVzdFRyZWUoKSB7Ci0gICAgICAgIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIAotICAgICAgICByb290ID0gYi5yb290MSggewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgIH0pCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBwcmludGxuKHJvb3QpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvVHJlZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHJlZS9UcmVlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTllZWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHJlZS9UcmVlVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0KLQotLyoqCi0gKiBUaGlzIHRlc3QgdXNlcyB0aGUgY29uY2lzZSBHcm9vdnlNYXJrdXAgc3ludGF4IHRvIHRlc3QgdGhlIGJ1aWxkaW5nIG9mIHRyZWVzCi0gKi8KLWNsYXNzIFRyZWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdFNtYWxsVHJlZSgpIHsKLSAgICAgICAgYiA9IE5vZGVCdWlsZGVyLm5ld0luc3RhbmNlKCkKLSAgICAgICAgCi0gICAgICAgIHJvb3QgPSBiLnJvb3QxKGE6NSwgYjo3KSB7Ci0gICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKLSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotICAgICAgICAgICAgZWxlbTMoeDo3KQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBwcmludChyb290KQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIucm9vdDIoYTo1LCBiOjcpIHsKLSAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQotICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCi0gICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnKQotICAgICAgICAgICAgICAgIGNoaWxkMigpICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbmVzdGVkRWxlbTIoejonenp6JykgewotICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCi0gICAgICAgICAgICAgICAgY2hpbGQyKCJoZWxsbyIpICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgcHJpbnQocm9vdCkKLQotCQllMSA9IHJvb3QuZWxlbTEuZ2V0KDApCi0gICAgICAgIGFzc2VydCBlMS52YWx1ZSgpID09ICdoZWxsbzEnCi0gICAgICAgIAotICAgICAgICBlMiA9IHJvb3QuZWxlbTIuZ2V0KDApCi0gICAgICAgIGFzc2VydCBlMi52YWx1ZSgpID09ICdoZWxsbzInCi0KLSAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTEuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvMScKLSAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTIuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvMicKLQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkgPT0gWyd4JzonYWJjJywgJ3knOidkZWYnXSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOidkZWYnXQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIuZ2V0KDApLnZhbHVlKCkgPT0gW10KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIuZ2V0KDApLnRleHQoKSA9PSAnJwotCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmdldCgwKS5hdHRyaWJ1dGVzKCkgPT0gWyd6Jzonenp6J10gICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOidkZWYnXQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIuZ2V0KDApLnRleHQoKSA9PSAnaGVsbG8nCi0gICAgICAgIAotICAgICAgICBsaXN0ID0gcm9vdC52YWx1ZSgpCi0gICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA9PSA0Ci0KLSAgICAgICAgYXNzZXJ0IHJvb3QuYXR0cmlidXRlcygpLmEgPT0gNQotICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYiA9PSA3Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueCA9PSAnYWJjJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueSA9PSAnZGVmJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5nZXQoMCkuYXR0cmlidXRlcygpLnogPT0gJ3p6eicKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKS56ID09ICdkZWYnCi0gICAgICAgIAotICAgICAgICAvKiogQHRvZG8gcGFyc2VyIGFkZCAuQCBhcyBhbiBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdC5AYSA9PSA1Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGIgPT0gNwotICAgICAgICAqLyAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHJlZS9WZXJib3NlVHJlZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHJlZS9WZXJib3NlVHJlZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk5NDM0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvVmVyYm9zZVRyZWVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLQotCi0vKioKLSAqIFRoaXMgdGVzdCB1c2VzIHRoZSB2ZXJib3NlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiB0cmVlcwotICogdXNpbmcgR3Jvb3Z5TWFya3VwCi0gKi8KLWNsYXNzIFZlcmJvc2VUcmVlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICBwcm9wZXJ0eSBiCi0KLSAgICB2b2lkIHRlc3RTbWFsbFRyZWUoKSB7Ci0gICAgICAgIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIAotICAgICAgICByb290ID0gYi5yb290MShbJ2EnOjUsICdiJzo3XSwgewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLSAgICAgICAgICAgIGVsZW0zKFsneCc6N10pCi0gICAgICAgIH0pCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBwcmludChyb290KQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIucm9vdDIoWydhJzo1LCAnYic6N10sIHsKLSAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQotICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCi0gICAgICAgICAgICBuZXN0ZWRFbGVtKFsneCc6J2FiYycsICd5JzonZGVmJ10sIHsKLSAgICAgICAgICAgICAgICBjaGlsZChbJ3onOidkZWYnXSkKLSAgICAgICAgICAgICAgICBjaGlsZDIoKSAgCi0gICAgICAgICAgICB9KQotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXN0ZWRFbGVtMihbJ3onOid6enonXSwgewotICAgICAgICAgICAgICAgIGNoaWxkKFsneic6J2RlZiddKQotICAgICAgICAgICAgICAgIGNoaWxkMigiaGVsbG8iKSAgCi0gICAgICAgICAgICB9KQotICAgICAgICB9KQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgcHJpbnQocm9vdCkKLQotICAgICAgICBlMSA9IHJvb3QuZWxlbTEuZ2V0KDApCi0gICAgICAgIGFzc2VydCBlMS52YWx1ZSgpID09ICdoZWxsbzEnCi0gICAgICAgIAotICAgICAgICBlMiA9IHJvb3QuZWxlbTIuZ2V0KDApCi0gICAgICAgIGFzc2VydCBlMi52YWx1ZSgpID09ICdoZWxsbzInCi0KLSAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTEuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvMScKLSAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTIuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvMicKLQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkgPT0gWyd4JzonYWJjJywgJ3knOidkZWYnXSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOidkZWYnXQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIuZ2V0KDApLnZhbHVlKCkgPT0gW10KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIuZ2V0KDApLnRleHQoKSA9PSAnJwotCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmdldCgwKS5hdHRyaWJ1dGVzKCkgPT0gWyd6Jzonenp6J10gICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOidkZWYnXQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIuZ2V0KDApLnZhbHVlKCkgPT0gJ2hlbGxvJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIuZ2V0KDApLnRleHQoKSA9PSAnaGVsbG8nCi0gICAgICAgIAotICAgICAgICBsaXN0ID0gcm9vdC52YWx1ZSgpCi0gICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA9PSA0Ci0KLSAgICAgICAgYXNzZXJ0IHJvb3QuYXR0cmlidXRlcygpLmEgPT0gNQotICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYiA9PSA3Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueCA9PSAnYWJjJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueSA9PSAnZGVmJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5nZXQoMCkuYXR0cmlidXRlcygpLnogPT0gJ3p6eicKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKS56ID09ICdkZWYnCi0gICAgICAgIAotICAgICAgICAvKiogQHRvZG8gcGFyc2VyIGFkZCAuQCBhcyBhbiBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdC5AYSA9PSA1Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGIgPT0gNwotICAgICAgICAqLyAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uQmVhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZmYzc5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3R4bi9UcmFuc2FjdGlvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnR4bjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLS8qKgotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25CZWFuIHsKLSAgICBwcml2YXRlIENsb3N1cmUgcnVuOwotICAgIHByaXZhdGUgQ2xvc3VyZSBvbkVycm9yOwotICAgIHByaXZhdGUgQ2xvc3VyZSBvblN1Y2Nlc3M7Ci0gICAgCi0gICAgcHVibGljIENsb3N1cmUgcnVuKCkgewotICAgICAgICByZXR1cm4gcnVuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2xvc3VyZSBvbkVycm9yKCkgewotICAgICAgICByZXR1cm4gb25FcnJvcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENsb3N1cmUgb25TdWNjZXNzKCkgewotICAgICAgICByZXR1cm4gb25TdWNjZXNzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oQ2xvc3VyZSBydW4pIHsKLSAgICAgICAgdGhpcy5ydW4gPSBydW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQ2xvc3VyZSBvbkVycm9yKSB7Ci0gICAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDbG9zdXJlIG9uU3VjY2VzcykgewotICAgICAgICB0aGlzLm9uU3VjY2VzcyA9IG9uU3VjY2VzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25CdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTQwNmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBncm9vdnkudHhuOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotLyoqCi0gKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgewotICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0aW9uKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICBUcmFuc2FjdGlvbkJlYW4gYmVhbiA9IG5ldyBUcmFuc2FjdGlvbkJlYW4oKTsKLSAgICAgICAgY2xvc3VyZS5zZXREZWxlZ2F0ZShiZWFuKTsKLSAgICAgICAgY2xvc3VyZS5jYWxsKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgLy8gbGV0cyBjYWxsIHRoZSBjbG9zdXJlcyBub3cKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQZXJmb3JtaW5nIG5vcm1hbCB0cmFuc2FjdGlvbiIpOwotICAgICAgICBiZWFuLnJ1bigpLmNhbGwodGhpcyk7Ci0gICAgICAgIGJlYW4ub25TdWNjZXNzKCkuY2FsbCh0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGVyZm9ybWluZyBlcnJvciB0cmFuc2FjdGlvbiIpOwotICAgICAgICBiZWFuLnJ1bigpLmNhbGwodGhpcyk7Ci0gICAgICAgIGJlYW4ub25FcnJvcigpLmNhbGwodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyYTVhZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnR4bgotCi1jbGFzcyBUcmFuc2FjdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RUeG4oKSB7Ci0JCWJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKCkKLQkJYnVpbGRlci50cmFuc2FjdGlvbiB7Ci0JCSAgICBydW4gewotCQkgICAgICAgIHByaW50bG4oInJ1biBjb2RlISIpCi0JCSAgICB9Ci0JCSAgICBvbkVycm9yIHsKLSAgICAgICAgICAgICAgICBwcmludGxuKCJvbiBlcnJvciEiKQotCQkgICAgfQotCQkgICAgb25TdWNjZXNzIHsKLSAgICAgICAgICAgICAgICBwcmludGxuKCJvbiBzdWNjZXNzISIpCi0JCSAgICB9Ci0JCX0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQW50VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL0FudFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY0ZjUwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQW50VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotcGFja2FnZSBncm9vdnkudXRpbAotCi1pbXBvcnQgamF2YS5pby5GaWxlCi0KLWNsYXNzIEFudFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0QW50KCkgewotICAgICAgICBhbnQgPSBuZXcgQW50QnVpbGRlcigpCi0KLSAgICAgICAgLy8gbGV0cyBqdXN0IGNhbGwgb25lIHRhc2sKLSAgICAgICAgYW50LmVjaG8oImhlbGxvIikKLSAgICAgICAgCi0gICAgICAgIC8vIGhlcmUicyBhbiBleGFtcGxlIG9mIGEgYmxvY2sgb2YgQW50IGluc2lkZSBHcm9vdnlNYXJrdXAKLSAgICAgICAgYW50LnNlcXVlbnRpYWwgewotICAgICAgICAgICAgZWNobygiaW5zaWRlIHNlcXVlbnRpYWwiKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBteURpciA9ICJ0YXJnZXQvQW50VGVzdC8iCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1rZGlyKGRpcjpteURpcikgCi0gICAgICAgICAgICBjb3B5KHRvZGlyOm15RGlyKSB7Ci0gICAgICAgICAgICAgICAgZmlsZXNldChkaXI6InNyYy90ZXN0IikgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlKG5hbWU6IioqLyouZ3Jvb3Z5IikKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVjaG8oImRvbmUiKQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgbGV0cyBkbyBzb21lIG5vcm1hbCBHcm9vdnkgYWdhaW4KLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvQW50VGVzdC9ncm9vdnkvdXRpbC9BbnRUZXN0Lmdyb292eSIpCi0gICAgICAgIGFzc2VydCBmaWxlLmV4aXN0cygpCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdEZpbGVJdGVyYXRpb24oKSB7Ci0gICAgICAgIGFudCA9IG5ldyBBbnRCdWlsZGVyKCkKLSAgICAgICAgCi0gICAgICAgIC8vIGxldHMgY3JlYXRlIGEgc2Nhbm5lciBvZiBmaWxlc2V0cwotICAgICAgICBzY2FubmVyID0gYW50LmZpbGVTY2FubmVyIHsKLSAgICAgICAgICAgIGZpbGVzZXQoZGlyOiJzcmMvdGVzdCIpIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlKG5hbWU6IioqL0FudCouZ3Jvb3Z5IikKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbm93IGxldHMgaXRlcmF0ZSBvdmVyIAotICAgICAgICBmb3VuZCA9IGZhbHNlCi0gICAgICAgIGZvciAoZiBpbiBzY2FubmVyKSB7Ci0gICAgICAgICAgICBwcmludGxuKCJGb3VuZCBmaWxlICR7Zn0iKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3VuZCA9IHRydWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IGYgaW5zdGFuY2VvZiBGaWxlCi0gICAgICAgICAgICBhc3NlcnQgZi5uYW1lLmVuZHNXaXRoKCIuZ3Jvb3Z5IikKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgZm91bmQKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0SnVuaXRUYXNrKCkgewotICAgIAlhbnQgPSBuZXcgQW50QnVpbGRlcigpCi0gICAgICAgIAotICAgICAgICBhbnQuanVuaXQgewotICAgICAgICAJdGVzdChuYW1lOidncm9vdnkudXRpbC5Tb21ldGhpbmdUaGF0RG9lc05vdEV4aXN0JykKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RQYXRoQnVpbGRpbmcoKSB7Ci0gICAgCWFudCA9IG5ldyBBbnRCdWlsZGVyKCkKLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gYW50LnBhdGggewotICAgIAkJZmlsZXNldChkaXI6Inhkb2NzIikgewotICAgIAkJCWluY2x1ZGUobmFtZToiKi53aWtpIikKLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJYXNzZXJ0IHZhbHVlICE9IG51bGwKLSAgICAJCi0gICAgCXByaW50bG4gIkZvdW5kIHBhdGggb2YgdHlwZSAke3ZhbHVlLmNsYXNzLm5hbWV9IgotICAgIAlwcmludGxuIHZhbHVlCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0VGFza0NvbnRhaW5lckFkZFRhc2tJc0NhbGxlZCgpIHsKLSAgICAgICAgYW50ID0gbmV3IEFudEJ1aWxkZXIoKQotICAgICAgICB0YXNrQ29udGFpbmVyID0gYW50LnBhcmFsbGVsKCl7IC8vICJQYXJhbGxlbCIgc2VydmVzIGFzIGEgc2FtcGxlIFRhc2tDb250YWluZXIKLSAgICAgICAgICAgIGFudC5lY2hvKCkgICAgICAgICAgICAgICAgICAvLyAiRWNobyIgd2l0aG91dCBtZXNzYWdlIHRvIGtlZXAgdGVzdHMgc2lsZW50Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbm90IHZlcnkgZWxlZ2FudCwgYnV0IHRoZSBlYXNpZXN0IHdheSB0byBnZXQgdGhlIGFudCBpbnRlcm5hbHMuLi4KLSAgICAgICAgYXNzZXJ0IHRhc2tDb250YWluZXIuZHVtcCgpID1+ICduZXN0ZWRUYXNrcz1cXFtvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvQFxcdytcXF0nCi0gICAgfQotCi0gICAgdm9pZCB0ZXN0VGFza0NvbnRhaW5lckV4ZWN1dGlvblNlcXVlbmNlKCkgewotICAgICAgICBhbnQgPSBuZXcgQW50QnVpbGRlcigpCi0gICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5nZXRTcG9vZigpLmxlbmd0aCA9IDAKLSAgICAgICAgUEFUSCA9ICd0YXNrLnBhdGgnCi0gICAgICAgIGFudC5wYXRoKGlkOlBBVEgpe2FudC5wYXRoZWxlbWVudChsb2NhdGlvbjonY2xhc3NlcycpfQotICAgICAgICBbJ3Nwb29mY29udGFpbmVyJzonU3Bvb2ZUYXNrQ29udGFpbmVyJywgJ3Nwb29mJzonU3Bvb2ZUYXNrJ10uZWFjaHsgfHBhaXJ8Ci0gICAgICAgICAgICBhbnQudGFza2RlZihuYW1lOnBhaXIua2V5LCBjbGFzc25hbWU6J2dyb292eS51dGlsLicrcGFpci52YWx1ZSwgY2xhc3NwYXRocmVmOlBBVEgpCi0gICAgICAgIH0KLSAgICAgICAgYW50LnNwb29mY29udGFpbmVyKCl7Ci0gICAgICAgICAgICBhbnQuc3Bvb2YoKQotICAgICAgICB9Ci0gICAgICAgIGV4cGVjdGVkU3Bvb2YgPQotICAgICAgICAgICAgIlNwb29mVGFza0NvbnRhaW5lciBjdG9yXG4iKwotICAgICAgICAgICAgIlNwb29mVGFzayBjdG9yXG4iKwotICAgICAgICAgICAgImluIGFkZFRhc2tcbiIrCi0gICAgICAgICAgICAiYmVnaW4gU3Bvb2ZUYXNrQ29udGFpbmVyIGV4ZWN1dGVcbiIrCi0gICAgICAgICAgICAiYmVnaW4gU3Bvb2ZUYXNrIGV4ZWN1dGVcbiIrCi0gICAgICAgICAgICAiZW5kIFNwb29mVGFzayBleGVjdXRlXG4iKwotICAgICAgICAgICAgImVuZCBTcG9vZlRhc2tDb250YWluZXIgZXhlY3V0ZVxuIgotICAgICAgICBhc3NlcnRFcXVhbHMgZXhwZWN0ZWRTcG9vZiwgU3Bvb2ZUYXNrQ29udGFpbmVyLmdldFNwb29mKCkudG9TdHJpbmcoKQotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9CdWlsZGVyU3VwcG9ydFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9CdWlsZGVyU3VwcG9ydFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI1MjZhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQnVpbGRlclN1cHBvcnRUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIGdyb292eS51dGlsCi0KLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uCi0KLS8qKgotICAgVGVzdGluZyBCdWlsZGVyU3VwcG9ydCBhbmQgcmV2ZWFsIGhvdyBjYWxsaW5nCi0gICBtZXRob2RzIG9uIGl0IHJlc3VsdCBpbiBpbXBsZW1lbnRhdGlvbiBjYWxsYmFja3MuCi0gICBVc2luZyB0aGUgU3Bvb2ZCdWlsZGVyIChzZWUgYmVsb3cpIHRvIGNhbGwgaXQgaW4gdmFyaW91cyB3YXlzCi0gICBhbmQgYW5hbHl6ZSB0aGUgInNwb29mZWQiIGxvZ3MuCi0gICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gZGVzaWduaW5nIHN1YmNsYXNzZXMgb2YgQnVpbGRlclN1cHBvcnQuCi0gICBAYXV0aG9yIERpZXJrIEtvZW5pZwotKiovCi0KLQotY2xhc3MgQnVpbGRlclN1cHBvcnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7Ci0gICB2b2lkIHRlc3RTaW1wbGVOb2RlKCkgewotICAgICAgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQotICAgICAgYXNzZXJ0IGIubG9nID09IFtdCi0gICAgICBub2RlID0gYi5mb28oKQotICAgICAgYXNzZXJ0IGIubG9nID09IFsnY3JlYXRlX3dpdGhfbmFtZScsJ2ZvbycsJ25vZGVfY29tcGxldGVkJyxudWxsLCBub2RlXQotICAgfQotCi0gICB2b2lkIHRlc3RTaW1wbGVOb2RlV2l0aFZhbHVlKCkgewotICAgICAgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQotICAgICAgbm9kZSA9IGIuZm9vKCd2YWx1ZScpCi0gICAgICBhc3NlcnQgYi5sb2cgPT0gWydjcmVhdGVfd2l0aF9uYW1lX2FuZF92YWx1ZScsJ2ZvbycsJ3ZhbHVlJywgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGVdCi0gICB9Ci0KLSAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoT25lQXR0cmlidXRlKCkgewotICAgICAgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQotICAgICAgbm9kZSA9IGIuZm9vKG5hbWU6J3ZhbHVlJykKLSAgICAgIGFzc2VydCBiLmxvZyA9PSBbCi0gICAgICAgICAnY3JlYXRlX3dpdGhfbmFtZV9hbmRfbWFwJywnZm9vJywgJ25hbWUnLCd2YWx1ZScsICdub2RlX2NvbXBsZXRlZCcsbnVsbCwneCddCi0gICB9Ci0KLSAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoQ2xvc3VyZSgpIHsKLSAgICAgIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKLSAgICAgIGIuZm9vKCl7Ci0gICAgICAgICBiLmJhcigpCi0gICAgICB9Ci0gICAgICBhc3NlcnQgYi5sb2cgPT0gWwotICAgICAgICAgJ2NyZWF0ZV93aXRoX25hbWUnLCdmb28nLAotICAgICAgICAgICAgJ2NyZWF0ZV93aXRoX25hbWUnLCdiYXInLAotICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywKLSAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywKLSAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCwneCddCi0gICB9Ci0KLSAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoT25lQXR0cmlidXRlQW5kVmFsdWUoKSB7Ci0gICAgICBiID0gbmV3IFNwb29mQnVpbGRlcigpCi0gICAgICBub2RlID0gYi5mb28oYmFyOidiYXonLCAndmFsdWUnKQotICAgICAgYXNzZXJ0IGIubG9nID09IFsnY3JlYXRlX3dpdGhfbmFtZV9tYXBfYW5kX3ZhbHVlJywgJ2ZvbycsICdiYXInLCAnYmF6JywndmFsdWUnLCAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZV0KLSAgIH0KLQotICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhWYWx1ZUFuZE9uZUF0dHJpYnV0ZSgpIHsKLSAgICAgIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKLSAgICAgIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpCi0gICAgICBhc3NlcnQgYi5sb2cgPT0gWydjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnLCAnZm9vJywgJ2JhcicsICdiYXonLCd2YWx1ZScsICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlXQotICAgfQotCi0gICB2b2lkIHRlc3RTaW1wbGVOb2RlV2l0aE9uZUF0dHJpYnV0ZUFuZFZhbHVlQW5kQ2xvc3VyZSgpIHsKLSAgICAgIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKLSAgICAgIG5vZGUgPSBiLmZvbyhiYXI6J2JheicsICd2YWx1ZScpIHsgMSB9Ci0gICAgICBhc3NlcnQgYi5sb2cgPT0gWydjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnLCAnZm9vJywgJ2JhcicsICdiYXonLCd2YWx1ZScsICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlXQotICAgfQotCi0gICB2b2lkIHRlc3RTaW1wbGVOb2RlV2l0aFZhbHVlQW5kT25lQXR0cmlidXRlQW5kQ2xvc3VyZSgpIHsKLSAgICAgIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKLSAgICAgIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpIHsgMSB9Ci0gICAgICBhc3NlcnQgYi5sb2cgPT0gWydjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnLCAnZm9vJywgJ2JhcicsICdiYXonLCd2YWx1ZScsICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlXQotICAgfQotCi0gICB2b2lkIHRlc3RTaW1wbGVOb2RlVHdvVmFsdWVzKCkgewotICAgICAgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQotICAgICAgc2hvdWxkRmFpbChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uLCB7bm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInKX0pCi0gICB9Ci0KLSAgIHZvaWQgdGVzdFNpbXBsZU5vZGVUd29WYWx1ZXNDbG9zdXJlKCkgewotICAgICAgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQotICAgICAgc2hvdWxkRmFpbChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uLCB7bm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInKSB7IDEgfSB9KQotICAgfQotCi0gICB2b2lkIHRlc3RTaW1wbGVOb2RlVGhyZWVWYWx1ZXMoKSB7Ci0gICAgICBiID0gbmV3IFNwb29mQnVpbGRlcigpCi0gICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicsICdhcmczJykgfSkKLSAgIH0KLQotICAgdm9pZCB0ZXN0U2ltcGxlTm9kZUZvdXJWYWx1ZXMoKSB7Ci0gICAgICBiID0gbmV3IFNwb29mQnVpbGRlcigpCi0gICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicsICdhcmczJywgJ2FyZzQnKSB9KQotICAgfQotICAgCi0gICB2b2lkIHRlc3ROb2RlSW5DbG9zdXJlRm91clZhbHVlcygpIHsKLSAgICAgIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKLSAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwge25vZGUgPSBiLmZvbygpIHsgYi5iYXooJ2FyZzEnLCAnYXJnMicsICdhcmczJywgJ2FyZzQnKSB9fSkKLSAgIH0KLX0KLQotLyoqCi0gICBUaGUgU3Bvb2ZCdWlsZGVyIGlzIGEgc2FtcGxlIGluc3RhbmNlIG9mIHRoZSBhYnN0cmFjdCBCdWlsZGVyU3VwcG9ydCBjbGFzcyAKLSAgIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBsb2dnaW5nIGhvdyBpdCB3YXMgY2FsbGVkLCByZXR1cm5pbmcgJ3gnIGZvciBlYWNoIG5vZGUuCi0qKi8KLWNsYXNzIFNwb29mQnVpbGRlciBleHRlbmRzIEJ1aWxkZXJTdXBwb3J0ewotICAgIGxvZyA9IFtdCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCl7Ci0gICAgICAgIGxvZyA8PCAic2V0X3BhcmVudCIKLSAgICAgICAgbG9nIDw8IHBhcmVudAotICAgICAgICBsb2cgPDwgY2hpbGQKLSAgICB9Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lKXsKLSAgICAgICAgbG9nIDw8ICdjcmVhdGVfd2l0aF9uYW1lJwotICAgICAgICBsb2cgPDwgIG5hbWUKLSAgICAgICAgcmV0dXJuICd4JwotICAgIH0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSl7Ci0gICAgICAgIGxvZyA8PCAnY3JlYXRlX3dpdGhfbmFtZV9hbmRfdmFsdWUnCi0gICAgICAgIGxvZyA8PCBuYW1lCi0gICAgICAgIGxvZyA8PCB2YWx1ZQotICAgICAgICByZXR1cm4gJ3gnCi0gICAgfQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMpewotICAgICAgICBsb2cgPDwgJ2NyZWF0ZV93aXRoX25hbWVfYW5kX21hcCcKLSAgICAgICAgbG9nIDw8IG5hbWUKLSAgICAgICAgYXR0cmlidXRlcy5lYWNoe2VudHJ5fCBsb2cgPDwgZW50cnkua2V5OyBsb2cgPDwgZW50cnkudmFsdWV9Ci0gICAgICAgIHJldHVybiAneCcKLSAgICB9Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKXsKLSAgICAgICAgbG9nIDw8ICdjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnCi0gICAgICAgIGxvZyA8PCBuYW1lCi0gICAgICAgIGF0dHJpYnV0ZXMuZWFjaHtlbnRyeXwgbG9nIDw8IGVudHJ5LmtleTsgbG9nIDw8IGVudHJ5LnZhbHVlfQotICAgICAgICBsb2cgPDwgdmFsdWUKLSAgICAgICAgcmV0dXJuICd4JwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBub2RlQ29tcGxldGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBub2RlKSB7Ci0gICAgICAgIGxvZyA8PCAnbm9kZV9jb21wbGV0ZWQnCi0gICAgICAgIGxvZyA8PCBwYXJlbnQKLSAgICAgICAgbG9nIDw8IG5vZGUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTQ1MWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9EdW1teS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi1wYWNrYWdlIGdyb292eS51dGlsOwotCi1wdWJsaWMgY2xhc3MgRHVtbXkgaW1wbGVtZW50cyBEdW1teU1CZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiSmFtZXMiOwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uID0gIkxvbmRvbiI7Ci0gICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IDEyOwotCi0gICAgcHVibGljIER1bW15KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRHVtbXkoU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0ZWQhIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RvcHBlZCEiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7Ci0gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15TUJlYW4uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRHVtbXlNQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjkxMjg1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRHVtbXlNQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi1wYWNrYWdlIGdyb292eS51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIER1bW15TUJlYW4gewotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCk7Ci0gICAgcHVibGljIHZvaWQgc3RvcCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpOwotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRW1wdHlTY3JpcHRUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL0VtcHR5U2NyaXB0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRhODUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRW1wdHlTY3JpcHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkudXRpbDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5U2NyaXB0VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVNjcmlwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTY3JpcHQoIiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTUJlYW5UZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL01CZWFuVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTgzODFkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTUJlYW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkudXRpbDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiBUZXN0cyB1c2luZyB0aGUgR3Jvb3Z5T2JqZWN0IEFQSSBmcm9tIEphdmEgdG8gYWNjZXNzIE1CZWFucyB2aWEgCi0gKiB0aGUgbm9ybWFsIHByb3BlcnRpZXMgQVBJICh0byBzaW11bGF0ZSBub3JtYWwgR3Jvb3Z5IHByb3BlcnR5IGFjY2VzcykKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE1CZWFuVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNQmVhblNlcnZlciBtYmVhblNlcnZlciA9IE1CZWFuU2VydmVyRmFjdG9yeS5jcmVhdGVNQmVhblNlcnZlcigpOwotICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBuZXcgT2JqZWN0TmFtZSgiZ3Jvb3Z5LnRlc3Q6cm9sZT1UZXN0TUJlYW4sdHlwZT1EdW1teSIpOwotICAgICAgICBtYmVhblNlcnZlci5yZWdpc3Rlck1CZWFuKG5ldyBEdW1teSgpLCBuYW1lKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkpNWCB2YWx1ZSBvZiBOYW1lIiwgIkphbWVzIiwgbWJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJOYW1lIikpOwotCi0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBuZXcgR3Jvb3Z5TUJlYW4obWJlYW5TZXJ2ZXIsIG5hbWUpOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0LmdldFByb3BlcnR5KCJOYW1lIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTmFtZSBwcm9wZXJ0eSIsICJKYW1lcyIsIHZhbHVlKTsKLQotICAgICAgICBvYmplY3Quc2V0UHJvcGVydHkoIk5hbWUiLCAiQm9iIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTmFtZSBwcm9wZXJ0eSIsICJCb2IiLCBvYmplY3QuZ2V0UHJvcGVydHkoIk5hbWUiKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgbGV0cyBsb29rIHVwIHRoZSBuYW1lIHZpYSBKTVggdG8gY2hlY2tpCi0gICAgICAgIGFzc2VydEVxdWFscygiSk1YIHZhbHVlIG9mIE5hbWUiLCAiQm9iIiwgbWJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJOYW1lIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTmF2VG9XaWtpLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTmF2VG9XaWtpLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyNmMxYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL05hdlRvV2lraS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sUGFyc2VyCi0KLWlmIChhcmdzLnNpemUoKSA8IDEpIHsKLSAgICBwcmludGxuICJVc2FnZTogTmF2VG9XaWtpIGZpbGVOYW1lIgotfQotZWxzZSB7Ci0gICAgZmlsZSA9IGFyZ3NbMF0KLSAgICBwcmludGxuICJBYm91dCB0byBwYXJzZSAke2ZpbGV9IgotICAgIGRvYyA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZShmaWxlKQotCi0gICAgcHJpbnRsbiAiCi1RdWlja0xpbmtzIHBhZ2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0iCi0gICAgbGlua3MgPSBkb2MuYm9keS5saW5rcy5pdGVtCi0gICAgcHJpbnRsbiBsaW5rcy5jb2xsZWN0IHsKLSAgICAgICAgcmV0dXJuICJ7bGluazoiICsgaXRbJ0BuYW1lJ10gKyAifCIgKyBpdFsnQGhyZWYnXSArICJ9IgotICAgIH0uam9pbigiIHwgIikKLQotICAgIHByaW50bG4gIgotCi0KLQotTmF2aWdhdGlvbiBwYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotIgotICAgIG1lbnVzID0gZG9jLmJvZHkubWVudQotICAgIG1lbnVzLmVhY2ggewotICAgICAgICBwcmludGxuICJoMzoke2l0WydAbmFtZSddfSIKLQotICAgICAgICBpdC5pdGVtLmVhY2ggewotICAgICAgICAgICAgcHJpbnRsbiAiLSB7bGluazoiICsgaXRbJ0BuYW1lJ10gKyAifCIgKyBpdFsnQGhyZWYnXSArICJ9IgotICAgICAgICB9Ci0gICAgICAgIHByaW50bG4gIiIKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTm9kZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTm9kZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyYWViMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL05vZGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5LnV0aWw7Ci0KLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotaW1wb3J0IGdyb292eS51dGlsLk5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotLyoqCi0gKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBzdHJ1Y3R1cmVkIEF0dHJpYnV0ZSB0eXBlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIE5vZGUgYXR0cmlidXRlID0gbmV3IE5vZGUobnVsbCwgInRyYW5zYWN0aW9uYWwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgInRyYW5zYWN0aW9uYWwiLCBhdHRyaWJ1dGUubmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGVzIiwgMCwgYXR0cmlidXRlLmF0dHJpYnV0ZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgMCwgYXR0cmlidXRlLmNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgIiIsIGF0dHJpYnV0ZS50ZXh0KCkpOwotCi0gICAgICAgIGR1bXAoYXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlV2l0aEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYXR0cmlidXRlcy5wdXQoImEiLCAieHl6Iik7Ci0gICAgICAgIAotICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IG5ldyBOb2RlKG51bGwsICJmb28iLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgImZvbyIsIGF0dHJpYnV0ZS5uYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJpYnV0ZXMiLCAxLCBhdHRyaWJ1dGUuYXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCAwLCBhdHRyaWJ1dGUuY2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCAiIiwgYXR0cmlidXRlLnRleHQoKSk7Ci0KLSAgICAgICAgZHVtcChhdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVXaXRoVGV4dCgpIHsKLSAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBuZXcgTm9kZShudWxsLCAiZm9vIiwgInRoZSB0ZXh0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsICJmb28iLCBhdHRyaWJ1dGUubmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGVzIiwgMCwgYXR0cmlidXRlLmF0dHJpYnV0ZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgMSwgYXR0cmlidXRlLmNoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgInRoZSB0ZXh0IiwgYXR0cmlidXRlLnRleHQoKSk7Ci0KLSAgICAgICAgZHVtcChhdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVXaXRoQXR0cmlidXRlc0FuZENoaWxkcmVuKCkgewotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGF0dHJpYnV0ZXMucHV0KCJhIiwgInh5eiIpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgY2hpbGRyZW4uYWRkKG5ldyBOb2RlKG51bGwsICJwZXJzb24iLCAiSmFtZXMiKSk7Ci0gICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTm9kZShudWxsLCAicGVyc29uIiwgIkJvYiIpKTsKLSAgICAgICAgY2hpbGRyZW4uYWRkKCJzb21lVGV4dCIpOwotICAgICAgICAKLSAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBuZXcgTm9kZShudWxsLCAiZm9vIiwgYXR0cmlidXRlcywgY2hpbGRyZW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCAiZm9vIiwgYXR0cmlidXRlLm5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXR0cmlidXRlcyIsIDEsIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIDMsIGF0dHJpYnV0ZS5jaGlsZHJlbigpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsICJzb21lVGV4dCIsIGF0dHJpYnV0ZS50ZXh0KCkpOwotCi0gICAgICAgIGR1bXAoYXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlV2l0aEF0dHJpYnV0ZXNBbmRDaGlsZHJlbldpdGhNaXhlZFRleHQoKSB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYXR0cmlidXRlcy5wdXQoImEiLCAieHl6Iik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjaGlsZHJlbi5hZGQoInNvbWVUZXh0Iik7Ci0gICAgICAgIE5vZGUgbm9kZTEgPSBuZXcgTm9kZShudWxsLCAicGVyc29uIiwgIkphbWVzIik7Ci0gICAgICAgIGNoaWxkcmVuLmFkZChub2RlMSk7Ci0gICAgICAgIGNoaWxkcmVuLmFkZCgibW9yZVRleHQiKTsKLSAgICAgICAgTm9kZSBub2RlMiA9IG5ldyBOb2RlKG51bGwsICJwZXJzb24iLCAiQm9iIik7Ci0gICAgICAgIGNoaWxkcmVuLmFkZChub2RlMik7Ci0gICAgICAgIGNoaWxkcmVuLmFkZCgibW9yZVRleHQiKTsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgYXR0cmlidXRlID0gbmV3IE5vZGUobnVsbCwgImZvbyIsIGF0dHJpYnV0ZXMsIGNoaWxkcmVuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgImZvbyIsIGF0dHJpYnV0ZS5uYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJpYnV0ZXMiLCAxLCBhdHRyaWJ1dGUuYXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCA1LCBhdHRyaWJ1dGUuY2hpbGRyZW4oKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCAic29tZVRleHRtb3JlVGV4dG1vcmVUZXh0IiwgYXR0cmlidXRlLnRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gbGV0cyB0ZXN0IGdldAotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgYXR0cmlidXRlLmdldCgicGVyc29uIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbGlzdCBzaXplOiAiICsgbGlzdCwgMiwgbGlzdC5zaXplKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb2RlMSIsIG5vZGUxLCBsaXN0LmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTm9kZTIiLCBub2RlMiwgbGlzdC5nZXQoMSkpOwotCi0gICAgICAgIGR1bXAoYXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKE5vZGUgbm9kZSkgewotICAgICAgICBOb2RlUHJpbnRlciBwcmludGVyID0gbmV3IE5vZGVQcmludGVyKCk7Ci0gICAgICAgIHByaW50ZXIucHJpbnQobm9kZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL09yZGVyQnlUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT3JkZXJCeVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdiZTkyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT3JkZXJCeVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotY2xhc3MgT3JkZXJCeVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RTb3J0QnlPbmVGaWVsZCgpIHsKLSAgICAgICAgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcigpCi0gICAgICAgIHRyZWUgPSBidWlsZGVyLnBlb3BsZSB7Ci0gICAgICAgICAgICBwZXJzb24obmFtZTonSmFtZXMnLCBjaGVlc2U6J0VkYW0nLCBsb2NhdGlvbjonTG9uZG9uJykKLSAgICAgICAgICAgIHBlcnNvbihuYW1lOidCb2InLCBjaGVlc2U6J0NoZWRkYXInLCBsb2NhdGlvbjonQXRsYW50YScpCi0gICAgICAgICAgICBwZXJzb24obmFtZTonQ2hyaXMnLCBjaGVlc2U6J1JlZCBMZWljZXN0ZXInLCBsb2NhdGlvbjonTG9uZG9uJykKLSAgICAgICAgICAgIHBlcnNvbihuYW1lOidKb2UnLCBjaGVlc2U6J0JyaWUnLCBsb2NhdGlvbjonTG9uZG9uJykKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcGVvcGxlID0gdHJlZS5jaGlsZHJlbigpCi0gICAgICAgIAotICAgICAgICAvKiogQHRvZG8gcGFyc2VyIHNob3VsZCBhbGxvdyB0aGlzIHN5bnRheCBzdWdhcgotICAgICAgICBvcmRlciA9IG5ldyBPcmRlckJ5IHsgaXQuZ2V0KCdAY2hlZXNlJykgfQotICAgICAgICAqLwotICAgICAgICBvcmRlciA9IG5ldyBPcmRlckJ5KCB7IGl0LmdldCgnQGNoZWVzZScpIH0gKQotICAgICAgICBzb3J0ZWQgPSBwZW9wbGUuc29ydChvcmRlcikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDApLmdldCgnQG5hbWUnKSA9PSAnSm9lJwotICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgxKS5nZXQoJ0BuYW1lJykgPT0gJ0JvYicKLSAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMikuZ2V0KCdAbmFtZScpID09ICdKYW1lcycKLSAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMykuZ2V0KCdAbmFtZScpID09ICdDaHJpcycKLSAgICAgICAgCi0gICAgICAgIG9yZGVyID0gbmV3IE9yZGVyQnkoIHsgaXQuZ2V0KCdAbmFtZScpIH0gKQotICAgICAgICBzb3J0ZWQgPSBwZW9wbGUuc29ydChvcmRlcikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDApLmdldCgnQG5hbWUnKSA9PSAnQm9iJwotICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgxKS5nZXQoJ0BuYW1lJykgPT0gJ0NocmlzJwotICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgyKS5nZXQoJ0BuYW1lJykgPT0gJ0phbWVzJwotICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgzKS5nZXQoJ0BuYW1lJykgPT0gJ0pvZScKLSAgICB9Ci0KLQotICAgIHZvaWQgdGVzdFNvcnRCeU11bHRpcGxlRmllbGRzKCkgewotICAgICAgICBidWlsZGVyID0gbmV3IE5vZGVCdWlsZGVyKCkKLSAgICAgICAgdHJlZSA9IGJ1aWxkZXIucGVvcGxlIHsKLSAgICAgICAgICAgIHBlcnNvbihuYW1lOidKYW1lcycsIGNoZWVzZTonRWRhbScsIGxvY2F0aW9uOidMb25kb24nKQotICAgICAgICAgICAgcGVyc29uKG5hbWU6J0JvYicsIGNoZWVzZTonQ2hlZGRhcicsIGxvY2F0aW9uOidBdGxhbnRhJykKLSAgICAgICAgICAgIHBlcnNvbihuYW1lOidDaHJpcycsIGNoZWVzZTonUmVkIExlaWNlc3RlcicsIGxvY2F0aW9uOidMb25kb24nKQotICAgICAgICAgICAgcGVyc29uKG5hbWU6J0pvZScsIGNoZWVzZTonQnJpZScsIGxvY2F0aW9uOidMb25kb24nKQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwZW9wbGUgPSB0cmVlLmNoaWxkcmVuKCkKLQotICAgICAgICBvcmRlciA9IG5ldyBPcmRlckJ5KFsgeyBpdC5nZXQoJ0Bsb2NhdGlvbicpIH0sIHsgaXQuZ2V0KCdAY2hlZXNlJykgfSBdKQotICAgICAgICBzb3J0ZWQgPSBwZW9wbGUuc29ydChvcmRlcikKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDApLmdldCgnQG5hbWUnKSA9PSAnQm9iJwotICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgxKS5nZXQoJ0BuYW1lJykgPT0gJ0pvZScKLSAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMikuZ2V0KCdAbmFtZScpID09ICdKYW1lcycKLSAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMykuZ2V0KCdAbmFtZScpID09ICdDaHJpcycKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL1Nwb29mVGFzay5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TcG9vZlRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlYTRjMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL1Nwb29mVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBncm9vdnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBTcG9vZlRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHB1YmxpYyBTcG9vZlRhc2soKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5zcG9vZigiU3Bvb2ZUYXNrIGN0b3IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3Bvb2ZUYXNrQ29udGFpbmVyLnNwb29mKCJiZWdpbiBTcG9vZlRhc2sgZXhlY3V0ZSIpOwotICAgICAgICBTcG9vZlRhc2tDb250YWluZXIuc3Bvb2YoImVuZCBTcG9vZlRhc2sgZXhlY3V0ZSIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TcG9vZlRhc2tDb250YWluZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvU3Bvb2ZUYXNrQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYWRjZWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TcG9vZlRhc2tDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNwb29mVGFza0NvbnRhaW5lciBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBUYXNrQ29udGFpbmVyIHsKLSAgICBwcml2YXRlIExpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgc3RhdGljIFN0cmluZ0J1ZmZlciBzcG9vZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHB1YmxpYyBTcG9vZlRhc2tDb250YWluZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNwb29mKCJTcG9vZlRhc2tDb250YWluZXIgY3RvciIpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmdCdWZmZXIgZ2V0U3Bvb2YoKXsKLSAgICAgICAgcmV0dXJuIHNwb29mOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNwb29mKFN0cmluZyBtZXNzYWdlKXsKLSAgICAgICAgc3Bvb2YuYXBwZW5kKG1lc3NhZ2UpOwotICAgICAgICBzcG9vZi5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIHRhc2spIHsKLSAgICAJLy8gdG8gd29yayB3aXRoIGFudCAxLjYKLSAgICAgICAgc3Bvb2YoImluIGFkZFRhc2siKTsKLSAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgewotICAgICAgICAgICAgdGFzay5tYXliZUNvbmZpZ3VyZSgpOwotICAgICAgICAgICAgdGFzayA9ICgoVW5rbm93bkVsZW1lbnQpIHRhc2spLmdldFRhc2soKTsKLSAgICAgICAgfQotICAgICAgICB0YXNrcy5hZGQodGFzayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNwb29mKCJiZWdpbiBTcG9vZlRhc2tDb250YWluZXIgZXhlY3V0ZSIpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHRhc2sucGVyZm9ybSgpOwotICAgICAgICB9Ci0gICAgICAgIHNwb29mKCJlbmQgU3Bvb2ZUYXNrQ29udGFpbmVyIGV4ZWN1dGUiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sUGFyc2VyVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS91dGlsL1htbFBhcnNlclRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmYwMzUxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sUGFyc2VyVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIGdyb292eS51dGlsCi0KLWNsYXNzIFhtbFBhcnNlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0WG1sUGFyc2VyKCkgewotICAgICAgICB0ZXh0ID0gIiIiCi08Y2hhcmFjdGVycz4KLSAgICA8Y2hhcmFjdGVyIGlkPSIxIiBuYW1lPSJXYWxsYWNlIj4KLSAgICAJPGxpa2VzPmNoZWVzZTwvbGlrZXM+Ci0gICAgPC9jaGFyYWN0ZXI+Ci0gICAgPGNoYXJhY3RlciBpZD0iMiIgbmFtZT0iR3JvbWl0Ij4KLQkgICAgPGxpa2VzPnNsZWVwPC9saWtlcz4KLSAgICA8L2NoYXJhY3Rlcj4KLTwvY2hhcmFjdGVycz4KLSIiIgotICAgICAgICAKLSAgICAgICAgbm9kZSA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZVRleHQodGV4dCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgbm9kZSAhPSBudWxsCi0gICAgICAgIGFzc2VydCBub2RlLmNoaWxkcmVuKCkuc2l6ZSgpID09IDIgOiAiQ2hpbGRyZW4gJHtub2RlLmNoaWxkcmVuKCl9IgotICAgICAgICAKLSAgICAgICAgY2hhcmFjdGVycyA9IG5vZGUuY2hhcmFjdGVyCi0gICAgICAgIAotICAgICAgICBmb3IgKGMgaW4gY2hhcmFjdGVycykgewotICAgICAgICAgICAgcHJpbnRsbiBjWydAbmFtZSddCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBjaGFyYWN0ZXJzLnNpemUoKSA9PSAyCi0gICAgICAgIAotICAgICAgICBhc3NlcnQgbm9kZS5jaGFyYWN0ZXIubGlrZXMuc2l6ZSgpID09IDIgOiAiTGlrZXMgJHtub2RlLmNoYXJhY3Rlci5saWtlc30iCi0gICAgICAgIAotICAgICAgICAvLyBsZXRzIGZpbmQgR3JvbWl0Ci0gICAgICAgIGdyb21pdCA9IG5vZGUuY2hhcmFjdGVyLmZpbmQgeyBpdFsnQGlkJ10gPT0gJzInIH0KLSAgICAgICAgYXNzZXJ0IGdyb21pdCAhPSBudWxsIDogIlNob3VsZCBoYXZlIGZvdW5kIEdyb21pdCEiCi0gICAgICAgIGFzc2VydCBncm9taXRbJ0BuYW1lJ10gPT0gIkdyb21pdCIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBsZXRzIGZpbmQgd2hhdCBXYWxsYWNlIGxpa2VzIGluIDEgcXVlcnkKLSAgICAgICAgYW5zd2VyID0gbm9kZS5jaGFyYWN0ZXIuZmluZCB7IGl0WydAaWQnXSA9PSAnMScgfS5saWtlc1swXS50ZXh0KCkKLSAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAiY2hlZXNlIgotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RNaXhlZE1hcmt1cCgpIHsKLSAgICAgICAgdGV4dCA9IDw8PEVPRgotPHA+UGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+IHBhZ2U8L3A+Ci1FT0YKLSAgICAgICAgCi0gICAgICAgIG5vZGUgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2VUZXh0KHRleHQpCi0gICAgICAgIAotICAgICAgICBuZXcgTm9kZVByaW50ZXIoKS5wcmludChub2RlKQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IG5vZGUgIT0gbnVsbAotICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4oKQotICAgICAgICBhc3NlcnQgY2hpbGRyZW4uc2l6ZSgpID09IDMgOiAiQ2hpbGRyZW4gJHtjaGlsZHJlbn0iCi0gICAgICAgIGFzc2VydCBjaGlsZHJlblswXSBpbnN0YW5jZW9mIFN0cmluZwotICAgICAgICBhc3NlcnQgY2hpbGRyZW5bMV0gaW5zdGFuY2VvZiBOb2RlCi0gICAgICAgIGFzc2VydCBjaGlsZHJlblsyXSBpbnN0YW5jZW9mIFN0cmluZwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sU2x1cnBlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9YbWxTbHVycGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzEwMzUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkvdXRpbC9YbWxTbHVycGVyVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2FuZGJveC51dGlsCi0KLWNsYXNzIFhtbFNsdXJwZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIAotICAgIHZvaWQgdGVzdFhtbFBhcnNlcigpIHsKLSAgICAgICAgdGV4dCA9ICIiIgotPGNoYXJhY3RlcnM+Ci0gICAgPGNoYXJhY3RlciBpZD0iMSIgbmFtZT0iV2FsbGFjZSI+Ci0gICAgCTxsaWtlcz5jaGVlc2U8L2xpa2VzPgotICAgIDwvY2hhcmFjdGVyPgotICAgIDxjaGFyYWN0ZXIgaWQ9IjIiIG5hbWU9Ikdyb21pdCI+Ci0JICAgIDxsaWtlcz5zbGVlcDwvbGlrZXM+Ci0gICAgPC9jaGFyYWN0ZXI+Ci08L2NoYXJhY3RlcnM+Ci0iIiIKLSAgICAgICAgCi0gICAgICAgIG5vZGUgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dCh0ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBub2RlICE9IG51bGwKLSAgICAgICAgYXNzZXJ0IG5vZGUuY2hpbGRyZW4oKS5zaXplKCkgPT0gMiA6ICJDaGlsZHJlbiAke25vZGUuY2hpbGRyZW4oKX0iCi0gICAgICAgIAotICAgICAgICBjaGFyYWN0ZXJzID0gbm9kZS5jaGFyYWN0ZXIKLSAgICAgICAgCi0gICAgICAgIGZvciAoYyBpbiBjaGFyYWN0ZXJzKSB7Ci0gICAgICAgICAgICBwcmludGxuIGNbJ0BuYW1lJ10KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IGNoYXJhY3RlcnMuc2l6ZSgpID09IDIKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCBub2RlLmNoYXJhY3Rlci5saWtlcy5zaXplKCkgPT0gMiA6ICJMaWtlcyAke25vZGUuY2hhcmFjdGVyLmxpa2VzfSIKLSAgICAgICAgCi0gICAgICAgIC8vIGxldHMgZmluZCBHcm9taXQKLSAgICAgICAgZ3JvbWl0ID0gbm9kZS5jaGFyYWN0ZXIuZmluZCB7IGl0WydAaWQnXSA9PSAnMicgfQotICAgICAgICBhc3NlcnQgZ3JvbWl0ICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgZm91bmQgR3JvbWl0ISIKLSAgICAgICAgYXNzZXJ0IGdyb21pdFsnQG5hbWUnXSA9PSAiR3JvbWl0IgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGxldHMgZmluZCB3aGF0IFdhbGxhY2UgbGlrZXMgaW4gMSBxdWVyeQotICAgICAgICBhbnN3ZXIgPSBub2RlLmNoYXJhY3Rlci5maW5kIHsgaXRbJ0BpZCddID09ICcxJyB9Lmxpa2VzWzBdLnRleHQoKQotICAgICAgICBhc3NlcnQgYW5zd2VyID09ICJjaGVlc2UiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL0RPTVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL0RPTVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNiODNhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9ET01UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnhtbAotCi0vKioKLSAqIFRoaXMgdGVzdCB1c2VzIHRoZSBjb25jaXNlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiAKLSAqIFczQyBET00gdHJlZXMgdXNpbmcgR3Jvb3Z5TWFya3VwCi0gKi8KLWNsYXNzIERPTVRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgewotICAgICAgICBiID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIAotICAgICAgICByb290ID0gYi5yb290MShhOjUsIGI6NykgewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLSAgICAgICAgICAgIGVsZW0zKHg6NykKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgZHVtcChyb290KQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBiID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIAotICAgICAgICByb290ID0gYi5yb290MihhOjUsIGI6NykgewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLSAgICAgICAgICAgIG5lc3RlZEVsZW0oeDonYWJjJywgeTonZGVmJykgewotICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCi0gICAgICAgICAgICAgICAgY2hpbGQyKCkgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXN0ZWRFbGVtMih6Oid6enonKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKLSAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBkdW1wKHJvb3QpCi0KLS8qCi0JCWVsZW0xID0gcm9vdC5lbGVtMQotICAgICAgICBhc3NlcnQgZWxlbTEudmFsdWUoKSA6PSAnaGVsbG8xJwotICAgICAgICAKLSAgICAgICAgZWxlbTIgPSByb290LmVsZW0yCi0gICAgICAgIGFzc2VydCBlbGVtMi52YWx1ZSgpIDo9ICdoZWxsbzInCi0KLSAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTEudmFsdWUoKSA6PSAnaGVsbG8xJwotICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMi52YWx1ZSgpIDo9ICdoZWxsbzInCi0KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5hdHRyaWJ1dGVzKCkgOj0gWyd4JzonYWJjJywgJ3knOidkZWYnXSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQuYXR0cmlidXRlcygpIDo9IFsneic6J2RlZiddCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQyLnZhbHVlKCkgOj0gW10KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIudGV4dCgpIDo9ICcnCi0KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuYXR0cmlidXRlcygpIDo9IFsneic6J3p6eiddICAgICAgCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkLmF0dHJpYnV0ZXMoKSA6PSBbJ3onOidkZWYnXQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIudmFsdWUoKSA6PSAnaGVsbG8nCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi50ZXh0KCkgOj0gJ2hlbGxvJwotICAgICAgICAKLSAgICAgICAgbGlzdCA9IHJvb3QudmFsdWUoKQotICAgICAgICBhc3NlcnQgbGlzdC5zaXplKCkgOj0gNAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QuYXR0cmlidXRlcygpLmEgOj0gNQotICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYiA6PSA3Ci0KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5hdHRyaWJ1dGVzKCkueCA6PSAnYWJjJwotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmF0dHJpYnV0ZXMoKS55IDo9ICdkZWYnCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmF0dHJpYnV0ZXMoKS56IDo9ICd6enonCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkLmF0dHJpYnV0ZXMoKS56IDo9ICdkZWYnCi0qLyAgICAgICAgCi0gICAgICAgIC8qKiBAdG9kbyBwYXJzZXIgYWRkIC5AIGFzIGFuIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgIGFzc2VydCByb290LkBhIDo9IDUKLSAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdC5AYiA6PSA3Ci0gICAgICAgICovICAgICAgICAKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU1MDk5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9NYXJrdXBUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnhtbAotCi0vKioKLSAqIFRoaXMgdGVzdCB1c2VzIHRoZSBjb25jaXNlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiAKLSAqIHRleHR1YWwgbWFya3VwIChYTUwgb3IgSFRNTCkgdXNpbmcgR3Jvb3Z5TWFya3VwCi0gKi8KLWNsYXNzIE1hcmt1cFRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgewotICAgICAgICBiID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQotICAgICAgICAKLSAgICAgICAgYi5yb290MShhOjUsIGI6NykgewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLSAgICAgICAgICAgIGVsZW0zKHg6NykKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBiID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQotICAgICAgICAKLSAgICAgICAgYi5yb290MihhOjUsIGI6NykgewotICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0gICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLSAgICAgICAgICAgIG5lc3RlZEVsZW0oeDonYWJjJywgeTonZGVmJykgewotICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCi0gICAgICAgICAgICAgICAgY2hpbGQyKCkgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXN0ZWRFbGVtMih6Oid6enonKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKLSAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGVudEFuZERhdGFJbk1hcmt1cCgpIHsKLSAgICAgICAgYiA9IG5ldyBNYXJrdXBCdWlsZGVyKCkKLQotICAgICAgICBiLmEoaHJlZjoiaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmciLCAiZ3Jvb3Z5IikKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFdpdGhXcml0ZXJUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9NYXJrdXBXaXRoV3JpdGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWQwZTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFdpdGhXcml0ZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnhtbAotCi0vKioKLSAqIFRoaXMgdGVzdCB1c2VzIEdyb292eU1hcmt1cCB3aXRoIHdyaXRlcnMgb3RoZXIgdGhhbiBTeXN0ZW0ub3V0Ci0gKi8KLWNsYXNzIE1hcmt1cFdpdGhXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgewotCi0gICAgdm9pZCB0ZXN0U21hbGxUcmVlV2l0aFN0cmluZ1dyaXRlcigpIHsKLSAgICAgICAgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCkKLSAgICAgICAgYiA9IG5ldyBNYXJrdXBCdWlsZGVyKHdyaXRlcikKLQotICAgICAgICBiLnJvb3QxKGE6NSwgYjo3KSB7Ci0gICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKLSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotICAgICAgICAgICAgZWxlbTMoeDo3KQotICAgICAgICB9Ci0gICAgICAgIHByaW50bG4gd3JpdGVyLnRvU3RyaW5nKCkKLS8vICAgICAgICBhc3NlcnRFcXVhbHMgIjxyb290MSBhPSc1JyBiPSc3Jz5cbiIgKwotLy8gICAgICAgICAgICAgICAgIiAgPGVsZW0xPmhlbGxvMTwvZWxlbTE+XG4iICsKLS8vICAgICAgICAgICAgICAgICIgIDxlbGVtMj5oZWxsbzI8L2VsZW0yPlxuIiArCi0vLyAgICAgICAgICAgICAgICAiICA8ZWxlbTMgeD0nNycgLz5cbiIgKwotLy8gICAgICAgICAgICAgICAgIjwvcm9vdDE+Iiwgd3JpdGVyLnRvU3RyaW5nKCkKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RXcml0ZXJVc2VJblNjcmlwdEZpbGUoKSB7Ci0gICAgICAgIGFzc2VydFNjcmlwdEZpbGUgJ3NyYy90ZXN0L2dyb292eS94bWwvVXNlTWFya3VwV2l0aFdyaXRlclNjcmlwdC5ncm9vdnknCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9OYW1lc3BhY2VET01UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9OYW1lc3BhY2VET01UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYjBlNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvTmFtZXNwYWNlRE9NVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1wYWNrYWdlIGdyb292eS54bWwKLQotLyoqCi0gKiBUZXN0IHRoZSBidWlsZGluZyBvZiBuYW1lc3BhY2VkIFhNTCB1c2luZyBHcm9vdnlNYXJrdXAKLSAqLwotY2xhc3MgTmFtZXNwYWNlRE9NVGVzdCBleHRlbmRzIFRlc3RYbWxTdXBwb3J0IHsKLSAgICAKLSAgICB2b2lkIHRlc3RUcmVlKCkgewotICAgICAgICBidWlsZGVyID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIHhtbG5zID0gbmV3IE5hbWVzcGFjZUJ1aWxkZXIoYnVpbGRlcikKLSAgICAgICAgCi0gICAgICAgIHhzZCA9IHhtbG5zLm5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLCAneHNkJykKLSAgICAgICAgCi0gICAgICAgIHJvb3QgPSB4c2Quc2NoZW1hKHhtbG5zOlsnZm9vJzonaHR0cDovL3NvbWVPdGhlck5hbWVzcGFjZSddKSB7Ci0gICAgICAgICAgYW5ub3RhdGlvbiB7Ci0gICAgICAgICAgICAgIGRvY3VtZW50YXRpb24oIlB1cmNoYXNlIG9yZGVyIHNjaGVtYSBmb3IgRXhhbXBsZS5jb20uIikKLSAgICAgICAgICAgICAgLy9kb2N1bWVudGF0aW9uKHhtbG5zPVt4bWwubGFuZzonZW4nXSkgWyJQdXJjaGFzZSBvcmRlciBzY2hlbWEgZm9yIEV4YW1wbGUuY29tLiJdCi0gICAgICAgICAgfQotICAgICAgICAgIGVsZW1lbnQobmFtZToncHVyY2hhc2VPcmRlcicsIHR5cGU6J1B1cmNoYXNlT3JkZXJUeXBlJykKLSAgICAgICAgICBlbGVtZW50KG5hbWU6J2NvbW1lbnQnLCB0eXBlOid4c2Q6c3RyaW5nJykKLSAgICAgICAgICBjb21wbGV4VHlwZShuYW1lOidQdXJjaGFzZU9yZGVyVHlwZScpIHsKLSAgICAgICAgICAgIHNlcXVlbmNlIHsKLSAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidzaGlwVG8nLCB0eXBlOidVU0FkZHJlc3MnKQotICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J2JpbGxUbycsIHR5cGU6J1VTQWRkcmVzcycpCi0gICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOicwJywgcmVmOidjb21tZW50JykKLSAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidpdGVtcycsIHR5cGU6J0l0ZW1zJykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJpYnV0ZShuYW1lOidvcmRlckRhdGUnLCB0eXBlOid4c2Q6ZGF0ZScpCi0gICAgICAgICAgfQotICAgICAgICAgIGNvbXBsZXhUeXBlKG5hbWU6J1VTQWRkcmVzcycpIHsKLSAgICAgICAgICAgIHNlcXVlbmNlIHsKLSAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiduYW1lJywgdHlwZToneHNkOnN0cmluZycpCi0gICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonc3RyZWV0JywgdHlwZToneHNkOnN0cmluZycpCi0gICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonY2l0eScsIHR5cGU6J3hzZDpzdHJpbmcnKQotICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J3N0YXRlJywgdHlwZToneHNkOnN0cmluZycpCi0gICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonemlwJywgdHlwZToneHNkOmRlY2ltYWwnKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cmlidXRlKGZpeGVkOidVUycsIG5hbWU6J2NvdW50cnknLCB0eXBlOid4c2Q6Tk1UT0tFTicpCi0gICAgICAgICAgfQotICAgICAgICAgIGNvbXBsZXhUeXBlKG5hbWU6J0l0ZW1zJykgewotICAgICAgICAgICAgc2VxdWVuY2UgewotICAgICAgICAgICAgICBlbGVtZW50KG1heE9jY3VyczondW5ib3VuZGVkJywgbWluT2NjdXJzOicwJywgbmFtZTonaXRlbScpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZSB7Ci0gICAgICAgICAgICAgICAgICBzZXF1ZW5jZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobmFtZToncHJvZHVjdE5hbWUnLCB0eXBlOid4c2Q6c3RyaW5nJykKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidxdWFudGl0eScpIHsKLSAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uKGJhc2U6J3hzZDpwb3NpdGl2ZUludGVnZXInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2x1c2l2ZSh2YWx1ZTonMTAwJykKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidVU1ByaWNlJywgdHlwZToneHNkOmRlY2ltYWwnKQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG1pbk9jY3VyczonMCcsIHJlZjonY29tbWVudCcpCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOicwJywgbmFtZTonc2hpcERhdGUnLCB0eXBlOid4c2Q6ZGF0ZScpCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUobmFtZToncGFydE51bScsIHR5cGU6J1NLVScsIHVzZToncmVxdWlyZWQnKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiBTdG9jayBLZWVwaW5nIFVuaXQsIGEgY29kZSBmb3IgaWRlbnRpZnlpbmcgcHJvZHVjdHMgKi8KLSAgICAgICAgICBzaW1wbGVUeXBlKG5hbWU6J1NLVScpIHsKLSAgICAgICAgICAgIHJlc3RyaWN0aW9uKGJhc2U6J3hzZDpzdHJpbmcnKSB7Ci0gICAgICAgICAgICAgIHBhdHRlcm4odmFsdWU6J1xkezN9LVtBLVpdezJ9JykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBkdW1wKHJvb3QpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9TQVhUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9TQVhUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkZmE4Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvU0FYVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1wYWNrYWdlIGdyb292eS54bWwKLQotLyoqCi0gKiBUaGlzIHRlc3QgdXNlcyB0aGUgY29uY2lzZSBzeW50YXggdG8gdGVzdCB0aGUgZ2VuZXJhdGlvbgotICogb2YgU0FYIGV2ZW50cyB1c2luZyBHcm9vdnlNYXJrdXAKLSAqLwotY2xhc3MgU0FYVGVzdCBleHRlbmRzIFRlc3RYbWxTdXBwb3J0IHsKLSAgICAKLSAgICB2b2lkIHRlc3RTbWFsbFRyZWUoKSB7Ci0gICAgICAgIGIgPSBjcmVhdGVTQVhCdWlsZGVyKCkKLSAgICAgICAgCi0gICAgICAgIHJvb3QgPSBiLnJvb3QxKGE6NSwgYjo3KSB7Ci0gICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKLSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotICAgICAgICAgICAgZWxlbTMoeDo3KQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFRyZWUoKSB7Ci0gICAgICAgIGIgPSBjcmVhdGVTQVhCdWlsZGVyKCkKLSAgICAgICAgCi0gICAgICAgIHJvb3QgPSBiLnJvb3QyKGE6NSwgYjo3KSB7Ci0gICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKLSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotICAgICAgICAgICAgbmVzdGVkRWxlbSh4OidhYmMnLCB5OidkZWYnKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKLSAgICAgICAgICAgICAgICBjaGlsZDIoKSAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5lc3RlZEVsZW0yKHo6J3p6eicpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnKQotICAgICAgICAgICAgICAgIGNoaWxkMigiaGVsbG8iKSAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL1NtYWxsTmFtZXNwYWNlRE9NVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvU21hbGxOYW1lc3BhY2VET01UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViYzU1NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvU21hbGxOYW1lc3BhY2VET01UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnhtbAotCi1jbGFzcyBTbWFsbE5hbWVzcGFjZURPTVRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7Ci0gICAgCi0gICAgdm9pZCB0ZXN0VHJlZSgpIHsKLSAgICAgICAgYnVpbGRlciA9IERPTUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICB4c2QgPSBuZXcgTmFtZXNwYWNlKGJ1aWxkZXIsICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsICd4c2QnKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IHhzZC5zY2hlbWEoKSB7Ci0gICAgICAgICAgZWxlbWVudChuYW1lOidwdXJjaGFzZU9yZGVyJywgdHlwZTonUHVyY2hhc2VPcmRlclR5cGUnKQotICAgICAgICAgIGVsZW1lbnQobmFtZTonY29tbWVudCcsIHR5cGU6J3hzZDpzdHJpbmcnKQotICAgICAgICAgIGNvbXBsZXhUeXBlKG5hbWU6J1B1cmNoYXNlT3JkZXJUeXBlJykgewotICAgICAgICAgICAgc2VxdWVuY2UgewotICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J3NoaXBUbycsIHR5cGU6J1VTQWRkcmVzcycpCi0gICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonYmlsbFRvJywgdHlwZTonVVNBZGRyZXNzJykKLSAgICAgICAgICAgICAgZWxlbWVudChtaW5PY2N1cnM6JzAnLCByZWY6J2NvbW1lbnQnKQotICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J2l0ZW1zJywgdHlwZTonSXRlbXMnKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cmlidXRlKG5hbWU6J29yZGVyRGF0ZScsIHR5cGU6J3hzZDpkYXRlJykKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsCi0gICAgICAgIAotICAgICAgICBkdW1wKHJvb3QpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL1N0cmVhbWluZ01hcmt1cFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL1N0cmVhbWluZ01hcmt1cFRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjliMzQ5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9TdHJlYW1pbmdNYXJrdXBUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94Lm1hcmt1cAotCi0vKioKLSAqIFRoaXMgdGVzdCB1c2VzIHRoZSBjb25jaXNlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiAKLSAqIHRleHR1YWwgbWFya3VwIChYTUwgb3IgSFRNTCkgdXNpbmcgR3Jvb3Z5TWFya3VwCi0gKi8KLWNsYXNzIFN0cmVhbWluZ01hcmt1cFRlc3QgZXh0ZW5kcyBncm9vdnkueG1sLlRlc3RYbWxTdXBwb3J0IHsKLSAgICAKLSAgICB2b2lkIHRlc3RTbWFsbFRyZWUoKSB7Ci0gICAgICAgIGIgPSBuZXcgU3RyZWFtaW5nTWFya3VwQnVpbGRlcigpCi0gICAgICAgIAotICAgICAgICBtID0gewotCQkgICAgICAgIHJvb3QxKGE6NSwgYjo3KSB7Ci0JCSAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQotCQkgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKLQkJICAgICAgICAgICAgZWxlbTMoeDo3KQotCQkgICAgICAgIH0KLQkJICAgICB9Ci0JCSAgICAgCi0JCVN5c3RlbS5vdXQgPDwgYi5iaW5kIG0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VHJlZSgpIHsKLSAgICAgICAgYiA9IG5ldyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyKCkKLSAgICAgICAgCi0gICAgICAgIG0gPSB7Ci0JCSAgICAgICAgcm9vdDIoYTo1LCBiOjcpIHsKLQkJICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCi0JCSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotCQkgICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKLQkJICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCi0JCSAgICAgICAgICAgICAgICBjaGlsZDIoKSAgCi0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgCi0JCSAgICAgICAgICAgIG5lc3RlZEVsZW0yKHo6J3p6eicpIHsKLQkJICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCi0JCSAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikgIAotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQotIAkJICAgICAKLQkJU3lzdGVtLm91dCA8PCBiLmJpbmQgbQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvVGVzdFhtbFN1cHBvcnQuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9UZXN0WG1sU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI3NzFmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9UZXN0WG1sU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSRJZCQKLQotQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi10aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci1zdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLWNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi1tYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi1wZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi1wbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLW5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLWh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi1gYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLVNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0qLwotCi1wYWNrYWdlIGdyb292eS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuWE1MU2VyaWFsaXplcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RYbWxTdXBwb3J0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHVtcChOb2RlIG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFNlcmlhbGl6ZXIgcHJpbnRlciA9IGNyZWF0ZVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgcHJpbnRlci5zZXJpYWxpemUoKERvY3VtZW50KSBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZXIuc2VyaWFsaXplKChFbGVtZW50KSBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWE1MU2VyaWFsaXplciBjcmVhdGVTZXJpYWxpemVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoU3lzdGVtLm91dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNBWEJ1aWxkZXIgY3JlYXRlU0FYQnVpbGRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FYQnVpbGRlcihjcmVhdGVTZXJpYWxpemVyKCkuYXNDb250ZW50SGFuZGxlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvVXNlTWFya3VwV2l0aFdyaXRlclNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvVXNlTWFya3VwV2l0aFdyaXRlclNjcmlwdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDFhOTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL1VzZU1hcmt1cFdpdGhXcml0ZXJTY3JpcHQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vLyB1c2VkIGJ5IE1hcmt1cFdpdGhXcml0ZXJUZXN0LnRlc3RXcml0ZXJVc2VJblNjcmlwdEZpbGUKLQotd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCkKLWIgPSBuZXcgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyKHdyaXRlcikKLQotYi5yb290MShhOjUpCi1wcmludGxuIHdyaXRlci50b1N0cmluZygpCi1hc3NlcnQgIjxyb290MSBhPSc1JyAvPiIgPT0gd3JpdGVyLnRvU3RyaW5nKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvVmVyYm9zZURPTVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9ncm9vdnkveG1sL1ZlcmJvc2VET01UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MDg3NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvVmVyYm9zZURPTVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkueG1sCi0KLS8qKgotICogVGhpcyB0ZXN0IHVzZXMgdGhlIHZlcmJvc2Ugc3ludGF4IHRvIHRlc3QgdGhlIGJ1aWxkaW5nIG9mIAotICogVzNDIERPTSB0cmVlcyB1c2luZyBHcm9vdnlNYXJrdXAKLSAqLwotY2xhc3MgVmVyYm9zZURPTVRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7Ci0gICAgCi0gICAgcHJvcGVydHkgYgotCi0gICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgewotICAgICAgICBiID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCi0gICAgICAgIAotICAgICAgICByb290ID0gYi5yb290MShbJ2EnOjUsICdiJzo3XSwge3x8Ci0gICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKLSAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQotICAgICAgICAgICAgZWxlbTMoWyd4Jzo3XSkKLSAgICAgICAgfSkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290ICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIGR1bXAocm9vdCkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VHJlZSgpIHsKLSAgICAgICAgYiA9IERPTUJ1aWxkZXIubmV3SW5zdGFuY2UoKQotICAgICAgICAKLSAgICAgICAgcm9vdCA9IGIucm9vdDIoWydhJzo1LCAnYic6N10sIHsKLSAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQotICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCi0gICAgICAgICAgICBuZXN0ZWRFbGVtKFsneCc6J2FiYycsICd5JzonZGVmJ10sIHt8fAotICAgICAgICAgICAgICAgIGNoaWxkKFsneic6J2RlZiddKQotICAgICAgICAgICAgICAgIGNoaWxkMigpICAKLSAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5lc3RlZEVsZW0yKFsneic6J3p6eiddLCB7fHwKLSAgICAgICAgICAgICAgICBjaGlsZChbJ3onOidkZWYnXSkKLSAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikgIAotICAgICAgICAgICAgfSkKLSAgICAgICAgfSkKLSAgICAgICAgCi0gICAgICAgIGFzc2VydCByb290ICE9IG51bGwKLSAgICAgICAgCi0gICAgICAgIGR1bXAocm9vdCkKLQotLyoKLQkJZWxlbTEgPSByb290LmVsZW0xCi0gICAgICAgIGFzc2VydCBlbGVtMS52YWx1ZSgpIDo9ICdoZWxsbzEnCi0gICAgICAgIAotICAgICAgICBlbGVtMiA9IHJvb3QuZWxlbTIKLSAgICAgICAgYXNzZXJ0IGVsZW0yLnZhbHVlKCkgOj0gJ2hlbGxvMicKLQotICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMS52YWx1ZSgpIDo9ICdoZWxsbzEnCi0gICAgICAgIGFzc2VydCByb290LmVsZW0yLnZhbHVlKCkgOj0gJ2hlbGxvMicKLQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmF0dHJpYnV0ZXMoKSA6PSBbJ3gnOidhYmMnLCAneSc6J2RlZiddICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZC5hdHRyaWJ1dGVzKCkgOj0gWyd6JzonZGVmJ10KLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZDIudmFsdWUoKSA6PSBbXQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi50ZXh0KCkgOj0gJycKLQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5hdHRyaWJ1dGVzKCkgOj0gWyd6Jzonenp6J10gICAgICAKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuYXR0cmlidXRlcygpIDo9IFsneic6J2RlZiddCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi52YWx1ZSgpIDo9ICdoZWxsbycKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQyLnRleHQoKSA6PSAnaGVsbG8nCi0gICAgICAgIAotICAgICAgICBsaXN0ID0gcm9vdC52YWx1ZSgpCi0gICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA6PSA0Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYSA6PSA1Ci0gICAgICAgIGFzc2VydCByb290LmF0dHJpYnV0ZXMoKS5iIDo9IDcKLQotICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmF0dHJpYnV0ZXMoKS54IDo9ICdhYmMnCi0gICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uYXR0cmlidXRlcygpLnkgOj0gJ2RlZicKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuYXR0cmlidXRlcygpLnogOj0gJ3p6eicKLSAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuYXR0cmlidXRlcygpLnogOj0gJ2RlZicKLSovICAgICAgICAKLSAgICAgICAgLyoqIEB0b2RvIHBhcnNlciBhZGQgLkAgYXMgYW4gb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGEgOj0gNQotICAgICAgICAgICAgICAgIGFzc2VydCByb290LkBiIDo9IDcKLSAgICAgICAgKi8gICAgICAgIAotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9YbWxUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvWG1sVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhlNjAwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9YbWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBncm9vdnkueG1sOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS94bWwvU21hbGxOYW1lc3BhY2VET01UZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VHJlZSIsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9kb20vRE9NVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L2dyb292eS94bWwvZG9tL0RPTVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkMWRmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9kb20vRE9NVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1wYWNrYWdlIGdyb292eS54bWwuZG9tOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGdyb292eS54bWwuKjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNhbmRib3gubWFya3VwLio7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy54bWwuKjsKLQotY2xhc3MgRE9NVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICBiZW5jaG1hcmsgPSBmYWxzZTsKLQotICB2b2lkIHRlc3RET01QYXJzZXIoKSB7Ci0gICAgeG1sID0gbmV3IFN0cmluZ1JlYWRlcigiPGh0bWw+PGhlYWQ+PHRpdGxlIGNsYXNzPSdteXRpdGxlJz5UZXN0PC90aXRsZT48L2hlYWQ+PGJvZHk+PHAgY2xhc3M9J215c3R5bGUnPlRoaXMgaXMgYSB0ZXN0LjwvcD48L2JvZHk+PC9odG1sPiIpOwotICAgIGRvYyA9IERPTUJ1aWxkZXIucGFyc2UoeG1sKTsKLSAgICBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLSAgICAKLSAgICBpZiAoIWJlbmNobWFyaykgeyBhc3NlcnRDb3JyZWN0IGh0bWwgfQotICB9Ci0KLSAgdm9pZCB0ZXN0RE9NQnVpbGRlcigpIHsKLSAgICBodG1sID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpLgotICAgICAgICAKLSAgICBodG1sIHsKLSAgICAgIGhlYWQgewotCQl0aXRsZSAoY2xhc3M6Im15dGl0bGUiLCAiVGVzdCIpCi0gICAgICB9Ci0gICAgICBib2R5IHsKLQkJcCAoY2xhc3M6Im15c3R5bGUiLCAiVGhpcyBpcyBhIHRlc3QuIikKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWJlbmNobWFyaykgeyBhc3NlcnRDb3JyZWN0IGh0bWwgfQotICB9Ci0KLSAgdm9pZCB0ZXN0U3RyZWFtaW5nRE9NQnVpbGRlcigpIHsKLQotICAgIGRvYyA9IG5ldyBTdHJlYW1pbmdET01CdWlsZGVyKCkuYmluZCB7Ci0gICAgICBodG1sIHsKLSAgICAgICAgaGVhZCB7Ci0JCSAgdGl0bGUgKGNsYXNzOiJteXRpdGxlIiwgIlRlc3QiKQotICAgICAgICB9Ci0gICAgICAgIGJvZHkgewotCQkgIHAgKGNsYXNzOiJteXN0eWxlIiwgIlRoaXMgaXMgYSB0ZXN0LiIpCi0gICAgICAgIH0KLSAgICAgIH0KLQl9KCkKLQotICAgIGlmICghYmVuY2htYXJrKSB7IGFzc2VydENvcnJlY3QgZG9jLmRvY3VtZW50RWxlbWVudCB9Ci0gIH0KLSAgdm9pZCBhc3NlcnRDb3JyZWN0KGh0bWwpIHsKLSAgICB1c2UgKGdyb292eS54bWwuZG9tLkRPTUNhdGVnb3J5KSB7Ci0JICBhc3NlcnQgaHRtbC5oZWFkLnRpdGxlLnRleHRDb250ZW50ID09ICJUZXN0IjsKLSAgICAJICBhc3NlcnQgaHRtbC5ib2R5LnAudGV4dENvbnRlbnQgPT0gIlRoaXMgaXMgYSB0ZXN0LiI7Ci0gICAgICBhc3NlcnQgaHRtbC5maW5kIHsgaXQudGFnTmFtZSA9PSAiYm9keSIgfS50YWdOYW1lID09ICJib2R5IjsKLSAgICAgIGFzc2VydCBodG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikuZmluZEFsbCB7IGlmIChpdFsiQGNsYXNzIl0gIT0gIiIpIHsgcmV0dXJuIGl0IH0gfS5zaXplKCkgPT0gMjsKLSAgICB9Ci0gICAgc2hvdWxkRmFpbCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKSB7IGh0bWwuaGVhZCB9OwotICB9Ci0gIAotICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLSAgCS8vIFJlbGF0aXZlIHJlc3VsdHM6Ci0gIAkvLyBUZXN0ICAgICAgIDV0aCBNYXkgMjAwNAotICAJLy8gUGFyc2VyOiAgICAxLjAKLSAgCS8vIEJ1aWxkZXI6ICAgMS4wNQotICAJLy8gU3RyZWFtaW5nOiAwLjc3Ci0gIAl4ID0gYXJncy5zaXplKCkgPT0gMCA/IDEwMDAgOiBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pOwotICAJbXlkb210ZXN0ID0gbmV3IERPTVRlc3QoKTsKLSAgCXN0YW5kYXJkID0gMDsKLSAgCW15ZG9tdGVzdC5iZW5jaG1hcmsgPSB0cnVlOwotICAJW215ZG9tdGVzdC50ZXN0RE9NUGFyc2VyLCBteWRvbXRlc3QudGVzdERPTUJ1aWxkZXIsIG15ZG9tdGVzdC50ZXN0U3RyZWFtaW5nRE9NQnVpbGRlcl0uZWFjaCB7Ci0gIAkJLy8gUnVuIHRoZSBtZXRob2Qgb25jZSB0byBmaWxsIGFueSBjYWNoZXMgYW5kIHRvIGxvYWQgY2xhc3NlcwotICAJCWl0KCk7Ci0JICAJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgCQlmb3IgKGkgaW4gMS4ueCkgewotICAJCQlpdCgpOwotCSAgCX0KLSAgCQllbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgCQlyZXN1bHQgPSBpICogMTAwMCAvIGVsYXBzZWQ7Ci0KLQkJc3RhbmRhcmQgPSAoc3RhbmRhcmQgPT0gMCA/IHJlc3VsdCA6IHN0YW5kYXJkKTsgIAkJCi0JCWZhY3RvciA9IHJlc3VsdC9zdGFuZGFyZDsKLSAgCQkKLQkgIAlwcmludGxuICIke2l0Lm1ldGhvZH06ICR7ZmFjdG9yfXggKCR7cmVzdWx0fSB0cmVlcy9zKSI7Ci0JfQotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NsYXNzTm9kZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NOb2RlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y4NDM5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NOb2RlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OwotCi1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ29uc3RhbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSBDbGFzc05vZGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIENsYXNzTm9kZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gbmV3IENsYXNzTm9kZSgiRm9vIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5PYmplY3QiKTsKLSAgICBDbGFzc05vZGUgaW5uZXJDbGFzc05vZGUgPSBuZXcgSW5uZXJDbGFzc05vZGUoY2xhc3NOb2RlLCAiRm9vJDEiLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKCJmaWVsZCIsIEFDQ19QVUJMSUMsICJqYXZhLmxhbmcuU3RyaW5nIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE91dGVyQ2xhc3MoKSB7Ci0gICAgICAgIGFzc2VydE51bGwoY2xhc3NOb2RlLmdldE91dGVyQ2xhc3MoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaW5uZXJDbGFzc05vZGUuZ2V0T3V0ZXJDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0ZXJGaWVsZCgpIHsKLSAgICAgICAgYXNzZXJ0TnVsbChjbGFzc05vZGUuZ2V0T3V0ZXJGaWVsZCgiZmllbGQiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaW5uZXJDbGFzc05vZGUuZ2V0T3V0ZXJGaWVsZCgiZmllbGQiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIiwgbnVsbCwgY2xhc3NOb2RlLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgQ2xhc3NOb2RlIHBhY2thZ2VOb2RlID0gbmV3IENsYXNzTm9kZSgiY29tLmFjbWUuRm9vIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYWNrYWdlIiwgImNvbS5hY21lIiwgcGFja2FnZU5vZGUuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Nb2R1bGVOb2RlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Nb2R1bGVOb2RlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGJlYjQwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTW9kdWxlTm9kZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyLlRlc3RQYXJzZXJTdXBwb3J0OwotCi0vKioKLSAqIFRlc3RzIHRoZSBDbGFzc05vZGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZU5vZGVUZXN0IGV4dGVuZHMgVGVzdFBhcnNlclN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoInggPSBbMSwgMiwgM107IHByaW50bG4oeCkiLCAiQ2hlZXNlLmdyb292eSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgc3RhdGVtZW50cyIsICEgbW9kdWxlLmdldFN0YXRlbWVudEJsb2NrKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgY2xhc3NlcyA9IG1vZHVsZS5nZXRDbGFzc2VzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGNsYXNzZXMiLCAxLCBjbGFzc2VzLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gKENsYXNzTm9kZSkgY2xhc3Nlcy5nZXQoMCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzIG5hbWUiLCAiQ2hlZXNlIiwgY2xhc3NOb2RlLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JzZi9CU0ZUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0JTRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMGY4OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0JTRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ic2Y7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKLQotLyoqCi0gKiBUZXN0cyB0aGUgQlNGIGludGVncmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBCU0ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIEJTRk1hbmFnZXIgbWFuYWdlcjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGxldHMgbWFudWFsbHkgcmVnaXN0ZXIgR3Jvb3Z5IHVudGlsIGl0cyBwYXJ0IG9mIHRoZSBCU0YgZGlzdHJvCi0gICAgICAgIEJTRk1hbmFnZXIucmVnaXN0ZXJTY3JpcHRpbmdFbmdpbmUoImdyb292eSIsIEdyb292eUVuZ2luZS5jbGFzcy5nZXROYW1lKCksIG5ldyBTdHJpbmdbXSB7ICJncm9vdnkiLCAiZ3kiIH0pOwotCi0gICAgICAgIG1hbmFnZXIgPSBuZXcgQlNGTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1hbmFnZXIuZXhlYygKLSAgICAgICAgICAgICJncm9vdnkiLAotICAgICAgICAgICAgIlRlc3QxLmdyb292eSIsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICJwcmludGxuKCd0ZXN0aW5nIEV4ZWMnKTsgYXNzZXJ0IGJzZiAhPSBudWxsIDogJ3Nob3VsZCBoYXZlIGEgYnNmIHZhcmlhYmxlJyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCcmFja2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtYW5hZ2VyLmV4ZWMoCi0gICAgICAgICAgICAiZ3Jvb3Z5IiwKLSAgICAgICAgICAgICJUZXN0MTxncm9vdnk+IiwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgInByaW50bG4oJ3Rlc3RpbmcgRXhlYycpOyBhc3NlcnQgYnNmICE9IG51bGwgOiAnc2hvdWxkIGhhdmUgYSBic2YgdmFyaWFibGUnIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJwcmludGxuKCd0ZXN0aW5nIEV2YWwnKVxuICByZXR1cm4gWzEsIDIsIDNdIik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIHJldHVybiBhIGxpc3Q6ICIgKyBhbnN3ZXIsIGFuc3dlciBpbnN0YW5jZW9mIExpc3QpOwotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgYW5zd2VyOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Qgc2hvdWxkIGJlIG9mIHJpZ2h0IHNpemUiLCAzLCBsaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgZXZhbCByZXR1cm5lZCB0aGUgdmFsdWU6ICIgKyBsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRXZhbHNXaXRoU2FtZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJwcmludGxuKCdmaXJzdCBsaW5lJylcbiAgcmV0dXJuICdjaGVlc2UnIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2hlZXNlIiwgYW5zd2VyKTsKLQotICAgICAgICBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAicHJpbnRsbignc2Vjb25kIGxpbmUnKVxuICByZXR1cm4gJ2dyb21pdCciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJncm9taXQiLCBhbnN3ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgbWFuYWdlci5leGVjKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgInByaW50bG4oJ3Rlc3RpbmcgRXhlYycpIik7Ci0KLSAgICAgICAgICAgIG1hbmFnZXIuZXhlYygiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJwcmludGxuKCd0ZXN0aW5nIEV4ZWMnKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJzZlZhcmlhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgYW5zd2VyID0KLSAgICAgICAgICAgIG1hbmFnZXIuZXZhbCgKLSAgICAgICAgICAgICAgICAiZ3Jvb3Z5IiwKLSAgICAgICAgICAgICAgICAiVGVzdDEuZ3Jvb3Z5IiwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgInByaW50bG4oJ3Rlc3RpbmcgdmFyaWFibGVzJylcbiAgYXNzZXJ0IHRoaXMuYnNmICE9IG51bGxcbiAgcmV0dXJuIHRoaXMuYnNmIik7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIGFuIGFuc3dlciIsIGFuc3dlciAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1hbmFnZXIucmVnaXN0ZXJCZWFuKCJ4IiwgbmV3IEludGVnZXIoNCkpOwotCi0gICAgICAgIE9iamVjdCBhbnN3ZXIgPQotICAgICAgICAgICAgbWFuYWdlci5ldmFsKAotICAgICAgICAgICAgICAgICJncm9vdnkiLAotICAgICAgICAgICAgICAgICJUZXN0MS5ncm9vdnkiLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAidmFsdWVPZlggPSB0aGlzLmJzZi5sb29rdXBCZWFuKCd4Jyk7IGFzc2VydCB2YWx1ZU9mWCA9PSA0OyB2YWx1ZU9mWCArIDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmV0dXJuIiwgbmV3IEludGVnZXIoNSksIGFuc3dlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjU2NyaXB0KCJzcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcEZyb21MaXN0Lmdyb292eSIpOwotICAgICAgICBleGVjU2NyaXB0KCJzcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0F0b21UZXN0U2NyaXB0Lmdyb292eSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWNTY3JpcHQoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGVjdXRpbmcgc2NyaXB0OiAiICsgZmlsZU5hbWUpOwotICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsIGZpbGVOYW1lLCAwLCAwLCBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5nZXRUZXh0KG5ldyBGaWxlKGZpbGVOYW1lKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvQ2FjaGVCU0ZUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0NhY2hlQlNGVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRiZTZiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvQ2FjaGVCU0ZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqICRJZCQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KLSAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5Ci0gKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KLSAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCi0gKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKLSAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCi0gKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJzZjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgQ2FjaGluZyBCU0YgaW50ZWdyYXRpb24KLSAqIAotICogQGF1dGhvciBKYW1lcyBCaXJjaGZpZWxkCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUJTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgQlNGTWFuYWdlciBtYW5hZ2VyOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbGV0cyBtYW51YWxseSByZWdpc3RlciBHcm9vdnkgdW50aWwgaXRzIHBhcnQgb2YgdGhlIEJTRiBkaXN0cm8KLSAgICAgICAgQlNGTWFuYWdlci5yZWdpc3RlclNjcmlwdGluZ0VuZ2luZSgKLSAgICAgICAgICAgICJncm9vdnkiLAotICAgICAgICAgICAgQ2FjaGluZ0dyb292eUVuZ2luZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiZ3Jvb3Z5IiwgImd5IiB9KTsKLQotICAgICAgICBtYW5hZ2VyID0gbmV3IEJTRk1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAicHJpbnRsbigndGVzdGluZyBFeGVjJykiKTsKLSAgICAgICAgLy9ub3RoaW5nIHRvIHJlYWxseSB0ZXN0IGhlcmUuLi5qdXN0IGxvb2tpbmcgZm9yIGRlYnVnIHRoYXQgc2F5cyBpdAotICAgICAgICAvLyB1c2VkIGNhY2hlIHZlcnNpb24KLSAgICAgICAgbWFuYWdlci5leGVjKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgInByaW50bG4oJ3Rlc3RpbmcgRXhlYycpIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJwcmludGxuKCd0ZXN0aW5nIEV2YWwnKVxuICByZXR1cm4gWzEsIDIsIDNdIik7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gcmVhbGx5IHRlc3QgaGVyZS4uLmp1c3QgbG9va2luZyBmb3IgZGVidWcgdGhhdCBzYXlzIGl0Ci0gICAgICAgIC8vIHVzZWQgY2FjaGUgdmVyc2lvbgotICAgICAgICBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0Lmdyb292eSIsIDAsIDAsICJwcmludGxuKCd0ZXN0aW5nIEV2YWwnKVxuICByZXR1cm4gWzEsIDIsIDNdIik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIHJldHVybiBhIGxpc3Q6ICIgKyBhbnN3ZXIsIGFuc3dlciBpbnN0YW5jZW9mIExpc3QpOwotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgYW5zd2VyOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Qgc2hvdWxkIGJlIG9mIHJpZ2h0IHNpemUiLCAzLCBsaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgZXZhbCByZXR1cm5lZCB0aGUgdmFsdWU6ICIgKyBsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnNmVmFyaWFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPQotICAgICAgICAgICAgbWFuYWdlci5ldmFsKAotICAgICAgICAgICAgICAgICJncm9vdnkiLAotICAgICAgICAgICAgICAgICJUZXN0MS5ncm9vdnkiLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAicHJpbnRsbigndGVzdGluZyB2YXJpYWJsZXMnKVxuICBhc3NlcnQgdGhpcy5ic2YgIT0gbnVsbFxuICByZXR1cm4gdGhpcy5ic2YiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYW4gYW5zd2VyIiwgYW5zd2VyICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWFuYWdlci5yZWdpc3RlckJlYW4oIngiLCBuZXcgSW50ZWdlcig0KSk7Ci0KLSAgICAgICAgT2JqZWN0IGFuc3dlciA9Ci0gICAgICAgICAgICBtYW5hZ2VyLmV2YWwoCi0gICAgICAgICAgICAgICAgImdyb292eSIsCi0gICAgICAgICAgICAgICAgIlRlc3QxLmdyb292eSIsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICJ2YWx1ZU9mWCA9IHRoaXMuYnNmLmxvb2t1cEJlYW4oJ3gnKTsgYXNzZXJ0IHZhbHVlT2ZYID09IDQ7IHZhbHVlT2ZYICsgMSIpOwotICAgICAgICAvLyBub3RoaW5nIHRvIHJlYWxseSB0ZXN0IGhlcmUuLi5qdXN0IGxvb2tpbmcgZm9yIGRlYnVnIHRoYXQgc2F5cyBpdAotICAgICAgICAvLyB1c2VkIGNhY2hlIHZlcnNpb24KLSAgICAgICAgYW5zd2VyID0KLSAgICAgICAgICAgIG1hbmFnZXIuZXZhbCgKLSAgICAgICAgICAgICAgICAiZ3Jvb3Z5IiwKLSAgICAgICAgICAgICAgICAiVGVzdDIuZ3Jvb3Z5IiwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgInZhbHVlT2ZYID0gdGhpcy5ic2YubG9va3VwQmVhbigneCcpOyBhc3NlcnQgdmFsdWVPZlggPT0gNDsgdmFsdWVPZlggKyAxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJldHVybiIsIG5ldyBJbnRlZ2VyKDUpLCBhbnN3ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFZhcmlhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtYW5hZ2VyLmRlY2xhcmVCZWFuKCJmb28iLCBuZXcgSW50ZWdlcig1KSwgSW50ZWdlci5jbGFzcyk7Ci0KLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJ2YWx1ZU9mRm9vID0gZm9vOyByZXR1cm4gdmFsdWVPZkZvbyIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgYW5zd2VyKTsKLQotICAgICAgICBtYW5hZ2VyLmRlY2xhcmVCZWFuKCJmb28iLCBuZXcgSW50ZWdlcig2KSwgSW50ZWdlci5jbGFzcyk7Ci0KLSAgICAgICAgYW5zd2VyID0gbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiVGVzdDIuZ3Jvb3Z5IiwgMCwgMCwgInZhbHVlT2ZGb28gPSBmb287IHJldHVybiB2YWx1ZU9mRm9vIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2KSwgYW5zd2VyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVIZWxwZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzY3NTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0J5dGVjb2RlSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEJ5dGVjb2RlSGVscGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTmFtZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbQyIsIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbigiY2hhcltdIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2REZXNjcmlwdG9yKCkgewotICAgICAgICBTdHJpbmcgYW5zd2VyID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihjaGFyW10uY2xhc3MsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKClbQyIsIGFuc3dlcik7Ci0KLSAgICAgICAgYW5zd2VyID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihpbnQuY2xhc3MsIG5ldyBDbGFzc1tdIHsgbG9uZy5jbGFzcyB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIoSilJIiwgYW5zd2VyKTsKLQotICAgICAgICBhbnN3ZXIgPSBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKFN0cmluZ1tdLmNsYXNzLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgaW50LmNsYXNzIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIihMamF2YS9sYW5nL1N0cmluZztJKVtMamF2YS9sYW5nL1N0cmluZzsiLCBhbnN3ZXIpOwotICAgICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DYWxsQ2xvc3VyZUZpZWxkQXNNZXRob2RUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DYWxsQ2xvc3VyZUZpZWxkQXNNZXRob2RUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5YTA3ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2FsbENsb3N1cmVGaWVsZEFzTWV0aG9kVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4KLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlCi0KLS8qKgotICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQotICovCi1jbGFzcyBDYWxsQ2xvc3VyZUZpZWxkQXNNZXRob2RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgU3RyaW5nIGZpcnN0bmFtZSA9ICJHdWlsbGF1bWUiCi0gICAgY2xvc3VyZU1ldGhvZCA9IHsgfGdyZWV0aW5nfCAiJHtncmVldGluZ30gJHtmaXJzdG5hbWV9IiB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHdlIGNhbiBjYWxsIGEgY2xvc3VyZSBkZWZpbmVkIGFzIGEgZmllbGQgYXMgaWYgaXQgd2VyZSBhIG5vcm1hbCBtZXRob2QKLSAgICAgKi8KLSAgICB2b2lkIHRlc3RDYWxsVG9DbG9zdXJlQXNNZXRob2QoKSB7Ci0KLSAgICAgICAgb2JqID0gbmV3IENhbGxDbG9zdXJlRmllbGRBc01ldGhvZFRlc3QoKQotCi0gICAgICAgIGFzc2VydCBvYmouY2xvc3VyZU1ldGhvZCgiSGVsbG8iKSA9PSAiSGVsbG8gR3VpbGxhdW1lIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DYXBpdGFsaXplVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhcGl0YWxpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWVkNDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhcGl0YWxpemVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQ2FwaXRhbGl6ZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb28iLCBWZXJpZmllci5jYXBpdGFsaXplKCJmb28iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRm9vIiwgVmVyaWZpZXIuY2FwaXRhbGl6ZSgiRm9vIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZPbyIsIFZlcmlmaWVyLmNhcGl0YWxpemUoImZPbyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGT08iLCBWZXJpZmllci5jYXBpdGFsaXplKCJmT08iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRiIsIFZlcmlmaWVyLmNhcGl0YWxpemUoImYiKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29uc3RydWN0b3JJc3N1ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NvbnN0cnVjdG9ySXNzdWVUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyN2JmOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29uc3RydWN0b3JJc3N1ZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuCi0KLWltcG9ydCBncm9vdnkuYnVncy5UZXN0U3VwcG9ydAotCi1jbGFzcyBDb25zdHJ1Y3Rvcklzc3VlVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLSAgICAKLSAgICBDb25zdHJ1Y3Rvcklzc3VlVGVzdCgpIHsKLSAgICAgICAgLy9wcmludGxuKCJDcmVhdGVkIHRlc3QgY2FzZSEiKQotICAgIH0KLQotICAgIENvbnN0cnVjdG9ySXNzdWVUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgLy9wcmludGxuKCJDcmVhdGVkIHRlc3QgY2FzZSEiKQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgewotICAgICAgICAvL3ByaW50bG4oImluIG1haW4oKSAtIGNhbGxlZCB3aXRoICR7YXJyYXl9IikKLSAgICAgICAgCi0gICAgICAgIGZvbyA9IG5ldyBDb25zdHJ1Y3Rvcklzc3VlVGVzdCgpCi0gICAgICAgIGZvby5kb25lKCkKLQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9uZSIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGRvbmUoKSB7Ci0gICAgICAgIHByaW50bG4oIlllYWgsIEkndmUgYmVlbiBtYWRlIikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Q29uc3RydWN0b3JJc3N1ZSgpIHsKLSAgICAgICAgYXJyYXkgPSBnZXRNb2NrQXJndW1lbnRzKCkKLQotICAgICAgICBtYWluKGFycmF5KQotCi0gICAgICAgIG5ldyBDb25zdHJ1Y3Rvcklzc3VlVGVzdChhcnJheSkuZG9uZSgpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NvbnN0cnVjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ5YzA4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Db25zdHJ1Y3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi0vKioKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L05ld0V4cHJlc3Npb25UZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0TmV3SW5zdGFuY2UiLCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRGVyaXZlZEJlYW4uamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EZXJpdmVkQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAzNTY0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EZXJpdmVkQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotCi0vKioKLSAqIEEgc2ltcGxlIGJlYW4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIERlcml2ZWRCZWFuIGV4dGVuZHMgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkR1bW15QmVhbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBiYXI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKLSAgICAgICAgcmV0dXJuIGJhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXIoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuYmFyID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bW15UmVmbGVjdG9yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlSZWZsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhNDMzMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlSZWZsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCi0gKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KLSAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKLSAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKLSAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLSAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlJlZmxlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2NyYXRjaCBjbGFzcyB1c2VkIHRvIGV4cGVyaW1lbnQgd2l0aCBBU00gdG8gc2VlIHdoYXQga2luZCBvZgotICogc3R1ZmYgaXMgb3V0cHV0IGZvciBub3JtYWwgSmF2YSBjb2RlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVJlZmxlY3RvciBleHRlbmRzIFJlZmxlY3RvciB7Ci0KLSAgICBwdWJsaWMgRHVtbXlSZWZsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShNZXRhTWV0aG9kIG1ldGhvZCwgT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIHN3aXRjaCAobWV0aG9kLmdldE1ldGhvZEluZGV4KCkpIHsKLSAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIudG9PYmplY3Qob2JqZWN0Lmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLnRvT2JqZWN0KG9iamVjdC5lcXVhbHMoYXJndW1lbnRzWzBdKSk7Ci0gICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UoKENvbXBhcmFibGUpIGFyZ3VtZW50c1swXSwgKENvbXBhcmFibGUpIGFyZ3VtZW50c1sxXSk7Ci0gICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgb2JqZWN0KS50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgY2FzZSA3IDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcigiaGVsbG8iLmNoYXJBdCgyKSk7Ci0gICAgICAgICAgICBjYXNlIDggOgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoTWV0YU1ldGhvZCBtZXRob2QsIE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgewotICAgICAgICBzd2l0Y2ggKG1ldGhvZC5nZXRNZXRob2RJbmRleCgpKSB7Ci0gICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgb2JqZWN0KS50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4oKChMaXN0KSBvYmplY3QpLmNvbnRhaW5zKGFyZ3VtZW50c1swXSkpOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlQ29uc3RydWN0b3IoT2JqZWN0IGNvbnN0cnVjdG9yLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKLSAgICB9Ci0KLSAgICBjaGFyW10gYmxhaCgpIHsKLSAgICAgICAgcmV0dXJuICJmb28iLnRvQ2hhckFycmF5KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlUZXN0RGVyaXZhdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bW15VGVzdERlcml2YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMzZjMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlUZXN0RGVyaXZhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIEEgZHVtbXkgdGVzdCBjYXNlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVRlc3REZXJpdmF0aW9uIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIHB1YmxpYyBEdW1teVRlc3REZXJpdmF0aW9uKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1wQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1wQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YmMxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2NyYXRjaCBjbGFzcyB1c2VkIHRvIGV4cGVyaW1lbnQgd2l0aCBBU00gdG8gc2VlIHdoYXQga2luZCBvZiAKLSAqIHN0dWZmIGlzIG91dHB1dCBmb3Igbm9ybWFsIEphdmEgY29kZQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRHVtcENsYXNzIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGJhcjsKLSAgICBwcml2YXRlIFN0cmluZyByZXN1bHQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgeDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgewotICAgICAgICByZXR1cm4gYmFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhcihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5iYXIgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpdGVyYXRlT3Zlckxpc3QoKSB7Ci0gICAgICAgIC8vIGVxdWl2YWxlbnQgb2YKLSAgICAgICAgLy8gICAgICAgIGZvciBpIGluIFsiYSIsICJiIiwgImMiXSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkpOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICBMaXN0IGxpc3QgPSBJbnZva2VySGVscGVyLmNyZWF0ZUxpc3QobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiB9KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKGxpc3QpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBpID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChTeXN0ZW0ub3V0LCAicHJpbnRsbiIsIGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaXRlcmF0ZU92ZXJNYXAoKSB7Ci0gICAgICAgIE1hcCBtYXAgPSBJbnZva2VySGVscGVyLmNyZWF0ZU1hcChuZXcgT2JqZWN0W10geyAiYSIsICJ4IiwgImIiLCAieSIsICJjIiwgInoiIH0pOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IobWFwKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgaSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoU3lzdGVtLm91dCwgInByaW50bG4iLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50VmFsdWVzKE9iamVjdCBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihjb2xsZWN0aW9uKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgZm9vID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChTeXN0ZW0ub3V0LCAicHJpbnRsbiIsIGZvbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGVtcHR5TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbXB0eVZvaWRNZXRob2QoKSB7Ci0gICAgfQotCi0gICAgLy8gICAgcHVibGljIHZvaWQgdGVzdEFzc2VydGlvbigpIHsKLSAgICAvLyAgICAgICAgYXNzZXJ0IGJhciA9PSBudWxsOwotICAgIC8vICAgICAgICBhc3NlcnQgcmVzdWx0ID09IG51bGwgOiAibWVzc2FnZSI7Ci0gICAgLy8gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb292eUFzc2VydGlvbjIoKSB7Ci0gICAgICAgIGlmIChJbnZva2VySGVscGVyLmNvbXBhcmVFcXVhbChiYXIsICJmb28iKSkgewotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5hc3NlcnRGYWlsZWQoImV4cHJlc3Npb24iLCAibWVzc2FnZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYmFyID0gImFiYyI7Ci0KLSAgICAgICAgaWYgKEludm9rZXJIZWxwZXIuY29tcGFyZU5vdEVxdWFsKGJhciwgImZvbyIpKSB7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmFzc2VydEZhaWxlZCgiZXhwcmVzc2lvbiIsICJub3QgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEludm9rZXJIZWxwZXIuY29tcGFyZUVxdWFsKGJhciwgImFiYyIpKSB7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmFzc2VydEZhaWxlZCgiZXhwcmVzc2lvbiIsICJub3QgbnVsbCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpZWxkU2V0KCkgewotICAgICAgICBpZiAoSW52b2tlckhlbHBlci5jb21wYXJlTm90RXF1YWwoeCwgImZvbyIpKSB7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmFzc2VydEZhaWxlZCgiZXhwcmVzc2lvbiIsICJtZXNzYWdlIik7Ci0gICAgICAgIH0KLQotICAgICAgICB4ID0gImZvbyI7Ci0KLSAgICAgICAgaWYgKEludm9rZXJIZWxwZXIuY29tcGFyZUVxdWFsKHgsICJmb28iKSkgewotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5hc3NlcnRGYWlsZWQoImV4cHJlc3Npb24iLCAibWVzc2FnZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChJbnZva2VySGVscGVyLmNvbXBhcmVOb3RFcXVhbCh4LCAiZm9vIikpIHsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEludm9rZXJIZWxwZXIuYXNzZXJ0RmFpbGVkKCJleHByZXNzaW9uIiwgIm1lc3NhZ2UiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRGYWlsZWQoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGNlcHRpb246ICIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJ4ID0gIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoeCk7Ci0gICAgICAgIEludm9rZXJIZWxwZXIuYXNzZXJ0RmFpbGVkKGJ1ZmZlciwgIm1lc3NhZ2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFZhcigpIHsKLSAgICAgICAgT2JqZWN0IHggPSBudWxsOwotICAgICAgICBPYmplY3QgaSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihJbnZva2VySGVscGVyLmNyZWF0ZVJhbmdlKG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxMCksIHRydWUpKTsKLSAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBpID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4ID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlBc3NlcnRpb24oKSB7Ci0gICAgICAgIHggPSAiYWJjIjsKLSAgICAgICAgaWYgKEludm9rZXJIZWxwZXIuY29tcGFyZUVxdWFsKHgsICJmb28iKSkgewotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5hc3NlcnRGYWlsZWQoImV4cHJlc3Npb24iLCAibWVzc2FnZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9QbHVzKCkgewotICAgICAgICBPYmplY3QgeiA9ICJhYmNkIjsKLSAgICAgICAgeCA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHosICJsZW5ndGgiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuKCkgewotICAgICAgICB4ID0gQm9vbGVhbi5UUlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyeUNhdGNoKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QodGhpcywgInRlc3RHcm9vdnlBc3NlcnRpb24iLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QodGhpcywgIm9uRXhjZXB0aW9uIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCh0aGlzLCAiZmluYWxseUJsb2NrIiwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QodGhpcywgImFmdGVyVHJ5Q2F0Y2giLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1ByaW50bG4oKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoU3lzdGVtLmNsYXNzLCAib3V0Iik7Ci0gICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHZhbHVlLCAicHJpbnRsbiIsICJIZWxsbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvQ2xvc3VyZSgpIHsKLSAgICAgICAgeCA9IG5ldyBDbG9zdXJlKHRoaXMpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3QgYXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaWZEZW1vKCkgewotICAgICAgICBpZiAoSW52b2tlckhlbHBlci5jb21wYXJlRXF1YWwoYmFyLCAiYWJjIikpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXaGlsZSgpIHsKLSAgICAgICAgd2hpbGUgKEludm9rZXJIZWxwZXIuY29tcGFyZUVxdWFsKGJhciwgImFiYyIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9XaGlsZSgpIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChJbnZva2VySGVscGVyLmNvbXBhcmVFcXVhbChiYXIsICJhYmMiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bXBDbGFzczIuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1wQ2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjMxMTUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bXBDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHNjcmF0Y2ggY2xhc3MgdXNlZCB0byBleHBlcmltZW50IHdpdGggQVNNIHRvIHNlZSB3aGF0IGtpbmQgb2YgCi0gKiBzdHVmZiBpcyBvdXRwdXQgZm9yIG5vcm1hbCBKYXZhIGNvZGUKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIER1bXBDbGFzczIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFyID0gKFN0cmluZykgSW52b2tlckhlbHBlci5pbnZva2VTdGF0aWNNZXRob2QoIkludm9rZXJIZWxwZXIiLCAiZ2V0TWV0YUNsYXNzIiwgbnVsbCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZm9vID0geyAiaGVsbG8iLCAid29ybGQiIH07Ci0gICAgCi0gICAgcHVibGljIER1bXBDbGFzczIoT2JqZWN0IGZvbykgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Rm9vKCkgewotICAgICAgICByZXR1cm4gZm9vOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IG1ha2VDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gbmV3IENsb3N1cmUodGhpcykgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZG9DYWxsKCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICBwdWJsaWMgTWV0YUNsYXNzIGdldE1ldGFDbGFzcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TWV0YUNsYXNzKE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7Ci0gICAgICAgIHJldHVybiBiYXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FsbENvbnN0cnVjdG9yKCkgewotICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VDb25zdHJ1Y3RvcigiamF2YS5sYW5nLlN0cmluZyIsICJoZWxsbyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1wQ2xhc3MzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcENsYXNzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzkxMDhjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1wQ2xhc3MzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgc2NyYXRjaCBjbGFzcyB1c2VkIHRvIGV4cGVyaW1lbnQgd2l0aCBBU00gdG8gc2VlIHdoYXQga2luZCBvZiAKLSAqIHN0dWZmIGlzIG91dHB1dCBmb3Igbm9ybWFsIEphdmEgY29kZQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRHVtcENsYXNzMyBleHRlbmRzIER1bXBDbGFzczIgewotCi0gICAgU3RyaW5nIGJsYWg7Ci0gICAgT2JqZWN0IGFub3RoZXI7Ci0gICAgCi0gICAgcHVibGljIER1bXBDbGFzczMoT2JqZWN0IGZvbykgewotICAgICAgICBzdXBlcihmb28pOwotICAgICAgICB0aGlzLmJsYWggPSAoU3RyaW5nKSBmb287Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgT2JqZWN0IHggPSBuZXcgSW50ZWdlcigxMik7Ci0gICAgICAgIAotICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIER1bXBDbGFzczIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8iKTsKLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmQoKSB7Ci0gICAgICAgIGlmIChJbnZva2VySGVscGVyLmFzQm9vbChibGFoKSAmJiBJbnZva2VySGVscGVyLmFzQm9vbChhbm90aGVyKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyEiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFsc2UiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IHRlc3RXaGlsZShPYmplY3QgeCwgT2JqZWN0IG0pIHsKLSAgICAgICAgd2hpbGUgKCBJbnZva2VySGVscGVyLmNvbXBhcmVMZXNzVGhhbih4LCBtKSkgewotICAgICAgICAgICAgeCA9IGluY3JlbWVudCh4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBpbmNyZW1lbnQoT2JqZWN0IHgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCB0ZXN0U3VwZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGb28oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcENsYXNzNC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bXBDbGFzczQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3MDcxMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcENsYXNzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCi0gKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KLSAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKLSAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKLSAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLSAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNjcmF0Y2ggY2xhc3MgdXNlZCB0byBleHBlcmltZW50IHdpdGggQVNNIHRvIHNlZSB3aGF0IGtpbmQgb2YKLSAqIHN0dWZmIGlzIG91dHB1dCBmb3Igbm9ybWFsIEphdmEgY29kZQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRHVtcENsYXNzNCB7Ci0KLSAgICBwdWJsaWMgRHVtcENsYXNzNCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIE9iamVjdCBmb28gPSBJbnZva2VySGVscGVyLmludm9rZUNvbnN0cnVjdG9yT2YoRHVtcENsYXNzNC5jbGFzcywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHRoaXMsICJmb28iLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCh0aGlzLCAiYmFyIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB7Ci0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBJbnZva2VySGVscGVyLmludm9rZUNvbnN0cnVjdG9yKCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIsICJIZWxsbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN3aXRjaFRlc3QoaW50IGkpIHsKLSAgICAgICAgU3RyaW5nIHggPSAiZm9vIjsKLQotICAgICAgICBzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgeCA9ICIxIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgeCA9ICIyIjsKLSAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICAgeCA9ICIzIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIHggPSAiZGVmYXVsdCI7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUmVmZXJlbmNlVGVzdCgpIHsKLSAgICAgICAgUmVmZXJlbmNlIGZvbyA9IG5ldyBSZWZlcmVuY2UoKTsKLSAgICAgICAgZm9vLnNldChuZXcgSW50ZWdlcigxMikpOwotICAgICAgICByZXR1cm4gZm9vLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWtlSW5zdGFuY2UoKSB7Ci0gICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlQ29uc3RydWN0b3JPZihEdW1wQ2xhc3M0LmNsYXNzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtYWtlTmVzdGVkQXJyYXkoKSB7Ci0gICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKAotICAgICAgICAgICAgIm91dGVyIiwKLSAgICAgICAgICAgICJmb28iLAotICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoImlubmVyIiwgInBsdXMiLCBuZXcgT2JqZWN0W10geyAiMSIgfSkKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFrZU5lc3RlZEVtcHR5QXJyYXkoKSB7Ci0gICAgICAgIEludm9rZXJIZWxwZXIKLSAgICAgICAgICAgIC5pbnZva2VNZXRob2QoIm91dGVyIiwgImZvbyIsIG5ldyBPYmplY3RbXSB7IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKCJpbm5lciIsICJwbHVzIiwgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgIH0pCi0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1ha2VBbm90aGVyQXJyYXkoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBhLCBiIH07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJ5RmluYWxseSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmFsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyeUNhdGNoRmluYWxseSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmFsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtcHR5VHJ5Q2F0Y2goKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdXNlUHJpbWl0aXZlVHlwZSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGludC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN1cGVyQ2FsbCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUmVmZXJlbmNlKE9iamVjdCBmb28pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2UoZm9vKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcGluZ0NsYXNzTG9hZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtcGluZ0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDlhOGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bXBpbmdDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29tcGlsZVVuaXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKLWltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udXRpbC5DaGVja0NsYXNzQWRhcHRlcjsKLWltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS51dGlsLkFTTWlmaWVyQ2xhc3NWaXNpdG9yOwotCi0vKioKLSAqIEEgY2xhc3MgbG9hZGVyIHVzZWQgZm9yIGRlYnVnZ2luZyB0aGUgYnl0ZWNvZGUgZ2VuZXJhdGlvbi4gCi0gKiBUaGlzIHdpbGwgbG9nIGFsbCBieXRlY29kZSBiZWluZyBsb2FkZWQKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIER1bXBpbmdDbGFzc0xvYWRlciBleHRlbmRzIEdyb292eUNsYXNzTG9hZGVyIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBDSEVDS19DTEFTUyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBEVU1QX0NMQVNTID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBEdW1waW5nQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudExvYWRlcik7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCBjbGFzcyBEZWJ1Z0NvbGxlY3RvciBleHRlbmRzIENsYXNzQ29sbGVjdG9yIHsKLQotICAgICAgICBEZWJ1Z0NvbGxlY3RvcihHcm9vdnlDbGFzc0xvYWRlciBjbCwgQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNsLCB1bml0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2FsbChDbGFzc1Zpc2l0b3IgY2xhc3NXcml0ZXIsIENsYXNzTm9kZSBjbGFzc05vZGUpIHsKLSAgICAgICAgICAgIC8vIGxldHMgdGVzdCBvdXQgdGhlIGNsYXNzIHZlcmlmaWVyCi0gICAgICAgICAgICBpZiAoRFVNUF9DTEFTUykgewotICAgICAgICAgICAgICAgIGR1bXBlci52aXNpdENsYXNzKGNsYXNzTm9kZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChDSEVDS19DTEFTUykgewotICAgICAgICAgICAgICAgIGNoZWNrZXIudmlzaXRDbGFzcyhjbGFzc05vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdXBlci5jYWxsKGNsYXNzV3JpdGVyLCBjbGFzc05vZGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBDbGFzc0NvbGxlY3RvciBjcmVhdGVDb2xsZWN0b3IoQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWJ1Z0NvbGxlY3Rvcih0aGlzLCB1bml0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQVNNaWZpZXJDbGFzc1Zpc2l0b3IgZHVtcFZpc2l0b3IgPSBuZXcgQVNNaWZpZXJDbGFzc1Zpc2l0b3IobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpKTsKLSAgICBwcm90ZWN0ZWQgQVNNaWZpZXJDbGFzc1Zpc2l0b3IgaW52aXNpYmxlRHVtcFZpc2l0b3IgPSBuZXcgQVNNaWZpZXJDbGFzc1Zpc2l0b3IobmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSkpOwotICAgIHByb3RlY3RlZCBDb21waWxlVW5pdCB1bml0ID0gbmV3IENvbXBpbGVVbml0KHRoaXMsIG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKSk7Ci0gICAgcHJvdGVjdGVkIENsYXNzR2VuZXJhdG9yIGNoZWNrZXIgPQotICAgICAgICBuZXcgQXNtQ2xhc3NHZW5lcmF0b3IobmV3IEdlbmVyYXRvckNvbnRleHQodW5pdCksIG5ldyBDaGVja0NsYXNzQWRhcHRlcihpbnZpc2libGVEdW1wVmlzaXRvciksIHRoaXMsIG51bGwpOwotICAgIHByb3RlY3RlZCBDbGFzc0dlbmVyYXRvciBkdW1wZXIgPSBuZXcgQXNtQ2xhc3NHZW5lcmF0b3IobmV3IEdlbmVyYXRvckNvbnRleHQodW5pdCksIGR1bXBWaXNpdG9yLCB0aGlzLCBudWxsKTsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0ZvclRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Gb3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGMwZmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0ZvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC4qOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVmFyaWFibGVFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRm9yVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBjbGFzc05vZGUuYWRkQ29uc3RydWN0b3IobmV3IENvbnN0cnVjdG9yTm9kZShBQ0NfUFVCTElDLCBudWxsKSk7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlOb2RlKCJiYXIiLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLlN0cmluZyIsICJGb28iLCBudWxsLCBudWxsLCBudWxsKSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IHtuZXcgUGFyYW1ldGVyKCJjb2xsIil9OwotCi0gICAgICAgIFN0YXRlbWVudCBsb29wU3RhdGVtZW50ID0gY3JlYXRlUHJpbnRsblN0YXRlbWVudChuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJpIikpOwotCi0gICAgICAgIEZvclN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgRm9yU3RhdGVtZW50KCJpIiwgVHlwZS5EWU5BTUlDX1RZUEUsIG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oImNvbGwiKSwgbG9vcFN0YXRlbWVudCk7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoIml0ZXJhdGVEZW1vIiwgQUNDX1BVQkxJQywgInZvaWQiLCBwYXJhbWV0ZXJzLCBzdGF0ZW1lbnQpKTsKLQotICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKLQotICAgICAgICBPYmplY3QgYmVhbiA9IGZvb0NsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gY3JlYXRlIGJlYW4iLCBiZWFuICE9IG51bGwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIG1ldGhvZCIpOwotCi0gICAgICAgIE9iamVjdFtdIGFycmF5ID0ge25ldyBJbnRlZ2VyKDEyMzQpLCAiYWJjIiwgImRlZiJ9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChiZWFuLCAiaXRlcmF0ZURlbW8iLCBuZXcgT2JqZWN0W117YXJyYXl9KTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlLmdldENhdXNlKCkpOwotICAgICAgICAgICAgZS5nZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgRG9uZSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HU3RyaW5nVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0dTdHJpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDU4OTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0dTdHJpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJpbmFyeUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Cb29sZWFuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkdTdHJpbmdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5WYXJpYWJsZUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Bc3NlcnRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotCi0vKioKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEdTdHJpbmdUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotCi0gICAgICAgIC8vU3RhdGVtZW50IHByaW50U3RhdGVtZW50ID0gY3JlYXRlUHJpbnRsblN0YXRlbWVudChuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdHIiKSk7Ci0KLSAgICAgICAgLy8gc2ltdWxhdGUgIkhlbGxvICR7dXNlcn0hIgotICAgICAgICBHU3RyaW5nRXhwcmVzc2lvbiBjb21wb3NpdGVTdHJpbmdFeHByID0gbmV3IEdTdHJpbmdFeHByZXNzaW9uKCAiaGVsbG8gJHt1c2VyfSEiICk7Ci0gICAgICAgIGNvbXBvc2l0ZVN0cmluZ0V4cHIuYWRkU3RyaW5nKG5ldyBDb25zdGFudEV4cHJlc3Npb24oIkhlbGxvICIpKTsKLSAgICAgICAgY29tcG9zaXRlU3RyaW5nRXhwci5hZGRWYWx1ZShuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJ1c2VyIikpOwotICAgICAgICBjb21wb3NpdGVTdHJpbmdFeHByLmFkZFN0cmluZyhuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCIhIikpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBibG9jayA9IG5ldyBCbG9ja1N0YXRlbWVudCgpOwotICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCi0gICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKLSAgICAgICAgICAgICAgICBuZXcgQmluYXJ5RXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigidXNlciIpLAotICAgICAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woIj0iLCAtMSwgLTEpLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJXb3JsZCIpKSkpOwotICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCi0gICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKLSAgICAgICAgICAgICAgICBuZXcgQmluYXJ5RXhwcmVzc2lvbihuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdHIiKSwgVG9rZW4ubmV3U3ltYm9sKCAiPSIsIC0xLCAtMSksIGNvbXBvc2l0ZVN0cmluZ0V4cHIpKSk7Ci0gICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudCgKLSAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLCAicHJpbnRsbiIsIG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInN0ciIpKSkpOwotCi0gICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudCgKLSAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBCaW5hcnlFeHByZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJ0ZXh0IiksCi0gICAgICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIj0iLCAtMSwgLTEpLAotICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbigic3RyIiksICJ0b1N0cmluZyIsIENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKSkpKTsKLQotICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCi0gICAgICAgICAgICBuZXcgQXNzZXJ0U3RhdGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJ0ZXh0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICI9PSIsIC0xLCAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJIZWxsbyBXb3JsZCEiKSkpKSk7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoInN0cmluZ0RlbW8iLCBBQ0NfUFVCTElDLCAidm9pZCIsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgYmxvY2spKTsKLQotICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKLQotICAgICAgICBPYmplY3QgYmVhbiA9IGZvb0NsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gY3JlYXRlIGJlYW4iLCBiZWFuICE9IG51bGwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIG1ldGhvZCIpOwotCi0gICAgICAgIC8vT2JqZWN0W10gYXJyYXkgPSB7IG5ldyBJbnRlZ2VyKDEyMzQpLCAiYWJjIiwgImRlZiIgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoYmVhbiwgInN0cmluZ0RlbW8iLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlLmdldENhdXNlKCkpOwotICAgICAgICAgICAgZS5nZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgRG9uZSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HZXRQcm9wZXJ0eVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HZXRQcm9wZXJ0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhYTQ4Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2V0UHJvcGVydHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiBUZXN0cyB1c2luZyB0aGUgR3Jvb3Z5T2JqZWN0IEFQSSBmcm9tIEphdmEgb24gYSBncm9vdnkgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTXlCZWFuLmdyb292eSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBvYmplY3Q6ICIgKyBvYmplY3QpOwotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG9iamVjdC5nZXRQcm9wZXJ0eSgibmFtZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUgcHJvcGVydHkiLCAiSmFtZXMiLCB2YWx1ZSk7Ci0KLSAgICAgICAgb2JqZWN0LnNldFByb3BlcnR5KCJuYW1lIiwgIkJvYiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUgcHJvcGVydHkiLCAiQm9iIiwgb2JqZWN0LmdldFByb3BlcnR5KCJuYW1lIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Hcm9vdnlDbGFzc0xvYWRlclRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Hcm9vdnlDbGFzc0xvYWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwOTY2NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi0vKioKLSAqIFRlc3RzIGR5bmFtaWNhbGx5IGNvbXBpbGluZyBhIG5ldyBjbGFzcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhuZXcgRmlsZSgic3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eSIpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludm9raW5nIG1haW4uLi4iKTsKLSAgICAgICAgCi0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSAoR3Jvb3Z5T2JqZWN0KSBncm9vdnlDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3QgIT0gbnVsbCk7Ci0KLSAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IG9iamVjdC5nZXRNZXRhQ2xhc3MoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXRhY2xhc3M6ICIgKyBtZXRhQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgQ2xhc3MgdHlwZSA9IG9iamVjdC5nZXRDbGFzcygpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGludm9rZSB2aWEgbWV0YWNsYXNzCi0gICAgICAgIG1ldGFDbGFzcy5pbnZva2VNZXRob2Qob2JqZWN0LCAibWFpbiIsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgLy8gaW52b2tlIGRpcmVjdGx5Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoIm1haW4iLCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vSWZFbHNlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0lmRWxzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOWI2NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vSWZFbHNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29uc3RydWN0b3JOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkZpZWxkTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Qcm9wZXJ0eU5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5CaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQm9vbGVhbkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdGFudEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5GaWVsZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5FeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuSWZTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSWZFbHNlVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBjbGFzc05vZGUuYWRkQ29uc3RydWN0b3IobmV3IENvbnN0cnVjdG9yTm9kZShBQ0NfUFVCTElDLCBudWxsKSk7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlOb2RlKCJiYXIiLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLlN0cmluZyIsICJGb28iLCBudWxsLCBudWxsLCBudWxsKSk7Ci0KLSAgICAgICAgY2xhc3NOb2RlLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eU5vZGUoInJlc3VsdCIsIEFDQ19QVUJMSUMsICJqYXZhLmxhbmcuU3RyaW5nIiwgIkZvbyIsIG51bGwsIG51bGwsIG51bGwpKTsKLQotICAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBleHByZXNzaW9uID0KLSAgICAgICAgICAgIG5ldyBCb29sZWFuRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICBuZXcgQmluYXJ5RXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZE5vZGUoImJhciIsIEFDQ19QUklWQVRFLCAiamF2YS5sYW5nLlN0cmluZyIsICJGb28iLCBDb25zdGFudEV4cHJlc3Npb24uTlVMTCkpLAotICAgICAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woIj09IiwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24oImFiYyIpKSk7Ci0KLSAgICAgICAgU3RhdGVtZW50IHRydWVTdGF0ZW1lbnQgPQotICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCi0gICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEV4cHJlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGROb2RlKCJyZXN1bHQiLCBBQ0NfUFJJVkFURSwgImphdmEubGFuZy5TdHJpbmciLCAiRm9vIiwgQ29uc3RhbnRFeHByZXNzaW9uLk5VTEwpKSwKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKCI9IiwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24oIndvcmtlZCIpKSk7Ci0KLSAgICAgICAgU3RhdGVtZW50IGZhbHNlU3RhdGVtZW50ID0gY3JlYXRlUHJpbnRsblN0YXRlbWVudChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJmYWxzZSIpKTsKLQotICAgICAgICBJZlN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgSWZTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgdHJ1ZVN0YXRlbWVudCwgZmFsc2VTdGF0ZW1lbnQpOwotICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJpZkRlbW8iLCBBQ0NfUFVCTElDLCAidm9pZCIsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgc3RhdGVtZW50KSk7Ci0KLSAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7Ci0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBmb29DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIGNyZWF0ZSBiZWFuIiwgYmVhbiAhPSBudWxsKTsKLQotICAgICAgICBhc3NlcnRTZXRQcm9wZXJ0eShiZWFuLCAiYmFyIiwgImFiYyIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIG1ldGhvZCIpOwotCi0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gewotICAgICAgICB9OwotCi0gICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGJlYW4sICJpZkRlbW8iLCBhcnJheSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsKLQotICAgICAgICBhc3NlcnRHZXRQcm9wZXJ0eShiZWFuLCAicmVzdWx0IiwgIndvcmtlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5OTA4Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWFpbi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbgotCi1jbGFzcyBNYWluIHsKLSAgICAKLSAgICBtYWluKCkgewotICAgICAgICBwcmludGxuKCJIZWxsbyBXb3JsZCEiKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01haW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzU1ZjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01haW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTWFpblRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFpbk1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOwotICAgICAgICBzaGVsbC5ydW4obmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9TYW1wbGVNYWluLmdyb292eSIpLCBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRhQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRhQ2xhc3NUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMmFmNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWV0YUNsYXNzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4KLQotY2xhc3MgTWV0YUNsYXNzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICAKLSAgICB2b2lkIHRlc3RNZXRhQ2xhc3MoKSB7Ci0gICAgICAgIHRlc3QodGhpcykKLSAgICAgICAgdGVzdCB7IHByaW50KGl0KSB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB0ZXN0KG9iamVjdCkgewotICAgICAgICBtZXRhQ2xhc3MgPSBvYmplY3QubWV0YUNsYXNzCi0gICAgICAgIGFzc2VydCBtZXRhQ2xhc3MgIT0gbnVsbAotICAgICAgICAKLSAgICAgICAgcHJpbnRsbihtZXRhQ2xhc3MpCi0gICAgICAgIAotICAgICAgICBjbGFzc05vZGUgPSBtZXRhQ2xhc3MuZ2V0Q2xhc3NOb2RlKCkKLSAgICAgICAgYXNzZXJ0IGNsYXNzTm9kZSAhPSBudWxsCi0KLSAgICAgICAgcHJpbnRsbihjbGFzc05vZGUpCi0gICAgICAgIAotICAgICAgICBuYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgIGFzc2VydCBjbGFzc05vZGUubmFtZSA9PSBuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGhvZFRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzI3ODQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNvbnN0cnVjdG9yTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotCi0vKioKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gbmV3IENsYXNzTm9kZSgiRm9vIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgY2xhc3NOb2RlLmFkZENvbnN0cnVjdG9yKG5ldyBDb25zdHJ1Y3Rvck5vZGUoQUNDX1BVQkxJQywgbnVsbCkpOwotCi0gICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnRBID0gbmV3IFJldHVyblN0YXRlbWVudChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJjYWxsZWRBIikpOwotICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50QiA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQobmV3IENvbnN0YW50RXhwcmVzc2lvbigiY2FsbGVkQiIpKTsKLSAgICAgICAgU3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7Ci0KLSAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgiYSIsIEFDQ19QVUJMSUMsICJqYXZhLmxhbmcuT2JqZWN0IiwgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBzdGF0ZW1lbnRBKSk7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoImIiLCBBQ0NfUFVCTElDLCBudWxsLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIHN0YXRlbWVudEIpKTsKLSAgICAgICAgCi0gICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoIm5vUmV0dXJuTWV0aG9kQSIsIEFDQ19QVUJMSUMsIG51bGwsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgZW1wdHlTdGF0ZW1lbnQpKTsKLSAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgibm9SZXR1cm5NZXRob2RCIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5PYmplY3QiLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIGVtcHR5U3RhdGVtZW50KSk7Ci0gICAgICAgIAotICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJjIiwgQUNDX1BVQkxJQywgInZvaWQiLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIGVtcHR5U3RhdGVtZW50KSk7Ci0KLSAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7Ci0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBmb29DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGVkIGluc3RhbmNlIG9mIGNsYXNzOiAiICsgYmVhbiwgYmVhbiAhPSBudWxsKTsKLSAKLSAgICAgICAgYXNzZXJ0Q2FsbE1ldGhvZChiZWFuLCAiYSIsICJjYWxsZWRBIik7Ci0gICAgICAgIGFzc2VydENhbGxNZXRob2QoYmVhbiwgImIiLCAiY2FsbGVkQiIpOwotICAgICAgICBhc3NlcnRDYWxsTWV0aG9kKGJlYW4sICJub1JldHVybk1ldGhvZEEiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Q2FsbE1ldGhvZChiZWFuLCAibm9SZXR1cm5NZXRob2RCIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydENhbGxNZXRob2QoYmVhbiwgImMiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDYWxsTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2QsIE9iamVjdCBleHBlY3RlZCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZCwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0IG9mIGNhbGxpbmcgbWV0aG9kOiAiICsgbWV0aG9kICsgIiBvbjogIiArIG9iamVjdCArICIgd2l0aCBlbXB0eSBsaXN0IiwgZXhwZWN0ZWQsIHZhbHVlKTsKLQotICAgICAgICB2YWx1ZSA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgY2FsbGluZyBtZXRob2Q6ICIgKyBtZXRob2QgKyAiIG9uOiAiICsgb2JqZWN0ICsgIiB3aXRoIG51bGwiLCBleHBlY3RlZCwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NeUJlYW4uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL015QmVhbi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNWM4YmQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL015QmVhbi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbgotCi1jbGFzcyBNeUJlYW4gewotCi0JbmFtZSA9ICJKYW1lcyIKLQlmb28gPSAxMjMKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Qcm9wZXJ0eVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Qcm9wZXJ0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxYWVmNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUHJvcGVydHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlByb3BlcnR5Tm9kZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBjbGFzc05vZGUuYWRkRmllbGQoIngiLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIsIG51bGwpOwotICAgICAgICBjbGFzc05vZGUuYWRkRmllbGQoInkiLCBBQ0NfUFVCTElDLCAiamF2YS5sYW5nLkludGVnZXIiLCBudWxsKTsKLSAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKCJ6IiwgQUNDX1BSSVZBVEUsICJqYXZhLmxhbmcuU3RyaW5nIiwgbnVsbCk7Ci0KLSAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RmllbGQoZm9vQ2xhc3MsICJ4IiwgTW9kaWZpZXIuUFVCTElDLCAiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBhc3NlcnRGaWVsZChmb29DbGFzcywgInkiLCBNb2RpZmllci5QVUJMSUMsICJqYXZhLmxhbmcuSW50ZWdlciIpOwotICAgICAgICBhc3NlcnRGaWVsZChmb29DbGFzcywgInoiLCBNb2RpZmllci5QUklWQVRFLCAiamF2YS5sYW5nLlN0cmluZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDICsgQUNDX1NVUEVSLCAiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5Tm9kZSgiYmFyIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5TdHJpbmciLCAiRm9vIiwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCi0gICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOwotCi0gICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byBjcmVhdGUgYmVhbiIsIGJlYW4gIT0gbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RmllbGQoZm9vQ2xhc3MsICJiYXIiLCAwLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCi0gICAgICAgIGFzc2VydEdldFByb3BlcnR5KGJlYW4sICJiYXIiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0U2V0UHJvcGVydHkoYmVhbiwgImJhciIsICJuZXdWYWx1ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDICsgQUNDX1NVUEVSLCAib3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkR1bW15QmVhbiIpOwotICAgICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5Tm9kZSgiYmFyIiwgQUNDX1BVQkxJQywgImphdmEubGFuZy5TdHJpbmciLCAiRm9vIiwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCi0gICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOwotCi0gICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byBjcmVhdGUgYmVhbiIsIGJlYW4gIT0gbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RmllbGQoZm9vQ2xhc3MsICJiYXIiLCAwLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCi0gICAgICAgIGFzc2VydEdldFByb3BlcnR5KGJlYW4sICJuYW1lIiwgIkphbWVzIik7Ci0gICAgICAgIGFzc2VydFNldFByb3BlcnR5KGJlYW4sICJuYW1lIiwgIkJvYiIpOwotCi0gICAgICAgIGFzc2VydEdldFByb3BlcnR5KGJlYW4sICJiYXIiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0U2V0UHJvcGVydHkoYmVhbiwgImJhciIsICJuZXdWYWx1ZSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JHZW5lcmF0b3JUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUmVmbGVjdG9yR2VuZXJhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWRlMTk4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JHZW5lcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NXcml0ZXI7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udXRpbC5DaGVja0NsYXNzQWRhcHRlcjsKLWltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS51dGlsLkFTTWlmaWVyQ2xhc3NWaXNpdG9yOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnk7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZDsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZsZWN0b3JHZW5lcmF0b3JUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG1ldGhvZHMuYWRkKG5ldyBNZXRhTWV0aG9kKCJ0b0NoYXJBcnJheSIsIFN0cmluZy5jbGFzcywgbmV3IENsYXNzWzBdLCBjaGFyW10uY2xhc3MsIDApKTsKLSAgICAgICAgLy9tZXRob2RzLmFkZChuZXcgTWV0YU1ldGhvZCgidG9TdHJpbmciLCBTdHJpbmcuY2xhc3MsIG5ldyBDbGFzc1swXSwgU3RyaW5nLmNsYXNzLCAwKSk7Ci0gICAgICAgIHRlc3RNZXRob2RzKG1ldGhvZHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0R2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgbWV0aG9kcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKG5ldyBPYmplY3QoKSkuZ2V0TWV0aG9kcygpOwotICAgICAgICB0ZXN0TWV0aG9kcyhtZXRob2RzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdER1bW15UmVmbGVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIER1bW15UmVmbGVjdG9yIGR1bW15ID0gbmV3IER1bW15UmVmbGVjdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZHVtbXkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RNZXRob2RzKExpc3QgbWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlZmxlY3RvckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgUmVmbGVjdG9yR2VuZXJhdG9yKG1ldGhvZHMpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi4iICsgZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcih0cnVlKTsKLQotICAgICAgICAKLSAgICAgICAgQVNNaWZpZXJDbGFzc1Zpc2l0b3IgZHVtcGVyID0gbmV3IEFTTWlmaWVyQ2xhc3NWaXNpdG9yKG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKSk7Ci0gICAgICAgIC8vZ2VuZXJhdG9yLmdlbmVyYXRlKGR1bXBlciwgbmFtZSk7Ci0KLSAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlKG5ldyBDaGVja0NsYXNzQWRhcHRlcihjdyksIG5hbWUpOwotCi0gICAgICAgIGJ5dGVbXSBieXRlY29kZSA9IGN3LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgLy8gbGV0cyB3cml0ZSBpdCB0byBkaXNrCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJ0YXJnZXQvIiArIG5hbWUgKyAiLmNsYXNzIjsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZShieXRlY29kZSk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotCi0gICAgICAgIC8vIG5vdyBsZXRzIHRyeSBkdW1wIGl0Ci0gICAgICAgIEFTTWlmaWVyQ2xhc3NWaXNpdG9yLm1haW4obmV3IFN0cmluZ1tdIHsgZmlsZU5hbWUgfSk7Ci0KLSAgICAgICAgLy8gbm93IGxldHMgdHJ5IGNsYXNzIGxvYWQgaXQKLSAgICAgICAgTWV0YUNsYXNzUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgTWV0YUNsYXNzUmVnaXN0cnkoKTsKLSAgICAgICAgQ2xhc3MgdHlwZSA9IHJlZ2lzdHJ5LmxvYWRDbGFzcyhuYW1lLCBieXRlY29kZSk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgcmVmbGVjdG9yID0gdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGVkIG5ldyByZWZsZWN0b3I6ICIgKyByZWZsZWN0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5CdWdzVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkJ1Z3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOWZkMjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkJ1Z3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqICRJZCQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKLSAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLSAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgotICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0gKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQotICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQotICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIGJ1Z3MgaW4gY29kZSBnZW5lcmF0aW9uIGVycm9ycy4gQnkgdHVybmluZyBvbiB0aGUKLSAqIGxvZ2dpbmcgaW4gVGVzdFN1cHBvcnQgd2UgY2FuIGR1bXAgdGhlIEFTTSBjb2RlIGdlbmVyYXRpb24gY29kZSBmb3IgaW5uZXIKLSAqIGNsYXNzZXMgZXRjLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUnVuQnVnc1Rlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICAvKgotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNZXRob2RDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RDYWxsQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9UcnlDYXRjaEJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb2RzQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RDYWxsaW5nQ2xvc3VyZVdpdGhNdWx0aXBsZUFyZ3VtZW50cyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHdWlsbGF1bWVzTWFwQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9HdWlsbGF1bWVzTWFwQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVzZUNsb3N1cmVJblNjcmlwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9Vc2VDbG9zdXJlSW5TY3JpcHQuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VTdGF0aWNJbkNsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1VzZVN0YXRpY0luQ2xvc3VyZUJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZzIiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUZpZWxkVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZVR5cGVGaWVsZFRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RQcmltaXRpdmVGaWVsZCIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kRGlzcGF0Y2hCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL01ldGhvZERpc3BhdGNoQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlSW5DbG9zdXJlVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0SW52aXNpYmxlVmFyaWFibGUiLCBudWxsKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY01hcmt1cEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWFya3VwQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVybG9hZEludm9rZU1ldGhvZEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvT3ZlcmxvYWRJbnZva2VNZXRob2RCdWcuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVWYXJpYWJsZUJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVZhcmlhYmxlQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJrdXBBbmRNZXRob2RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL01hcmt1cEFuZE1ldGhvZEJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZVBhcmFtZXRlclBhc3NpbmdCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVQYXJhbWV0ZXJQYXNzaW5nQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRDbG9zdXJlQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlMkJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEZpZWxkQnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBlck1ldGhvZDJCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1N1cGVyTWV0aG9kMkJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1RvU3RyaW5nQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlSW5kZXhCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVJbmRleEJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5MjUyX0J1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjUyX0J1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAqLwotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5MzAzX0J1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgIH0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5DbG9zdXJlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkNsb3N1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjYwMGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkNsb3N1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkNsb3N1cmVUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9DbG9zdXJlVXNpbmdPdXRlclZhcmlhYmxlc1Rlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RFeGFtcGxlVXNlT2ZDbG9zdXJlU2NvcGVzVXNpbmdFYWNoIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY0Nsb3N1cmVCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY0Nsb3N1cmVQcm9wZXJ0eUJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdENhbGxTdGF0aWNDbG9zdXJlIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFpvaGFyc0J1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvWm9oYXJzQnVnLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ5dGVjb2RlQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZUJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFRlZHNCeXRlY29kZUJ1ZyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlY29kZTJCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlMkJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFRlZHNCeXRlY29kZUJ1ZyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlY29kZTNCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlM0J1Zy5ncm9vdnkiKTsKLSAgICAgICAgLy9vYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0SW5qZWN0IiwgbnVsbCk7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RJbmNyZW1lbnRQcm9wZXJ0eUluY2xvc3VyZSIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlY29kZTRCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNEJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEluamVjdCIsIG51bGwpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VXNpbmdQcm9wZXJ0eSIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlY29kZTVCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNUJ1Zy5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFVzaW5nTG9jYWxWYXIiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZWNvZGU2QnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTZCdWcuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RQcmVGaXhSZXR1cm4iLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvUHJvcGVydHlUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0Tm9ybWFsUHJvcGVydHlHZXR0ZXJzQW5kU2V0dGVycyIsIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkdyb292eVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5Hcm9vdnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYmFjMzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkdyb292eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi0vKioKLSAqIFRlc3RzIGR5bmFtaWNhbGx5IGNvbXBpbGluZyBhbmQgcnVubmluZyBhIG5ldyBjbGFzcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUnVuR3Jvb3Z5VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheUJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1RvQXJyYXlCdWcuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUb0FycmF5QnVnIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGZpeCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1Bvc3RmaXhUZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0SW50ZWdlclBvc3RmaXgiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvTWFwVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdE1hcCIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZFRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RMaXN0TWFwIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVXaXRoRGVmYXVsdFBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0Lmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0TGlzdE1hcCIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbFJldHVybigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L09wdGlvbmFsUmV0dXJuVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFNpbmdsZUV4cHJlc3Npb24iLCBudWxsKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdExhc3RFeHByZXNzaW9uSXNTaW1wbGUiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGUuZ3Jvb3Z5Iik7Ci0gICAgfQotICAgICovCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vU2ltcGxlQmVhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1NpbXBsZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVkNzdkOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vU2ltcGxlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotCi0vKioKLSAqIEEgc2ltcGxlIGJlYW4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUJlYW4gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFyOwotICAgIHByaXZhdGUgT2JqZWN0IHg7Ci0KLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTlRfQ09OU1QgPSBuZXcgSW50ZWdlcigxMjMpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7Ci0gICAgICAgIHJldHVybiBiYXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFyKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmJhciA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoKSB7Ci0gICAgICAgIHggPSBuZXcgSW50ZWdlcigxMjMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdCgpIHsKLSAgICAgICAgeCA9IG5ldyBEb3VibGUoMTIzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVGVzdFN1cHBvcnQuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UZXN0U3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTdmMDZjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UZXN0U3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNvZGVTb3VyY2U7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29tcGlsZVVuaXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuRmllbGROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRmllbGRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5FeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ29uc3RhbnRzOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIERVTVBfQ0xBU1MgPSBmYWxzZTsKLQotICAgIC8vIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgIHByb3RlY3RlZCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPSAKLSAgICAJKEdyb292eUNsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgIAkJCXJldHVybiAoRFVNUF9DTEFTUykgCi0JCQkJCT8gbmV3IER1bXBpbmdDbGFzc0xvYWRlcihwYXJlbnRMb2FkZXIpCi0JCQkJCTogbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudExvYWRlcik7IAotICAgIAkJfQotICAgIAl9KTsKLSAgICBDb21waWxlVW5pdCB1bml0ID0gbmV3IENvbXBpbGVVbml0KHBhcmVudExvYWRlciwgbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpKTsKLSAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IG5ldyBNb2R1bGVOb2RlKHVuaXQpOwotICAgIAotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoQ2xhc3NOb2RlIGNsYXNzTm9kZSkgewotICAgICAgICBjbGFzc05vZGUuc2V0TW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZGVyLmRlZmluZUNsYXNzKGNsYXNzTm9kZSwgY2xhc3NOb2RlLmdldE5hbWUoKSArICIuZ3Jvb3Z5IiwgImdyb292eS50ZXN0U3VwcG9ydCIpOwotICAgICAgICByZXR1cm4gZm9vQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKGJlYW4sIHByb3BlcnR5KTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGRlc2NyaXB0b3IuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzIHNldHRlciBtZXRob2QiLCBtZXRob2QgIT0gbnVsbCk7Ci0KLSAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgbmV3VmFsdWUgfTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlTWV0aG9kKGJlYW4sIG1ldGhvZCwgYXJncyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG91bGQgcmV0dXJuIG51bGwiLCBudWxsLCB2YWx1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0R2V0UHJvcGVydHkoYmVhbiwgcHJvcGVydHksIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoYmVhbiwgcHJvcGVydHkpOwotICAgICAgICBNZXRob2QgbWV0aG9kID0gZGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgIGFzc2VydFRydWUoImhhcyBnZXR0ZXIgbWV0aG9kIiwgbWV0aG9kICE9IG51bGwpOwotCi0gICAgICAgIE9iamVjdFtdIGFyZ3MgPSB7Ci0gICAgICAgIH07Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZU1ldGhvZChiZWFuLCBtZXRob2QsIGFyZ3MpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkIGlzIG51bGwiKTsgfQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oInZhbHVlIGlzIG51bGwiKTsgfQotICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eSB2YWx1ZSIsIGV4cGVjdGVkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IGJlYW4sIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoYmVhbiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjogIiArIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJlYW5JbmZvIGluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbi5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBpbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiQ291bGQgbm90IGZpbmQgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIgb24gYmVhbjogIiArIGJlYW4pOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRGaWVsZChDbGFzcyBhQ2xhc3MsIFN0cmluZyBuYW1lLCBpbnQgbW9kaWZpZXJzLCBTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWVsZCBmaWVsZCA9IGFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKG5hbWUpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkZvdW5kIGZpZWxkIGNhbGxlZDogIiArIG5hbWUsIGZpZWxkICE9IG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWUiLCBuYW1lLCBmaWVsZC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUiLCB0eXBlTmFtZSwgZmllbGQuZ2V0VHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTW9kaWZpZXJzIiwgbW9kaWZpZXJzLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb25TdGF0ZW1lbnQgY3JlYXRlUHJpbnRsblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKLSAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICBuZXcgRmllbGRFeHByZXNzaW9uKEZpZWxkTm9kZS5uZXdTdGF0aWMoU3lzdGVtLmNsYXNzLCAib3V0IikpLAotICAgICAgICAgICAgICAgICJwcmludGxuIiwKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBzY3JpcHQgcnVucyB3aXRob3V0IGFueSBleGNlcHRpb25zCi0gICAgICogQHBhcmFtIHNjcmlwdAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNjcmlwdChTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNjcmlwdCh0ZXh0LCBnZXRUZXN0Q2xhc3NOYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTY3JpcHQoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyBzY3JpcHROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmluZm8oIkFib3V0IHRvIGV4ZWN1dGUgc2NyaXB0Iik7Ci0gICAgICAgIGxvZy5pbmZvKHRleHQpOwotICAgIAlHcm9vdnlDb2RlU291cmNlIGdjcyA9IChHcm9vdnlDb2RlU291cmNlKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAJCXB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgIAkJCXJldHVybiBuZXcgR3Jvb3Z5Q29kZVNvdXJjZSh0ZXh0LCBzY3JpcHROYW1lLCAiL2dyb292eS90ZXN0U3VwcG9ydCIpOwotICAgIAkJfQotICAgIAl9KTsKLSAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhnY3MpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoZ3Jvb3Z5Q2xhc3MsIG5ldyBCaW5kaW5nKCkpOwotICAgICAgICBzY3JpcHQucnVuKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNjcmlwdEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmluZm8oIkFib3V0IHRvIGV4ZWN1dGUgc2NyaXB0OiAiICsgZmlsZU5hbWUpOwotICAgICAgICAKLSAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhuZXcgR3Jvb3Z5Q29kZVNvdXJjZShuZXcgRmlsZShmaWxlTmFtZSkpKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IEludm9rZXJIZWxwZXIuY3JlYXRlU2NyaXB0KGdyb292eUNsYXNzLCBuZXcgQmluZGluZygpKTsKLSAgICAgICAgc2NyaXB0LnJ1bigpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgR3Jvb3Z5T2JqZWN0IGNvbXBpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhuZXcgR3Jvb3Z5Q29kZVNvdXJjZShuZXcgRmlsZShmaWxlTmFtZSkpKTsKLQotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gKEdyb292eU9iamVjdCkgZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKG9iamVjdCAhPSBudWxsKTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UdXBsZUxpc3RUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVHVwbGVMaXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjVmODA4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UdXBsZUxpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Db25zdHJ1Y3Rvck5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTWV0aG9kTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuUHJvcGVydHlOb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlR5cGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5CaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ29uc3RhbnRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkxpc3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWFwRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlR1cGxlRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlZhcmlhYmxlRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Gb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckludm9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgVHVwbGVMaXN0VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlT3ZlclR1cGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFR1cGxlRXhwcmVzc2lvbiBsaXN0RXhwcmVzc2lvbiA9IG5ldyBUdXBsZUV4cHJlc3Npb24oKTsKLSAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJhIikpOwotICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImIiKSk7Ci0gICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYyIpKTsKLSAgICAgICAgYXNzZXJ0SXRlcmF0ZSgiaXRlcmF0ZU92ZXJUdXBsZSIsIGxpc3RFeHByZXNzaW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGVPdmVyTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0RXhwcmVzc2lvbiBsaXN0RXhwcmVzc2lvbiA9IG5ldyBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImEiKSk7Ci0gICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYiIpKTsKLSAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJjIikpOwotICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImEiKSk7Ci0gICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYiIpKTsKLSAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJjIikpOwotICAgICAgICBhc3NlcnRJdGVyYXRlKCJpdGVyYXRlT3Zlckxpc3QiLCBsaXN0RXhwcmVzc2lvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlT3Zlck1hcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNYXBFeHByZXNzaW9uIG1hcEV4cHJlc3Npb24gPSBuZXcgTWFwRXhwcmVzc2lvbigpOwotICAgICAgICBtYXBFeHByZXNzaW9uLmFkZE1hcEVudHJ5RXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJhIiksIG5ldyBDb25zdGFudEV4cHJlc3Npb24oIngiKSk7Ci0gICAgICAgIG1hcEV4cHJlc3Npb24uYWRkTWFwRW50cnlFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImIiKSwgbmV3IENvbnN0YW50RXhwcmVzc2lvbigieSIpKTsKLSAgICAgICAgbWFwRXhwcmVzc2lvbi5hZGRNYXBFbnRyeUV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYyIpLCBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJ6IikpOwotICAgICAgICBhc3NlcnRJdGVyYXRlKCJpdGVyYXRlT3Zlck1hcCIsIG1hcEV4cHJlc3Npb24pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJdGVyYXRlKFN0cmluZyBtZXRob2ROYW1lLCBFeHByZXNzaW9uIGxpc3RFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoIkZvbyIsIEFDQ19QVUJMSUMsICJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0gICAgICAgIGNsYXNzTm9kZS5hZGRDb25zdHJ1Y3RvcihuZXcgQ29uc3RydWN0b3JOb2RlKEFDQ19QVUJMSUMsIG51bGwpKTsKLSAgICAgICAgY2xhc3NOb2RlLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eU5vZGUoImJhciIsIEFDQ19QVUJMSUMsICJqYXZhLmxhbmcuU3RyaW5nIiwgIkZvbyIsIG51bGwsIG51bGwsIG51bGwpKTsKLQotICAgICAgICBTdGF0ZW1lbnQgbG9vcFN0YXRlbWVudCA9IGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiaSIpKTsKLQotICAgICAgICBCbG9ja1N0YXRlbWVudCBibG9jayA9IG5ldyBCbG9ja1N0YXRlbWVudCgpOwotICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IEJpbmFyeUV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbigibGlzdCIpLCBUb2tlbi5uZXdTeW1ib2woIj0iLCAwLCAwKSwgbGlzdEV4cHJlc3Npb24pKSk7Ci0gICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudChuZXcgRm9yU3RhdGVtZW50KCJpIiwgVHlwZS5EWU5BTUlDX1RZUEUsIG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oImxpc3QiKSwgbG9vcFN0YXRlbWVudCkpOwotICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKG1ldGhvZE5hbWUsIEFDQ19QVUJMSUMsICJ2b2lkIiwgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBibG9jaykpOwotCi0gICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOwotCi0gICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byBjcmVhdGUgYmVhbiIsIGJlYW4gIT0gbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIE5vdyBhYm91dCB0byBpbnZva2UgbWV0aG9kIik7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoYmVhbiwgbWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsgICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmVyaWZpZXJDb2RlVmlzaXRvclRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9WZXJpZmllckNvZGVWaXNpdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhjYzNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9WZXJpZmllckNvZGVWaXNpdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKgotICogQ29weXJpZ2h0IDIwMDQgSmFtZXMgU3RyYWNoYW4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5BU1ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5SdW50aW1lUGFyc2VyRXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFZlcmlmaWVyQ29kZVZpc2l0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE5hbWVzKCkgewotICAgICAgICBhc3NlcnRWYWxpZE5hbWUoImEiKTsKLSAgICAgICAgYXNzZXJ0VmFsaWROYW1lKCJhMTIzNCIpOwotICAgICAgICBhc3NlcnRWYWxpZE5hbWUoImFfYl9jIik7Ci0gICAgICAgIGFzc2VydFZhbGlkTmFtZSgiYV9fX18xMjM0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lcygpIHsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE5hbWUoIjEiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE5hbWUoIjEwMCIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiMWEiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE5hbWUoImEhIik7Ci0gICAgICAgIGFzc2VydEludmFsaWROYW1lKCJhLiIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiJCIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiJGZvbyIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBWZXJpZmllckNvZGVWaXNpdG9yLmFzc2VydFZhbGlkSWRlbnRpZmllcihuYW1lLCAidmFyaWFibGUgbmFtZSIsIG5ldyBBU1ROb2RlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEludmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWZXJpZmllckNvZGVWaXNpdG9yLmFzc2VydFZhbGlkSWRlbnRpZmllcihuYW1lLCAidmFyaWFibGUgbmFtZSIsIG5ldyBBU1ROb2RlKCkpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiBkdWUgdG8gaW52YWxpZCBuYW1lOiAiICsgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVQYXJzZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgaW52YWxpZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9kdW1teS9Gb29IYW5kbGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvZHVtbXkvRm9vSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjliMGE5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9kdW1teS9Gb29IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZHVtbXk7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFJvYmVydCBGdWxsZXIKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGludGVyZmFjZSBGb29IYW5kbGVyIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGUoUmVhZGVyIHJlYWRlcik7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kc1Rlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlNZXRob2RzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjNTU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlNZXRob2RzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyb292eU1ldGhvZHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBtYXAucHV0KCJib2IiLCAiZHJvb2xzIik7Ci0gICAgICAgIG1hcC5wdXQoImphbWVzIiwgImdlcm9uaW1vIik7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbGlzdC5hZGQobWFwKTsKLQotICAgICAgICAvKiogQHRvZG8gZml4IHRoaXMhICovCi0gICAgICAgIC8vYXNzZXJ0Q29uc29sZU91dHB1dChsaXN0LCAiW1snYm9iJzonZHJvb2xzJywgJ2phbWVzJzonZ2Vyb25pbW8nXV0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbCA9ICJ6IjsKLSAgICAgICAgU3RyaW5nIGFuc3dlciA9IERlZmF1bHRHcm9vdnlNZXRob2RzLm5leHQob3JpZ2luYWwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbnN3ZXIpOwotICAgICAgICBhc3NlcnRUcnVlKGFuc3dlci5jb21wYXJlVG8ob3JpZ2luYWwpID4gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgb3JpZ2luYWwgPSAiYSI7Ci0gICAgICAgIFN0cmluZyBhbnN3ZXIgPSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5wcmV2aW91cyhvcmlnaW5hbCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGFuc3dlcik7Ci0gICAgICAgIGFzc2VydFRydWUoSW52b2tlckhlbHBlci5jb21wYXJlTGVzc1RoYW4oYW5zd2VyLCBvcmlnaW5hbCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0R1bW15QmVhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRHVtbXlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDliZjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRHVtbXlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBiZWFuIHVzZWQgYnkgdGhlIHRlc3QgY2FzZXMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIER1bW15QmVhbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICJKYW1lcyI7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcigxMjMpOwotICAgIHByaXZhdGUgTWFwIGR5bmFtaWNQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFBvaW50IHBvaW50OwotICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGNoYW5nZVN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOwotICAgIAotICAgIHB1YmxpYyBEdW1teUJlYW4oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIER1bW15QmVhbihTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEdW1teUJlYW4oU3RyaW5nIG5hbWUsIEludGVnZXIgaSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmkgPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBjaGFuZ2VTdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJKCkgewotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJKEludGVnZXIgaSkgewotICAgICAgICB0aGlzLmkgPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vIGR5bmFtaWMgcHJvcGVydGllcwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gZHluYW1pY1Byb3BlcnRpZXMuZ2V0KHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXMucHV0KHByb3BlcnR5LCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZHVtbXlTdGF0aWNNZXRob2QoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7Ci0gICAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgRHVtbXlCZWFuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXF1YWxzKChEdW1teUJlYW4pIHRoYXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKER1bW15QmVhbiB0aGF0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSkgJiYgdGhpcy5pLmVxdWFscyh0aGF0LmkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIltuYW1lPSIgKyBuYW1lICsgIjtpPSIgKyBpICsgIl0iOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2ludCBnZXRQb2ludCgpIHsKLSAgICAgICAgcmV0dXJuIHBvaW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvaW50KFBvaW50IHBvaW50KSB7Ci0gICAgICAgIHRoaXMucG9pbnQgPSBwb2ludDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0luaGVyaXRlZEludGVyZmFjZU1ldGhvZFRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0luaGVyaXRlZEludGVyZmFjZU1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNzc5OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VOZXdMaXN0TWV0aG9kT25BcnJheUxpc3QoKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGxpc3QsICJjb3VudCIsIG5ldyBPYmplY3RbXSB7ICIxMjMiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIGFuc3dlcik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZDogIiArIGFuc3dlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlQ29uc3RydWN0b3JUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VDb25zdHJ1Y3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzM2M1OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VDb25zdHJ1Y3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5HU3RyaW5nOwotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIG1ldGhvZCBpbnZvY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZva2VDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSW52b2tlciBpbnZva2VyID0gbmV3IEludm9rZXIoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VDb25zdHJ1Y3Rvck5vUGFyYW1zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydENvbnN0cnVjdG9yKG5ldyBEdW1teUJlYW4oKSwgbmV3IE9iamVjdFswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUNvbnN0cnVjdG9yT25lUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0Q29uc3RydWN0b3IobmV3IER1bW15QmVhbigiQm9iIiksICJCb2IiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQ29uc3RydWN0b3JPbmVQYXJhbVdoaWNoSXNOdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydENvbnN0cnVjdG9yKG5ldyBEdW1teUJlYW4oIkJvYiIsIG5ldyBJbnRlZ2VyKDE3MDcpKSwgbmV3IE9iamVjdFtdIHsgIkJvYiIsIG5ldyBJbnRlZ2VyKDE3MDcpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yV2l0aEdTdHJpbmdDb2VyY2lvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBHU3RyaW5nIGdzdHJpbmcgPSBuZXcgR1N0cmluZyhuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcigxMjMpfSkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgT2JqZWN0IGV4cGVjdGVkID0gbmV3IExvbmcoZ3N0cmluZy50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRDb25zdHJ1Y3RvcihleHBlY3RlZCwgbmV3IE9iamVjdFtdIHsgZ3N0cmluZyB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb25zdHJ1Y3RvcihPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UoZXhwZWN0ZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGFyZ3VtZW50cyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZva2luZyBvdmVybG9hZGVkIG1ldGhvZCBmb3IgYXJndW1lbnRzOiAiICsgSW52b2tlckhlbHBlci50b1N0cmluZyhhcmd1bWVudHMpLCBleHBlY3RlZCwgdmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgaW52b2tlKFN0cmluZyB0eXBlLCBPYmplY3QgYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlci5pbnZva2VDb25zdHJ1Y3Rvcih0eXBlLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlR3Jvb3Z5TWV0aG9kVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlR3Jvb3Z5TWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU4OWQyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZUdyb292eU1ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUZXN0cyBtZXRob2QgaW52b2NhdGlvbgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSW52b2tlR3Jvb3Z5TWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBJbnZva2VyIGludm9rZXIgPSBuZXcgSW52b2tlcigpOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKLQotICAgIC8vIE1ldGhvZCBpbnZvY2F0aW9uIHRlc3RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kTm9QYXJhbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbGlzdC5hZGQoImFiYyIpOwotICAgICAgICBsaXN0LmFkZCgiZGVmIik7Ci0KLSAgICAgICAgaW52b2tlci5pbnZva2VNZXRob2QobGlzdCwgImVhY2giLCBuZXcgQ2xvc3VyZSh0aGlzKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvQ2FsbChPYmplY3QgYXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChhcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImJ1ZmZlciIsICJhYmNkZWYiLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZXNXaXRoT2JqZWN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydE1hdGNoZXMobmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDEpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMiksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc1dpdGhDbGFzcygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRNYXRjaGVzKG5ldyBJbnRlZ2VyKDEpLCBJbnRlZ2VyLmNsYXNzLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgTnVtYmVyLmNsYXNzLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgRG91YmxlLmNsYXNzLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZXNXaXRoTGlzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRNYXRjaGVzKG5ldyBJbnRlZ2VyKDEpLCBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigxKX0pLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMyl9KSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRNYXRjaGVzKE9iamVjdCBzd2l0Y2hWYWx1ZSwgT2JqZWN0IGNhc2VWYWx1ZSwgYm9vbGVhbiBleHBlY3RlZCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAiU3dpdGNoIG9uOiAiICsgc3dpdGNoVmFsdWUgKyAiIENhc2U6ICIgKyBjYXNlVmFsdWUsCi0gICAgICAgICAgICBleHBlY3RlZCwKLSAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaXNDYXNlKHN3aXRjaFZhbHVlLCBjYXNlVmFsdWUpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZU1ldGhvZFRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZU1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyYmE1My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoKLSAqICRJZCQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKLSAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLSAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgotICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0gKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQotICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQotICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkubGFuZy5JbnRSYW5nZTsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotLyoqCi0gKiBUZXN0cyBtZXRob2QgaW52b2NhdGlvbgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSW52b2tlTWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBJbnZva2VyIGludm9rZXIgPSBuZXcgSW52b2tlcigpOwotCi0gICAgLy8gTWV0aG9kIGludm9jYXRpb24gdGVzdHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2ROb1BhcmFtcygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm1vY2tDYWxsV2l0aE5vUGFyYW1zIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIHZhbHVlIiwgIk5vUGFyYW1zIiwgdmFsdWUpOwotCi0gICAgICAgIHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhOb1BhcmFtcyIsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJOb1BhcmFtcyIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kT25lUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVQYXJhbSIsICJhYmMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCAiT25lUGFyYW0iLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZE9uZVBhcmFtV2hpY2hJc051bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVOdWxsUGFyYW0iLCBuZXcgT2JqZWN0W10geyBudWxsIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJPbmVQYXJhbVdpdGhOdWxsIiwgdmFsdWUpOwotCi0gICAgICAgIHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVOdWxsUGFyYW0iLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCAiT25lUGFyYW1XaXRoTnVsbCIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlT3ZlcmxvYWRlZE1ldGhvZFdpdGhPbmVQYXJhbVdoaWNoSXNOdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAibW9ja092ZXJsb2FkZWRNZXRob2QiLCBuZXcgT2JqZWN0W10geyBudWxsIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJPYmplY3QiLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZE9uZUNvbGxlY3Rpb25QYXJhbWV0ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0W10gZm9vID0geyAiYSIsICJiIiwgImMiIH07Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVDb2xsZWN0aW9uUGFyYW0iLCBuZXcgT2JqZWN0W10geyBmb28gfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIHZhbHVlIiwgbmV3IEludGVnZXIoMyksIHZhbHVlKTsKLQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKCJhIik7Ci0gICAgICAgIGxpc3QuYWRkKCJiIik7Ci0gICAgICAgIHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVDb2xsZWN0aW9uUGFyYW0iLCBsaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCBuZXcgSW50ZWdlcigyKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VQcmludGxuTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShTeXN0ZW0ub3V0LCAicHJpbnRsbiIsICJ0ZXN0aW5nIFN5c3RlbS5vdXQucHJpbnRsbi4uLiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3Nlck51bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0IiwgbmV3IE9iamVjdFtdIHsgbnVsbCB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3Nlck5vUGFyYW1zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc2VydE1ldGhvZENob29zZXIoInZvaWQiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3Nlck9iamVjdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJPYmplY3QiLCBuZXcgT2JqZWN0KCkpOwotICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJPYmplY3QiLCBuZXcgRGF0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3NlclN0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJTdHJpbmciLCAiZm9vIik7Ci0KLSAgICAgICAgLyoqIEB0b2RvIHNvbWUgdHlwZSBjb29lcmNpb24gd291bGQgYmUgY29vbCBoZXJlLi4uICovCi0gICAgICAgIC8vYXNzZXJ0TWV0aG9kQ2hvb3NlcigiU3RyaW5nIiwgbmV3IFN0cmluZ0J1ZmZlcigpKTsKLSAgICAgICAgLy9hc3NlcnRNZXRob2RDaG9vc2VyKCJTdHJpbmciLCBuZXcgQ2hhcmFjdGVyKCdhJyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJOdW1iZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiTnVtYmVyIiwgbmV3IEludGVnZXIoMikpOwotICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJOdW1iZXIiLCBuZXcgRG91YmxlKDIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3NlclR3b1BhcmFtcygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKCJmb28iKTsKLSAgICAgICAgbGlzdC5hZGQoImJhciIpOwotICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJPYmplY3QsT2JqZWN0IiwgbGlzdC50b0FycmF5KCkpOwotCi0gICAgICAgIE9iamVjdFtdIGJsYWggPSB7ICJhIiwgImIiIH07Ci0gICAgICAgIGFzc2VydE1ldGhvZENob29zZXIoIk9iamVjdCxPYmplY3QiLCBibGFoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZldvcmtzRm9yQXJyYXkoKSB7Ci0gICAgICAgIENsYXNzIHR5cGUgPSBPYmplY3RbXS5jbGFzczsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaW5zdGFuY2VvZiB3b3JrcyBmb3IgYXJyYXkiLCB0eXBlLmlzSW5zdGFuY2UodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2hvb3NlclR3b1BhcmFtc1dpdGhTZWNvbmRBbk9iamVjdEFycmF5KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE9iamVjdFtdIGJsYWggPSB7ICJhIiwgbmV3IE9iamVjdFtdIHsgImIiIH0KLSAgICAgICAgfTsKLSAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0LE9iamVjdFtdIiwgYmxhaCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25NZXRob2RzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE9iamVjdCBsaXN0ID0gSW52b2tlckhlbHBlci5jcmVhdGVMaXN0KG5ldyBPYmplY3RbXSB7ICJhIiwgImIiIH0pOwotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShsaXN0LCAic2l6ZSIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUgb2YgY29sbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKDIpLCB2YWx1ZSk7Ci0KLSAgICAgICAgdmFsdWUgPSBpbnZva2UobGlzdCwgImNvbnRhaW5zIiwgImEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250YWlucyBtZXRob2QiLCBCb29sZWFuLlRSVUUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3TWV0aG9kcygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UoImhlbGxvIiwgInNpemUiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIG9mIHN0cmluZyIsIG5ldyBJbnRlZ2VyKDUpLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY01ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UoRHVtbXlCZWFuLmNsYXNzLCAiZHVtbXlTdGF0aWNNZXRob2QiLCAiYWJjIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2l6ZSBvZiBzdHJpbmciLCAiQUJDIiwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNlQ2xhc3NNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG5ldyBEdW1teUJlYW4oKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKG9iamVjdCwgInRvU3RyaW5nIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidG9TdHJpbmciLCBvYmplY3QudG9TdHJpbmcoKSwgdmFsdWUpOwotICAgIH0KLQotCS8vU1BHIG1vZGlmaWVkIHRvIHJlZmxlY3QgRGVmYXVsdEdyb292eU1ldGhvZCBuYW1lIGNoYW5nZSBhbmQgZXhwZWN0ZWQgcmVzdWx0IGZyb20KLQkvL0ludGVnZXIvSW50ZWdlciBkaXZpc2lvbi4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlTnVtYmVycygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3NlcnRNZXRob2RDYWxsKG5ldyBEb3VibGUoMTApLCAiZGl2IiwgbmV3IERvdWJsZSgyKSwgbmV3IERvdWJsZSg1KSk7Ci0gICAgICAgIGFzc2VydE1ldGhvZENhbGwobmV3IERvdWJsZSgxMCksICJkaXYiLCBuZXcgSW50ZWdlcigyKSwgbmV3IERvdWJsZSg1KSk7Ci0gICAgICAgIGFzc2VydE1ldGhvZENhbGwobmV3IEludGVnZXIoMTApLCAiZGl2IiwgbmV3IERvdWJsZSgyKSwgbmV3IERvdWJsZSg1KSk7Ci0gICAgICAgIGFzc2VydE1ldGhvZENhbGwobmV3IEludGVnZXIoMTApLCAiZGl2IiwgbmV3IEludGVnZXIoMiksIG5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCgiNSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzZUZhaWxNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBpbnZva2UodGhpcywgImZhaWwiLCAiaGVsbG8iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgLy8gd29ya2VkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9uTGlzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBMaXN0IG9iamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb2JqZWN0LmFkZCgiSGVsbG8iKTsKLQotICAgICAgICBPYmplY3RbXSB2YWx1ZSA9IChPYmplY3RbXSkgaW52b2tlKG9iamVjdCwgInRvQXJyYXkiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMob2JqZWN0LnRvQXJyYXkoKSwgdmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyIsIHZhbHVlWzBdKTsKLQotICAgICAgICB2YWx1ZSA9IChPYmplY3RbXSkgaW52b2tlKG9iamVjdCwgInRvQXJyYXkiLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMob2JqZWN0LnRvQXJyYXkoKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkT3ZlcmxvYWRpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludm9rZSh0aGlzLCAiYmFkT3ZlcmxvYWQiLCBuZXcgT2JqZWN0W10geyAiYSIsICJiIiB9KTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBmYWlsIGFzIGFuIHVuYW1iaWd1b3VzIG1ldGhvZCBpcyBpbnZva2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzV2l0aE51bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtID0gImNhbGxlZCB3aXRoOiAiOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UocGFyYW0sICJwbHVzIiwgbmV3IE9iamVjdFtdIHsgbnVsbCB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQgd2l0aCBudWxsIiwgcGFyYW0gKyBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhbGxJbnRNZXRob2RXaXRoSW50ZWdlcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm92ZXJsb2FkZWRSZW1vdmUiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcig1KX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNhbGxlZCB3aXRoIGludGVnZXIiLCAiaW50NSIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbExpc3RSZW1vdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZCgiZm9vIik7Ci0gICAgICAgIGxpc3QuYWRkKCJiYXIiKTsKLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UobGlzdCwgInJlbW92ZSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDApfSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBqdXN0IDEgaXRlbSBsZWZ0OiAiICsgbGlzdCwgMSwgbGlzdC5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2VyY2VHU3RyaW5nVG9TdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgR1N0cmluZyBwYXJhbSA9IG5ldyBHU3RyaW5nKG5ldyBPYmplY3RbXSB7ICJKYW1lcyIgfSkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJIZWxsbyAiIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAibWV0aG9kVGFrZXNTdHJpbmciLCBuZXcgT2JqZWN0W10geyBwYXJhbSB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb252ZXJ0ZWQgR1N0cmluZyB0byBzdHJpbmciLCBwYXJhbS50b1N0cmluZygpLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvZXJjZUdTdHJpbmdUb1N0cmluZ09uR2V0Qnl0ZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgR1N0cmluZyBwYXJhbSA9IG5ldyBHU3RyaW5nKG5ldyBPYmplY3RbXSB7ICJVUy1BU0NJSSIgfSkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSgidGVzdCIsICJnZXRCeXRlcyIsIG5ldyBPYmplY3RbXSB7IHBhcmFtIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnZlcnRlZCBHU3RyaW5nIHRvIHN0cmluZyIsICJ0ZXN0Ii5nZXRCeXRlcygiVVMtQVNDSUkiKS5nZXRDbGFzcygpLCB2YWx1ZS5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkQkRUb0RvdWJsZUNvZXJjZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKE1hdGguY2xhc3MsICJmbG9vciIsIG5ldyBCaWdEZWNpbWFsKCIxLjdFMzA5IikpOwotICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk1hdGguZmxvb3IoMS43RTMwOSkgc2hvdWxkIGZhaWwgYmVjYXVzZSBpdCBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgRG91YmxlLiAiCi0gICAgICAgICAgICAgICAgICAgICtlLGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm91dCBvZiByYW5nZSIpID4gMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiTWF0aC5mbG9vcigxLjdFMzA5KSBzaG91bGQgZmFpbCBiZWNhdXNlIGl0IGlzIG91dCBvZiByYW5nZSBmb3IgYSBEb3VibGUuIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgQ2xhc3MgYyA9IFN0cmluZy5jbGFzczsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKGMsICJnZXROYW1lIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3MuZ2V0TmFtZSgpIiwgYy5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgYyA9IGdldENsYXNzKCk7Ci0gICAgICAgIHZhbHVlID0gaW52b2tlKGMsICJnZXROYW1lIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3MuZ2V0TmFtZSgpIiwgYy5nZXROYW1lKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdGVjdGVkTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFN0cmluZyBwYXJhbSA9ICJoZWxsbyI7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAiYVByb3RlY3RlZE1ldGhvZCIsIHBhcmFtKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm90ZWN0ZWQgbWV0aG9kIGNhbGwiLCBhUHJvdGVjdGVkTWV0aG9kKHBhcmFtKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2YXRlTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFN0cmluZyBwYXJhbSA9ICJoZWxsbyI7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAiYVByaXZhdGVNZXRob2QiLCBwYXJhbSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJpdmF0ZSBtZXRob2QgY2FsbCIsIGFQcml2YXRlTWV0aG9kKHBhcmFtKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdWJzdHJpbmdNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdCA9ICJoZWxsbyI7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShvYmplY3QsICJzdWJzdHJpbmciLCBuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3Vic3RyaW5nKDIpIiwgb2JqZWN0LnN1YnN0cmluZygyKSwgdmFsdWUpOwotCi0gICAgICAgIHZhbHVlID0gaW52b2tlKG9iamVjdCwgInN1YnN0cmluZyIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigzKX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN1YnN0cmluZygxLDMpIiwgb2JqZWN0LnN1YnN0cmluZygxLCAzKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0R2V0V2l0aFJhbmdlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiB9KTsKLSAgICAgICAgT2JqZWN0IHJhbmdlID0gbmV3IEludFJhbmdlKDAsIDIpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UobGlzdCwgImdldEF0IiwgcmFuZ2UpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXR1cm5lZCBMaXN0OiAiICsgdmFsdWUsIHZhbHVlIGluc3RhbmNlb2YgTGlzdCk7Ci0gICAgICAgIExpc3QgcmV0TGlzdCA9IChMaXN0KSB2YWx1ZTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaXN0IHNpemUiLCAzLCByZXRMaXN0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldExlbmllbnRPbkRhdGVGb3JtYXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBhID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoICJNTS9kZC95eXl5IiApOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKGEsICJzZXRMZW5pZW50IiwgbmV3IE9iamVjdFtdIHsgQm9vbGVhbi5GQUxTRSB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIG1ldGhvZCIsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlVW5rbm93bk1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJ1bmtub3duTWV0aG9kIiwgImFiYyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdvcmtlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZFdpdGhXcm9uZ051bWJlck9mUGFyYW1ldGVycygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgImEiLCAiYiIgfTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAidW5rbm93bk1ldGhvZCIsIGFyZ3MpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHdvcmtlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZE9uTnVsbE9iamVjdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlKG51bGwsICJtb2NrQ2FsbFdpdGhOb1BhcmFtcyIsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3b3JrZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1vY2sgbWV0aG9kcyB1c2VkIGZvciB0ZXN0aW5nCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgT2JqZWN0IG1vY2tDYWxsV2l0aE5vUGFyYW1zKCkgewotICAgICAgICByZXR1cm4gIk5vUGFyYW1zIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1vY2tDYWxsV2l0aE9uZVBhcmFtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIk1ldGhvZCBub3QgcGFzc2VkIGluIHRoZSBjb3JyZWN0IHZhbHVlIiwgImFiYyIsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuICJPbmVQYXJhbSI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBtb2NrQ2FsbFdpdGhPbmVOdWxsUGFyYW0oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWV0aG9kIG5vdCBwYXNzZWQgaW4gdGhlIGNvcnJlY3QgdmFsdWUiLCBudWxsLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiAiT25lUGFyYW1XaXRoTnVsbCI7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgbW9ja0NhbGxXaXRoT25lQ29sbGVjdGlvblBhcmFtKE9iamVjdCBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbCA9IEludm9rZXJIZWxwZXIuYXNDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwotICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoY29sbC5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbW9ja092ZXJsb2FkZWRNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAidm9pZCI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBtb2NrT3ZlcmxvYWRlZE1ldGhvZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiAiT2JqZWN0IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1vY2tPdmVybG9hZGVkTWV0aG9kKE51bWJlciBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuICJOdW1iZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbW9ja092ZXJsb2FkZWRNZXRob2QoU3RyaW5nIG9iamVjdCkgewotICAgICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBtb2NrT3ZlcmxvYWRlZE1ldGhvZChPYmplY3Qgb2JqZWN0LCBPYmplY3QgYmFyKSB7Ci0gICAgICAgIHJldHVybiAiT2JqZWN0LE9iamVjdCI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBtb2NrT3ZlcmxvYWRlZE1ldGhvZChPYmplY3Qgb2JqZWN0LCBPYmplY3RbXSBhcnJheSkgewotICAgICAgICByZXR1cm4gIk9iamVjdCxPYmplY3RbXSI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBiYWRPdmVybG9hZChTdHJpbmcgYSwgT2JqZWN0IGIpIHsKLSAgICAgICAgcmV0dXJuICJTdHJpbmcsIE9iamVjdCI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBiYWRPdmVybG9hZChPYmplY3QgYSwgU3RyaW5nIGIpIHsKLSAgICAgICAgcmV0dXJuICJPYmplY3QsIFN0cmluZyI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBtZXRob2RUYWtlc1N0cmluZyhTdHJpbmcgeCkgewotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG92ZXJsb2FkZWRSZW1vdmUoaW50IGlkeCkgewotICAgICAgICByZXR1cm4gImludCIgKyBpZHg7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBvdmVybG9hZGVkUmVtb3ZlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gIk9iamVjdCIgKyB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGFQcm90ZWN0ZWRNZXRob2QoU3RyaW5nIHBhcmFtKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbSArICIgdGhlcmUhIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBhUHJpdmF0ZU1ldGhvZChTdHJpbmcgcGFyYW0pIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtICsgIiBKYW1lcyEiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE1ldGhvZENhbGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IHBhcmFtLCBPYmplY3QgZXhwZWN0ZWQpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2QsIG5ldyBPYmplY3RbXSB7IHBhcmFtIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdCBvZiBtZXRob2Q6ICIgKyBtZXRob2QsIGV4cGVjdGVkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQXNzZXJ0cyB0aGF0IGludm9raW5nIHRoZSBtZXRob2QgY2hvb3NlciBmaW5kcyB0aGUgcmlnaHQgb3ZlcmxvYWRlZAotCSAqIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBleHBlY3RlZAotCSAqICAgICAgICAgICAgaXMgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gYXJndW1lbnRzCi0JICogICAgICAgICAgICB0aGUgYXJndW1lbnQocykgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCi0JICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TWV0aG9kQ2hvb3NlcihPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm1vY2tPdmVybG9hZGVkTWV0aG9kIiwgYXJndW1lbnRzKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkludm9raW5nIG92ZXJsb2FkZWQgbWV0aG9kIGZvciBhcmd1bWVudHM6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50cyksIGV4cGVjdGVkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZXIuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlclRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjllMmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotCi0vKioKLSAqIFRlc3QgdGhlIEludm9rZXIgY2xhc3MKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEludm9rZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIEludm9rZXIgaW52b2tlciA9IG5ldyBJbnZva2VyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNDb2xsZWN0aW9uV2l0aEFycmF5KCkgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IHsgIkEiLCAiQiIsICJDIiB9OwotICAgICAgICBhc3NlcnRBc0NvbGxlY3Rpb24oYXJyYXksIDMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NvbGxlY3Rpb25XaXRoTWFwKCkgewotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWFwLnB1dCgiQSIsICJhYmMiKTsKLSAgICAgICAgbWFwLnB1dCgiQiIsICJkZWYiKTsKLSAgICAgICAgbWFwLnB1dCgiQyIsICJ4eXoiKTsKLSAgICAgICAgYXNzZXJ0QXNDb2xsZWN0aW9uKG1hcCwgMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzQ29sbGVjdGlvbldpdGhMaXN0KCkgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKCJBIik7Ci0gICAgICAgIGxpc3QuYWRkKCJCIik7Ci0gICAgICAgIGxpc3QuYWRkKCJDIik7Ci0gICAgICAgIGFzc2VydEFzQ29sbGVjdGlvbihsaXN0LCAzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlckV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIm1lc3NhZ2UiLCBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd29ya2VkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc0Jvb2xlYW4oKSB7Ci0gICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBhc3NlcnRBc0Jvb2xlYW4odHJ1ZSwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0QXNCb29sZWFuKHRydWUsICJUUlVFIik7Ci0gICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCAiZmFsc2UiKTsKLSAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgYXNzZXJ0QXNCb29sZWFuKHRydWUsIG5ldyBJbnRlZ2VyKDEyMzQpKTsKLSAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBuZXcgSW50ZWdlcigwKSk7Ci0gICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCBuZXcgRmxvYXQoMC4zZikpOwotICAgICAgICBhc3NlcnRBc0Jvb2xlYW4odHJ1ZSwgbmV3IERvdWJsZSgzLjBmKSk7Ci0gICAgICAgIGFzc2VydEFzQm9vbGVhbihmYWxzZSwgbmV3IEZsb2F0KDAuMGYpKTsKLQkJYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJYXNzZXJ0QXNCb29sZWFuKHRydWUsIEFycmF5cy5hc0xpc3QobmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKDEpIH0pKTsKLSAgICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExlc3NUaGFuKCkgewotICAgICAgICBhc3NlcnRUcnVlKEludm9rZXJIZWxwZXIuY29tcGFyZUxlc3NUaGFuKG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEludm9rZXJIZWxwZXIuY29tcGFyZUxlc3NUaGFuRXF1YWwobmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDIpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyVGhhbigpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShJbnZva2VySGVscGVyLmNvbXBhcmVHcmVhdGVyVGhhbihuZXcgSW50ZWdlcigzKSwgbmV3IEludGVnZXIoMikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShJbnZva2VySGVscGVyLmNvbXBhcmVHcmVhdGVyVGhhbkVxdWFsKG5ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigyKSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgewotICAgICAgICBhc3NlcnRUcnVlKEludm9rZXJIZWxwZXIuY29tcGFyZUVxdWFsKCJ4IiwgbmV3IEludGVnZXIoJ3gnKSkpOwotICAgIH0KLSAgICAKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoZSBhc0Jvb2xlYW4gbWV0aG9kIHJldHVybnMgdGhlIGdpdmVuIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBc0Jvb2xlYW4oYm9vbGVhbiBleHBlY3RlZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGJvb2xlYW4gYW5zd2VyID0gSW52b2tlckhlbHBlci5hc0Jvb2wodmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlOiAiICsgdmFsdWUgKyAiIGFzQm9vbGVhbigpIiwgZXhwZWN0ZWQsIGFuc3dlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgY29sbGVjdGlvbiBhbmQgaXRlcmF0b3IKLSAgICAgKiBvZiB0aGUgZ2l2ZW4gc2l6ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFzQ29sbGVjdGlvbihPYmplY3QgY29sbGVjdGlvbk9iamVjdCwgaW50IGNvdW50KSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGludm9rZXIuYXNDb2xsZWN0aW9uKGNvbGxlY3Rpb25PYmplY3QpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb2xsZWN0aW9uIGlzIG5vdCBudWxsIiwgY29sbGVjdGlvbiAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xsZWN0aW9uIHNpemUiLCBjb3VudCwgY29sbGVjdGlvbi5zaXplKCkpOwotCi0gICAgICAgIGFzc2VydEl0ZXJhdG9yKCJjb2xsZWN0aW9ucyBpdGVyYXRvciIsIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY291bnQpOwotICAgICAgICBhc3NlcnRJdGVyYXRvcigiaW52b2tlci5hc0l0ZXJhdG9yIiwgaW52b2tlci5hc0l0ZXJhdG9yKGNvbGxlY3Rpb25PYmplY3QpLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydEl0ZXJhdG9yKCJpbnZva2VyLmFzSXRlcmF0b3IoaW52b2tlci5hc0NvbGxlY3Rpb24pIiwgaW52b2tlci5hc0l0ZXJhdG9yKGNvbGxlY3Rpb24pLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydEl0ZXJhdG9yKCJpbnZva2VyLmFzSXRlcmF0b3IoaW52b2tlci5hc0l0ZXJhdG9yKSIsIGludm9rZXIuYXNJdGVyYXRvcihpbnZva2VyLmFzSXRlcmF0b3IoY29sbGVjdGlvbk9iamVjdCkpLCBjb3VudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBpdGVyYXRvciBpcyB2YWxpZCBhbmQgb2YgdGhlIHJpZ2h0IHNpemUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJdGVyYXRvcihTdHJpbmcgbWVzc2FnZSwgSXRlcmF0b3IgaXRlcmF0b3IsIGludCBjb3VudCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSArICI6IHNob3VsZCBoYXZlIGl0ZW06ICIgKyBpLCBpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIjogaXRlbTogIiArIGkgKyAiIHNob3VsZCBub3QgYmUgbnVsbCIsIGl0ZXJhdG9yLm5leHQoKSAhPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEZhbHNlKAotICAgICAgICAgICAgbWVzc2FnZSArICI6IHNob3VsZCBub3QgaGF2ZSBpdGVtIGFmdGVyIGl0ZXJhdGluZyB0aHJvdWdoOiAiICsgY291bnQgKyAiIGl0ZW1zIiwKLSAgICAgICAgICAgIGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgfQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEZhaWx1cmVUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RGYWlsdXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE1YzE4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEZhaWx1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi0KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBmYWlsaW5nIG1ldGhvZCBpbnZvY2F0aW9ucyB0byBlbnN1cmUgY29ycmVjdCBleGNlcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RGYWlsdXJlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsaW5nTWV0aG9kKCkgewotICAgICAgICBNb2NrR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IG5ldyBNb2NrR3Jvb3Z5T2JqZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJub25FeGlzdGVudE1ldGhvZCIsICJoZWxsbyIpOwotCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZFdoaWNoQ2FsbHNUaGVGYWlsaW5nTWV0aG9kKCkgewotICAgICAgICBNb2NrR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IG5ldyBNb2NrR3Jvb3Z5T2JqZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJtZXRob2RUaGF0RmFpbHMiLCBudWxsKTsKLQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RXaGljaENhbGxzVGhlRmFpbGluZ01ldGhvZEluc2lkZUFDbG9zdXJlKCkgewotICAgICAgICBNb2NrR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IG5ldyBNb2NrR3Jvb3Z5T2JqZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJjYWxsQ2xvc3VyZSIsIG5ldyBDbG9zdXJlKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvQ2FsbChHcm9vdnlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuaW52b2tlTWV0aG9kKCJub25FeGlzdGVudE1ldGhvZCIsICJoZWxsbyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RLZXlUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RLZXlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjFkZjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0aG9kS2V5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kS2V5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0SW1wbGVtZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kS2V5IGEgPSBuZXcgRGVmYXVsdE1ldGhvZEtleSgiZm9vIiwgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIEludGVnZXIuY2xhc3MgfSk7Ci0gICAgICAgIE1ldGhvZEtleSBhMiA9IG5ldyBEZWZhdWx0TWV0aG9kS2V5KCJmb28iLCBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcywgSW50ZWdlci5jbGFzcyB9KTsKLSAgICAgICAgTWV0aG9kS2V5IGIgPSBuZXcgRGVmYXVsdE1ldGhvZEtleSgiZm9vIiwgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfSk7Ci0gICAgICAgIE1ldGhvZEtleSBjID0gbmV3IERlZmF1bHRNZXRob2RLZXkoImJhciIsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzIH0pOwotCi0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYTIsIHRydWUpOwotICAgICAgICBhc3NlcnRDb21wYXJlKGIsIGIsIHRydWUpOwotCi0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYiwgZmFsc2UpOwotICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGMsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0Q29tcGFyZShiLCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlbXBvcmFyeUltcGxlbWVudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZEtleSBhID0gbmV3IERlZmF1bHRNZXRob2RLZXkoImZvbyIsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzIH0pOwotICAgICAgICBNZXRob2RLZXkgYTIgPSBuZXcgVGVtcG9yYXJ5TWV0aG9kS2V5KCJmb28iLCBuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0KCksIG5ldyBJbnRlZ2VyKDEpIH0pOwotICAgICAgICBNZXRob2RLZXkgYiA9IG5ldyBUZW1wb3JhcnlNZXRob2RLZXkoImZvbyIsIG5ldyBPYmplY3RbXSB7IG5ldyBPYmplY3QoKSB9KTsKLSAgICAgICAgTWV0aG9kS2V5IGMgPSBuZXcgVGVtcG9yYXJ5TWV0aG9kS2V5KCJiYXIiLCBuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0KCksIG5ldyBJbnRlZ2VyKDEpIH0pOwotCi0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYTIsIHRydWUpOwotICAgICAgICBhc3NlcnRDb21wYXJlKGIsIGIsIHRydWUpOwotCi0gICAgICAgIGFzc2VydENvbXBhcmUoYSwgYiwgZmFsc2UpOwotICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGMsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0Q29tcGFyZShiLCBjLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIsIGJvb2xlYW4gZXhwZWN0ZWQpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wYXJlICIgKyBhICsgIiB0byAiICsgYiwgZXhwZWN0ZWQsIGEuZXF1YWxzKGIpKTsKLSAgICAgICAgaWYgKGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImhhc2hDb2RlICIgKyBhICsgIiB0byAiICsgYiwgYS5oYXNoQ29kZSgpLCBiLmhhc2hDb2RlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01vY2tHcm9vdnlPYmplY3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01vY2tHcm9vdnlPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmMjJkOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Nb2NrR3Jvb3Z5T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7Ci0KLS8qKgotICogQSBQT0dPIHVzZWQgYnkgdGhlIHRlc3QgY2FzZXMKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE1vY2tHcm9vdnlPYmplY3QgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kVGhhdEZhaWxzKCkgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKCJub25FeGlzdGVudE1ldGhvZCIsICJoZWxsbyIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhbGxDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKHRoaXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTmV3U3RhdGljTWV0YU1ldGhvZFRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL05ld1N0YXRpY01ldGFNZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmUwY2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTmV3U3RhdGljTWV0YU1ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIE5ld1N0YXRpY01ldGFNZXRob2RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGFNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKCJkdW1teU1ldGhvZCIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIGZvdW5kIGEgbWV0aG9kIiwgbWV0aG9kICE9IG51bGwpOwotCi0gICAgICAgIE5ld0luc3RhbmNlTWV0YU1ldGhvZCBtZXRhTWV0aG9kID0gY3JlYXRlTmV3TWV0YU1ldGhvZChtZXRob2QpOwotCi0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtZXRhTWV0aG9kLmludm9rZSgiYWJjIiwgbmV3IE9iamVjdFtdIHsgInh5eiIgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGVmIiwgYW5zd2VyKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgbm90IGFwcGVhciBhcyBzdGF0aWMgbWV0aG9kIiwgbWV0YU1ldGhvZC5pc1N0YXRpYygpID09IGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlRGVmYXVsdEdyb292eU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbWV0aG9kID0gRGVmYXVsdEdyb292eU1ldGhvZHMuY2xhc3MuZ2V0TWV0aG9kKCJwbHVzIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcyB9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgZm91bmQgYSBtZXRob2QiLCBtZXRob2QgIT0gbnVsbCk7Ci0KLSAgICAgICAgTmV3SW5zdGFuY2VNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBjcmVhdGVOZXdNZXRhTWV0aG9kKG1ldGhvZCk7Ci0KLSAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1ldGFNZXRob2QuaW52b2tlKCJhYmMiLCBuZXcgT2JqZWN0W10geyAiMTIzIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMxMjMiLCBhbnN3ZXIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyBhbnN3ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VEZWZhdWx0R3Jvb3Z5TWV0aG9kVXNpbmdNZXRhQ2xhc3MoKSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCgiYWJjIiwgInBsdXMiLCBuZXcgT2JqZWN0W10geyAiMTIzIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMxMjMiLCBhbnN3ZXIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyBhbnN3ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1bW15TWV0aG9kKFN0cmluZyBmb28sIFN0cmluZyBiYXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGZvbyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygieHl6IiwgYmFyKTsKLSAgICAgICAgcmV0dXJuICJkZWYiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBOZXdJbnN0YW5jZU1ldGFNZXRob2QgY3JlYXRlTmV3TWV0YU1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmV3SW5zdGFuY2VNZXRhTWV0aG9kKG5ldyBSZWZsZWN0aW9uTWV0YU1ldGhvZChtZXRob2QpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Qcm9wZXJ0eVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1Byb3BlcnR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg0MTdkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1Byb3BlcnR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLWltcG9ydCBncm9vdnkudXRpbC5Ob2RlOwotCi1pbXBvcnQgamF2YS5hd3QuSGVhZGxlc3NFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi0vKioKLSAqIFRlc3QgdGhlIHByb3BlcnR5IGFjY2VzcyBvZiB0aGUgSW52b2tlciBjbGFzcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIEludm9rZXIgaW52b2tlciA9IG5ldyBJbnZva2VyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWFwLnB1dCgiZm9vIiwgImFiYyIpOwotICAgICAgICBtYXAucHV0KCJiYXIiLCBuZXcgSW50ZWdlcigxMjMpKTsKLQotICAgICAgICBhc3NlcnRHZXRTZXRQcm9wZXJ0eShtYXAsICJmb28iLCAiYWJjIiwgImRlZiIpOwotICAgICAgICBhc3NlcnRHZXRTZXRQcm9wZXJ0eShtYXAsICJiYXIiLCBuZXcgSW50ZWdlcigxMjMpLCBuZXcgRG91YmxlKDEyLjM0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJlYW5Qcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIER1bW15QmVhbiBiZWFuID0gbmV3IER1bW15QmVhbigpOwotCi0gICAgICAgIGFzc2VydEdldFNldFByb3BlcnR5KGJlYW4sICJuYW1lIiwgIkphbWVzIiwgIkJvYiIpOwotICAgICAgICBhc3NlcnRHZXRTZXRQcm9wZXJ0eShiZWFuLCAiaSIsIG5ldyBJbnRlZ2VyKDEyMyksIG5ldyBJbnRlZ2VyKDQ1NSkpOwotCi0gICAgICAgIC8vIGR5bmFtaWMgcHJvcGVydGllcwotICAgICAgICBhc3NlcnRHZXRTZXRQcm9wZXJ0eShiZWFuLCAiZHluYW1pY0ZvbyIsIG51bGwsICJhVmFsdWUiKTsKLSAgICAgICAgYXNzZXJ0R2V0U2V0UHJvcGVydHkoYmVhbiwgImR5bmFtaWNGb28iLCAiYVZhbHVlIiwgIk5ld1ZhbHVlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVzaW5nTWV0aG9kUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRHVtbXlCZWFuIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCk7Ci0KLSAgICAgICAgYXNzZXJ0R2V0U2V0UHJvcGVydHkoYmVhbiwgIm5hbWUiLCAiSmFtZXMiLCAiQm9iIik7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShiZWFuLCAiZ2V0TmFtZSIpOwotICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBhIGNsb3N1cmU6ICIgKyB2YWx1ZSwgdmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKTsKLSAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpIHZhbHVlOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2xvc3VyZS5jYWxsKG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdCBvZiBjYWxsIHRvIGNsb3N1cmUiLCAiQm9iIiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShTeXN0ZW0uY2xhc3MsICJvdXQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGF0aWMgcHJvcGVydHkgb3V0IiwgU3lzdGVtLm91dCwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGMgPSBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoYywgIm5hbWUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBuYW1lIHByb3BlcnR5IiwgYy5nZXROYW1lKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwRW50cnlQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG1hcC5wdXQoImEiLCAieCIpOwotICAgICAgICBPYmplY3RbXSBhcnJheSA9IG1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKTsKLSAgICAgICAgT2JqZWN0IGVudHJ5ID0gYXJyYXlbMF07Ci0KLSAgICAgICAgT2JqZWN0IGtleSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoZW50cnksICJrZXkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkgcHJvcGVydHkiLCAiYSIsIGtleSk7Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShlbnRyeSwgInZhbHVlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUgcHJvcGVydHkiLCAieCIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLCAiZ2V0Q2hlZXNlIik7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgY2xvc3VyZTogIiArIHZhbHVlLCB2YWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpOwotCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSAoKENsb3N1cmUpIHZhbHVlKS5jYWxsKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0IG9mIGNsb3N1cmUgY2FsbCIsIGdldENoZWVzZSgpLCByZXN1bHQpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc3VyZTogIiArIHZhbHVlICsgIiBhbmQgY2hlZXNlOiAiICsgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdENvZXJjaW9uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRHVtbXlCZWFuIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTApKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMjApKTsKLQotICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGJlYW4sICJwb2ludCIsIGxpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIHNldCBhIHBvaW50IiwgbmV3IFBvaW50KDEwLCAyMCksIGJlYW4uZ2V0UG9pbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RDb2VyY2lvblByb3BlcnR5T25KRnJhbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQkgICAgICAgIEpGcmFtZSBiZWFuID0gbmV3IEpGcmFtZSgpOwotCSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTApKTsKLQkgICAgICAgIGxpc3QuYWRkKG5ldyBJbnRlZ2VyKDIwKSk7Ci0JCi0JICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGJlYW4sICJsb2NhdGlvbiIsIGxpc3QpOwotCSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBzZXQgYSBwb2ludCIsIG5ldyBQb2ludCgxMCwgMjApLCBiZWFuLmdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChIZWFkbGVzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpdHMgZmluZSB0byBub3QgcnVuIHRoaXMgdGVzdCBvbiBoZWFkbGVzcyBlbnZpcm9ubWVudHMKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB3aXRoIGNhdXNlOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIHRocm93OiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE5hdmlnYXRpb25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBEdW1teUJlYW4oIkphbWVzIikpOwotICAgICAgICBsaXN0LmFkZChuZXcgRHVtbXlCZWFuKCJCb2IiKSk7Ci0KLSAgICAgICAgTGlzdCB2YWx1ZSA9IChMaXN0KSBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KGxpc3QsICJuYW1lIik7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICJKYW1lcyIsICJCb2IiIH0sIHZhbHVlLnRvQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RPZkxpc3ROYXZpZ2F0aW9uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgbGlzdC5hZGQobmV3IER1bW15QmVhbigiSmFtZXMiKSk7Ci0gICAgICAgbGlzdC5hZGQobmV3IER1bW15QmVhbigiQm9iIikpOwotCi0gICAgICAgTGlzdCBsaXN0T2ZMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgIGxpc3RPZkxpc3QuYWRkKGxpc3QpOwotICAgICAgIAotICAgICAgIExpc3QgdmFsdWUgPSAoTGlzdCkgSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShsaXN0T2ZMaXN0LCAibmFtZSIpOwotICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICJKYW1lcyIsICJCb2IiIH0sIHZhbHVlLnRvQXJyYXkoKSk7Ci0gICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZU5hdmlnYXRpb25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBOb2RlIHogPSBuZXcgTm9kZShudWxsLCAieiIpOwotICAgICAgICBOb2RlIHkgPSBuZXcgTm9kZShudWxsLCAieSIpOwotCi0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNoaWxkcmVuLmFkZCh5KTsKLSAgICAgICAgY2hpbGRyZW4uYWRkKHopOwotCi0gICAgICAgIE5vZGUgeCA9IG5ldyBOb2RlKG51bGwsICJ4IiwgY2hpbGRyZW4pOwotCi0gICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjaGlsZHJlbi5hZGQoeCk7Ci0gICAgICAgIE5vZGUgYiA9IG5ldyBOb2RlKG51bGwsICJiIiwgY2hpbGRyZW4pOwotCi0gICAgICAgIC8vIEB0b2RvIHNob3VsZCB0cnkgd2l0aCBqdXN0IGEgbm9kZSBhcyB0aGUgY2hpbGQKLQotICAgICAgICBMaXN0IHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoYiwgIngiKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgeCB9LCB2YWx1ZS50b0FycmF5KCkpOwotCi0gICAgICAgIHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkodmFsdWUsICJ6Iik7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IHogfSwgdmFsdWUudG9BcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdJblByb3BlcnR5T25Qcm9jZXNzVmlhR3Jvb3Z5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmV4ZWN1dGUoImphdmEgLXZlcnNpb24iKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShwcm9jZXNzLCAiaW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIGluOiAiICsgdmFsdWUpOwotICAgICAgICAKLSAgICAgICAgcHJvY2Vzcy5kZXN0cm95KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hlZXNlKCkgewotICAgICAgICByZXR1cm4gImNoZWRkYXIiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRQYXJlbnQoKSB7Ci0gICAgICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgSkJ1dHRvbiBiZWFuID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgCi0gICAgICAgIHBhbmVsLmFkZChiZWFuKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoYmVhbiwgInBhcmVudCIpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHZXRTZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBjdXJyZW50VmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBhc3NlcnRHZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBjdXJyZW50VmFsdWUpOwotCi0gICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOwotCi0gICAgICAgIGFzc2VydEdldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBleHBlY3RlZCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygicHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIgb2Y6ICIgKyBvYmplY3QsIGV4cGVjdGVkLCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU3RhdGljUHJpbnRsblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU3RhdGljUHJpbnRsblRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI2NzUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0YXRpY1ByaW50bG5UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWltcG9ydCBncm9vdnkuYnVncy5UZXN0U3VwcG9ydAotCi1jbGFzcyBTdGF0aWNQcmludGxuVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHZvaWQgdGVzdFN0YXRpY1ByaW50KCkgewotICAgICAgICBtYWluKGdldE1vY2tBcmd1bWVudHMoKSkKLQl9Ci0JCi0gICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7Ci0gICAgICAgIHByaW50bG4oImNhbGxlZCB3aXRoOiAiICsgYXJncykKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVHVwbGVMaXN0VGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVHVwbGVMaXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE3Yzc2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1R1cGxlTGlzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBUdXBsZUxpc3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGVPdmVyVHVwbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKEludm9rZXJIZWxwZXIuY3JlYXRlVHVwbGUobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiB9KSk7Ci0gICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgICkgewotICAgICAgICAgICAgT2JqZWN0IGkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoImJ1ZmZlciIsICJhYmMiLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGVPdmVyTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IoSW52b2tlckhlbHBlci5jcmVhdGVMaXN0KG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIgfSkpOwotICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgIE9iamVjdCBpID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJidWZmZXIiLCAiYWJjIiwgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIG1hcCA9IEludm9rZXJIZWxwZXIuY3JlYXRlTWFwKG5ldyBPYmplY3RbXSB7ImEiLCAieCIsICJiIiwgInkifSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgibWFwIiwgbWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIiwgMiwgbWFwLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUgb2YgYSIsICJ4IiwgbWFwLmdldCgiYSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSBvZiBiIiwgInkiLCBtYXAuZ2V0KCJiIikpOyAgICAgICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvQWJzdHJhY3RUb2tlblN0cmVhbVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvQWJzdHJhY3RUb2tlblN0cmVhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNTI2NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L0Fic3RyYWN0VG9rZW5TdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheDsKLQotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKLQotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUb2tlblN0cmVhbVRlc3QKLSAgICBleHRlbmRzIEdyb292eVRlc3RDYXNlCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrVG9rZW5TdHJlYW0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFRva2VuU3RyZWFtCi0gICAgewotICAgICAgICBwcml2YXRlIGludCBjdXI7Ci0gICAgICAgIHByaXZhdGUgaW50IGNoZWNrcG9pbnQ7Ci0gICAgICAgIHByaXZhdGUgVG9rZW5bXSB0b2tlbnM7Ci0KLSAgICAgICAgcHVibGljIE1vY2tUb2tlblN0cmVhbShUb2tlbltdIHRva2VucykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7Ci0gICAgICAgICAgICB0aGlzLmN1ciAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRva2VuIG5leHRUb2tlbigpCi0gICAgICAgICAgICB0aHJvd3MgUmVhZEV4Y2VwdGlvbiwgU3ludGF4RXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggdGhpcy5jdXIgPj0gdGhpcy50b2tlbnMubGVuZ3RoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG9rZW4gdG9rZW4gPSB0aGlzLnRva2Vuc1sgdGhpcy5jdXIgXTsKLQotICAgICAgICAgICAgKyt0aGlzLmN1cjsKLQotICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2twb2ludCgpIHsKLSAgICAgICAgICAgIGNoZWNrcG9pbnQgPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgewotICAgICAgICAgICAgY3VyID0gY2hlY2twb2ludDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9rZW4oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbltdIHRva2VucyA9IG5ldyBUb2tlbltdCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKCAiKCIsIDEsIDEgKSwKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICIpIiwgMSwgMiApCi0gICAgICAgICAgICB9OwotCi0gICAgICAgIE1vY2tUb2tlblN0cmVhbSBpbiA9IG5ldyBNb2NrVG9rZW5TdHJlYW0oIHRva2VucyApOwotCi0KLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzBdLAotICAgICAgICAgICAgICAgICAgICBpbi5uZXh0VG9rZW4oKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzFdLAotICAgICAgICAgICAgICAgICAgICBpbi5uZXh0VG9rZW4oKSApOwotCi0gICAgICAgIGFzc2VydE51bGwoIGluLm5leHRUb2tlbigpICk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGEoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbltdIHRva2VucyA9IG5ldyBUb2tlbltdCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKCAiKCIsIDEsIDEgKSwKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICIpIiwgMSwgMiApCi0gICAgICAgICAgICB9OwotCi0gICAgICAgIE1vY2tUb2tlblN0cmVhbSBpbiA9IG5ldyBNb2NrVG9rZW5TdHJlYW0oIHRva2VucyApOwotCi0KLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzBdLAotICAgICAgICAgICAgICAgICAgICBpbi5sYSgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRTYW1lKCB0b2tlbnNbMF0sCi0gICAgICAgICAgICAgICAgICAgIGluLmxhKCkgKTsKLQotICAgICAgICBhc3NlcnRTYW1lKCB0b2tlbnNbMF0sCi0gICAgICAgICAgICAgICAgICAgIGluLmxhKCAxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1swXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDEgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDIgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzFdLAotICAgICAgICAgICAgICAgICAgICBpbi5sYSggMiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhQW5kQ29uc3VtZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuW10gdG9rZW5zID0gbmV3IFRva2VuW10KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICIoIiwgMSwgMSApLAotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIikiLCAxLCAyICkKLSAgICAgICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBNb2NrVG9rZW5TdHJlYW0gaW4gPSBuZXcgTW9ja1Rva2VuU3RyZWFtKCB0b2tlbnMgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1swXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzBdLAotICAgICAgICAgICAgICAgICAgICBpbi5sYSgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRTYW1lKCB0b2tlbnNbMF0sCi0gICAgICAgICAgICAgICAgICAgIGluLmxhKCAxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1swXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDEgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzFdLAotICAgICAgICAgICAgICAgICAgICBpbi5sYSggMiApICk7Ci0KLSAgICAgICAgaW4uY29uc3VtZSggVHlwZXMuTEVGVF9QQVJFTlRIRVNJUyApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW5zWzFdLAotICAgICAgICAgICAgICAgICAgICBpbi5sYSgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRTYW1lKCB0b2tlbnNbMV0sCi0gICAgICAgICAgICAgICAgICAgIGluLmxhKCAxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDEgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYU91dE9mT3JkZXIoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbltdIHRva2VucyA9IG5ldyBUb2tlbltdCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG9rZW4ubmV3SWRlbnRpZmllciggImNoZWVzZUl0IiwgMSwgMSApLAotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIigiLCAxLCAxMCApLAotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIikiLCAxLCAxMSApCi0gICAgICAgICAgICB9OwotCi0gICAgICAgIE1vY2tUb2tlblN0cmVhbSBpbiA9IG5ldyBNb2NrVG9rZW5TdHJlYW0oIHRva2VucyApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1syXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDMgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDIgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1swXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDEgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYUF0RW5kKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVG9rZW5bXSB0b2tlbnMgPSBuZXcgVG9rZW5bXQotICAgICAgICAgICAgewotICAgICAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIE1vY2tUb2tlblN0cmVhbSBpbiA9IG5ldyBNb2NrVG9rZW5TdHJlYW0oIHRva2VucyApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCggaW4ubGEoKSApOwotCi0gICAgICAgIGFzc2VydE51bGwoIGluLmxhKCkgKTsKLQotICAgICAgICBhc3NlcnROdWxsKCBpbi5sYSgpICk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIHRoaXMgdGVzdCBpcyBicm9rZW4gYXMgd2UgaGF2ZSBhIGxhcmdlIGxvb2stYWhlYWQgdG9rZW4gYnVmZmVyIG5vdyAKLSAgICAgKiB0byBoYW5kbGUgbmV3bGluZXMuIGlmIHdlIHN1cHBvcnRlZCBtaWQtc3RyZWFtIGNvbnN1bXB0aW9uIAotICAgICAqIChlLmcuIGNvbnN1bWVBdEluZGV4KDMpIHRoZW4gd2UgY291bGQgYXZvaWQgc3VjaCBhIGxhcmdlIGJ1ZmZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIERJU0FCTEVEX3Rlc3RFeGhhdXN0TG9va0FoZWFkKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVG9rZW5bXSB0b2tlbnMgPSBuZXcgVG9rZW5bXQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIigiLCAxLCAxICksCi0gICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKCAiKSIsIDEsIDIgKSwKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICJbIiwgMSwgMyApLAotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIl0iLCAxLCA0ICksCi0gICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKCAieyIsIDEsIDUgKSwKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICJ9IiwgMSwgNiApCi0gICAgICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgTW9ja1Rva2VuU3RyZWFtIGluID0gbmV3IE1vY2tUb2tlblN0cmVhbSggdG9rZW5zICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRTYW1lKCB0b2tlbnNbMF0sCi0gICAgICAgICAgICAgICAgICAgIGluLmxhKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDIgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1syXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDMgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1szXSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDQgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgaW4ubGEoIDUgKSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4ubGEoIDYgKTsKLSAgICAgICAgICAgIGZhaWwoICJzaG91bGQgaGF2ZSB0aHJvd24gR3Jvb3Z5QnVnRXJyb3IiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEdyb292eUJ1Z0Vycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0vLyAgICAgICAgICAgIGFzc2VydEVxdWFscyggNiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvb2tBaGVhZCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5NaXNtYXRjaCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuW10gdG9rZW5zID0gbmV3IFRva2VuW10KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woICIoIiwgMSwgMSApLAotICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCggIikiLCAxLCAyICkKLSAgICAgICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBNb2NrVG9rZW5TdHJlYW0gaW4gPSBuZXcgTW9ja1Rva2VuU3RyZWFtKCB0b2tlbnMgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbi5jb25zdW1lKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUyApOwotICAgICAgICAgICAgZmFpbCggInNob3VsZCBoYXZlIHRocm93biBUb2tlbk1pc21hdGNoRXhjZXB0aW9uIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUb2tlbk1pc21hdGNoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoIHRva2Vuc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VW5leHBlY3RlZFRva2VuKCkgKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBUeXBlcy5SSUdIVF9QQVJFTlRIRVNJUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRFeHBlY3RlZFR5cGUoKSApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlblRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvVG9rZW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjg3M2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OwotCi0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotcHVibGljIGNsYXNzIFRva2VuVGVzdAotICAgIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKLXsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkKLSAgICB7Ci0gICAgfQotCi0vKgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5FID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTiA9IDMzOwotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IG5ldyBUb2tlbiggNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ydHktdHdvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIDQyLAotICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFR5cGUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImZvcnR5LXR3byIsCi0gICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxMSwKLSAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXRTdGFydExpbmUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggMjIsCi0gICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0U3RhcnRDb2x1bW4oKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMZWZ0Q3VybHlCcmFjZSgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmxlZnRDdXJseUJyYWNlKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5MRUZUX0NVUkxZX0JSQUNFLAotICAgICAgICAgICAgICAgICAgICAgInsiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJpZ2h0Q3VybHlCcmFjZSgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLnJpZ2h0Q3VybHlCcmFjZSggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLlJJR0hUX0NVUkxZX0JSQUNFLAotICAgICAgICAgICAgICAgICAgICAgIn0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExlZnRTcXVhcmVCcmFja2V0KCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubGVmdFNxdWFyZUJyYWNrZXQoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkxFRlRfU1FVQVJFX0JSQUNLRVQsCi0gICAgICAgICAgICAgICAgICAgICAiWyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRTcXVhcmVCcmFja2V0KCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucmlnaHRTcXVhcmVCcmFja2V0KCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUklHSFRfU1FVQVJFX0JSQUNLRVQsCi0gICAgICAgICAgICAgICAgICAgICAiXSIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGVmdFBhcmVudGhlc2lzKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubGVmdFBhcmVudGhlc2lzKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTEVGVF9QQVJFTlRIRVNJUywKLSAgICAgICAgICAgICAgICAgICAgICIoIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSaWdodFBhcmVudGhlc2lzKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucmlnaHRQYXJlbnRoZXNpcyggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5SSUdIVF9QQVJFTlRIRVNJUywKLSAgICAgICAgICAgICAgICAgICAgICIpIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3QoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5kb3QoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5ET1QsCi0gICAgICAgICAgICAgICAgICAgICAiLiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG90RG90KCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uZG90RG90KCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRE9UX0RPVCwKLSAgICAgICAgICAgICAgICAgICAgICIuLiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90KCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubm90KCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTk9ULAotICAgICAgICAgICAgICAgICAgICAgIiEiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVOb3RFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVOb3RFcXVhbCggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkNPTVBBUkVfTk9UX0VRVUFMLAotICAgICAgICAgICAgICAgICAgICAgIiE9IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmVxdWFsKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5FUVVBTCwKLSAgICAgICAgICAgICAgICAgICAgICI9IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlSWRlbnRpY2FsKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uY29tcGFyZUlkZW50aWNhbCggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0lERU5USUNBTCwKLSAgICAgICAgICAgICAgICAgICAgICI9PT0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVFcXVhbCggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkNPTVBBUkVfRVFVQUwsCi0gICAgICAgICAgICAgICAgICAgICAiPT0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVMZXNzVGhhbigpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVMZXNzVGhhbiggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkNPTVBBUkVfTEVTU19USEFOLAotICAgICAgICAgICAgICAgICAgICAgIjwiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVMZXNzVGhhbkVxdWFsKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uY29tcGFyZUxlc3NUaGFuRXF1YWwoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkNPTVBBUkVfTEVTU19USEFOX0VRVUFMLAotICAgICAgICAgICAgICAgICAgICAgIjw9IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlR3JlYXRlclRoYW4oKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21wYXJlR3JlYXRlclRoYW4oIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0dSRUFURVJfVEhBTiwKLSAgICAgICAgICAgICAgICAgICAgICI+IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlR3JlYXRlclRoYW5FcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVHcmVhdGVyVGhhbkVxdWFsKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0dSRUFURVJfVEhBTl9FUVVBTCwKLSAgICAgICAgICAgICAgICAgICAgICI+PSIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9naWNhbE9yKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubG9naWNhbE9yKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTE9HSUNBTF9PUiwKLSAgICAgICAgICAgICAgICAgICAgICJ8fCIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9naWNhbEFuZCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmxvZ2ljYWxBbmQoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTE9HSUNBTF9BTkQsCi0gICAgICAgICAgICAgICAgICAgICAiJiYiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBsdXMoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5wbHVzKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLlBMVVMsCi0gICAgICAgICAgICAgICAgICAgICAiKyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1c1BsdXMoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5wbHVzUGx1cyggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUExVU19QTFVTLAotICAgICAgICAgICAgICAgICAgICAgIisrIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzRXF1YWwoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5wbHVzRXF1YWwoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5QTFVTX0VRVUFMLAotICAgICAgICAgICAgICAgICAgICAgIis9IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW51cygpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm1pbnVzKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5NSU5VUywKLSAgICAgICAgICAgICAgICAgICAgICItIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW51c01pbnVzKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubWludXNNaW51cyggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5NSU5VU19NSU5VUywKLSAgICAgICAgICAgICAgICAgICAgICItLSIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWludXNFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm1pbnVzRXF1YWwoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTUlOVVNfRVFVQUwsCi0gICAgICAgICAgICAgICAgICAgICAiLT0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpdmlkZSgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmRpdmlkZSggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRJVklERSwKLSAgICAgICAgICAgICAgICAgICAgICIvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGVFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmRpdmlkZUVxdWFsKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5ESVZJREVfRVFVQUwsCi0gICAgICAgICAgICAgICAgICAgICAiLz0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm1vZCggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLk1PRCwKLSAgICAgICAgICAgICAgICAgICAgICIlIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RFcXVhbCgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm1vZEVxdWFsKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5NT0RfRVFVQUwsCi0gICAgICAgICAgICAgICAgICAgICAiJT0iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGx5KCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubXVsdGlwbHkoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLk1VTFRJUExZLAotICAgICAgICAgICAgICAgICAgICAgIioiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGx5RXF1YWwoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5tdWx0aXBseUVxdWFsKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLk1VTFRJUExZX0VRVUFMLAotICAgICAgICAgICAgICAgICAgICAgIio9IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tYSgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbW1hKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01NQSwKLSAgICAgICAgICAgICAgICAgICAgICIsIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xvbigpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbG9uKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT0xPTiwKLSAgICAgICAgICAgICAgICAgICAgICI6IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1pY29sb24oKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5zZW1pY29sb24oIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5TRU1JQ09MT04sCi0gICAgICAgICAgICAgICAgICAgICAiOyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlc3Rpb24oKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5xdWVzdGlvbiggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUVVFU1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAiPyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwZSgpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLnBpcGUoIExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICJ8IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZVN0cmluZygpCi0gICAgewotICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmRvdWJsZVF1b3RlU3RyaW5nKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRE9VQkxFX1FVT1RFX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiLAotICAgICAgICAgICAgICAgICAgICAgIjxzdHJpbmcgbGl0ZXJhbD4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUXVvdGVTdHJpbmcoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5zaW5nbGVRdW90ZVN0cmluZyggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlZXNlIiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLlNJTkdMRV9RVU9URV9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAiY2hlZXNlIiwKLSAgICAgICAgICAgICAgICAgICAgICI8c3RyaW5nIGxpdGVyYWw+IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uaWRlbnRpZmllciggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWVzZSIgKTsKLQotICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5JREVOVElGSUVSLAotICAgICAgICAgICAgICAgICAgICAgImNoZWVzZSIsCi0gICAgICAgICAgICAgICAgICAgICAiPGlkZW50aWZpZXI+IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyTnVtYmVyKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uaW50ZWdlck51bWJlciggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQyIiApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLklOVEVHRVJfTlVNQkVSLAotICAgICAgICAgICAgICAgICAgICAgIjQyIiwKLSAgICAgICAgICAgICAgICAgICAgICI8bnVtYmVyPiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXROdW1iZXIoKQotICAgIHsKLSAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5mbG9hdE51bWJlciggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDIuODQiICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRkxPQVRfTlVNQkVSLAotICAgICAgICAgICAgICAgICAgICAgIjQyLjg0IiwKLSAgICAgICAgICAgICAgICAgICAgICI8bnVtYmVyPiIgKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQXMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiYXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfQVMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9BYnN0cmFjdCgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJhYnN0cmFjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9BQlNUUkFDVCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0JyZWFrKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImJyZWFrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0JSRUFLICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ2FzZSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJjYXNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0NBU0UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9DYXRjaCgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJjYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9DQVRDSCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NsYXNzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0NMQVNTICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ29uc3QoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiY29uc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfQ09OU1QgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Db250aW51ZSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJjb250aW51ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9DT05USU5VRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0RlZmF1bHQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZGVmYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9ERUZBVUxUICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRG8oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRE8gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9FbHNlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImVsc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRUxTRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0V4dGVuZHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZXh0ZW5kcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9FWFRFTkRTICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRmluYWwoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZmluYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRklOQUwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9GaW5hbGx5KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImZpbmFsbHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRklOQUxMWSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZvcigpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJmb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRk9SICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfR290bygpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJnb3RvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0dPVE8gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9JZigpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJpZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9JRiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ltcGxlbWVudHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiaW1wbGVtZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9JTVBMRU1FTlRTICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfSW1wb3J0KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImltcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9JTVBPUlQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9JbnN0YW5jZW9mKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImluc3RhbmNlb2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfSU5TVEFOQ0VPRiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ludGVyZmFjZSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJpbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfSU5URVJGQUNFICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfTmF0aXZlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggIm5hdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9OQVRJVkUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9OZXcoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAibmV3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX05FVyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1BhY2thZ2UoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAicGFja2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9QQUNLQUdFICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUHJpdmF0ZSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJwcml2YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1BSSVZBVEUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Qcm9wZXJ0eSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJwcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9QUk9QRVJUWSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Byb3RlY3RlZCgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJwcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfUFJPVEVDVEVEICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUHVibGljKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInB1YmxpYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9QVUJMSUMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9SZXR1cm4oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAicmV0dXJuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1JFVFVSTiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N0YXRpYygpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJzdGF0aWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfU1RBVElDICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfU3VwZXIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAic3VwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfU1VQRVIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Td2l0Y2goKQotICAgIHsKLSAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAic3dpdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1NXSVRDSCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N5bmNocm9uaXplZCgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJzeW5jaHJvbml6ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfU1lOQ0hST05JWkVEICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfVGhpcygpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJ0aGlzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1RISVMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9UaHJvdygpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJ0aHJvdyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9USFJPVyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Rocm93cygpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJ0aHJvd3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfVEhST1dTICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfVHJ5KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInRyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9UUlkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9XaGlsZSgpCi0gICAgewotICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJ3aGlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9XSElMRSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlxdWVLZXl3b3JkVHlwZXMoKQotICAgIHsKLSAgICAgICAgTWFwIGtleXdvcmRzID0gVG9rZW4uZ2V0S2V5d29yZE1hcCgpOwotCi0gICAgICAgIFNldCB0eXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgdHlwZXMuYWRkQWxsKCBrZXl3b3Jkcy52YWx1ZXMoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggdHlwZXMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLnNpemUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duVG9rZW5UeXBlKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggIjx1bmtub3duPiIsCi0gICAgICAgICAgICAgICAgICAgICAgVG9rZW4uZ2V0VG9rZW5EZXNjcmlwdGlvbiggNjY2NiApICk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEtleXdvcmRUb2tlbihTdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ua2V5d29yZCggTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHRleHQgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUb2tlbihUb2tlbiB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgJyInICsgdGV4dCArICciJyApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFRva2VuKFRva2VuIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXRUeXBlKCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXREZXNjcmlwdGlvbigpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBMSU5FLAotICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFN0YXJ0TGluZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDT0xVTU4sCi0gICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0U3RhcnRDb2x1bW4oKSApOwotICAgIH0KLSAgICAKLSovCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0Fic3RyYWN0Q2hhclN0cmVhbVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvQWJzdHJhY3RDaGFyU3RyZWFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTBlMDE5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvQWJzdHJhY3RDaGFyU3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJlYWRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdENoYXJTdHJlYW1UZXN0Ci0gICAgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQotewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0NoYXJTdHJlYW0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdENoYXJTdHJlYW0KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgaW50IGN1cjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotICAgICAgICBwdWJsaWMgTW9ja0NoYXJTdHJlYW0oU3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICB0aGlzLmN1ciAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1vY2tDaGFyU3RyZWFtKFN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggZGVzY3JpcHRpb24gKTsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICB0aGlzLmN1ciAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGNoYXIgY29uc3VtZSgpCi0gICAgICAgICAgICB0aHJvd3MgUmVhZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMuY3VyID49IHRoaXMudGV4dC5sZW5ndGgoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyKSAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hhciBjID0gdGhpcy50ZXh0LmNoYXJBdCggdGhpcy5jdXIgKTsKLQotICAgICAgICAgICAgKyt0aGlzLmN1cjsKLQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgICAgICB0aHJvd3MgUmVhZEV4Y2VwdGlvbgotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RfRGVmYXVsdCgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICI8dW5rbm93bj4iLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrQ2hhclN0cmVhbSggImNoZWRkYXIiICkuZ2V0RGVzY3JpcHRpb24oKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RfV2l0aERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggIi9wYXRoL3RvL0NoZWRkYXIuZ3Jvb3Z5IiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja0NoYXJTdHJlYW0oICJjaGVkZGFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcGF0aC90by9DaGVkZGFyLmdyb292eSIgKS5nZXREZXNjcmlwdGlvbigpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdGNvbnN1bWUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2NrQ2hhclN0cmVhbSBpbiA9IG5ldyBNb2NrQ2hhclN0cmVhbSggImNoZWRkYXIiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnYycsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnaCcsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnZScsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnZCcsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnZCcsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnYScsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAncicsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAoY2hhcikgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2NrQ2hhclN0cmVhbSBpbiA9IG5ldyBNb2NrQ2hhclN0cmVhbSggImNoZWRkYXIiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnYycsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnaCcsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAnZScsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoICdkJywKLSAgICAgICAgICAgICAgICAgICAgICBpbi5jb25zdW1lKCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICdkJywKLSAgICAgICAgICAgICAgICAgICAgICBpbi5jb25zdW1lKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggJ2EnLAotICAgICAgICAgICAgICAgICAgICAgIGluLmNvbnN1bWUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggJ3InLAotICAgICAgICAgICAgICAgICAgICAgIGluLmNvbnN1bWUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggKGNoYXIpIC0xLAotICAgICAgICAgICAgICAgICAgICAgIGluLmNvbnN1bWUoKSApOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZUF0RW5kKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTW9ja0NoYXJTdHJlYW0gaW4gPSBuZXcgTW9ja0NoYXJTdHJlYW0oICIiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAoY2hhcikgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAoY2hhcikgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgaW4uY29uc3VtZSgpICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9Fc2NhcGVkTWV0YUNoYXJhY3RlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9Fc2NhcGVkTWV0YUNoYXJhY3RlclRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY4NjVkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvRXNjYXBlZE1ldGFDaGFyYWN0ZXJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNsYXNzIEVzY2FwZWRNZXRhQ2hhcmFjdGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICBkZWYgbmV3bGluZSA9ICJcXCIrIm4iCi0gIGRlZiB0YWIgPSAiXFwiKyJ0IgotICBkZWYgYmFja3NsYXNoID0gIlxcIgotICBkZWYgZG91YmxlYmFja3NsYXNoID0gIlxcIisiXFwiCi0gIGRlZiBjcmV0dXJuID0gIlxcIisiciIKLSAgZGVmIHNpbmdsZXF1b3RlID0gIlxcIisiJyIKLSAgZGVmIGRvdWJsZXF1b3RlID0gIlxcIisnIicKLSAgZGVmIGRvbGxhcj0gIlxcIisiXCQiCi0gIAotICBkZWYgYWxsID0gbmV3bGluZSt0YWIrY3JldHVybgotCi0KLSAgdm9pZCB0ZXN0TmV3TGluZSgpIHsKLSAgICBhc3NlcnQgIlxcbiI9PW5ld2xpbmUKLSAgICBhc3NlcnQgJ1xcbic9PW5ld2xpbmUKLSAgfQotCi0gIHZvaWQgdGVzdFRhYigpIHsKLSAgICBhc3NlcnQgIlxcdCI9PXRhYgotICAgIGFzc2VydCAnXFx0Jz09dGFiCi0gIH0KLQotIHZvaWQgdGVzdEJhY2tzbGFzaCgpIHsKLSAgICBhc3NlcnQgIlxcIj09YmFja3NsYXNoIAotICAgIGFzc2VydCAnXFwnPT1iYWNrc2xhc2ggCi0gICAgYXNzZXJ0ICdcXFxcJz09ZG91YmxlYmFja3NsYXNoIAotICAgIGFzc2VydCAiXFxcXCI9PWRvdWJsZWJhY2tzbGFzaAotIH0KLQotIHZvaWQgdGVzdFJldHVybigpewotICAgYXNzZXJ0ICJcXHIiPT1jcmV0dXJuIAotICAgYXNzZXJ0ICdcXHInPT1jcmV0dXJuIAotICB9Ci0KLSB2b2lkIHRlc3REb3VibGVRdW90ZSgpewotICAgYXNzZXJ0ICdcXCInPT1kb3VibGVxdW90ZSAKLSAgfQotCi0gdm9pZCB0ZXN0U2luZ2xlUXVvdGUoKXsKLSAgIGFzc2VydCAiXFwnIj09c2luZ2xlcXVvdGUgCi0gIH0KLQotICB2b2lkIHRlc3REb2xsYXJTaWduKCl7Ci0gICAgYXNzZXJ0ICJcXFwkIj09ZG9sbGFyCi0gICAgYXNzZXJ0ICdcXFwkJz09ZG9sbGFyCi0gIH0KLQotICB2b2lkIHRlc3RBbGwoKSB7Ci0gICAgYXNzZXJ0ICJcXG5cXHRcXHJcXFxcXFxcJFxcJyIgPT0gYWxsK2RvdWJsZWJhY2tzbGFzaCtkb2xsYXIrIlxcJyIKLSAgICBhc3NlcnQgJ1xcblxcdFxcclxcXFxcXFwkXFwiJyA9PSBhbGwrZG91YmxlYmFja3NsYXNoK2RvbGxhcisnXFwiJwotICAgIGFzc2VydCAiXFxuXFx0XFxyXFwnIiA9PSBhbGwrIlxcJyIKLSAgICBhc3NlcnQgJ1xcblxcdFxcclxcIicgPT0gYWxsKydcXCInCi0KLQotICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL0xleGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc1NGFmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47Ci0KLXB1YmxpYyBjbGFzcyBMZXhlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpCi0gICAgewotICAgIH0KLQotLyoKLQotICAgIHByaXZhdGUgTGV4ZXIgbGV4ZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kT2ZTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIiIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMaW5lQ29tbWVudF9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCIvLyBJIGxpa2UgY2hlZXNlXG5jaGVlc2UiKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMaW5lQ29tbWVudF9DYXJyaWFnZVJldHVybigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiLy8gSSBsaWtlIGNoZWVzZVxyY2hlZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLk5FV0xJTkUsICI8bmV3bGluZT4iKTsKLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTGluZUNvbW1lbnRfQ2FycmlhZ2VSZXR1cm5fTmV3bGluZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiLy8gSSBsaWtlIGNoZWVzZVxyXG5jaGVlc2UiKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMaW5lSGFzaENvbW1lbnRfQ2FycmlhZ2VSZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIiMgSSBsaWtlIGNoZWVzZVxyY2hlZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLk5FV0xJTkUsICI8bmV3bGluZT4iKTsKLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lQ29tbWVudF9NaWRkbGVPZkxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSovIC8vICAgICAgICBuZXdMZXhlcigiY2hlZXNlIC8qIGlzICovIHRvYXN0eSIpOwotLyoKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAidG9hc3R5Iik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUNvbW1lbnRfU3Bhbm5pbmdMaW5lcygpIHRocm93cyBFeGNlcHRpb24gewotKi8gLy8gICAgICAgIG5ld0xleGVyKCJjaGVlc2UgLyogaXMgXG4gcmVhbGx5ICovIHRvYXN0eSIpOwotLyoKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAidG9hc3R5Iik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUNvbW1lbnRfRW1iZWRkZWRTdGFydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSovIC8vICAgICAgICBuZXdMZXhlcigiY2hlZXNlIC8qICogKiAqIC8gKiAvICovIHRvYXN0eSIpOwotLyoKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAidG9hc3R5Iik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZWRXaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCIgXHIgXG4gXHJcbiBcblxyICAgIFx0ICAgXHQiKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMZWZ0Q3VybHlCcmFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInsiLCBUb2tlbi5MRUZUX0NVUkxZX0JSQUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRDdXJseUJyYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgifSIsIFRva2VuLlJJR0hUX0NVUkxZX0JSQUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGVmdFNxdWFyZUJyYWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJbIiwgVG9rZW4uTEVGVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJpZ2h0U3F1YXJlQnJhY2tldCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIl0iLCBUb2tlbi5SSUdIVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExlZnRQYXJlbnRoZXNpcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIigiLCBUb2tlbi5MRUZUX1BBUkVOVEhFU0lTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRQYXJlbnRoZXNpcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIikiLCBUb2tlbi5SSUdIVF9QQVJFTlRIRVNJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIi4iLCBUb2tlbi5ET1QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3REb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIuLiIsIFRva2VuLkRPVF9ET1QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIhIiwgVG9rZW4uTk9UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZU5vdEVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiIT0iLCBUb2tlbi5DT01QQVJFX05PVF9FUVVBTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPSIsIFRva2VuLkVRVUFMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPT0iLCBUb2tlbi5DT01QQVJFX0VRVUFMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUlkZW50aWNhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIj09PSIsIFRva2VuLkNPTVBBUkVfSURFTlRJQ0FMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUxlc3NUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPCIsIFRva2VuLkNPTVBBUkVfTEVTU19USEFOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUxlc3NUaGFuRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCI8PSIsIFRva2VuLkNPTVBBUkVfTEVTU19USEFOX0VRVUFMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPiIsIFRva2VuLkNPTVBBUkVfR1JFQVRFUl9USEFOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJUaGFuRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCI+PSIsIFRva2VuLkNPTVBBUkVfR1JFQVRFUl9USEFOX0VRVUFMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPD0+IiwgVG9rZW4uQ09NUEFSRV9UTyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiLT4iLCBUb2tlbi5OQVZJR0FURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxPcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInx8IiwgVG9rZW4uTE9HSUNBTF9PUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJ8IiwgVG9rZW4uUElQRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxBbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCImJiIsIFRva2VuLkxPR0lDQUxfQU5EKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW1wZXJzYW5kX1VuZXhwZWN0ZWRDaGFyYWN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIiZhIik7Ci0KLSAgICAgICAgY2hhcltdIGV4cGVjdGVkID0gYXNzZXJ0VW5leHBlY3RlZENoYXJhY3RlcignYScsIDEsIDIpOwotCi0gICAgICAgIGFzc2VydExlbmd0aCgxLCBleHBlY3RlZCk7Ci0KLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoJyYnLCBleHBlY3RlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIrIiwgVG9rZW4uUExVUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBsdXNQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiKysiLCBUb2tlbi5QTFVTX1BMVVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIrPSIsIFRva2VuLlBMVVNfRVFVQUwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW51cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIi0iLCBUb2tlbi5NSU5VUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbnVzTWludXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCItLSIsIFRva2VuLk1JTlVTX01JTlVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWludXNFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIi09IiwgVG9rZW4uTUlOVVNfRVFVQUwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIvIiwgVG9rZW4uRElWSURFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIvPSIsIFRva2VuLkRJVklERV9FUVVBTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIiUiLCBUb2tlbi5NT0QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoIiU9IiwgVG9rZW4uTU9EX0VRVUFMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCIqIiwgVG9rZW4uTVVMVElQTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseUVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiKj0iLCBUb2tlbi5NVUxUSVBMWV9FUVVBTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiOiIsIFRva2VuLkNPTE9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiOyIsIFRva2VuLlNFTUlDT0xPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiPyIsIFRva2VuLlFVRVNUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfU2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCJcImNoZWVzZVwiIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGVlc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZERvbGxhcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiXCJmb28gJCR7YmFyfVwiIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJmb28gJCR7YmFyfSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZVN0cmluZ19Fc2NhcGVkVGFiKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCJcImNoZVxcdGVzZVwiIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGVcdGVzZSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZVN0cmluZ19Fc2NhcGVkTmV3bGluZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiXCJjaGVcXG5lc2VcIiIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ET1VCTEVfUVVPVEVfU1RSSU5HLCAiY2hlXG5lc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZENhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCJcImNoZVxccmVzZVwiIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGVccmVzZSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZVN0cmluZ19Fc2NhcGVkT3RoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIlwiY2hlXFxiZXNlXCIiKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uRE9VQkxFX1FVT1RFX1NUUklORywgImNoZWJlc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUXVvdGVTdHJpbmdfU2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCInY2hlZXNlJyIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5TSU5HTEVfUVVPVEVfU1RSSU5HLCAiY2hlZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nX0VzY2FwZWRUYWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIidjaGVcXHRlc2UnIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLlNJTkdMRV9RVU9URV9TVFJJTkcsICJjaGVcdGVzZSIpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVRdW90ZVN0cmluZ19Fc2NhcGVkTmV3bGluZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiJ2NoZVxcbmVzZSciKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uU0lOR0xFX1FVT1RFX1NUUklORywgImNoZVxuZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nX0VzY2FwZWRDYXJyaWFnZVJldHVybigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiJ2NoZVxccmVzZSciKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uU0lOR0xFX1FVT1RFX1NUUklORywgImNoZVxyZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nX0VzY2FwZWRPdGhlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiJ2NoZVxcYmVzZSciKTsKLQotICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uU0lOR0xFX1FVT1RFX1NUUklORywgImNoZWJlc2UiKTsKLQotICAgICAgICBhc3NlcnRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbF9Eb3VibGVRdW90ZV9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCJcImNoZWVzZVxuIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfRG91YmxlUXVvdGVfQ2FycmlhZ2VSZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIlwiY2hlZXNlXHIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbF9Eb3VibGVRdW90ZV9FbmRPZlN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiXCJjaGVlc2UiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbF9TaW5nbGVRdW90ZV9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld0xleGVyKCInY2hlZXNlXG4nIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfU2luZ2xlUXVvdGVfQ2FycmlhZ2VSZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIidjaGVlc2VcciciKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbF9TaW5nbGVRdW90ZV9FbmRPZlN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXdMZXhlcigiJ2NoZWVzZSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgYW5kIGNvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bWJlcl9JbnRlZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiNDIiLCBUb2tlbi5JTlRFR0VSX05VTUJFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bWJlcl9GbG9hdGluZ1BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiNDIuODQiLCBUb2tlbi5GTE9BVF9OVU1CRVIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1iZXJfSW50ZWdlckNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIjQyLmNoZWVzZSIpOwotCi0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JTlRFR0VSX05VTUJFUiwgIjQyIik7Ci0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ET1QsICIuIik7Ci0gICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAiY2hlZXNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bWJlcl9GbG9hdENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIjQyLjAuY2hlZXNlIik7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkZMT0FUX05VTUJFUiwgIjQyLjAiKTsKLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVCwgIi4iKTsKLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKLSAgICB9Ci0KLSovICAgIC8qCi0gICAgcHVibGljIHZvaWQgdGVzdE51bWJlcl9VbmV4cGVjdGVkQ2hhcmFjdGVyKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3TGV4ZXIoICI0LjBjaGVlc2UiICk7Ci0gICAgCi0gICAgICAgIGNoYXJbXSBleHBlY3RlZCA9IGFzc2VydFVuZXhwZWN0ZWRDaGFyYWN0ZXIoICdjJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCApOwotICAgIAotICAgICAgICBhc3NlcnRMZW5ndGgoIDEwLAotICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7Ci0gICAgCi0gICAgICAgIGFzc2VydENvbnRhaW5zKCAnMCcsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwotICAgICAgICBhc3NlcnRDb250YWlucyggJzEnLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoICcyJywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCAnMycsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwotICAgICAgICBhc3NlcnRDb250YWlucyggJzQnLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoICc1JywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCAnNicsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwotICAgICAgICBhc3NlcnRDb250YWlucyggJzcnLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoICc4JywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCAnOScsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwotICAgIH0KLSAgICAqLwotLyoKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9BYnN0cmFjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImFic3RyYWN0IiwgVG9rZW4uS0VZV09SRF9BQlNUUkFDVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJhcyIsIFRva2VuLktFWVdPUkRfQVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0JyZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiYnJlYWsiLCBUb2tlbi5LRVlXT1JEX0JSRUFLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9DYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiY2FzZSIsIFRva2VuLktFWVdPUkRfQ0FTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ2F0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJjYXRjaCIsIFRva2VuLktFWVdPUkRfQ0FUQ0gpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiY2xhc3MiLCBUb2tlbi5LRVlXT1JEX0NMQVNTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Db25zdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImNvbnN0IiwgVG9rZW4uS0VZV09SRF9DT05TVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ29udGludWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJjb250aW51ZSIsIFRva2VuLktFWVdPUkRfQ09OVElOVUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJkZWZhdWx0IiwgVG9rZW4uS0VZV09SRF9ERUZBVUxUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9EbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImRvIiwgVG9rZW4uS0VZV09SRF9ETyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImVsc2UiLCBUb2tlbi5LRVlXT1JEX0VMU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0V4dGVuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJleHRlbmRzIiwgVG9rZW4uS0VZV09SRF9FWFRFTkRTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9GaW5hbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImZpbmFsIiwgVG9rZW4uS0VZV09SRF9GSU5BTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRmluYWxseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImZpbmFsbHkiLCBUb2tlbi5LRVlXT1JEX0ZJTkFMTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImZvciIsIFRva2VuLktFWVdPUkRfRk9SKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Hb3RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgiZ290byIsIFRva2VuLktFWVdPUkRfR09UTyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfSWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJpZiIsIFRva2VuLktFWVdPUkRfSUYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJpbXBsZW1lbnRzIiwgVG9rZW4uS0VZV09SRF9JTVBMRU1FTlRTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9JbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJpbXBvcnQiLCBUb2tlbi5LRVlXT1JEX0lNUE9SVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfSW5zdGFuY2VvZigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImluc3RhbmNlb2YiLCBUb2tlbi5LRVlXT1JEX0lOU1RBTkNFT0YpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoImludGVyZmFjZSIsIFRva2VuLktFWVdPUkRfSU5URVJGQUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9OYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJuYXRpdmUiLCBUb2tlbi5LRVlXT1JEX05BVElWRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfTmV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgibmV3IiwgVG9rZW4uS0VZV09SRF9ORVcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJwYWNrYWdlIiwgVG9rZW4uS0VZV09SRF9QQUNLQUdFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Qcml2YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgicHJpdmF0ZSIsIFRva2VuLktFWVdPUkRfUFJJVkFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Byb3RlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInByb3RlY3RlZCIsIFRva2VuLktFWVdPUkRfUFJPVEVDVEVEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9QdWJsaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJwdWJsaWMiLCBUb2tlbi5LRVlXT1JEX1BVQkxJQyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgicmV0dXJuIiwgVG9rZW4uS0VZV09SRF9SRVRVUk4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N0YXRpYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInN0YXRpYyIsIFRva2VuLktFWVdPUkRfU1RBVElDKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9TdXBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInN1cGVyIiwgVG9rZW4uS0VZV09SRF9TVVBFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgic3dpdGNoIiwgVG9rZW4uS0VZV09SRF9TV0lUQ0gpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N5bmNocm9uaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInN5bmNocm9uaXplZCIsIFRva2VuLktFWVdPUkRfU1lOQ0hST05JWkVEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9UaGlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFNpbXBsZSgidGhpcyIsIFRva2VuLktFWVdPUkRfVEhJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJ0aHJvdyIsIFRva2VuLktFWVdPUkRfVEhST1cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Rocm93cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaW1wbGUoInRocm93cyIsIFRva2VuLktFWVdPUkRfVEhST1dTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9UcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJ0cnkiLCBUb2tlbi5LRVlXT1JEX1RSWSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfV2hpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2ltcGxlKCJ3aGlsZSIsIFRva2VuLktFWVdPUkRfV0hJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmV4cGVjdGVDaGFyYWN0ZXJFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIoIrEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ7EnLCBlLmdldENoYXJhY3RlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTaW1wbGUoU3RyaW5nIHRleHQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TGV4ZXIodGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0TmV4dFRva2VuKHR5cGUsIHRleHQpOwotCi0gICAgICAgIGFzc2VydEVuZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5leHRUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUb2tlbiB0b2tlbiA9IHRoaXMubGV4ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0b2tlbik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGUsIHRva2VuLmdldFR5cGUoKSk7Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkOiAiICsgdGV4dCArICIgYnV0IGdvdDogIiArIHRva2VuLmdldFRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHModGV4dCwgdG9rZW4uZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBuZXh0VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5sZXhlci5uZXh0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgY2hhcltdIGFzc2VydFVuZXhwZWN0ZWRDaGFyYWN0ZXIoY2hhciBjLCBpbnQgbGluZSwgaW50IGNvbHVtbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmxleGVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGMsIGUuZ2V0Q2hhcmFjdGVyKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobGluZSwgZS5nZXRMaW5lKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sdW1uLCBlLmdldFN0YXJ0Q29sdW1uKCkpOwotCi0gICAgICAgICAgICByZXR1cm4gZS5nZXRFeHBlY3RlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBjaGFyW10gewotICAgICAgICB9OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROdWxsKHRoaXMubGV4ZXIubmV4dFRva2VuKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG5ld0xleGVyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0NoYXJTdHJlYW0gaW4gPSBuZXcgU3RyaW5nQ2hhclN0cmVhbSh0ZXh0KTsKLQotICAgICAgICB0aGlzLmxleGVyID0gbmV3IExleGVyKGluKTsKLSAgICB9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlclRva2VuU3RyZWFtVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9sZXhlci9MZXhlclRva2VuU3RyZWFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTE5OWE2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvTGV4ZXJUb2tlblN0cmVhbVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXI7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotCi1wdWJsaWMgY2xhc3MgTGV4ZXJUb2tlblN0cmVhbVRlc3QKLSAgICBleHRlbmRzIEdyb292eVRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpCi0gICAgewotICAgIH0KLQotLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0KCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0NoYXJTdHJlYW0gY2hhcnMgPSBuZXcgU3RyaW5nQ2hhclN0cmVhbSggIigpIiApOwotICAgICAgICBMZXhlciBsZXhlciA9IG5ldyBMZXhlciggY2hhcnMgKTsKLSAgICAgICAgTGV4ZXJUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgTGV4ZXJUb2tlblN0cmVhbSggbGV4ZXIgKTsKLQotICAgICAgICBhc3NlcnRTYW1lKCBsZXhlciwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmdldExleGVyKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRva2VuKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nQ2hhclN0cmVhbSBjaGFycyA9IG5ldyBTdHJpbmdDaGFyU3RyZWFtKCAiKCkiICk7Ci0gICAgICAgIExleGVyIGxleGVyID0gbmV3IExleGVyKCBjaGFycyApOwotICAgICAgICBMZXhlclRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBMZXhlclRva2VuU3RyZWFtKCBsZXhlciApOwotCi0gICAgICAgIGFzc2VydFRva2VuKCB0b2tlbnMubmV4dFRva2VuKCksCi0gICAgICAgICAgICAgICAgICAgICAiKCIsCi0gICAgICAgICAgICAgICAgICAgICBUb2tlbi5MRUZUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2Vucy5uZXh0VG9rZW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICIpIiwKLSAgICAgICAgICAgICAgICAgICAgIFRva2VuLlJJR0hUX1BBUkVOVEhFU0lTICk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbCggdG9rZW5zLm5leHRUb2tlbigpICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9rZW4oVG9rZW4gdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFR5cGUoKSApOwotICAgIH0KLQotKi8KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvU3RyaW5nQ2hhclN0cmVhbVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvbGV4ZXIvU3RyaW5nQ2hhclN0cmVhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1YjAwZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L2xleGVyL1N0cmluZ0NoYXJTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyOwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdDaGFyU3RyZWFtVGVzdAotICAgIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKLXsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpCi0gICAgewotICAgIH0KLQotLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dENoYXJfRW1wdHlTdHJpbmcoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdDaGFyU3RyZWFtIGNoYXJTdHJlYW0gPSBuZXcgU3RyaW5nQ2hhclN0cmVhbSggIiIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIENoYXJTdHJlYW0uRU9TLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggQ2hhclN0cmVhbS5FT1MsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhclN0cmVhbS5jb25zdW1lKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Y29uc3VtZV9Ob25FbXB0eVN0cmluZygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ0NoYXJTdHJlYW0gY2hhclN0cmVhbSA9IG5ldyBTdHJpbmdDaGFyU3RyZWFtKCAiY2hlZXNlIiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggJ2MnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggJ2gnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggJ2UnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggJ2UnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggJ3MnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggJ2UnLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXJTdHJlYW0uY29uc3VtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggQ2hhclN0cmVhbS5FT1MsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhclN0cmVhbS5jb25zdW1lKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDaGFyU3RyZWFtLkVPUywKLSAgICAgICAgICAgICAgICAgICAgICBjaGFyU3RyZWFtLmNvbnN1bWUoKSApOwotICAgIH0KLSovCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9BU1RCdWlsZGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQVNUQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NTM1Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9BU1RCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKgotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgotICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKLSAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgotICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KLSAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQotICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKLSAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5CaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ2xhc3NFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ2xvc3VyZUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdGFudEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWFwRW50cnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWFwRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlZhcmlhYmxlRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRXhwcmVzc2lvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LklmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIHRoZSBBU1QgYnVpbGRlcgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RQYXJzZXJTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0KLSAgICAgICAgICAgIHBhcnNlKCJpbXBvcnQgY2hlZGRhci5jaGVlc2UuVG9hc3QgYXMgQnJlYWRcbiB4ID0gWzEsIDIsIDNdOyBTeXN0ZW0ub3V0LnByaW50bG4oeCkiLCAiZm9vL0NoZWVzZS5ncm9vdnkiKTsKLQotICAgICAgICBCbG9ja1N0YXRlbWVudCBibG9jayA9IG1vZHVsZS5nZXRTdGF0ZW1lbnRCbG9jaygpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzb21lIHN0YXRlbWVudHMiLCAhYmxvY2suZ2V0U3RhdGVtZW50cygpLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlbWVudHM6ICIgKyBibG9jay5nZXRTdGF0ZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9Ci0gICAgICAgICAgICBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyB4ID0gc29tZU1ldGhvZCgpOyBjYWxsTWV0aG9kKHgpIH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAyLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJzY3JpcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPQotICAgICAgICAgICAgcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgeCA9IDFcbiBbMV0uZWFjaCB7IHByaW50bG4oaXQpIH19IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMiwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld2xpbmVzSW5zaWRlRXhwcmVzc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgeCA9IDEgK1xuIDUgKiBcbiAyIC8gXG4gNSB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMSwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbGxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0KLSAgICAgICAgICAgIHBhcnNlKAotICAgICAgICAgICAgICAgICJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IGRlZiBhcnJheSA9IGdldE1vY2tBcmd1bWVudHMoKVxuIFxuIGR1bW15TWV0aG9kKGFycmF5KSB9IH0iLAotICAgICAgICAgICAgICAgICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAyLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpdGVyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qICB0b2RvIHNob3VsZCB3ZSBvciBzaG91bGRuJ3Qgd2Ugc3VwcG9ydCB0aGUgamRrIDEuNSBmb3IgbG9vcCwgd2l0aCB0aGUgY29sb24gaW4gbGlldSBvZiB0aGUgZ3Jvb3Z5ICdpbicga2V5d29yZD8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmRrMTVGb3JMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgZm9yICh4IDogZm9vKSB7IHByaW50bG4geCB9IH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgRm9yU3RhdGVtZW50IHN0bXQgPSAoRm9yU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4Iiwgc3RtdC5nZXRWYXJpYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdG10LmdldFZhcmlhYmxlVHlwZSgpLmlzRHluYW1pYygpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0bXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKZGsxNUZvckxvb3BXaXRoVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IGZvciAoSW50ZWdlciB4IDogZm9vKSB7IHByaW50bG4geCB9IH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgRm9yU3RhdGVtZW50IHN0bXQgPSAoRm9yU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4Iiwgc3RtdC5nZXRWYXJpYWJsZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBzdG10LmdldFZhcmlhYmxlVHlwZSgpLmdldE5hbWUoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgc3RtdC5nZXRWYXJpYWJsZVR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzdG10LmdldFZhcmlhYmxlVHlwZSgpLmlzRHluYW1pYygpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0bXQpOwotICAgIH0KLSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTG9vcFdpdGhUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgZm9yIChGb28geCBpbiBmb28pIHsgcHJpbnRsbiB4IH0gfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBGb3JTdGF0ZW1lbnQgc3RtdCA9IChGb3JTdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCBzdG10LmdldFZhcmlhYmxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIHN0bXQuZ2V0VmFyaWFibGVUeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc3RtdC5nZXRWYXJpYWJsZVR5cGUoKS5pc0R5bmFtaWMoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdG10KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2NyaXB0QXNzaWdubWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IHhbMTJdID0gJ2FiYycgfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBFeHByZXNzaW9uIGV4cCA9IGV4cHJTdG10LmdldEV4cHJlc3Npb24oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGV4cCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHAgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKTsKLSAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBiaW5FeHByID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cDsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUkhTIGlzIGNvbnN0YW50IiwgYmluRXhwci5nZXRSaWdodEV4cHJlc3Npb24oKSBpbnN0YW5jZW9mIENvbnN0YW50RXhwcmVzc2lvbik7Ci0KLSAgICAgICAgRXhwcmVzc2lvbiBsaHMgPSBiaW5FeHByLmdldExlZnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkxIUyBpcyBiaW5hcnkgZXhwcmVzc2lvbiIsIGxocyBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pOwotCi0gICAgICAgIEJpbmFyeUV4cHJlc3Npb24gbGhzQmluRXhwciA9IChCaW5hcnlFeHByZXNzaW9uKSBsaHM7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VULCBsaHNCaW5FeHByLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTGVmdCBvZiBMSFMgaXMgYSB2YXJpYWJsZSIsIGxoc0JpbkV4cHIuZ2V0TGVmdEV4cHJlc3Npb24oKSBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoIlJpZ2h0IG9mIExIUyBpcyBhIGNvbnN0YW50IiwgbGhzQmluRXhwci5nZXRSaWdodEV4cHJlc3Npb24oKSBpbnN0YW5jZW9mIENvbnN0YW50RXhwcmVzc2lvbik7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyB4ICs9IDUgfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzdEV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyB4ID0gKFNob3J0KSA1IH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotCi0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwID0gZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlcm5hcnlFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgZm9vKCkgPyAnYScgOiAnYicgfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZVdpdGhKdXN0SWRlbnRpZmllckJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IHJldHVybiB7YX0gfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgUmV0dXJuU3RhdGVtZW50IHJldHVyblN0bXQgPSAoUmV0dXJuU3RhdGVtZW50KXN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBFeHByZXNzaW9uIGV4cCA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVXaXRoSnVzdElkZW50aWZpZXJJbk1hcEJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IFsneCc6e2F9LCAnZCc6MTIzXSB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMSwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpKTsKLQotICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotCi0gICAgICAgIE1hcEV4cHJlc3Npb24gbWFwRXhwID0gKE1hcEV4cHJlc3Npb24pIGV4cHJTdG10LmdldEV4cHJlc3Npb24oKTsKLSAgICAgICAgTWFwRW50cnlFeHByZXNzaW9uIGVudHJ5RXhwID0gKE1hcEVudHJ5RXhwcmVzc2lvbikgbWFwRXhwLmdldE1hcEVudHJ5RXhwcmVzc2lvbnMoKS5nZXQoMCk7Ci0gICAgICAgIENsb3N1cmVFeHByZXNzaW9uIGNsb3N1cmVFeHAgPSAoQ2xvc3VyZUV4cHJlc3Npb24pIGVudHJ5RXhwLmdldFZhbHVlRXhwcmVzc2lvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmFtZXRlcnMgb24gY2xvc3VyZSIsIDAsIGNsb3N1cmVFeHAuZ2V0UGFyYW1ldGVycygpLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGNsb3N1cmVFeHApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheUV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyBkZWYgZm9vID0gWydhJywgJ2InLCAnYyddICBhcyBTdHJpbmdbXVxuIGFzc2VydCBmb28gIT0gbnVsbCB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMiwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpKTsKLQotICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBFeHByZXNzaW9uIGV4cCA9IGV4cHJTdG10LmdldEV4cHJlc3Npb24oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4cHI6ICIgKyBleHApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheUV4cHJlc3Npb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgU3RyaW5nW10gZm9vID0gWydhJywgJ2InLCAnYyddXG4gYXNzZXJ0IGZvbyAhPSBudWxsIH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAyLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotCi0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwID0gZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVkVmFyaWFibGVFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgU2hvcnQgeCA9IDUgfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHlRdWFsaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgY29tLmFjbWUuRm9vIH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotCi0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwID0gZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXh0OiAiICsgZXhwLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVN1YnNjcmlwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IHggPSBmb29bMF1bMF0gfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRleHQ6ICIgKyBleHAuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2FsbFdpdGhEb3RBbmROb1BhcmVudGhlc2lzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgZm9vLnNvbWVNZXRob2QgMSB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMSwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpKTsKLQotICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBFeHByZXNzaW9uIGV4cCA9IGV4cHJTdG10LmdldEV4cHJlc3Npb24oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4cHI6ICIgKyBleHApOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dDogIiArIGV4cC5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aE5vUGFyZW50aGVzaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyBzb21lTWV0aG9kIDEgfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRleHQ6ICIgKyBleHAuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0TWV0aG9kQ2FsbFdpdGhOb1BhcmVudGhlc2lzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoInNvbWVNZXRob2QgMSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJydW4iKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByU3RtdCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgRXhwcmVzc2lvbiBleHAgPSBleHByU3RtdC5nZXRFeHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleHByOiAiICsgZXhwKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRleHQ6ICIgKyBleHAuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0V2l0aE1ldGhvZERlY2xhcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImRlZiBmb28oYSkgeyByZXR1cm4gYSArIDF9XG4gZm9vKDEyMykiLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAicnVuIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotCi0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwID0gZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXh0OiAiICsgZXhwLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1YnNjcmlwdFRoZW5NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyB4ID0gZm9vWzBdLmZvbygpIH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotCi0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwclN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgIEV4cHJlc3Npb24gZXhwID0gZXhwclN0bXQuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwcjogIiArIGV4cCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXh0OiAiICsgZXhwLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1YnNjcmlwdFRoZW5PcGVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyBmb29bMF0gKz0gNSB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMSwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpKTsKLQotICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICBFeHByZXNzaW9uIGV4cCA9IGV4cHJTdG10LmdldEV4cHJlc3Npb24oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4cHI6ICIgKyBleHApOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dDogIiArIGV4cC5nZXRUZXh0KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJvZHNCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBwYXJzZSgiY2xhc3MgRm9vIHsgdm9pZCB0ZXN0TWV0aG9kKCkgeyBpZiAoeCkgeyBTdHJpbmcgbiA9ICdmb28nIH0gfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgSWZTdGF0ZW1lbnQgaWZTdG10ID0gKElmU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgdHJ1ZVN0bXQgPSAoQmxvY2tTdGF0ZW1lbnQpIGlmU3RtdC5nZXRJZkJsb2NrKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0cnVlU3RtdDogIiArIHRydWVTdG10KTsKLQotICAgICAgICAvLyBpZGVhbGx5IHRoZXJlIHdvdWxkIGJlIDEgc3RhdGVtZW50OyB0aG91Z2ggd2UncmUgaGFuZGxpbmcgdGhhdCBpbiB0aGUgdmVyaWZpZXIKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRydWVTdG10LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNZXRob2RDYWxsQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0KLSAgICAgICAgICAgIHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IEFTVEJ1aWxkZXJUZXN0Lm1vY2tIZWxwZXJNZXRob2QoKSB9IH0iLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldENvZGUobW9kdWxlLCAidGVzdE1ldGhvZCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3RhdGVtZW50cyBzaXplOiAiICsgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSwgMSwgc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKS5zaXplKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZkJ1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9Ci0gICAgICAgIHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IGlmIChmb28gaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdCkgeyBwcmludGxuKCdoZWxsbycpIH0gfSB9IiwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSBnZXRDb2RlKG1vZHVsZSwgInRlc3RNZXRob2QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YXRlbWVudHMgc2l6ZTogIiArIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCksIDEsIHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RhdGVtZW50LmdldFN0YXRlbWVudHMoKSk7Ci0KLSAgICAgICAgSWZTdGF0ZW1lbnQgaWZTdG10ID0gKElmU3RhdGVtZW50KSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBleHAgPSAoQmluYXJ5RXhwcmVzc2lvbikgaWZTdG10LmdldEJvb2xlYW5FeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwOiAiICsgZXhwKTsKLQotICAgICAgICBFeHByZXNzaW9uIHJocyA9IGV4cC5nZXRSaWdodEV4cHJlc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUkhTIHNob3VsZCBiZSBhIGNsYXNzIGV4cHJlc3Npb24iLCByaHMgaW5zdGFuY2VvZiBDbGFzc0V4cHJlc3Npb24pOwotCi0gICAgICAgIENsYXNzRXhwcmVzc2lvbiBjbGFzc0V4cCA9IChDbGFzc0V4cHJlc3Npb24pIHJoczsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIGNsYXNzRXhwLmdldFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbGxXaXRob3V0UGFyZW5zQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgcHJpbnRsbiAzLCA1IH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXR1cm5NZXRob2RDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImNsYXNzIEZvbyB7IHZvaWQgdGVzdE1ldGhvZCgpIHsgU3lzdGVtLm91dC5wcmludGxuXG59fSIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0Q29kZShtb2R1bGUsICJ0ZXN0TWV0aG9kIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0ZW1lbnRzIHNpemU6ICIgKyBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLCAxLCBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaW9uc1R5cG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJjbGFzcyBGb28geyB2b2lkIHRlc3RNZXRob2QoKSB7IHByaW50bG4gJHtmb299XG59fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKHNjcmlwdCwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdG9kbyBwcm9ibGVtIG9mIGFudGxyIHRocm93biBleGNlcHRpb24KLSAgICAgICAgICAgIC8vU3ludGF4RXhjZXB0aW9uIGNhdXNlID0gZS5nZXRVbml0KCkuZ2V0U3ludGF4RXJyb3IoMCk7Ci0gICAgICAgICAgICAvL2lmKCBjYXVzZSAhPSBudWxsICYmIGNhdXNlIGluc3RhbmNlb2YgUGFyc2VyRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2ZhaWwgKHNjcmlwdCsiIHNob3VsZCBmYWlsIHdpdGggYSBQYXJzZXJFeGNlcHRpb246ICIrZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoc2NyaXB0KyIgc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGUgeyB3YXMgdW5leHBlY3RlZCBhZnRlciB0aGUgZG9sbGFyIHNpZ24uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZFdpdGhBcnJheVR5cGVQYXJhbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJjbGFzcyBGb28geyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeyBwcmludGxuKGFyZ3MpIH0gfSIsICJEdW1teS5ncm9vdnkiKTsKLQotICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IGdldE1ldGhvZChtb2R1bGUsICJtYWluIik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbWV0ZXJzOiAiICsgSW52b2tlckhlbHBlci50b1N0cmluZyhtZXRob2QuZ2V0UGFyYW1ldGVycygpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU91dE9mUmFuZ2UoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKHNjcmlwdCwgIkR1bW15Lmdyb292eSIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdG9kbyBwcm9ibGVtIG9mIGFudGxyIHRocm93biBleGNlcHRpb24KLSAgICAgICAgICAgIC8vIFN5bnRheEV4Y2VwdGlvbiBjYXVzZSA9IGUuZ2V0VW5pdCgpLmdldFN5bnRheEVycm9yKDApOwotICAgICAgICAgICAgLy8gaWYoIGNhdXNlICE9IG51bGwgJiYgY2F1c2UgaW5zdGFuY2VvZiBQYXJzZXJFeGNlcHRpb24gJiYgY2F1c2UuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm91dCBvZiByYW5nZSIpID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZmFpbCAoc2NyaXB0KyIgc2hvdWxkIGZhaWwgd2l0aCBhIFBhcnNlckV4Y2VwdGlvbjogIitlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbChzY3JpcHQrIiBzaG91bGQgZmFpbCBiZWNhdXNlIHRoZSBudW1iZXIgaXMgb3V0IG9mIHJhbmdlLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJblJhbmdlKFN0cmluZyBzY3JpcHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKHNjcmlwdCwgIkR1bW15Lmdyb292eSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsSW50ZWdlclJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUluUmFuZ2UoICAgImRlZiB4ID0gIDIxNDc0ODM2NDdJOyIpOwotICAgICAgICBlbnN1cmVPdXRPZlJhbmdlKCJkZWYgeCA9ICAyMTQ3NDgzNjQ4STsiKTsKLQotICAgICAgICBlbnN1cmVJblJhbmdlKCAgICJkZWYgeCA9IC0yMTQ3NDgzNjQ4STsiKTsKLSAgICAgICAgZW5zdXJlT3V0T2ZSYW5nZSgiZGVmIHggPSAtMjE0NzQ4MzY0OUk7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxMb25nUmFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlSW5SYW5nZSggICAiZGVmIHggPSAgOTIyMzM3MjAzNjg1NDc3NTgwN0w7Iik7Ci0gICAgICAgIGVuc3VyZU91dE9mUmFuZ2UoImRlZiB4ID0gIDkyMjMzNzIwMzY4NTQ3NzU4MDhMOyIpOwotCi0gICAgICAgIGVuc3VyZUluUmFuZ2UoICAgImRlZiB4ID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhMOyIpOwotICAgICAgICBlbnN1cmVPdXRPZlJhbmdlKCJkZWYgeCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA5TDsiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbERvdWJsZVJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUluUmFuZ2UoICAgImRlZiB4ID0gIDEuNzk3NjkzMTM0ODYyMzE1N0UzMDhEOyIpOwotICAgICAgICBlbnN1cmVPdXRPZlJhbmdlKCJkZWYgeCA9ICAxLjc5NzY5MzEzNDg2MjMxNjdFMzA4RDsiKTsKLQotICAgICAgICBlbnN1cmVJblJhbmdlKCAgICJkZWYgeCA9IC0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4RDsiKTsKLSAgICAgICAgZW5zdXJlT3V0T2ZSYW5nZSgiZGVmIHggPSAtMS43OTc2OTMxMzQ4NjIzMTY3RTMwOEQ7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxGbG9hdFJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUluUmFuZ2UoICAgImRlZiB4ID0gIDMuNDAyODIzNWUrMzhmOyIpOwotICAgICAgICBlbnN1cmVPdXRPZlJhbmdlKCJkZWYgeCA9ICAzLjQwMjgyMzZlKzM4ZjsiKTsKLQotICAgICAgICBlbnN1cmVJblJhbmdlKCAgICJkZWYgeCA9IC0zLjQwMjgyMzVlKzM4ZjsiKTsKLSAgICAgICAgZW5zdXJlT3V0T2ZSYW5nZSgiZGVmIHggPSAtMy40MDI4MjM2ZSszOGY7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxJbnRlZ2VyQmFkU3VmZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJkZWYgeCA9IDIxNDc0ODM2NDhKOyIsICJEdW1teS5ncm9vdnkiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRvZG8gcHJvYmxlbSBvZiBhbnRsciB0aHJvd24gZXhjZXB0aW9uCi0gICAgICAgICAgICAvL1N5bnRheEV4Y2VwdGlvbiBjYXVzZSA9IGUuZ2V0VW5pdCgpLmdldFN5bnRheEVycm9yKDApOwotICAgICAgICAgICAgLy9pZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2ZhaWwgKCJ4ID0gMjE0NzQ4MzY0OEogc2hvdWxkIGZhaWwgd2l0aCBhbiBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgieCA9IDIxNDc0ODM2NDhKLCBzaG91bGQgZmFpbCBiZWNhdXNlIEogaXMgYW4gaW52YWxpZCBudW1lcmljIGxpdGVyYWwgc3VmZml4LiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsQmFkRXhwb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gcGFyc2UoImRlZiB4ID0gMi4zZTsiLCAiRHVtbXkuZ3Jvb3Z5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0b2RvIHByb2JsZW0gb2YgYW50bHIgdGhyb3duIGV4Y2VwdGlvbgotICAgICAgICAgICAgLy9TeW50YXhFeGNlcHRpb24gY2F1c2UgPSBlLmdldFVuaXQoKS5nZXRTeW50YXhFcnJvcigwKTsKLSAgICAgICAgICAgIC8vaWYgKGNhdXNlIGluc3RhbmNlb2YgVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9mYWlsICgieCA9IDIuM2Ugc2hvdWxkIGZhaWwgd2l0aCBhbiBVbmV4cGVjdGVkQ2hhcmFjdGVyRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgieCA9IDIuM2UsIHNob3VsZCBmYWlsIGJlY2F1c2Ugbm8gZXhwb25lbnQgaXMgc3BlY2lmaWVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1vY2tIZWxwZXJNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAiY2hlZXNlIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQmxvY2tTdGF0ZW1lbnQgZ2V0Q29kZShNb2R1bGVOb2RlIG1vZHVsZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSBnZXRNZXRob2QobW9kdWxlLCBuYW1lKTsKLQotICAgICAgICBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnQgPSAoQmxvY2tTdGF0ZW1lbnQpIG1ldGhvZC5nZXRDb2RlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3RhdGVtZW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kTm9kZSBnZXRNZXRob2QoTW9kdWxlTm9kZSBtb2R1bGUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgY291bnQiLCAxLCBtb2R1bGUuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgQ2xhc3NOb2RlIG5vZGUgPSAoQ2xhc3NOb2RlKSBtb2R1bGUuZ2V0Q2xhc3NlcygpLmdldCgwKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOwotCi0gICAgICAgIExpc3QgbWV0aG9kcyA9IG5vZGUuZ2V0RGVjbGFyZWRNZXRob2RzKG5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKG1ldGhvZHMuc2l6ZSgpID4gMCk7Ci0gICAgICAgIHJldHVybiAoTWV0aG9kTm9kZSkgbWV0aG9kcy5nZXQoMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQWJzdHJhY3RNZXRob2RDaGVja1Rlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL0Fic3RyYWN0TWV0aG9kQ2hlY2tUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZTRlYzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQWJzdHJhY3RNZXRob2RDaGVja1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0KLQotLyoKLWludGVyZmFjZSBDb21wYXJhYmxlIHsgaW50IGNvbXBhcmVUbyhPYmplY3Qgbyk7IH0KLWFic3RyYWN0IGNsYXNzIEdTdHJpbmcgeyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRTdHJpbmdzKCk7IH0KLWludGVyZmFjZSBDaGFyU2VxdWVuY2UgewotICAgIGNoYXIgY2hhckF0KGludCk7ICBpbnQgbGVuZ3RoKCk7ICBDaGFyU2VxdWVuY2Ugc3Vic2VxdWVuY2UoaW50LCBpbnQpOyAgU3RyaW5nIHRvU3RyaW5nKCkKLX0KLQotYWJzdHJhY3QgIGNsYXNzIEFic3RyYWN0TGlzdDogeyBhYnN0cmFjdCBPYmplY3QgZ2V0KGludCBpbmRleCk7IGFic3RyYWN0IGludCBzaXplKCk7IH0KLQotKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ0NsYXNzRXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlJ1bnRpbWVJbmNvbXBsZXRlQ2xhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE1ldGhvZENoZWNrVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotCi0gICAgLyoqCi0gICAgICogR1N0cmluZyBsaXRlcmFscyBnZW5lcmF0ZSBhbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2hpY2ggCi0gICAgICogYWRkcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3RyaW5ncygpCi0gICAgICogbWV0aG9kLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5vbnltb3VzR1N0cmluZ0Fic3RyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JR3Jvb3Z5T2JqZWN0IG9iamVjdCA9Ci0JICAgIGFzc2VydENvbXBpbGVXb3JrcygKLSAgICAgICAgICAgICAgICJjbGFzcyBHU3RyaW5nVGVzdCB7XG4iICsKLSAgICAgICAgICAgICAgICIgICAgcHVibGljIGdyb292eS5sYW5nLkdTdHJpbmcgdGVzdEdTdHJpbmdBYnN0cmFjdChJbnRlZ2VyIHgsIEludGVnZXIgeSkge1xuIiArIAotICAgICAgICAgICAgICAgIiAgICAgICByZXR1cm4gXCJHU3RyaW5nVGVzdCBvZiAke3h9IGFuZCAke3l9XCJcbiIgKwotICAgICAgICAgICAgICAgIiAgICB9XG4iICsKLSAgICAgICAgICAgICAgICJ9XG4iKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZUNvbXBhcmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlHcm9vdnlPYmplY3Qgb2JqZWN0ID0KLQkgICAgYXNzZXJ0Q29tcGlsZVdvcmtzKAotCSAgICAgImNsYXNzIENvbXBhcmFibGVUZXN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUge1xuIiArCi0JICAgICAiICAgIGludCBjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCBvKSB7XG4iICsKLQkgICAgICIJcmV0dXJuIDA7XG4iICsKLQkgICAgICIgICAgfVxuIiArCi0JICAgICAifVxuIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZUNoYXJTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCS8vIFNob3VsZCBnZW5lcmF0ZSBhbiBlcnJvciBmb3Igbm90IGltcGxlbWVudGluZyBzdWJzZXF1ZW5jZQotCU1pc3NpbmdDbGFzc0V4Y2VwdGlvbiBlID0KLQkgICAgYXNzZXJ0Q29tcGlsZUZhaWxlZCgKLSAgICAgICAgICAgImNsYXNzIEluY29tcGxldGVDaGFyU2VxdWVuY2VUZXN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSB7XG4iICsKLQkgICAgICAgIiAgICBjaGFyIGNoYXJBdChpbnQgcG9zKSB7XG4iICsKLQkgICAgICAgIglyZXR1cm4gJ2EnO1xuIiArCi0JICAgICAgICIgICAgfVxuIiArCi0JICAgICAgICJcbiIgKwotCSAgICAgICAiICAgIGludCBsZW5ndGgoKSB7XG4iICsKLQkgICAgICAgIglyZXR1cm4gNTtcbiIgKwotCSAgICAgICAiICAgIH1cbiIgKwotCSAgICAgICAifVxuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlQ2hhclNlcXVlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JR3Jvb3Z5T2JqZWN0IG9iamVjdCA9Ci0JICAgIGFzc2VydENvbXBpbGVXb3JrcygKLSAgICAgICAgICAgICAgImNsYXNzIENvbXBsZXRlQ2hhclNlcXVlbmNlVGVzdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2Uge1xuIiArCi0JICAgICAgIiAgICBjaGFyIGNoYXJBdChpbnQgcG9zKSB7XG4iICsKLQkgICAgICAiCXJldHVybiAnYSc7XG4iICsKLQkgICAgICAiICAgIH1cbiIgKwotCSAgICAgICJcbiIgKwotCSAgICAgICIgICAgaW50IGxlbmd0aCgpIHtcbiIgKwotCSAgICAgICIJcmV0dXJuIDU7XG4iICsKLQkgICAgICAiICAgIH1cbiIgKwotCSAgICAgICJcbiIgKwotCSAgICAgICIgICBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7XG4iICsKLQkgICAgICAiCXJldHVybiBudWxsO1xuIiArCi0JICAgICAgIiAgICB9XG4iICsKLQkgICAgICAifVxuIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkvLyBTaG91bGQgZ2VuZXJhdGUgYW4gZXJyb3IgZm9yIG5vdCBpbXBsZW1lbnRpbmcgT2JqZWN0IGdldChpbnQpCi0JTWlzc2luZ0NsYXNzRXhjZXB0aW9uIGUgPQotCSAgICBhc3NlcnRDb21waWxlRmFpbGVkKAotICAgICAgICAgICAgICAgImNsYXNzIEluY29tcGxldGVMaXN0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TGlzdCB7XG4iICsKLQkgICAgICAgIiAgICBpbnQgc2l6ZSgpIHsgcmV0dXJuIDA7IH1cbiIgKwotCSAgICAgICAifVxuIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JR3Jvb3Z5T2JqZWN0IG9iamVjdCA9Ci0JICAgIGFzc2VydENvbXBpbGVXb3JrcygKLSAgICAgICAgICAgICAgICJjbGFzcyBDb21wbGV0ZUxpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IHtcbiIgKwotCSAgICAgICAiICAgIGludCBzaXplKCkgeyByZXR1cm4gMDsgfVxuIiArCi0JICAgICAgICIgICAgT2JqZWN0IGdldChpbnQgcG9zKSB7IHJldHVybiBudWxsOyB9XG4iICsKLQkgICAgICAgIn1cbiIpOwotICAgIH0KLQotICAgIAotICAgIHByb3RlY3RlZCBHcm9vdnlPYmplY3QgYXNzZXJ0Q29tcGlsZVdvcmtzKFN0cmluZyBjb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgdHlwZSA9Ci0gICAgICAgICAgICBsb2FkZXIucGFyc2VDbGFzcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29kZS5nZXRCeXRlcygpKSwgIlZhbGlkQ2xhc3NfIiArIGdldE1ldGhvZE5hbWUoKSArICIuZ3Jvb3Z5Iik7Ci0gICAgICAgIHJldHVybiAoR3Jvb3Z5T2JqZWN0KSB0eXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1pc3NpbmdDbGFzc0V4Y2VwdGlvbiBhc3NlcnRDb21waWxlRmFpbGVkKFN0cmluZyBjb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydENvbXBpbGVXb3Jrcyhjb2RlKTsKLQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgRXhjZXB0aW9uIGNhdXNlID0gZS5nZXRVbml0KCkuZ2V0RXhjZXB0aW9uKDApOwotICAgICAgICAgICAgaWYoIGNhdXNlIGluc3RhbmNlb2YgIFJ1bnRpbWVJbmNvbXBsZXRlQ2xhc3NFeGNlcHRpb24gKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZWQsIHRocmV3OiAiICsgY2F1c2UpOwotICAgICAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9DU1ROb2RlVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQ1NUTm9kZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkZGUxMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9DU1ROb2RlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotCi1wdWJsaWMgY2xhc3MgQ1NUTm9kZVRlc3QKLSAgICBleHRlbmRzIEdyb292eVRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpCi0gICAgewotICAgIH0KLSAgICAKLS8qCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdF9EZWZhdWx0KCkKLSAgICB7Ci0gICAgICAgIENTVE5vZGUgbm9kZSA9IG5ldyBDU1ROb2RlKCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbCggbm9kZS5nZXRUb2tlbigpICk7Ci0KLSAgICAgICAgYXNzZXJ0TGVuZ3RoKCAwLAotICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q2hpbGRyZW4oKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RfV2l0aFRva2VuKCkKLSAgICB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uaWRlbnRpZmllciggMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiICk7Ci0KLSAgICAgICAgQ1NUTm9kZSBub2RlID0gbmV3IENTVE5vZGUoIHRva2VuICk7Ci0KLSAgICAgICAgYXNzZXJ0U2FtZSggdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0VG9rZW4oKSApOwotCi0gICAgICAgIGFzc2VydExlbmd0aCggMCwKLSAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENoaWxkcmVuKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgQ1NUTm9kZSBub2RlID0gbmV3IENTVE5vZGUoKTsKLQotICAgICAgICBDU1ROb2RlIGNoaWxkT25lID0gbmV3IENTVE5vZGUoKTsKLSAgICAgICAgQ1NUTm9kZSBjaGlsZFR3byA9IG5ldyBDU1ROb2RlKCk7Ci0KLSAgICAgICAgbm9kZS5hZGRDaGlsZCggY2hpbGRPbmUgKTsKLSAgICAgICAgbm9kZS5hZGRDaGlsZCggY2hpbGRUd28gKTsKLQotICAgICAgICBhc3NlcnRMZW5ndGgoIDIsCi0gICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpICk7Ci0KLSAgICAgICAgYXNzZXJ0U2FtZSggY2hpbGRPbmUsCi0gICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q2hpbGQoIDAgKSApOwotCi0gICAgICAgIGFzc2VydFNhbWUoIGNoaWxkVHdvLAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldENoaWxkKCAxICkgKTsKLQotICAgICAgICBhc3NlcnRTYW1lKCBjaGlsZE9uZSwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpWzBdICk7Ci0KLSAgICAgICAgYXNzZXJ0U2FtZSggY2hpbGRUd28sCi0gICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q2hpbGRyZW4oKVsxXSApOwotICAgIH0KLSovCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9Db21waWxlckVycm9yVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvQ29tcGlsZXJFcnJvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2MmQ4Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9Db21waWxlckVycm9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCi0gKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KLSAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKLSAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKLSAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLSAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ0NsYXNzRXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsZXJFcnJvclRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkNsYXNzQ2F0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWlzc2luZ0NsYXNzRXhjZXB0aW9uIGUgPQotICAgICAgICAgICAgYXNzZXJ0Q29tcGlsZUZhaWxlZF9XaXRoTUNFKAotICAgICAgICAgICAgICAgICJjbGFzcyBVbmtub3duQ2xhc3Mge1xuIgotICAgICAgICAgICAgICAgICAgICArICIgICAgdm9pZCBtYWluKGFyZ3MpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICB0cnkge1xuIgotICAgICAgICAgICAgICAgICAgICArICIgICAgICAgICAgICBwcmludGxuKCdIZWxsbyBXb3JsZCEnKVxuIgotICAgICAgICAgICAgICAgICAgICArICIgICAgICAgIH1cbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICBjYXRjaCAoVW5rbm93bkV4Y2VwdGlvbiBlKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgIHByaW50bG4oJ1RoaXMgd2lsbCBuZXZlciBoYXBwZW4nKVxuIgotICAgICAgICAgICAgICAgICAgICArICIgICAgICAgIH1cbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiICAgIH1cbiIKLSAgICAgICAgICAgICAgICAgICAgKyAifVxuIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmtub3duRXhjZXB0aW9uIiwgZS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duQ2xhc3NJbk5ldygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNaXNzaW5nQ2xhc3NFeGNlcHRpb24gZSA9Ci0gICAgICAgICAgICBhc3NlcnRDb21waWxlRmFpbGVkX1dpdGhNQ0UoCi0gICAgICAgICAgICAgICAgImNsYXNzIFVua25vd25DbGFzcyB7XG4iICsgIiAgICB2b2lkIG1haW4oYXJncykge1xuIiArICIgICAgICAgIGRlZiB4ID0gbmV3IFVua25vd25UaGluZ3koKVxuIiArICIgICAgfVxuIiArICJ9XG4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmtub3duVGhpbmd5IiwgZS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duQ2xhc3NJbkFzc2lnbm1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9Ci0gICAgICAgICAgICBhc3NlcnRDb21waWxlV29ya3MoCi0gICAgICAgICAgICAgICAgImNsYXNzIFVua25vd25DbGFzcyB7XG4iICsgIiAgICB2b2lkIG1haW4oYXJncykge1xuIiArICIgICAgICAgIGRlZiB4ID0gVW5rbm93blRoaW5neVxuIiArICIgICAgfVxuIiArICJ9XG4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgibWFpbiIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIGR1ZSB0byB1bmtub3duIHByb3BlcnR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVua25vd25UaGluZ3kiLCBlLmdldFByb3BlcnR5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiogVE9ETyBub24tdGVybWluYXRlZCBzdHJpbmdzIG9yIEdTdHJpbmdzIGxlYWQgdG8gYW4gdW5kbGVzcyBsb29wIGFuZCB0byBhbiBPdXRPZk1lbW9yeUVycm9yICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZENvbnN0YW50R1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2Fzc2VydENvbXBpbGVGYWlsZWQoICJwcmludGxuIFwiZCIgKTsKLSAgICB9Ci0KLSAgICAvKiogVE9ETyBub24tdGVybWluYXRlZCBzdHJpbmdzIG9yIEdTdHJpbmdzIGxlYWQgdG8gYW4gdW5kbGVzcyBsb29wIGFuZCB0byBhbiBPdXRPZk1lbW9yeUVycm9yICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZEdTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9hc3NlcnRDb21waWxlRmFpbGVkKCAicHJpbnRsbiBcIiR7MSsyXCJcbnByaW50bG4gXCJjXCIiICk7Ci0gICAgfQotCi0KLQotCi0KLSAgICBwcm90ZWN0ZWQgR3Jvb3Z5T2JqZWN0IGFzc2VydENvbXBpbGVXb3JrcyhTdHJpbmcgY29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIHR5cGUgPQotICAgICAgICAgICAgbG9hZGVyLnBhcnNlQ2xhc3MobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGUuZ2V0Qnl0ZXMoKSksICJWYWxpZENsYXNzXyIgKyBnZXRNZXRob2ROYW1lKCkgKyAiLmdyb292eSIpOwotICAgICAgICByZXR1cm4gKEdyb292eU9iamVjdCkgdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNaXNzaW5nQ2xhc3NFeGNlcHRpb24gYXNzZXJ0Q29tcGlsZUZhaWxlZF9XaXRoTUNFKFN0cmluZyBjb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydENvbXBpbGVXb3Jrcyhjb2RlKTsKLQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgRXhjZXB0aW9uIGNhdXNlID0gZS5nZXRVbml0KCkuZ2V0RXhjZXB0aW9uKDApOwotICAgICAgICAgICAgaWYoIGNhdXNlIGluc3RhbmNlb2YgTWlzc2luZ0NsYXNzRXhjZXB0aW9uICkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VkLCB0aHJldzogIiArIGNhdXNlKTsKLSAgICAgICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNaXNzaW5nQ2xhc3NFeGNlcHRpb24pY2F1c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBhc3NlcnRDb21waWxlRmFpbGVkKFN0cmluZyBjb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydENvbXBpbGVXb3Jrcyhjb2RlKTsKLSAKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9QYXJzZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9QYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjEyZGYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvUGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlcjsKLQotaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OwotCi0vKgotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LmxleGVyLkNoYXJTdHJlYW07Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgubGV4ZXIuU3RyaW5nQ2hhclN0cmVhbTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlci5MZXhlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlci5MZXhlclRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRXhjZXB0aW9uQ29sbGVjdG9yOwotKi8KLQotcHVibGljIGNsYXNzIFBhcnNlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgIHByaXZhdGUgaW50IHRvbGVyYW5jZSA9IDA7Ci0KLQotICAgLyoqCi0gICAgKiBUaGlzIHRlc3QgY2FzZSBwZXJmb3JtcyB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgaW50ZXJhY3RpdmUgc2hlbGwgdG8KLSAgICAqIGRlY2lkZSBpZiBhIHN0YXRlbWVudCBpcyBjb21wbGV0ZSBvciBub3QKLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdFBhcnNlclRocm93c1RoZVJpZ2h0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIENoZWVzZSB7IjsKLSAgICAgICAgU291cmNlVW5pdCBwYXJzZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSBTb3VyY2VVbml0LmNyZWF0ZSgiZ3Jvb3Z5c2ggc2NyaXB0IiwgY29kZSwgdG9sZXJhbmNlKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZSgpOwotICAgICAgICAgICAgcGFyc2VyLmdldENTVCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJQYXJzZXIgc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggVW5leHBlY3RlZCBFT0YgZmxhZyIsIHBhcnNlci5mYWlsZWRXaXRoVW5leHBlY3RlZEVPRigpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlBhcnNlciBzaG91bGQgaGF2ZSBhbiBlcnJvciBjb3VudCBvZiAxIG9yIGxlc3MiLCBwYXJzZXIuZ2V0RXJyb3JDb3VudCgpIDw9IDEpOwotICAgICAgICB9Ci0gICAgfQotCi0KLS8qCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotICAgIC8vICAgICBwYWNrYWdlCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U2NyaXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoIiIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcm9vdC5nZXRUb2tlbigpKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm9vdDogIiArIHJvb3QpOwotICAgICAgICB7Ci0gICAgICAgICAgICBDU1ROb2RlIGNoaWxkID0gcm9vdC5nZXRDaGlsZCgwKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGlsZDogIisgY2hpbGQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL2Fzc2VydEVxdWFscyhudWxsLCBjaGlsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZURlY2xhcmF0aW9uX05vRG90cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJwYWNrYWdlIGNoZWVzZSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5wYWNrYWdlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwYWNrYWdlIiwgVG9rZW4uS0VZV09SRF9QQUNLQUdFLCAxKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRGVjbGFyYXRpb25fT25lRG90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoInBhY2thZ2UgY2hlZXNlLnRvYXN0Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnBhY2thZ2VEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgInBhY2thZ2UiLCBUb2tlbi5LRVlXT1JEX1BBQ0tBR0UsIDEpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgIi4iLCBUb2tlbi5ET1QsIDIpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMSksICJ0b2FzdCIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VEZWNsYXJhdGlvbl9NdWx0aXBsZURvdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigicGFja2FnZSBjaGVkZGFyLmNoZWVzZS50b2FzdCIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5wYWNrYWdlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwYWNrYWdlIiwgVG9rZW4uS0VZV09SRF9QQUNLQUdFLCAxKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICIuIiwgVG9rZW4uRE9ULCAyKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKSwgIi4iLCBUb2tlbi5ET1QsIDIpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLmdldENoaWxkKDApLCAiY2hlZGRhciIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKS5nZXRDaGlsZCgxKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgxKSwgInRvYXN0IiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZURlY2xhcmF0aW9uX1VuZXhwZWN0ZWRUb2tlbl9Ob0luaXRpYWxJZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoInBhY2thZ2UgLiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5wYWNrYWdlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uQ29sbGVjdG9yIGUgKSB7Ci0gICAgICAgICAgICAgICAgZS50aHJvd0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgICAgICBhc3NlcnRUb2tlbihlLmdldFVuZXhwZWN0ZWRUb2tlbigpLCAiLiIsIFRva2VuLkRPVCk7Ci0KLSAgICAgICAgICAgIGFzc2VydExlbmd0aCgxLCBlLmdldEV4cGVjdGVkVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKFRva2VuLklERU5USUZJRVIsIGUuZ2V0RXhwZWN0ZWRUeXBlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRGVjbGFyYXRpb25fVW5leHBlY3RlZFRva2VuX05vSWRlbnRpZmllckZvbGxvd2luZ0RvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJwYWNrYWdlIGNoZWVzZS4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJzZXIucGFja2FnZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbkNvbGxlY3RvciBlICkgewotICAgICAgICAgICAgICAgIGUudGhyb3dGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAotICAgICAgICAgICAgYXNzZXJ0TnVsbChlLmdldFVuZXhwZWN0ZWRUb2tlbigpKTsKLQotICAgICAgICAgICAgYXNzZXJ0TGVuZ3RoKDEsIGUuZ2V0RXhwZWN0ZWRUeXBlcygpKTsKLQotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoVG9rZW4uSURFTlRJRklFUiwgZS5nZXRFeHBlY3RlZFR5cGVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotICAgIC8vICAgICBpbXBvcnQKLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U3RhdGVtZW50X05vRG90cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgQ2hlZXNlIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmltcG9ydFN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImltcG9ydCIsIFRva2VuLktFWVdPUkRfSU1QT1JULCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiQ2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U3RhdGVtZW50X0FzX05vRG90cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgQ2hlZXNlIGFzIFRvYXN0Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmltcG9ydFN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImltcG9ydCIsIFRva2VuLktFWVdPUkRfSU1QT1JULCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiQ2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKS5nZXRDaGlsZCgwKSwgIlRvYXN0IiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U3RhdGVtZW50X09uZURvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgY2hlZXNlLlRvYXN0Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmltcG9ydFN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImltcG9ydCIsIFRva2VuLktFWVdPUkRfSU1QT1JULCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgIlRvYXN0IiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U3RhdGVtZW50X0FzX09uZURvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgY2hlZXNlLlRvYXN0IGFzIEJyZWFkIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmltcG9ydFN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImltcG9ydCIsIFRva2VuLktFWVdPUkRfSU1QT1JULCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiVG9hc3QiLCBUb2tlbi5JREVOVElGSUVSLCAxKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLmdldENoaWxkKDApLCAiQnJlYWQiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTdGF0ZW1lbnRfTXVsdGlwbGVEb3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImltcG9ydCBjaGVkZGFyLmNoZWVzZS5Ub2FzdCIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5pbXBvcnRTdGF0ZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJpbXBvcnQiLCBUb2tlbi5LRVlXT1JEX0lNUE9SVCwgMik7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLCAiLiIsIFRva2VuLkRPVCwgMik7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAiY2hlZGRhciIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgxKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJUb2FzdCIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFN0YXRlbWVudF9Bc19NdWx0aXBsZURvdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiaW1wb3J0IGNoZWRkYXIuY2hlZXNlLlRvYXN0IGFzIEJyZWFkIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmltcG9ydFN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImltcG9ydCIsIFRva2VuLktFWVdPUkRfSU1QT1JULCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICIuIiwgVG9rZW4uRE9ULCAyKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCksICJjaGVkZGFyIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgIlRvYXN0IiwgVG9rZW4uSURFTlRJRklFUiwgMSk7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSkuZ2V0Q2hpbGQoMCksICJCcmVhZCIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFN0YXRlbWVudF9VbmV4cGVjdGVkVG9rZW5fTm9Jbml0aWFsSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgLiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5pbXBvcnRTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uQ29sbGVjdG9yIGUgKSB7Ci0gICAgICAgICAgICAgICAgZS50aHJvd0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgICAgICBhc3NlcnRUb2tlbihlLmdldFVuZXhwZWN0ZWRUb2tlbigpLCAiLiIsIFRva2VuLkRPVCk7Ci0KLSAgICAgICAgICAgIGFzc2VydExlbmd0aCgxLCBlLmdldEV4cGVjdGVkVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKFRva2VuLklERU5USUZJRVIsIGUuZ2V0RXhwZWN0ZWRUeXBlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTdGF0ZW1lbnRfVW5leHBlY3RlZFRva2VuX05vSWRlbnRpZmllckZvbGxvd2luZ0RvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJpbXBvcnQgY2hlZXNlLiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5pbXBvcnRTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uQ29sbGVjdG9yIGUgKSB7Ci0gICAgICAgICAgICAgICAgZS50aHJvd0ZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGUuZ2V0VW5leHBlY3RlZFRva2VuKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRMZW5ndGgoMSwgZS5nZXRFeHBlY3RlZFR5cGVzKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRDb250YWlucyhUb2tlbi5JREVOVElGSUVSLCBlLmdldEV4cGVjdGVkVHlwZXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0gICAgLy8gICAgIGNsYXNzCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzRGVjbGFyYXRpb25fTm9Nb2RpZmllcnNfTm9Cb2R5X05vRXh0ZW5kc09ySW1wbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjbGFzcyBDaGVlc2UgeyB9Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSBtb2RpZmllcnMgPSBuZXcgQ1NUTm9kZSgpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5jbGFzc0RlY2xhcmF0aW9uKG1vZGlmaWVycyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAiY2xhc3MiLCBUb2tlbi5LRVlXT1JEX0NMQVNTLCA1KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRTYW1lKG1vZGlmaWVycywgcm9vdC5nZXRDaGlsZCgwKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgIkNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDIpLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoNCksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzRGVjbGFyYXRpb25fTm9JZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImNsYXNzIHsiKTsKLQotICAgICAgICBDU1ROb2RlIG1vZGlmaWVycyA9IG5ldyBDU1ROb2RlKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLmNsYXNzRGVjbGFyYXRpb24obW9kaWZpZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb25Db2xsZWN0b3IgZSApIHsKLSAgICAgICAgICAgICAgICBlLnRocm93Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmV4cGVjdGVkVG9rZW5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgYW5kIGNvcnJlY3QKLSAgICAgICAgICAgIGFzc2VydFRva2VuKGUuZ2V0VW5leHBlY3RlZFRva2VuKCksICJ7IiwgVG9rZW4uTEVGVF9DVVJMWV9CUkFDRSk7Ci0KLSAgICAgICAgICAgIGFzc2VydExlbmd0aCgxLCBlLmdldEV4cGVjdGVkVHlwZXMoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKFRva2VuLklERU5USUZJRVIsIGUuZ2V0RXhwZWN0ZWRUeXBlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKLSAgICAvLyAgICAgaW50ZXJmYWNlCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotCi0gICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZURlY2xhcmF0aW9uX05vTW9kaWZpZXJzX05vQm9keV9Ob0V4dGVuZHNPckltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiaW50ZXJmYWNlIENoZWVzZSB7IH0iKTsKLQotICAgICAgICBDU1ROb2RlIG1vZGlmaWVycyA9IG5ldyBDU1ROb2RlKCk7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmludGVyZmFjZURlY2xhcmF0aW9uKG1vZGlmaWVycyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAiaW50ZXJmYWNlIiwgVG9rZW4uS0VZV09SRF9JTlRFUkZBQ0UsIDUpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydFNhbWUobW9kaWZpZXJzLCByb290LmdldENoaWxkKDApKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiQ2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMiksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotICAgIC8vICAgICA8dHlwZSBkZWNsYXJhdGlvbj4KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uX0NsYXNzX05vTW9kaWZpZXJzX05vQm9keV9Ob0V4dGVuZHNPckltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiY2xhc3MgQ2hlZXNlIHsgfSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci50eXBlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJjbGFzcyIsIFRva2VuLktFWVdPUkRfQ0xBU1MsIDUpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDApOwotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJDaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMyksIDApOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDQpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25fQ2xhc3NfV2l0aE1vZGlmaWVyc19Ob0JvZHlfTm9FeHRlbmRzT3JJbXBsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoInB1YmxpYyBjbGFzcyBDaGVlc2UgeyB9Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnR5cGVEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImNsYXNzIiwgVG9rZW4uS0VZV09SRF9DTEFTUywgNSk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgMSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAicHVibGljIiwgVG9rZW4uS0VZV09SRF9QVUJMSUMsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJDaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMyksIDApOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDQpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25fSW50ZXJmYWNlX05vTW9kaWZpZXJzX05vQm9keV9Ob0V4dGVuZHNPckltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiaW50ZXJmYWNlIENoZWVzZSB7IH0iKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIudHlwZURlY2xhcmF0aW9uKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAiaW50ZXJmYWNlIiwgVG9rZW4uS0VZV09SRF9JTlRFUkZBQ0UsIDUpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDApOwotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJDaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uX0ludGVyZmFjZV9XaXRoTW9kaWZpZXJzX05vQm9keV9Ob0V4dGVuZHNPckltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigicHVibGljIGludGVyZmFjZSBDaGVlc2UgeyB9Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnR5cGVEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgImludGVyZmFjZSIsIFRva2VuLktFWVdPUkRfSU5URVJGQUNFLCA1KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAxKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCksICJwdWJsaWMiLCBUb2tlbi5LRVlXT1JEX1BVQkxJQywgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgIkNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDIpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotLyogICAgLyoKLSAgICAKLSAgICBUaGUgZm9sbG93aW5nIGlzIGFjdHVhbGx5IG5vdyB2YWxpZC4uLgotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25fVW5leHBlY3RlZFRva2VuKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlciggImNoZWVzZSIgKTsKLSAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnR5cGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGZhaWwoICJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZFRva2VuRXhjZXB0aW9uIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbkNvbGxlY3RvciBlICkgewotICAgICAgICAgICAgICAgIGUudGhyb3dGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRUb2tlbiggZS5nZXRUb2tlbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLklERU5USUZJRVIgKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydExlbmd0aCggMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRFeHBlY3RlZFR5cGVzKCkgKTsKLSAgICAKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCBUb2tlbi5LRVlXT1JEX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0RXhwZWN0ZWRUeXBlcygpICk7Ci0gICAgCi0gICAgICAgICAgICBhc3NlcnRDb250YWlucyggVG9rZW4uS0VZV09SRF9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRFeHBlY3RlZFR5cGVzKCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotLyoKLQotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKLSAgICAvLyAgICAgPGNvbXBpbGF0aW9uIHVuaXQ+Ci0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uVW5pdF9Ob0ltcG9ydHNfT25lQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigicGFja2FnZSBjaGVlc2U7IHB1YmxpYyBjbGFzcyBDaGVlc2V7fSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKLQotICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJwYWNrYWdlIiwgVG9rZW4uS0VZV09SRF9QQUNLQUdFLCAxKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDEpLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDIpLCAiY2xhc3MiLCBUb2tlbi5LRVlXT1JEX0NMQVNTLCA1KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvblVuaXRfTm9JbXBvcnRzX09uZUludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJwYWNrYWdlIGNoZWVzZTsgcHVibGljIGludGVyZmFjZSBDaGVlc2V7fSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKLQotICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJwYWNrYWdlIiwgVG9rZW4uS0VZV09SRF9QQUNLQUdFLCAxKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDEpLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDIpLCAiaW50ZXJmYWNlIiwgVG9rZW4uS0VZV09SRF9JTlRFUkZBQ0UsIDUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uVW5pdF9XaXRoSW1wb3J0c19PbmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJwYWNrYWdlIGNoZWVzZTsgaW1wb3J0IGNvbS5Ub2FzdDsgaW1wb3J0IGNvbS5KZWxseTsgcHVibGljIGNsYXNzIENoZWVzZXt9Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmNvbXBpbGF0aW9uVW5pdCgpOwotCi0gICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QsIDMpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgInBhY2thZ2UiLCBUb2tlbi5LRVlXT1JEX1BBQ0tBR0UsIDEpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMSksIDIpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLmdldENoaWxkKDApLCAiaW1wb3J0IiwgVG9rZW4uS0VZV09SRF9JTVBPUlQsIDIpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLmdldENoaWxkKDEpLCAiaW1wb3J0IiwgVG9rZW4uS0VZV09SRF9JTVBPUlQsIDIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMiksICJjbGFzcyIsIFRva2VuLktFWVdPUkRfQ0xBU1MsIDUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uVW5pdF9XaXRoSW1wb3J0c19Ud29DbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgbmV3UGFyc2VyKCJwYWNrYWdlIGNoZWVzZTsgaW1wb3J0IGNvbS5Ub2FzdDsgaW1wb3J0IGNvbS5KZWxseTsgcHVibGljIGNsYXNzIENoZWVzZXt9IHB1YmxpYyBjbGFzcyBHb29iZXIge30iKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuY29tcGlsYXRpb25Vbml0KCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdCwgNCk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLCAicGFja2FnZSIsIFRva2VuLktFWVdPUkRfUEFDS0FHRSwgMSk7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgMik7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSkuZ2V0Q2hpbGQoMCksICJpbXBvcnQiLCBUb2tlbi5LRVlXT1JEX0lNUE9SVCwgMik7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSkuZ2V0Q2hpbGQoMSksICJpbXBvcnQiLCBUb2tlbi5LRVlXT1JEX0lNUE9SVCwgMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgImNsYXNzIiwgVG9rZW4uS0VZV09SRF9DTEFTUywgNSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDIpLmdldENoaWxkKDEpLCAiQ2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgImNsYXNzIiwgVG9rZW4uS0VZV09SRF9DTEFTUywgNSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDMpLmdldENoaWxkKDEpLCAiR29vYmVyIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0gICAgLy8gICAgIDxib2R5IHN0YXRlbWVudD4KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keVN0YXRlbWVudF9Qcm9wZXJ0eURlY2xhcmF0aW9uX05vTW9kaWZpZXJzX05vVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJwcm9wZXJ0eSBjaGVlc2U7Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmJvZHlTdGF0ZW1lbnQoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDogIiArIHJvb3QpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgInByb3BlcnR5IiwgVG9rZW4uS0VZV09SRF9QUk9QRVJUWSwgMyk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDIpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb2R5U3RhdGVtZW50X1Byb3BlcnR5RGVjbGFyYXRpb25fT25lTW9kaWZpZXJfTm9UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoInN0YXRpYyBwcm9wZXJ0eSBjaGVlc2U7Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmJvZHlTdGF0ZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFksIDMpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDEpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAic3RhdGljIiwgVG9rZW4uS0VZV09SRF9TVEFUSUMsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keVN0YXRlbWVudF9Qcm9wZXJ0eURlY2xhcmF0aW9uX1R3b01vZGlmaWVyc19Ob1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigic3RhdGljIHN5bmNocm9uaXplZCBwcm9wZXJ0eSBjaGVlc2U7Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmJvZHlTdGF0ZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFksIDMpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDIpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAic3RhdGljIiwgVG9rZW4uS0VZV09SRF9TVEFUSUMsIDApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDEpLCAic3luY2hyb25pemVkIiwgVG9rZW4uS0VZV09SRF9TWU5DSFJPTklaRUQsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keVN0YXRlbWVudF9Qcm9wZXJ0eURlY2xhcmF0aW9uX05vUHJvcGVydHlfTm9Nb2RpZmllcnNfTm9UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImNoZWVzZTsiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuYm9keVN0YXRlbWVudCgpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290OiAiICsgcm9vdCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAicHJvcGVydHkiLCBUb2tlbi5LRVlXT1JEX1BST1BFUlRZLCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMiksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvZHlTdGF0ZW1lbnRfUHJvcGVydHlEZWNsYXJhdGlvbl9Ob1Byb3BlcnR5X09uZU1vZGlmaWVyX05vVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJzdGF0aWMgY2hlZXNlOyIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5ib2R5U3RhdGVtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAicHJvcGVydHkiLCBUb2tlbi5LRVlXT1JEX1BST1BFUlRZLCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAxKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKSwgInN0YXRpYyIsIFRva2VuLktFWVdPUkRfU1RBVElDLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMiksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvZHlTdGF0ZW1lbnRfUHJvcGVydHlEZWNsYXJhdGlvbl9Ob1Byb3BlcnR5X1R3b01vZGlmaWVyc19Ob1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigic3RhdGljIHN5bmNocm9uaXplZCBjaGVlc2U7Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmJvZHlTdGF0ZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFksIDMpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDIpOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAic3RhdGljIiwgVG9rZW4uS0VZV09SRF9TVEFUSUMsIDApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDEpLCAic3luY2hyb25pemVkIiwgVG9rZW4uS0VZV09SRF9TWU5DSFJPTklaRUQsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keVN0YXRlbWVudF9Qcm9wZXJ0eURlY2xhcmF0aW9uX05vVHlwZV9XaXRoRXhwcmVzc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjaGVlc2UgPSAxMjM0Iik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmJvZHlTdGF0ZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFksIDQpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMCksIDApOwotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgIjEyMzQiLCBUb2tlbi5JTlRFR0VSX05VTUJFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keVN0YXRlbWVudF9Qcm9wZXJ0eURlY2xhcmF0aW9uX1R5cGVfV2l0aEV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiRm9vZCBjaGVlc2UgPSBkZWZhdWx0VmFsdWUoKSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5ib2R5U3RhdGVtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAicHJvcGVydHkiLCBUb2tlbi5LRVlXT1JEX1BST1BFUlRZLCA0KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgIkZvb2QiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDMpLCAiKCIsIFRva2VuLkxFRlRfUEFSRU5USEVTSVMsIDMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvZHlTdGF0ZW1lbnRfTWV0aG9kRGVjbGFyYXRpb25fTm9SZXR1cm5UeXBlX05vUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjaGVlc2VJdCgpIHsgfSAiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuYm9keVN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIjxzeW50aGV0aWM+IiwgVG9rZW4uU1lOVEhfTUVUSE9ELCA2KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlSXQiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgIigiLCBUb2tlbi5MRUZUX1BBUkVOVEhFU0lTLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb2R5U3RhdGVtZW50X01ldGhvZERlY2xhcmF0aW9uX1dpdGhSZXR1cm5UeXBlX05vUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJTdHJpbmcgY2hlZXNlSXQoKSB7IH0iKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuYm9keVN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIjxzeW50aGV0aWM+IiwgVG9rZW4uU1lOVEhfTUVUSE9ELCA2KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlSXQiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDIpLCAiU3RyaW5nIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgIigiLCBUb2tlbi5MRUZUX1BBUkVOVEhFU0lTLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKLSAgICAvLyAgICAgPHBhcmFtZXRlcj4KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbldpdGhvdXREYXRhdHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjaGVlc2UiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIucGFyYW1ldGVyRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICI8c3ludGhldGljPiIsIFRva2VuLlNZTlRIX1BBUkFNRVRFUl9ERUNMQVJBVElPTiwgMik7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckRlY2xhcmF0aW9uV2l0aERhdGF0eXBlX1NpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJTdHJpbmcgY2hlZXNlIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnBhcmFtZXRlckRlY2xhcmF0aW9uKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAiPHN5bnRoZXRpYz4iLCBUb2tlbi5TWU5USF9QQVJBTUVURVJfREVDTEFSQVRJT04sIDIpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKSwgIlN0cmluZyIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMSksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbldpdGhEYXRhdHlwZV9RdWFsaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiamF2YS5sYW5nLlN0cmluZyBjaGVlc2UiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIucGFyYW1ldGVyRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICI8c3ludGhldGljPiIsIFRva2VuLlNZTlRIX1BBUkFNRVRFUl9ERUNMQVJBVElPTiwgMik7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLCAiLiIsIFRva2VuLkRPVCwgMik7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDApLCAiLiIsIFRva2VuLkRPVCwgMik7Ci0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKS5nZXRDaGlsZCgwKSwgImphdmEiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMSksICJsYW5nIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDEpLCAiU3RyaW5nIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgImNoZWVzZSIsIFRva2VuLklERU5USUZJRVIsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckRlY2xhcmF0aW9uX0dlbmVyYWxfV2l0aG91dERhdGF0eXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImNoZWVzZSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5wYXJhbWV0ZXJEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIjxzeW50aGV0aWM+IiwgVG9rZW4uU1lOVEhfUEFSQU1FVEVSX0RFQ0xBUkFUSU9OLCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyRGVjbGFyYXRpb25fR2VuZXJhbF9XaXRoRGF0YXR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiU3RyaW5nIGNoZWVzZSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5wYXJhbWV0ZXJEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIjxzeW50aGV0aWM+IiwgVG9rZW4uU1lOVEhfUEFSQU1FVEVSX0RFQ0xBUkFUSU9OLCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJTdHJpbmciLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0gICAgLy8gICAgIDxwYXJhbWV0ZXIgbGlzdD4KLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyTGlzdF9FbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCIiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIucGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdCwgMCk7Ci0gICAgfQotCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotICAgIC8vICAgICBtZXRob2QKLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kX05vTW9kaWZpZXJzX05vUmV0dXJuVHlwZV9Ob1BhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiY2hlZXNlSXQoKSB7IH0iKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuYm9keVN0YXRlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIjxzeW50aGV0aWM+IiwgVG9rZW4uU1lOVEhfTUVUSE9ELCA2KTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlSXQiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbE5vZGUocm9vdC5nZXRDaGlsZCgyKSwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgzKSwgIigiLCBUb2tlbi5MRUZUX1BBUkVOVEhFU0lTLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKLSAgICAvLyAgICAgcHJvcGVydHkKLSAgICAvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlfTm9Nb2RpZmllcnNfTm9UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoInByb3BlcnR5IGNoZWVzZSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5ib2R5U3RhdGVtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAicHJvcGVydHkiLCBUb2tlbi5LRVlXT1JEX1BST1BFUlRZLCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMiksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5X05vTW9kaWZpZXJzX05vUHJvcGVydHlfTm9UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImNoZWVzZSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5ib2R5U3RhdGVtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAicHJvcGVydHkiLCBUb2tlbi5LRVlXT1JEX1BST1BFUlRZLCAzKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsTm9kZShyb290LmdldENoaWxkKDApLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGxOb2RlKHJvb3QuZ2V0Q2hpbGQoMiksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgICgobWlzYykpCi0gICAgLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAotCi0gICAgcHVibGljIHZvaWQgdGVzdElzTW9kaWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShUb2tlbi5pc01vZGlmaWVyKFRva2VuLktFWVdPUkRfUFVCTElDKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVG9rZW4uaXNNb2RpZmllcihUb2tlbi5LRVlXT1JEX1BST1RFQ1RFRCkpOwotICAgICAgICBhc3NlcnRUcnVlKFRva2VuLmlzTW9kaWZpZXIoVG9rZW4uS0VZV09SRF9QUklWQVRFKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVG9rZW4uaXNNb2RpZmllcihUb2tlbi5LRVlXT1JEX1NUQVRJQykpOwotICAgICAgICBhc3NlcnRUcnVlKFRva2VuLmlzTW9kaWZpZXIoVG9rZW4uS0VZV09SRF9GSU5BTCkpOwotICAgICAgICBhc3NlcnRUcnVlKFRva2VuLmlzTW9kaWZpZXIoVG9rZW4uS0VZV09SRF9TWU5DSFJPTklaRUQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVG9rZW4uaXNNb2RpZmllcihUb2tlbi5JREVOVElGSUVSKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWVVbnRpbF9Gb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjaGVlc2UgdG9hc3QgaXM7IGJyZWFkIik7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4ocGFyc2VyLmxhKCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSKTsKLQotICAgICAgICBwYXJzZXIuY29uc3VtZVVudGlsKFRva2VuLlNFTUlDT0xPTik7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4ocGFyc2VyLmxhKCksICJicmVhZCIsIFRva2VuLklERU5USUZJRVIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdW1lVW50aWxfTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiY2hlZXNlIHRvYXN0Iik7Ci0KLSAgICAgICAgYXNzZXJ0VG9rZW4ocGFyc2VyLmxhKCksICJjaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSKTsKLQotICAgICAgICBwYXJzZXIuY29uc3VtZVVudGlsKFRva2VuLlNFTUlDT0xPTik7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChwYXJzZXIubGEoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoImFuc3dlciA9IGxpc3QuY29sbGVjdCggeyBpdGVtIHwgcmV0dXJuIGl0ZW0gKiAyIH0gKSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5leHByZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhZmVNZXRob2RDYWxsRXhwcmVzc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJhbnN3ZXIgPSBmb28tPnNvbWVNZXRob2QoKSIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5leHByZXNzaW9uKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6ICIgKyByb290KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9naWNhbEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigieCA+IDEgJiYgXG4geSA8IDIiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuZXhwcmVzc2lvbigpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290OiAiICsgcm9vdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudF9DaGFyYWN0ZXJpemVNZVBsZWFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjYWxsQmxvY2soNSwgeyBvd25lciB8IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0pIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnN0YXRlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRCbG9ja19DaGFyYWN0ZXJpemVNZVBsZWFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0KLSAgICAgICAgICAgIG5ld1BhcnNlcigia2V5cyA9IGFuc3dlci5jb2xsZWN0KCB7IGVudHJ5IHwgcmV0dXJuIGVudHJ5LmtleSB9ICk7IHZhbHVlcyA9IGFuc3dlci5jb2xsZWN0KCB7IGVudHJ5IHwgcmV0dXJuIGVudHJ5LnZhbHVlIH0pIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLnN0YXRlbWVudCgpOwotCi0gICAgICAgIHJvb3QgPSBwYXJzZXIuc3RhdGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudEJsb2NrX01pc3NpbmdTZW1pY29sb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICBuZXdQYXJzZXIoImtleXMgPSBhbnN3ZXIuY29sbGVjdCggeyBlbnRyeSB8IHJldHVybiBlbnRyeS5rZXkgfSApICB2YWx1ZXMgPSBhbnN3ZXIuY29sbGVjdCggeyBlbnRyeSB8IHJldHVybiBlbnRyeS52YWx1ZSB9KSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5zdGF0ZW1lbnQoKTsgCi0gICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbkNvbGxlY3RvciBlICkgewotICAgICAgICAgICAgICAgIGUudGhyb3dGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVuZXhwZWN0ZWRUb2tlbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3RXhwcmVzc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJuZXcgQ2hlZXNlKCkiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIubmV3RXhwcmVzc2lvbigpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIm5ldyIsIFRva2VuLktFWVdPUkRfTkVXLCAyKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICJDaGVlc2UiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiPHN5bnRoZXRpYz4iLCBUb2tlbi5TWU5USF9MSVNULCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhdHlwZV9Ob0RvdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyc2VyIHBhcnNlciA9IG5ld1BhcnNlcigiQ2hlZXNlIik7Ci0KLSAgICAgICAgQ1NUTm9kZSByb290ID0gcGFyc2VyLmRhdGF0eXBlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9kZShyb290LCAiQ2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGF0eXBlX09uZURvdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJjaGVlc2UuVG9hc3QiKTsKLQotICAgICAgICBDU1ROb2RlIHJvb3QgPSBwYXJzZXIuZGF0YXR5cGUoKTsKLQotICAgICAgICBhc3NlcnROb2RlKHJvb3QsICIuIiwgVG9rZW4uRE9ULCAyKTsKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLCAiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vZGUocm9vdC5nZXRDaGlsZCgxKSwgIlRvYXN0IiwgVG9rZW4uSURFTlRJRklFUiwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXR5cGVfVHdvRG90cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCJ0b2FzdC5pcy5CcmVhZCIpOwotCi0gICAgICAgIENTVE5vZGUgcm9vdCA9IHBhcnNlci5kYXRhdHlwZSgpOwotCi0gICAgICAgIGFzc2VydE5vZGUocm9vdCwgIi4iLCBUb2tlbi5ET1QsIDIpOwotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCksICIuIiwgVG9rZW4uRE9ULCAyKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb2RlKHJvb3QuZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCksICJ0b2FzdCIsIFRva2VuLklERU5USUZJRVIsIDApOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDApLmdldENoaWxkKDEpLCAiaXMiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0Tm9kZShyb290LmdldENoaWxkKDEpLCAiQnJlYWQiLCBUb2tlbi5JREVOVElGSUVSLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnROdWxsTm9kZShDU1ROb2RlIG5vZGUsIGludCBudW1DaGlsZHJlbikgewotICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOwotICAgICAgICBhc3NlcnROdWxsKG5vZGUuZ2V0VG9rZW4oKSk7Ci0gICAgICAgIGFzc2VydExlbmd0aChudW1DaGlsZHJlbiwgbm9kZS5nZXRDaGlsZHJlbigpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnROb2RlKENTVE5vZGUgbm9kZSwgU3RyaW5nIHRleHQsIGludCB0eXBlKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobm9kZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobm9kZS5nZXRUb2tlbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRleHQsIG5vZGUuZ2V0VG9rZW4oKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModHlwZSwgbm9kZS5nZXRUb2tlbigpLmdldFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Tm9kZShDU1ROb2RlIG5vZGUsIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSwgaW50IG51bUNoaWxkcmVuKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIk5vZGUgc2hvdWxkIG5vdCBiZSBudWxsISIsIG5vZGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUuZ2V0VG9rZW4oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXh0LCBub2RlLmdldFRva2VuKCkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGUsIG5vZGUuZ2V0VG9rZW4oKS5nZXRUeXBlKCkpOwotICAgICAgICBhc3NlcnRMZW5ndGgobnVtQ2hpbGRyZW4sIG5vZGUuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9rZW4oVG9rZW4gdG9rZW4sIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSkgewotICAgICAgICBhc3NlcnROb3ROdWxsKHRva2VuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRleHQsIHRva2VuLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlLCB0b2tlbi5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQYXJzZXIgbmV3UGFyc2VyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIENoYXJTdHJlYW0gY2hhcnMgPSBuZXcgU3RyaW5nQ2hhclN0cmVhbSh0ZXh0KTsKLSAgICAgICAgTGV4ZXIgbGV4ZXIgPSBuZXcgTGV4ZXIoY2hhcnMpOwotICAgICAgICBUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgTGV4ZXJUb2tlblN0cmVhbShsZXhlcik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBQYXJzZXIodG9rZW5zKTsKLSAgICB9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvUmV0dXJuVHlwZUVycm9yVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvUmV0dXJuVHlwZUVycm9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ5YWIyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL1JldHVyblR5cGVFcnJvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXgucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoYXQgdm9pZC92YWx1ZSByZXR1cm4gbWlzbWF0Y2hlcyBjYW4gYmUgZGV0ZWN0ZWQuCi0gKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQotICovCi1wdWJsaWMgY2xhc3MgUmV0dXJuVHlwZUVycm9yVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVmFsdWVSZXR1cm5TdGF0ZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZG9Db21waWxlKAotICAgCQkJCSJjbGFzcyB6dXAge1xuIgotICAgICAgICAgICAgICAgICsgIiAgICB2b2lkIGZvbygpIHtcbiIKLSAgICAgICAgICAgICAgICArICIgICAgICAgIHJldHVybiAzOyIKLSAgICAgICAgICAgICAgICArICIgICAgfVxuIgotICAgICAgICAgICAgICAgICsgIn1cbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVmFsdWVSZXR1cm5TdGF0ZW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWRvQ29tcGlsZSgKLSAgIAkJCQkiY2xhc3MgenVwIHtcbiIKLSAgICAgICAgICAgICAgICArICIgICAgdm9pZCBmb28oKSB7XG4iCi0gICAgICAgICAgICAgICAgKyAiICAgICAgICBpZiAodHJ1ZSkgXG4iCi0gICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgcmV0dXJuIFxuIgotICAgICAgICAgICAgICAgICsgIiAgICAgICAgZWxzZSBcbiIKLSAgICAgICAgICAgICAgICArICIgICAgICAgICAgICByZXR1cm4gJ0ZvbycgXG4iCi0gICAgICAgICAgICAgICAgKyAiICAgIH1cbiIKLSAgICAgICAgICAgICAgICArICJ9XG4iKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NvbXBpbGUoU3RyaW5nIGNvZGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9hZGVyLnBhcnNlQ2xhc3MobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGUuZ2V0Qnl0ZXMoKSksIGdldE1ldGhvZE5hbWUoKSArICIuZ3Jvb3Z5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSApIHsKLQkJCWlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBSdW50aW1lUGFyc2VyRXhjZXB0aW9uKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgYSBSdW50aW1lUGFyc2VyRXhjZXB0aW9uIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9UZXN0UGFyc2VyU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYXJzZXIvVGVzdFBhcnNlclN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNDExNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9UZXN0UGFyc2VyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqICRJZCQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KLSAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5Ci0gKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KLSAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCi0gKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKLSAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCi0gKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7Ci0KLQotCi0vKioKLSAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZnVsIGZvciBBU1QgcGFyc2VyIHJlbGF0ZWQgdGVzdCBjYXNlcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdFBhcnNlclN1cHBvcnQgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHVibGljIE1vZHVsZU5vZGUgcGFyc2UoU3RyaW5nIHRleHQsIFN0cmluZyBkZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZVVuaXQgdW5pdCA9IFNvdXJjZVVuaXQuY3JlYXRlKCBkZXNjcmlwdGlvbiwgdGV4dCApOwotICAgICAgICB1bml0LnBhcnNlKCk7Ci0gICAgICAgIHVuaXQuY29udmVydCgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHVuaXQuZ2V0QVNUKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0NvbXBpbGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0NvbXBpbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUwMWRkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Db21waWxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHM7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQSBoYW5keSB1bml0IHRlc3QgY2FzZSBmb3IgZHVtcGluZyB0aGUgb3V0cHV0IG9mIHRoZSBjb21waWxlcgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0gICAgQ29tcGlsZXIgY29tcGlsZXIgID0gbnVsbDsKLSAgICBib29sZWFuICBkdW1wQ2xhc3MgPSB0cnVlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ydW5UZXN0KCJDbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL1ZlcmJvc2VUcmVlVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eSIpOwotICAgICAgICBydW5UZXN0KCJ0cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIC8vcnVuVGVzdCgiTGl0dGxlQ2xvc3VyZVRlc3QuZ3Jvb3Z5Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvIiArIG5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgc291cmNlIGZpbGU6ICIgKyBmaWxlLCBmaWxlLmV4aXN0cygpKTsKLQotICAgICAgICBjb21waWxlci5jb21waWxlKGZpbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWdlbmVyYXRlZC1jbGFzc2VzIik7Ci0gICAgICAgIGRpci5ta2RpcnMoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGNvbmZpZy5zZXREZWJ1ZyggZHVtcENsYXNzICk7Ci0gICAgICAgIAotICAgICAgICBjb21waWxlciA9IG5ldyBDb21waWxlciggY29uZmlnICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRG9jR2VuZXJhdG9yTWFpbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0RvY0dlbmVyYXRvck1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4YmFhMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRG9jR2VuZXJhdG9yTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBEb2NHZW5lcmF0b3JNYWluIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCk7Ci0gICAgICAgICAgICAvL3NoZWxsLnJ1bigic3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Eb2NHZW5lcmF0b3IuZ3Jvb3Z5IiwgIm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRG9jR2VuZXJhdG9yLmdyb292eSIsIGFyZ3MpOwotICAgICAgICAgICAgc2hlbGwucnVuKG5ldyBGaWxlKCJzcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0RvY0dlbmVyYXRvci5ncm9vdnkiKSwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZDogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9GaWxlU3lzdGVtQ29tcGlsZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmlsZVN5c3RlbUNvbXBpbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZlZjQwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9GaWxlU3lzdGVtQ29tcGlsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoZSBjb21waWxpbmcgJiBydW5uaW5nIG9mIEdyb292eVRlc3RDYXNlcwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5c3RlbUNvbXBpbGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIEZpbGVTeXN0ZW1Db21waWxlciBjb21waWxlciA9IG51bGw7Ci0gICAgYm9vbGVhbiBkdW1wQ2xhc3MgPSB0cnVlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ydW5UZXN0KCJDbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL1ZlcmJvc2VUcmVlVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eSIpOwotICAgICAgICBydW5UZXN0KCJ0cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5Iik7Ci0gICAgICAgIC8vcnVuVGVzdCgiTGl0dGxlQ2xvc3VyZVRlc3QuZ3Jvb3Z5Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvIiArIG5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgc291cmNlIGZpbGU6ICIgKyBmaWxlLCBmaWxlLmV4aXN0cygpKTsKLQotICAgICAgICBjb21waWxlci5jb21waWxlKG5ldyBGaWxlW10geyBmaWxlIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWdlbmVyYXRlZC1jbGFzc2VzIik7Ci0gICAgICAgIGRpci5ta2RpcnMoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFRhcmdldERpcmVjdG9yeShkaXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFZlcmJvc2UoZHVtcENsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBpbGVyID0gbmV3IEZpbGVTeXN0ZW1Db21waWxlciggY29uZmlndXJhdGlvbiApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0ZpbmRBbGxUZXN0c1N1aXRlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmluZEFsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2MzFlZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmluZEFsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogJElkJAotICogCi0gKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZAotICogbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weSBvZiB0aGlzIGRvY3VtZW50LgotICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuCi0gKiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLSAqICA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5Ci0gKiAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlCi0gKiBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0gKiAgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICogIAotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgVGVzdFN1aXRlIHdoaWNoIHdpbGwgcnVuIGEgR3Jvb3Z5IHVuaXQgdGVzdCBjYXNlIGluc2lkZSBhbnkgSmF2YSBJREUKLSAqIGVpdGhlciBhcyBhIHVuaXQgdGVzdCBjYXNlIG9yIGFzIGFuIGFwcGxpY2F0aW9uLgotICogPHAvPgotICogWW91IGNhbiBzcGVjaWZ5IHRoZSBHcm9vdnlVbml0VGVzdCB0byBydW4gYnkgcnVubmluZyB0aGlzIGNsYXNzIGFzIGFuIGFwcHBsaWNhdGlvbgotICogYW5kIHNwZWNpZnlpbmcgdGhlIHNjcmlwdCB0byBydW4gb24gdGhlIGNvbW1hbmQgbGluZS4KLSAqIDxwLz4KLSAqIDxjb2RlPgotICogamF2YSBncm9vdnkudXRpbC5Hcm9vdnlUZXN0U3VpdGUgc3JjL3Rlc3QvRm9vLmdyb292eQotICogPC9jb2RlPgotICogPHAvPgotICogT3IgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGFzIGEgdW5pdCB0ZXN0IHN1aXRlIGluIGFuIElERSB5b3UgY2FuIHVzZQotICogdGhlICd0ZXN0JyBzeXN0ZW0gcHJvcGVydHkgdG8gZGVmaW5lIHRoZSB0ZXN0IHNjcmlwdCB0byBydW4uCi0gKiBlLmcuIHBhc3MgdGhpcyBpbnRvIHRoZSBKVk0gd2hlbiB0aGUgdW5pdCB0ZXN0IHBsdWdpbiBydW5zLi4uCi0gKiA8cC8+Ci0gKiA8Y29kZT4KLSAqIC1EdGVzdD1zcmMvdGVzdC9Gb28uZ3Jvb3Z5Ci0gKiA8L2NvZGU+Ci0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEZpbmRBbGxUZXN0c1N1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlc3REaXJlY3RvcnkgPSAidGFyZ2V0L3Rlc3QtY2xhc3NlcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgRmluZEFsbFRlc3RzU3VpdGUgc3VpdGUgPSBuZXcgRmluZEFsbFRlc3RzU3VpdGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1aXRlLmxvYWRUZXN0U3VpdGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0ZXN0IHN1aXRlOiAiICsgZSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmVjdXJzZURpcmVjdG9yeShuZXcgRmlsZSh0ZXN0RGlyZWN0b3J5KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVjdXJzZURpcmVjdG9yeShGaWxlIGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgICAgICAgTGlzdCB0cmF2ZXJzZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRyYXZlcnNlTGlzdC5hZGQoZmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIlRlc3QuY2xhc3MiKSB8fCBuYW1lLmVuZHNXaXRoKCJCdWcuY2xhc3MiKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRUZXN0KGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0cmF2ZXJzZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICByZWN1cnNlRGlyZWN0b3J5KChGaWxlKSBpdGVyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUZXN0KEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXRQYXRoKCk7Ci0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHRlc3REaXJlY3RvcnkubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOwotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLSAgICAgICAgCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZDogIiArIG5hbWUpOwotICAgICAgICBDbGFzcyB0eXBlID0gbG9hZENsYXNzKG5hbWUpOwotICAgICAgICBhZGRUZXN0U3VpdGUodHlwZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKG5hbWUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL0RvbVRvR3Jvb3Z5VGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9Eb21Ub0dyb292eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlMjIwNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL0RvbVRvR3Jvb3Z5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gJElkJAotCi0gQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIERvbVRvR3Jvb3Z5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlcjsKLSAgICBwcm90ZWN0ZWQgRG9tVG9Hcm9vdnkgY29udmVydGVyOwotICAgIHByb3RlY3RlZCBGaWxlIGRpciA9IG5ldyBGaWxlKCJ0YXJnZXQvZ2VuZXJhdGVkLWdyb292eXhtbCIpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29udmVydCgidGVzdDEueG1sIiwgInRlc3QxLmdyb292eSIpOwotICAgICAgICBjb252ZXJ0KCJwby54c2QiLCAicG9TY2hlbWEuZ3Jvb3Z5Iik7Ci0gICAgICAgIGNvbnZlcnQoInN3aW5nLnhtbCIsICJzd2luZy5ncm9vdnkiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3V0cHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJzZShuYW1lKTsKLQotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoZGlyLCBvdXRwdXQpKSk7Ci0gICAgICAgIGNvbnZlcnRlciA9IG5ldyBEb21Ub0dyb292eSh3cml0ZXIpOwotCi0gICAgICAgIHdyaXRlci5wcmludGxuKCIjIS9iaW4vZ3Jvb3Z5Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCIvLyBnZW5lcmF0ZWQgZnJvbSAiICsgbmFtZSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgICAgIGNvbnZlcnRlci5wcmludChkb2N1bWVudCk7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBwYXJzZShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBVUkwgcmVzb3VyY2UgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKG5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZTogIiArIG5hbWUsIHJlc291cmNlICE9IG51bGwpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocmVzb3VyY2UudG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLSAgICAgICAgZGlyLm1rZGlycygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9wby54c2QgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3BvLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5Zjk1OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3BvLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0gPHhzZDphbm5vdGF0aW9uPgotICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KLSAgIFB1cmNoYXNlIG9yZGVyIHNjaGVtYSBmb3IgRXhhbXBsZS5jb20uCi0gICBDb3B5cmlnaHQgMjAwMCBFeGFtcGxlLmNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSA8L3hzZDphbm5vdGF0aW9uPgotCi0gPHhzZDplbGVtZW50IG5hbWU9InB1cmNoYXNlT3JkZXIiIHR5cGU9IlB1cmNoYXNlT3JkZXJUeXBlIi8+Ci0KLSA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCi0gPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQdXJjaGFzZU9yZGVyVHlwZSI+Ci0gIDx4c2Q6c2VxdWVuY2U+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0ic2hpcFRvIiB0eXBlPSJVU0FkZHJlc3MiLz4KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaWxsVG8iIHR5cGU9IlVTQWRkcmVzcyIvPgotICAgPHhzZDplbGVtZW50IHJlZj0iY29tbWVudCIgbWluT2NjdXJzPSIwIi8+Ci0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbXMiICB0eXBlPSJJdGVtcyIvPgotICA8L3hzZDpzZXF1ZW5jZT4KLSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVU0FkZHJlc3MiPgotICA8eHNkOnNlcXVlbmNlPgotICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9ImNpdHkiICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlIiAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDplbGVtZW50IG5hbWU9InppcCIgICAgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgPC94c2Q6c2VxdWVuY2U+Ci0gIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvdW50cnkiIHR5cGU9InhzZDpOTVRPS0VOIgotICAgICBmaXhlZD0iVVMiLz4KLSA8L3hzZDpjb21wbGV4VHlwZT4KLQotIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbXMiPgotICA8eHNkOnNlcXVlbmNlPgotICAgPHhzZDplbGVtZW50IG5hbWU9Iml0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZHVjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWFudGl0eSI+Ci0gICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgPHhzZDptYXhFeGNsdXNpdmUgdmFsdWU9IjEwMCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU1ByaWNlIiAgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCByZWY9ImNvbW1lbnQiICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2hpcERhdGUiIHR5cGU9InhzZDpkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcnROdW0iIHR5cGU9IlNLVSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgPC94c2Q6ZWxlbWVudD4KLSAgPC94c2Q6c2VxdWVuY2U+Ci0gPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSA8IS0tIFN0b2NrIEtlZXBpbmcgVW5pdCwgYSBjb2RlIGZvciBpZGVudGlmeWluZyBwcm9kdWN0cyAtLT4KLSA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU0tVIj4KLSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30tW0EtWl17Mn0iLz4KLSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3N3aW5nLnhtbCBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTY0YzdlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIHRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdXNpbmcgbWFya3VwIHRvIHNwZWNpZnkgYSByaWNoIHVzZXIgaW50ZXJmYWNlIC0tPgotPGZyYW1lIHRleHQ9Ik15IFdpbmRvdyIgc2l6ZT0iWzMwMCwzMDBdIj4KLSAgPGxhYmVsIHRleHQ9IlNhdmUgY2hhbmdlcyIgYm91bmRzPSJbMTAsMTAsMjkwLDMwXSIvPgotICA8cGFuZWwgYm91bmRzPSJbMTAsNDAsMjkwLDI5MF0iPgotICAgIDxidXR0b24gdGV4dD0iT0siIGFjdGlvbj0ic2F2ZSgpIi8+Ci0gICAgPGJ1dHRvbiB0ZXh0PSJDYW5jZWwiIGFjdGlvbj0iY2xvc2UoKSIvPgotICA8L3BhbmVsPgotPC9mcmFtZT4KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3N3aW5nMi54bWwgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3N3aW5nMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjRjN2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9zd2luZzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIHRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdXNpbmcgbWFya3VwIHRvIHNwZWNpZnkgYSByaWNoIHVzZXIgaW50ZXJmYWNlIC0tPgotPGZyYW1lIHRleHQ9Ik15IFdpbmRvdyIgc2l6ZT0iWzMwMCwzMDBdIj4KLSAgPGxhYmVsIHRleHQ9IlNhdmUgY2hhbmdlcyIgYm91bmRzPSJbMTAsMTAsMjkwLDMwXSIvPgotICA8cGFuZWwgYm91bmRzPSJbMTAsNDAsMjkwLDI5MF0iPgotICAgIDxidXR0b24gdGV4dD0iT0siIGFjdGlvbj0ic2F2ZSgpIi8+Ci0gICAgPGJ1dHRvbiB0ZXh0PSJDYW5jZWwiIGFjdGlvbj0iY2xvc2UoKSIvPgotICA8L3BhbmVsPgotPC9mcmFtZT4KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3Rlc3QxLnhtbCBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvdGVzdDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM4MWRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvdGVzdDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPGh0bWw+Ci0gIDxoZWFkPgotCTx0aXRsZT5YTUwgZW5jb2Rpbmcgd2l0aCBHcm9vdnk8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIDxoMT5YTUwgZW5jb2Rpbmcgd2l0aCBHcm9vdnk8L2gxPgotICAgIDxwPnRoaXMgZm9ybWF0IGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIG1hcmt1cCB0byBYTUw8L3A+Ci0gICAgPCEtLSBhbiBlbGVtZW50IHdpdGggYXR0cmlidXRlcyBhbmQgdGV4dCBjb250ZW50IC0tPgotICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnIj5Hcm9vdnk8L2E+Ci0gICAgPCEtLSBtaXhlZCBjb250ZW50IC0tPgotICAgIDxwPlRoaXMgaXMgc29tZSA8Yj5taXhlZDwvYj4gdGV4dC4gRm9yIG1vcmUgc2VlIHRoZQotICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnIj5Hcm9vdnk8L2E+IHByb2plY3QKLSAgICA8L3A+Ci0gICAgPHA+c29tZSB0ZXh0PC9wPgotICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3dpa2kvSHRtbDJXaWtpLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS93aWtpL0h0bWwyV2lraS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmViNTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3dpa2kvSHRtbDJXaWtpLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sUGFyc2VyCi0KLWltcG9ydCBqYXZhLmlvLkZpbGUKLQotaW1wb3J0IG9yZy5jeWJlcm5la28uaHRtbC5wYXJzZXJzLlNBWFBhcnNlcgotCi1jbGFzcyBIdG1sMldpa2kgewotICAgIAotICAgIHByb3RlY3RlZCBvdXQKLSAgICAKLSAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKLSAgICAgICAgZ2VuID0gbmV3IEh0bWwyV2lraSgpCi0gICAgICAgIGZvciAoYXJnIGluIGFyZ3MpIHsKLSAgICAgICAgICAgIGdlbi5jcmVhdGVXaWtpKGFyZykKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGNyZWF0ZVdpa2koZmlsZU5hbWUpIHsKLSAgICAgICAgaHRtbFBhcnNlciA9IG5ldyBTQVhQYXJzZXIoKQotICAgICAgICBodG1sUGFyc2VyLnNldFByb3BlcnR5KCJodHRwOi8vY3liZXJuZWtvLm9yZy9odG1sL3Byb3BlcnRpZXMvbmFtZXMvZWxlbXMiLCAibG93ZXIiKQotICAgICAgICBodG1sUGFyc2VyLnNldFByb3BlcnR5KCJodHRwOi8vY3liZXJuZWtvLm9yZy9odG1sL3Byb3BlcnRpZXMvbmFtZXMvYXR0cnMiLCAibG93ZXIiKQotICAgICAgICBwYXJzZXIgPSBuZXcgWG1sUGFyc2VyKGh0bWxQYXJzZXIpCi0gICAgICAgIHByaW50bG4gIlBhcnNpbmcgJHtmaWxlTmFtZX0iCi0gICAgICAgIG5vZGUgPSBwYXJzZXIucGFyc2UoZmlsZU5hbWUpCi0gICAgICAgIAotICAgICAgICBvdXRwdXROYW1lID0gZ2V0T3V0cHV0TmFtZShmaWxlTmFtZSkKLSAgICAgICAgbmV3IEZpbGUob3V0cHV0TmFtZSkuZWFjaFByaW50V3JpdGVyIHsgb3V0ID0gaXQ7IG1ha2VXaWtpUGFnZShub2RlKSB9Ci0gICAgfQotCi0gICAgZ2V0T3V0cHV0TmFtZShmaWxlTmFtZSkgewotCSAgICBsYXN0SWR4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKQotCSAgICBpZiAobGFzdElkeCA+IDApIHsKLQkgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpCi0JICAgIH0KLQkgICAgcmV0dXJuIGZpbGVOYW1lICsgIi53aWtpIgotCX0KLSAgICAKLSAgICB2b2lkIG1ha2VXaWtpUGFnZShub2RlKSB7Ci0gICAgICAgIGJvZHkgPSBub2RlLmh0bWwuYm9keQotICAgICAgICBpZiAoYm9keSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludGxuICJXYXJuaW5nIGVtcHR5IGRvY3VtZW50LCBubyA8aHRtbD48Ym9keT4gc2VjdGlvbiIKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwcGx5VGVtcGxhdGVzRm9yQ2hpbGRyZW4obm9kZSkKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIGFwcGx5VGVtcGxhdGVzKG5vZGUpIHsKLSAgICAgICAgc3dpdGNoIChub2RlLm5hbWUoKSkgewotICAgICAgICAgICAgY2FzZSAiaDEiOgotICAgICAgICAgICAgICAgIG91dC5wcmludGxuICIxICIgKyBub2RlLnRleHQoKSAKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgImgyIjoKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbiAiMS4xICIgKyBub2RlLnRleHQoKQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSAiaDMiOgotICAgICAgICAgICAgICAgIG91dC5wcmludGxuICIxLjEuMSAiICsgbm9kZS50ZXh0KCkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgImg0IjoKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbiAiMS4xLjEuMSAiICsgbm9kZS50ZXh0KCkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgImEiOgotICAgICAgICAgICAgICAgIG91dC5wcmludCAie2xpbms6JHtub2RlLnRleHQoKX18JHtub2RlLmF0dHJpYnV0ZSgnaHJlZicpfX0gIgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBjYXNlICJiIjoKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQgIl9fJHtub2RlLnRleHQoKX1fXyAiCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNhc2UgImkiOgotICAgICAgICAgICAgICAgIG91dC5wcmludCAifn4ke25vZGUudGV4dCgpfX5+ICIKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSAic291cmNlIjoKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbiAie2NvZGU6Z3Jvb3Z5c2h9Ci0ke25vZGUudGV4dCgpfQote2NvZGV9Ci0iCi0gICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSAibGkiOgotICAgICAgICAgICAgICAgIG91dC5wcmludCAiKiAiCi0gICAgICAgICAgICAgICAgYXBwbHlUZW1wbGF0ZXNGb3JDaGlsZHJlbihub2RlKQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY2FzZSAicCI6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFwcGx5VGVtcGxhdGVzRm9yQ2hpbGRyZW4obm9kZSkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgYXBwbHlUZW1wbGF0ZXNGb3JDaGlsZHJlbihub2RlKSB7Ci0gICAgICAgIGZvciAoYyBpbiBub2RlLmNoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50IGMgKyAiICIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGx5VGVtcGxhdGVzKGMpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvd2lraS9SdW5IdG1sMldpa2lUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvd2lraS9SdW5IdG1sMldpa2lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzA0ODQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3dpa2kvUnVuSHRtbDJXaWtpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqICRJZCQKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKLSAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLSAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgotICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0gKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQotICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQotICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqICAKLSAqLwotCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkud2lraTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcnVubmluZyB0aGUgSHRtbDJXaWtpIHNjcmlwdCBhcyBhIEpVbml0IHRlc3QgaW4gYW4gSURFCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5IdG1sMldpa2lUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInhkb2NzIik7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5odG1sIikpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCgieGRvY3MvIiArIGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0gICAgICAgIGxpc3QudG9BcnJheShhcmdzKTsKLQotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS93aWtpL0h0bWwyV2lraS5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgibWFpbiIsIG5ldyBPYmplY3RbXSB7IGFyZ3MgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3dpa2kvUnVuV2lraVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS93aWtpL1J1bldpa2lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzFjYjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvY2xhc3NpYy9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3dpa2kvUnVuV2lraVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCi0gKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KLSAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKLSAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKLSAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLSAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lndpa2k7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OwotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgdGhlIGV4ZWN1dGlvbiBvZiB3aWtpLWdlbmVyYXRlZCB0ZXN0IGNhc2VzCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5XaWtpVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCJ4ZG9jcyIpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIud2lraSIpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9ICJ0YXJnZXQvdGVzdC1jbGFzc2VzL3dpa2kvIiArIG5hbWUucmVwbGFjZUFsbCgiLndpa2kiLCAiVGVzdC5ncm9vdnkiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInRlc3QiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KEdyb292eVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VpdGU7IAotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9jbGFzc2ljL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvd2lraS9UZXN0Q2FzZVJlbmRlckVuZ2luZVRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS93aWtpL1Rlc3RDYXNlUmVuZGVyRW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjkzZDRiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2NsYXNzaWMvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS93aWtpL1Rlc3RDYXNlUmVuZGVyRW5naW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAkSWQkCi0KLSBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLSA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi0gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkud2lraTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5yYWRlb3guZW5naW5lLmNvbnRleHQuQmFzZVJlbmRlckNvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENhc2VSZW5kZXJFbmdpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBCYXNlUmVuZGVyQ29udGV4dCBjb250ZXh0ID0gbmV3IEJhc2VSZW5kZXJDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyKCkgewotICAgICAgICBhc3NlcnRSZW5kZXIoCi0gICAgICAgICAgICAiYmxhaCBibGFoIHtjb2RlOmdyb292eX14ID0gMTsgYXNzZXJ0IHggPT0gMXtjb2RlfSB3aGF0bm90IiwKLSAgICAgICAgICAgICJwYWNrYWdlIHdpa2lcbmNsYXNzIHNvbWVGaWxlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHtcblxuLypcbmJsYWggYmxhaCAqLyBcblxuICB2b2lkIHRlc3RDYXNlMSgpIHtcbnggPSAxOyBhc3NlcnQgeCA9PSAxXG59XG5cbiAvKiB3aGF0bm90XG4qL1xuXG52b2lkIHRlc3REdW1teSgpIHtcbi8vIHRoaXMgaXMgYSBkdW1teSB0ZXN0IGNhc2Vcbn1cblxufVxuIik7CQkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyV2l0aFNjcmlwdCgpIHsKLSAgICAgICAgYXNzZXJ0UmVuZGVyKAotICAgICAgICAgICAgImJsYWggYmxhaCB7Y29kZTpncm9vdnlzaH14ID0gMTsgcHJpbnRsbiAnaGVsbG8gJHt4fSd7Y29kZX0gd2hhdG5vdCIsCi0gICAgICAgICAgICAgInBhY2thZ2Ugd2lraVxuY2xhc3Mgc29tZUZpbGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Uge1xuXG4vKlxuYmxhaCBibGFoICovIFxuXG4gIHZvaWQgdGVzdFNjcmlwdDEoKSB7XG4gICAgYXNzZXJ0U2NyaXB0KCA8PDxTQ1JJUFRfRU9GMVxueCA9IDE7IHByaW50bG4gJ2hlbGxvIFxcJHt4fSdcblNDUklQVF9FT0YxIClcbn0gICAgXG5cbiAvKiB3aGF0bm90XG4qL1xuXG52b2lkIHRlc3REdW1teSgpIHtcbi8vIHRoaXMgaXMgYSBkdW1teSB0ZXN0IGNhc2Vcbn1cblxufVxuIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVuZGVyKFN0cmluZyBpbnB1dCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0gICAgICAgIFRlc3RDYXNlUmVuZGVyRW5naW5lIHRlc3QgPSBuZXcgVGVzdENhc2VSZW5kZXJFbmdpbmUoKTsKLSAgICAgICAgY29udGV4dC5zZXQoIm5hbWUiLCAic29tZUZpbGUud2lraSIpOwotICAgICAgICBTdHJpbmcgYW5zd2VyID0gdGVzdC5yZW5kZXIoaW5wdXQsIGNvbnRleHQpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udmVydGVkOiAiICsgaW5wdXQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludG86ICIgKyBhbnN3ZXIpOwotCi0gICAgICAgIC8vIGxldHMgY29udmVydCB0aGUgb3V0cHV0IHRvIGEgU3RyaW5nIHdlIGNhbiBjdXQtbi1wYXN0ZQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYW5zd2VyLnJlcGxhY2VBbGwoIlxuIiwgIlxcXFxuIikpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZW5kZXJpbmciLCBleHBlY3RlZCwgYW5zd2VyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhLy5jbGFzc3BhdGggYi9ncm9vdnkvbW9kdWxlcy9nZGF0YS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI2Y2QyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvZGVtbyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy9tYWluIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3Rlc3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmxhdW5jaGluZy5tYWNvc3guTWFjT1NYVHlwZS9KVk0gMS41LjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvZ2RhdGEtY2xpZW50LTEuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvZ2RhdGEtY2FsZW5kYXItMS4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9ncm9vdnktY29yZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS8ucHJvamVjdCBiL2dyb292eS9tb2R1bGVzL2dkYXRhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM1ZjZlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Z2RhdGE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThiYzJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTE6MDc6NTIgQlNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvbGliL2dkYXRhLWNhbGVuZGFyLTEuMC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9nZGF0YS9saWIvZ2RhdGEtY2FsZW5kYXItMS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMjU2My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9saWIvZ2RhdGEtY2FsZW5kYXItMS4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL2xpYi9nZGF0YS1jbGllbnQtMS4wLmphciBiL2dyb292eS9tb2R1bGVzL2dkYXRhL2xpYi9nZGF0YS1jbGllbnQtMS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExYTU0Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9saWIvZ2RhdGEtY2xpZW50LTEuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvZGVtby9kZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9kZW1vL2RlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODkxNjhmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9kZW1vL2RlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotaW1wb3J0IGNvbS5nb29nbGUuZ2RhdGEuY2xpZW50LioKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLmNsaWVudC5jYWxlbmRhci4qCi1pbXBvcnQgY29tLmdvb2dsZS5nZGF0YS5kYXRhLioKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLmRhdGEuZXh0ZW5zaW9ucy4qCi1pbXBvcnQgY29tLmdvb2dsZS5nZGF0YS51dGlsLioKLQotaW1wb3J0IGdyb292eS5nb29nbGUuZ2RhdGEuR0RhdGFDYXRlZ29yeQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnkKLQotZGVmIG15SWQgPSBTeXN0ZW0ucHJvcGVydGllcy5pZAotZGVmIG15UGFzc3dvcmQgPSBTeXN0ZW0ucHJvcGVydGllcy5wYXNzCi1kZWYgZmVlZFVybCA9ICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2FsZW5kYXIvZmVlZHMvJG15SWQvcHJpdmF0ZS9mdWxsIgotCi11c2UgKFRpbWVDYXRlZ29yeSwgR0RhdGFDYXRlZ29yeSkgewotICAgIGRlZiBteVNlcnZpY2UgPSBuZXcgQ2FsZW5kYXJTZXJ2aWNlKCJjb2RlaGF1c0dyb292eS1ncm9vdnlFeGFtcGxlQXBwLTEiKQotCi0gICAgbXlTZXJ2aWNlLnVzZXJDcmVkZW50aWFscyA9IFtteUlkLCBteVBhc3N3b3JkXQotICAgIAotICAgIC8vCi0gICAgLy8gTGlzdCBleGlzdGluZyBlbnRyaWVzCi0gICAgLy8KLQotICAgIC8vCi0gICAgLy8gIEdldCBhdCBtb3N0IDIwIGV2ZW50cyBpbiB0aGUgcGVyaW9kIHN0YXJ0aW5nIDEgd2VlayBhZ28gYW5kIGVuZGluZyA0IHdlZWtzIGluIHRoZSBmdXR1cmUKLSAgICAvLwotICAgIG15U2VydmljZS5nZXRGZWVkKGZlZWRVcmwsIDEud2Vlay5hZ28sIDQud2Vla3MuZnJvbS50b2RheSwgMjApLmVudHJpZXMuZWFjaCB7ZW50cnkgLT4KLSAgICAgICAgZW50cnkudGltZXMuZWFjaCB7dGltZSAtPgotICAgICAgICAgICAgIHByaW50bG4gIiR7ZW50cnkudGl0bGUudGV4dH0gRnJvbTogJHt0aW1lLnN0YXJ0VGltZS50b1VpU3RyaW5nKCl9IFRvOiAkeyh0aW1lLmVuZFRpbWUudG9VaVN0cmluZygpKX0iCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vICBHZXQgYXQgbW9zdCAyMCBldmVudHMgaW4gdGhlIHBlcmlvZCBzdGFydGluZyAxIHllYXIgYWdvIGxhc3RpbmcgMiB5ZWFycwotICAgIC8vCi0gICAgbXlTZXJ2aWNlLmdldEZlZWQoZmVlZFVybCwgMS55ZWFyLmFnbywgMi55ZWFycywgMjApLmVudHJpZXMuZWFjaCB7ZW50cnkgLT4KLSAgICAgICAgZW50cnkudGltZXMuZWFjaCB7dGltZSAtPgotICAgICAgICAgICAgcHJpbnRsbiAiJHtlbnRyeS50aXRsZS50ZXh0fSBGcm9tOiAke3RpbWUuc3RhcnRUaW1lLnRvVWlTdHJpbmcoKX0gVG86ICR7KHRpbWUuZW5kVGltZS50b1VpU3RyaW5nKCkpfSIKLSAgICAgICAgfQotICAgIH0KLSAgCi0gICAgCi0gICAgLy8KLSAgICAvLyBBZGQgYW4gZW50cnkKLSAgICAvLwotICAgIAotICAgIC8vIFVzZSBzdGFuZGFyZCBncm9vdnkgbWFnaWMgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIGFmdGVyIGNvbnN0cnVjdGlvbgotICAgIGRlZiBtZSA9IG5ldyBQZXJzb24obmFtZTogIkpvaG4gV2lsc29uIiwgZW1haWw6ICJ0dWd3aWxzb25AZ21haWwuY29tIiwgdXJpOiAiaHR0cDovL2Vlay5vb2sub3JnIikKLSAgICAKLSAgICAvLwotICAgIC8vIE5lZWQgc3BlY2lhbCBtYWdpYyBpbiB0aGUgR0RhdGFDYXRlZ29yeSB0byBkbyB0aGlzCi0gICAgLy8KLSAgICAvLyB0aXRsZSBhbmQgY29udGVudCBhcmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBJZiB5b3Ugd2FudCBYSFRNTCBvciBYTUwgdGhlbiBwYXNzIGEgY2xvc3VyZSBvciBhCi0gICAgLy8gQnVpbGRhYmxlIG9iamVjdCBhbmQgaXQgd2lsbCBydW4gaXQgaW4gYSBidWlsZGVyIGNvbnRleHQKLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGl0bGUgYW5kIGNvbnRlbnQgaW4gdGhlIENhdGFnb3J5IGFzIHRoZXkgYXJlIGFscmVhZHkgcHJvcGVydGllcyBvZiB0aGUgY2xhc3MuIAotICAgIC8vIExhdGVyIEknbGwgY3JlYXRlIGEgY3VzdG9tIE1ldGFDbGFzcyBmb3IgRXZlbnRFbnRyeSB3aGljaCB3aWxsIGxldCB1cyB1c2UgdGhlc2UgbmFtZXMuIFVudGlsIHRoZW4gd2UnbGwgbWFuZ2xlIHRoZW0KLSAgICAvLwotICAgIC8vIGF1dGhvciBjYW4gYmUgYSBzaW5nbGUgUGVyc29uIG9yIGEgbGlzdCBvZiBQZXJzb24KLSAgICAvLwotICAgIC8vIHRpbWUgY2FuIGJlIGEgc2luZ2xlIFdoZW4gb3IgYSBsaXN0IG9mIHRoZW0KLSAgICAvLwotICAgIGRlZiBuZXdFbnRyeSA9IG5ldyBFdmVudEVudHJ5KHRpdGxlMTogIlRoaXMgaXMgYSB0ZXN0IGV2ZW50IiwgY29udGVudDE6ICJ0aGlzIGlzIHNvbWUgY29udGVudCIsIGF1dGhvcjogbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogbmV3IFdoZW4oc3RhcnQ6IDEuaG91ci5mcm9tLm5vdywgZW5kOiAyLmhvdXJzLmZyb20ubm93KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBteVNlcnZpY2UuaW5zZXJ0KGZlZWRVcmwsIG5ld0VudHJ5KQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvc3JjL21haW4vZ3Jvb3Z5L2dvb2dsZS9nZGF0YS9HRGF0YUNhdGVnb3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvZ29vZ2xlL2dkYXRhL0dEYXRhQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4MzFiZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvZ29vZ2xlL2dkYXRhL0dEYXRhQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjEsIDIwMDYKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKb2huIEcuIFdpbHNvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGdyb292eS5nb29nbGUuZ2RhdGE7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CdWlsZGFibGU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkudGltZS5EYXR1bURlcGVuZGVudER1cmF0aW9uOwotaW1wb3J0IGdyb292eS50aW1lLkR1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZGF0YS5jbGllbnQuR29vZ2xlU2VydmljZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLmNsaWVudC5jYWxlbmRhci5DYWxlbmRhclNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZGF0YS5kYXRhLkRhdGVUaW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2RhdGEuZGF0YS5QZXJzb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZGF0YS5kYXRhLlBsYWluVGV4dENvbnN0cnVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLmRhdGEuZXh0ZW5zaW9ucy5FdmVudEVudHJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2RhdGEuZGF0YS5leHRlbnNpb25zLkV2ZW50RmVlZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLmRhdGEuZXh0ZW5zaW9ucy5XaGVuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2RhdGEudXRpbC5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdkYXRhLnV0aWwuU2VydmljZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEdEYXRhQ2F0ZWdvcnkgewotICAgIAotICAgIC8vCi0gICAgLy8gRXh0cmEgQ2FsZW5kYXJTZXJ2aWNlIG1ldGhvZHMKLSAgICAvLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzZWxmLmdldEZlZWQodXJsLCBFdmVudEZlZWQuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEV2ZW50RmVlZCBnZXRGZWVkKGZpbmFsIENhbGVuZGFyU2VydmljZSBzZWxmLCBmaW5hbCBVUkwgdXJsLCBmaW5hbCBEYXRlIGZyb20sIGZpbmFsIERhdGUgdG8sIGludCBtYXhFbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0RmVlZChzZWxmLCB1cmwudG9FeHRlcm5hbEZvcm0oKSwgZnJvbSwgdG8sIG1heEVudHJpZXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEV2ZW50RmVlZCBnZXRGZWVkKGZpbmFsIENhbGVuZGFyU2VydmljZSBzZWxmLCBmaW5hbCBVUkwgdXJsLCBmaW5hbCBEYXRlIGZyb20sIGZpbmFsIERhdGUgdG8pIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRGZWVkKHNlbGYsIHVybC50b0V4dGVybmFsRm9ybSgpLCBmcm9tLCB0byk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFVSTCB1cmwsIGZpbmFsIERhdGUgZnJvbSwgZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBkdXJhdGlvbiwgaW50IG1heEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRGZWVkKHNlbGYsIHVybC50b0V4dGVybmFsRm9ybSgpLCBmcm9tLCBkdXJhdGlvbiwgbWF4RW50cmllcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFVSTCB1cmwsIGZpbmFsIERhdGUgZnJvbSwgZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBkdXJhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEZlZWQoc2VsZiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCksIGZyb20sIGR1cmF0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBFdmVudEZlZWQgZ2V0RmVlZChmaW5hbCBDYWxlbmRhclNlcnZpY2Ugc2VsZiwgZmluYWwgVVJMIHVybCwgZmluYWwgRGF0ZSBmcm9tLCBmaW5hbCBEdXJhdGlvbiBkdXJhdGlvbiwgaW50IG1heEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRGZWVkKHNlbGYsIHVybC50b0V4dGVybmFsRm9ybSgpLCBmcm9tLCBkdXJhdGlvbiwgbWF4RW50cmllcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFVSTCB1cmwsIGZpbmFsIERhdGUgZnJvbSwgZmluYWwgRHVyYXRpb24gZHVyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRGZWVkKHNlbGYsIHVybC50b0V4dGVybmFsRm9ybSgpLCBmcm9tLCBkdXJhdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFN0cmluZyB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzZWxmLmdldEZlZWQobmV3IFVSTCh1cmwpLCBFdmVudEZlZWQuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEV2ZW50RmVlZCBnZXRGZWVkKGZpbmFsIENhbGVuZGFyU2VydmljZSBzZWxmLCBmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBEYXRlIGZyb20sIGZpbmFsIERhdGUgdG8sIGludCBtYXhFbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24gewotICAgIGZpbmFsIERhdGVUaW1lIGZyb20xID0gbmV3IERhdGVUaW1lKGZyb20uZ2V0VGltZSgpKTsKLSAgICBmaW5hbCBEYXRlVGltZSB0bzEgPSBuZXcgRGF0ZVRpbWUodG8uZ2V0VGltZSgpKTsKLQotICAgICAgICByZXR1cm4gc2VsZi5nZXRGZWVkKG5ldyBVUkwodXJsICsgIj9zdGFydC1taW49IiArIGZyb20xICsgIiZzdGFydC1tYXg9IiArIHRvMSsgIiZtYXgtcmVzdWx0cz0iICsgbWF4RW50cmllcyksIEV2ZW50RmVlZC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIERhdGUgZnJvbSwgZmluYWwgRGF0ZSB0bykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBEYXRlVGltZSBmcm9tMSA9IG5ldyBEYXRlVGltZShmcm9tLmdldFRpbWUoKSk7Ci0gICAgZmluYWwgRGF0ZVRpbWUgdG8xID0gbmV3IERhdGVUaW1lKHRvLmdldFRpbWUoKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2VsZi5nZXRGZWVkKG5ldyBVUkwodXJsICsgIj9zdGFydC1taW49IiArIGZyb20xICsgIiZzdGFydC1tYXg9IiArIHRvMSksIEV2ZW50RmVlZC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRGZWVkIGdldEZlZWQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIERhdGUgZnJvbSwgZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBkdXJhdGlvbiwgaW50IG1heEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgRGF0ZVRpbWUgZnJvbTEgPSBuZXcgRGF0ZVRpbWUoZnJvbS5nZXRUaW1lKCkpOwotICAgIGZpbmFsIERhdGVUaW1lIHRvMSA9IHBsdXMoZnJvbTEsIGR1cmF0aW9uKTsKLQotICAgICAgICByZXR1cm4gc2VsZi5nZXRGZWVkKG5ldyBVUkwodXJsICsgIj9zdGFydC1taW49IiArIGZyb20xICsgIiZzdGFydC1tYXg9IiArIHRvMSArICImbWF4LXJlc3VsdHM9IiArIG1heEVudHJpZXMpLCBFdmVudEZlZWQuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEV2ZW50RmVlZCBnZXRGZWVkKGZpbmFsIENhbGVuZGFyU2VydmljZSBzZWxmLCBmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBEYXRlIGZyb20sIGZpbmFsIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZHVyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgRGF0ZVRpbWUgZnJvbTEgPSBuZXcgRGF0ZVRpbWUoZnJvbS5nZXRUaW1lKCkpOwotICAgIGZpbmFsIERhdGVUaW1lIHRvMSA9IHBsdXMoZnJvbTEsIGR1cmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzZWxmLmdldEZlZWQobmV3IFVSTCh1cmwgKyAiP3N0YXJ0LW1pbj0iICsgZnJvbTEgKyAiJnN0YXJ0LW1heD0iICsgdG8xKSwgRXZlbnRGZWVkLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBFdmVudEZlZWQgZ2V0RmVlZChmaW5hbCBDYWxlbmRhclNlcnZpY2Ugc2VsZiwgZmluYWwgU3RyaW5nIHVybCwgZmluYWwgRGF0ZSBmcm9tLCBmaW5hbCBEdXJhdGlvbiBkdXJhdGlvbiwgaW50IG1heEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgRGF0ZVRpbWUgZnJvbTEgPSBuZXcgRGF0ZVRpbWUoZnJvbS5nZXRUaW1lKCkpOwotICAgIGZpbmFsIERhdGVUaW1lIHRvMSA9IHBsdXMoZnJvbTEsIGR1cmF0aW9uKTsKLQotICAgICAgICByZXR1cm4gc2VsZi5nZXRGZWVkKG5ldyBVUkwodXJsICsgIj9zdGFydC1taW49IiArIGZyb20xICsgIiZzdGFydC1tYXg9IiArIHRvMSArICImbWF4LXJlc3VsdHM9IiArIG1heEVudHJpZXMpLCBFdmVudEZlZWQuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEV2ZW50RmVlZCBnZXRGZWVkKGZpbmFsIENhbGVuZGFyU2VydmljZSBzZWxmLCBmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBEYXRlIGZyb20sIGZpbmFsIER1cmF0aW9uIGR1cmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VFeGNlcHRpb24gewotICAgIGZpbmFsIERhdGVUaW1lIGZyb20xID0gbmV3IERhdGVUaW1lKGZyb20uZ2V0VGltZSgpKTsKLSAgICBmaW5hbCBEYXRlVGltZSB0bzEgPSBwbHVzKGZyb20xLCBkdXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2VsZi5nZXRGZWVkKG5ldyBVUkwodXJsICsgIj9zdGFydC1taW49IiArIGZyb20xICsgIiZzdGFydC1tYXg9IiArIHRvMSksIEV2ZW50RmVlZC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRXZlbnRFbnRyeSBpbnNlcnQoZmluYWwgQ2FsZW5kYXJTZXJ2aWNlIHNlbGYsIGZpbmFsIFN0cmluZyB1cmwsIEV2ZW50RW50cnkgZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzZWxmLmluc2VydChuZXcgVVJMKHVybCksIGVudHJ5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZXJDcmVkZW50aWFscyhmaW5hbCBHb29nbGVTZXJ2aWNlIHNlbGYsIGZpbmFsIExpc3Q8U3RyaW5nPiBjcmVkcykgdGhyb3dzIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc2VsZi5zZXRVc2VyQ3JlZGVudGlhbHMoY3JlZHMuZ2V0KDApLCBjcmVkcy5nZXQoMSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1VpU3RyaW5nKGZpbmFsIER1cmF0aW9uIHNlbGYpIHsKLSAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIGZvcm1hdCBtb3JlIHVzZXIgZnJpZW5kbHkKLSAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoc2VsZi5nZXRNaWxsaXMoKSkgKyAiIE1pbGxpc2Vjb25kcyI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvVWlTdHJpbmcoZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBzZWxmKSB7Ci0gICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBmb3JtYXQgbW9yZSB1c2VyIGZyaWVuZGx5Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHNlbGYuZ2V0WWVhcnMoKSkgKyAiIFllYXJzICIgKyBJbnRlZ2VyLnRvU3RyaW5nKHNlbGYuZ2V0TW9udGhzKCkpICsgIiBNb250aHMgIiArIExvbmcudG9TdHJpbmcoc2VsZi5nZXRNaWxsaXMoKSkgKyAiIE1pbGxpc2Vjb25kcyI7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gRXh0cmEgRXZlbnRFbnRyeSBtZXRob2RzCi0gICAgLy8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUxKGZpbmFsIEV2ZW50RW50cnkgc2VsZiwgZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHNlbGYuc2V0VGl0bGUobmV3IFBsYWluVGV4dENvbnN0cnVjdCh0aXRsZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoZmluYWwgRXZlbnRFbnRyeSBzZWxmLCBmaW5hbCBDbG9zdXJlIHRpdGxlQnVpbGRlcikgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoZmluYWwgRXZlbnRFbnRyeSBzZWxmLCBmaW5hbCBCdWlsZGFibGUgdGl0bGVCdWlsZGVyKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250ZW50MShmaW5hbCBFdmVudEVudHJ5IHNlbGYsIGZpbmFsIFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgIHNlbGYuc2V0VGl0bGUobmV3IFBsYWluVGV4dENvbnN0cnVjdChjb250ZW50KSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250ZW50KGZpbmFsIEV2ZW50RW50cnkgc2VsZiwgZmluYWwgQ2xvc3VyZSBjb250ZW50QnVpbGRlcikgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudChmaW5hbCBFdmVudEVudHJ5IHNlbGYsIGZpbmFsIEJ1aWxkYWJsZSBjb250ZW50QnVpbGRlcikgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0aG9yKGZpbmFsIEV2ZW50RW50cnkgc2VsZiwgZmluYWwgUGVyc29uIGF1dGhvcikgewotICAgICAgICBzZWxmLmdldEF1dGhvcnMoKS5hZGQoYXV0aG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dGhvcihmaW5hbCBFdmVudEVudHJ5IHNlbGYsIGZpbmFsIExpc3Q8UGVyc29uPiBhdXRob3JzKSB7Ci0gICAgICAgIHNlbGYuZ2V0QXV0aG9ycygpLmFkZEFsbChhdXRob3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRpbWUoZmluYWwgRXZlbnRFbnRyeSBzZWxmLCBmaW5hbCBXaGVuIHdoZW4pIHsKLSAgICAgICAgc2VsZi5hZGRUaW1lKHdoZW4pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGltZShmaW5hbCBFdmVudEVudHJ5IHNlbGYsIGZpbmFsIExpc3Q8V2hlbj4gd2hlbnMpIHsKLSAgICAgICAgc2VsZi5nZXRUaW1lcygpLmFkZEFsbCh3aGVucyk7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gRXh0cmEgV2hlbiBtZXRob2RzCi0gICAgLy8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhcnQoZmluYWwgV2hlbiBzZWxmLCBmaW5hbCBEYXRlIHN0YXJ0KSB7Ci0gICAgICAgIHNlbGYuc2V0U3RhcnRUaW1lKG5ldyBEYXRlVGltZShzdGFydCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW5kKGZpbmFsIFdoZW4gc2VsZiwgZmluYWwgRGF0ZSBlbmQpIHsKLSAgICAgICAgc2VsZi5zZXRFbmRUaW1lKG5ldyBEYXRlVGltZShlbmQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBNZXRob2RzIHRvIHN1cHBvcnQgZGF0ZSBhbmQgdGltZSBhcml0aG1ldGljCi0gICAgICogVGhlc2UgYXJlIGluIHRoZSBDYXRlZ29yeSB0byBhdm9pZCBwdXR0aW5nIEdvb2dsZSByZWxhdGVkIG1ldGhvZHMgb24gRHVyYXRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIHBsdXMgKGZpbmFsIERhdGVUaW1lIHNlbGYsIGZpbmFsIER1cmF0aW9uIHJocykgewotICAgIC8vIFRPRE86IGhhbmRsZSBUSU1FWk9ORQotICAgIGZpbmFsIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgICAgIGNhbC5zZXRUaW1lSW5NaWxsaXMoc2VsZi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgcmhzLmdldERheXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIHJocy5nZXRIb3VycygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSU5VVEUsIHJocy5nZXRNaW51dGVzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgcmhzLmdldFNlY29uZHMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIHJocy5nZXRNaWxsaXMoKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgcGx1cyAoZmluYWwgRGF0ZVRpbWUgc2VsZiwgZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKLSAgICAvLyBUT0RPOiBoYW5kbGUgVElNRVpPTkUKLSAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgICAgICBjYWwuc2V0VGltZUluTWlsbGlzKHNlbGYuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgcmhzLmdldFllYXJzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1PTlRILCByaHMuZ2V0TW9udGhzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCByaHMuZ2V0RGF5cygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgcmhzLmdldEhvdXJzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgcmhzLmdldE1pbnV0ZXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCByaHMuZ2V0U2Vjb25kcygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgcmhzLmdldE1pbGxpcygpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBwbHVzIChmaW5hbCBEdXJhdGlvbiBzZWxmLCBmaW5hbCBEYXRlVGltZSByaHMpIHsKLSAgICAgICAgcmV0dXJuIHBsdXMocmhzLCBzZWxmKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBwbHVzIChmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHNlbGYsIGZpbmFsIERhdGVUaW1lIHJocykgewotICAgICAgICByZXR1cm4gcGx1cyhyaHMsIHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIG1pbnVzIChmaW5hbCBEYXRlVGltZSBzZWxmLCBmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZShzZWxmLmdldFZhbHVlKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIG1pbnVzIChmaW5hbCBEYXRlVGltZSBzZWxmLCBmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgewotICAgICAgICAvLyBUT0RPOiBoYW5kbGUgVElNRVpPTkUKLSAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLllFQVIsIC1yaHMuZ2V0WWVhcnMoKSk7Ci0gICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1PTlRILCAtcmhzLmdldE1vbnRocygpKTsKLSAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIC1yaHMuZ2V0RGF5cygpKTsKLSAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIC1yaHMuZ2V0SG91cnMoKSk7Ci0gICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgLXJocy5nZXRNaW51dGVzKCkpOwotICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIC1yaHMuZ2V0U2Vjb25kcygpKTsKLSAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIC1yaHMuZ2V0TWlsbGlzKCkpOwotICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvdGltZS9CYXNlRHVyYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0Jhc2VEdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZkN2VkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0Jhc2VEdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMiwgMjAwNgotICoKLSAqIENvcHlyaWdodCAyMDA2IEpvaG4gRy4gV2lsc29uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIGdyb292eS50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUR1cmF0aW9uIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHllYXJzOwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbW9udGhzOyAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGRheXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBob3VyczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1pbnV0ZXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBzZWNvbmRzOyAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1pbGxpczsKLQotICAgIHByb3RlY3RlZCBCYXNlRHVyYXRpb24oZmluYWwgaW50IHllYXJzLCBmaW5hbCBpbnQgbW9udGhzLCBmaW5hbCBpbnQgZGF5cywgZmluYWwgaW50IGhvdXJzLCBmaW5hbCBpbnQgbWludXRlcywgZmluYWwgaW50IHNlY29uZHMsIGZpbmFsIGludCBtaWxsaXMpIHsKLSAgICAgICAgdGhpcy55ZWFycyA9IHllYXJzOwotICAgICAgICB0aGlzLm1vbnRocyA9IG1vbnRoczsKLSAgICAgICAgdGhpcy5kYXlzID0gZGF5czsKLSAgICAgICAgdGhpcy5ob3VycyA9IGhvdXJzOwotICAgICAgICB0aGlzLm1pbnV0ZXMgPSBtaW51dGVzOwotICAgICAgICB0aGlzLnNlY29uZHMgPSBzZWNvbmRzOwotICAgICAgICB0aGlzLm1pbGxpcyA9IG1pbGxpczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQmFzZUR1cmF0aW9uKGZpbmFsIGludCBkYXlzLCBmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgewotICAgICAgICB0aGlzKDAsIDAsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFllYXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy55ZWFyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRNb250aHMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1vbnRoczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXREYXlzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kYXlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEhvdXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ob3VyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRNaW51dGVzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlY29uZHMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlY29uZHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TWlsbGlzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5taWxsaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEYXRlIHBsdXMoZmluYWwgRGF0ZSBkYXRlKSB7Ci0gICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAgICAgY2FsLnNldFRpbWUoZGF0ZSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgdGhpcy55ZWFycyk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTU9OVEgsIHRoaXMubW9udGhzKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgdGhpcy5kYXlzKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgdGhpcy5ob3Vycyk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlOVVRFLCB0aGlzLm1pbnV0ZXMpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGhpcy5zZWNvbmRzKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgdGhpcy5taWxsaXMpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHRvTWlsbGlzZWNvbmRzKCk7Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0QWdvKCk7Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IEZyb20gZ2V0RnJvbSgpOwotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGcm9tIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IERhdGUgZ2V0Tm93KCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRGF0ZSBnZXRUb2RheSgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXROb3coKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0RhdHVtRGVwZW5kZW50RHVyYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0RhdHVtRGVwZW5kZW50RHVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZDU2Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvdGltZS9EYXR1bURlcGVuZGVudER1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIxLCAyMDA2Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSm9obiBHLiBXaWxzb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuVGltZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24gdHVnQHdpbHNvbi5jby51awotICoKLSAqIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcmVwcmVzZW50cyBkdXJhdGlvbnMgd2hvc2UgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3Uga25vd2luZyB0aGUgZGF0dW0gcG9pbnQuCi0gKgotICogSSBkb24ndCBrbm93IGhvdyBtYW55IGRheXMgaW4gYSB5ZWFyIHVubGVzcyBJIGtub3cgaWYgaXQncyBhIGxlYXAgeWVhciBvciBub3QuCi0gKiAKLSAqIEkgZG9uJ3Qga25vdyBob3cgbWFueSBkYXlzIGluIGEgbW9udGggdW5sZXNzIEkga25vdyB0aGUgbmFtZSBvZiB0aGUgbW9udGggKGFuZCBpZiBpdCdzIGEgbGVhcCB5YWVyIGlmIHRoZSBtb250aCBpcyBGZWJydWFyeSkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBleHRlbmRzIEJhc2VEdXJhdGlvbiB7Ci0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24oZmluYWwgaW50IHllYXJzLCBmaW5hbCBpbnQgbW9udGhzLCBmaW5hbCBpbnQgZGF5cywgZmluYWwgaW50IGhvdXJzLCBmaW5hbCBpbnQgbWludXRlcywgZmluYWwgaW50IHNlY29uZHMsIGZpbmFsIGludCBtaWxsaXMpIHsKLSAgICAgICAgc3VwZXIoeWVhcnMsIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNb250aHMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1vbnRoczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFllYXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy55ZWFyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpICsgcmhzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCkgKyByaHMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERheXMoKSArIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSArIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgKyByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSArIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24gcmhzKSB7Ci0gICAgICAgIHJldHVybiByaHMucGx1cyh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXR1bURlcGVuZGVudER1cmF0aW9uKHRoaXMuZ2V0WWVhcnMoKSwgdGhpcy5nZXRNb250aHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpICsgcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpICsgcmhzLmdldEhvdXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgKyByaHMuZ2V0TWlsbGlzKCkpOwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgVGltZUR1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gcmhzLnBsdXModGhpcyk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gbWludXMoZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXR1bURlcGVuZGVudER1cmF0aW9uKHRoaXMuZ2V0WWVhcnMoKSAtIHJocy5nZXRZZWFycygpLCB0aGlzLmdldE1vbnRocygpIC0gcmhzLmdldE1vbnRocygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gbWludXMoZmluYWwgRHVyYXRpb24gcmhzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0dW1EZXBlbmRlbnREdXJhdGlvbih0aGlzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBncm9vdnkudGltZS5CYXNlRHVyYXRpb24jdG9NaWxsaXNlY29uZHMoKQotICAgICAqIAotICAgICAqIERvIG91ciBiZXN0IHRvIGNoYW5nZSB0aGUgZHVyYXRpb24gaW50byBtaWxsaXNlY29uZHMKLSAgICAgKiBXZSBjYWxjdWxhdGUgdGhlIGR1YXJ0aW9uIHJlbGF0aXZlIHRvIG5vdwotICAgICAqLwotICAgIHB1YmxpYyBsb25nIHRvTWlsbGlzZWNvbmRzKCkgewotICAgIGZpbmFsIERhdGUgbm93ID0gbmV3IERhdGUoKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIFRpbWVDYXRlZ29yeS5taW51cyhwbHVzKG5vdyksIG5vdykudG9NaWxsaXNlY29uZHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdGUgZ2V0QWdvKCkgewotICAgIGZpbmFsIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5ZRUFSLCAtdGhpcy5nZXRZZWFycygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NT05USCwgLXRoaXMuZ2V0TW9udGhzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCAtdGhpcy5nZXREYXlzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkhPVVJfT0ZfREFZLCAtdGhpcy5nZXRIb3VycygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSU5VVEUsIC10aGlzLmdldE1pbnV0ZXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCAtdGhpcy5nZXRTZWNvbmRzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTExJU0VDT05ELCAtdGhpcy5nZXRNaWxsaXMoKSk7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBTcWxEYXRlIHNob3VsZCBub3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlc2UgdmFsdWVzIGJ1dCBpdCBzZWVtcyB0byAicmVtZW1iZXIiIHRoZW0KLSAgICAgICAgLy8gc28gd2UgY2xlYXIgdGhlbS4KLSAgICAgICAgLy8gV2UgZG8gdGhlIGFkZHMgZmlyc3QgaW5jYXNlIHdlIGdldCBjYXJyeSBpbnRvIHRoZSBkYXkgZmllbGQKLSAgICAgICAgLy8KLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgMCk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5TRUNPTkQsIDApOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQotICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgewotICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgewotICAgICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldFllYXJzKCkpOwotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTU9OVEgsIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRNb250aHMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldERheXMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldEhvdXJzKCkpOwotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlOVVRFLCBEYXR1bURlcGVuZGVudER1cmF0aW9uLnRoaXMuZ2V0TWludXRlcygpKTsKLSAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldFNlY29uZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldE1pbGxpcygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFNxbERhdGUgc2hvdWxkIG5vdCByZWFsbHkgY2FyZSBhYm91dCB0aGVzZSB2YWx1ZXMgYnV0IGl0IHNlZW1zIHRvICJyZW1lbWJlciIgdGhlbQotICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNsZWFyIHRoZW0uCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhlIGFkZHMgZmlyc3QgaW5jYXNlIHdlIGdldCBjYXJyeSBpbnRvIHRoZSBkYXkgZmllbGQKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDApOwotICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKLSAgICAgICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7Ci0gICAgICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLnNxbC5EYXRlKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0R1cmF0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvdGltZS9EdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjc1NzU0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL0R1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIxLCAyMDA2Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSm9obiBHLiBXaWxzb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogQGF1dGhvciBKb2huIFdpbHNvbiB0dWdAd2lsc29uLmNvLnVrCi0gKiAKLSAqIER1cmF0aW9uIHJlcHJlc2VudHMgdGltZSBwZXJpb2RzIHdoaWNoIGhhdmUgdmFsdWVzIGluZGVwZW5kYW50IG9mIHRoZSBjb250ZXh0LgotICogU28sIHdoaWxzdCB3ZSBjYW4ndCBzYXkgaG93IGxvbmcgYSBtb250aCBpcyB3aXRob3V0IGtub3dpbmcgdGhlIHllYXIgYW5kIHRoZSBuYW1lIG9mIHRoZSBtb250aCwKLSAqIHdlIGtub3cgaG93IGxvbmcgYSBkYXkgaXMgaW5kZXBlbmRhbnQgb2YgdGhlIGRhdGUuCi0gKiAKLSAqIFRoaXMgaXMgbm90IDEwMCUgdHJ1ZSBmb3IgZGF5cy4KLSAqIERheXMgY2FuIGFjdHVhbGx5IGJlIDIzLCAyNCBvciAyNSBob3VycyBsb25nIChkdWUgdG8gZGF5bGlnaHQgc2F2aW5nIGFkanVzdG1lbnRzKQotICogCi0gKiBJZiB5b3UgYXNrIER1cmF0aW9uIHRvIGNvbnZlcnQgaXRzZWxmIHRvIG1pbGxpc2Vjb25kcyB0aGVuIGl0IHdpbGwgd29yayBvbiB0aGUgYmFzaXMgb2YgMjQgaG91cnMKLSAqIGluIGEgZGF5LiBJZiB5b3UgYWRkIG9yIHN1YnRyYWN0IGl0IGZyb20gYSBkYXRlIGl0IHdpbGwgdGFrZSBkYXlsaWdodCBzYXZpbmcgaW50byBhY2NvdW50LgotICoKLSAqLwotcHVibGljIGNsYXNzIER1cmF0aW9uIGV4dGVuZHMgQmFzZUR1cmF0aW9uIHsKLSAgICBwdWJsaWMgRHVyYXRpb24oZmluYWwgaW50IGRheXMsIGZpbmFsIGludCBob3VycywgZmluYWwgaW50IG1pbnV0ZXMsIGZpbmFsIGludCBzZWNvbmRzLCBmaW5hbCBpbnQgbWlsbGlzKSB7Ci0gICAgICAgIHN1cGVyKGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRHVyYXRpb24gcGx1cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLmdldERheXMoKSArIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSArIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpICsgcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgKyByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgKyByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lRHVyYXRpb24gcGx1cyhmaW5hbCBUaW1lRHVyYXRpb24gcmhzKSB7Ci0gICAgICAgIHJldHVybiByaHMucGx1cyh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gcmhzLnBsdXModGhpcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEdXJhdGlvbiBtaW51cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGltZUR1cmF0aW9uIG1pbnVzKGZpbmFsIFRpbWVEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24odGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBtaW51cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24oLXJocy5nZXRZZWFycygpLCAtcmhzLmdldE1vbnRocygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBtaW51cyhmaW5hbCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbigtcmhzLmdldFllYXJzKCksIC1yaHMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGxvbmcgdG9NaWxsaXNlY29uZHMoKSB7Ci0gICAgICAgIHJldHVybiAoKCgoKChsb25nKSh0aGlzLmdldERheXMoKSAqIDI0ICkgKyB0aGlzLmdldEhvdXJzKCkpICogNjAgKyB0aGlzLmdldE1pbnV0ZXMoKSkgKiA2MCkgKyB0aGlzLmdldFNlY29uZHMoKSkgKiAxMDAwKSArIHRoaXMuZ2V0TWlsbGlzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEYXRlIGdldEFnbygpIHsKLSAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIC10aGlzLmdldERheXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIC10aGlzLmdldEhvdXJzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgLXRoaXMuZ2V0TWludXRlcygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIC10aGlzLmdldFNlY29uZHMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIC10aGlzLmdldE1pbGxpcygpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpOwotICAgIH0KLSAgICAgCi0gICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgewotICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgewotICAgICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIER1cmF0aW9uLnRoaXMuZ2V0RGF5cygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvdGltZS9UaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ODcxMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9ncm9vdnkvdGltZS9UaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDYsIDIwMDYKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKb2huIEcuIFdpbHNvbgotICoKLSAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBncm9vdnkudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uIHR1Z0B3aWxzb24uY28udWsKLSAqIAotICogVGltZURhdHVtRHVyYXRpb24gcmVwcmVzZW50cyBhIHRpbWUgcGVyaWQgd2hpY2ggcmVzdWx0cyBmcm9tIGFuCi0gKiBhcml0aG1ldGljIG9wZXJhdGlvbiBiZXR3ZWVuIGEgVGltZUR1cmF0aW9uIG9iamVjdCBhbmQgYSBEYXR1bUR1cmF0aW9uIG9iamVjdAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBleHRlbmRzIERhdHVtRGVwZW5kZW50RHVyYXRpb24gewotICAgIHB1YmxpYyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbihpbnQgeWVhcnMsIGludCBtb250aHMsIGludCBkYXlzLCBpbnQgaG91cnMsIGludCBtaW51dGVzLCBpbnQgc2Vjb25kcywgaW50IG1pbGxpcykgewotICAgICAgICBzdXBlcih5ZWFycywgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgRHVyYXRpb24gcmhzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpLCB0aGlzLmdldE1vbnRocygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpICsgcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpICsgcmhzLmdldEhvdXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgKyByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSArIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSArIHJocy5nZXRNaWxsaXMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBwbHVzKGZpbmFsIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcmhzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpICsgcmhzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCkgKyByaHMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uIG1pbnVzKGZpbmFsIER1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gbmV3IFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uKHRoaXMuZ2V0WWVhcnMoKSwgdGhpcy5nZXRNb250aHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24gbWludXMoZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbih0aGlzLmdldFllYXJzKCkgLSByaHMuZ2V0WWVhcnMoKSwgdGhpcy5nZXRNb250aHMoKSAtIHJocy5nZXRNb250aHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRnJvbSBnZXRGcm9tKCkgewotICAgICAgICByZXR1cm4gbmV3IEZyb20oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgRGF0ZSBnZXROb3coKSB7Ci0gICAgICAgICAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5ZRUFSLCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldFllYXJzKCkpOwotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTU9OVEgsIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uLnRoaXMuZ2V0TW9udGhzKCkpOwotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uLnRoaXMuZ2V0RGF5cygpKTsKLSAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkhPVVJfT0ZfREFZLCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldEhvdXJzKCkpOwotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlOVVRFLCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldE1pbnV0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uLnRoaXMuZ2V0U2Vjb25kcygpKTsKLSAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTExJU0VDT05ELCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldE1pbGxpcygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gY2FsLmdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL2dyb292eS90aW1lL1RpbWVEdXJhdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZUR1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzY3NDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ2RhdGEvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZUR1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gNiwgMjAwNgotICoKLSAqIENvcHlyaWdodCAyMDA2IEpvaG4gRy4gV2lsc29uCi0gKgotICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIGdyb292eS50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24gdHVnQHdpbHNvbi5jby51awotICogCi0gKiBUaW1lRHVyYXRpb24gcmVwcmVzZW50cyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIHVuaXRzIG9mIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFuZCBtaWxsaXNlY29uZHMuCi0gKiAKLSAqIFdoaWxzdCB3ZSBjYW4ndCBzYXkgaG93IGxvbmcgYSBtb250aCBpcyB3aXRob3V0IGtub3dpbmcgdGhlIHllYXIgYW5kIHRoZSBuYW1lIG9mIHRoZSBtb250aCwKLSAqIHdlIGtub3cgaG93IGxvbmcgYSBzZWNvbmQgaXMgaW5kZXBlbmRhbnQgb2YgdGhlIGRhdGUuCi0gKiAKLSAqIFRoaXMgaXMgbm90IDEwMCUgdHJ1ZSBmb3IgbWludXRlcy4KLSAqIE1pbnV0ZXMgY2FuIGJlIDU5LCA2MCBvciA2MSBzZWNvbmRzIGxvbmcgKGR1ZSB0byBsZWFwIHNlY29uZHMpCi0gKiAKLSAqIElmIHlvdSBhc2sgRHVyYXRpb24gdG8gY29udmVydCBpdHNlbGYgdG8gbWlsbGlzZWNvbmRzIHRoZW4gaXQgd2lsbCB3b3JrIG9uIHRoZSBiYXNpcyBvZiA2MCBzZWNvbmRzIGluIGEgbWludXRlLgotICogSWYgeW91IGFkZCBvciBzdWJ0cmFjdCBpdCBmcm9tIGEgZGF0ZSBpdCB3aWxsIHRha2UgbGVhcCBzZWNvbmRzIGludG8gYWNjb3VudAotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGltZUR1cmF0aW9uIGV4dGVuZHMgRHVyYXRpb24gewotICAgIHB1YmxpYyBUaW1lRHVyYXRpb24oZmluYWwgaW50IGhvdXJzLCBmaW5hbCBpbnQgbWludXRlcywgZmluYWwgaW50IHNlY29uZHMsIGZpbmFsIGludCBtaWxsaXMpIHsKLSAgICAgICAgc3VwZXIoMCwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7Ci0gICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGltZUR1cmF0aW9uKGZpbmFsIGludCBkYXlzLCBmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgewotICAgICAgICBzdXBlcihkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzKTsKLSAgICAgfQotICAgIAotICAgIHB1YmxpYyBUaW1lRHVyYXRpb24gcGx1cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24odGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgKyByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSArIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgKyByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgewotICAgICAgICByZXR1cm4gbmV3IFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uKHJocy5nZXRZZWFycygpLCByaHMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRpbWVEdXJhdGlvbiBtaW51cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24odGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24gbWludXMoZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbigtcmhzLmdldFllYXJzKCksIC1yaHMuZ2V0TW9udGhzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgewotICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgewotICAgICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIFRpbWVEdXJhdGlvbi50aGlzLmdldERheXMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgVGltZUR1cmF0aW9uLnRoaXMuZ2V0SG91cnMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSU5VVEUsIFRpbWVEdXJhdGlvbi50aGlzLmdldE1pbnV0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIFRpbWVEdXJhdGlvbi50aGlzLmdldFNlY29uZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgVGltZUR1cmF0aW9uLnRoaXMuZ2V0TWlsbGlzKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9UaW1lQ2F0ZWdvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9UaW1lQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0OWM3OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVGltZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIzLCAyMDA2Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSm9obiBHLiBXaWxzb24KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOwotCi1pbXBvcnQgZ3Jvb3Z5LnRpbWUuQmFzZUR1cmF0aW9uOwotaW1wb3J0IGdyb292eS50aW1lLkRhdHVtRGVwZW5kZW50RHVyYXRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnRpbWUuRHVyYXRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnRpbWUuVGltZUR1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1wdWJsaWMgY2xhc3MgVGltZUNhdGVnb3J5IHsKLSAgICAvKgotICAgICAqIE10aG9kcyB0byBhbGxvdyBEYXRhIER1cmF0aW9uIGFyaXRobWV0aWMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdGUgcGx1cyhmaW5hbCBEYXRlIGRhdGUsIGZpbmFsIEJhc2VEdXJhdGlvbiBkdXJhdGlvbikgewotICAgICAgICByZXR1cm4gZHVyYXRpb24ucGx1cyhkYXRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEYXRlIG1pbnVzKGZpbmFsIERhdGUgZGF0ZSwgZmluYWwgQmFzZUR1cmF0aW9uIGR1cmF0aW9uKSB7Ci0gICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIGNhbC5zZXRUaW1lKGRhdGUpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLllFQVIsIC1kdXJhdGlvbi5nZXRZZWFycygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NT05USCwgLWR1cmF0aW9uLmdldE1vbnRocygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgLWR1cmF0aW9uLmdldERheXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIC1kdXJhdGlvbi5nZXRNaW51dGVzKCkpOwotICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgLWR1cmF0aW9uLmdldE1pbnV0ZXMoKSk7Ci0gICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCAtZHVyYXRpb24uZ2V0U2Vjb25kcygpKTsKLSAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgLWR1cmF0aW9uLmdldE1pbGxpcygpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBtaW51cyhmaW5hbCBEYXRlIGxocywgZmluYWwgRGF0ZSByaHMpIHsKLSAgICAgICAgbG9uZyBtaWxsaXNlY29uZHMgPSBsaHMuZ2V0VGltZSgpIC0gcmhzLmdldFRpbWUoKTsKLSAgICAgICAgbG9uZyBkYXlzID0gbWlsbGlzZWNvbmRzIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApOwotICAgICAgICBtaWxsaXNlY29uZHMgLT0gZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7Ci0gICAgICAgIGludCBob3VycyA9IChpbnQpKG1pbGxpc2Vjb25kcyAvICg2MCAqIDYwICogMTAwMCkpOwotICAgICAgICBtaWxsaXNlY29uZHMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAoaW50KShtaWxsaXNlY29uZHMgLyAoNjAgKiAxMDAwKSk7Ci0gICAgICAgIG1pbGxpc2Vjb25kcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwotICAgICAgICBpbnQgc2Vjb25kcyA9IChpbnQpKG1pbGxpc2Vjb25kcyAvIDEwMDApOwotICAgICAgICBtaWxsaXNlY29uZHMgLT0gc2Vjb25kcyAqIDEwMDA7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbigoaW50KWRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCAoaW50KW1pbGxpc2Vjb25kcyk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogTWV0aG9kcyBvbiBJbnRlZ2VyIHRvIGltcGxlbWVudCAxLm1vbnRoLCA0LnllYXJzIGV0Yy4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0TW9udGhzKGZpbmFsIEludGVnZXIgc2VsZikgewotICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24oMCwgc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwLCAwLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIGdldE1vbnRoKGZpbmFsIEludGVnZXIgc2VsZikgewotICAgICAgICByZXR1cm4gZ2V0TW9udGhzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0WWVhcnMoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0dW1EZXBlbmRlbnREdXJhdGlvbihzZWxmLmludFZhbHVlKCksIDAsIDAsIDAsIDAsIDAsIDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0WWVhcihmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIGdldFllYXJzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIE1ldGhvZHMgb24gSW50ZWdlciB0byBpbXBsZW1lbnQgMS53ZWVrLCA0LmRheXMgZXRjLgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gZ2V0V2Vla3MoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oc2VsZi5pbnRWYWx1ZSgpICogNywgMCwgMCwgMCwgMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gZ2V0V2VlayhmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIGdldFdlZWtzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldERheXMoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBnZXREYXkoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBnZXREYXlzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRIb3VycyhmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24oMCwgc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gZ2V0SG91cihmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIGdldEhvdXJzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRNaW51dGVzKGZpbmFsIEludGVnZXIgc2VsZikgewotICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbigwLCAwLCBzZWxmLmludFZhbHVlKCksIDAsIDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRNaW51dGUoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBnZXRNaW51dGVzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRTZWNvbmRzKGZpbmFsIEludGVnZXIgc2VsZikgewotICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbigwLCAwLCAwLCBzZWxmLmludFZhbHVlKCksIDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRTZWNvbmQoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZWNvbmRzKHNlbGYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRNaWxsaXNlY29uZHMoZmluYWwgSW50ZWdlciBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKDAsIDAsIDAsIDAsIHNlbGYuaW50VmFsdWUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGltZUR1cmF0aW9uIGdldE1pbGxpc2Vjb25kKGZpbmFsIEludGVnZXIgc2VsZikgewotICAgICAgICByZXR1cm4gZ2V0TWlsbGlzZWNvbmRzKHNlbGYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy90ZXN0L2dyb292eS9nb29nbGUvZ2RhdGEvRHVyYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dkYXRhL3NyYy90ZXN0L2dyb292eS9nb29nbGUvZ2RhdGEvRHVyYXRpb25UZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0NmMxZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nZGF0YS9zcmMvdGVzdC9ncm9vdnkvZ29vZ2xlL2dkYXRhL0R1cmF0aW9uVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5nb29nbGUuZ2RhdGEKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnkKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZQotCi1jbGFzcyBEdXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgdm9pZCB0ZXN0Rml4ZWREdXJhdGlvbkFyaXRobWV0aWMoKSB7Ci0gICAgICAgIHVzZShUaW1lQ2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGRlZiBvbmVEYXkgPSAyLmRheXMgLSAxLmRheQotICAgICAgICAgICAgYXNzZXJ0IG9uZURheS50b01pbGxpc2Vjb25kcygpID09ICgyNCAqIDYwICogNjAgKiAxMDAwKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBvbmVEYXkgPSAyLmRheXMgLSAxLmRheSArIDI0LmhvdXJzIC0gMTQ0MC5taW51dGVzCi0gICAgICAgICAgICBhc3NlcnQgb25lRGF5LnRvTWlsbGlzZWNvbmRzKCkgPT0gKDI0ICogNjAgKiA2MCAqIDEwMDApCi0gICAgICAgIH0KLSAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3REYXR1bURlcGVuZGFudEFyaXRobWV0aWMoKSB7Ci0gICAgICAgIHVzZShUaW1lQ2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGRlZiB0d29Nb250aHMgPSAxLm1vbnRoICsgMS5tb250aAotICAgICAgICAgICAgZGVmIHR3b01vbnRoc0Zyb21Ob3cgPSAyLm1vbnRocy5mcm9tLm5vdyAtIDAubW9udGhzLmZyb20ubm93IAotICAgICAgICAgICAgZGVmIG9uZU1vbnRoRnJvbU5vdyA9IDEubW9udGguZnJvbS5ub3cgLSAwLm1vbnRocy5mcm9tLm5vdwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgdHdvTW9udGhzLnRvTWlsbGlzZWNvbmRzKCkgPT0gdHdvTW9udGhzRnJvbU5vdy50b01pbGxpc2Vjb25kcygpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZiBtb250aEFuZFdlZWsgPSAxLm1vbnRoICsgMS53ZWVrCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBtb250aEFuZFdlZWsudG9NaWxsaXNlY29uZHMoKSA9PSAob25lTW9udGhGcm9tTm93ICsgMS53ZWVrKS50b01pbGxpc2Vjb25kcygpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZiBub3cgPSBuZXcgRGF0ZSgpCi0gICAgICAgICAgICBkZWYgdGhlbiA9IG1vbnRoQW5kV2VlayArIG5vdwotICAgICAgICAgICAgZGVmIHdlZWsgPSB0aGVuIC0gMS5tb250aCAtIG5vdwotICAgICAgICAgICAgYXNzZXJ0IHdlZWsudG9NaWxsaXNlY29uZHMoKSA9PSAoNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoZW4gPSBub3cgKyBtb250aEFuZFdlZWsKLSAgICAgICAgICAgIHdlZWsgPSB0aGVuIC0gMS5tb250aCAtIG5vdwotICAgICAgICAgICAgYXNzZXJ0IHdlZWsudG9NaWxsaXNlY29uZHMoKSA9PSAoNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCAobm93ICsgbW9udGhBbmRXZWVrKSA9PSAobW9udGhBbmRXZWVrICsgbm93KQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3ZWVrID0gdGhlbiAtIChub3cgKyAxLm1vbnRoKQotICAgICAgICAgICAgYXNzZXJ0IHdlZWsudG9NaWxsaXNlY29uZHMoKSA9PSAoNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvLmNsYXNzcGF0aCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI2ZjJlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL2NvbW1vbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvd2ViIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3BlcnNpc3RlbmNlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3NjYWZmb2xkaW5nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIga2luZD0ic3JjIiBwYXRoPSJ0ZXN0L2NvbW1vbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJ0YXJnZXQvdGVzdC1jbGFzc2VzIiBraW5kPSJzcmMiIHBhdGg9InRlc3Qvd2ViIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIga2luZD0ic3JjIiBwYXRoPSJ0ZXN0L3BlcnNpc3RlbmNlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIga2luZD0ic3JjIiBwYXRoPSJ0ZXN0L3NjYWZmb2xkaW5nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2p1bml0LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJEOi9Eb3dubG9hZHMvRGV2ZWxvcG1lbnQvU3ByaW5nL3NwcmluZy1mcmFtZXdvcmstMS4yL3NyYyIga2luZD0ibGliIiBwYXRoPSJsaWIvc3ByaW5nLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9jb21tb25zLWxvZ2dpbmcuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL3NlcnZsZXQtYXBpLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJEOi9zYW5kYm94X29zL3NwcmluZy1wcm9qZWN0cy9zcHJpbmctYmVhbnMvc3JjL2phdmEiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3NwcmluZ21vZHVsZXMtc2FuZGJveC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvc3ByaW5nLW1vY2suamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2NvbW1vbnMtbGFuZy0yLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2NvbW1vbnMtZGJjcC0xLjIuMS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvY29tbW9ucy1wb29sLTEuMi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iRDovRG93bmxvYWRzL0RldmVsb3BtZW50L0hTUUxEQi9oc3FsZGIvc3JjIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9oc3FsZGIuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2NvbW1vbnMtY29sbGVjdGlvbnMtMy4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9kb200ai0xLjYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9Ii9Vc2Vycy9zdGV2ZW5kZXZpanZlci9kb3dubG9hZC9zcHJpbmctcHJvamVjdHMvc3ByaW5nLXdlYmZsb3ciIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3NwcmluZy13ZWJmbG93LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9zcHJpbmctYmluZGluZy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvbG9nNGotMS4yLjguamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL29nbmwtMi43LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9hbnRsci0yLjcuNUgzLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9hc20uamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FzbS1hdHRycy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvY2dsaWItMi4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9laGNhY2hlLTEuMS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvZWpiLTMuMC1lZHIyLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJEOi9Eb3dubG9hZHMvRGV2ZWxvcG1lbnQvSGliZXJuYXRlL2hpYmVybmF0ZS0zLjAuNS9oaWJlcm5hdGUtMy4wL3NyYyIga2luZD0ibGliIiBwYXRoPSJsaWIvaGliZXJuYXRlMy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iRDovRG93bmxvYWRzL0RldmVsb3BtZW50L0hpYmVybmF0ZS9oaWJlcm5hdGUtYW5ub3RhdGlvbnMtMy4wYmV0YTIvaGliZXJuYXRlLWFubm90YXRpb25zLTMuMGJldGEyL3NyYy9qYXZhIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9oaWJlcm5hdGUtYW5ub3RhdGlvbnMuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2pkYmMyXzAtc3RkZXh0LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdGEuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9IkQ6L0Rvd25sb2Fkcy9EZXZlbG9wbWVudC9TaXRlTWVzaC9zcmMvamF2YSIga2luZD0ibGliIiBwYXRoPSJsaWIvc2l0ZW1lc2gtMi4yLjEuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2pha2FydGEtb3JvLTIuMC44LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9jb21tb25zLXZhbGlkYXRvci5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iL2dyb292eS9zcmMvbWFpbiIga2luZD0ibGliIiBwYXRoPSJsaWIvZ3Jvb3Z5LWFsbC0xLjAtanNyLTA1LVNOQVBTSE9ULmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy8uY3ZzaWdub3JlIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTQ4OTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWRpc3QKLXRhcmdldAotY2xhc3NlcwotdGVzdC1jbGFzc2VzCi1ldGMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvLnByb2plY3QgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOWE5NWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Z3JhaWxzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9HcmFpbHMgTW9kdWxlLmltbCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9HcmFpbHMgTW9kdWxlLmltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3OGM0OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvR3JhaWxzIE1vZHVsZS5pbWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxtb2R1bGUgdmVyc2lvbj0iNCIgcmVsYXRpdmVQYXRocz0idHJ1ZSIgdHlwZT0iSkFWQV9NT0RVTEUiPgotICA8Y29tcG9uZW50IG5hbWU9Ik1vZHVsZVJvb3RNYW5hZ2VyIiAvPgotICA8Y29tcG9uZW50IG5hbWU9Ik5ld01vZHVsZVJvb3RNYW5hZ2VyIj4KLSAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9jbGFzc2VzIiAvPgotICAgIDxleGNsdWRlLW91dHB1dCAvPgotICAgIDxvdXRwdXQtdGVzdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGVzdC1jbGFzc2VzIiAvPgotICAgIDxjb250ZW50IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJCI+Ci0gICAgICA8c291cmNlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9zcmMvY29tbW9ucyIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9wZXJzaXN0ZW5jZSIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9zY2FmZm9sZGluZyIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy93ZWIiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+Ci0gICAgICA8c291cmNlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90ZXN0L2NvbW1vbnMiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3Rlc3QvcGVyc2lzdGVuY2UiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3Rlc3Qvc2NhZmZvbGRpbmciIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3Rlc3Qvd2ViIiBpc1Rlc3RTb3VyY2U9InRydWUiIC8+Ci0gICAgPC9jb250ZW50PgotICAgIDxvcmRlckVudHJ5IHR5cGU9ImluaGVyaXRlZEpkayIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJzb3VyY2VGb2xkZXIiIGZvclRlc3RzPSJmYWxzZSIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJBcGFjaGUgQ29tbW9ucyIgbGV2ZWw9ImFwcGxpY2F0aW9uIiAvPgotICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9IkhpYmVybmF0ZSAzIiBsZXZlbD0iYXBwbGljYXRpb24iIC8+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iU2l0ZU1lc2giIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJTcHJpbmciIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2p1bml0LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvb2dubC0yLjcuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9qYXZheC5zZXJ2bGV0LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3BlcnNpc3RlbmNlIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL2NvbW1vbnMiIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9zcmMvc2NhZmZvbGRpbmciIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9zcmMvd2ViIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGVzdC9jb21tb25zIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGVzdC9wZXJzaXN0ZW5jZSIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3Rlc3Qvc2NhZmZvbGRpbmciIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90ZXN0L3dlYiIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJYZXJjZXMiIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJIU1FMREIiIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJHcm9vdnkiIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeVByb3BlcnRpZXMgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iVmNzTWFuYWdlckNvbmZpZ3VyYXRpb24iPgotICAgIDxvcHRpb24gbmFtZT0iQUNUSVZFX1ZDU19OQU1FIiB2YWx1ZT0iQ1ZTIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFX1BST0pFQ1RfVkNTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvY29tcG9uZW50PgotPC9tb2R1bGU+Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9HcmFpbHMuaW1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL0dyYWlscy5pbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjA5MWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL0dyYWlscy5pbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxtb2R1bGUgdmVyc2lvbj0iNCIgcmVsYXRpdmVQYXRocz0idHJ1ZSIgdHlwZT0iSkFWQV9NT0RVTEUiPgotICA8Y29tcG9uZW50IG5hbWU9Ik1vZHVsZVJvb3RNYW5hZ2VyIiAvPgotICA8Y29tcG9uZW50IG5hbWU9Ik5ld01vZHVsZVJvb3RNYW5hZ2VyIj4KLSAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KLSAgICA8ZXhjbHVkZS1vdXRwdXQgLz4KLSAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+Ci0gICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9jb21tb25zIiBpc1Rlc3RTb3VyY2U9ImZhbHNlIiAvPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3BlcnNpc3RlbmNlIiBpc1Rlc3RTb3VyY2U9ImZhbHNlIiAvPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3dlYiIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3Rlc3QvY29tbW9ucyIgaXNUZXN0U291cmNlPSJ0cnVlIiAvPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGVzdC9wZXJzaXN0ZW5jZSIgaXNUZXN0U291cmNlPSJ0cnVlIiAvPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGVzdC93ZWIiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KLSAgICAgIDxleGNsdWRlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9kaXN0IiAvPgotICAgICAgPGV4Y2x1ZGVGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL2xpYiIgLz4KLSAgICA8L2NvbnRlbnQ+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0iaW5oZXJpdGVkSmRrIiAvPgotICAgIDxvcmRlckVudHJ5IHR5cGU9InNvdXJjZUZvbGRlciIgZm9yVGVzdHM9ImZhbHNlIiAvPgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvZ3Jvb3Z5LWFsbC0xLjAtanNyLTAzLVNOQVBTSE9ULmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvZG9tNGotMS42LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL2FzbS1hdHRycy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2hpYmVybmF0ZS9oaWJlcm5hdGUzLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaHNxbGRiLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL3htbC1hcGlzLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL2VoY2FjaGUtMS4xLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL2FzbS5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL3NwcmluZy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2NvbW1vbnMtbG9nZ2luZy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2hpYmVybmF0ZS9jZ2xpYi0yLjEuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9jb21tb25zLWRiY3AtMS4yLjEuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9zZXJ2bGV0LWFwaS5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL3N0YW5kYXJkLTIuMy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL3NwcmluZ21vZHVsZXMtc2FuZGJveC5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL3NwcmluZy1tb2NrLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvc3ByaW5nLWJpbmRpbmcuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9jb21tb25zLWNvbGxlY3Rpb25zLTMuMC5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL3NwcmluZy13ZWJmbG93LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvY29tbW9ucy1sYW5nLTIuMC5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2xvZzRqLTEuMi44LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL2pkYmMyXzAtc3RkZXh0LmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvanVuaXQuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9vZ25sLTIuNy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2pzdGwtMi4zLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZS1saWJyYXJ5Ij4KLSAgICAgIDxsaWJyYXJ5PgotICAgICAgICA8Q0xBU1NFUz4KLSAgICAgICAgICA8cm9vdCB1cmw9ImphcjovLyRNT0RVTEVfRElSJC9saWIvaGliZXJuYXRlL2VqYi0zLjAtZWRyMi5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2hpYmVybmF0ZS9oaWJlcm5hdGUtYW5ub3RhdGlvbnMuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9oaWJlcm5hdGUvYW50bHItMi43LjVIMy5qYXIhLyIgLz4KLSAgICAgICAgPC9DTEFTU0VTPgotICAgICAgICA8SkFWQURPQyAvPgotICAgICAgICA8U09VUkNFUyAvPgotICAgICAgPC9saWJyYXJ5PgotICAgIDwvb3JkZXJFbnRyeT4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2hpYmVybmF0ZS9qdGEuamFyIS8iIC8+Ci0gICAgICAgIDwvQ0xBU1NFUz4KLSAgICAgICAgPEpBVkFET0MgLz4KLSAgICAgICAgPFNPVVJDRVMgLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L29yZGVyRW50cnk+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlLWxpYnJhcnkiPgotICAgICAgPGxpYnJhcnk+Ci0gICAgICAgIDxDTEFTU0VTPgotICAgICAgICAgIDxyb290IHVybD0iamFyOi8vJE1PRFVMRV9ESVIkL2xpYi9jb21tb25zLXBvb2wtMS4yLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTIC8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Imdyb292eSIgbGV2ZWw9ImFwcGxpY2F0aW9uIiAvPgotICAgIDxvcmRlckVudHJ5UHJvcGVydGllcyAvPgotICA8L2NvbXBvbmVudD4KLTwvbW9kdWxlPgotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzM2ZGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50CisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyAgIENvcHlyaWdodCAyMDAxLTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgRXh0cmFjdCBsYXVuY2ggYW5kIGFudCBhcmd1bWVudHMsIChzZWUgZGV0YWlscyBiZWxvdykuCi1hbnRfZXhlY19hcmdzPQotbm9fY29uZmlnPWZhbHNlCi11c2VfamlrZXNfZGVmYXVsdD1mYWxzZQotYW50X2V4ZWNfZGVidWc9ZmFsc2UKLXNob3dfaGVscD1mYWxzZQotZm9yIGFyZyBpbiAiJEAiIDsgZG8KLSAgaWYgWyAiJGFyZyIgPSAiLS1ub2NvbmZpZyIgXSA7IHRoZW4KLSAgICBub19jb25maWc9dHJ1ZQotICBlbGlmIFsgIiRhcmciID0gIi0tdXNlamlrZXMiIF0gOyB0aGVuCi0gICAgdXNlX2ppa2VzX2RlZmF1bHQ9dHJ1ZQotICBlbGlmIFsgIiRhcmciID0gIi0tZXhlY2RlYnVnIiBdIDsgdGhlbgotICAgIGFudF9leGVjX2RlYnVnPXRydWUKLSAgZWxpZiBbIG15IiRhcmciID0gbXkiLS1oIiAgLW8gbXkiJGFyZyIgPSBteSItLWhlbHAiICBdIDsgdGhlbgotICAgIHNob3dfaGVscD10cnVlCi0gICAgYW50X2V4ZWNfYXJncz0iJGFudF9leGVjX2FyZ3MgLWgiCi0gIGVsc2UKLSAgICBpZiBbICBteSIkYXJnIiA9IG15Ii1oIiAgLW8gIG15IiRhcmciID0gbXkiLWhlbHAiIF0gOyB0aGVuCi0gICAgICBzaG93X2hlbHA9dHJ1ZQotICAgIGZpCi0gICAgYW50X2V4ZWNfYXJncz0iJGFudF9leGVjX2FyZ3MgXCIkYXJnXCIiCi0gIGZpCi1kb25lCi0KLSMgU291cmNlL2RlZmF1bHQgYW50IGNvbmZpZ3VyYXRpb24KLWlmICRub19jb25maWcgOyB0aGVuCi0gIHJwbV9tb2RlPWZhbHNlCi0gIHVzZWppa2VzPSR1c2VfamlrZXNfZGVmYXVsdAotZWxzZQotICAjIGxvYWQgc3lzdGVtLXdpZGUgYW50IGNvbmZpZ3VyYXRpb24KLSAgaWYgWyAtZiAiL2V0Yy9hbnQuY29uZiIgXSA7IHRoZW4KLSAgICAuIC9ldGMvYW50LmNvbmYKLSAgZmkKLQotICAjIGxvYWQgdXNlciBhbnQgY29uZmlndXJhdGlvbgotICBpZiBbIC1mICIkSE9NRS8uYW50L2FudC5jb25mIiBdIDsgdGhlbgotICAgIC4gJEhPTUUvLmFudC9hbnQuY29uZgotICBmaQotICBpZiBbIC1mICIkSE9NRS8uYW50cmMiIF0gOyB0aGVuCi0gICAgLiAiJEhPTUUvLmFudHJjIgotICBmaQotCi0gICMgcHJvdmlkZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdmFsdWVzCi0gIGlmIFsgLXogIiRycG1fbW9kZSIgXSA7IHRoZW4KLSAgICBycG1fbW9kZT1mYWxzZQotICBmaQotICBpZiBbIC16ICIkdXNlamlrZXMiIF0gOyB0aGVuCi0gICAgdXNlamlrZXM9JHVzZV9qaWtlc19kZWZhdWx0Ci0gIGZpCi1maQotCi0jIFNldHVwIEphdmEgZW52aXJvbm1lbnQgaW4gcnBtIG1vZGUKLWlmICRycG1fbW9kZSA7IHRoZW4KLSAgaWYgWyAtZiAvdXNyL3NoYXJlL2phdmEtdXRpbHMvamF2YS1mdW5jdGlvbnMgXSA7IHRoZW4KLSAgICAuIC91c3Ivc2hhcmUvamF2YS11dGlscy9qYXZhLWZ1bmN0aW9ucwotICAgIHNldF9qdm0KLSAgICBzZXRfamF2YWNtZAotICBmaQotZmkKLQotIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgotY3lnd2luPWZhbHNlOwotZGFyd2luPWZhbHNlOwotY2FzZSAiYHVuYW1lYCIgaW4KLSAgQ1lHV0lOKikgY3lnd2luPXRydWUgOzsKLSAgRGFyd2luKikgZGFyd2luPXRydWUKLSAgICAgICAgICAgaWYgWyAteiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KLSAgICAgICAgICAgICBKQVZBX0hPTUU9L1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9Ib21lCi0gICAgICAgICAgIGZpCi0gICAgICAgICAgIDs7Ci1lc2FjCi0KLWlmIFsgLXogIiRBTlRfSE9NRSIgLW8gISAtZCAiJEFOVF9IT01FIiBdIDsgdGhlbgotICAjIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgbGluayB0byBhbnQncyBob21lCi0gIFBSRz0iJDAiCi0gIHByb2duYW1lPWBiYXNlbmFtZSAiJDAiYAotCi0gICMgbmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcwotICB3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICBQUkc9IiRsaW5rIgotICAgIGVsc2UKLSAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiCi0gICAgZmkKLSAgZG9uZQotCi0gIEFOVF9IT01FPWBkaXJuYW1lICIkUFJHImAvLi4KLQotICAjIG1ha2UgaXQgZnVsbHkgcXVhbGlmaWVkCi0gIEFOVF9IT01FPWBjZCAiJEFOVF9IT01FIiAmJiBwd2RgCi1maQotCi0jIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKLWlmICRjeWd3aW4gOyB0aGVuCi0gIFsgLW4gIiRBTlRfSE9NRSIgXSAmJgotICAgIEFOVF9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEFOVF9IT01FImAKLSAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJgotICAgIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAotZmkKLQotIyBzZXQgQU5UX0xJQiBsb2NhdGlvbgotQU5UX0xJQj0iJHtBTlRfSE9NRX0vbGliIgotCi1pZiBbIC16ICIkSkFWQUNNRCIgXSA7IHRoZW4KLSAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgIF0gOyB0aGVuCi0gICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KLSAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKLSAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCi0gICAgZWxzZQotICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLSAgICBmaQotICBlbHNlCi0gICAgSkFWQUNNRD1gd2hpY2ggamF2YSAyPiAvZGV2L251bGwgYAotICAgIGlmIFsgLXogIiRKQVZBQ01EIiBdIDsgdGhlbgotICAgICAgICBKQVZBQ01EPWphdmEKLSAgICBmaQotICBmaQotZmkKLQotaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KLSAgZWNobyAiRXJyb3I6IEpBVkFfSE9NRSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuIgotICBlY2hvICIgIFdlIGNhbm5vdCBleGVjdXRlICRKQVZBQ01EIgotICBleGl0IDEKLWZpCi0KLSMgQnVpbGQgbG9jYWwgY2xhc3NwYXRoIHVzaW5nIGp1c3QgdGhlIGxhdW5jaGVyIGluIG5vbi1ycG0gbW9kZSBvcgotIyB1c2UgdGhlIEpwYWNrYWdlIGhlbHBlciBpbiBycG0gbW9kZSB3aXRoIGJhc2ljIGFuZCBkZWZhdWx0IGphcnMKLSMgc3BlY2lmaWVkIGluIHRoZSBhbnQuY29uZiBjb25maWd1cmF0aW9uLiBCZWNhdXNlIHRoZSBsYXVuY2hlciBpcwotIyB1c2VkLCBsaWJyYXJpZXMgbGlua2VkIGluIEFOVF9IT01FIHdpbGwgYWxzbyBiZSBpbmNsdWRlLCBidXQgdGhpcwotIyBpcyBkaXNjb3VyYWdlZCBhcyBpdCBpcyBub3QgamF2YS12ZXJzaW9uIHNhZmUuIEEgdXNlciBzaG91bGQKLSMgcmVxdWVzdCBvcHRpb25hbCBqYXJzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdmlhIHRoZSBPUFRfSkFSX0xJU1QKLSMgdmFyaWFibGUKLWlmICRycG1fbW9kZSAmJiBbIC1mIC91c3IvYmluL2J1aWxkLWNsYXNzcGF0aCBdIDsgdGhlbgotICBMT0NBTENMQVNTUEFUSD0iJCgvdXNyL2Jpbi9idWlsZC1jbGFzc3BhdGggYW50IGFudC1sYXVuY2hlciBqYXhwX3BhcnNlcl9pbXBsIHhtbC1jb21tb25zLWFwaXMpIgotICAjIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB0byB0cnkgdG8gYWRkIHNvbWUgb3RoZXIgamFycyB0byB0aGUgY2xhc3NwYXRoCi0gIGlmIFsgLW4gIiRPUFRfSkFSX0xJU1QiIF0gOyB0aGVuCi0gICAgX09QVENMQVNTUEFUSD0iJCgvdXNyL2Jpbi9idWlsZC1jbGFzc3BhdGggJE9QVF9KQVJfTElTVCAyPiAvZGV2L251bGwpIgotICAgIGlmIFsgLW4gIiRfT1BUQ0xBU1NQQVRIIiBdIDsgdGhlbiAKLSAgICAgIExPQ0FMQ0xBU1NQQVRIPSIkTE9DQUxDTEFTU1BBVEg6JF9PUFRDTEFTU1BBVEgiCi0gICAgZmkKLSAgZmkKLQotICAjIEV4cGxpY2l0bHkgYWRkIGphdmFjIHBhdGggdG8gY2xhc3NwYXRoLCBhc3N1bWUgSkFWQV9IT01FIHNldAotICAjIHByb3Blcmx5IGluIHJwbSBtb2RlCi0gIGlmIFsgLWYgIiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIgXSA7IHRoZW4KLSAgICBMT0NBTENMQVNTUEFUSD0iJExPQ0FMQ0xBU1NQQVRIOiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIKLSAgZmkKLSAgaWYgWyAtZiAiJEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAiIF0gOyB0aGVuCi0gICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcCIKLSAgZmkKLQotICAjIGlmIENMQVNTUEFUSF9PVkVSUklERSBlbnYgdmFyIGlzIHNldCwgTE9DQUxDTEFTU1BBVEggd2lsbCBiZQotICAjIHVzZXIgQ0xBU1NQQVRIIGZpcnN0IGFuZCBhbnQtZm91bmQgamFycyBhZnRlci4KLSAgIyBJbiB0aGF0IGNhc2UsIHRoZSB1c2VyIENMQVNTUEFUSCB3aWxsIG92ZXJyaWRlIGFudC1mb3VuZCBqYXJzCi0gICMKLSAgIyBpZiBDTEFTU1BBVEhfT1ZFUlJJREUgaXMgbm90IHNldCwgd2UnbGwgaGF2ZSB0aGUgbm9ybWFsIGJlaGF2aW91cgotICAjIHdpdGggYW50LWZvdW5kIGphcnMgZmlyc3QgYW5kIHVzZXIgQ0xBU1NQQVRIIGFmdGVyCi0gIGlmIFsgLW4gIiRDTEFTU1BBVEgiIF0gOyB0aGVuCi0gICAgIyBtZXJnZSBsb2NhbCBhbmQgc3BlY2lmaWVkIGNsYXNzcGF0aCAKLSAgICBpZiBbIC16ICIkTE9DQUxDTEFTU1BBVEgiIF0gOyB0aGVuIAotICAgICAgTE9DQUxDTEFTU1BBVEg9IiRDTEFTU1BBVEgiCi0gICAgZWxpZiBbIC1uICIkQ0xBU1NQQVRIX09WRVJSSURFIiBdIDsgdGhlbgotICAgICAgTE9DQUxDTEFTU1BBVEg9IiRDTEFTU1BBVEg6JExPQ0FMQ0xBU1NQQVRIIgotICAgIGVsc2UKLSAgICAgIExPQ0FMQ0xBU1NQQVRIPSIkTE9DQUxDTEFTU1BBVEg6JENMQVNTUEFUSCIKLSAgICBmaQotCi0gICAgIyByZW1vdmUgY2xhc3MgcGF0aCBmcm9tIGxhdW5jaGVyIC1jcCBvcHRpb24KLSAgICBDTEFTU1BBVEg9IiIKLSAgZmkKLWVsc2UKLSAgIyBub3QgdXNpbmcgcnBtX21vZGU7IHVzZSBsYXVuY2hlciB0byBkZXRlcm1pbmUgY2xhc3NwYXRocwotICBpZiBbIC16ICIkTE9DQUxDTEFTU1BBVEgiIF0gOyB0aGVuCi0gICAgICBMT0NBTENMQVNTUEFUSD0kQU5UX0xJQi9hbnQtbGF1bmNoZXIuamFyCi0gIGVsc2UKLSAgICAgIExPQ0FMQ0xBU1NQQVRIPSRBTlRfTElCL2FudC1sYXVuY2hlci5qYXI6JExPQ0FMQ0xBU1NQQVRICi0gIGZpCi1maQotCi1pZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgotICAjIE9TWCBoYWNrIHRvIG1ha2UgQW50IHdvcmsgd2l0aCBqaWtlcwotICBpZiAkZGFyd2luIDsgdGhlbgotICAgIE9TWEhBQ0s9IiR7SkFWQV9IT01FfS8uLi9DbGFzc2VzIgotICAgIGlmIFsgLWQgIiR7T1NYSEFDS30iIF0gOyB0aGVuCi0gICAgICBmb3IgaSBpbiAiJHtPU1hIQUNLfSIvKi5qYXIKLSAgICAgIGRvCi0gICAgICAgIEpJS0VTUEFUSD0iJEpJS0VTUEFUSDokaSIKLSAgICAgIGRvbmUKLSAgICBmaQotICBmaQotZmkKLQotIyBBbGxvdyBKaWtlcyBzdXBwb3J0IChvZmYgYnkgZGVmYXVsdCkKLWlmICR1c2VqaWtlczsgdGhlbgotICBBTlRfT1BUUz0iJEFOVF9PUFRTIC1EYnVpbGQuY29tcGlsZXI9amlrZXMiCi1maQotCi0jIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBhcHByb3ByaWF0ZSBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQotIyBGb3IgUEFUSHMgY29udmVydCB0byB1bml4IGZvcm1hdCBmaXJzdCwgdGhlbiB0byB3aW5kb3dzIGZvcm1hdCB0byBlbnN1cmUKLSMgYm90aCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuIFByb2JhYmx5IHRoaXMgd2lsbCBmYWlsIG9uIGRpcmVjdG9yaWVzIHdpdGggOwotIyBpbiB0aGUgbmFtZSBpbiB0aGUgcGF0aC4gTGV0J3MgYXNzdW1lIHRoYXQgcGF0aHMgY29udGFpbmluZyA7IGFyZSBtb3JlCi0jIHJhcmUgdGhhbiB3aW5kb3dzIHN0eWxlIHBhdGhzIG9uIGN5Z3dpbi4KLWlmICRjeWd3aW47IHRoZW4KLSAgaWYgWyAiJE9TIiA9ICJXaW5kb3dzX05UIiBdICYmIGN5Z3BhdGggLW0gLj4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCi0gICAgZm9ybWF0PW1peGVkCi0gIGVsc2UKLSAgICBmb3JtYXQ9d2luZG93cwotICBmaQotICBBTlRfSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRBTlRfSE9NRSJgCi0gIEFOVF9MSUI9YGN5Z3BhdGggLS0kZm9ybWF0ICIkQU5UX0xJQiJgCi0gIEpBVkFfSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRKQVZBX0hPTUUiYAotICBMQ1BfVEVNUD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTE9DQUxDTEFTU1BBVEgiYAotICBMT0NBTENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS0kZm9ybWF0ICIkTENQX1RFTVAiYAotICBpZiBbIC1uICIkQ0xBU1NQQVRIIiBdIDsgdGhlbgotICAgIENQX1RFTVA9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCi0gICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLSRmb3JtYXQgIiRDUF9URU1QImAKLSAgZmkKLSAgQ1lHSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRIT01FImAKLWZpCi0KLSMgU2hvdyBzY3JpcHQgaGVscCBpZiByZXF1ZXN0ZWQKLWlmICRzaG93X2hlbHAgOyB0aGVuCi0gIGVjaG8gJDAgJ1tzY3JpcHQgb3B0aW9uc10gW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uXV0nCi0gIGVjaG8gJ1NjcmlwdCBPcHRpb25zOicKLSAgZWNobyAnICAtLWhlbHAsIC0taCAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgYW50IGhlbHAnCi0gIGVjaG8gJyAgLS1ub2NvbmZpZyAgICAgICAgICAgICBzdXBwcmVzcyBzb3VyY2luZyBvZiAvZXRjL2FudC5jb25mLCcKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgICRIT01FLy5hbnQvYW50LmNvbmYsIGFuZCAkSE9NRS8uYW50cmMnCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzJwotICBlY2hvICcgIC0tdXNlamlrZXMgICAgICAgICAgICAgZW5hYmxlIHVzZSBvZiBqaWtlcyBieSBkZWZhdWx0LCB1bmxlc3MnCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXhwbGljaXRseSBpbiBjb25maWd1cmF0aW9uIGZpbGVzJwotICBlY2hvICcgIC0tZXhlY2RlYnVnICAgICAgICAgICAgcHJpbnQgYW50IGV4ZWMgbGluZSBnZW5lcmF0ZWQgYnkgdGhpcycKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaCBzY3JpcHQnCi0gIGVjaG8gJyAgJwotZmkKLSMgYWRkIGEgc2Vjb25kIGJhY2tzbGFzaCB0byB2YXJpYWJsZXMgdGVybWluYXRlZCBieSBhIGJhY2tzbGFzaCB1bmRlciBjeWd3aW4KLWlmICRjeWd3aW47IHRoZW4KLSAgY2FzZSAiJEFOVF9IT01FIiBpbgotICAgICpcXCApCi0gICAgQU5UX0hPTUU9IiRBTlRfSE9NRVxcIgotICAgIDs7Ci0gIGVzYWMKLSAgY2FzZSAiJENZR0hPTUUiIGluCi0gICAgKlxcICkKLSAgICBDWUdIT01FPSIkQ1lHSE9NRVxcIgotICAgIDs7Ci0gIGVzYWMKLSAgY2FzZSAiJEpJS0VTUEFUSCIgaW4KLSAgICAqXFwgKQotICAgIEpJS0VTUEFUSD0iJEpJS0VTUEFUSFxcIgotICAgIDs7Ci0gIGVzYWMKLSAgY2FzZSAiJExPQ0FMQ0xBU1NQQVRIIiBpbgotICAgICpcXCApCi0gICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSFxcIgotICAgIDs7Ci0gIGVzYWMKLSAgY2FzZSAiJENMQVNTUEFUSCIgaW4KLSAgICAqXFwgKQotICAgIENMQVNTUEFUSD0iJENMQVNTUEFUSFxcIgotICAgIDs7Ci0gIGVzYWMKLWZpCi0jIEV4ZWN1dGUgYW50IHVzaW5nIGV2YWwvZXhlYyB0byBwcmVzZXJ2ZSBzcGFjZXMgaW4gcGF0aHMsCi0jIGphdmEgb3B0aW9ucywgYW5kIGFudCBhcmdzCi1hbnRfc3lzX29wdHM9Ci1pZiBbIC1uICIkQ1lHSE9NRSIgXTsgdGhlbgotICBpZiBbIC1uICIkSklLRVNQQVRIIiBdOyB0aGVuCi0gICAgYW50X3N5c19vcHRzPSItRGppa2VzLmNsYXNzLnBhdGg9XCIkSklLRVNQQVRIXCIgLURjeWd3aW4udXNlci5ob21lPVwiJENZR0hPTUVcIiIKLSAgZWxzZQotICAgIGFudF9zeXNfb3B0cz0iLURjeWd3aW4udXNlci5ob21lPVwiJENZR0hPTUVcIiIKLSAgZmkKLWVsc2UKLSAgaWYgWyAtbiAiJEpJS0VTUEFUSCIgXTsgdGhlbgotICAgIGFudF9zeXNfb3B0cz0iLURqaWtlcy5jbGFzcy5wYXRoPVwiJEpJS0VTUEFUSFwiIgotICBmaQotZmkKLWFudF9leGVjX2NvbW1hbmQ9ImV4ZWMgXCIkSkFWQUNNRFwiICRBTlRfT1BUUyAtY2xhc3NwYXRoIFwiJExPQ0FMQ0xBU1NQQVRIXCIgLURhbnQuaG9tZT1cIiRBTlRfSE9NRVwiIC1EYW50LmxpYnJhcnkuZGlyPVwiJEFOVF9MSUJcIiAkYW50X3N5c19vcHRzIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAkQU5UX0FSR1MgLWNwIFwiJENMQVNTUEFUSFwiICRhbnRfZXhlY19hcmdzIgotaWYgJGFudF9leGVjX2RlYnVnIDsgdGhlbgotICAgIGVjaG8gJGFudF9leGVjX2NvbW1hbmQKLWZpCi1ldmFsICRhbnRfZXhlY19jb21tYW5kCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnQuYmF0IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkYWZhYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLUBlY2hvIG9mZgotCi1SRU0gIENvcHlyaWdodCAyMDAxLDIwMDQtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLVJFTQotUkVNICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLVJFTSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotUkVNICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTQotUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1SRU0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotUkVNICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotUkVNICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVJFTSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotUkVNICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaWYgZXhpc3QgIiVIT01FJVxhbnRyY19wcmUuYmF0IiBjYWxsICIlSE9NRSVcYW50cmNfcHJlLmJhdCIKLQotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgQHNldGxvY2FsCi1pZiAiJU9TJSI9PSJXSU5OVCIgQHNldGxvY2FsCi0KLXJlbSAlfmRwMCBpcyBleHBhbmRlZCBwYXRobmFtZSBvZiB0aGUgY3VycmVudCBzY3JpcHQgdW5kZXIgTlQKLXNldCBERUZBVUxUX0FOVF9IT01FPSV+ZHAwLi4KLQotaWYgIiVBTlRfSE9NRSUiPT0iIiBzZXQgQU5UX0hPTUU9JURFRkFVTFRfQU5UX0hPTUUlCi1zZXQgREVGQVVMVF9BTlRfSE9NRT0KLQotc2V0IF9VU0VfQ0xBU1NQQVRIPXllcwotCi1yZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIFRoaXMgbG9vcCBhbGxvd3MgZm9yIGFuIHVubGltaXRlZCBudW1iZXIKLXJlbSBvZiBhcmd1bWVudHMgKHVwIHRvIHRoZSBjb21tYW5kIGxpbmUgbGltaXQsIGFueXdheSkuCi1zZXQgQU5UX0NNRF9MSU5FX0FSR1M9JTEKLWlmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTdGFydAotc2hpZnQKLTpzZXR1cEFyZ3MKLWlmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTdGFydAotaWYgIiIlMSIiPT0iIi1ub2NsYXNzcGF0aCIiIGdvdG8gY2xlYXJjbGFzc3BhdGgKLXNldCBBTlRfQ01EX0xJTkVfQVJHUz0lQU5UX0NNRF9MSU5FX0FSR1MlICUxCi1zaGlmdAotZ290byBzZXR1cEFyZ3MKLQotcmVtIGhlcmUgaXMgdGhlcmUgaXMgYSAtbm9jbGFzc3BhdGggaW4gdGhlIG9wdGlvbnMKLTpjbGVhcmNsYXNzcGF0aAotc2V0IF9VU0VfQ0xBU1NQQVRIPW5vCi1zaGlmdAotZ290byBzZXR1cEFyZ3MKLQotcmVtIFRoaXMgbGFiZWwgcHJvdmlkZXMgYSBwbGFjZSBmb3IgdGhlIGFyZ3VtZW50IGxpc3QgbG9vcCB0byBicmVhayBvdXQKLXJlbSBhbmQgZm9yIE5UIGhhbmRsaW5nIHRvIHNraXAgdG8uCi0KLTpkb25lU3RhcnQKLXJlbSBmaW5kIEFOVF9IT01FIGlmIGl0IGRvZXMgbm90IGV4aXN0IGR1ZSB0byBlaXRoZXIgYW4gaW52YWxpZCB2YWx1ZSBwYXNzZWQKLXJlbSBieSB0aGUgdXNlciBvciB0aGUgJTAgcHJvYmxlbSBvbiBXaW5kb3dzIDl4Ci1pZiBleGlzdCAiJUFOVF9IT01FJVxsaWJcYW50LmphciIgZ290byBjaGVja0phdmEKLQotcmVtIGNoZWNrIGZvciBhbnQgaW4gUHJvZ3JhbSBGaWxlcwotaWYgbm90IGV4aXN0ICIlUHJvZ3JhbUZpbGVzJVxhbnQiIGdvdG8gY2hlY2tTeXN0ZW1Ecml2ZQotc2V0IEFOVF9IT01FPSVQcm9ncmFtRmlsZXMlXGFudAotZ290byBjaGVja0phdmEKLQotOmNoZWNrU3lzdGVtRHJpdmUKLXJlbSBjaGVjayBmb3IgYW50IGluIHJvb3QgZGlyZWN0b3J5IG9mIHN5c3RlbSBkcml2ZQotaWYgbm90IGV4aXN0ICVTeXN0ZW1Ecml2ZSVcYW50XGxpYlxhbnQuamFyIGdvdG8gY2hlY2tDRHJpdmUKLXNldCBBTlRfSE9NRT0lU3lzdGVtRHJpdmUlXGFudAotZ290byBjaGVja0phdmEKLQotOmNoZWNrQ0RyaXZlCi1yZW0gY2hlY2sgZm9yIGFudCBpbiBDOlxhbnQgZm9yIFdpbjlYIHVzZXJzCi1pZiBub3QgZXhpc3QgQzpcYW50XGxpYlxhbnQuamFyIGdvdG8gbm9BbnRIb21lCi1zZXQgQU5UX0hPTUU9QzpcYW50Ci1nb3RvIGNoZWNrSmF2YQotCi06bm9BbnRIb21lCi1lY2hvIEFOVF9IT01FIGlzIHNldCBpbmNvcnJlY3RseSBvciBhbnQgY291bGQgbm90IGJlIGxvY2F0ZWQuIFBsZWFzZSBzZXQgQU5UX0hPTUUuCi1nb3RvIGVuZAotCi06Y2hlY2tKYXZhCi1zZXQgX0pBVkFDTUQ9JUpBVkFDTUQlCi0KLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBub0phdmFIb21lCi1pZiBub3QgZXhpc3QgIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgZ290byBub0phdmFIb21lCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPSVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZQotZ290byBjaGVja0ppa2VzCi0KLTpub0phdmFIb21lCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPWphdmEuZXhlCi0KLTpjaGVja0ppa2VzCi1pZiBub3QgIiVKSUtFU1BBVEglIj09IiIgZ290byBydW5BbnRXaXRoSmlrZXMKLQotOnJ1bkFudAotaWYgIiVfVVNFX0NMQVNTUEFUSCUiPT0ibm8iIGdvdG8gcnVuQW50Tm9DbGFzc3BhdGgKLWlmIG5vdCAiJUNMQVNTUEFUSCUiPT0iIiBnb3RvIHJ1bkFudFdpdGhDbGFzc3BhdGgKLSIlX0pBVkFDTUQlIiAlQU5UX09QVFMlIC1jbGFzc3BhdGggIiVBTlRfSE9NRSVcbGliXGFudC1sYXVuY2hlci5qYXIiICItRGFudC5ob21lPSVBTlRfSE9NRSUiIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAlQU5UX0FSR1MlICVBTlRfQ01EX0xJTkVfQVJHUyUKLWdvdG8gZW5kCi0KLTpydW5BbnROb0NsYXNzcGF0aAotIiVfSkFWQUNNRCUiICVBTlRfT1BUUyUgLWNsYXNzcGF0aCAiJUFOVF9IT01FJVxsaWJcYW50LWxhdW5jaGVyLmphciIgIi1EYW50LmhvbWU9JUFOVF9IT01FJSIgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVBTlRfQVJHUyUgJUFOVF9DTURfTElORV9BUkdTJQotZ290byBlbmQKLQotOnJ1bkFudFdpdGhDbGFzc3BhdGgKLSIlX0pBVkFDTUQlIiAlQU5UX09QVFMlIC1jbGFzc3BhdGggIiVBTlRfSE9NRSVcbGliXGFudC1sYXVuY2hlci5qYXIiICItRGFudC5ob21lPSVBTlRfSE9NRSUiIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAlQU5UX0FSR1MlIC1jcCAiJUNMQVNTUEFUSCUiICVBTlRfQ01EX0xJTkVfQVJHUyUKLWdvdG8gZW5kCi0KLTpydW5BbnRXaXRoSmlrZXMKLWlmICIlX1VTRV9DTEFTU1BBVEglIj09Im5vIiBnb3RvIHJ1bkFudFdpdGhKaWtlc05vQ2xhc3NwYXRoCi1pZiBub3QgIiVDTEFTU1BBVEglIj09IiIgZ290byBydW5BbnRXaXRoSmlrZXNBbmRDbGFzc3BhdGgKLQotOnJ1bkFudFdpdGhKaWtlc05vQ2xhc3NwYXRoCi0iJV9KQVZBQ01EJSIgJUFOVF9PUFRTJSAtY2xhc3NwYXRoICIlQU5UX0hPTUUlXGxpYlxhbnQtbGF1bmNoZXIuamFyIiAiLURhbnQuaG9tZT0lQU5UX0hPTUUlIiAiLURqaWtlcy5jbGFzcy5wYXRoPSVKSUtFU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJUFOVF9BUkdTJSAlQU5UX0NNRF9MSU5FX0FSR1MlCi1nb3RvIGVuZAotCi06cnVuQW50V2l0aEppa2VzQW5kQ2xhc3NwYXRoCi0iJV9KQVZBQ01EJSIgJUFOVF9PUFRTJSAtY2xhc3NwYXRoICIlQU5UX0hPTUUlXGxpYlxhbnQtbGF1bmNoZXIuamFyIiAiLURhbnQuaG9tZT0lQU5UX0hPTUUlIiAiLURqaWtlcy5jbGFzcy5wYXRoPSVKSUtFU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJUFOVF9BUkdTJSAgLWNwICIlQ0xBU1NQQVRIJSIgJUFOVF9DTURfTElORV9BUkdTJQotZ290byBlbmQKLQotOmVuZAotc2V0IF9KQVZBQ01EPQotc2V0IEFOVF9DTURfTElORV9BUkdTPQotCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAZW5kbG9jYWwKLWlmICIlT1MlIj09IldJTk5UIiBAZW5kbG9jYWwKLQotOm1haW5FbmQKLWlmIGV4aXN0ICIlSE9NRSVcYW50cmNfcG9zdC5iYXQiIGNhbGwgIiVIT01FJVxhbnRyY19wb3N0LmJhdCIKLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50LmNtZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2FudC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjkwM2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qIAotICAgIENvcHlyaWdodCAyMDAzLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gIAotICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gCi0gICAgUnVuIGFudAotKi8KLQotJ0BlY2hvIG9mZicKLXBhcnNlIGFyZyBtb2RlIGVudmFyZyAnOjonIGFudGFyZwotCi1pZiBtb2RlXD0nLicgJiBtb2RlXD0nLi4nICYgbW9kZVw9Jy8nIHRoZW4gZG8KLSAgZW52YXJnID0gbW9kZSBlbnZhcmcKLSAgbW9kZSA9ICcnCi1lbmQKLQotaWYgYW50YXJnID0gJycgdGhlbiBkbwotICBhbnRhcmcgPSBlbnZhcmcKLSAgZW52YXJnID0gJycKLWVuZAotCi14ID0gc2V0bG9jYWwoKQotCi1lbnY9Ik9TMkVOVklST05NRU5UIgotYW50ZW52ID0gX2dldGVudl8oJ2FudGVudicpCi1pZiBfdGVzdGVudl8oKSA9IDAgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgYW50ZW52IHx8ICciJyAnIicgfHwgZW52YXJnIHx8ICciJwotCi1pZiBtb2RlID0gJycgdGhlbiBtb2RlID0gX2dldGVudl8oJ0FOVF9NT0RFJyAnLi4nKQotaWYgbW9kZSBcPSAnLycgdGhlbiBkbwotICBydW5yYyA9IF9nZXRlbnZfKCdydW5yYycpCi0gIGFudHJjID0gX2dldGVudl8oJ2FudHJjJyAnYW50cmMuY21kJykKLSAgaWYgbW9kZSA9ICcuLicgdGhlbiBtb2RlID0gJy1yJwotICBlbHNlIG1vZGUgPSAnJwotICBpbnRlcnByZXQgJ2NhbGwgIicgfHwgcnVucmMgfHwgJyInIGFudHJjICciJyB8fCBtb2RlIHx8ICciJwotZW5kCi0KLWlmIF90ZXN0ZW52XygpID0gMCB0aGVuIGRvCi0gIHNheSAnQW50IGVudmlyb25tZW50IGlzIG5vdCBzZXQgcHJvcGVybHknCi0gIHggPSBlbmRsb2NhbCgpCi0gIGV4aXQgMTYKLWVuZAotCi1zZXR0aW5ncyA9ICctRGFudC5ob21lPScgfHwgQU5UX0hPTUUgJy1EamF2YS5ob21lPScgfHwgSkFWQV9IT01FCi0KLWphdmEgPSBfZ2V0ZW52XygnamF2YWNtZCcgJ2phdmEnKQotb3B0cyA9IHZhbHVlKCdBTlRfT1BUUycsLGVudikKLWFyZ3MgPSB2YWx1ZSgnQU5UX0FSR1MnLCxlbnYpCi1sY3AgPSB2YWx1ZSgnTE9DQUxDTEFTU1BBVEgnLCxlbnYpCi1jcCA9IHZhbHVlKCdDTEFTU1BBVEgnLCxlbnYpCi1pZiB2YWx1ZSgnQU5UX1VTRV9DUCcsLGVudikgXD0gJycgdGhlbiBkbwotICBpZiBsY3AgXD0gJycgJiByaWdodChsY3AsIDEpIFw9ICc7JyB0aGVuIGxjcCA9IGxjcCB8fCAnOycKLSAgbGNwID0gbGNwIHx8IGNwCi0gICdTRVQgQ0xBU1NQQVRIPScKLWVuZAotaWYgbGNwXD0nJyB0aGVuIGxjcCA9ICctY2xhc3NwYXRoJyBsY3AKLQotY21kID0gamF2YSBvcHRzIGxjcCAnLWphcicgQU5UX0hPTUUgfHwnXGxpYlxhbnQtbGF1bmNoZXIuamFyJyBzZXR0aW5ncyBhcmdzIGFudGFyZwotbGF1bmNoZXIgPSBzdHJlYW0oQU5UX0hPTUUgfHwnXGxpYlxhbnQtbGF1bmNoZXIuamFyJywgJ0MnLCAncXVlcnkgZXhpc3RzJykKLWlmIGxhdW5jaGVyID0gJycgdGhlbiBlbnRyeSA9ICdvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluJwotZWxzZSBlbnRyeSA9ICdvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXInCi1qYXZhIG9wdHMgbGNwIGVudHJ5IHNldHRpbmdzIGFyZ3MgYW50YXJnCi0KLXggPSBlbmRsb2NhbCgpCi0KLXJldHVybiByYwotCi1fdGVzdGVudl86IHByb2NlZHVyZSBleHBvc2UgZW52IEFOVF9IT01FIEpBVkFfSE9NRQotQU5UX0hPTUUgPSB2YWx1ZSgnQU5UX0hPTUUnLCxlbnYpCi1pZiBBTlRfSE9NRSA9ICcnIHRoZW4gcmV0dXJuIDAKLUpBVkFfSE9NRSA9IHZhbHVlKCdKQVZBX0hPTUUnLCxlbnYpCi1pZiBKQVZBX0hPTUUgPSAnJyB0aGVuIHJldHVybiAwCi1jcCA9IHRyYW5zbGF0ZSh2YWx1ZSgnQ0xBU1NQQVRIJywsZW52KSkKLWlmIHBvcyh0cmFuc2xhdGUoQU5UX0hPTUUpLCBjcCkgPSAwIHRoZW4gcmV0dXJuIDAKLWlmIHBvcyh0cmFuc2xhdGUoSkFWQV9IT01FKSwgY3ApID0gMCB0aGVuIHJldHVybiAwCi1yZXR1cm4gMQotCi1fZ2V0ZW52XzogcHJvY2VkdXJlIGV4cG9zZSBlbnYKLXBhcnNlIGFyZyBlbnZhciBkZWZhdWx0Ci1pZiBkZWZhdWx0ID0gJycgdGhlbiBkZWZhdWx0ID0gZW52YXIKLXZhciA9IHZhbHVlKHRyYW5zbGF0ZShlbnZhciksLGVudikKLWlmIHZhciA9ICcnIHRoZW4gdmFyID0gZGVmYXVsdAotcmV0dXJuIHZhcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50UnVuIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50UnVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRkZDcxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2FudFJ1bgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jCi0jICBDb3B5cmlnaHQgIDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIyAKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKLSMKLQotIyBBcmdzOiBESVIgY29tbWFuZAotY2QgIiQxIgotQ01EPSIkMiIKLXNoaWZ0Ci1zaGlmdAotCi1leGVjICIkQ01EIiAiJEAiCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnRSdW4uYmF0IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50UnVuLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZTE5Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnRSdW4uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLVJFTQotUkVNIENvcHlyaWdodCAgMjAwMS0yMDAyLDIwMDQtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLVJFTQotUkVNICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLVJFTSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotUkVNICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTQotUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1SRU0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotUkVNICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotUkVNICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVJFTSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotUkVNICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLVJFTQotUkVNCi0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIEBzZXRsb2NhbAotaWYgIiVPUyUiPT0iV0lOTlQiIEBzZXRsb2NhbAotCi1pZiAiIiUxIiI9PSIiIiIgZ290byBydW5Db21tYW5kCi0KLXJlbSBDaGFuZ2UgZHJpdmUgYW5kIGRpcmVjdG9yeSB0byAlMQotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgY2QgL2QgIiIlMSIiCi1pZiBub3QgIiVPUyUiPT0iV2luZG93c19OVCIgY2QgIiIlMSIiCi1zaGlmdAotCi1yZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIFRoaXMgbG9vcCBhbGxvd3MgZm9yIGFuIHVubGltaXRlZCBudW1iZXIKLXJlbSBvZiBhZ3J1bWVudHMgKHVwIHRvIHRoZSBjb21tYW5kIGxpbmUgbGltaXQsIGFueXdheSkuCi1zZXQgQU5UX1JVTl9DTUQ9JTEKLWlmICIiJTEiIj09IiIiIiBnb3RvIHJ1bkNvbW1hbmQKLXNoaWZ0Ci06bG9vcAotaWYgIiIlMSIiPT0iIiIiIGdvdG8gcnVuQ29tbWFuZAotc2V0IEFOVF9SVU5fQ01EPSVBTlRfUlVOX0NNRCUgJTEKLXNoaWZ0Ci1nb3RvIGxvb3AKLQotOnJ1bkNvbW1hbmQKLXJlbSBlY2hvICVBTlRfUlVOX0NNRCUKLSVBTlRfUlVOX0NNRCUKLQotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgQGVuZGxvY2FsCi1pZiAiJU9TJSI9PSJXSU5OVCIgQGVuZGxvY2FsCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2FudFJ1bi5wbCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2FudFJ1bi5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZDg2OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnRSdW4ucGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMKLSMgQ29weXJpZ2h0IDIwMDEsMjAwMy0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgYW50UnVuLnBsCi0jCi0jIHdyYXBwZXIgc2NyaXB0IGZvciBpbnZva2luZyBjb21tYW5kcyBvbiBhIHBsYXRmb3JtIHdpdGggUGVybCBpbnN0YWxsZWQKLSMgdGhpcyBpcyBha2luIHRvIGFudFJ1bi5iYXQsIGFuZCBhbnRSdW4gdGhlIFNIIHNjcmlwdCAKLSMKLSMgY3JlYXRlZDogICAgICAgICAyMDAxLTEwLTE4Ci0jIGF1dGhvcjogICAgICAgICAgSmVmZiBUdWxsZXkganR1bGxleUBub3ZlbGwuY29tIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNiZSBmdXNzeSBhYm91dCB2YXJpYWJsZXMKLXVzZSBzdHJpY3Q7Ci0KLSN0dXJuIHdhcm5pbmdzIG9uIGR1cmluZyBkZXY7IGdlbmVyYXRlcyBhIGZldyBzcHVyaW91cyB1bmluaXRpYWxpc2VkIHZhciBhY2Nlc3Mgd2FybmluZ3MKLSN1c2Ugd2FybmluZ3M7Ci0KLSNhbmQgc2V0ICRkZWJ1ZyB0byAxIHRvIHR1cm4gb24gdHJhY2UgaW5mbyAoY3VycmVudGx5IHVudXNlZCkKLW15ICRkZWJ1Zz0xOwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjaGFuZ2UgZHJpdmUgYW5kIGRpcmVjdG9yeSB0byAiJTEiCi1teSAkQU5UX1JVTl9DTUQgPSBAQVJHVlswXTsKLQotIyBhc3NpZ24gY3VycmVudCBydW4gY29tbWFuZCB0byAiJTIiCi1jaGRpciAoQEFSR1ZbMF0pIHx8IGRpZSAiQ2FuJ3QgY2QgdG8gJEFSR1ZbMF06ICQhXG4iOwotaWYgKCReTyBlcSAiTmV0V2FyZSIpIHsKLSAgICAjIFRoZXJlIGlzIGEgYnVnIGluIFBlcmwgNSBvbiBOZXRXYXJlLCB3aGVyZSBjaGRpciBkb2VzIG5vdAotICAgICMgZG8gYW55dGhpbmcuICBPbiBOZXRXYXJlLCB0aGUgZm9sbG93aW5nIHBhdGgtcHJlZml4ZWQgZm9ybSBzaG91bGQgCi0gICAgIyBhbHdheXMgd29yay4gKGFmYWljdCkKLSAgICAkQU5UX1JVTl9DTUQgLj0gIi8iLkBBUkdWWzFdOwotfQotZWxzZSB7Ci0gICAgJEFOVF9SVU5fQ01EID0gQEFSR1ZbMV07Ci19Ci0KLSMgZGlzcG9zZSBvZiB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cywgbGVhdmluZyBvbmx5IHRoZSBjb21tYW5kJ3MgYXJncy4KLXNoaWZ0Owotc2hpZnQ7Ci0KLSMgcnVuIHRoZSBjb21tYW5kCi1teSAkcmV0dXJuVmFsdWUgPSBzeXN0ZW0gJEFOVF9SVU5fQ01ELCBAQVJHVjsKLWlmICgkcmV0dXJuVmFsdWUgZXEgMCkgewotICAgIGV4aXQgMDsKLX0KLWVsc2UgewotICAgICMgb25seSAwIGFuZCAxIGFyZSB3aWRlbHkgcmVjb2duaXplZCBhcyBleGl0IHZhbHVlcwotICAgICMgc28gY2hhbmdlIHRoZSBleGl0IHZhbHVlIHRvIDEKLSAgICBleGl0IDE7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnRlbnYuY21kIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vYW50ZW52LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliMGRiNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9hbnRlbnYuY21kCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogCi0gICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgIEFudCBlbnZpcm9ubWVudAotKi8KLQotJ0BlY2hvIG9mZicKLWNhbGwgUnhGdW5jQWRkICJTeXNMb2FkRnVuY3MiLCAiUmV4eFV0aWwiLCAiU3lzTG9hZEZ1bmNzIgotY2FsbCBTeXNMb2FkRnVuY3MKLQotLyogUHJlcGFyZSB0aGUgcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNlICovCi1wYXJzZSBhcmcgYXJndgotbW9kZSA9ICcnCi1hcmdzID0gJycKLW9wdHMgPSAnJwotY3AgPSAnJwotbGNwID0gJycKLQotZG8gaSA9IDEgdG8gd29yZHMoYXJndikKLSAgcGFyYW0gPSB3b3JkKGFyZ3YsIGkpCi0gIHNlbGVjdAotICAgIHdoZW4gcGFyYW09Jy1sY3AnIHRoZW4gbW9kZSA9ICdsJwotICAgIHdoZW4gcGFyYW09Jy1jcCcgfCBwYXJhbT0nLWNsYXNzcGF0aCcgdGhlbiBtb2RlID0gJ2MnCi0gICAgd2hlbiBhYmJyZXYoJy1vcHRzJywgcGFyYW0sIDQpIHRoZW4gbW9kZSA9ICdvJwotICAgIHdoZW4gYWJicmV2KCctYXJncycsIHBhcmFtLCA0KSB0aGVuIG1vZGUgPSAnYScKLSAgb3RoZXJ3aXNlCi0gICAgc2VsZWN0Ci0gICAgICB3aGVuIG1vZGUgPSAnYScgdGhlbiBhcmdzID0gc3BhY2UoYXJncyBwYXJhbSwgMSkKLSAgICAgIHdoZW4gbW9kZSA9ICdjJyB0aGVuIGNwID0gc3BhY2UoY3AgcGFyYW0sIDEpCi0gICAgICB3aGVuIG1vZGUgPSAnbCcgdGhlbiBsY3AgPSBzcGFjZShsY3AgcGFyYW0sIDEpCi0gICAgICB3aGVuIG1vZGUgPSAnbycgdGhlbiBvcHRzID0gc3BhY2Uob3B0cyBwYXJhbSwgMSkKLSAgICBvdGhlcndpc2UKLSAgICAgIHNheSAnT3B0aW9uJyBwYXJhbSAnaWdub3JlZCcKLSAgICBlbmQKLSAgZW5kCi1lbmQKLQotZW52PSJPUzJFTlZJUk9OTUVOVCIKLWFudGNvbmYgPSBfZ2V0ZW52XygnYW50Y29uZicgJ2FudGNvbmYuY21kJykKLXJ1bnJjID0gX2dldGVudl8oJ3J1bnJjJykKLWludGVycHJldCAnY2FsbCAiJyB8fCBydW5yYyB8fCAnIicgJyInIHx8IGFudGNvbmYgfHwgJyInICdFVEMnCi1BTlRfSE9NRSA9IHZhbHVlKCdBTlRfSE9NRScsLGVudikKLUpBVkFfSE9NRSA9IHZhbHVlKCdKQVZBX0hPTUUnLCxlbnYpCi1jbGFzc3BhdGggPSB2YWx1ZSgnQ0xBU1NQQVRIJywsZW52KQotY2xhc3NlcyA9IHN0cmVhbShKQVZBX0hPTUUgfHwgIlxsaWJcY2xhc3Nlcy56aXAiLCAiQyIsICJRVUVSWSBFWElTVFMiKQotaWYgY2xhc3NlcyBcPSAnJyB0aGVuIGNsYXNzcGF0aCA9IHByZXBlbmQoY2xhc3NwYXRoIGNsYXNzZXMpCi1jbGFzc2VzID0gc3RyZWFtKEpBVkFfSE9NRSB8fCAiXGxpYlx0b29scy5qYXIiLCAiQyIsICJRVUVSWSBFWElTVFMiKQotaWYgY2xhc3NlcyBcPSAnJyB0aGVuIGNsYXNzcGF0aCA9IHByZXBlbmQoY2xhc3NwYXRoIGNsYXNzZXMpCi0KLWNsYXNzcGF0aCA9IHByZXBlbmQoY2xhc3NwYXRoIEFOVF9IT01FIHx8ICdcbGliXGFudC1sYXVuY2hlci5qYXInKQotJ1NFVCBDTEFTU1BBVEg9JyB8fCBjbGFzc3BhdGgKLQotLyogU2V0dGluZyBjbGFzc3BhdGhlcywgb3B0aW9ucyBhbmQgYXJndW1lbnRzICovCi1lbnZzZXQgPSBfZ2V0ZW52XygnZW52c2V0JykKLWlmIGNwXD0nJyAgIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IGVudnNldCB8fCAnIicgJyI7IENMQVNTUEFUSCInICciJyB8fCBjcCB8fCAnIicKLWlmIGxjcFw9JycgIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IGVudnNldCB8fCAnIicgJyI7IExPQ0FMQ0xBU1NQQVRIIicgJyInIHx8IGxjcCB8fCAnIicKLWlmIG9wdHNcPScnIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IGVudnNldCB8fCAnIicgJyItRCBBTlRfT1BUUyInICciJyB8fCBvcHRzIHx8ICciJwotaWYgYXJnc1w9JycgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgZW52c2V0IHx8ICciJyAnIkFOVF9BUkdTIicgJyInIHx8IGFyZ3MgfHwgJyInCi0KLWV4aXQgMAotCi1hZGRwYXRoOiBwcm9jZWR1cmUKLXBhcnNlIGFyZyBwYXRoIGVsZW0KLWlmIGVsZW0gPSAnJyB0aGVuIGRvCi0gIGlmIHBhdGhcPScnICYgcmlnaHQocGF0aCwgMSlcPSc7JyB0aGVuIHBhdGggPSBwYXRoIHx8ICc7JwotICByZXR1cm4gcGF0aAotZW5kCi1pZiBzdWJzdHIocGF0aCwgbGVuZ3RoKHBhdGgpKSA9ICc7JyB0aGVuIGdsdWUgPSAnJwotZWxzZSBnbHVlID0gJzsnCi1pZiBwb3ModHJhbnNsYXRlKGVsZW0pLCB0cmFuc2xhdGUocGF0aCkpID0gMCB0aGVuIHBhdGggPSBwYXRoIHx8IGdsdWUgfHwgZWxlbSB8fCAnOycKLXJldHVybiBwYXRoCi0KLXByZXBlbmQ6IHByb2NlZHVyZQotcGFyc2UgYXJnIHBhdGggZWxlbQotaWYgZWxlbSA9ICcnIHRoZW4gZG8KLSAgaWYgcGF0aFw9JycgJiByaWdodChwYXRoLCAxKVw9JzsnIHRoZW4gcGF0aCA9IHBhdGggfHwgJzsnCi0gIHJldHVybiBwYXRoCi1lbmQKLWlmIHBvcyh0cmFuc2xhdGUoZWxlbSksIHRyYW5zbGF0ZShwYXRoKSkgPSAwIHRoZW4gcGF0aCA9IGVsZW0gfHwgJzsnIHx8IHBhdGgKLXJldHVybiBwYXRoCi0KLV9nZXRlbnZfOiBwcm9jZWR1cmUgZXhwb3NlIGVudgotcGFyc2UgYXJnIGVudmFyIGRlZmF1bHQKLWlmIGRlZmF1bHQgPSAnJyB0aGVuIGRlZmF1bHQgPSBlbnZhcgotdmFyID0gdmFsdWUodHJhbnNsYXRlKGVudmFyKSwsZW52KQotaWYgdmFyID0gJycgdGhlbiB2YXIgPSBkZWZhdWx0Ci1yZXR1cm4gdmFyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9jb21wbGV0ZS1hbnQtY21kLnBsIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vY29tcGxldGUtYW50LWNtZC5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkZDQ3Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9jb21wbGV0ZS1hbnQtY21kLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBBIHNjcmlwdCB0byBhbGxvdyBCYXNoIG9yIFotU2hlbGwgdG8gY29tcGxldGUgYW4gQW50IGNvbW1hbmQtbGluZS4gIAotIwotIyBUbyBpbnN0YWxsIGZvciBCYXNoIDIuMCBvciBiZXR0ZXIsIGFkZCB0aGUgZm9sbG93aW5nIHRvIH4vLmJhc2hyYzoKLSMgCi0jICAgICAkIGNvbXBsZXRlIC1DIGNvbXBsZXRlLWFudC1jbWQgYW50IGJ1aWxkLnNoCi0jCi0jIFRvIGluc3RhbGwgZm9yIFotU2hlbGwgMi41IG9yIGJldHRlciwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gfi8uenNocmM6Ci0jCi0jICAgICBmdW5jdGlvbiBhbnRfY29tcGxldGUgKCkgewotIyAgICAgICAgIGxvY2FsIGFyZ3NfbGluZSBhcmdzCi0jICAgICAgICAgcmVhZCAtbCBhcmdzX2xpbmUKLSMgICAgICAgICBzZXQgLUEgYXJncyAkYXJnc19saW5lCi0jICAgICAgICAgc2V0IC1BIHJlcGx5ICQoQ09NUF9MSU5FPSRhcmdzX2xpbmUgY29tcGxldGUtYW50LWNtZCAke2FyZ3NbMV19ICQxKQotIyAgICAgfQotIyAgICAgY29tcGN0bCAtSyBhbnRfY29tcGxldGUgYW50IGJ1aWxkLnNoCi0jICAgICAKLSMgQGF1dGhvciBNaWtlIFdpbGxpYW1zIDxtaWtld0Bjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PgotCi1teSAkY21kTGluZSA9ICRFTlZ7J0NPTVBfTElORSd9OwotbXkgJGFudENtZCA9ICRBUkdWWzBdOwotbXkgJHdvcmQgPSAkQVJHVlsxXTsKLQotbXkgQGNvbXBsZXRpb25zOwotaWYgKCR3b3JkID1+IC9eLS8pIHsKLSAgICBsaXN0KCByZXN0cmljdCggJHdvcmQsIGdldEFyZ3VtZW50cygpICkpOwotfSBlbHNpZiAoJGNtZExpbmUgPX4gLy0oZnxidWlsZGZpbGUpXHMrXFMqJC8pIHsKLSAgICBsaXN0KCBnZXRCdWlsZEZpbGVzKCR3b3JkKSApOwotfSBlbHNlIHsKLSAgICBsaXN0KCByZXN0cmljdCggJHdvcmQsIGdldFRhcmdldHMoKSApKTsKLX0KLQotZXhpdCgwKTsKLQotc3ViIGxpc3QgewotICAgIGZvciAoQF8pIHsKLSAgICAgICAgcHJpbnQgIiRfXG4iOwotICAgIH0KLX0KLQotc3ViIHJlc3RyaWN0IHsKLSAgICBteSAoJHdvcmQsIEBjb21wbGV0aW9ucykgPSBAXzsKLSAgICBncmVwKCAvXlxRJHdvcmRcRS8sIEBjb21wbGV0aW9ucyApOwotfQotCi1zdWIgZ2V0QXJndW1lbnRzIHsKLSAgICBxdygtYnVpbGRmaWxlIC1kZWJ1ZyAtZW1hY3MgLWYgLWZpbmQgLWhlbHAgLWxpc3RlbmVyIC1sb2dmaWxlIAotICAgICAgIC1sb2dnZXIgLXByb2plY3RoZWxwIC1xdWlldCAtdmVyYm9zZSAtdmVyc2lvbik7IAotfQotCi0KLXN1YiBnZXRCdWlsZEZpbGVzIHsKLSAgICBteSAoJHdvcmQpID0gQF87Ci0gICAgZ3JlcCggL1wueG1sJC8sIGdsb2IoICIkd29yZCoiICkpOwotfQotCi1zdWIgZ2V0VGFyZ2V0cyB7Ci0KLSAgICAjIExvb2sgZm9yIGJ1aWxkLWZpbGUKLSAgICBteSAkYnVpbGRGaWxlID0gJ2J1aWxkLnhtbCc7Ci0gICAgaWYgKCRjbWRMaW5lID1+IC8tKGZ8YnVpbGRmaWxlKVxzKyhcUyspLykgewotICAgICAgICAkYnVpbGRGaWxlID0gJDI7Ci0gICAgfQotICAgIHJldHVybiAoKSB1bmxlc3MgKC1mICRidWlsZEZpbGUpOwotCi0gICAgIyBSdW4gImFudCAtcHJvamVjdGhlbHAiIHRvIGxpc3QgdGFyZ2V0cy4gIEtlZXAgYSBjYWNoZSBvZiByZXN1bHRzIGluIGEKLSAgICAjIGNhY2hlLWZpbGUuCi0gICAgbXkgJGNhY2hlRmlsZSA9ICRidWlsZEZpbGU7Ci0gICAgJGNhY2hlRmlsZSA9fiBzfCguKi8pPyguKil8JHsxfS5hbnQtdGFyZ2V0cy0kezJ9fDsKLSAgICBpZiAoKCEtZSAkY2FjaGVGaWxlKSB8fCAoLU0gJGJ1aWxkRmlsZSkgPCAoLU0gJGNhY2hlRmlsZSkpIHsKLSAgICAgICAgb3BlbiggQ0FDSEUsICc+Jy4kY2FjaGVGaWxlICkgfHwgZGllICJjYW5cJ3Qgd3JpdGUgJGNhY2hlRmlsZTogJCFcbiI7Ci0gICAgICAgIG9wZW4oIEhFTFAsICIkYW50Q21kIC1wcm9qZWN0aGVscCAtZiAnJGJ1aWxkRmlsZSd8IiApIHx8IHJldHVybigpOyAKLSAgICAgICAgbXkgJXRhcmdldHM7Ci0gICAgICAgIHdoaWxlKCA8SEVMUD4gKSB7Ci0gICAgICAgICAgICBpZiAoL15ccysoXFMrKS8pIHsKLSAgICAgICAgICAgICAgICAkdGFyZ2V0c3skMX0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBteSBAdGFyZ2V0cyA9IHNvcnQga2V5cyAldGFyZ2V0czsKLSAgICAgICAgZm9yIChAdGFyZ2V0cykgeyBwcmludCBDQUNIRSAiJF9cbiI7IH0KLSAgICAgICAgcmV0dXJuIEB0YXJnZXRzOwotICAgIH0KLSAgICAKLSAgICAjIFJlYWQgdGhlIHRhcmdldC1jYWNoZQotICAgIG9wZW4oIENBQ0hFLCAkY2FjaGVGaWxlICkgfHwgZGllICJjYW5cJ3QgcmVhZCAkY2FjaGVGaWxlOiAkIVxuIjsKLSAgICBteSBAdGFyZ2V0czsKLSAgICB3aGlsZSAoPENBQ0hFPikgewotICAgICAgICBjaG9wOwotICAgICAgICBzL1xyJC8vOyAgIyBmb3IgQ3lnd2luCi0gICAgICAgIHB1c2goIEB0YXJnZXRzLCAkXyApOwotICAgIH0KLSAgICBjbG9zZSggQ0FDSEUgKTsKLSAgICBAdGFyZ2V0czsKLQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vZW52c2V0LmNtZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2VudnNldC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTFkODcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vZW52c2V0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotCi0gICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotU0VUIGVudmlyb25tZW50IHZhcmlhYmxlcwotRmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyOgotICAgOyAgICAgcGFyYW1ldGVycyBhcmUgY29uc2lkZXJlZCBwYXJ0cyBvZiBhIHBhdGggdmFyaWFibGUsIHNlbWljb2xvbnMgYXJlCi0gICAgICAgICBhcHBlbmRlZCB0byBlYWNoIGVsZW1lbnQgaWYgbm90IGFscmVhZHkgcHJlc2VudAotICAgLUQgICAgcGFyYW1ldGVycyBhcmUgcHJvcGVydGllcyBmb3IgSmF2YSBvciBNYWtlZmlsZSBldGMuLCAtRCB3aWxsIGJlCi0gICAgICAgICBwcmVwZW5kZWQgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKLSAgID1EICAgIHRoZSBzYW1lIGFzIGFib3ZlIGJ1dCBlcXVhbCBzaWduIGlzIG5vdCByZXF1aXJlZAotICAgLCAgICAgcGFyYW1ldGVycyBzaG91bGQgYmUgY29tbWEgc2VwYXJhdGVkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgLSAgICAgcGFyYW1ldGVycyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IHRoZSBuZXh0IHBhcmFtZXRlcgotICAgT3RoZXIgdmFsdWVzIG1lYW4gdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG1pc3NpbmcgYW5kIHRoZSBlbnZpcm9ubWVudAotICAgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gdGhlIHNwYWNlIHNlcGFyYXRlZCBwYXJhbWV0ZXJzCi0KLVNlY29uZCBwYXJhbWV0ZXI6IG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0KLU5leHQgcGFyYW1ldGVyczogdmFsdWVzCi07IGltcGxpZXMgdGhhdCB0aGUgZXF1YWwgc2lnbiBpcyBjb25zaWRlcmVkIGEgcGFydCBvZiB0aGUgcGFyYW1ldGVyIGFuZCBpcwotbm90IGludGVycHJldGVkCi0KLS1EIHJlcXVpcmVzIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm0gbmFtZT12YWx1ZS4gSWYgdGhlIGVxdWFsIHNpZ24gaXMgbm90IGZvdW5kLAotdGhlIHBhcmFtZXRlcnMgYXJlIGNoYW5nZWQgdG8gbmFtZT1leHBhbmRlZF9uYW1lCi0KLU90aGVyIG9wdGlvbnMgaGF2ZSBvcHRpb25hbCBlcXVhbCBzaWduLiBJZiBpdCBpcyBmb3VuZCwgb25seSB0aGUgcGFydCBhZnRlcgotdGhlIGVxdWFsIHNpZ24gd2lsbCBiZSBvcHJpb25hbGx5IGV4cGFuZGVkLgotCi1JZiB0aGUgcGFyYW1ldGVyIGlzIHRoZSBtaW51cyBzaWduLCB0aGUgbmV4dCBwYXJhbWV0ZXIgd2lsbCBub3QgYmUgZXhwYW5kZWQuCi1JZiB0aGUgcGFyYW1ldGVyIGlzIGEgc2luZ2xlIGRvdCwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlIGFzIGl0IGV4aXN0ZWQgYmVmb3JlIGVudnNldCB3YXMgaW52b2tlZC4KLQotRm9yIG90aGVyIHBhcmFtZXRlcnMgdGhlIGJhdGNoIGxvb2tzIGZvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCB0aGUKLXNhbWUgbmFtZSAoaW4gdXBwZXJjYXNlKS4gSWYgaXQgaXMgZm91bmQsIGl0IGZvcm1zIHRoZSBleHBhbmRlZF9uYW1lLiBJZgotdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggc3VjaCBhIG5hbWUgZG9lcyBub3QgZXhpc3QsIHRoZSBleHBhbmRlZF9uYW1lCi13aWxsIGhvbGQgdGhlIHBhcmFtZXRlciBuYW1lIHdpdGhvdXQgY2FzZSBjb252ZXJzaW9uLgotKi8KLQotcGFyc2UgYXJnIG1vZGUgZW52YXIgYXJncwotCi1lcXVhbCA9IDAKLXNlcCA9ICcgJwotCi0vKiBQYXJzZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyAqLwotc2VsZWN0Ci0gIHdoZW4gbW9kZT0nLScgdGhlbiBkbwotICAgIHNlcCA9IGVudmFyCi0gICAgcGFyc2UgdmFyIGFyZ3MgZW52YXIgYXJncwotICBlbmQKLSAgd2hlbiBtb2RlPSc7JyB0aGVuIGRvCi0gICAgc2VwID0gJycKLSAgICBlcXVhbCA9IC0xCi0gIGVuZAotICB3aGVuIG1vZGU9Jy1EJyB0aGVuIGVxdWFsID0gMQotICB3aGVuIG1vZGU9Jz1EJyB0aGVuIG1vZGUgPSAnLUQnCi0gIHdoZW4gbW9kZT0nLCcgdGhlbiBzZXAgPSAnLCcKLW90aGVyd2lzZQotICBhcmdzID0gZW52YXIgYXJncwotICBlbnZhciA9IG1vZGUKLSAgbW9kZSA9ICcnCi1lbmQKLQotZW52ID0gJ09TMkVOVklST05NRU5UJwotZW52YXIgPSB0cmFuc2xhdGUoZW52YXIpCi1vcmlnID0gdmFsdWUoZW52YXIsLGVudikKLW5ld3ZhbCA9ICcnCi1leHBhbmQgPSAxCi0KLS8qIGZvciBlYWNoIHBhcmFtZXRlci4uLiAqLwotZG8gaSA9IDEgdG8gd29yZHMoYXJncykKLSAgaWYgZXhwYW5kID4gMCAmIHdvcmQoYXJncywgaSkgPSAnLScgdGhlbiBleHBhbmQgPSAwCi0gIGVsc2UgY2FsbCBhZGR2YWwgd29yZChhcmdzLCBpKQotZW5kCi0KLS8qIE9wdGlvbmFsbHkgZW5jbG9zZSBwYXRoIHZhcmlhYmxlIGJ5IHF1b3RlcyAqLwotaWYgbW9kZSA9ICc7JyAmIHBvcygnICcsIG5ld3ZhbCkgPiAwIHRoZW4gbmV3dmFsID0gJyInIHx8IG5ld3ZhbCB8fCAnIicKLQotLyogU2V0IHRoZSBuZXcgdmFsdWUsICdTRVQnIGNhbm5vdCBiZSB1c2VkIHNpbmNlIGl0IGRvZXMgbm90IGFsbG93ICc9JyAqLwoteCA9IHZhbHVlKGVudmFyLCBuZXd2YWwsIGVudikKLWV4aXQgMAotCi1hZGR2YWw6IHByb2NlZHVyZSBleHBvc2Ugc2VwIGVxdWFsIG9yaWcgZXhwYW5kIG5ld3ZhbCBtb2RlIGVudgotcGFyc2UgYXJnIHZhcgotCi1pZiB2YXIgPSAnLicgdGhlbiBleHB2YXIgPSBvcmlnCi1lbHNlIGRvCi0gIGlmIGVxdWFsID49IDAgdGhlbiBkbwotICAgIHBhcnNlIHZhciB2YXIgbmFtZSAnPScgdmFsCi0gICAgaWYgdmFsID0gJycgdGhlbiB2YXIgPSBuYW1lCi0gICAgZWxzZSB2YXIgPSB2YWwKLSAgZW5kCi0gIGlmIGV4cGFuZCA9IDAgdGhlbiBleHB2YXIgPSB2YXIKLSAgZWxzZSBleHB2YXIgPSB2YWx1ZSh0cmFuc2xhdGUodmFyKSwsZW52KQotICBpZiBleHB2YXIgPSAnJyB0aGVuIGV4cHZhciA9IHZhcgotICBpZiBlcXVhbCA+PSAwIHRoZW4gZG8KLSAgICBpZiB2YWwgPSAnJyB0aGVuIGRvCi0gICAgICBwYXJzZSB2YXIgZXhwdmFyIGtleSAnPScgdmFsCi0gICAgICBpZiB2YWwgPD4gJycgdGhlbiBuYW1lID0ga2V5Ci0gICAgICBlbHNlIGRvCi0gICAgICAgIGlmIGVxdWFsID4gMCB0aGVuIHZhbCA9IGtleQotICAgICAgICBlbHNlIG5hbWUgPSBrZXkKLSAgICAgIGVuZAotICAgIGVuZAotICAgIGVsc2UgdmFsID0gZXhwdmFyCi0gICAgaWYgcG9zKCcgJywgdmFsKSA+IDAgfCBwb3MoJz0nLCB2YWwpID4gMCB0aGVuIHZhbCA9ICciJyB8fCB2YWwgfHwgJyInCi0gICAgaWYgdmFsID0gJycgdGhlbiBleHB2YXIgPSBuYW1lCi0gICAgZWxzZSBleHB2YXIgPSBuYW1lIHx8ICc9JyB8fCB2YWwKLSAgZW5kCi0gIGlmIG1vZGUgPSAnLUQnIHRoZW4gZXhwdmFyID0gJy1EJyB8fCBleHB2YXIKLSAgaWYgbW9kZSA9ICc7JyB0aGVuIGRvCi0gICAgaWYgcmlnaHQoZXhwdmFyLCAxKSA8PiAnOycgdGhlbiBleHB2YXIgPSBleHB2YXIgfHwgJzsnCi0gIGVuZAotZW5kCi0KLWlmIG5ld3ZhbCA9ICcnIHRoZW4gbmV3dmFsID0gZXhwdmFyCi1lbHNlIG5ld3ZhbCA9IG5ld3ZhbCB8fCBzZXAgfHwgZXhwdmFyCi1leHBhbmQgPSAxCi1yZXR1cm4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2xjcC5iYXQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9sY3AuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ2YTgyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvYmluL2xjcC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1SRU0KLVJFTSBDb3B5cmlnaHQgIDIwMDEtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLVJFTQotUkVNICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLVJFTSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotUkVNICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTQotUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1SRU0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotUkVNICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotUkVNICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVJFTSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotUkVNICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLVJFTQotUkVNCi0KLXNldCBfQ0xBU1NQQVRIQ09NUE9ORU5UPSUxCi1pZiAiIiUxIiI9PSIiIiIgZ290byBnb3RBbGxBcmdzCi1zaGlmdAotCi06YXJnQ2hlY2sKLWlmICIiJTEiIj09IiIiIiBnb3RvIGdvdEFsbEFyZ3MKLXNldCBfQ0xBU1NQQVRIQ09NUE9ORU5UPSVfQ0xBU1NQQVRIQ09NUE9ORU5UJSAlMQotc2hpZnQKLWdvdG8gYXJnQ2hlY2sKLQotOmdvdEFsbEFyZ3MKLXNldCBMT0NBTENMQVNTUEFUSD0lX0NMQVNTUEFUSENPTVBPTkVOVCU7JUxPQ0FMQ0xBU1NQQVRIJQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5hbnQucGwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5hbnQucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTQ3MDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vcnVuYW50LnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyBDb3B5cmlnaHQgMjAwMC0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgcnVuYW50LnBsCi0jCi0jIHdyYXBwZXIgc2NyaXB0IGZvciBpbnZva2luZyBhbnQgaW4gYSBwbGF0Zm9ybSB3aXRoIFBlcmwgaW5zdGFsbGVkCi0jIHRoaXMgbWF5IGluY2x1ZGUgY2dpLWJpbiBpbnZvY2F0aW9uLCB3aGljaCBpcyBjb25zaWRlcmVkIHNvbWV3aGF0IGRhZnQuCi0jIChzbG86IHRoYXQgc2hvdWxkIGJlIGEgc2VwYXJhdGUgZmlsZSB3aGljaCBjYW4gYmUgZGVyaXZlZCBmcm9tIHRoaXMKLSMgYW5kIHJldHVybnMgdGhlIFhNTCBmb3JtYXR0ZWQgb3V0cHV0KQotIwotIyB0aGUgY29kZSBpcyBub3QgdG90YWxseSBwb3J0YWJsZSBkdWUgdG8gY2xhc3NwYXRoIGFuZCBkaXJlY3Rvcnkgc3BsaXR0aW5nCi0jIGlzc3Vlcy4gb29wcy4gKE5CLCB1c2UgRmlsZTo6U3BlYzo6RnVuY3Rpb25zICB3aWxsIGhlbHAgYW5kIHRoZSBjb2RlIGlzCi0jIHN0cnVjdHVyZWQgZm9yIHRoZSBjYXRmaWxlKCkgY2FsbCwgYnV0IGJlY2F1c2Ugb2YgcGVybCB2ZXJzaW9uIGZ1bm5pZXMKLSMgdGhlIGNvZGUgaXMgbm90IGluY2x1ZGVkLiAKLSMKLSMgY3JlYXRlZDogICAgICAgICAyMDAwLTgtMjQKLSMgYXV0aG9yOiAgICAgICAgICBTdGV2ZSBMb3VnaHJhbiBzdGV2ZV9sQHNvdXJjZWZvcmdlLm5ldAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgQXNzdW1wdGlvbnM6Ci0jCi0jIC0gdGhlICJqYXZhIiBleGVjdXRhYmxlL3NjcmlwdCBpcyBvbiB0aGUgY29tbWFuZCBwYXRoCi0jIC0gQU5UX0hPTUUgaGFzIGJlZW4gc2V0Ci0jIC0gdGFyZ2V0IHBsYXRmb3JtIHVzZXMgIjoiIGFzIGNsYXNzcGF0aCBzZXBhcmF0b3Igb3IgcGVybCBpbmRpY2F0ZXMgaXQgaXMgZG9zL3dpbjMyCi0jIC0gdGFyZ2V0IHBsYXRmb3JtIHVzZXMgIi8iIGFzIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi0KLSNiZSBmdXNzeSBhYm91dCB2YXJpYWJsZXMKLXVzZSBzdHJpY3Q7Ci0KLSNwbGF0Zm9ybSBzcGVjaWZpY3MgKGRpc2FibGVkKQotI3VzZSBGaWxlOjpTcGVjOjpGdW5jdGlvbnM7Ci0KLSN0dXJuIHdhcm5pbmdzIG9uIGR1cmluZyBkZXY7IGdlbmVyYXRlcyBhIGZldyBzcHVyaW91cyB1bmluaXRpYWxpc2VkIHZhciBhY2Nlc3Mgd2FybmluZ3MKLSN1c2Ugd2FybmluZ3M7Ci0KLSNhbmQgc2V0ICRkZWJ1ZyB0byAxIHRvIHR1cm4gb24gdHJhY2UgaW5mbwotbXkgJGRlYnVnPTE7Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGNoZWNrIHRvIG1ha2Ugc3VyZSBlbnZpcm9ubWVudCBpcyBzZXR1cAotIwotCi1teSAkSE9NRSA9ICRFTlZ7QU5UX0hPTUV9OwotaWYgKCRIT01FIGVxICIiKQotICAgICAgICB7Ci0gICAgZGllICJcblxuQU5UX0hPTUUgKk1VU1QqIGJlIHNldCFcblxuIjsKLSAgICAgICAgfQotCi1teSAkSkFWQUNNRCA9ICRFTlZ7SkFWQUNNRH07Ci0kSkFWQUNNRCA9ICJqYXZhIiBpZiAkSkFWQUNNRCBlcSAiIjsKLQotbXkgJG9ubmV0d2FyZSA9IDA7Ci1pZiAoJF5PIGVxICJOZXRXYXJlIikKLXsKLSAgJG9ubmV0d2FyZSA9IDE7Ci19Ci0KLW15ICRvbmN5Z3dpbiA9ICgkXk8gZXEgImN5Z3dpbiIpOwotCi0jSVNTVUU6IHdoYXQgamF2YSB3YW50cyB0byBzcGxpdCB1cCBjbGFzc3BhdGggdmFyaWVzIGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0gCi0jYW5kIHBlcmwgaXMgbm90IHRvbyBob3QgYXQgaGludGluZyB3aGljaCBib3ggaXQgaXMgb24uCi0jaGVyZSBJIGFzc3VtZSAiOiIgJ2NlcHQgb24gd2luMzIsIGRvcywgYW5kIG5ldHdhcmUuIEFkZCBleHRyYSB0ZXN0cyBoZXJlIGFzIG5lZWRlZC4KLW15ICRzPSI6IjsKLWlmKCgkXk8gZXEgIk1TV2luMzIiKSB8fCAoJF5PIGVxICJkb3MiKSB8fCAoJF5PIGVxICJjeWd3aW4iKSB8fAotICAgKCRvbm5ldHdhcmUgPT0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgJHM9IjsiOwotICAgICAgICB9Ci0KLSNidWlsZCB1cCBzdGFuZGFyZCBjbGFzc3BhdGgKLW15ICRsb2NhbHBhdGggPSAiJEhPTUUvbGliL2FudC1sYXVuY2hlci5qYXIiOwotI3NldCBKVk0gb3B0aW9ucyBhbmQgQW50IGFyZ3VtZW50cywgaWYgYW55Ci1teSBAQU5UX09QVFM9c3BsaXQoIiAiLCAkRU5We0FOVF9PUFRTfSk7Ci1teSBAQU5UX0FSR1M9c3BsaXQoIiAiLCAkRU5We0FOVF9BUkdTfSk7Ci0KLSNqaWtlcwotaWYoJEVOVntKSUtFU1BBVEh9IG5lICIiKQotICAgICAgICB7Ci0gICAgICAgIHB1c2ggQEFOVF9PUFRTLCAiLURqaWtlcy5jbGFzcy5wYXRoPSRFTlZ7SklLRVNQQVRIfSI7Ci0gICAgICAgIH0KLQotI2NvbnN0cnVjdCBhcmd1bWVudHMgdG8gamF2YQotbXkgQEFSR1M7Ci1wdXNoIEBBUkdTLCBAQU5UX09QVFM7Ci0KLW15ICRDWUdIT01FID0gIiI7Ci0KLW15ICRjbGFzc3BhdGg9JEVOVntDTEFTU1BBVEh9OwotaWYgKCRvbmN5Z3dpbiA9PSAxKSB7Ci0gICRsb2NhbHBhdGggPSBgY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICRsb2NhbHBhdGhgOwotICBjaG9tcCAoJGxvY2FscGF0aCk7Ci0gIGlmICghICRjbGFzc3BhdGggZXEgIiIpCi0gIHsKLSAgICAkY2xhc3NwYXRoID0gYGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJGNsYXNzcGF0aCJgOwotICAgIGNob21wICgkY2xhc3NwYXRoKTsKLSAgfQotICAkSE9NRSA9IGBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgJEhPTUVgOwotICBjaG9tcCAoJEhPTUUpOwotICAkQ1lHSE9NRSA9IGBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgJEVOVntIT01FfWA7Ci0gIGNob21wICgkQ1lHSE9NRSk7Ci19Ci1wdXNoIEBBUkdTLCAiLWNsYXNzcGF0aCIsICIkbG9jYWxwYXRoIjsKLXB1c2ggQEFSR1MsICItRGFudC5ob21lPSRIT01FIjsKLWlmICggISAkQ1lHSE9NRSBlcSAiIiApCi17Ci0gIHB1c2ggQEFSR1MsICItRGN5Z3dpbi51c2VyLmhvbWU9XCIkQ1lHSE9NRVwiIgotfQotcHVzaCBAQVJHUywgIm9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciIsIEBBTlRfQVJHUzsKLXB1c2ggQEFSR1MsIEBBUkdWOwotaWYgKCEgJGNsYXNzcGF0aCBlcSAiIikKLXsKLSAgaWYgKCRvbm5ldHdhcmUgPT0gMSkKLSAgewotICAgICMgbWFrZSBjbGFzc3BhdGggbGl0ZXJhbGx5ICRDTEFTU1BBVEgKLSAgICAjIHRoaXMgaXMgdG8gYXZvaWQgcHVzaGluZyB1cyBvdmVyIHRoZSA1MTIgY2hhcmFjdGVyIGxpbWl0Ci0gICAgIyBldmVuIHNraXAgdGhlIDsgLSB0aGF0IGlzIGFscmVhZHkgaW4gJGxvY2FscGF0aAotICAgIHB1c2ggQEFSR1MsICItbGliIiwgIlwkQ0xBU1NQQVRIIjsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBwdXNoIEBBUkdTLCAiLWxpYiIsICIkY2xhc3NwYXRoIjsKLSAgfQotfQotcHJpbnQgIlxuICRKQVZBQ01EIEBBUkdTXG5cbiIgaWYgKCRkZWJ1Zyk7Ci0KLW15ICRyZXR1cm5WYWx1ZSA9IHN5c3RlbSAkSkFWQUNNRCwgQEFSR1M7Ci1pZiAoJHJldHVyblZhbHVlIGVxIDApCi0gICAgICAgIHsKLSAgICAgICAgZXhpdCAwOwotICAgICAgICB9Ci1lbHNlCi0gICAgICAgIHsKLSAgICAgICAgIyBvbmx5IDAgYW5kIDEgYXJlIHdpZGVseSByZWNvZ25pemVkIGFzIGV4aXQgdmFsdWVzCi0gICAgICAgICMgc28gY2hhbmdlIHRoZSBleGl0IHZhbHVlIHRvIDEKLSAgICAgICAgZXhpdCAxOwotICAgICAgICB9CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5hbnQucHkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5hbnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjUzYjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vcnVuYW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCi0jIENvcHlyaWdodCAyMDAxLDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIiIiCi0KLSBydW5hbnQucHkKLQotICAgIFRoaXMgc2NyaXB0IGlzIGEgdHJhbnNsYXRpb24gb2YgdGhlIHJ1bmFudC5wbCB3cml0dGVuIGJ5IFN0ZXZlIExvdWdocmFuLgotICAgIEl0IHJ1bnMgYW50IHdpdGgvb3V0IGFyZ3VtZW50cywgaXQgc2hvdWxkIGJlIHF1aXRlIHBvcnRhYmxlICh0aGFua3MgdG8KLSAgICB0aGUgcHl0aG9uIG9zIGxpYnJhcnkpCi0gICAgVGhpcyBzY3JpcHQgaGFzIGJlZW4gdGVzdGVkIHdpdGggUHl0aG9uMi4wL1dpbjJLCi0KLSBjcmVhdGVkOiAgICAgICAgIDIwMDEtMDQtMTEKLSBhdXRob3I6ICAgICAgICAgIFBpZXJyZSBEaXR0Z2VuIHBpZXJyZS5kaXR0Z2VuQGNyaWx0ZWxlY29tLmNvbQotCi0gQXNzdW1wdGlvbnM6Ci0KLSAtIHRoZSAiamF2YSIgZXhlY3V0YWJsZS9zY3JpcHQgaXMgb24gdGhlIGNvbW1hbmQgcGF0aAotIiIiCi1pbXBvcnQgb3MsIG9zLnBhdGgsIHN0cmluZywgc3lzCi0KLSMgQ2hhbmdlIGl0IHRvIDEgdG8gZ2V0IGV4dHJhIGRlYnVnIGluZm9ybWF0aW9uCi1kZWJ1ZyA9IDAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJZiBBTlRfSE9NRSBpcyBub3Qgc2V0IGRlZmF1bHQgdG8gc2NyaXB0J3MgcGFyZW50IGRpcmVjdG9yeQotaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdBTlRfSE9NRScpOgotICAgIEFOVF9IT01FID0gb3MuZW52aXJvblsnQU5UX0hPTUUnXQotZWxzZToKLSAgICBBTlRfSE9NRSA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHN5cy5hcmd2WzBdKSkpCi0KLSMgc2V0IEFOVF9MSUIgbG9jYXRpb24KLUFOVF9MSUIgPSBvcy5wYXRoLmpvaW4oQU5UX0hPTUUsICdsaWInKQotCi0jIHNldCBKQVZBQ01EIChjaGVjayB2YXJpYWJsZXMgSkFWQUNNRCBhbmQgSkFWQV9IT01FKQotSkFWQUNNRCA9IE5vbmUKLWlmIG5vdCBvcy5lbnZpcm9uLmhhc19rZXkoJ0pBVkFDTUQnKToKLSAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0pBVkFfSE9NRScpOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MuZW52aXJvblsnSkFWQV9IT01FJ10pOgotICAgICAgICAgICAgcHJpbnQgIldhcm5pbmc6IEpBVkFfSE9NRSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgSkFWQUNNRCA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydKQVZBX0hPTUUnXSwgJ2JpbicsICdqYXZhJykKLSAgICBlbHNlOgotICAgICAgICBwcmludCAiV2FybmluZzogSkFWQV9IT01FIG5vdCBzZXQuIgotZWxzZToKLSAgICBKQVZBQ01EID0gb3MuZW52aXJvblsnSkFWQUNNRCddCi1pZiBub3QgSkFWQUNNRDoKLSAgICBKQVZBQ01EID0gJ2phdmEnCi0KLWxhdW5jaGVyX2phciA9IG9zLnBhdGguam9pbihBTlRfTElCLCAnYW50LWxhdW5jaGVyLmphcicpCi1pZiBub3Qgb3MucGF0aC5leGlzdHMobGF1bmNoZXJfamFyKToKLSAgICBwcmludCAnVW5hYmxlIHRvIGxvY2F0ZSBhbnQtbGF1bmNoZXIuamFyLiBFeHBlY3RlZCB0byBmaW5kIGl0IGluICVzJyAlIFwKLSAgICAgICAgQU5UX0xJQgotCi0jIEJ1aWxkIHVwIHN0YW5kYXJkIGNsYXNzcGF0aCAoTE9DQUxDTEFTU1BBVEgpCi1MT0NBTENMQVNTUEFUSCA9IGxhdW5jaGVyX2phcgotaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdMT0NBTENMQVNTUEFUSCcpOgotICAgIExPQ0FMQ0xBU1NQQVRIICs9IG9zLnBhdGhzZXAgKyBvcy5lbnZpcm9uWydMT0NBTENMQVNTUEFUSCddCi0KLUFOVF9PUFRTID0gIiIKLWlmIG9zLmVudmlyb24uaGFzX2tleSgnQU5UX09QVFMnKToKLSAgICBBTlRfT1BUUyA9IG9zLmVudmlyb25bJ0FOVF9PUFRTJ10KLQotT1BUUyA9ICIiCi1pZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0pJS0VTUEFUSCcpOgotICAgIE9QVFMgPSAnLURqaWtlcy5jbGFzcy5wYXRoPVwiJXNcIicgJSBvcy5lbnZpcm9uWydKSUtFU1BBVEgnXQotCi1BTlRfQVJHUyA9ICIiCi1pZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0FOVF9BUkdTJyk6Ci0gICAgQU5UX0FSR1MgPSBvcy5lbnZpcm9uWydBTlRfQVJHUyddCi0KLUNMQVNTUEFUSCA9ICIiCi1pZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0NMQVNTUEFUSCcpOgotICAgIENMQVNTUEFUSCA9IG9zLmVudmlyb25bJ0NMQVNTUEFUSCddCi0KLSMgQnVpbGRzIHRoZSBjb21tYW5kbGluZQotY21kbGluZSA9ICgnJXMgJXMgLWNsYXNzcGF0aCAlcyAtRGFudC5ob21lPSVzICVzICcgKyBcCi0gICAgJ29yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAlcyAtbGliICVzICVzJykgXAotICAgICAlIChKQVZBQ01ELCBBTlRfT1BUUywgTE9DQUxDTEFTU1BBVEgsIEFOVF9IT01FLCBPUFRTLCBBTlRfQVJHUywgXAotICAgICAgICBDTEFTU1BBVEgsIHN0cmluZy5qb2luKHN5cy5hcmd2WzE6XSwgJyAnKSkKLQotaWYgZGVidWc6Ci0gICAgcHJpbnQgJ1xuJXNcblxuJyAlIChjbWRsaW5lKQotCi0jIFJ1biB0aGUgYmluaW91IQotb3Muc3lzdGVtKGNtZGxpbmUpCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5yYy5jbWQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2Jpbi9ydW5yYy5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzdhODAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9iaW4vcnVucmMuY21kCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogCi0gICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgCi0gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgIFJ1biBSQyBmaWxlLCBuYW1lIGlzIGluIHRoZSBmaXJzdCBhcmcsIHNlY29uZCBhcmcgaXMgZWl0aGVyIFBBVEgKLSAgICBFTlYgIG9yIC1yIG9yIG5vdGhpbmcgCi0qLwotCi1wYXJzZSBhcmcgbmFtZSBwYXRoIHJlc3QKLQotaWYgbmFtZSA9ICcnIHRoZW4gZG8KLSAgc2F5ICdSQyBmaWxlIG5hbWUgaXMgbWlzc2luZycKLSAgZXhpdCAxCi1lbmQKLQotaWYgcmVzdCBcPSAnJyB0aGVuIGRvCi0gIHNheSAnVG9vIG1hbnkgcGFyYW1ldGVycycKLSAgZXhpdCAxCi1lbmQKLQotY2FsbCBydW5pdCBuYW1lIHBhdGgKLWV4aXQgMAotCi1ydW5pdDogcHJvY2VkdXJlCi1wYXJzZSBhcmcgbmFtZSBwYXRoIGRpcgotCi1pZiBwYXRoIFw9ICcnICYgcGF0aCBcPSAnLXInIHRoZW4gZG8KLSAgZGlyID0gdmFsdWUodHJhbnNsYXRlKHBhdGgpLCwnT1MyRU5WSVJPTk1FTlQnKQotICBpZiBkaXIgPSAnJyB0aGVuIHJldHVybgotICBkaXIgPSB0cmFuc2xhdGUoZGlyLCAnXCcsICcvJykgLyogY2hhbmdlIFVOSVgtbGlrZSBwYXRoIHRvIE9TLzIgKi8KLWVuZAotCi1pZiBkaXIgPSAnJyB0aGVuIGRpciA9IGRpcmVjdG9yeSgpCi0KLWlmIHBhdGggPSAnLXInIHRoZW4gZG8gLyogcmVjdXJzaXZlIGNhbGwgKi8KLSAgc3ViZGlyID0gZmlsZXNwZWMoJ3BhdGgnLCBkaXIpCi0gIGlmIHN1YmRpciBcPSAnXCcgdGhlbiBkbwotICAgIHN1YmRpciA9IGxlZnQoc3ViZGlyLCBsZW5ndGgoc3ViZGlyKS0xKQotICAgIGNhbGwgcnVuaXQgbmFtZSBwYXRoIGZpbGVzcGVjKCdkcml2ZScsIGRpcikgfHwgc3ViZGlyCi0gIGVuZAotZW5kCi0KLS8qIExvb2sgZm9yIHRoZSBmaWxlIGFuZCBydW4gaXQgKi8KLWlmIHJpZ2h0KGRpciwgMSkgXD0gJ1wnIHRoZW4gZGlyID0gZGlyIHx8ICdcJwotcmNmaWxlID0gc3RyZWFtKGRpciB8fCBuYW1lLCAnYycsICdxdWVyeSBleGlzdHMnKQotaWYgcmNmaWxlIFw9ICcnIHRoZW4gaW50ZXJwcmV0ICdjYWxsICInIHx8IHJjZmlsZSB8fCAnIicKLQotcmV0dXJuCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGNhNWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9saWIvYW50LWFwYWNoZS1ic2YuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9saWIvYW50LWp1bml0LmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvbGliL2FudC1qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTRmN2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9saWIvYW50LWp1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvbGliL2FudC1sYXVuY2hlci5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2xpYi9hbnQtbGF1bmNoZXIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTcxNjEyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9hbnQvbGliL2FudC1sYXVuY2hlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2xpYi9hbnQuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2FudC9saWIvYW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlYjNiOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYW50L2xpYi9hbnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2Jpbi9jeWdyYWlscyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9iaW4vY3lncmFpbHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWM4OGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2Jpbi9jeWdyYWlscworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgVGhpcyBpcyB0aGUgY3lnd2luIHZlcnNpb24gb2YgdGhlIGdyYWlscyBzY3JpcHQuCi0jIEl0IGRvZXNuJ3QgdXNlIHRoZSAtRGJhc2VkaXIgc2V0dGluZyBhbmQgdXNlcyBBbnQncyBkZWZhdWx0Ci0KLSR7QU5UX0hPTUV9L2Jpbi9hbnQgLWxpYiAke0dSQUlMU19BTlRfQ0xBU1NQQVRIfSAtZiAke0dSQUlMU19IT01FfS9zcmMvZ3JhaWxzL2J1aWxkLnhtbCAkQApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2Jpbi9ncmFpbHMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYmluL2dyYWlscwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5OGI0Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYmluL2dyYWlscworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1pZiBbIC16ICIkSkFWQV9IT01FIiBdIDsgdGhlbgotICBlY2hvICJFcnJvcjogSkFWQV9IT01FIGlzIG5vdCBkZWZpbmVkIgotICBlY2hvICJQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHN0YXJ0IEdyYWlscyBhZ2FpbiIKLSAgZXhpdCAxCi1maQotCi1pZiBbIC16ICIkR1JBSUxTX0hPTUUiIF0gOyB0aGVuCi0gIGVjaG8gIkVycm9yOiBHUkFJTFNfSE9NRSBpcyBub3QgZGVmaW5lZCIKLSAgZWNobyAiUGxlYXNlIGRlZmluZSBHUkFJTF9IT01FIGFuZCBzdGFydCBHcmFpbHMgYWdhaW4iCi0gIGV4aXQgMQotZmkKLQotQU5UX0hPTUU9JHtHUkFJTFNfSE9NRX0vYW50Ci1HUkFJTFNfQU5UX0NMQVNTUEFUSD0kR1JBSUxTX0hPTUUvbGliL2JzZi5qYXIKLUdSQUlMU19BTlRfQ0xBU1NQQVRIPSRHUkFJTFNfQU5UX0NMQVNTUEFUSDokR1JBSUxTX0hPTUUvbGliL2dyb292eS1hbGwtMS4wLWpzci0wNS1TTkFQU0hPVC5qYXIKLUdSQUlMU19BTlRfQ0xBU1NQQVRIPSRHUkFJTFNfQU5UX0NMQVNTUEFUSDokR1JBSUxTX0hPTUUvbGliL29yZy5tb3J0YmF5LmpldHR5LmphcgotR1JBSUxTX0FOVF9DTEFTU1BBVEg9JEdSQUlMU19BTlRfQ0xBU1NQQVRIOiRHUkFJTFNfSE9NRS9saWIvY29tbW9ucy1sb2dnaW5nLmphcgotR1JBSUxTX0FOVF9DTEFTU1BBVEg9JEdSQUlMU19BTlRfQ0xBU1NQQVRIOiRHUkFJTFNfSE9NRS9saWIvY29tbW9ucy1lbC5qYXIKLUdSQUlMU19BTlRfQ0xBU1NQQVRIPSRHUkFJTFNfQU5UX0NMQVNTUEFUSDokR1JBSUxTX0hPTUUvbGliL2phdmF4LnNlcnZsZXQuamFyCi1HUkFJTFNfQU5UX0NMQVNTUEFUSD0kR1JBSUxTX0FOVF9DTEFTU1BBVEg6JEdSQUlMU19IT01FL2xpYi9sb2c0ai0xLjIuOC5qYXIKLUdSQUlMU19BTlRfQ0xBU1NQQVRIPSRHUkFJTFNfQU5UX0NMQVNTUEFUSDokR1JBSUxTX0hPTUUvbGliL2phc3Blci1jb21waWxlci5qYXIKLUdSQUlMU19BTlRfQ0xBU1NQQVRIPSRHUkFJTFNfQU5UX0NMQVNTUEFUSDokR1JBSUxTX0hPTUUvbGliL2phc3Blci1ydW50aW1lLmphcgotR1JBSUxTX0FOVF9DTEFTU1BBVEg9JEdSQUlMU19BTlRfQ0xBU1NQQVRIOiRHUkFJTFNfSE9NRS9saWIveG1sLWFwaXMuamFyCi1HUkFJTFNfQU5UX0NMQVNTUEFUSD0kR1JBSUxTX0FOVF9DTEFTU1BBVEg6JEdSQUlMU19IT01FL2xpYi94ZXJjZXNJbXBsLmphcgotR1JBSUxTX0JVSUxEX0ZJTEU9JHtHUkFJTFNfSE9NRX0vc3JjL2dyYWlscy9idWlsZC54bWwKLUFOVF9CSU49JHtBTlRfSE9NRX0vYmluL2FudAotQkFTRURJUj1gcHdkYAotCi1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qKQotICAgIEdSQUlMU19CVUlMRF9GSUxFPWBjeWdwYXRoIC0td2luZG93cyAiJEdSQUlMU19CVUlMRF9GSUxFImA7Ci0gICAgR1JBSUxTX0FOVF9DTEFTU1BBVEg9YGN5Z3BhdGggLS13aW5kb3dzIC1wICIkR1JBSUxTX0FOVF9DTEFTU1BBVEgiYAotICAgIEJBU0VESVI9YGN5Z3BhdGggLS13aW5kb3dzICIkQkFTRURJUiJgCi0gICAgOzsKLWVzYWMKLQotJHtBTlRfQklOfSAtbGliICIke0dSQUlMU19BTlRfQ0xBU1NQQVRIfSIgLWYgJHtHUkFJTFNfQlVJTERfRklMRX0gLURiYXNlZGlyPSR7QkFTRURJUn0gJEAKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9iaW4vZ3JhaWxzLmJhdCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9iaW4vZ3JhaWxzLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5NTgxOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYmluL2dyYWlscy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1AZWNobyBvZmYKLQotaWYgIiVKQVZBX0hPTUUlIj09IiIgZ290byBqYXZhSG9tZU5vdFNldAotaWYgIiVHUkFJTFNfSE9NRSI9PSIiIGdvdG8gZ3JhaWxzSG9tZU5vdFNldAotZ290byBnZXRBcmd1bWVudHMKLQotOmphdmFIb21lTm90U2V0Ci1lY2hvIEVycm9yOiBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQKLWVjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBzdGFydCBHcmFpbHMgYWdhaW4KLWdvdG8gZXJyb3JFeGl0Ci0KLTpncmFpbHNIb21lTm90U2V0Ci1lY2hvIEVycm9yOiBHUkFJTFNfSE9NRSBpcyBub3QgZGVmaW5lZAotZWNobyBQbGVhc2Ugc2V0IHRoZSBHUkFJTFNfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgc3RhcnQgR3JhaWxzIGFnYWluCi1nb3RvIGVycm9yRXhpdAotCi06Z2V0QXJndW1lbnRzCi1zZXQgR1JBSUxTX0FSR1VNRU5UUz0lMQotaWYgIiIlMSIiPT0iIiIiIGdvdG8gZ2V0Q2xhc3NwYXRoCi1zaGlmdAotOmxvb3BBcmd1bWVudHMKLWlmICIiJTEiIj09IiIiIiBnb3RvIGdldENsYXNzcGF0aAotc2V0IEdSQUlMU19BUkdVTUVOVFM9JUdSQUlMU19BUkdVTUVOVFMlICUxCi1zaGlmdAotZ290byBsb29wQXJndW1lbnRzCi0KLTpnZXRDbGFzc3BhdGgKLXNldCBHUkFJTFNfQU5UX0NMQVNTUEFUSD0iJUdSQUlMU19IT01FJVxsaWJcYnNmLmphcjslR1JBSUxTX0hPTUUlXGxpYlxncm9vdnktYWxsLTEuMC1qc3ItMDUtU05BUFNIT1QuamFyOyVHUkFJTFNfSE9NRSVcbGliXG9yZy5tb3J0YmF5LmpldHR5LmphcjslR1JBSUxTX0hPTUUlXGxpYlxjb21tb25zLWxvZ2dpbmcuamFyOyVHUkFJTFNfSE9NRSVcbGliXGNvbW1vbnMtZWwuamFyOyVHUkFJTFNfSE9NRSVcbGliXGphdmF4LnNlcnZsZXQuamFyOyVHUkFJTFNfSE9NRSVcbGliXGxvZzRqLTEuMi44LmphcjslR1JBSUxTX0hPTUUlXGxpYlxqYXNwZXItY29tcGlsZXIuamFyOyVHUkFJTFNfSE9NRSVcbGliXGphc3Blci1ydW50aW1lLmphcjslR1JBSUxTX0hPTUUlXGxpYlx4bWwtYXBpcy5qYXI7JUdSQUlMU19IT01FJVxsaWJceGVyY2VzSW1wbC5qYXIiCi1nb3RvIHN0YXJ0R3JhaWxzCi0KLTpzdGFydEdyYWlscwotc2V0IEFOVF9IT01FPSVHUkFJTFNfSE9NRSVcYW50Ci1jYWxsICVBTlRfSE9NRSVcYmluXGFudC5iYXQgLWxpYiAlR1JBSUxTX0FOVF9DTEFTU1BBVEglIC1mICVHUkFJTFNfSE9NRSVcc3JjXGdyYWlsc1xidWlsZC54bWwgLURiYXNlZGlyPSIlQ0QlIiAlR1JBSUxTX0FSR1VNRU5UUyUKLQotOmVycm9yRXhpdAotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYnVpbGQucHJvcGVydGllcyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVlZmViLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotZ3JhaWxzLnZlcnNpb249MC4xYS1hbHBoYQotZ3JhaWxzLnNyYy5jb21tb25zPXNyYy9jb21tb25zCi1ncmFpbHMuc3JjLndlYj1zcmMvd2ViCi1ncmFpbHMuc3JjLndhcj1zcmMvd2FyCi1ncmFpbHMuc3JjLnBlcnNpc3RlbmNlPXNyYy9wZXJzaXN0ZW5jZQotZ3JhaWxzLnNyYy5zY2FmZm9sZGluZz1zcmMvc2NhZmZvbGRpbmcKLWdyYWlscy5zcmMudGlnZXI9c3JjL3RpZ2VyCi1ncmFpbHMuYnVpbGQ9dGFyZ2V0L2NsYXNzZXMKLWdyYWlscy5saWI9bGliCi1ncmFpbHMubGliLmhpYmVybmF0ZT1saWIvaGliZXJuYXRlCi1ncmFpbHMudGVzdC5zcmMuY29tbW9ucz10ZXN0L2NvbW1vbnMKLWdyYWlscy50ZXN0LnNyYy53ZWI9dGVzdC93ZWIKLWdyYWlscy50ZXN0LnNyYy5wZXJzaXN0ZW5jZT10ZXN0L3BlcnNpc3RlbmNlCi1ncmFpbHMudGVzdC5zcmMuc2NhZmZvbGRpbmc9dGVzdC9zY2FmZm9sZGluZwotZ3JhaWxzLnRlc3QuYnVpbGQ9dGFyZ2V0L3Rlc3QtY2xhc3NlcwotZ3JhaWxzLnRlc3QucmVwb3J0cz10YXJnZXQvdGVzdC1yZXBvcnRzCi1ncmFpbHMuZGlzdD1kaXN0Ci1ncmFpbHMuZGlzdC5qYXI9Z3JhaWxzLSR7Z3JhaWxzLnZlcnNpb259LVNOQVBTSE9ULmphcgotZ3JhaWxzLmphdmFkb2M9ZG9jL2FwaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9idWlsZC54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQxNTdiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iZ3JhaWxzLWJ1aWxkIiBkZWZhdWx0PSJqYXIiPgotCi0JPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KLQotCi0gICAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMubGlifSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtncmFpbHMuc3JjLndhcn0vV0VCLUlORiIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXNrZGVmIG5hbWU9Imdyb292eWMiICBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiAvPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSIke2dyYWlscy5idWlsZH0iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7Z3JhaWxzLnRlc3QuYnVpbGR9Ii8+Ci0JPC90YXJnZXQ+Ci0JCQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLWluaXQiIGRlcGVuZHM9ImNsZWFuIj4KLQkJPG1rZGlyIGRpcj0iJHtncmFpbHMuYnVpbGR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7Z3JhaWxzLnRlc3QuYnVpbGR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7Z3JhaWxzLnRlc3QucmVwb3J0c30iLz4KLQkJPG1rZGlyIGRpcj0iJHtncmFpbHMuZGlzdH0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJidWlsZC1pbml0Ij4KLQkJPGphdmFjIGRlYnVnPSJvbiIgZGVwcmVjYXRpb249Im9uIiBkZXN0ZGlyPSIke2dyYWlscy5idWlsZH0iIHNvdXJjZT0iMS4zIiB0YXJnZXQ9IjEuMyI+Ci0JCQk8c3JjIHBhdGg9IiR7Z3JhaWxzLnNyYy5jb21tb25zfSIvPgotCQkJPHNyYyBwYXRoPSIke2dyYWlscy5zcmMud2VifSIvPgotCQkJPHNyYyBwYXRoPSIke2dyYWlscy5zcmMucGVyc2lzdGVuY2V9Ii8+Ci0JCQk8c3JjIHBhdGg9IiR7Z3JhaWxzLnNyYy5zY2FmZm9sZGluZ30iLz4JCQkKLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgotCQk8L2phdmFjPgotICAgICAgICA8Z3Jvb3Z5YyBkZXN0ZGlyPSIke2dyYWlscy5idWlsZH0iID4KLQkJCTxzcmMgcGF0aD0iJHtncmFpbHMuc3JjLmNvbW1vbnN9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KLQkJPC9ncm9vdnljPgotCQk8Y29weSB0b2Rpcj0iJHtncmFpbHMuYnVpbGR9Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMuc3JjLmNvbW1vbnN9IiBleGNsdWRlcz0iKiovKi5qYXZhIiAvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5zcmMud2VifSIgZXhjbHVkZXM9IioqLyouamF2YSIgLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMuc3JjLnBlcnNpc3RlbmNlfSIgZXhjbHVkZXM9IioqLyouamF2YSIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5zcmMuc2NhZmZvbGRpbmd9IiBleGNsdWRlcz0iKiovKi5qYXZhIi8+CQkJCQkJCQotCQk8L2NvcHk+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGQ6amF2YTUiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkOmNoZWNrajUiPgotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpcy5qYXZhLjUiPgotICAgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuNSIvPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQ6amF2YTUiIGRlcGVuZHM9ImJ1aWxkOmNoZWNrajUiIGlmPSJpcy5qYXZhLjUiPgotICAgICAgICA8IS0tYnVpbGQgamF2YSA1IHNvdXJjZXMtLT4KLSAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtncmFpbHMuc3JjLnRpZ2VyfSIgZGVzdGRpcj0iJHtncmFpbHMuYnVpbGR9IiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgZGVidWc9Im9uIiBkZXByZWNhdGlvbj0ib24iIG9wdGltaXplPSJvZmYiLz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdCIgZGVwZW5kcz0iYnVpbGQiPgotCQk8amF2YWMgZGVidWc9Im9uIiBkZXByZWNhdGlvbj0ib24iIGRlc3RkaXI9IiR7Z3JhaWxzLnRlc3QuYnVpbGR9IiBzb3VyY2U9IjEuMyIgdGFyZ2V0PSIxLjMiIGluY2x1ZGVzPSIqKi8qIj4JCQkKLQkJCTxzcmMgcGF0aD0iJHtncmFpbHMudGVzdC5zcmMuY29tbW9uc30iLz4KLQkJCTxzcmMgcGF0aD0iJHtncmFpbHMudGVzdC5zcmMud2VifSIvPgotCQkJPHNyYyBwYXRoPSIke2dyYWlscy50ZXN0LnNyYy5wZXJzaXN0ZW5jZX0iLz4KLQkJCTxzcmMgcGF0aD0iJHtncmFpbHMudGVzdC5zcmMuc2NhZmZvbGRpbmd9Ii8+CQkJCQotCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2dyYWlscy5idWlsZH0iLz4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImJ1aWxkLXRlc3QiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtncmFpbHMudGVzdC5yZXBvcnRzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2dyYWlscy50ZXN0LnJlcG9ydHN9Ii8+Ci0gICAgICAgIDxqdW5pdD4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtncmFpbHMuYnVpbGR9Ii8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2dyYWlscy50ZXN0LmJ1aWxkfSIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtncmFpbHMudGVzdC5zcmMud2VifSIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtncmFpbHMudGVzdC5zcmMuY29tbW9uc30iLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Z3JhaWxzLnRlc3Quc3JjLnBlcnNpc3RlbmNlfSIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtncmFpbHMudGVzdC5zcmMuc2NhZmZvbGRpbmd9Ii8+Ci0JCQkJCi0JCQk8Zm9ybWF0dGVyIHR5cGU9ImJyaWVmIiAvPgotCQkJPGJhdGNodGVzdCB0b2Rpcj0iJHtncmFpbHMudGVzdC5yZXBvcnRzfSIgZm9yaz0ieWVzIiBmYWlsdXJlcHJvcGVydHk9ImdyYWlscy50ZXN0LmZhaWx1cmUiPgotCQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMudGVzdC5idWlsZH0iIGluY2x1ZGVzPSIqKi8qVGVzdHMuY2xhc3MiIGV4Y2x1ZGVzPSIqKi9BYnN0cmFjdCoiLz4KLQkJCTwvYmF0Y2h0ZXN0PgotCQkJCi0JCTwvanVuaXQ+Ci0gICAgICAgIDxmYWlsIGlmPSJncmFpbHMudGVzdC5mYWlsdXJlIj5UaGUgdGVzdHMgZmFpbGVkLiBIYXZlIGEgbG9vayBhdCAke2dyYWlscy50ZXN0LnJlcG9ydHN9PC9mYWlsPgotICAgIDwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJidWlsZC10ZXN0Ij4KLQkJPGRlbGV0ZSBmaWxlPSIke2dyYWlscy5kaXN0fS8ke2dyYWlscy5kaXN0Lmphcn0iLz4KLQkJPGphciBkZXN0ZmlsZT0iJHtncmFpbHMuZGlzdH0vJHtncmFpbHMuZGlzdC5qYXJ9IiBiYXNlZGlyPSIke2dyYWlscy5idWlsZH0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgotCQk8ZGVsZXRlIGRpcj0iJHtncmFpbHMuamF2YWRvY30iLz4KLQkJPG1rZGlyIGRpcj0iJHtncmFpbHMuamF2YWRvY30iLz4KLQkJCi0JCTxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7Z3JhaWxzLnNyYy5jb21tb25zfSwke2dyYWlscy5zcmMud2VifSIgZGVzdGRpcj0iJHtncmFpbHMuamF2YWRvY30iIHdpbmRvd3RpdGxlPSJHcmFpbHMgJHtncmFpbHMudmVyc2lvbn0iIHNvdXJjZT0iMS4zIiBhY2Nlc3M9InBhY2thZ2UiIGF1dGhvcj0idHJ1ZSIgdmVyc2lvbj0idHJ1ZSIgdXNlPSJ0cnVlIiBkZWZhdWx0ZXhjbHVkZXM9InRydWUiPgotCQkJPGRvY3RpdGxlPjwhW0NEQVRBWzxoMT5HcmFpbHM8L2gxPl1dPjwvZG9jdGl0bGU+Ci0JCQk8Ym90dG9tPjwhW0NEQVRBWzxpPkNvcHlyaWdodCAoYykgMjAwNSBUaGUgR3JhaWxzIHByb2plY3Q8L2k+XV0+PC9ib3R0b20+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KLQkJCTxwYWNrYWdlc2V0IGRpcj0iJHtncmFpbHMuc3JjLmNvbW1vbnN9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy8qKiIvPgotCQkJPC9wYWNrYWdlc2V0PgotCQkJPHBhY2thZ2VzZXQgZGlyPSIke2dyYWlscy5zcmMud2VifSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvKioiLz4KLQkJCTwvcGFja2FnZXNldD4KLQkJCTxsaW5rIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS8xLjQvZG9jcy9hcGkiLz4KLQkJCTxsaW5rIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaSIvPgotCQkJPGxpbmsgaHJlZj0iaHR0cDovL3N0YXRpYy5zcHJpbmdmcmFtZXdvcmsub3JnL3NwcmluZy9kb2NzLzEuMi54L2FwaSIvPgkJCQkJCQotCQk8L2phdmFkb2M+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJkaXN0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCQk8ZGVsZXRlIGZpbGU9Ii4uL2dyYWlscy0ke2dyYWlscy52ZXJzaW9ufS50YXIuZ3oiLz4KLQkJPHRhciBjb21wcmVzc2lvbj0iZ3ppcCIgZGVzdGZpbGU9Ii4uL2dyYWlscy0ke2dyYWlscy52ZXJzaW9ufS50YXIuZ3oiIGJhc2VkaXI9Ii4iIGV4Y2x1ZGVzPSIqKi9DVlMvKiovKiIvPgotCTwvdGFyZ2V0PgkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvY29tbW9ucy5pbWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvY29tbW9ucy5pbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZWY1ZjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2NvbW1vbnMuaW1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxtb2R1bGUgdmVyc2lvbj0iNCIgcmVsYXRpdmVQYXRocz0idHJ1ZSIgdHlwZT0iSkFWQV9NT0RVTEUiPgotICA8Y29tcG9uZW50IG5hbWU9Ik1vZHVsZVJvb3RNYW5hZ2VyIiAvPgotICA8Y29tcG9uZW50IG5hbWU9Ik5ld01vZHVsZVJvb3RNYW5hZ2VyIj4KLSAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KLSAgICA8ZXhjbHVkZS1vdXRwdXQgLz4KLSAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL2NvbW1vbnMiPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL2NvbW1vbnMiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+Ci0gICAgPC9jb250ZW50PgotICAgIDxvcmRlckVudHJ5IHR5cGU9ImluaGVyaXRlZEpkayIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJzb3VyY2VGb2xkZXIiIGZvclRlc3RzPSJmYWxzZSIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJHcm9vdnkgZnJvbSBHcm9vdnlKIDAuMS42IChJcmlkYSkiIGxldmVsPSJhcHBsaWNhdGlvbiIgLz4KLSAgICA8b3JkZXJFbnRyeVByb3BlcnRpZXMgLz4KLSAgPC9jb21wb25lbnQ+Ci08L21vZHVsZT4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2dyYWlscy5pcHIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvZ3JhaWxzLmlwcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3NDcyNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvZ3JhaWxzLmlwcgorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgdmVyc2lvbj0iNCIgcmVsYXRpdmVQYXRocz0iZmFsc2UiPgotICA8Y29tcG9uZW50IG5hbWU9IkFudENvbmZpZ3VyYXRpb24iPgotICAgIDxkZWZhdWx0QW50IGJ1bmRsZWRBbnQ9InRydWUiIC8+Ci0gICAgPGJ1aWxkRmlsZSB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2J1aWxkLnhtbCI+Ci0gICAgICA8YWRkaXRpb25hbENsYXNzUGF0aCAvPgotICAgICAgPGFudFJlZmVyZW5jZSBwcm9qZWN0RGVmYXVsdD0idHJ1ZSIgLz4KLSAgICAgIDxjdXN0b21KZGtOYW1lIHZhbHVlPSIiIC8+Ci0gICAgICA8bWF4aW11bUhlYXBTaXplIHZhbHVlPSIxMjgiIC8+Ci0gICAgICA8cHJvcGVydGllcyAvPgotICAgIDwvYnVpbGRGaWxlPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJDb2RlU3R5bGVTZXR0aW5nc01hbmFnZXIiPgotICAgIDxvcHRpb24gbmFtZT0iUEVSX1BST0pFQ1RfU0VUVElOR1MiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJVU0VfUEVSX1BST0pFQ1RfU0VUVElOR1MiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iQ29tcGlsZXJDb25maWd1cmF0aW9uIj4KLSAgICA8b3B0aW9uIG5hbWU9IkRFRkFVTFRfQ09NUElMRVIiIHZhbHVlPSJKYXZhYyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNMRUFSX09VVFBVVF9ESVJFQ1RPUlkiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkRFUExPWV9BRlRFUl9NQUtFIiB2YWx1ZT0iMiIgLz4KLSAgICA8cmVzb3VyY2VFeHRlbnNpb25zPgotICAgICAgPGVudHJ5IG5hbWU9Ii4rXC4ocHJvcGVydGllc3x4bWx8aHRtbHxkdGR8dGxkKSIgLz4KLSAgICAgIDxlbnRyeSBuYW1lPSIuK1wuKGdpZnxwbmd8anBlZ3xqcGcpIiAvPgotICAgIDwvcmVzb3VyY2VFeHRlbnNpb25zPgotICAgIDx3aWxkY2FyZFJlc291cmNlUGF0dGVybnM+Ci0gICAgICA8ZW50cnkgbmFtZT0iPyoucHJvcGVydGllcyIgLz4KLSAgICAgIDxlbnRyeSBuYW1lPSI/Ki54bWwiIC8+Ci0gICAgICA8ZW50cnkgbmFtZT0iPyouZ2lmIiAvPgotICAgICAgPGVudHJ5IG5hbWU9Ij8qLnBuZyIgLz4KLSAgICAgIDxlbnRyeSBuYW1lPSI/Ki5qcGVnIiAvPgotICAgICAgPGVudHJ5IG5hbWU9Ij8qLmpwZyIgLz4KLSAgICAgIDxlbnRyeSBuYW1lPSI/Ki5odG1sIiAvPgotICAgICAgPGVudHJ5IG5hbWU9Ij8qLmR0ZCIgLz4KLSAgICAgIDxlbnRyeSBuYW1lPSI/Ki50bGQiIC8+Ci0gICAgPC93aWxkY2FyZFJlc291cmNlUGF0dGVybnM+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkRhdGFTb3VyY2VNYW5hZ2VySW1wbCIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJEZXBlbmRlbmNpZXNBbmFseXplTWFuYWdlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJteUZvcndhcmREaXJlY3Rpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iRGVwZW5kZW5jeVZhbGlkYXRpb25NYW5hZ2VyIiAvPgotICA8Y29tcG9uZW50IG5hbWU9IkVudHJ5UG9pbnRzTWFuYWdlciI+Ci0gICAgPGVudHJ5X3BvaW50cyAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJFeHBvcnRUb0hUTUxTZXR0aW5ncyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJQUklOVF9MSU5FX05VTUJFUlMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9QRU5fSU5fQlJPV1NFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iT1VUUFVUX0RJUkVDVE9SWSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iR1VJIERlc2lnbmVyIGNvbXBvbmVudCBsb2FkZXIgZmFjdG9yeSIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJKYXZhY1NldHRpbmdzIj4KLSAgICA8b3B0aW9uIG5hbWU9IkRFQlVHR0lOR19JTkZPIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkdFTkVSQVRFX05PX1dBUk5JTkdTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJERVBSRUNBVElPTiIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJBRERJVElPTkFMX09QVElPTlNfU1RSSU5HIiB2YWx1ZT0iIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTUFYSU1VTV9IRUFQX1NJWkUiIHZhbHVlPSIxMjgiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkphdmFkb2NHZW5lcmF0aW9uTWFuYWdlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJPVVRQVVRfRElSRUNUT1JZIiAvPgotICAgIDxvcHRpb24gbmFtZT0iT1BUSU9OX1NDT1BFIiB2YWx1ZT0icHJvdGVjdGVkIiAvPgotICAgIDxvcHRpb24gbmFtZT0iT1BUSU9OX0hJRVJBUkNIWSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUFRJT05fTkFWSUdBVE9SIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9QVElPTl9JTkRFWCIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUFRJT05fU0VQQVJBVEVfSU5ERVgiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iT1BUSU9OX0RPQ1VNRU5UX1RBR19VU0UiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9QVElPTl9ET0NVTUVOVF9UQUdfQVVUSE9SIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUFRJT05fRE9DVU1FTlRfVEFHX1ZFUlNJT04iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9QVElPTl9ET0NVTUVOVF9UQUdfREVQUkVDQVRFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUFRJT05fREVQUkVDQVRFRF9MSVNUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9USEVSX09QVElPTlMiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJIRUFQX1NJWkUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUEVOX0lOX0JST1dTRVIiIHZhbHVlPSJ0cnVlIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJKaWtlc1NldHRpbmdzIj4KLSAgICA8b3B0aW9uIG5hbWU9IkpJS0VTX1BBVEgiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJERUJVR0dJTkdfSU5GTyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJERVBSRUNBVElPTiIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJHRU5FUkFURV9OT19XQVJOSU5HUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iSVNfRU1BQ1NfRVJST1JTX01PREUiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iQURESVRJT05BTF9PUFRJT05TX1NUUklORyIgdmFsdWU9IiIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iUGFsZXR0ZTIiPgotICAgIDxncm91cCBuYW1lPSJTd2luZyI+Ci0gICAgICA8aXRlbSBjbGFzcz0iY29tLmludGVsbGlqLnVpRGVzaWduZXIuSFNwYWNlciIgdG9vbHRpcC10ZXh0PSJIb3Jpem9udGFsIFNwYWNlciIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL2hzcGFjZXIucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIxIiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iMCIgZmlsbD0iMSIgLz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJjb20uaW50ZWxsaWoudWlEZXNpZ25lci5WU3BhY2VyIiB0b29sdGlwLXRleHQ9IlZlcnRpY2FsIFNwYWNlciIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3ZzcGFjZXIucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSI2IiBoc2l6ZS1wb2xpY3k9IjEiIGFuY2hvcj0iMCIgZmlsbD0iMiIgLz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KUGFuZWwiIGljb249Ii9jb20vaW50ZWxsaWovdWlEZXNpZ25lci9pY29ucy9wYW5lbC5wbmciIHJlbW92YWJsZT0iZmFsc2UiPgotICAgICAgICA8ZGVmYXVsdC1jb25zdHJhaW50cyB2c2l6ZS1wb2xpY3k9IjMiIGhzaXplLXBvbGljeT0iMyIgYW5jaG9yPSIwIiBmaWxsPSIzIiAvPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpTY3JvbGxQYW5lIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvc2Nyb2xsUGFuZS5wbmciIHJlbW92YWJsZT0iZmFsc2UiPgotICAgICAgICA8ZGVmYXVsdC1jb25zdHJhaW50cyB2c2l6ZS1wb2xpY3k9IjciIGhzaXplLXBvbGljeT0iNyIgYW5jaG9yPSIwIiBmaWxsPSIzIiAvPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpCdXR0b24iIGljb249Ii9jb20vaW50ZWxsaWovdWlEZXNpZ25lci9pY29ucy9idXR0b24ucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIwIiBoc2l6ZS1wb2xpY3k9IjMiIGFuY2hvcj0iMCIgZmlsbD0iMSIgLz4KLSAgICAgICAgPGluaXRpYWwtdmFsdWVzPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB2YWx1ZT0iQnV0dG9uIiAvPgotICAgICAgICA8L2luaXRpYWwtdmFsdWVzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbiIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3JhZGlvQnV0dG9uLnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSIzIiBhbmNob3I9IjgiIGZpbGw9IjAiIC8+Ci0gICAgICAgIDxpbml0aWFsLXZhbHVlcz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdmFsdWU9IlJhZGlvQnV0dG9uIiAvPgotICAgICAgICA8L2luaXRpYWwtdmFsdWVzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpDaGVja0JveCIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL2NoZWNrQm94LnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSIzIiBhbmNob3I9IjgiIGZpbGw9IjAiIC8+Ci0gICAgICAgIDxpbml0aWFsLXZhbHVlcz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdmFsdWU9IkNoZWNrQm94IiAvPgotICAgICAgICA8L2luaXRpYWwtdmFsdWVzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpMYWJlbCIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL2xhYmVsLnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSIwIiBhbmNob3I9IjgiIGZpbGw9IjAiIC8+Ci0gICAgICAgIDxpbml0aWFsLXZhbHVlcz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdmFsdWU9IkxhYmVsIiAvPgotICAgICAgICA8L2luaXRpYWwtdmFsdWVzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpUZXh0RmllbGQiIGljb249Ii9jb20vaW50ZWxsaWovdWlEZXNpZ25lci9pY29ucy90ZXh0RmllbGQucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIwIiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iOCIgZmlsbD0iMSI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iLTEiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KUGFzc3dvcmRGaWVsZCIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3Bhc3N3b3JkRmllbGQucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIwIiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iOCIgZmlsbD0iMSI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iLTEiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvZm9ybWF0dGVkVGV4dEZpZWxkLnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSI2IiBhbmNob3I9IjgiIGZpbGw9IjEiPgotICAgICAgICAgIDxwcmVmZXJyZWQtc2l6ZSB3aWR0aD0iMTUwIiBoZWlnaHQ9Ii0xIiAvPgotICAgICAgICA8L2RlZmF1bHQtY29uc3RyYWludHM+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbSBjbGFzcz0iamF2YXguc3dpbmcuSlRleHRBcmVhIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvdGV4dEFyZWEucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSI2IiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iMCIgZmlsbD0iMyI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iNTAiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KVGV4dFBhbmUiIGljb249Ii9jb20vaW50ZWxsaWovdWlEZXNpZ25lci9pY29ucy90ZXh0UGFuZS5wbmciIHJlbW92YWJsZT0iZmFsc2UiPgotICAgICAgICA8ZGVmYXVsdC1jb25zdHJhaW50cyB2c2l6ZS1wb2xpY3k9IjYiIGhzaXplLXBvbGljeT0iNiIgYW5jaG9yPSIwIiBmaWxsPSIzIj4KLSAgICAgICAgICA8cHJlZmVycmVkLXNpemUgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1MCIgLz4KLSAgICAgICAgPC9kZWZhdWx0LWNvbnN0cmFpbnRzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpFZGl0b3JQYW5lIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvZWRpdG9yUGFuZS5wbmciIHJlbW92YWJsZT0iZmFsc2UiPgotICAgICAgICA8ZGVmYXVsdC1jb25zdHJhaW50cyB2c2l6ZS1wb2xpY3k9IjYiIGhzaXplLXBvbGljeT0iNiIgYW5jaG9yPSIwIiBmaWxsPSIzIj4KLSAgICAgICAgICA8cHJlZmVycmVkLXNpemUgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1MCIgLz4KLSAgICAgICAgPC9kZWZhdWx0LWNvbnN0cmFpbnRzPgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0gY2xhc3M9ImphdmF4LnN3aW5nLkpDb21ib0JveCIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL2NvbWJvQm94LnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSIyIiBhbmNob3I9IjgiIGZpbGw9IjEiIC8+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbSBjbGFzcz0iamF2YXguc3dpbmcuSlRhYmxlIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvdGFibGUucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSI2IiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iMCIgZmlsbD0iMyI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iNTAiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KTGlzdCIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL2xpc3QucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSI2IiBoc2l6ZS1wb2xpY3k9IjIiIGFuY2hvcj0iMCIgZmlsbD0iMyI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iNTAiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KVHJlZSIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3RyZWUucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSI2IiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iMCIgZmlsbD0iMyI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIxNTAiIGhlaWdodD0iNTAiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KVGFiYmVkUGFuZSIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3RhYmJlZFBhbmUucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIzIiBoc2l6ZS1wb2xpY3k9IjMiIGFuY2hvcj0iMCIgZmlsbD0iMyI+Ci0gICAgICAgICAgPHByZWZlcnJlZC1zaXplIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiAvPgotICAgICAgICA8L2RlZmF1bHQtY29uc3RyYWludHM+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbSBjbGFzcz0iamF2YXguc3dpbmcuSlNwbGl0UGFuZSIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3NwbGl0UGFuZS5wbmciIHJlbW92YWJsZT0iZmFsc2UiPgotICAgICAgICA8ZGVmYXVsdC1jb25zdHJhaW50cyB2c2l6ZS1wb2xpY3k9IjMiIGhzaXplLXBvbGljeT0iMyIgYW5jaG9yPSIwIiBmaWxsPSIzIj4KLSAgICAgICAgICA8cHJlZmVycmVkLXNpemUgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIC8+Ci0gICAgICAgIDwvZGVmYXVsdC1jb25zdHJhaW50cz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KU3Bpbm5lciIgaWNvbj0iL2NvbS9pbnRlbGxpai91aURlc2lnbmVyL2ljb25zL3NwaW5uZXIucG5nIiByZW1vdmFibGU9ImZhbHNlIj4KLSAgICAgICAgPGRlZmF1bHQtY29uc3RyYWludHMgdnNpemUtcG9saWN5PSIwIiBoc2l6ZS1wb2xpY3k9IjYiIGFuY2hvcj0iOCIgZmlsbD0iMSIgLz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIGNsYXNzPSJqYXZheC5zd2luZy5KU2xpZGVyIiBpY29uPSIvY29tL2ludGVsbGlqL3VpRGVzaWduZXIvaWNvbnMvc2xpZGVyLnBuZyIgcmVtb3ZhYmxlPSJmYWxzZSI+Ci0gICAgICAgIDxkZWZhdWx0LWNvbnN0cmFpbnRzIHZzaXplLXBvbGljeT0iMCIgaHNpemUtcG9saWN5PSI2IiBhbmNob3I9IjgiIGZpbGw9IjEiIC8+Ci0gICAgICA8L2l0ZW0+Ci0gICAgPC9ncm91cD4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iUHJvamVjdE1vZHVsZU1hbmFnZXIiPgotICAgIDxtb2R1bGVzPgotICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9HcmFpbHMgTW9kdWxlLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvR3JhaWxzIE1vZHVsZS5pbWwiIC8+Ci0gICAgICA8bW9kdWxlIGZpbGV1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NhbXBsZXMvdGVzdC9HcmFpbHMgVGVzdCBBcHAuaW1sIiBmaWxlcGF0aD0iJFBST0pFQ1RfRElSJC9zYW1wbGVzL3Rlc3QvR3JhaWxzIFRlc3QgQXBwLmltbCIgLz4KLSAgICA8L21vZHVsZXM+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlByb2plY3RSb290TWFuYWdlciIgdmVyc2lvbj0iMiIgYXNzZXJ0LWtleXdvcmQ9InRydWUiIGpkay0xNT0iZmFsc2UiIHByb2plY3QtamRrLW5hbWU9IjEuNCIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJSbWljU2V0dGluZ3MiPgotICAgIDxvcHRpb24gbmFtZT0iSVNfRUFOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkRFQlVHR0lOR19JTkZPIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkdFTkVSQVRFX05PX1dBUk5JTkdTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJHRU5FUkFURV9JSU9QX1NUVUJTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJBRERJVElPTkFMX09QVElPTlNfU1RSSU5HIiB2YWx1ZT0iIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJsaWJyYXJ5VGFibGUiIC8+Ci0gIDxjb21wb25lbnQgbmFtZT0idWlkZXNpZ25lci1jb25maWd1cmF0aW9uIj4KLSAgICA8b3B0aW9uIG5hbWU9IklOU1RSVU1FTlRfQ0xBU1NFUyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJDT1BZX0ZPUk1TX1JVTlRJTUVfVE9fT1VUUFVUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxVc2VkUGF0aE1hY3JvcyAvPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvZ3JhaWxzLml3cyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9ncmFpbHMuaXdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlkNmMyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9ncmFpbHMuaXdzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgdmVyc2lvbj0iNCIgcmVsYXRpdmVQYXRocz0iZmFsc2UiPgotICA8Y29tcG9uZW50IG5hbWU9IkFzcGVjdHNWaWV3IiAvPgotICA8Y29tcG9uZW50IG5hbWU9IkJvb2ttYXJrTWFuYWdlciIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJDaGFuZ2VCcm93c2VyU2V0dGluZ3MiPgotICAgIDxvcHRpb24gbmFtZT0iTUFJTl9TUExJVFRFUl9QUk9QT1JUSU9OIiB2YWx1ZT0iMC4zIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTUVTU0FHRVNfU1BMSVRURVJfUFJPUE9SVElPTiIgdmFsdWU9IjAuOCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRV9EQVRFX0JFRk9SRV9GSUxURVIiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRV9EQVRFX0FGVEVSX0ZJTFRFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFX0NIQU5HRV9CRUZPUkVfRklMVEVSIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJVU0VfQ0hBTkdFX0FGVEVSX0ZJTFRFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iREFURV9CRUZPUkUiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJEQVRFX0FGVEVSIiB2YWx1ZT0iIiAvPgotICAgIDxvcHRpb24gbmFtZT0iQ0hBTkdFX0JFRk9SRSIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNIQU5HRV9BRlRFUiIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRV9VU0VSX0ZJTFRFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFUiIgdmFsdWU9IiIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iQ2hlY2tpblBhbmVsU3RhdGUiIC8+Ci0gIDxjb21wb25lbnQgbmFtZT0iQ29tbWFuZGVyIj4KLSAgICA8bGVmdFBhbmVsIC8+Ci0gICAgPHJpZ2h0UGFuZWwgLz4KLSAgICA8c3BsaXR0ZXIgcHJvcG9ydGlvbj0iMC41IiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJDb21waWxlcldvcmtzcGFjZUNvbmZpZ3VyYXRpb24iPgotICAgIDxvcHRpb24gbmFtZT0iQ09NUElMRV9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkFVVE9fU0hPV19FUlJPUlNfSU5fRURJVE9SIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNMT1NFX01FU1NBR0VfVklFV19JRl9TVUNDRVNTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNPTVBJTEVfREVQRU5ERU5UX0ZJTEVTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkN2czJDb25maWd1cmF0aW9uIj4KLSAgICA8b3B0aW9uIG5hbWU9IlBSVU5FX0VNUFRZX0RJUkVDVE9SSUVTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik1FUkdJTkdfTU9ERSIgdmFsdWU9IjAiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJNRVJHRV9XSVRIX0JSQU5DSDFfTkFNRSIgdmFsdWU9IkhFQUQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJNRVJHRV9XSVRIX0JSQU5DSDJfTkFNRSIgdmFsdWU9IkhFQUQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJSRVNFVF9TVElDS1kiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNSRUFURV9ORVdfRElSRUNUT1JJRVMiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iREVGQVVMVF9URVhUX0ZJTEVfU1VCU1RJVFVUSU9OIiB2YWx1ZT0ia3YiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJQUk9DRVNTX1VOS05PV05fRklMRVMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlBST0NFU1NfREVMRVRFRF9GSUxFUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iUFJPQ0VTU19JR05PUkVEX0ZJTEVTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJSRVNFUlZFRF9FRElUIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJDSEVDS09VVF9EQVRFX09SX1JFVklTSU9OX1NFVFRJTkdTIj4KLSAgICAgIDx2YWx1ZT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJCUkFOQ0giIHZhbHVlPSIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iREFURSIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJVU0VfQlJBTkNIIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iVVNFX0RBVEUiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDwvdmFsdWU+Ci0gICAgPC9vcHRpb24+Ci0gICAgPG9wdGlvbiBuYW1lPSJVUERBVEVfREFURV9PUl9SRVZJU0lPTl9TRVRUSU5HUyI+Ci0gICAgICA8dmFsdWU+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQlJBTkNIIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkRBVEUiIHZhbHVlPSIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iVVNFX0JSQU5DSCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9EQVRFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8L3ZhbHVlPgotICAgIDwvb3B0aW9uPgotICAgIDxvcHRpb24gbmFtZT0iU0hPV19DSEFOR0VTX1JFVklTSU9OX1NFVFRJTkdTIj4KLSAgICAgIDx2YWx1ZT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJCUkFOQ0giIHZhbHVlPSIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iREFURSIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJVU0VfQlJBTkNIIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iVVNFX0RBVEUiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDwvdmFsdWU+Ci0gICAgPC9vcHRpb24+Ci0gICAgPG9wdGlvbiBuYW1lPSJTSE9XX09VVFBVVCIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iQUREX1dBVENIX0lOREVYIiB2YWx1ZT0iMCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlJFTU9WRV9XQVRDSF9JTkRFWCIgdmFsdWU9IjAiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJVUERBVEVfS0VZV09SRF9TVUJTVElUVVRJT04iIHZhbHVlPSJOT05FIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTUFLRV9ORVdfRklMRVNfUkVBRE9OTFkiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNIT1dfQ09SUlVQVEVEX1BST0pFQ1RfRklMRVMiIHZhbHVlPSIwIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVEFHX0FGVEVSX1BST0pFQ1RfQ09NTUlUIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPVkVSUklERV9FWElTVElOR19UQUdfRk9SX1BST0pFQ1QiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVEFHX0FGVEVSX1BST0pFQ1RfQ09NTUlUX05BTUUiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJDTEVBTl9DT1BZIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkRhZW1vbkNvZGVBbmFseXplciI+Ci0gICAgPGRpc2FibGVfaGludHMgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iRGVidWdnZXJNYW5hZ2VyIj4KLSAgICA8bGluZV9icmVha3BvaW50cz4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eS5qYXZhIiBsaW5lPSIxNyIgY2xhc3M9IkNsYXNzIGF0IEdlbmVyaWNEeW5hbWljUHJvcGVydHkuamF2YToxNyIgcGFja2FnZT0iIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQgdXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbi5qYXZhIiBsaW5lPSIyNTAiIGNsYXNzPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkRlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbiIgcGFja2FnZT0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucyI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRmxhc2hTY29wZVRlc3RzLmphdmEiIGxpbmU9IjQwIiBjbGFzcz0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzRmxhc2hTY29wZVRlc3RzIiBwYWNrYWdlPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldCI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovL0Q6L0Rvd25sb2Fkcy9EZXZlbG9wbWVudC9TcHJpbmcvc3ByaW5nLWZyYW1ld29yay0xLjIuNi9tb2NrL29yZy9zcHJpbmdmcmFtZXdvcmsvbW9jay93ZWIvTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YSIgbGluZT0iMTgxIiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5tb2NrLndlYi5Nb2NrSHR0cFNlcnZsZXRSZXNwb25zZSIgcGFja2FnZT0ib3JnLnNwcmluZ2ZyYW1ld29yay5tb2NrLndlYiI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0NoYWluRHluYW1pY01ldGhvZC5qYXZhIiBsaW5lPSI3MSIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3MuQ2hhaW5EeW5hbWljTWV0aG9kIiBwYWNrYWdlPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQgdXJsPSJmaWxlOi8vRDovRG93bmxvYWRzL0RldmVsb3BtZW50L0hpYmVybmF0ZS9oaWJlcm5hdGUtMy4xL3NyYy9vcmcvaGliZXJuYXRlL2V2ZW50L2RlZi9EZWZhdWx0VXBkYXRlRXZlbnRMaXN0ZW5lci5qYXZhIiBsaW5lPSIyMiIgY2xhc3M9Im9yZy5oaWJlcm5hdGUuZXZlbnQuZGVmLkRlZmF1bHRVcGRhdGVFdmVudExpc3RlbmVyIiBwYWNrYWdlPSJvcmcuaGliZXJuYXRlLmV2ZW50LmRlZiI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovL0Q6L0Rvd25sb2Fkcy9EZXZlbG9wbWVudC9TcHJpbmcvc3ByaW5nLWZyYW1ld29yay0xLjIuNi9zcmMvb3JnL3NwcmluZ2ZyYW1ld29yay9vcm0vaGliZXJuYXRlMy9IaWJlcm5hdGVUZW1wbGF0ZS5qYXZhIiBsaW5lPSI3NjIiIGNsYXNzPSJDbGFzcyBhdCBIaWJlcm5hdGVUZW1wbGF0ZS5qYXZhOjc2MiIgcGFja2FnZT0ib3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMyI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovL0Q6L0Rvd25sb2Fkcy9EZXZlbG9wbWVudC9TcHJpbmcvc3ByaW5nLWZyYW1ld29yay0xLjIuNi9zcmMvb3JnL3NwcmluZ2ZyYW1ld29yay9vcm0vaGliZXJuYXRlMy9IaWJlcm5hdGVUZW1wbGF0ZS5qYXZhIiBsaW5lPSI2ODgiIGNsYXNzPSJDbGFzcyBhdCBIaWJlcm5hdGVUZW1wbGF0ZS5qYXZhOjY4OCIgcGFja2FnZT0ib3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMyI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iRU5BQkxFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICAgIDxicmVha3BvaW50IHVybD0iZmlsZTovL0Q6L0Rvd25sb2Fkcy9EZXZlbG9wbWVudC9IaWJlcm5hdGUvaGliZXJuYXRlLTMuMS9zcmMvb3JnL2hpYmVybmF0ZS9pbXBsL1Nlc3Npb25JbXBsLmphdmEiIGxpbmU9IjUzMCIgY2xhc3M9Im9yZy5oaWJlcm5hdGUuaW1wbC5TZXNzaW9uSW1wbCIgcGFja2FnZT0ib3JnLmhpYmVybmF0ZS5pbXBsIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQgdXJsPSJmaWxlOi8vRDovRG93bmxvYWRzL0RldmVsb3BtZW50L0hpYmVybmF0ZS9oaWJlcm5hdGUtMy4xL3NyYy9vcmcvaGliZXJuYXRlL2VuZ2luZS9DYXNjYWRlLmphdmEiIGxpbmU9IjEwNCIgY2xhc3M9Im9yZy5oaWJlcm5hdGUuZW5naW5lLkNhc2NhZGUiIHBhY2thZ2U9Im9yZy5oaWJlcm5hdGUuZW5naW5lIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQgdXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlLmphdmEiIGxpbmU9IjIxNyIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlcy5Hcm9vdnlQYWdlIiBwYWNrYWdlPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXMiPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkVOQUJMRUQiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IlNVU1BFTkRfUE9MSUNZIiB2YWx1ZT0iU3VzcGVuZEFsbCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FWFBSRVNTSU9OX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVJfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUiIgdmFsdWU9IjAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDTEFTU19GSUxURVJTX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJJTlNUQU5DRV9GSUxURVJTX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT04iIHZhbHVlPSIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX01FU1NBR0UiIHZhbHVlPSIiIC8+Ci0gICAgICA8L2JyZWFrcG9pbnQ+Ci0gICAgICA8YnJlYWtwb2ludCB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmphdmEiIGxpbmU9IjMxNiIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uIiBwYWNrYWdlPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgIDwvbGluZV9icmVha3BvaW50cz4KLSAgICA8YnJlYWtwb2ludF9hbnk+Ci0gICAgICA8YnJlYWtwb2ludD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJOT1RJRllfQ0FVR0hUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJOT1RJRllfVU5DQVVHSFQiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkVOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJTVVNQRU5EX1BPTElDWSIgdmFsdWU9IlN1c3BlbmRBbGwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfRVhQUkVTU0lPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT1VOVF9GSUxURVIiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ0xBU1NfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iSU5TVEFOQ0VfRklMVEVSU19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09ORElUSU9OIiB2YWx1ZT0iIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19NRVNTQUdFIiB2YWx1ZT0iIiAvPgotICAgICAgPC9icmVha3BvaW50PgotICAgICAgPGJyZWFrcG9pbnQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTk9USUZZX0NBVUdIVCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTk9USUZZX1VOQ0FVR0hUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iU1VTUEVORF9QT0xJQ1kiIHZhbHVlPSJTdXNwZW5kQWxsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPR19FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9HX0VYUFJFU1NJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPVU5UX0ZJTFRFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iQ09VTlRfRklMVEVSIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJDT05ESVRJT05fRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNMQVNTX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IklOU1RBTkNFX0ZJTFRFUlNfRU5BQkxFRCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTkRJVElPTiIgdmFsdWU9IiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJMT0dfTUVTU0FHRSIgdmFsdWU9IiIgLz4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgICA8L2JyZWFrcG9pbnRfYW55PgotICAgIDxicmVha3BvaW50X3J1bGVzIC8+Ci0gICAgPHVpX3Byb3BlcnRpZXMgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iRXJyb3JUcmVlVmlld0NvbmZpZ3VyYXRpb24iPgotICAgIDxvcHRpb24gbmFtZT0iSVNfQVVUT1NDUk9MTF9UT19TT1VSQ0UiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkhJREVfV0FSTklOR1MiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iRmF2b3JpdGVzVmlld0ltcGwiPgotICAgIDxmYXZvcml0ZXNfbGlzdCBuYW1lPSJncmFpbHMiPgotICAgICAgPG9wdGlvbiBuYW1lPSJJU19BVVRPU0NST0xMX1RPX1NPVVJDRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJJU19TSE9XX01FTUJFUlMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSVNfU1RSVUNUVVJFX1ZJRVciIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSVNfU0hPV19NT0RVTEVTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSVNfRkxBVFRFTl9QQUNLQUdFUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJJU19BQkJSRVZJQVRJT05fUEFDS0FHRV9OQU1FUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJJU19ISURFX0VNUFRZX01JRERMRV9QQUNLQUdFUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJJU19TSE9XX0xJQlJBUllfQ09OVEVOVFMiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDwvZmF2b3JpdGVzX2xpc3Q+Ci0gICAgPG9wdGlvbiBuYW1lPSJteUN1cnJlbnRGYXZvcml0ZXNMaXN0IiB2YWx1ZT0iZ3JhaWxzIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJGaWxlRWRpdG9yTWFuYWdlciI+Ci0gICAgPGxlYWYgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iRmluZE1hbmFnZXIiPgotICAgIDxGaW5kVXNhZ2VzTWFuYWdlcj4KLSAgICAgIDxzZXR0aW5nIG5hbWU9Ik9QRU5fTkVXX1RBQiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDwvRmluZFVzYWdlc01hbmFnZXI+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkhpZXJhcmNoeUJyb3dzZXJNYW5hZ2VyIj4KLSAgICA8b3B0aW9uIG5hbWU9IklTX0FVVE9TQ1JPTExfVE9fU09VUkNFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTT1JUX0FMUEhBQkVUSUNBTExZIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJISURFX0NMQVNTRVNfV0hFUkVfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCIgdmFsdWU9ImZhbHNlIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJJbnNwZWN0aW9uTWFuYWdlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJBVVRPU0NST0xMX1RPX1NPVVJDRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iU1BMSVRURVJfUFJPUE9SVElPTiIgdmFsdWU9IjAuNSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkdST1VQX0JZX1NFVkVSSVRZIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJBTkFMWVpFX1RFU1RfU09VUkNFUyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTQ09QRV9UWVBFIiB2YWx1ZT0iMSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNVU1RPTV9TQ09QRV9OQU1FIiB2YWx1ZT0iIiAvPgotICAgIDxwcm9maWxlIG5hbWU9IkRlZmF1bHQiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IkoyRUVQcm9qZWN0UGFuZSI+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmoyZWUubW9kdWxlLnZpZXcubm9kZXMuSjJFRVByb2plY3ROb2RlRGVzY3JpcHRvciIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IldlYiBNb2R1bGVzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouajJlZS5tb2R1bGUudmlldy53ZWIubm9kZXMuV2ViTW9kdWxlSG9sZGVyTm9kZURlc2NyaXB0b3IiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5qMmVlLm1vZHVsZS52aWV3LndlYi5ub2Rlcy5XZWJNb2R1bGVOb2RlRGVzY3JpcHRvciIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgIDwvUEFUSD4KLSAgICA8UEFUSD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJncmFpbHMuaXByIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouajJlZS5tb2R1bGUudmlldy5ub2Rlcy5KMkVFUHJvamVjdE5vZGVEZXNjcmlwdG9yIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgPC9QQVRIPgotICAgIDxzZXR0aW5nIG5hbWU9IlNIT1dfQVNfREVQTE9ZTUVOVF9WSUVXIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9Ik1vZHVsZUVkaXRvclN0YXRlIj4KLSAgICA8b3B0aW9uIG5hbWU9IkxBU1RfRURJVEVEX01PRFVMRV9OQU1FIiB2YWx1ZT0iR3JhaWxzIE1vZHVsZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkxBU1RfRURJVEVEX1RBQl9OQU1FIiB2YWx1ZT0iTGlicmFyaWVzIChDbGFzc3BhdGgpIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJOYW1lZFNjb3BlTWFuYWdlciIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJQYWNrYWdlc1BhbmUiPgotICAgIDxQQVRIPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9ImdyYWlscy5pcHIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlVmlld1Byb2plY3ROb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iR3JhaWxzIFRlc3QgQXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUGFja2FnZVZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgPC9QQVRIPgotICAgIDxQQVRIPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9ImdyYWlscy5pcHIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlVmlld1Byb2plY3ROb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iR3JhaWxzIFRlc3QgQXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUGFja2FnZVZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0idmlld3MiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlRWxlbWVudE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBhY2thZ2VWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlVmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJ2aWV3cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBhY2thZ2VFbGVtZW50Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9InVzZXIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlRWxlbWVudE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBhY2thZ2VWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlVmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJkb21haW4iIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlRWxlbWVudE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBhY2thZ2VWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5QYWNrYWdlVmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJjb250cm9sbGVycyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBhY2thZ2VFbGVtZW50Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgIDwvUEFUSD4KLSAgICA8UEFUSD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJncmFpbHMuaXByIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUGFja2FnZVZpZXdQcm9qZWN0Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgIDwvUEFUSD4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iUGVyZm9yY2VDaGFuZ2VCcm93c2VyU2V0dGluZ3MiPgotICAgIDxvcHRpb24gbmFtZT0iVVNFX0NMSUVOVF9GSUxURVIiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iQ0xJRU5UIiB2YWx1ZT0iIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJQZXJmb3JjZURpcmVjdC5TZXR0aW5ncyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ1c2VQNENPTkZJRyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJwb3J0IiB2YWx1ZT0iJmx0O3BlcmZvcmNlX3NlcnZlciZndDs6MTY2NiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNsaWVudCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InVzZXIiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJwYXNzd2QiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJzaG93Q21kcyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0idXNlTmF0aXZlQXBpIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InBhdGhUb0V4ZWMiIHZhbHVlPSJwNCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InVzZUN1c3RvbVBhdGhUb0V4ZWMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNZTkNfRk9SQ0UiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNZTkNfUlVOX1JFU09MVkUiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iUkVWRVJUX1VOQ0hBTkdFRF9GSUxFUyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJDSEFSU0VUIiB2YWx1ZT0ibm9uZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNIT1dfQlJBTkNIRVNfSElTVE9SWSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJFTkFCTEVEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRV9MT0dJTiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTE9HSU5fU0lMRU5UTFkiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IklOVEVHUkFURV9CUkFOQ0hfTkFNRSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IklOVEVHUkFURV9DSEFOR0VMSVNUX05VTSIgdmFsdWU9Ii0xIiAvPgotICAgIDxvcHRpb24gbmFtZT0iSU5URUdSQVRFX1JVTl9SRVNPTFZFIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IklOVEVHUkFURV9SRVZFUlRfVU5DSEFOR0VEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IklOVEVHUkFURV9DSEFOR0VfTElTVF9OVU1CRVIiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJJTlRFR1JBVEVfQ0hBTkdFX0xJU1QiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IklOVEVHUkFURV9SRVZFUlNFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlByb2plY3RMZXZlbFZjc01hbmFnZXIiPgotICAgIDxPcHRpb25zU2V0dGluZyB2YWx1ZT0idHJ1ZSIgaWQ9IkFkZCIgLz4KLSAgICA8T3B0aW9uc1NldHRpbmcgdmFsdWU9InRydWUiIGlkPSJSZW1vdmUiIC8+Ci0gICAgPE9wdGlvbnNTZXR0aW5nIHZhbHVlPSJ0cnVlIiBpZD0iQ2hlY2tpbiIgLz4KLSAgICA8T3B0aW9uc1NldHRpbmcgdmFsdWU9InRydWUiIGlkPSJDaGVja291dCIgLz4KLSAgICA8T3B0aW9uc1NldHRpbmcgdmFsdWU9InRydWUiIGlkPSJVcGRhdGUiIC8+Ci0gICAgPE9wdGlvbnNTZXR0aW5nIHZhbHVlPSJ0cnVlIiBpZD0iU3RhdHVzIiAvPgotICAgIDxPcHRpb25zU2V0dGluZyB2YWx1ZT0idHJ1ZSIgaWQ9IkVkaXQiIC8+Ci0gICAgPE9wdGlvbnNTZXR0aW5nIHZhbHVlPSJ0cnVlIiBpZD0iVW5kbyBDaGVjayBPdXQiIC8+Ci0gICAgPE9wdGlvbnNTZXR0aW5nIHZhbHVlPSJ0cnVlIiBpZD0iQ29tcGFyZSB3aXRoIFNvdXJjZVNhZmUgVmVyc2lvbiIgLz4KLSAgICA8T3B0aW9uc1NldHRpbmcgdmFsdWU9InRydWUiIGlkPSJHZXQgTGF0ZXN0IFZlcnNpb24iIC8+Ci0gICAgPENvbmZpcm1hdGlvbnNTZXR0aW5nIHZhbHVlPSIwIiBpZD0iQWRkIiAvPgotICAgIDxDb25maXJtYXRpb25zU2V0dGluZyB2YWx1ZT0iMCIgaWQ9IlJlbW92ZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iUHJvamVjdFBhbmUiPgotICAgIDxQQVRIPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9ImdyYWlscy5pcHIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld1Byb2plY3ROb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iR3JhaWxzIFRlc3QgQXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHJvamVjdFZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgPC9QQVRIPgotICAgIDxQQVRIPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9ImdyYWlscy5pcHIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld1Byb2plY3ROb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iR3JhaWxzIFRlc3QgQXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHJvamVjdFZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iUHNpRGlyZWN0b3J5OkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNhbXBsZXNcdGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJQc2lEaXJlY3Rvcnk6RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1x0ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3RcdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3RcdG1wXHdhciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJQc2lEaXJlY3Rvcnk6RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1x0ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3RcZ3JhaWxzLWFwcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgVGVzdCBBcHAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld01vZHVsZU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJQc2lEaXJlY3Rvcnk6RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1x0ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3RcZ3JhaWxzLWFwcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJQc2lEaXJlY3Rvcnk6RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1x0ZXN0XGdyYWlscy1hcHBcZG9tYWluIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgIDwvUEFUSD4KLSAgICA8UEFUSD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJncmFpbHMuaXByIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHJvamVjdFZpZXdQcm9qZWN0Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IkdyYWlscyBUZXN0IEFwcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3TW9kdWxlTm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qc2lEaXJlY3RvcnlOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iUHNpRGlyZWN0b3J5OkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNhbXBsZXNcdGVzdFxncmFpbHMtYXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXHRlc3RcZ3JhaWxzLWFwcFxjb250cm9sbGVycyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgTW9kdWxlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHJvamVjdFZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgPC9QQVRIPgotICAgIDxQQVRIPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9ImdyYWlscy5pcHIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qcm9qZWN0Vmlld1Byb2plY3ROb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iR3JhaWxzIE1vZHVsZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3TW9kdWxlTm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlscyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlBzaURpcmVjdG9yeU5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICA8L1BBVEg+Ci0gICAgPFBBVEg+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iZ3JhaWxzLmlwciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1UeXBlIiB2YWx1ZT0iY29tLmludGVsbGlqLmlkZS5wcm9qZWN0Vmlldy5pbXBsLm5vZGVzLlByb2plY3RWaWV3UHJvamVjdE5vZGUiIC8+Ci0gICAgICA8L1BBVEhfRUxFTUVOVD4KLSAgICAgIDxQQVRIX0VMRU1FTlQ+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtSWQiIHZhbHVlPSJHcmFpbHMgTW9kdWxlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHJvamVjdFZpZXdNb2R1bGVOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgICA8UEFUSF9FTEVNRU5UPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbUlkIiB2YWx1ZT0iUHNpRGlyZWN0b3J5OkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im15SXRlbVR5cGUiIHZhbHVlPSJjb20uaW50ZWxsaWouaWRlLnByb2plY3RWaWV3LmltcGwubm9kZXMuUHNpRGlyZWN0b3J5Tm9kZSIgLz4KLSAgICAgIDwvUEFUSF9FTEVNRU5UPgotICAgICAgPFBBVEhfRUxFTUVOVD4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJteUl0ZW1JZCIgdmFsdWU9IlBzaURpcmVjdG9yeTpEOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibXlJdGVtVHlwZSIgdmFsdWU9ImNvbS5pbnRlbGxpai5pZGUucHJvamVjdFZpZXcuaW1wbC5ub2Rlcy5Qc2lEaXJlY3RvcnlOb2RlIiAvPgotICAgICAgPC9QQVRIX0VMRU1FTlQ+Ci0gICAgPC9QQVRIPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJQcm9qZWN0UmVsb2FkU3RhdGUiPgotICAgIDxvcHRpb24gbmFtZT0iU1RBVEUiIHZhbHVlPSIwIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJQcm9qZWN0VmlldyI+Ci0gICAgPG5hdmlnYXRvciBjdXJyZW50Vmlldz0iUGFja2FnZXNQYW5lIiBzcGxpdHRlclByb3BvcnRpb249IjAuNSI+Ci0gICAgICA8ZmxhdHRlblBhY2thZ2VzIC8+Ci0gICAgICA8c2hvd01lbWJlcnMgLz4KLSAgICAgIDxzaG93TW9kdWxlcyAvPgotICAgICAgPHNob3dMaWJyYXJ5Q29udGVudHMgLz4KLSAgICAgIDxoaWRlRW1wdHlQYWNrYWdlcyAvPgotICAgICAgPGFiYnJldmlhdGVQYWNrYWdlTmFtZXMgLz4KLSAgICAgIDxzaG93U3RydWN0dXJlIFBhY2thZ2VzUGFuZT0iZmFsc2UiIFByb2plY3RQYW5lPSJmYWxzZSIgSjJFRVBhbmU9ImZhbHNlIiAvPgotICAgICAgPGF1dG9zY3JvbGxUb1NvdXJjZSAvPgotICAgICAgPGF1dG9zY3JvbGxGcm9tU291cmNlIC8+Ci0gICAgICA8c29ydEJ5VHlwZSAvPgotICAgIDwvbmF2aWdhdG9yPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJQcm9wZXJ0aWVzQ29tcG9uZW50Ij4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlV2lkdGgyIiB2YWx1ZT0iMzMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkdvVG9DbGFzcy5pbmNsdWRlSmF2YUZpbGVzIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfZmxhdE9yZGVyMSIgdmFsdWU9IjEiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Ik1lbWJlckNob29zZXIuY29weUphdmFkb2MiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlT3JkZXI0IiB2YWx1ZT0iNCIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iV2ViIE1vZHVsZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgRGVmYXVsdCBWZXJzaW9uIiB2YWx1ZT0iMi4zIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJHb1RvRmlsZS5pbmNsdWRlSmF2YUZpbGVzIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfZmxhdFdpZHRoMiIgdmFsdWU9Ijg0IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X2ZsYXRXaWR0aDUiIHZhbHVlPSI4MyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iR29Ub0NsYXNzLmluY2x1ZGVMaWJyYXJpZXMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iTWVtYmVyQ2hvb3Nlci5zaG93Q2xhc3NlcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfZmxhdE9yZGVyMyIgdmFsdWU9IjMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfdHJlZVdpZHRoMCIgdmFsdWU9IjM2OSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iR29Ub0NsYXNzLnRvU2F2ZUluY2x1ZGVMaWJyYXJpZXMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlT3JkZXIwIiB2YWx1ZT0iMCIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iUnVuTWFuYWdlckNvbmZpZy5zaG93U2V0dGluZ3NCZWZvcmVSdW5uaWciIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X2ZsYXRPcmRlcjQiIHZhbHVlPSI0IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJNZW1iZXJDaG9vc2VyLnNvcnRlZCIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJSdW5NYW5hZ2VyQ29uZmlnLmNvbXBpbGVCZWZvcmVSdW5uaW5nIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld19mbGF0T3JkZXI1IiB2YWx1ZT0iNSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlT3JkZXIzIiB2YWx1ZT0iMyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld19mbGF0V2lkdGg0IiB2YWx1ZT0iODQiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfdHJlZVdpZHRoMSIgdmFsdWU9IjM0IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X2ZsYXRPcmRlcjIiIHZhbHVlPSIyIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X3RyZWVXaWR0aDQiIHZhbHVlPSIzMyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlT3JkZXIyIiB2YWx1ZT0iMiIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld19mbGF0V2lkdGgzIiB2YWx1ZT0iODQiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InZjc19maWxlX3ZpZXdfdHJlZVdpZHRoMyIgdmFsdWU9IjM0IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X2ZsYXRPcmRlcjAiIHZhbHVlPSIwIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ2Y3NfZmlsZV92aWV3X2ZsYXRXaWR0aDAiIHZhbHVlPSI4NCIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld190cmVlT3JkZXIxIiB2YWx1ZT0iMSIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmNzX2ZpbGVfdmlld19mbGF0V2lkdGgxIiB2YWx1ZT0iODQiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IlRvbWNhdCBDb250ZXh0IERlc2NyaXB0b3IgRGVmYXVsdCBWZXJzaW9uIiB2YWx1ZT0iNS54IiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJSZWFkb25seVN0YXR1c0hhbmRsZXIiPgotICAgIDxvcHRpb24gbmFtZT0iU0hPV19ESUFMT0ciIHZhbHVlPSJ0cnVlIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJSZWNlbnRzTWFuYWdlciI+Ci0gICAgPGtleSBuYW1lPSJDb3B5Q2xhc3NEaWFsb2cuUkVDRU5UU19LRVkiPgotICAgICAgPHJlY2VudCBuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcyIgLz4KLSAgICAgIDxyZWNlbnQgbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYiIgLz4KLSAgICA8L2tleT4KLSAgICA8a2V5IG5hbWU9IkludHJvZHVjZUNvbnN0YW50RGlhbG9nLlJFQ0VOVFNfS0VZIj4KLSAgICAgIDxyZWNlbnQgbmFtZT0iIiAvPgotICAgIDwva2V5PgotICAgIDxrZXkgbmFtZT0iTW92ZUNsYXNzZXNPclBhY2thZ2VzRGlhbG9nLlJFQ0VOVFNfS0VZIj4KLSAgICAgIDxyZWNlbnQgbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmciIC8+Ci0gICAgICA8cmVjZW50IG5hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuc3ByaW5nIiAvPgotICAgICAgPHJlY2VudCBuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmpzcCIgLz4KLSAgICAgIDxyZWNlbnQgbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzIiAvPgotICAgIDwva2V5PgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJSZXN0b3JlVXBkYXRlVHJlZSI+Ci0gICAgPFVwZGF0ZUluZm8gZGF0ZT0iMTcvMDIvMDYgMTA6NTAiIEFjdGlvbkluZm89IkNoZWNrIFN0YXR1cyI+Ci0gICAgICA8VXBkYXRlZEZpbGVzPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IlVwZGF0ZWQgZnJvbSBzZXJ2ZXIiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJDaGFuZ2VkIG9uIHNlcnZlciIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3VwcG9ydHNEZWxldGlvbiIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlDYW5CZUFic2VudCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlJZCIgdmFsdWU9IkNIQU5HRURfT05fU0VSVkVSIiAvPgotICAgICAgICAgIDxGSUxFLUdST1VQPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVVwZGF0ZU5hbWUiIHZhbHVlPSJVcGRhdGVkIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJDaGFuZ2VkIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlDYW5CZUFic2VudCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iVVBEQVRFRCIgLz4KLSAgICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNhbXBsZXNcYm9va3NcQm9va3NUZXN0Lmdyb292eTwvUEFUSD4KLSAgICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXGxpYlxvcmcubW9ydGJheS5qZXR0eS5qYXI8L1BBVEg+Ci0gICAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXGJvb2tzXFdlYlRlc3QuZ3Jvb3Z5PC9QQVRIPgotICAgICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1xib29rc1xidWlsZC5ncm9vdnk8L1BBVEg+Ci0gICAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICAgIDxGSUxFLUdST1VQPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVVwZGF0ZU5hbWUiIHZhbHVlPSJDcmVhdGVkIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJDcmVhdGVkIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlDYW5CZUFic2VudCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iQ1JFQVRFRCIgLz4KLSAgICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICAgICAgPEZJTEUtR1JPVVA+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IkRlbGV0ZWQiIC8+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IkRlbGV0ZWQiIC8+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3VwcG9ydHNEZWxldGlvbiIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlJZCIgdmFsdWU9IlJFTU9WRURfRlJPTV9SRVBPU0lUT1JZIiAvPgotICAgICAgICAgIDwvRklMRS1HUk9VUD4KLSAgICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlVcGRhdGVOYW1lIiB2YWx1ZT0iUmVzdG9yZWQiIC8+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IldpbGwgYmUgcmVzdG9yZWQiIC8+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3VwcG9ydHNEZWxldGlvbiIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJSRVNUT1JFRCIgLz4KLSAgICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICAgIDwvRklMRS1HUk9VUD4KLSAgICAgICAgPEZJTEUtR1JPVVA+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVVwZGF0ZU5hbWUiIHZhbHVlPSJNb2RpZmllZCIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9Ik1vZGlmaWVkIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdXBwb3J0c0RlbGV0aW9uIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iTU9ESUZJRUQiIC8+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdlYlxvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1x3ZWJcYmluZGluZ1xHcmFpbHNEYXRhQmluZGVyLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xHcmFpbHNDbGFzc1V0aWxzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHBlcnNpc3RlbmNlXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXG9ybVxoaWJlcm5hdGVcY2ZnXEdyYWlsc0RvbWFpbkJpbmRlci5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xjb21tb25zXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXGNvbW1vbnNcRGVmYXVsdEdyYWlsc1RhZ0xpYkNsYXNzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xtZXRhY2xhc3NcQWJzdHJhY3REeW5hbWljTWV0aG9kcy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xjb21tb25zXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXGNvbW1vbnNcR3JhaWxzQ2xhc3MuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2ViXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHdlYlxwYWdlc1xTY2FuLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcR3JhaWxzIE1vZHVsZS5pbWw8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHBlcnNpc3RlbmNlXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXG9ybVxoaWJlcm5hdGVcc3VwcG9ydFxHcmFpbHNPcGVuU2Vzc2lvbkluVmlld0ZpbHRlci5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xjb21tb25zXGdyYWlsc1x1dGlsXFJ1blRlc3RzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcZ3JhaWxzLml3czwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcY29tbW9uc1xvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1xjb21tb25zXERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbi5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xjb21tb25zXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXGNvbW1vbnNcR3JhaWxzQXBwbGljYXRpb24uamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2ViXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHdlYlxzZXJ2bGV0XGZpbHRlclxHcmFpbHNSZWxvYWRTZXJ2bGV0RmlsdGVyLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHBlcnNpc3RlbmNlXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXG9ybVxoaWJlcm5hdGVcbWV0YWNsYXNzXFNhdmVQZXJzaXN0ZW50TWV0aG9kLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdhclxXRUItSU5GXHdlYjIuNC50ZW1wbGF0ZS54bWw8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdhclxXRUItSU5GXHdlYjIuMy50ZW1wbGF0ZS54bWw8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdlYlxvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1x3ZWJcc2VydmxldFxEZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xBYnN0cmFjdEdyYWlsc0NsYXNzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xHcmFpbHNEb21haW5DbGFzcy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1x3ZWJcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcd2ViXHNlcnZsZXRcZmlsdGVyXEdyYWlsc1Jlc291cmNlQ29waWVyLmdyb292eTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNccGVyc2lzdGVuY2Vcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcbWV0YWNsYXNzXERvbWFpbkNsYXNzTWV0aG9kcy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xwZXJzaXN0ZW5jZVxvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1xvcm1caGliZXJuYXRlXG1ldGFjbGFzc1xEZWxldGVQZXJzaXN0ZW50TWV0aG9kLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xHcmFpbHNUYWdMaWJDbGFzcy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1x3ZWJcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcd2ViXHBhZ2VzXEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xidWlsZC5wcm9wZXJ0aWVzPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1x3ZWJcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcd2ViXHRhZ2xpYlxqc3BcSnNwSW52b2tlR3JhaWxzVGFnTGliVGFnLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcZ3JhaWxzLmlwcjwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcY29tbW9uc1xvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1xjb21tb25zXEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdGFnbGliXEFwcGxpY2F0aW9uVGFnTGliLmdyb292eTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcY29tbW9uc1xvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1xjb21tb25zXERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2ViXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHdlYlxzZXJ2bGV0XG12Y1xTaW1wbGVHcmFpbHNDb250cm9sbGVySGVscGVyLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdlYlxvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1x3ZWJcc2VydmxldFxHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcY29tbW9uc1xvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1xjb21tb25zXERlZmF1bHRHcmFpbHNEb21haW5DbGFzcy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1x3ZWJcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcd2ViXHBhZ2VzXEdyb292eVBhZ2UuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNccGVyc2lzdGVuY2Vcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcb3JtXGhpYmVybmF0ZVxtZXRhY2xhc3NcR2V0UGVyc2lzdGVudE1ldGhvZC5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xjb21tb25zXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXGNvbW1vbnNcRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xidWlsZC54bWw8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xHcmFpbHNDb250cm9sbGVyQ2xhc3MuamF2YTwvUEFUSD4KLSAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9Ik1lcmdlZCB3aXRoIGNvbmZsaWN0cyIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IldpbGwgYmUgbWVyZ2VkIHdpdGggY29uZmxpY3RzIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdXBwb3J0c0RlbGV0aW9uIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iTUVSR0VEX1dJVEhfQ09ORkxJQ1RTIiAvPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xncmFpbHNcYnVpbGQueG1sPC9QQVRIPgotICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICAgIDxGSUxFLUdST1VQPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlVcGRhdGVOYW1lIiB2YWx1ZT0iTWVyZ2VkIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdGF0dXNOYW1lIiB2YWx1ZT0iV2lsbCBiZSBtZXJnZWQiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15Q2FuQmVBYnNlbnQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJNRVJHRUQiIC8+Ci0gICAgICAgIDwvRklMRS1HUk9VUD4KLSAgICAgICAgPEZJTEUtR1JPVVA+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVVwZGF0ZU5hbWUiIHZhbHVlPSJOb3QgaW4gcmVwb3NpdG9yeSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9Ik5vdCBpbiByZXBvc2l0b3J5IiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdXBwb3J0c0RlbGV0aW9uIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15Q2FuQmVBYnNlbnQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJVTktOT1dOIiAvPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNhbXBsZXNcYmxvZ1xncmFpbHMtYXBwXHZpZXdzXGxheW91dHNcbWFpbi5qc3A8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHRhZ2xpYlxKYXZhc2NyaXB0VGFnTGliLmdyb292eTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXGJvb2tzXGJvb2tzLndhcjwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xpdnkueG1sPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1x3ZWJcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcd2ViXHRhZ2xpYlxUZW1wbGF0ZVRhZy5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xncmFpbHNcZ3JhaWxzLWFwcFx0YWdsaWJcVmFsaWRhdGlvblRhZ0xpYi5ncm9vdnk8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdlYlxvcmdcY29kZWhhdXNcZ3Jvb3Z5XGdyYWlsc1x3ZWJccGFnZXNcdGVzdDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcc2NhZmZvbGRpbmdcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcc2NhZmZvbGRpbmdcRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNccGVyc2lzdGVuY2Vcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcb3JtXGhpYmVybmF0ZVxtZXRhY2xhc3NcQ291bnRQZXJzaXN0ZW50TWV0aG9kLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHRhZ2xpYlxGb3JtVGFnTGliLmdyb292eTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1x0ZXN0XHNjYWZmb2xkaW5nXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHNjYWZmb2xkaW5nXEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yc1Rlc3RzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1xib29rc1x3ZWItYXBwXFdFQi1JTkZcd2ViLnhtbC50ZW1wbGF0ZTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcY29tbW9uc1xncmFpbHNcdXRpbFxHZW5lcmF0ZVV0aWxzLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc2FtcGxlc1xib29rc1x3ZWItYXBwXFdFQi1JTkZcYXBwbGljYXRpb25Db250ZXh0LnhtbDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2ViXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHdlYlxzZXJ2bGV0XGZpbHRlclxSZXNvdXJjZUNvcGllci5qYXZhPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNhbXBsZXNcYm9va3Ncd2ViLWFwcFxXRUItSU5GXHNpdGVtZXNoLnhtbDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2ViXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHdlYlxiaW5kaW5nXEN1cnJlbmN5RWRpdG9yLmphdmE8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcdGVzdFxUZXN0Q29udHJvbGxlci5ncm9vdnk8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHdhclxjc3NcbWFpbi5jc3M8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHBlcnNpc3RlbmNlXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXG9ybVxoaWJlcm5hdGVcbWV0YWNsYXNzXEV4aXN0c1BlcnNpc3RlbnRNZXRob2QuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1x0ZXN0XGNvbW1vbnNcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcY29tbW9uc1xHcmFpbHNDbGFzc1V0aWxzVGVzdHMuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcc2NhZmZvbGRpbmdcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcc2NhZmZvbGRpbmdcR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzYW1wbGVzXGJsb2dcZ3JhaWxzLWFwcFxpMThuXG1lc3NhZ2VzX2VuX0dCLnByb3BlcnRpZXM8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXHNjYWZmb2xkaW5nXG9yZ1xjb2RlaGF1c1xncm9vdnlcZ3JhaWxzXHNjYWZmb2xkaW5nXERvbWFpbkNsYXNzUHJvcGVydHlDb21wYXJhdG9yVGVzdHMuamF2YTwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcc2NhZmZvbGRpbmdcb3JnXGNvZGVoYXVzXGdyb292eVxncmFpbHNcc2NhZmZvbGRpbmdcRGVmYXVsdEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yLmdyb292eTwvUEFUSD4KLSAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IkxvY2FsbHkgYWRkZWQiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJMb2NhbGx5IGFkZGVkIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdXBwb3J0c0RlbGV0aW9uIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iTE9DQUxMWV9BRERFRCIgLz4KLSAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IkxvY2FsbHkgcmVtb3ZlZCIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IkxvY2FsbHkgcmVtb3ZlZCIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3VwcG9ydHNEZWxldGlvbiIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlDYW5CZUFic2VudCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlJZCIgdmFsdWU9IkxPQ0FMTFlfUkVNT1ZFRCIgLz4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0LmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS51dGlsLkN1cnJlbmN5LmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS5sYW5nLkJvb2xlYW4ueWVzbm8uZ3NwPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xncmFpbHNcZ3JhaWxzLWFwcFx2aWV3c1xzY2FmZm9sZGluZ1xqYXZhLmxhbmcuU3RyaW5nLmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS51dGlsLlNldC5nc3A8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHZpZXdzXHNjYWZmb2xkaW5nXGphdmEudXRpbC5EYXRlLmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS5sYW5nLkJ5dGVbXS5nc3A8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHZpZXdzXHNjYWZmb2xkaW5nXGphdmEudXRpbC5UaW1lWm9uZS5nc3A8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHZpZXdzXHNjYWZmb2xkaW5nXGphdmEubGFuZy5CeXRlLnRlbXBsYXRlLmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS51dGlsLkNhbGVuZGFyLmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xsaWJcZ3Z0YWdzLmphcjwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcZ3JhaWxzXGdyYWlscy1hcHBcdmlld3Ncc2NhZmZvbGRpbmdcamF2YS5sYW5nLkJvb2xlYW4uZ3NwPC9QQVRIPgotICAgICAgICAgIDxQQVRIPkQ6XHNhbmRib3hfb3NcZ3Jvb3Z5XG1vZHVsZXNcZ3JhaWxzXHNyY1xncmFpbHNcZ3JhaWxzLWFwcFx2aWV3c1xzY2FmZm9sZGluZ1xqYXZhLmxhbmcuTnVtYmVyLmdzcDwvUEFUSD4KLSAgICAgICAgICA8UEFUSD5EOlxzYW5kYm94X29zXGdyb292eVxtb2R1bGVzXGdyYWlsc1xzcmNcd2FyXFdFQi1JTkZcdGxkXGd2dGFncy50bGQ8L1BBVEg+Ci0gICAgICAgICAgPFBBVEg+RDpcc2FuZGJveF9vc1xncm9vdnlcbW9kdWxlc1xncmFpbHNcc3JjXGdyYWlsc1xncmFpbHMtYXBwXHZpZXdzXHNjYWZmb2xkaW5nXGphdmEudXRpbC5Mb2NhbGUuZ3NwPC9QQVRIPgotICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICAgIDxGSUxFLUdST1VQPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlVcGRhdGVOYW1lIiB2YWx1ZT0iVW5rbm93biIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IlVua25vd24iIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15Q2FuQmVBYnNlbnQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJVTktOT1dOX1RZUEUiIC8+Ci0gICAgICAgIDwvRklMRS1HUk9VUD4KLSAgICAgICAgPEZJTEUtR1JPVVA+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVVwZGF0ZU5hbWUiIHZhbHVlPSJMb2NhbGx5IG1vZGlmaWVkIHJlbW92ZWQgZnJvbSBzZXJ2ZXIiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJMb2NhbGx5IG1vZGlmaWVkIHJlbW92ZWQgZnJvbSBzZXJ2ZXIiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15Q2FuQmVBYnNlbnQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJNT0RfUkVNT1ZFRF9GUk9NX1NFUlZFUiIgLz4KLSAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IkxvY2FsbHkgcmVtb3ZlZCBtb2RpZmllZCBvbiBzZXJ2ZXIiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN0YXR1c05hbWUiIHZhbHVlPSJMb2NhbGx5IHJlbW92ZWQgbW9kaWZpZWQgb24gc2VydmVyIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdXBwb3J0c0RlbGV0aW9uIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUNhbkJlQWJzZW50IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteUlkIiB2YWx1ZT0iTE9DQUxMWV9SRU1PVkVEX01PRElGSUVEX09OX1NFUlZFUiIgLz4KLSAgICAgICAgPC9GSUxFLUdST1VQPgotICAgICAgICA8RklMRS1HUk9VUD4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15VXBkYXRlTmFtZSIgdmFsdWU9IkNyZWF0ZWQgYnkgc2Vjb25kIHBhcnR5IiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlTdGF0dXNOYW1lIiB2YWx1ZT0iQ3JlYXRlZCBieSBzZWNvbmQgcGFydHkiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlDYW5CZUFic2VudCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlJZCIgdmFsdWU9IkNSRUFURURfQllfU0VDT05EX1BBUlRZIiAvPgotICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICAgIDxGSUxFLUdST1VQPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0ibXlVcGRhdGVOYW1lIiB2YWx1ZT0iQmluYXJ5IGZpbGUgaGFzIHRvIGJlIG1lcmdlZCIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15U3RhdHVzTmFtZSIgdmFsdWU9IkJpbmFyeSBmaWxlIGhhcyB0byBiZSBtZXJnZWQiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJteVN1cHBvcnRzRGVsZXRpb24iIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15Q2FuQmVBYnNlbnQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9Im15SWQiIHZhbHVlPSJCSU5BUllfTUVSR0VEIiAvPgotICAgICAgICA8L0ZJTEUtR1JPVVA+Ci0gICAgICA8L1VwZGF0ZWRGaWxlcz4KLSAgICA8L1VwZGF0ZUluZm8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlJ1bk1hbmFnZXIiPgotICAgIDxhY3RpdmVUeXBlIG5hbWU9IkpVbml0IiAvPgotICAgIDx0ZW1wQ29uZmlndXJhdGlvbiBzZWxlY3RlZD0idHJ1ZSIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9IlBlcnNpc3RlbnRNZXRob2RUZXN0cyIgdHlwZT0iSlVuaXQiIGZhY3RvcnlOYW1lPSJKVW5pdCI+Ci0gICAgICA8bW9kdWxlIG5hbWU9IkdyYWlscyBNb2R1bGUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkFMVEVSTkFUSVZFX0pSRV9QQVRIX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQUxURVJOQVRJVkVfSlJFX1BBVEgiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlBBQ0tBR0VfTkFNRSIgdmFsdWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9Ik1BSU5fQ0xBU1NfTkFNRSIgdmFsdWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuUGVyc2lzdGVudE1ldGhvZFRlc3RzIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfTkFNRSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVEVTVF9PQkpFQ1QiIHZhbHVlPSJjbGFzcyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVk1fUEFSQU1FVEVSUyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUEFSQU1FVEVSUyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIkUFJPSkVDVF9ESVIkIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJBRERJVElPTkFMX0NMQVNTX1BBVEgiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlRFU1RfU0VBUkNIX1NDT1BFIj4KLSAgICAgICAgPHZhbHVlIGRlZmF1bHROYW1lPSJ3aG9sZVByb2plY3QiIC8+Ci0gICAgICA8L29wdGlvbj4KLSAgICAgIDxSdW5uZXJTZXR0aW5ncyBSdW5uZXJJZD0iUnVuIiAvPgotICAgICAgPENvbmZpZ3VyYXRpb25XcmFwcGVyIFJ1bm5lcklkPSJSdW4iIC8+Ci0gICAgPC90ZW1wQ29uZmlndXJhdGlvbj4KLSAgICA8Y29uZmlndXJhdGlvbiBzZWxlY3RlZD0iZmFsc2UiIGRlZmF1bHQ9InRydWUiIHR5cGU9IkpVbml0IiBmYWN0b3J5TmFtZT0iSlVuaXQiPgotICAgICAgPG1vZHVsZSBuYW1lPSIiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkFMVEVSTkFUSVZFX0pSRV9QQVRIX0VOQUJMRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQUxURVJOQVRJVkVfSlJFX1BBVEgiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlBBQ0tBR0VfTkFNRSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iTUFJTl9DTEFTU19OQU1FIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfTkFNRSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVEVTVF9PQkpFQ1QiIHZhbHVlPSJjbGFzcyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVk1fUEFSQU1FVEVSUyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUEFSQU1FVEVSUyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIkUFJPSkVDVF9ESVIkIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJBRERJVElPTkFMX0NMQVNTX1BBVEgiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlRFU1RfU0VBUkNIX1NDT1BFIj4KLSAgICAgICAgPHZhbHVlIGRlZmF1bHROYW1lPSJ3aG9sZVByb2plY3QiIC8+Ci0gICAgICA8L29wdGlvbj4KLSAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQ9ImZhbHNlIiBkZWZhdWx0PSJ0cnVlIiB0eXBlPSJSZW1vdGUiIGZhY3RvcnlOYW1lPSJSZW1vdGUiPgotICAgICAgPG9wdGlvbiBuYW1lPSJVU0VfU09DS0VUX1RSQU5TUE9SVCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlNFUlZFUl9NT0RFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlNITUVNX0FERFJFU1MiIHZhbHVlPSJqYXZhZGVidWciIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkhPU1QiIHZhbHVlPSJsb2NhbGhvc3QiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlBPUlQiIHZhbHVlPSI1MDA1IiAvPgotICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8Y29uZmlndXJhdGlvbiBzZWxlY3RlZD0iZmFsc2UiIGRlZmF1bHQ9InRydWUiIHR5cGU9IiNjb20uaW50ZWxsaWouajJlZS53ZWIudG9tY2F0LlRvbWNhdFJ1bkNvbmZpZ3VyYXRpb25GYWN0b3J5IiBmYWN0b3J5TmFtZT0iTG9jYWwiPgotICAgICAgPG9wdGlvbiBuYW1lPSJXT1JLSU5HX0RJUkVDVE9SWSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSE9TVCIgdmFsdWU9ImxvY2FsaG9zdCIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUE9SVCIgdmFsdWU9IjgwODAiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkxPQ0FMIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iT1BFTl9JTl9CUk9XU0VSIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iT1BFTl9JTl9CUk9XU0VSX1VSTCIgdmFsdWU9Ii8iIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkNPTU1PTl9WTV9BUkdVTUVOVFMiIHZhbHVlPSIiIC8+Ci0gICAgPC9jb25maWd1cmF0aW9uPgotICAgIDxjb25maWd1cmF0aW9uIHNlbGVjdGVkPSJmYWxzZSIgZGVmYXVsdD0idHJ1ZSIgdHlwZT0iQXBwbGV0IiBmYWN0b3J5TmFtZT0iQXBwbGV0Ij4KLSAgICAgIDxtb2R1bGUgbmFtZT0iIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJNQUlOX0NMQVNTX05BTUUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkhUTUxfRklMRV9OQU1FIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJIVE1MX1VTRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iV0lEVEgiIHZhbHVlPSI0MDAiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkhFSUdIVCIgdmFsdWU9IjMwMCIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUE9MSUNZX0ZJTEUiIHZhbHVlPSIkQVBQTElDQVRJT05fSE9NRV9ESVIkL2Jpbi9hcHBsZXR2aWV3ZXIucG9saWN5IiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJWTV9QQVJBTUVURVJTIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJBTFRFUk5BVElWRV9KUkVfUEFUSF9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkFMVEVSTkFUSVZFX0pSRV9QQVRIIiAvPgotICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8Y29uZmlndXJhdGlvbiBzZWxlY3RlZD0iZmFsc2UiIGRlZmF1bHQ9InRydWUiIHR5cGU9IkFwcGxpY2F0aW9uIiBmYWN0b3J5TmFtZT0iQXBwbGljYXRpb24iPgotICAgICAgPG9wdGlvbiBuYW1lPSJNQUlOX0NMQVNTX05BTUUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlZNX1BBUkFNRVRFUlMiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlBST0dSQU1fUEFSQU1FVEVSUyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIkUFJPSkVDVF9ESVIkIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJBTFRFUk5BVElWRV9KUkVfUEFUSF9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkFMVEVSTkFUSVZFX0pSRV9QQVRIIiAvPgotICAgICAgPG1vZHVsZSBuYW1lPSIiIC8+Ci0gICAgPC9jb25maWd1cmF0aW9uPgotICAgIDxjb25maWd1cmF0aW9uIHNlbGVjdGVkPSJ0cnVlIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iVG9tY2F0IDUgU2VydmVyIiB0eXBlPSIjY29tLmludGVsbGlqLmoyZWUud2ViLnRvbWNhdC5Ub21jYXRSdW5Db25maWd1cmF0aW9uRmFjdG9yeSIgZmFjdG9yeU5hbWU9IkxvY2FsIiBBUFBMSUNBVElPTl9TRVJWRVJfTkFNRT0iVG9tY2F0IDUiPgotICAgICAgPG9wdGlvbiBuYW1lPSJXT1JLSU5HX0RJUkVDVE9SWSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iSE9TVCIgdmFsdWU9ImxvY2FsaG9zdCIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUE9SVCIgdmFsdWU9IjgwODAiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkxPQ0FMIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iT1BFTl9JTl9CUk9XU0VSIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iT1BFTl9JTl9CUk9XU0VSX1VSTCIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkNPTU1PTl9WTV9BUkdVTUVOVFMiIHZhbHVlPSIiIC8+Ci0gICAgICA8SjJFRV9NT0RVTEUgREVQTE9ZTUVOVF9TT1VSQ0VfTkFNRT0iZXhwbG9kZWQiPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkNPTlRFWFRfUEFUSCIgdmFsdWU9Ii90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Ik1PRFVMRV9OQU1FIiB2YWx1ZT0iR3JhaWxzIFRlc3QgQXBwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkRFUExPWSIgdmFsdWU9InRydWUiIC8+Ci0gICAgICA8L0oyRUVfTU9EVUxFPgotICAgICAgPFJ1bm5lclNldHRpbmdzIFJ1bm5lcklkPSJSdW4iIC8+Ci0gICAgICA8UnVubmVyU2V0dGluZ3MgUnVubmVySWQ9IkRlYnVnIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJERUJVR19QT1JUIiB2YWx1ZT0iMTM0OSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJUUkFOU1BPUlQiIHZhbHVlPSIwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkxPQ0FMIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgIDwvUnVubmVyU2V0dGluZ3M+Ci0gICAgICA8Q29uZmlndXJhdGlvbldyYXBwZXIgVk1fVkFSPSJKQVZBX09QVFMiIFJ1bm5lcklkPSJSdW4iPgotICAgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9FTlZfVkFSSUFCTEVTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPFNUQVJUVVA+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJVU0VfREVGQVVMVCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJTQ1JJUFQiIHZhbHVlPSJEOlxqYXZhXHRvbWNhdDUuNVxiaW5cdG9tY2F0NS5leGUiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJWTV9QQVJBTUVURVJTIiB2YWx1ZT0iIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0iUFJPR1JBTV9QQVJBTUVURVJTIiB2YWx1ZT0iIiAvPgotICAgICAgICA8L1NUQVJUVVA+Ci0gICAgICAgIDxTSFVURE9XTj4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9ERUZBVUxUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9IlNDUklQVCIgdmFsdWU9IkQ6XGphdmFcdG9tY2F0NS41XGJpblxjYXRhbGluYS5iYXQiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJWTV9QQVJBTUVURVJTIiB2YWx1ZT0iIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0iUFJPR1JBTV9QQVJBTUVURVJTIiB2YWx1ZT0iIHN0b3AiIC8+Ci0gICAgICAgIDwvU0hVVERPV04+Ci0gICAgICA8L0NvbmZpZ3VyYXRpb25XcmFwcGVyPgotICAgICAgPENvbmZpZ3VyYXRpb25XcmFwcGVyIFZNX1ZBUj0iSkFWQV9PUFRTIiBSdW5uZXJJZD0iRGVidWciPgotICAgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9FTlZfVkFSSUFCTEVTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPFNUQVJUVVA+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJVU0VfREVGQVVMVCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJTQ1JJUFQiIHZhbHVlPSJEOlxqYXZhXHRvbWNhdDUuNVxiaW5cY2F0YWxpbmEuYmF0IiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0iVk1fUEFSQU1FVEVSUyIgdmFsdWU9IiIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9IlBST0dSQU1fUEFSQU1FVEVSUyIgdmFsdWU9IiBydW4iIC8+Ci0gICAgICAgIDwvU1RBUlRVUD4KLSAgICAgICAgPFNIVVRET1dOPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0iVVNFX0RFRkFVTFQiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICAgIDxvcHRpb24gbmFtZT0iU0NSSVBUIiB2YWx1ZT0iRDpcamF2YVx0b21jYXQ1LjVcYmluXGNhdGFsaW5hLmJhdCIgLz4KLSAgICAgICAgICA8b3B0aW9uIG5hbWU9IlZNX1BBUkFNRVRFUlMiIHZhbHVlPSIiIC8+Ci0gICAgICAgICAgPG9wdGlvbiBuYW1lPSJQUk9HUkFNX1BBUkFNRVRFUlMiIHZhbHVlPSIgc3RvcCIgLz4KLSAgICAgICAgPC9TSFVURE9XTj4KLSAgICAgIDwvQ29uZmlndXJhdGlvbldyYXBwZXI+Ci0gICAgPC9jb25maWd1cmF0aW9uPgotICAgIDxjb25maWd1cmF0aW9uIHNlbGVjdGVkPSJmYWxzZSIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9IkRlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Rlc3QiIHR5cGU9IkpVbml0IiBmYWN0b3J5TmFtZT0iSlVuaXQiPgotICAgICAgPG1vZHVsZSBuYW1lPSJHcmFpbHMgTW9kdWxlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJBTFRFUk5BVElWRV9KUkVfUEFUSF9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkFMVEVSTkFUSVZFX0pSRV9QQVRIIiB2YWx1ZT0iIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJQQUNLQUdFX05BTUUiIHZhbHVlPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4iIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9Ik1BSU5fQ0xBU1NfTkFNRSIgdmFsdWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5EZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3NUZXN0IiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfTkFNRSIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVEVTVF9PQkpFQ1QiIHZhbHVlPSJjbGFzcyIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iVk1fUEFSQU1FVEVSUyIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iUEFSQU1FVEVSUyIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSJmaWxlOi8vJFBST0pFQ1RfRElSJCIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQURESVRJT05BTF9DTEFTU19QQVRIIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJURVNUX1NFQVJDSF9TQ09QRSI+Ci0gICAgICAgIDx2YWx1ZSBkZWZhdWx0TmFtZT0id2hvbGVQcm9qZWN0IiAvPgotICAgICAgPC9vcHRpb24+Ci0gICAgICA8UnVubmVyU2V0dGluZ3MgUnVubmVySWQ9IlJ1biIgLz4KLSAgICAgIDxSdW5uZXJTZXR0aW5ncyBSdW5uZXJJZD0iRGVidWciPgotICAgICAgICA8b3B0aW9uIG5hbWU9IkRFQlVHX1BPUlQiIHZhbHVlPSIxMjY0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9IlRSQU5TUE9SVCIgdmFsdWU9IjAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iTE9DQUwiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgPC9SdW5uZXJTZXR0aW5ncz4KLSAgICAgIDxDb25maWd1cmF0aW9uV3JhcHBlciBSdW5uZXJJZD0iUnVuIiAvPgotICAgICAgPENvbmZpZ3VyYXRpb25XcmFwcGVyIFJ1bm5lcklkPSJEZWJ1ZyIgLz4KLSAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlNlbGVjdEluTWFuYWdlciIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJTdGFydGVhbUNvbmZpZ3VyYXRpb24iPgotICAgIDxvcHRpb24gbmFtZT0iU0VSVkVSIiB2YWx1ZT0iIiAvPgotICAgIDxvcHRpb24gbmFtZT0iUE9SVCIgdmFsdWU9IjQ5MjAxIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFUiIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlBBU1NXT1JEIiB2YWx1ZT0iIiAvPgotICAgIDxvcHRpb24gbmFtZT0iUFJPSkVDVCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlZJRVciIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJBTFRFUk5BVElWRV9XT1JLSU5HX1BBVEgiIHZhbHVlPSIiIC8+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlN0cnVjdHVyYWxTZWFyY2hQbHVnaW4iIC8+Ci0gIDxjb21wb25lbnQgbmFtZT0iU3RydWN0dXJlVmlld0ZhY3RvcnkiPgotICAgIDxvcHRpb24gbmFtZT0iQVVUT1NDUk9MTF9NT0RFIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkFVVE9TQ1JPTExfRlJPTV9TT1VSQ0UiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkFDVElWRV9BQ1RJT05TIiB2YWx1ZT0iQUxQSEFfQ09NUEFSQVRPUiIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iU3ZuQ2hhbmdlc0Jyb3dzZXJTZXR0aW5ncyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJVU0VfQVVUSE9SX0ZJRUxEIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkFVVEhPUiIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkxPQ0FUSU9OIiB2YWx1ZT0iIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFX1BST0pFQ1RfU0VUVElOR1MiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iVVNFX0FMVEVSTkFURV9MT0NBVElPTiIgdmFsdWU9ImZhbHNlIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJTdm5Db25maWd1cmF0aW9uIj4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRVIiIHZhbHVlPSIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJQQVNTV09SRCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlBST0NFU1NfVU5SRVNPTFZFRCIgdmFsdWU9ImZhbHNlIiAvPgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudCBuYW1lPSJUb2RvVmlldyIgc2VsZWN0ZWQtaW5kZXg9IjAiPgotICAgIDx0b2RvLXBhbmVsIGlkPSJzZWxlY3RlZC1maWxlIj4KLSAgICAgIDxhcmUtcGFja2FnZXMtc2hvd24gdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPGFyZS1tb2R1bGVzLXNob3duIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxmbGF0dGVuLXBhY2thZ2VzIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxpcy1hdXRvc2Nyb2xsLXRvLXNvdXJjZSB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8L3RvZG8tcGFuZWw+Ci0gICAgPHRvZG8tcGFuZWwgaWQ9ImFsbCI+Ci0gICAgICA8YXJlLXBhY2thZ2VzLXNob3duIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgPGFyZS1tb2R1bGVzLXNob3duIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxmbGF0dGVuLXBhY2thZ2VzIHZhbHVlPSJmYWxzZSIgLz4KLSAgICAgIDxpcy1hdXRvc2Nyb2xsLXRvLXNvdXJjZSB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8L3RvZG8tcGFuZWw+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9IlRvb2xXaW5kb3dNYW5hZ2VyIj4KLSAgICA8ZnJhbWUgeD0iLTQiIHk9Ii00IiB3aWR0aD0iMTYwOCIgaGVpZ2h0PSIxMTc0IiBleHRlbmRlZC1zdGF0ZT0iNiIgLz4KLSAgICA8ZWRpdG9yIGFjdGl2ZT0iZmFsc2UiIC8+Ci0gICAgPGxheW91dD4KLSAgICAgIDx3aW5kb3dfaW5mbyBpZD0iQ1ZTIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzMiIG9yZGVyPSI4IiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJUT0RPIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMjIyMTE1MzgiIG9yZGVyPSI3IiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJQcm9qZWN0IiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImxlZnQiIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJ0cnVlIiB3ZWlnaHQ9IjAuMjU0NDk4NzIiIG9yZGVyPSIwIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJGaW5kIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzM1NTc2OTIiIG9yZGVyPSIxIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJTdHJ1Y3R1cmUiIGFjdGl2ZT0iZmFsc2UiIGFuY2hvcj0icmlnaHQiIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJ0cnVlIiB3ZWlnaHQ9IjAuMTgxMjMzOTMiIG9yZGVyPSI2IiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJNZXNzYWdlcyIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJib3R0b20iIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJmYWxzZSIgd2VpZ2h0PSIwLjMyOTgwNzciIG9yZGVyPSIxMSIgLz4KLSAgICAgIDx3aW5kb3dfaW5mbyBpZD0iSW5zcGVjdGlvbiIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJib3R0b20iIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJmYWxzZSIgd2VpZ2h0PSIwLjQiIG9yZGVyPSI2IiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJNb2R1bGUgRGVwZW5kZW5jaWVzIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9InJpZ2h0IiBhdXRvX2hpZGU9ImZhbHNlIiBpbnRlcm5hbF90eXBlPSJkb2NrZWQiIHR5cGU9ImRvY2tlZCIgdmlzaWJsZT0iZmFsc2UiIHdlaWdodD0iMC4zMyIgb3JkZXI9IjAiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkRlcGVuZGVuY3kgVmlld2VyIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzI5ODA3NyIgb3JkZXI9IjkiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkZhdm9yaXRlcyIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJyaWdodCIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMTM1NjA0MTEiIG9yZGVyPSIxIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJBbnQgQnVpbGQiIGFjdGl2ZT0iZmFsc2UiIGFuY2hvcj0icmlnaHQiIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJmYWxzZSIgd2VpZ2h0PSIwLjEyNzI0OTM2IiBvcmRlcj0iNCIgLz4KLSAgICAgIDx3aW5kb3dfaW5mbyBpZD0iUnVuIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzI5ODA3NyIgb3JkZXI9IjIiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkhpZXJhcmNoeSIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJyaWdodCIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJmbG9hdGluZyIgdmlzaWJsZT0iZmFsc2UiIHdlaWdodD0iMC4yNDk1MTc2OCIgb3JkZXI9IjUiIHg9IjYwNiIgeT0iMTg4IiB3aWR0aD0iMzg4IiBoZWlnaHQ9Ijc4OSIgLz4KLSAgICAgIDx3aW5kb3dfaW5mbyBpZD0iRmlsZSBWaWV3IiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9InJpZ2h0IiBhdXRvX2hpZGU9ImZhbHNlIiBpbnRlcm5hbF90eXBlPSJkb2NrZWQiIHR5cGU9ImRvY2tlZCIgdmlzaWJsZT0iZmFsc2UiIHdlaWdodD0iMC4zMjk2OTE1MyIgb3JkZXI9IjIiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkRlYnVnIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzM5NDIzMSIgb3JkZXI9IjQiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkNvbW1hbmRlciIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJyaWdodCIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0ic2xpZGluZyIgdHlwZT0ic2xpZGluZyIgdmlzaWJsZT0iZmFsc2UiIHdlaWdodD0iMC4xOTM0NDQ3MyIgb3JkZXI9IjMiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IlZlcnNpb24gQ29udHJvbCIgYWN0aXZlPSJ0cnVlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9InRydWUiIHdlaWdodD0iMC4zOTgwNzY5MiIgb3JkZXI9IjEwIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJXZWIiIGFjdGl2ZT0iZmFsc2UiIGFuY2hvcj0ibGVmdCIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMjUiIG9yZGVyPSIxIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJNZXNzYWdlIiBhY3RpdmU9ImZhbHNlIiBhbmNob3I9ImJvdHRvbSIgYXV0b19oaWRlPSJmYWxzZSIgaW50ZXJuYWxfdHlwZT0iZG9ja2VkIiB0eXBlPSJkb2NrZWQiIHZpc2libGU9ImZhbHNlIiB3ZWlnaHQ9IjAuMzMiIG9yZGVyPSIwIiAvPgotICAgICAgPHdpbmRvd19pbmZvIGlkPSJFSkIiIGFjdGl2ZT0iZmFsc2UiIGFuY2hvcj0iYm90dG9tIiBhdXRvX2hpZGU9ImZhbHNlIiBpbnRlcm5hbF90eXBlPSJkb2NrZWQiIHR5cGU9ImRvY2tlZCIgdmlzaWJsZT0iZmFsc2UiIHdlaWdodD0iMC4yNSIgb3JkZXI9IjMiIC8+Ci0gICAgICA8d2luZG93X2luZm8gaWQ9IkN2cyIgYWN0aXZlPSJmYWxzZSIgYW5jaG9yPSJib3R0b20iIGF1dG9faGlkZT0iZmFsc2UiIGludGVybmFsX3R5cGU9ImRvY2tlZCIgdHlwZT0iZG9ja2VkIiB2aXNpYmxlPSJmYWxzZSIgd2VpZ2h0PSIwLjI1IiBvcmRlcj0iNSIgLz4KLSAgICA8L2xheW91dD4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iVkNTLkZpbGVWaWV3Q29uZmlndXJhdGlvbiI+Ci0gICAgPG9wdGlvbiBuYW1lPSJTRUxFQ1RFRF9TVEFUVVNFUyIgdmFsdWU9IkFkZGVkO0RlbGV0ZWQ7TWVyZ2VkO01vZGlmaWVkO0RlbGV0ZWQgZnJvbSBmaWxlIHN5c3RlbTtNZXJnZWQgd2l0aCBjb25mbGljdHMiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTRUxFQ1RFRF9DT0xVTU5TIiB2YWx1ZT0iREVGQVVMVCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNIT1dfRklMVEVSUyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJDVVNUT01JWkVfVklFVyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTSE9XX0ZJTEVfSElTVE9SWV9BU19UUkVFIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iVmNzTWFuYWdlckNvbmZpZ3VyYXRpb24iPgotICAgIDxvcHRpb24gbmFtZT0iQ0hFQ0tfQ09ERV9TTUVMTFNfQkVGT1JFX1BST0pFQ1RfQ09NTUlUIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlBVVF9GT0NVU19JTlRPX0NPTU1FTlQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkZPUkNFX05PTl9FTVBUWV9DT01NRU5UIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJMQVNUX0NPTU1JVF9NRVNTQUdFIiB2YWx1ZT0icmVtb3ZlZCByZWR1bmRhbnQgY2xhc3MiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTQVZFX0xBU1RfQ09NTUlUX01FU1NBR0UiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iQ0hFQ0tJTl9ESUFMT0dfU1BMSVRURVJfUFJPUE9SVElPTiIgdmFsdWU9IjAuOCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Ik9QVElNSVpFX0lNUE9SVFNfQkVGT1JFX1BST0pFQ1RfQ09NTUlUIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJPUFRJTUlaRV9JTVBPUlRTX0JFRk9SRV9GSUxFX0NPTU1JVCIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iUkVGT1JNQVRfQkVGT1JFX1BST0pFQ1RfQ09NTUlUIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJSRUZPUk1BVF9CRUZPUkVfRklMRV9DT01NSVQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkZJTEVfSElTVE9SWV9ESUFMT0dfQ09NTUVOVFNfU1BMSVRURVJfUFJPUE9SVElPTiIgdmFsdWU9IjAuOCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkZJTEVfSElTVE9SWV9ESUFMT0dfU1BMSVRURVJfUFJPUE9SVElPTiIgdmFsdWU9IjAuNSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkVSUk9SX09DQ1VSRUQiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkFDVElWRV9WQ1NfTkFNRSIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVQREFURV9HUk9VUF9CWV9QQUNLQUdFUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iU0hPV19GSUxFX0hJU1RPUllfQVNfVFJFRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iRklMRV9ISVNUT1JZX1NQTElUVEVSX1BST1BPUlRJT04iIHZhbHVlPSIwLjYiIC8+Ci0gICAgPE1FU1NBR0UgdmFsdWU9InVwZGF0ZWQgR1NQIGVuZ2luZSB0byB1c2UgZ3JhaWxzIGNsYXNzIGxvYWRlciBpbnN0YW5jZSIgLz4KLSAgICA8TUVTU0FHRSB2YWx1ZT0icmV3b3JrZWQgbW9kZWwgcmVzcG9uc2UgaGFuZGxpbmcgdG8gcmV0dXJuIGEgQ29tcG9zaXRlTWFwIG9mIHRoZSBjb250cm9sbGVyIGJlYW4gYW5kIGNoYWluIG1vZGVsIGlmIG5vIGV4cGxpY2l0eSBtb2RlbCBpcyBzcGVjaWZpZWQiIC8+Ci0gICAgPE1FU1NBR0UgdmFsdWU9InVwZGF0ZWQgdG8gY2F0Y2ggTVBFIGFuZCByZXR1cm4gbnVsbCB3aGVuIGEgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYmluZGluZywgdGhpcyBpcyBtb3JlIGluIGxpbmUgd2l0aCB0aGUgd2F5IG1vZGVybiB2aWV3IHRlY2hub2xvZ2llcyB3b3JrIGJ5IGdyYWNlZnVsbHkgaWdub3Jpbmcgbm8gZXhpc3RhbnQgcHJvcGVydGllcyBhbmQgdXNpbmcgdGhlIEdyb292eSBUcnV0aCB3aGVuIHRoZXkgZXZhbHVhdGUgdG8gbnVsbC4gQSBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gdGhlIGxvZyB3aGVuIGEgcHJvcGVydHkgaXMgbm90IGZvdW5kLiIgLz4KLSAgICA8TUVTU0FHRSB2YWx1ZT0iYnVuZGxlZCBhbnQgd2l0aCBncmFpbHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgYW50IGluc3RhbGxhdGlvbnMgYW5kIHJlbW92aW5nIG9uZSBzdGVwIG9mIHRoZSBpbnN0YWxsIHByb2Nlc3MiIC8+Ci0gICAgPE1FU1NBR0UgdmFsdWU9Im1vdmVkIGFudCB0byBhIHNlcGFyYXRlIGZvbGRlciB3aXRoIGl0cyBvd24gbGliIGRpcmVjdG9yeSBhcyBpdCB3YXMgY2F1c2luZyBjbGFzcyBsb2FkZXIgaWxsZWdhbCBhY2Nlc3MgZXJyb3JzIiAvPgotICAgIDxNRVNTQUdFIHZhbHVlPSJhbGxvd2VkIHNjYWZmb2xkaW5nIG9mIGEgc3BlY2lmaWMgZG9tYWluIGNsYXNzIGJ5IGEgZ3JhaWwgY29udHJvbGxlciIgLz4KLSAgICA8TUVTU0FHRSB2YWx1ZT0idXBncmFkZWQgdG8gbGF0ZXN0IGhpYmVybmF0ZSAzLjEiIC8+Ci0gICAgPE1FU1NBR0UgdmFsdWU9InVwZ3JhZGVkIHRvIGxhdGVzdCBoaWJlcm5hdGUgMy4xIGFuZCBmaXhlZCB0ZXN0IGNhc2VzIGFzIHRoZXkgd2VyZSBicm9rZW4gYWZ0ZXIgY2xhc3MgcmVsb2FkaW5nIGNoYW5nZSIgLz4KLSAgICA8TUVTU0FHRSB2YWx1ZT0iY2hhbmdlZCB0byBmbHVzaCBhbGwgcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBkYiBiZWZvcmUgY2FsbGluZyB1cGRhdGUgdG8gYXZvaWQgdGhlICZxdW90O2lnbm9yaW5nIHBlc2lzdGVudCBpbnN0YW5jZSZxdW90OyBwcm9ibGVtIiAvPgotICAgIDxNRVNTQUdFIHZhbHVlPSJyZW1vdmVkIHJlZHVuZGFudCBjbGFzcyIgLz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iVnNzQ29uZmlndXJhdGlvbiI+Ci0gICAgPG9wdGlvbiBuYW1lPSJDTElFTlRfUEFUSCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlNSQ1NBRkVJTklfUEFUSCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRVJfTkFNRSIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlBXRCIgdmFsdWU9IiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlZTU19JU19JTklUSUFMSVpFRCIgdmFsdWU9InRydWUiIC8+Ci0gICAgPENoZWNrb3V0T3B0aW9ucz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQ09NTUVOVCIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iRE9fTk9UX0dFVF9MQVRFU1RfVkVSU0lPTiIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJSRVBMQUNFX1dSSVRBQkxFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlJFQ1VSU0lWRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDwvQ2hlY2tvdXRPcHRpb25zPgotICAgIDxDaGVja2luT3B0aW9ucz4KLSAgICAgIDxvcHRpb24gbmFtZT0iQ09NTUVOVCIgdmFsdWU9IiIgLz4KLSAgICAgIDxvcHRpb24gbmFtZT0iS0VFUF9DSEVDS0VEX09VVCIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJSRUNVUlNJVkUiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8L0NoZWNraW5PcHRpb25zPgotICAgIDxBZGRPcHRpb25zPgotICAgICAgPG9wdGlvbiBuYW1lPSJDT01NRU5UIiB2YWx1ZT0iIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJTVE9SRV9PTkxZX0xBVEVTVF9WRVJTSU9OIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IkNIRUNLX09VVF9JTU1FRElBVEVMWSIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJGSUxFX1RZUEUiIHZhbHVlPSIwIiAvPgotICAgIDwvQWRkT3B0aW9ucz4KLSAgICA8VW5kb2NoZWNrb3V0T3B0aW9ucz4KLSAgICAgIDxvcHRpb24gbmFtZT0iTUFLRV9XUklUQUJMRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJSRVBMQUNFX0xPQ0FMX0NPUFkiIHZhbHVlPSIwIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJSRUNVUlNJVkUiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8L1VuZG9jaGVja291dE9wdGlvbnM+Ci0gICAgPEdldE9wdGlvbnM+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlJFUExBQ0VfV1JJVEFCTEUiIHZhbHVlPSIwIiAvPgotICAgICAgPG9wdGlvbiBuYW1lPSJNQUtFX1dSSVRBQkxFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9IlJFQ1VSU0lWRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDwvR2V0T3B0aW9ucz4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQgbmFtZT0iYW50V29ya3NwYWNlQ29uZmlndXJhdGlvbiI+Ci0gICAgPG9wdGlvbiBuYW1lPSJJU19BVVRPU0NST0xMX1RPX1NPVVJDRSIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iRklMVEVSX1RBUkdFVFMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8YnVpbGRGaWxlIHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvYnVpbGQueG1sIj4KLSAgICAgIDxhbnRDb21tYW5kTGluZSB2YWx1ZT0iIiAvPgotICAgICAgPHJ1bkluQmFja2dyb3VuZCB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgICA8dGFyZ2V0RmlsdGVycz4KLSAgICAgICAgPGZpbHRlciB0YXJnZXROYW1lPSJqYXZhZG9jIiBpc1Zpc2libGU9ImZhbHNlIiAvPgotICAgICAgICA8ZmlsdGVyIHRhcmdldE5hbWU9ImphciIgaXNWaXNpYmxlPSJmYWxzZSIgLz4KLSAgICAgICAgPGZpbHRlciB0YXJnZXROYW1lPSJidWlsZC1pbml0IiBpc1Zpc2libGU9ImZhbHNlIiAvPgotICAgICAgICA8ZmlsdGVyIHRhcmdldE5hbWU9ImJ1aWxkIiBpc1Zpc2libGU9ImZhbHNlIiAvPgotICAgICAgICA8ZmlsdGVyIHRhcmdldE5hbWU9ImNsZWFuIiBpc1Zpc2libGU9ImZhbHNlIiAvPgotICAgICAgICA8ZmlsdGVyIHRhcmdldE5hbWU9InRlc3QiIGlzVmlzaWJsZT0iZmFsc2UiIC8+Ci0gICAgICAgIDxmaWx0ZXIgdGFyZ2V0TmFtZT0iZGlzdCIgaXNWaXNpYmxlPSJmYWxzZSIgLz4KLSAgICAgICAgPGZpbHRlciB0YXJnZXROYW1lPSJidWlsZC10ZXN0IiBpc1Zpc2libGU9ImZhbHNlIiAvPgotICAgICAgPC90YXJnZXRGaWx0ZXJzPgotICAgICAgPHRyZWVWaWV3IHZhbHVlPSJ0cnVlIiAvPgotICAgICAgPHZlcmJvc2UgdmFsdWU9InRydWUiIC8+Ci0gICAgICA8dmlld0Nsb3NlZFdoZW5Ob0Vycm9ycyB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPC9idWlsZEZpbGU+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50IG5hbWU9ImVkaXRvckhpc3RvcnlNYW5hZ2VyIj4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvR2VuZXJhdGVVdGlscy5qYXZhIj4KLSAgICAgIDxwcm92aWRlciBzZWxlY3RlZD0idHJ1ZSIgZWRpdG9yLXR5cGUtaWQ9InRleHQtZWRpdG9yIj4KLSAgICAgICAgPHN0YXRlIGxpbmU9IjYyIiBjb2x1bW49IjE4NSIgc2VsZWN0aW9uLXN0YXJ0PSIyNjQxIiBzZWxlY3Rpb24tZW5kPSIyNzE3IiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMS4xNjk0NjMiPgotICAgICAgICAgIDxmb2xkaW5nIC8+Ci0gICAgICAgIDwvc3RhdGU+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGZpbGU9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzU2NhZmZvbGRWaWV3UmVzb2x2ZXIuamF2YSI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSIyNiIgY29sdW1uPSIxMyIgc2VsZWN0aW9uLXN0YXJ0PSIxMDA2IiBzZWxlY3Rpb24tZW5kPSIxMDA2IiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC4xNzIyMzkxMSI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvci5ncm9vdnkiPgotICAgICAgPHByb3ZpZGVyIHNlbGVjdGVkPSJ0cnVlIiBlZGl0b3ItdHlwZS1pZD0idGV4dC1lZGl0b3IiPgotICAgICAgICA8c3RhdGUgbGluZT0iNDczIiBjb2x1bW49IjQ0IiBzZWxlY3Rpb24tc3RhcnQ9IjE4NzU5IiBzZWxlY3Rpb24tZW5kPSIxODc1OSIgdmVydGljYWwtc2Nyb2xsLXByb3BvcnRpb249IjAuNjMyNTUwMzYiPgotICAgICAgICAgIDxmb2xkaW5nIC8+Ci0gICAgICAgIDwvc3RhdGU+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGZpbGU9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvZmlsdGVyL1Jlc291cmNlQ29waWVyLmphdmEiPgotICAgICAgPHByb3ZpZGVyIHNlbGVjdGVkPSJ0cnVlIiBlZGl0b3ItdHlwZS1pZD0idGV4dC1lZGl0b3IiPgotICAgICAgICA8c3RhdGUgbGluZT0iMzYiIGNvbHVtbj0iNDciIHNlbGVjdGlvbi1zdGFydD0iMTA5MCIgc2VsZWN0aW9uLWVuZD0iMTA5MCIgdmVydGljYWwtc2Nyb2xsLXByb3BvcnRpb249IjAuMzg2NzYzMiI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzQ29udHJvbGxlckNsYXNzLmphdmEiPgotICAgICAgPHByb3ZpZGVyIHNlbGVjdGVkPSJ0cnVlIiBlZGl0b3ItdHlwZS1pZD0idGV4dC1lZGl0b3IiPgotICAgICAgICA8c3RhdGUgbGluZT0iMzEiIGNvbHVtbj0iMTMiIHNlbGVjdGlvbi1zdGFydD0iOTkzIiBzZWxlY3Rpb24tZW5kPSI5OTMiIHZlcnRpY2FsLXNjcm9sbC1wcm9wb3J0aW9uPSItMC4xNzg1NzE0MyI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc2FtcGxlcy90ZXN0L2dyYWlscy1hcHAvZG9tYWluL1VzZXIuZ3Jvb3Z5Ij4KLSAgICAgIDxwcm92aWRlciBzZWxlY3RlZD0idHJ1ZSIgZWRpdG9yLXR5cGUtaWQ9InRleHQtZWRpdG9yIj4KLSAgICAgICAgPHN0YXRlIGxpbmU9IjkiIGNvbHVtbj0iNCIgc2VsZWN0aW9uLXN0YXJ0PSIxOTYiIHNlbGVjdGlvbi1lbmQ9IjE5NiIgdmVydGljYWwtc2Nyb2xsLXByb3BvcnRpb249IjAuMjQyNDcyMjYiPgotICAgICAgICAgIDxmb2xkaW5nIC8+Ci0gICAgICAgIDwvc3RhdGU+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGZpbGU9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvZmlsdGVyL0dyYWlsc1JlbG9hZFNlcnZsZXRGaWx0ZXIuamF2YSI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSI5NiIgY29sdW1uPSI0MiIgc2VsZWN0aW9uLXN0YXJ0PSI0MzIzIiBzZWxlY3Rpb24tZW5kPSI0MzIzIiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iLTMuNjkxNTU4NCI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc2FtcGxlcy90ZXN0L2dyYWlscy1hcHAvdmlld3MvdXNlci9saXN0LmdzcCI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSIwIiBjb2x1bW49IjI3IiBzZWxlY3Rpb24tc3RhcnQ9IjI3IiBzZWxlY3Rpb24tZW5kPSIyNyIgdmVydGljYWwtc2Nyb2xsLXByb3BvcnRpb249IjAuMCI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9EZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEiPgotICAgICAgPHByb3ZpZGVyIHNlbGVjdGVkPSJ0cnVlIiBlZGl0b3ItdHlwZS1pZD0idGV4dC1lZGl0b3IiPgotICAgICAgICA8c3RhdGUgbGluZT0iMTA5IiBjb2x1bW49IjM0IiBzZWxlY3Rpb24tc3RhcnQ9IjQxNDIiIHNlbGVjdGlvbi1lbmQ9IjQxNDIiIHZlcnRpY2FsLXNjcm9sbC1wcm9wb3J0aW9uPSIwLjcyNDAyNTk2Ij4KLSAgICAgICAgICA8Zm9sZGluZyAvPgotICAgICAgICA8L3N0YXRlPgotICAgICAgPC9wcm92aWRlcj4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBmaWxlPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvanNwL0pzcEludm9rZUdyYWlsc1RhZ0xpYlRhZy5qYXZhIj4KLSAgICAgIDxwcm92aWRlciBzZWxlY3RlZD0idHJ1ZSIgZWRpdG9yLXR5cGUtaWQ9InRleHQtZWRpdG9yIj4KLSAgICAgICAgPHN0YXRlIGxpbmU9IjEzMiIgY29sdW1uPSI1MSIgc2VsZWN0aW9uLXN0YXJ0PSI1NjkzIiBzZWxlY3Rpb24tZW5kPSI1NjkzIiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC4xNTU4NDQxNSI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR3Jvb3Z5UGFnZS5qYXZhIj4KLSAgICAgIDxwcm92aWRlciBzZWxlY3RlZD0idHJ1ZSIgZWRpdG9yLXR5cGUtaWQ9InRleHQtZWRpdG9yIj4KLSAgICAgICAgPHN0YXRlIGxpbmU9IjIwNiIgY29sdW1uPSIyOSIgc2VsZWN0aW9uLXN0YXJ0PSI3NDU0IiBzZWxlY3Rpb24tZW5kPSI3NDU0IiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC4zMTEzMjA3NSI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc2FtcGxlcy90ZXN0L2dyYWlscy1hcHAvY29udHJvbGxlcnMvVXNlckNvbnRyb2xsZXIuZ3Jvb3Z5Ij4KLSAgICAgIDxwcm92aWRlciBzZWxlY3RlZD0idHJ1ZSIgZWRpdG9yLXR5cGUtaWQ9InRleHQtZWRpdG9yIj4KLSAgICAgICAgPHN0YXRlIGxpbmU9IjEiIGNvbHVtbj0iMjkiIHNlbGVjdGlvbi1zdGFydD0iNTIiIHNlbGVjdGlvbi1lbmQ9IjUyIiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC4wMjYxMTM2NzIiPgotICAgICAgICAgIDxmb2xkaW5nIC8+Ci0gICAgICAgIDwvc3RhdGU+Ci0gICAgICA8L3Byb3ZpZGVyPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGZpbGU9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQXBwbGljYXRpb24uamF2YSI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSIxNzciIGNvbHVtbj0iNTEiIHNlbGVjdGlvbi1zdGFydD0iNTYxMyIgc2VsZWN0aW9uLWVuZD0iNTYxMyIgdmVydGljYWwtc2Nyb2xsLXByb3BvcnRpb249IjEuNDIxMzgzNiI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkgZmlsZT0iZmlsZTovLyRQUk9KRUNUX0RJUiQvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzQXBwbGljYXRpb24uamF2YSI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSIzMDIiIGNvbHVtbj0iNjkiIHNlbGVjdGlvbi1zdGFydD0iMTM4ODIiIHNlbGVjdGlvbi1lbmQ9IjEzODgyIiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC42MzIwNzU1Ij4KLSAgICAgICAgICA8Zm9sZGluZyAvPgotICAgICAgICA8L3N0YXRlPgotICAgICAgPC9wcm92aWRlcj4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBmaWxlPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuamF2YSI+Ci0gICAgICA8cHJvdmlkZXIgc2VsZWN0ZWQ9InRydWUiIGVkaXRvci10eXBlLWlkPSJ0ZXh0LWVkaXRvciI+Ci0gICAgICAgIDxzdGF0ZSBsaW5lPSI0MCIgY29sdW1uPSI4MCIgc2VsZWN0aW9uLXN0YXJ0PSIxMzcyIiBzZWxlY3Rpb24tZW5kPSIxMzcyIiB2ZXJ0aWNhbC1zY3JvbGwtcHJvcG9ydGlvbj0iMC42Nzg5NTU0NCI+Ci0gICAgICAgICAgPGZvbGRpbmcgLz4KLSAgICAgICAgPC9zdGF0ZT4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICAgPC9lbnRyeT4KLSAgPC9jb21wb25lbnQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvYW50bHItMi43LjZyYzEuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9hbnRsci0yLjcuNnJjMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2UzMTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9hbnRsci0yLjcuNnJjMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2FzbS1hdHRycy5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2FzbS1hdHRycy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2JjYjIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9hc20tYXR0cnMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9hc20uamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9hc20uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBjN2NjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvYXNtLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvYnNmLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvYnNmLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhNGRlYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2JzZi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NnbGliLTIuMS4zLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY2dsaWItMi4xLjMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiZGIwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY2dsaWItMi4xLjMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWNsaS0xLjAuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWNsaS0xLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjE1ZTlmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1jbGktMS4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1jb2xsZWN0aW9ucy0zLjAuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWNvbGxlY3Rpb25zLTMuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzRmOTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWNvbGxlY3Rpb25zLTMuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtZGJjcC0xLjIuMS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtZGJjcC0xLjIuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDQwYzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWRiY3AtMS4yLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWVsLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1lbC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOGVkNzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWVsLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1maWxldXBsb2FkLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1maWxldXBsb2FkLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhNGE5Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtZmlsZXVwbG9hZC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtbGFuZy0yLjAuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWxhbmctMi4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhMjg3MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtbGFuZy0yLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzNhODBmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1sb2dnaW5nLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1wb29sLTEuMi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtcG9vbC0xLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE1MzRjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy1wb29sLTEuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2NvbW1vbnMtdmFsaWRhdG9yLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy12YWxpZGF0b3IuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVjZjI5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvY29tbW9ucy12YWxpZGF0b3IuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9kb200ai0xLjYuMS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2RvbTRqLTEuNi4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjNGRiYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2RvbTRqLTEuNi4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvZWhjYWNoZS0xLjEuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9laGNhY2hlLTEuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGE5MTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9laGNhY2hlLTEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2VqYjMtcGVyc2lzdGVuY2UuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9lamIzLXBlcnNpc3RlbmNlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjN2Y0MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2VqYjMtcGVyc2lzdGVuY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9ncm9vdnktYWxsLTEuMC1qc3ItMDUtU05BUFNIT1QuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9ncm9vdnktYWxsLTEuMC1qc3ItMDUtU05BUFNIT1QuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM4MTY2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvZ3Jvb3Z5LWFsbC0xLjAtanNyLTA1LVNOQVBTSE9ULmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvaGliZXJuYXRlLWFubm90YXRpb25zLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvaGliZXJuYXRlLWFubm90YXRpb25zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NDdhMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2hpYmVybmF0ZS1hbm5vdGF0aW9ucy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2hpYmVybmF0ZTMuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9oaWJlcm5hdGUzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkOTYzZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2hpYmVybmF0ZTMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9oc3FsZGIuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9oc3FsZGIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzMzNjM1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvaHNxbGRiLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvamFrYXJ0YS1vcm8tMi4wLjguamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qYWthcnRhLW9yby0yLjAuOC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDg4ZDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qYWthcnRhLW9yby0yLjAuOC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2phc3Blci1jb21waWxlci5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2phc3Blci1jb21waWxlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZWM1MzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qYXNwZXItY29tcGlsZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qYXNwZXItcnVudGltZS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2phc3Blci1ydW50aW1lLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjRiZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2phc3Blci1ydW50aW1lLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvamF2YXguc2VydmxldC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2phdmF4LnNlcnZsZXQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U3YTg2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvamF2YXguc2VydmxldC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2pkYmMyXzAtc3RkZXh0LmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvamRiYzJfMC1zdGRleHQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGFmYTEzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvamRiYzJfMC1zdGRleHQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qc3RsLTIuMy5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2pzdGwtMi4zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4MDYyZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2pzdGwtMi4zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvanN0bC0yLjQuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qc3RsLTIuNC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmFiZWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qc3RsLTIuNC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2p0YS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2p0YS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODIyYTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qdGEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9qdW5pdC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2p1bml0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0ZDcxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvbG9nNGotMS4yLjguamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9sb2c0ai0xLjIuOC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2EzY2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9sb2c0ai0xLjIuOC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL29nbmwtMi43LmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvb2dubC0yLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU3NDQzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvb2dubC0yLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9vcmcubW9ydGJheS5qZXR0eS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL29yZy5tb3J0YmF5LmpldHR5LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZTZmNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL29yZy5tb3J0YmF5LmpldHR5LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc2VydmxldC1hcGkuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zZXJ2bGV0LWFwaS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWFlYmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zZXJ2bGV0LWFwaS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3NpdGVtZXNoLTIuMi4xLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc2l0ZW1lc2gtMi4yLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVjOGU3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc2l0ZW1lc2gtMi4yLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zcHJpbmctYmluZGluZy5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3NwcmluZy1iaW5kaW5nLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiZmE5Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3NwcmluZy1iaW5kaW5nLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nLW1vY2suamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zcHJpbmctbW9jay5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmMwMjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zcHJpbmctbW9jay5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3NwcmluZy13ZWJmbG93LmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nLXdlYmZsb3cuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWU3MDI3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nLXdlYmZsb3cuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zcHJpbmcuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zcHJpbmcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQzNzBmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nbW9kdWxlcy1zYW5kYm94LmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3ByaW5nbW9kdWxlcy1zYW5kYm94LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0N2FmNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3NwcmluZ21vZHVsZXMtc2FuZGJveC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3N0YW5kYXJkLTIuMy5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3N0YW5kYXJkLTIuMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGRiYWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zdGFuZGFyZC0yLjMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zdGFuZGFyZC0yLjQuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL2xpYi9zdGFuZGFyZC0yLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzUyOGFjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIvc3RhbmRhcmQtMi40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIveGVyY2VzSW1wbC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3hlcmNlc0ltcGwuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzNjMxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIveGVyY2VzSW1wbC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvbGliL3htbC1hcGlzLmphciBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIveG1sLWFwaXMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE0ZmY4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9saWIveG1sLWFwaXMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvU2FtcGxlR2VuZXJhdG9yLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL1NhbXBsZUdlbmVyYXRvci5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZGQyNTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvU2FtcGxlR2VuZXJhdG9yLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIHN0YXJ0IGZyb20gaW5zaWRlIHNhbXBsZXMgZGlyCi0KLS8vIGNvbnN0cyBpbiBiaW5kaW5nCi1DTUQgICAgICA9ICdjbWQgL2MgJyAgICAgICAgICAgIC8vIHRvZG86IG1ha2UgdGhpcyBvcy1hd2FyZQotQVBQX05BTUUgPSAnbXlhcHAnCi1CT19OQU1FICA9ICdteWRvbWFpbicKLUFOVCAgICAgID0gbmV3IEFudEJ1aWxkZXIoKQotCi0KLUFOVC5kZWxldGUoZGlyOkFQUF9OQU1FLCBxdWlldDp0cnVlKQotCi1jb25zb2xlKCdncmFpbHMgY3JlYXRlLWFwcCcsIEFQUF9OQU1FKQotCi1hcHBDb25zb2xlKCdncmFpbHMgY3JlYXRlLWRvbWFpbi1jbGFzcycsIEJPX05BTUUpCi0KLS8vIGRvIHNvbWV0aGluZyB0byBkb21haW4gY2xhc3MgaGVyZS4uLgotCi1hcHBDb25zb2xlKCdncmFpbHMgZ2VuZXJhdGUtYWxsJywgQk9fTkFNRSkKLQotLy8gdW5pdCB0ZXN0aW5nLCBidWlsZGluZyBldGMuIGhlcmU/Ci0KLWFwcENvbnNvbGUoJ2dyYWlscyBjcmVhdGUtd2VidGVzdCcsICcnKQotCi1hcHBDb25zb2xlKCdncmFpbHMgZ2VuZXJhdGUtd2VidGVzdCcsIEJPX05BTUUpCi0KLS8vIHN0YXJ0IHRoZSBqZXR0eSBzZXJ2ZXIgYXMgZXh0ZXJuYWwgcHJvY2VzcwotLy8gb3IgcmVseSBvbiB0b21jYXQgaG90IGRlcGxveW1lbnQKLQotYXBwQ29uc29sZSgnZ3JhaWxzIHJ1bi13ZWJ0ZXN0JywgQk9fTkFNRSkKLQotLy8gLS0tLS0tLS0tIGltcGxlbWVudGF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0KLQotdm9pZCBhcHBDb25zb2xlKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgaW5wdXQpewotICAgIGNvbnNvbGUgImNkICRBUFBfTkFNRSAmJiAiICsgY29tbWFuZCAsIGlucHV0Ci19Ci0KLXZvaWQgY29uc29sZShTdHJpbmcgY29tbWFuZCwgU3RyaW5nIGlucHV0KSB7Ci0gICAgZGVmIHByb2MgPSAoQ01EICsgY29tbWFuZCkuZXhlY3V0ZSgpCi0KLSAgICBUaHJlYWQuc3RhcnQgeyBTeXN0ZW0ub3V0ICA8PCBwcm9jLmluICB9Ci0gICAgVGhyZWFkLnN0YXJ0IHsgU3lzdGVtLmVyciAgPDwgcHJvYy5lcnIgfQotICAgIAotICAgIHByb2MgPDwgaW5wdXQgICsgIlxuIiAKLSAgICAKLSAgICBwcm9jLm91dC5jbG9zZSgpCi0gICAgcHJvYy53YWl0Rm9yT3JLaWxsKDApCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9ncmFpbHMtYXBwL2NvbnRyb2xsZXJzL0dvb2dsZUNvbnRyb2xsZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9ncmFpbHMtYXBwL2NvbnRyb2xsZXJzL0dvb2dsZUNvbnRyb2xsZXIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ViYjM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2FqYXgvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9Hb29nbGVDb250cm9sbGVyLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWltcG9ydCBjb20uZ29vZ2xlLnNvYXAuc2VhcmNoLio7Ci0KLWNsYXNzIEdvb2dsZUNvbnRyb2xsZXIgewotCQotCUBQcm9wZXJ0eSBTdHJpbmcgZGVmYXVsdENsb3N1cmUgPSAic2VhcmNoIgotCQotCUBQcm9wZXJ0eSBDbG9zdXJlIHNlYXJjaCA9IHsKLQkJZGVmIHEgPSB0aGlzLnBhcmFtc1sicSJdCi0JCWRlZiBnb29nbGUgPSBuZXcgR29vZ2xlU2VhcmNoKCkKLQkJZ29vZ2xlLmtleSA9ICIvbmRacm50UUZISU9UVWp0QTJiQ09FNXVsTXhIb3ZCaiIKLQkJZ29vZ2xlLnF1ZXJ5U3RyaW5nID0gcQotCQlnb29nbGUubWF4UmVzdWx0cyA9IDEwOwotCi0JCXByaW50bG4gIlF1ZXJ5aW5nIEdvb2dsZSB3aXRoIHN0cmluZyA9ICR7cX0iCQkKLQkJZGVmIHJlc3VsdCA9IGdvb2dsZS5kb1NlYXJjaCgpOwotCQkKLQkJcmVzcG9uc2UuY29udGVudFR5cGUgPSAidGV4dC94bWwiCi0JCW5ldyBncmFpbHMudXRpbC5PcGVuUmljb0J1aWxkZXIodGhpcy5yZXNwb25zZSkuYWpheCB7Ci0JCQllbGVtZW50KGlkOiJnb29nbGVVcmxSZXN1bHRzIikgewotCQkJCWZvciAocmUgaW4gcmVzdWx0LnJlc3VsdEVsZW1lbnRzKSB7Ci0JCQkJCWRpdihjbGFzczoiZ29vZ2xlUmVzdWx0IikgewotCQkJCQkJYShocmVmOnJlLlVSTCwgcmUudGl0bGUpCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGwKLQl9Ci0JCi0JQFByb3BlcnR5IENsb3N1cmUgbGlzdCA9IHsKLQkJcHJpbnRsbiAiaGVsbG8hIgotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2FqYXgvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9Hb29nbGVDb250cm9sbGVyVGVzdHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9ncmFpbHMtYXBwL2NvbnRyb2xsZXJzL0dvb2dsZUNvbnRyb2xsZXJUZXN0cy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWQzZjUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9ncmFpbHMtYXBwL2NvbnRyb2xsZXJzL0dvb2dsZUNvbnRyb2xsZXJUZXN0cy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOwotCi1jbGFzcyBHb29nbGVDb250cm9sbGVyVGVzdHMgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICBAUHJvcGVydHkgZ2MgPSBuZXcgR29vZ2xlQ29udHJvbGxlcigpOwotCi0gICB2b2lkIHRlc3RTZWFyY2goKSB7Ci0JCWRlZiByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLQkJZGVmIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0KLQkJcmVxdWVzdC5hZGRQYXJhbWV0ZXIoInEiLCJqYXZhIikKLQkJZ2Muc2VhcmNoKHJlcXVlc3QscmVzcG9uc2UpCi0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9ncmFpbHMtYXBwL3ZpZXdzL2xheW91dHMvZGVmYXVsdC5qc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9hamF4L2dyYWlscy1hcHAvdmlld3MvbGF5b3V0cy9kZWZhdWx0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmYzU1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9hamF4L2dyYWlscy1hcHAvdmlld3MvbGF5b3V0cy9kZWZhdWx0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5vcGVuc3ltcGhvbnkuY29tL3NpdGVtZXNoL2RlY29yYXRvciIgcHJlZml4PSJkZWNvcmF0b3IiICU+Ci08aHRtbD4KLQk8aGVhZD4KLQkJPHRpdGxlPjxkZWNvcmF0b3I6dGl0bGUgZGVmYXVsdD0iR29vZ2xlIEV4YW1wbGUiIC8+PC90aXRsZT4KLQkJPG1ldGEgSFRUUC1FUVVJVj0iUHJhZ21hIiBDT05URU5UPSJuby1jYWNoZSIgLz4gCi0JCTxtZXRhIEhUVFAtRVFVSVY9IkV4cGlyZXMiIENPTlRFTlQ9Ii0xIiAvPgkJCi0JCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48L21ldGE+Ci0JCTx0aXRsZT5BdXRvLUNvbXBsZXRlIEdvb2dsZSBFeGFtcGxlPC90aXRsZT4KLQkJPHN0eWxlPjwhLS0KLQkJCWJvZHksdGQsYSxwLC5oe2ZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7fQotCQkJLmh7Zm9udC1zaXplOiAyMHB4O30KLQkJCS5xe2NvbG9yOiMwMDAwY2M7fQotLmF1dG9Db21wbGV0ZSB7Ci0JZm9udC13ZWlnaHQ6Ym9sZDsKLQlmb250LXNpemU6IDAuOTVlbTsJCi0JYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0JYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ci0JcGFkZGluZzogMXB4OwkKLX0KLS5hdXRvQ29tcGxldGVSZXN1bHRPdmVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiMwMDI4N0E7Ci0JY29sb3I6d2hpdGU7Ci19Ci0JCQkvLy0tPgotCQk8L3N0eWxlPgotCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9wcm90b3R5cGUuanMiPjwvc2NyaXB0PgotCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9yaWNvLmpzIj48L3NjcmlwdD4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvZ3JhaWxzLmpzIj48L3NjcmlwdD4KLQkJPGRlY29yYXRvcjpoZWFkIC8+CQkJCQotCTwvaGVhZD4KLQk8Ym9keSBiZ2NvbG9yPSNmZmZmZmYgIHRleHQ9IzAwMDAwMCBsaW5rPSMwMDAwY2Mgdmxpbms9IzU1MWE4YiBhbGluaz0jZmYwMDAwIHRvcG1hcmdpbj0zIG1hcmdpbmhlaWdodD0zIG9ubG9hZD0iPGRlY29yYXRvcjpnZXRQcm9wZXJ0eSBwcm9wZXJ0eT0nYm9keS5vbmxvYWQnLz4iPgotCQk8Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW50bC9lbl91ay9pbWFnZXMvbG9nby5naWYiIHdpZHRoPTI3NiBoZWlnaHQ9MTEwIGFsdD0iR29vZ2xlIj48YnI+PGJyPgotCQkKLQkJIDxkaXYgY2xhc3M9ImJvZHkiPgotCQkJIDxkZWNvcmF0b3I6Ym9keSAvPgkJCQkgCQotCQkgPC9kaXY+CQotCTwvYm9keT4KLQkKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9hamF4L2xpYi9nb29nbGVhcGkuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC9saWIvZ29vZ2xlYXBpLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhZGU1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9hamF4L2xpYi9nb29nbGVhcGkuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC93ZWItYXBwL2dvb2dsZS5odG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYWpheC93ZWItYXBwL2dvb2dsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJiMjNiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2FqYXgvd2ViLWFwcC9nb29nbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjwvbWV0YT4KLQk8bWV0YSBuYW1lPSJsYXlvdXQiIGNvbnRlbnQ9ImRlZmF1bHQiPjwvbWV0YT4KLQk8dGl0bGU+QXV0by1Db21wbGV0ZSBHb29nbGUgRXhhbXBsZTwvdGl0bGU+Ci0JPHNjcmlwdD4KLQk8IS0tCi0JCWZ1bmN0aW9uIGJvZHlPbmxvYWQoKSB7Ci0JCQlhamF4RW5naW5lLnJlZ2lzdGVyQWpheEVsZW1lbnQoImdvb2dsZVVybFJlc3VsdHMiKTsKLQkJCWFqYXhFbmdpbmUucmVnaXN0ZXJSZXF1ZXN0KCJzZWFyY2giLCAiL2FqYXgvZ29vZ2xlL3NlYXJjaCIpOwotCQkJJCgiYnRuRyIpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKLQkJCQlhamF4RW5naW5lLnNlbmRSZXF1ZXN0KCJzZWFyY2giLCAicT0iICsgJCgiZ29vZ2xlVGV4dEZpZWxkIikudmFsdWUpOwotCQkJfQotCQl9Ci0JLy8gLS0+Ci0JPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9ImJvZHlPbmxvYWQoKTsiPgotCi0JPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9ND4KLQkJPHRhYmxlIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MD4KLQkJCTx0cj48dGQgd2lkdGg9MjUlPiZuYnNwOzwvdGQ+Ci0JCQk8dGQgYWxpZ249Y2VudGVyPgotCQkJCTxpbnB1dCBpZD0iZ29vZ2xlVGV4dEZpZWxkIiBtYXhMZW5ndGg9MjU2IHNpemU9NTUgbmFtZT1xIHZhbHVlPSIiIGF1dG9jb21wbGV0ZT0ib2ZmIj4KLQkJCQk8aW5wdXQgdHlwZT1idXR0b24gaWQ9ImJ0bkciIHZhbHVlPSJHbyIgbmFtZT1idG5HPgotCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCQotCQk8ZGl2IGlkPSJnb29nbGVVcmxSZXN1bHRzIj4KLQkJCi0JCTwvZGl2PgotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvY29uZi9CbG9nQm9vdFN0cmFwLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9jb25mL0Jsb2dCb290U3RyYXAuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ4OTk0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9jb25mL0Jsb2dCb290U3RyYXAuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotY2xhc3MgQmxvZ0Jvb3RTdHJhcCB7Ci0KLSAgICAgQFByb3BlcnR5IENsb3N1cmUgaW5pdCA9IHsgc2VydmxldENvbnRleHQgLT4KLSAgICAgCQotICAgICAJcHJpbnRsbiAiTG9hZGluZyBCbG9nIGRhdGEiCi0gICAgIAkJCQkJCi0JCWRlZiBlbnRyeSA9IG5ldyBFbnRyeSh0aXRsZToiVGVzdCBFbnRyeSIsZGF0ZTpuZXcgRGF0ZSgpKQotCQllbnRyeS5ib2R5ID0gIlRoaXMgaXMgYSB0ZXN0IGVudHJ5IGluIHRoaXMgZGVtbyBibG9nIgkJCQkJCQkKLQkJCQkKLQotCQllbnRyeS5zYXZlKCkgCi0KLQkJZGVmIGNvbW1lbnQgPSBuZXcgQ29tbWVudCgpCi0JCWNvbW1lbnQuZW50cnkgPSBlbnRyeQotCQljb21tZW50LmF1dGhvck5hbWUgPSAiRnJlZCBGbGludHN0b25lIgotCQljb21tZW50LmF1dGhvckVtYWlsID0gImZyZWRAYmxvZ3MuY29tIgotCQljb21tZW50LmF1dGhvckJsb2dVUkwgPSAiaHR0cDovL3d3dy5ibG9ncy5jb20vZnJlZCIKLQkJY29tbWVudC5ib2R5ID0gIlRoaXMgaXMgbXkgY29tbWVudCEiCi0KLQkJY29tbWVudC5zYXZlKCkKLSAgCi0gICAgIH0KLSAgICAgQFByb3BlcnR5IENsb3N1cmUgZGVzdHJveSA9IHsKLSAgICAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvY29udHJvbGxlcnMvRW50cnlDb250cm9sbGVyLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9FbnRyeUNvbnRyb2xsZXIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWZiNTZkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9FbnRyeUNvbnRyb2xsZXIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotY2xhc3MgRW50cnlDb250cm9sbGVyIHsKLQlAUHJvcGVydHkgYm9vbGVhbiBzY2FmZm9sZCA9IHRydWUKLQlAUHJvcGVydHkgZGVmYXVsdEFjdGlvbiA9ICJsaXN0IgotCQotCUBQcm9wZXJ0eSBjcmVhdGVDb21tZW50ID0gewotCQlkZWYgZSA9IEVudHJ5LmdldCggdGhpcy5wYXJhbXNbImVudHJ5SWQiXSApCi0JCQotCQlkZWYgYyA9IG5ldyBDb21tZW50KGVudHJ5OmUpCi0JCWMucHJvcGVydGllcyA9IHRoaXMucGFyYW1zCQkKLQkJYy5zYXZlKCkKLQkJCi0JCXJlZGlyZWN0KGFjdGlvbjp0aGlzLnNob3cscGFyYW1zOlsgImlkIjogdGhpcy5wYXJhbXNbImVudHJ5SWQiXSBdICkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL2RvbWFpbi9Db21tZW50Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9kb21haW4vQ29tbWVudC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWMzOTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL2RvbWFpbi9Db21tZW50Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLWNsYXNzIENvbW1lbnQgeyAKLQlAUHJvcGVydHkgTG9uZyBpZDsgCi0JQFByb3BlcnR5IExvbmcgdmVyc2lvbjsgCi0JCi0JQFByb3BlcnR5IEVudHJ5IGVudHJ5Ci0JCi0JQFByb3BlcnR5IFN0cmluZyBhdXRob3JOYW1lCi0JQFByb3BlcnR5IFN0cmluZyBhdXRob3JFbWFpbAotCUBQcm9wZXJ0eSBTdHJpbmcgYXV0aG9yQmxvZ1VSTAotCUBQcm9wZXJ0eSBTdHJpbmcgYm9keQotCQotCUBQcm9wZXJ0eSBjb25zdHJhaW50cyA9IHsKLQkJYXV0aG9yRW1haWwoZW1haWw6dHJ1ZSkKLQkJYXV0aG9yQmxvZ1VSTCh1cmw6dHJ1ZSkKLQkJYm9keShibGFuazpmYWxzZSkKLQl9Ci19CQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL2RvbWFpbi9FbnRyeS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvZG9tYWluL0VudHJ5Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0YmYyMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvZG9tYWluL0VudHJ5Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWNsYXNzIEVudHJ5IHsgCi0JQFByb3BlcnR5IExvbmcgaWQ7IAotCUBQcm9wZXJ0eSBMb25nIHZlcnNpb247IAotCUBQcm9wZXJ0eSByZWxhdGlvbnNoaXBzID0gWyAiY29tbWVudHMiIDogQ29tbWVudC5jbGFzcyBdCi0JCi0JQFByb3BlcnR5IFN0cmluZyB0aXRsZQotCUBQcm9wZXJ0eSBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpCi0JQFByb3BlcnR5IFN0cmluZyBib2R5Ci0JQFByb3BlcnR5IFNldCBjb21tZW50cyA9IG5ldyBIYXNoU2V0KCkKLQkKLQlAUHJvcGVydHkgY29uc3RyYWludHMgPSB7Ci0JCXRpdGxlKGJsYW5rOmZhbHNlLGxlbmd0aDoxLi41MCkKLQkJZGF0ZShudWxsYWJsZTpmYWxzZSkKLQkJYm9keShibGFuazpmYWxzZSkKLQl9Ci19CQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC9pMThuL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvY3JlYXRlLmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9jcmVhdGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzZhODU5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9jcmVhdGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiAlPgotPCVAIHRhZ2xpYiB1cmk9J2h0dHA6Ly93d3cudGFvYml0cy5uZXQvZ3Z0YWdzJyBwcmVmaXg9J2d2JyAlPgotPGh0bWw+CQotCTxndjpiZWFuIHZhcj0iZXJyb3JzIiBzY29wZT0icmVxdWVzdCIgLz4JCQotICAgIDxoZWFkPgotICAgICAgPHRpdGxlPkNyZWF0ZSBFbnRyeTwvdGl0bGU+Ci0gICA8L2hlYWQ+Ci0KLSAgIDxib2R5PgotICAgCQk8aDE+Q3JlYXRlIEVudHJ5PC9oMT4KLSAgIAkJPGZvcm0gYWN0aW9uPSJzYXZlIiBtZXRob2Q9IlBPU1QiPgotICAgCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZGF0ZSIgdmFsdWU9IjxndjpvdXQgZXhwcj0nbmV3IERhdGUoKScgLz4iIC8+Ci0JICAgICAgPGgyPgotCSAgICAgIAk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idGl0bGUiICAvPiAgICAgIAkJCi0JICAgICAgPC9oMj4KLQkJICA8cD4KLQkgIAkJPHRleHRhcmVhIG5hbWU9ImJvZHkiID48L3RleHRhcmVhPgotCQkgIDwvcD4KLQkJICA8cD4KLQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIgLz4KLQkJICA8L3A+Ci0JICAJPC9mb3JtPgotICAgPC9ib2R5PiAKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvY3JlYXRlLnRlc3QuanNwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L2NyZWF0ZS50ZXN0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllMjA4Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvY3JlYXRlLnRlc3QuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+Ci08aHRtbD4JCi0gICAgPGhlYWQ+Ci0gICAgICA8dGl0bGU+Q3JlYXRlIEVudHJ5PC90aXRsZT4KLSAgIDwvaGVhZD4KLQotICAgPGJvZHk+Ci0gICAJCTxoMT5DcmVhdGUgRW50cnk8L2gxPgotICAgCQk8Zm9ybSBhY3Rpb249InNhdmUiIG1ldGhvZD0iUE9TVCI+Ci0JICAgICAgPGgyPgotCSAgICAgIAk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idGl0bGUiICAvPiAgICAgIAkJCi0JICAgICAgPC9oMj4KLQkJICA8cD4KLQkgIAkJPHRleHRhcmVhIG5hbWU9ImJvZHkiID48L3RleHRhcmVhPgotCQkgIDwvcD4KLQkJICA8cD4KLQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSIgLz4KLQkJICA8L3A+Ci0JICAJPC9mb3JtPgotICAgPC9ib2R5PiAKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvZWRpdC5qc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvZWRpdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDVkOGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L2VkaXQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiAlPgotPCVAIHRhZ2xpYiB1cmk9J2h0dHA6Ly93d3cudGFvYml0cy5uZXQvZ3Z0YWdzJyBwcmVmaXg9J2d2JyAlPgotPGh0bWw+CQotCTxndjpiZWFuIHZhcj0iZW50cnkiIHNjb3BlPSJyZXF1ZXN0IiAvPgkKLQk8Z3Y6YmVhbiB2YXI9ImVycm9ycyIgc2NvcGU9InJlcXVlc3QiIC8+CQkKLSAgICA8aGVhZD4KLSAgICAgIDx0aXRsZT5FZGl0IEVudHJ5PC90aXRsZT4KLSAgIDwvaGVhZD4KLQotICAgPGJvZHk+Ci0gICAJCTxoMT5FZGl0IEVudHJ5PC9oMT4KLSAgIAkJPGZvcm0gYWN0aW9uPSJ1cGRhdGUiIG1ldGhvZD0iUE9TVCI+Ci0gICAJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9IjxndjpvdXQgZXhwcj0nZW50cnkuaWQnIC8+IiAvPgotCSAgICAgIDxoMj4KLQkgICAgICAJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRpdGxlIiB2YWx1ZT0iPGd2Om91dCBleHByPSdlbnRyeS50aXRsZScgLz4iIC8+ICAgICAgCQkKLQkgICAgICA8L2gyPgotCQkgIDxwPgotCSAgCQk8dGV4dGFyZWEgbmFtZT0iYm9keSIgPjxndjpvdXQgZXhwcj0nZW50cnkuYm9keScgLz48L3RleHRhcmVhPgotCQkgIDwvcD4KLQkJICA8cD4KLQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBkYXRlIiAvPgotCQkgIDwvcD4KLQkgIAk8L2Zvcm0+Ci0gICA8L2JvZHk+IAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9lZGl0LnRlc3QuanNwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L2VkaXQudGVzdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODZmNDkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L2VkaXQudGVzdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KLTxodG1sPgkKLSAgICA8aGVhZD4KLSAgICAgIDx0aXRsZT5FZGl0IEVudHJ5PC90aXRsZT4KLSAgIDwvaGVhZD4KLQotICAgPGJvZHk+Ci0gICAJCTxoMT5FZGl0IEVudHJ5PC9oMT4KLSAgIAkJPGZvcm0gYWN0aW9uPSJ1cGRhdGUiIG1ldGhvZD0iUE9TVCI+Ci0gICAJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9IjxjOm91dCB2YWx1ZT0nJHtlbnRyeS5pZH0nIC8+IiAvPgotCSAgICAgIDxoMj4KLQkgICAgICAJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRpdGxlIiB2YWx1ZT0iPGM6b3V0IHZhbHVlPScke2VudHJ5LnRpdGxlfScgLz4iIC8+ICAgICAgCQkKLQkgICAgICA8L2gyPgotCQkgIDxwPgotCSAgCQk8dGV4dGFyZWEgbmFtZT0iYm9keSIgPjxjOm91dCB2YWx1ZT0nJHtlbnRyeS5ib2R5fScgLz48L3RleHRhcmVhPgotCQkgIDwvcD4KLQkJICA8cD4KLQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBkYXRlIiAvPgotCQkgIDwvcD4KLQkgIAk8L2Zvcm0+Ci0gICA8L2JvZHk+IAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9saXN0LmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9saXN0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0MDM1ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvbGlzdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiICU+Ci08JUAgdGFnbGliIHVyaT0naHR0cDovL3d3dy50YW9iaXRzLm5ldC9ndnRhZ3MnIHByZWZpeD0nZ3YnICU+Ci08aHRtbD4JCi0JPGd2OmJlYW4gdmFyPSJlbnRyeUxpc3QiIHNjb3BlPSJyZXF1ZXN0IiAvPgkKLSAgICA8aGVhZD4KLSAgICAgIDx0aXRsZT5XZWJsb2c8L3RpdGxlPgotICAgPC9oZWFkPgotCi0gICA8Ym9keT4KLSAgIAkgIDxjZW50ZXI+PGgxPkdyYWlscyBXZWJsb2c8L2gxPjwvY2VudGVyPgotICAgCSAgCi0gICAgICA8aDI+RW50cmllczo8L2gyPgotICAgICAgPHA+PGEgaHJlZj0iY3JlYXRlIj5BZGQgUG9zdDwvYT4KLQkgIDxndjpmb3IgdmFyPSJlIiBpbj0iZW50cnlMaXN0Ij4KLQkgICAgICA8aDM+PGd2Om91dCBleHByPSJlLnRpdGxlIiAvPiAtIDxndjpvdXQgZXhwcj0iZS5kYXRlIiAvPjwvaDM+Ci0JCSAgPHA+Ci0JCSAgCQk8Z3Y6b3V0IGV4cHI9ImUuYm9keSIgLz4KLQkJICA8L3A+Ci0JCSAgPHA+Ci0JCQkJPGd2OmdlbmVyaWMgdGFnPSdhJyBocmVmRXhwcj0nImVkaXQ/aWQ9JHtlLmlkfSInPkVkaXQgUG9zdDwvZ3Y6Z2VuZXJpYz4KLQkJICA8L3A+Ci0JCSAgPHA+PGI+PGd2OmdlbmVyaWMgdGFnPSdhJyBocmVmRXhwcj0nInNob3c/aWQ9JHtlLmlkfSNjb21tZW50cyInPkNvbW1lbnRzPC9ndjpnZW5lcmljPiAoIDxndjpvdXQgZXhwcj0iZS5jb21tZW50cy5zaXplKCkiIC8+ICApOjwvYj48L3A+Ci0JICA8L2d2OmZvcj4KLSAgIDwvYm9keT4gCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L2xpc3QudGVzdC5qc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvbGlzdC50ZXN0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NDNmYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvbGlzdC50ZXN0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSIgcHJlZml4PSJjIiAlPgotPGh0bWw+CQotICAgIDxoZWFkPgotICAgICAgPHRpdGxlPldlYmxvZzwvdGl0bGU+Ci0gICA8L2hlYWQ+Ci0KLSAgIDxib2R5PgotICAgCSAgPGNlbnRlcj48aDE+R3JhaWxzIFdlYmxvZzwvaDE+PC9jZW50ZXI+Ci0gICAJICAKLSAgICAgIDxoMj5FbnRyaWVzOjwvaDI+Ci0gICAgICA8cD48YSBocmVmPSJjcmVhdGUiPkFkZCBQb3N0PC9hPgotCSAgPGM6Zm9yRWFjaCB2YXI9ImUiIGl0ZW1zPSIke2VudHJ5TGlzdH0iPgotCSAgICAgIDxoMz48YzpvdXQgdmFsdWU9IiR7ZS50aXRsZX0iIC8+IC0gPGM6b3V0IHZhbHVlPSIke2UuZGF0ZX0iIC8+PC9oMz4KLQkJICA8cD4KLQkJICAJCTxjOm91dCB2YWx1ZT0iJHtlLmJvZHl9IiAvPgotCQkgIDwvcD4KLQkJICA8cD4KLQkJICAJCTxhIGhyZWY9ImVkaXQ/aWQ9PGM6b3V0IHZhbHVlPScke2UuaWR9JyAvPiI+RWRpdCBQb3N0PC9ocmVmPgotCQkgIDwvcD4KLQkJICA8cD48Yj4KLQkJICA8YSBocmVmPSJzaG93P2lkPTxjOm91dCB2YWx1ZT0nJHtlLmlkfScgLz4jY29tbWVudHMiPkNvbW1lbnRzPC9hPjo8L2I+PC9wPgotCSAgPC9jOmZvckVhY2g+Ci0gICA8L2JvZHk+IAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9zaG93LmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9zaG93LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhY2U5Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ibG9nL2dyYWlscy1hcHAvdmlld3MvZW50cnkvc2hvdy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiICU+Ci08JUAgdGFnbGliIHVyaT0naHR0cDovL3d3dy50YW9iaXRzLm5ldC9ndnRhZ3MnIHByZWZpeD0nZ3YnICU+Ci08aHRtbD4JCi0JPGd2OmJlYW4gdmFyPSJlbnRyeSIgc2NvcGU9InJlcXVlc3QiIC8+CQotICAgIDxoZWFkPgotICAgICAgPHRpdGxlPlZpZXcgRW50cnk8L3RpdGxlPgotICAgPC9oZWFkPgotCi0gICA8Ym9keT4KLSAgICAgIDxoMj48Z3Y6b3V0IGV4cHI9ImVudHJ5LnRpdGxlIiAvPiAtIDxndjpvdXQgZXhwcj0iZW50cnkuZGF0ZSIgLz48L2gyPgotCSAgPHA+Ci0JICAJCTxndjpvdXQgZXhwcj0iZW50cnkuYm9keSIgLz4KLQkgIDwvcD4KLQkgIDxwPgotCQkJPGd2OmdlbmVyaWMgdGFnPSdhJyBocmVmRXhwcj0nIi9ibG9nL2FwcC9lbnRyeS9lZGl0P2lkPSR7ZW50cnkuaWR9Iic+RWRpdCBQb3N0PC9ndjpnZW5lcmljPgotCSAgPC9wPgotCSAgPHA+PGI+PGEgaHJlZj0iI2NvbW1lbnRzIj5Db21tZW50czo8L2E+PC9iPjwvcD4KLQkgIDxndjpmb3IgdmFyPSJjIiBpbj0iZW50cnkuY29tbWVudHMiPgotCSAgCQk8cD48Yj5MZWZ0IGJ5OjwvYj4gPGd2Om91dCBleHByPSJjLmF1dGhvck5hbWUiIC8+PC9wPgotCQkJPHA+Ci0JCQkJPGd2Om91dCBleHByPSJjLmJvZHkiIC8+Ci0JCQk8L3A+Ci0JICA8L2d2OmZvcj4JICAKLQkgIDxwPgotCSAgCQk8Yj5BZGQgQ29tbWVudDo8L2I+Ci0JICA8L3A+Ci0JICA8Zm9ybSBhY3Rpb249ImNyZWF0ZUNvbW1lbnQiIG1ldGhvZD0iUE9TVCI+Ci0JICAJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVudHJ5SWQiIHZhbHVlPSI8Z3Y6b3V0IGV4cHI9J2VudHJ5LmlkJyAvPiIgLz4KLQkgIAkJCi0JICAJCTxwPiBOYW1lOiA8aW5wdXQgbmFtZT0iYXV0aG9yTmFtZSIgdHlwZT0idGV4dCIgLz48L3A+Ci0JICAJCTxwPiBFbWFpbDogPGlucHV0IG5hbWU9ImF1dGhvckVtYWlsIiB0eXBlPSJ0ZXh0IiAvPjwvcD4KLQkgIAkJPHA+IEhvbWVwYWdlOiA8aW5wdXQgbmFtZT0iYXV0aG9yQmxvZ1VSTCIgdHlwZT0idGV4dCIgLz48L3A+CSAgCQkKLQkgIAkJPHA+PHRleHRhcmVhIG5hbWU9ImJvZHkiID48L3RleHRhcmVhPjwvcD4KLQkgIAkJPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFkZCIgLz48L3A+Ci0JICA8L2Zvcm0+Ci0gICA8L2JvZHk+IAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jsb2cvZ3JhaWxzLWFwcC92aWV3cy9lbnRyeS9zaG93LnRlc3QuanNwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L3Nob3cudGVzdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTljY2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYmxvZy9ncmFpbHMtYXBwL3ZpZXdzL2VudHJ5L3Nob3cudGVzdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KLTxodG1sPgkKLSAgICA8aGVhZD4KLSAgICAgIDx0aXRsZT5WaWV3IEVudHJ5PC90aXRsZT4KLSAgIDwvaGVhZD4KLQotICAgPGJvZHk+Ci0gICAgICA8aDI+PGM6b3V0IHZhbHVlPSIke2VudHJ5LnRpdGxlfSIgLz4gLSA8YzpvdXQgdmFsdWU9IiR7ZW50cnkuZGF0ZX0iIC8+PC9oMj4KLQkgIDxwPgotCSAgCQk8YzpvdXQgdmFsdWU9IiR7ZW50cnkuYm9keX0iIC8+Ci0JICA8L3A+Ci0JICA8cD4KLQkgIAkJPGEgaHJlZj0iZWRpdD9pZD08YzpvdXQgdmFsdWU9JyR7ZW50cnkuaWR9JyAvPiI+RWRpdCBQb3N0PC9hPgotCSAgPC9wPgotCSAgPHA+PGI+PGEgaHJlZj0iI2NvbW1lbnRzIj5Db21tZW50czo8L2E+PC9iPjwvcD4KLQkgIDxjOmZvckVhY2ggdmFyPSJjIiBpdGVtcz0iJHtlbnRyeS5jb21tZW50c30iPgotCSAgCQk8cD48Yj5MZWZ0IGJ5OjwvYj4gPGM6b3V0IHZhbHVlPSIke2MuYXV0aG9yTmFtZX0iIC8+PC9wPgotCQkJPHA+Ci0JCQkJPGM6b3V0IHZhbHVlPSIke2MuYm9keX0iIC8+Ci0JCQk8L3A+Ci0JICA8L2M6Zm9yRWFjaD4JICAKLQkgIDxwPgotCSAgCQk8Yj5BZGQgQ29tbWVudDo8L2I+Ci0JICA8L3A+Ci0JICA8Zm9ybSBhY3Rpb249ImNyZWF0ZUNvbW1lbnQiIG1ldGhvZD0iUE9TVCI+Ci0JICAJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVudHJ5SWQiIHZhbHVlPSI8YzpvdXQgdmFsdWU9JyR7ZW50cnkuaWR9JyAvPiIgLz4KLQkgIAkJCi0JICAJCTxwPiBOYW1lOiA8aW5wdXQgbmFtZT0iYXV0aG9yTmFtZSIgdHlwZT0idGV4dCIgLz48L3A+Ci0JICAJCTxwPiBFbWFpbDogPGlucHV0IG5hbWU9ImF1dGhvckVtYWlsIiB0eXBlPSJ0ZXh0IiAvPjwvcD4KLQkgIAkJPHA+IEhvbWVwYWdlOiA8aW5wdXQgbmFtZT0iYXV0aG9yQmxvZ1VSTCIgdHlwZT0idGV4dCIgLz48L3A+CSAgCQkKLQkgIAkJPHA+PHRleHRhcmVhIG5hbWU9ImJvZHkiID48L3RleHRhcmVhPjwvcD4KLQkgIAkJPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFkZCIgLz48L3A+Ci0JICA8L2Zvcm0+Ci0gICA8L2JvZHk+IAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL0Jvb2tzVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9Cb29rc1Rlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWZhZThiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL0Jvb2tzVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyB0byBiZSBjYWxsZWQgYnkgYnVpbGQuZ3Jvb3Z5Ci0KLWNsYXNzIEJvb2tzVGVzdCBleHRlbmRzIFdlYlRlc3QgewotCi0gICAgLy8gVW5saWtlIHVuaXQgdGVzdCwgZnVuY3Rpb25hbCB0ZXN0cyBhcmUgb2Z0ZW4gc2VxdWVuY2UgZGVwZW5kZW50LgotICAgIC8vIFNwZWNpZnkgdGhhdCBzZXF1ZW5jZSBoZXJlLgotICAgIHZvaWQgc3VpdGUoKSB7Ci0gICAgICAgIHRlc3RJbml0aWFsQm9va3MoKQotICAgICAgICB0ZXN0QWRkQm9vaygpCi0gICAgIH0KLSAgICAgCi0gICAgZGVmIHRlc3RJbml0aWFsQm9va3MoKXsKLSAgICAgICAgZGVmIGJvb2tUaXRsZXMgPSBbCi0gICAgICAgICAgICAnVGhlIERhIFZpbmNpIENvZGUnLAotICAgICAgICAgICAgJ0RlY2VwdGlvbiBQb2ludCcsCi0gICAgICAgICAgICAnRGlnaXRhbCBGb3J0cmVzcycsCi0gICAgICAgICAgICAnQW5nZWxzIEFuZCBEZW1vbnMnCi0gICAgICAgIF0KLSAgICAgICAgd2VidGVzdCgnYm9va3M6IFJ1biB0aHJvdWdoIHRoZSBkZXRhaWxzIG9mIHRoZSA0IGluaXRhbCBib29rcycpewotICAgICAgICAgICAgaW52b2tlKHVybDonYm9va3MnKQotICAgICAgICAgICAgZGVmIGluZGV4ID0gMAotICAgICAgICAgICAgYm9va1RpdGxlcy5lYWNoIHsgdGl0bGUgLT4gaW5kZXgrKyAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBhdCAxCi0gICAgICAgICAgICAgICAgYW50Lmdyb3VwKGRlc2NyaXB0aW9uOiJUZXN0IEJvb2sgTm8uICRpbmRleDogJHRpdGxlIil7Ci0gICAgICAgICAgICAgICAgICAgIHZlcmlmeVRpdGxlKHRleHQ6J0Jvb2sgbGlzdCcpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEZvcm0oaW5kZXg6IGluZGV4KQotICAgICAgICAgICAgICAgICAgICBjbGlja0J1dHRvbihsYWJlbDonRGV0YWlscycpCi0gICAgICAgICAgICAgICAgICAgIHZlcmlmeVRpdGxlKHRleHQ6J0Jvb2sgZGV0YWlsJykKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5WFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjoiaGlkZGVuIGluZGV4IGlkIG11c3QgYmUgJGluZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhwYXRoOiIvL2lucHV0W0B0eXBlPSdoaWRkZW4nXVtAbmFtZT0naWQnXVtAdmFsdWU9JyRpbmRleCddIikKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5SW5wdXRGaWVsZChuYW1lOid0aXRsZScsIHZhbHVlOiB0aXRsZSkKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5VGV4dCh0ZXh0OidEYW4gQnJvd24nKQotICAgICAgICAgICAgICAgICAgICAvLyBnbyBpbnRvIGF1dGhvciBkZXRhaWxzIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgY2xpY2tCdXR0b24obGFiZWw6J1NhdmUnKQotICAgICAgICAgICAgICAgICAgICB2ZXJpZnlUaXRsZSh0ZXh0OidCb29rIGRldGFpbCcpCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrQnV0dG9uKGxhYmVsOidDbG9zZScpCi0gICAgfSAgIH0gICB9ICAgfQotCi0gICAgZGVmIGFkZEF1dGhvcihuYW1lKXsKLSAgICAgICAgYW50Lmdyb3VwKGRlc2NyaXB0aW9uOiJhZGRpbmcgYSBuZXcgYXV0aG9yIHRvIHRoZSBhdXRob3JzIGxpc3Qgd2l0aCBuYW1lICckbmFtZSciKXsKLSAgICAgICAgICAgIGNsaWNrQnV0dG9uKGxhYmVsOidBZGQgYXV0aG9yIC4uLicpCi0gICAgICAgICAgICBzZXRJbnB1dEZpZWxkKG5hbWU6J25hbWUnLCB2YWx1ZTogbmFtZSkKLSAgICAgICAgICAgIGNsaWNrQnV0dG9uKGxhYmVsOidTYXZlJykKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlZiBhZGRCb29rKHRpdGxlLCBhdXRob3IpewotICAgICAgICBhbnQuZ3JvdXAoZGVzY3JpcHRpb246ImFkZGluZyBhIG5ldyBib29rIHdpdGggdGl0bGUgJyR0aXRsZScgYW5kIG5ldyBhdXRob3IgJyRhdXRob3InIil7Ci0gICAgICAgICAgICBjbGlja0J1dHRvbihsYWJlbDonQWRkIGJvb2sgLi4uJykKLSAgICAgICAgICAgIHZlcmlmeVRpdGxlKHRleHQ6J0Jvb2sgZGV0YWlsJykKLSAgICAgICAgICAgIHNldElucHV0RmllbGQobmFtZTondGl0bGUnLCB2YWx1ZTogdGl0bGUpCi0gICAgICAgICAgICBjbGlja0J1dHRvbihsYWJlbDonLi4uJywgZGVzY3JpcHRpb246J3NlZSB0aGUgbGlzdCBvZiBhdXRob3JzJykKLSAgICAgICAgICAgICAgICBhZGRBdXRob3IoYXV0aG9yKSAvLyB0b2RvOiBhbHNvIHRyeSB3aXRoIPYKLSAgICAgICAgICAgIGNsaWNrQnV0dG9uKGh0bWxJZDonZGV0YWlsMicsIGRlc2NyaXB0aW9uOiAnY2hvb3NlIG5ldyBhdXRob3InKQotICAgICAgICAgICAgY2xpY2tCdXR0b24obGFiZWw6J1NhdmUnKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVmIHRlc3RBZGRCb29rKCkgewotICAgICAgICB3ZWJ0ZXN0KCdib29rczogYWRkIG5ldyBib29rLCBtYWtlIHN1cmUgaXRcJ3MgdGhlcmUnKXsKLSAgICAgICAgICAgIGludm9rZSh1cmw6J2Jvb2tzJykKLSAgICAgICAgICAgIHZlcmlmeVRpdGxlKHRleHQ6J0Jvb2sgbGlzdCcpCi0gICAgICAgICAgICAgICAgYWRkQm9vaygnR3Jvb3Z5IGluIEFjdGlvbicsICdEaWVyayBLb2VuaWcgZXQgYWwuJykKLSAgICAgICAgICAgIHZlcmlmeVRpdGxlKHRleHQ6J0Jvb2sgbGlzdCcpCi0gICAgICAgICAgICB2ZXJpZnlUZXh0KHRleHQ6J0dyb292eSBpbiBBY3Rpb24uKkRpZXJrIEtvZW5pZyBldCBhbC4nLCByZWdleDp0cnVlKQotICAgICAgICAgICAgY2xpY2tCdXR0b24obGFiZWw6J0VuZCcpCi0gICAgfSAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL0lOU1RSVUNUSU9OUy50eHQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9JTlNUUlVDVElPTlMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNmZjUxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL0lOU1RSVUNUSU9OUy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1CT09LUyBTQU1QTEUgQVBQTElDQVRJT04gRk9SIEdSQUlMUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBzYW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIGEgc2ltcGxlIHBhZ2UgZmxvdyBhcHBsaWNhdGlvbiB0aGF0IG1haW50YWlucyBhIGxpc3Qgb2YgYm9va3MuCi0KLVRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzOgotCi08cm9vdD4KLSAgL2dyYWlscy1hcHAKLSAgICAvQm9va0Zsb3cuZ3Jvb3Z5Ci0gIC9qc3AKLSAgICAvbGlzdEJvb2tzLmpzcAotICAgIC9ib29rRGV0YWlsLmpzcAotCi1UaGlzIGFwcGxpY2F0aW9uIGNsZWFybHkgZGVtb25zdHJhdGVzIGhvdyBjb21wYWN0IEdyYWlscyBhcHBsaWNhdGlvbnMgYXJlIGFuZCBob3cgbGl0dGxlIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuCi0KLUJVSUxESU5HCi09PT09PT09PQotCi1JZiB5b3UgaGF2ZSBvYnRhaW5lZCBHcmFpbHMgZnJvbSBDVlMgbWFrZSBzdXJlIHRoZSBKQVIgZmlsZSBpcyBidWlsZCBieSBydW5uaW5nIHRoaXMgY29tbWFuZCBpbiB0aGUgR3JhaWxzIGhvbWUgZGlyZWN0b3J5OiAKLQotYW50IGphcgotCi1UbyBkZXBsb3kgdGhpcyBhcHBsaWNhdGlvbiBzZXQgdGhlIEdSQUlMU19IT01FIGVudmlyb25tZW50IHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgR3JhaWxzIGRpc3RyaWJ1dGlvbiBvciBwcm9qZWN0LgotCi1BdCB0aGUgY29tbWFuZCBwcm9tcHQgY2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeSB3aGljaCBpcyAke0dSQUlMU19IT01FfS9zYW1wbGVzL2Jvb2tzLgotCi1OZXh0IHJ1biB0aGlzIGNvbW1hbmQgdG8gaW5pdGlhdGUgdGhlIGRpY3Rvcnkgc3RydWN0dXJlOgotCi0ke0dSQUlMU19IT01FfS9iaW4vZ3JhaWxzIGluaXQKLQotSWYgeW91IGdldCAicGVybWlzc2lvbiBkZW5pZWQiLCB0aGlzIGZpbGUgaXMgbm90IGV4ZWN1dGFibGUuIEluIHRoYXQgY2FzZSBydW4gdGhlIGNvbW1hbmQgYXMgZm9sbG93czoKLQotL2Jpbi9zaCAke0dSQUlMU19IT01FfS9iaW4vZ3JhaWxzIGluaXQKLQotVGhlbiBydW4gdGhpcyBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgV0FSIGZpbGU6Ci0KLSR7R1JBSUxTX0hPTUV9L2Jpbi9ncmFpbHMgd2FyCi0KLVRoaXMgYXBwbGljYXRpb24gaXMgd3JpdHRlbiBhZ2FpbnN0IHRoZSBTZXJ2bGV0IDIuMyBzcGVjaWZpY2F0aW9ucyBzbyBzaG91bGQgcnVuIGluIGFueSBzZXJ2bGV0IGNvbnRhaW5lci4KLQotRGVwbG95IGdyYWlscy1hcHAud2FyIGluIHlvdSBzZXJ2bGV0IGNvbnRhaW5lciAoZm9yIG1vc3QgY29udGFpbmVycyB0aGlzIG1lYW4gY29weWluZyB0aGUgZmlsZSBpbiB0aGUgd2ViYXBwcyBmb2xkZXIpLgotCi1Ccm93c2UgdG8gaHR0cDovLzxzZXJ2ZXJfYWRkcmVzcz46PHNlcnZlcl9wb3J0Pi9ib29rcy9ib29rcyB0byB0ZXN0IHRoZSBhcHBsaWNhdGlvbi4gWW91IGNhbiBhbHNvIHJlbmFtZSB0aGUgV0FSIGZpbGUgdG8gdXNlIGFub3RoZXIgY29udGV4dCBwYXRoLgotCi1QbGVhc2UgcG9zdCBhIG1lc3NhZ2Ugb24gdGhlIEdyYWlscyBtYWlsaW5nIGxpc3QgaWYgeW91IGV4cGVyaWVuY2UgYW55IHByb2JsZW1zIHJ1bm5pbmcgdGhpcyBzYW1wbGUgYXBwbGljYXRpb24uCi0KLVN0ZXZlbgotCi1BTFRFUk5BVElWRQotPT09PT09PT09PT0KLQotV2l0aCBhIEdyb292eSBpbnN0YWxsYXRpb24gaW4gcGxhY2UsIHlvdSBjYW4gYnVpbGQsIHJ1biwgYW5kIHRlc3QgdGhlIGdyYWlscyBib29rIHNhbXBsZSBieSBydW5uaW5nCi0gZ3Jvb3Z5IGJ1aWxkLmdyb292eQotVG8gbWFrZSB0aGlzIGhhcHBlbiwgeW91IG5lZWQKLS0gYSB3ZWJzZXJ2ZXIgaW5zdGFsbGF0aW9uIGxpa2UgdG9tY2F0IChyZWNvbW1lbmRlZDogdG9tY2F0IDUpCi0tIGEgZG93bmxvYWQgb2YgQ2Fub28gV2ViVGVzdCBmcm9tIGh0dHA6Ly93ZWJ0ZXN0LmNhbm9vLmNvbS93ZWJ0ZXN0L2J1aWxkLnppcAotICB0byBhIGRpcmVjdG9yeSB0aGF0IGlzIHJlZmVycmVkIHRvIGFzIFdFQlRFU1RfSE9NRQotR2V0dGluZyB0aGUgY2xhc3NwYXRoIGZvciB0ZXN0aW5nIHJpZ2h0LCByZXF1aXJlcyBhIGJpdCBvZiB3b3JrLgotLSBhZGFwdCB5b3VyIEdST09WWV9IT01FL2NvbmYvZ3Jvb3Z5X2NsYXNzd29ybGRzLmNvbmYgdG8gaW5jbHVkZSB5b3VyCi0gICR7dXNlci5ob21lfS8uZ3Jvb3Z5L2xpYiBkaXIKLS0gY29weSBhbGwgamFyIGZpbGVzIGZyb20gV0VCVEVTVF9IT01FL2xpYiBhbmQgaXRzIHN1YmRpcnMgdG8KLSAgJHt1c2VyLmhvbWV9Ly5ncm9vdnkvbGliIChpLmUuICdmbGF0JykKLS0gYWRhcHQgdGhlIHNldHRpbmdzIGluIGJ1aWxkLnByb3BlcnRpZXMgdG8geW91ciBwZXJzb25hbCBuZWVkcwotICB3aGVuIHVzaW5nIHdpdGggdG9tY2F0IDUgbWFrZSBzdXJlIHRvIGNvcHkgCi0gIFRPTUNBVF9IT01FL3NlcnZlci9jYXRhbGluYV9hbnQuamFyIHRvICR7dXNlci5ob21lfS8uZ3Jvb3Z5L2xpYgotCi1bdG9kbzogcHJvdmlkZSBhbiBpbnN0YWxsZXIgc2NyaXB0XQotCi1BZnRlciBydW5uaW5nICdncm9vdnkgYnVpbGQuZ3Jvb3Z5JyBzdWNjZXNzZnVsbHkgeW91IGZpbmQgdGhlIHRlc3QgcmVwb3J0cwotaW4gdG1wL3dlYnRlc3QvcmVzdWx0cy9XZWJUZXN0UmVzdWx0cy5odG1sCi1XaGVuIHJ1bm5pbmcgb24gd2luZG93cywgdGhpcyBmaWxlIHdpbGwgYmUgYXV0b21hdGljYWxseSBvcGVuZWQgZm9yIHlvdQotaW4geW91ciBkZWZhdWx0IGJyb3dzZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvV2ViVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9XZWJUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzNjM5Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9XZWJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vIFN1cGVyY2xhc3Mgc2tlbGV0b24gZm9yIGZ1Y3Rpb25hbCB0ZXN0IGxpa2UgQm9va3NUZXN0LgotLy8gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgc3VpdGUoKSBtZXRob2QuCi0KLS8vIHRvZG86IG1heWJlIG1ha2UgYSBzZWxmcnVubmluZyBwc3ZtCi0KLWFic3RyYWN0IGNsYXNzIFdlYlRlc3QgewotCi0gICAgQFByb3BlcnR5IGdyYWlsc0hvbWUKLSAgICBAUHJvcGVydHkgcHJvcHMKLSAgICBAUHJvcGVydHkgYW50ID0gbmV3IEFudEJ1aWxkZXIoKQotCi0gICAgZGVmIHdlYnRlc3RIb21lCi0gICAgcHVibGljIE1hcCBjb25maWdNYXAKLSAgCi0KLSAgICBhYnN0cmFjdCB2b2lkIHN1aXRlKCkKLQotICAgIHZvaWQgcnVuVGVzdHMgKCl7Ci0gICAgICAgIGluaXRXZWJUZXN0SG9tZSgpICAgICAgICAgICAgICAgIAotICAgICAgICBpbml0Q29uZmlnTWFwKCkKLSAgICAgICAgcHJlcGFyZSgpCi0gICAgICAgIAotICAgICAgICBzdWl0ZSgpCi0KLSAgICAgICAgc3R5bGUoKQotICAgIH0KLQotICAgIHZvaWQgd2VidGVzdChTdHJpbmcgbmFtZSwgQ2xvc3VyZSB5aWVsZCl7Ci0gICAgICAgIGFudC50ZXN0U3BlYyhuYW1lOm5hbWUpewotICAgICAgICAgICAgY29uZmlnKGNvbmZpZ01hcCkKLSAgICAgICAgICAgIHN0ZXBzKCl7Ci0gICAgICAgICAgICAgICAgeWllbGQuZGVsZWdhdGUgPSBhbnQKLSAgICAgICAgICAgICAgICB5aWVsZCgpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gZ2V0IGZyb20gYnVpbGQucHJvcGVydGllcywgZW52aXJvbm1lbnQgdmFyaWFibGUsIGdyYWlsc0hvbWUvZG93bmxvYWRzL3dlYnRlc3QKLSAgICBkZWYgaW5pdFdlYlRlc3RIb21lKCkgewotICAgICAgICB3ZWJ0ZXN0SG9tZSA9IHByb3BzLndlYnRlc3RIb21lCi0gICAgICAgIGlmICghIHdlYnRlc3RIb21lKSB7Ci0gICAgICAgICAgICB3ZWJ0ZXN0SG9tZSA9IHByb3BzLidlbnYuV0VCVEVTVF9IT01FJwotICAgICAgICB9Ci0gICAgICAgIGlmICghIHdlYnRlc3RIb21lKSB7Ci0gICAgICAgICAgICB3ZWJ0ZXN0SG9tZSA9IGdyYWlsc0hvbWUgKyAnL2Rvd25sb2Fkcy93ZWJ0ZXN0JwotICAgICAgICB9Ci0gICAgICAgIHByaW50bG4gIndlYnRlc3RIb21lIGlzIDwkd2VidGVzdEhvbWU+IgotICAgIH0KLQotICAgLy8gcHJlcGFyZSBhIGNvbmZpZ21hcCBiYXNlZCBvbiBidWlsZC5wcm9wZXJ0aWVzCi0gICAgZGVmIGluaXRDb25maWdNYXAgKCkgewotICAgICAgICBkZWYgY29uZmlnTWFwID0gWzpdCi0gICAgICAgIGRlZiBwcmVmaXggPSAnd2VidGVzdF8nCi0gICAgICAgIHByb3BzLmtleVNldCgpLmVhY2h7IG5hbWUgLT4KLSAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkgY29uZmlnTWFwLnB1dChuYW1lIC0gcHJlZml4LCBwcm9wc1tuYW1lXSkKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHByZXBhcmUgdGhlIGFudCB0YXNrZGVmLCBjbGFzc3BhdGggYW5kIGZpbGVzeXN0ZW0gZm9yIHJlcG9ydGluZwotICAgIHZvaWQgcHJlcGFyZSgpIHsgICAgICAgIAotICAgICAgICBkZWYgcm9vdExvYWRlciA9IHRoaXMuY2xhc3MuY2xhc3NMb2FkZXIucm9vdExvYWRlcgotICAgICAgICBpZiAocm9vdExvYWRlcikgewotICAgICAgICAgICAgZGVmIGxvYWREaXIgPSBuZXcgRmlsZSgiJHdlYnRlc3RIb21lL2xpYi8iKQotICAgICAgICAgICAgcm9vdExvYWRlci5hZGRVUkwobG9hZERpci50b1VSTCgpKQotICAgICAgICAgICAgbG9hZERpci5lYWNoRmlsZU1hdGNoKH4vLipcLmphciQvKXsKLSAgICAgICAgICAgICAgICByb290TG9hZGVyLmFkZFVSTChpdC50b1VSTCgpKQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRsbiAnTm8gUm9vdExvYWRlciwgYXNzdW1pbmcgQ1Agc2V0IGJ5IEFOVCBjYWxsLicKLSAgICAgICAgfQotICAgICAgICBhbnQudGFza2RlZihmaWxlOiIke3dlYnRlc3RIb21lfS93ZWJ0ZXN0VGFza2RlZnMucHJvcGVydGllcyIpCi0gICAgICAgIAotICAgICAgICBhbnQuZGVsZXRlKGRpcjogcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoKQotICAgICAgICBhbnQubWtkaXIgKGRpcjogcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoKQotICAgIH0KLQotICAgIGRlZiBzdHlsZSgpIHsKLSAgICAgICAgYW50LnN0eWxlKAotICAgICAgICAgICAgYmFzZWRpcjogICAgcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoLAotICAgICAgICAgICAgZGVzdGRpcjogICAgcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoLAotICAgICAgICAgICAgaW5jbHVkZXM6ICAgcHJvcHMud2VidGVzdF9yZXN1bHRmaWxlLAotICAgICAgICAgICAgZXh0ZW5zaW9uOiAgJy5odG1sJywKLSAgICAgICAgICAgIHN0eWxlOiAgICAgIHdlYnRlc3RIb21lKycvcmVzb3VyY2VzL1dlYlRlc3RSZXBvcnQueHNsJyl7Ci0gICAgICAgICAgICBwYXJhbShuYW1lOidyZXBvcnR0aW1lJywgZXhwcmVzc2lvbjogbmV3IERhdGUoKS50b1N0cmluZygpKQotICAgICAgICAgICAgcGFyYW0obmFtZTondGl0bGUnLCBleHByZXNzaW9uOiBwcm9wcy5wcm9qZWN0TmFtZSkKLSAgICAgICAgfQotICAgICAgICAvLyBjb3B5IHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIGh0bWwgcGFnZSB0byB0aGUgc2FtZSBkaXI6Ci0gICAgICAgIC8vIHRoZSByZXBvcnQgbXVzdCBiZSBvayB0b28gd2hlbiBvcGVuZWQgZnJvbSBmaWxlc3lzdGVtICh3aXRob3V0IHdlYnNlcnZlcikKLSAgICAgICAgYW50LmNvcHkodG9kaXI6IHByb3BzLndlYnRlc3RfcmVzdWx0cGF0aCl7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjogd2VidGVzdEhvbWUrJy9yZXNvdXJjZXMvJykKLSAgICAgICAgfQotICAgICAgICAvLyBvbiB3aW5kb3dzLCBzdGFydCB0aGUgc3RhbmRhcmQgYnJvd3NlciBvbiB0aGUgcmVwb3J0IGZpbGUKLSAgICAgICAgaWYoISBwcm9wcy4nb3MubmFtZSc/LmNvbnRhaW5zKCdXaW5kb3dzJykpIHJldHVybgotICAgICAgICBkZWYgcmVwb3J0SHRtbCA9ICIkcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoLyRwcm9wcy53ZWJ0ZXN0X3Jlc3VsdGZpbGUiIC0gJy54bWwnICsgJy5odG1sJwotICAgICAgICBkZWYgZmlsZW5hbWUgPSBuZXcgamF2YS5pby5GaWxlKHJlcG9ydEh0bWwpLmNhbm9uaWNhbFBhdGgKLSAgICAgICAgcHJpbnRsbiAib3BlbmluZzogJGZpbGVuYW1lIgotICAgICAgICAiY21kIC9jICRmaWxlbmFtZSIuZXhlY3V0ZSgpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL1dlYlRlc3QueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvV2ViVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OWM3ODguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvV2ViVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IS0tCi1TZXQgV0VCVEVTVF9IT01FIHRvIHRoZSBDYW5vbyBXZWJUZXN0IHJvb3QgZGlyZWN0b3J5LgotUnVuIHRoaXMgdGVzdCB3aXRoIHRoaXMgY29tbWFuZDoKLSAgICAgIGFudCAtZiBXZWJUZXN0LnhtbAkKLS0tPgotPHByb2plY3QgbmFtZT0iVGVzdEJvb2tzIiBkZWZhdWx0PSJtYWluIj4KLQk8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotCQotCTxmYWlsIHVubGVzcz0iZW52LldFQlRFU1RfSE9NRSIgbWVzc2FnZT0iV0VCVEVTVF9IT01FIGlzIG5vdCBkZWZpbmVkIi8+Ci0JCi0JPHRhc2tkZWYgZmlsZT0iJHtlbnYuV0VCVEVTVF9IT01FfS93ZWJ0ZXN0VGFza2RlZnMucHJvcGVydGllcyI+Ci0JCTxjbGFzc3BhdGg+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZW52LldFQlRFU1RfSE9NRX0iIGluY2x1ZGVzPSJsaWIvKi5qYXIiLz4KLQkJPC9jbGFzc3BhdGg+Ci0JPC90YXNrZGVmPgotCQotCTx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0JCTx0ZXN0U3BlYyBuYW1lPSJ0ZXN0Qm9va3MiPgotCQkJPGNvbmZpZwotCQkJCWhvc3Q9ImxvY2FsaG9zdCIKLQkJCQlwb3J0PSI4MDgwIgotCQkJCXByb3RvY29sPSJodHRwIgotCQkJCWJhc2VwYXRoPSJncmFpbHMtYXBwL2FwcCIvPgotCQkJCTxzdGVwcz4KLQkJCQkJPGludm9rZSB1cmw9ImJvb2tzIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGxpc3QiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGxpc3QiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iZGV0YWlsMSIgZGVzY3JpcHRpb249ImJ1dHRvbjogZGV0YWlsMSIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJpZCIgdmFsdWU9IjEiIGRlc2NyaXB0aW9uPSJib29rLmlkPTEiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0idGl0bGUiIHZhbHVlPSJUaGUgRGEgVmluY2kgQ29kZSIgZGVzY3JpcHRpb249ImJvb2sudGl0bGU9VGhlIERhIFZpbmNpIENvZGUiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iRGFuIEJyb3duIiBkZXNjcmlwdGlvbj0iYm9vay5hdXRob3I9RGFuIEJyb3duIi8+Ci0JCQkJCTxjbGlja0J1dHRvbiBodG1sSWQ9InNhdmUiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgZGV0YWlsIiBkZXNjcmlwdGlvbj0idGl0bGU9Qm9vayBkZXRhaWwiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iY2xvc2UiIGRlc2NyaXB0aW9uPSJidXR0b246IGNsb3NlIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGxpc3QiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGxpc3QiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iZGV0YWlsMiIgZGVzY3JpcHRpb249ImJ1dHRvbjogZGV0YWlsMiIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJpZCIgdmFsdWU9IjIiIGRlc2NyaXB0aW9uPSJib29rLmlkPTIiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0idGl0bGUiIHZhbHVlPSJEZWNlcHRpb24gUG9pbnQiIGRlc2NyaXB0aW9uPSJib29rLnRpdGxlPURlY2VwdGlvbiBQb2ludCIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJhdXRob3IiIHZhbHVlPSJEYW4gQnJvd24iIGRlc2NyaXB0aW9uPSJib29rLmF1dGhvcj1EYW4gQnJvd24iLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0ic2F2ZSIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8Y2xpY2tCdXR0b24gaHRtbElkPSJjbG9zZSIgZGVzY3JpcHRpb249ImJ1dHRvbjogY2xvc2UiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgbGlzdCIgZGVzY3JpcHRpb249InRpdGxlPUJvb2sgbGlzdCIvPgotCQkJCQk8Y2xpY2tCdXR0b24gaHRtbElkPSJkZXRhaWwzIiBkZXNjcmlwdGlvbj0iYnV0dG9uOiBkZXRhaWwzIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGRldGFpbCIgZGVzY3JpcHRpb249InRpdGxlPUJvb2sgZGV0YWlsIi8+Ci0JCQkJCTx2ZXJpZnlJbnB1dEZpZWxkIG5hbWU9ImlkIiB2YWx1ZT0iMyIgZGVzY3JpcHRpb249ImJvb2suaWQ9MyIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJ0aXRsZSIgdmFsdWU9IkRpZ2l0YWwgRm9ydHJlc3MiIGRlc2NyaXB0aW9uPSJib29rLnRpdGxlPURpZ2l0YWwgRm9ydHJlc3MiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iRGFuIEJyb3duIiBkZXNjcmlwdGlvbj0iYm9vay5hdXRob3I9RGFuIEJyb3duIi8+Ci0JCQkJCTxjbGlja0J1dHRvbiBodG1sSWQ9InNhdmUiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgZGV0YWlsIiBkZXNjcmlwdGlvbj0idGl0bGU9Qm9vayBkZXRhaWwiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iY2xvc2UiIGRlc2NyaXB0aW9uPSJidXR0b246IGNsb3NlIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGxpc3QiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGxpc3QiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iZGV0YWlsNCIgZGVzY3JpcHRpb249ImJ1dHRvbjogZGV0YWlsNCIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJpZCIgdmFsdWU9IjQiIGRlc2NyaXB0aW9uPSJib29rLmlkPTQiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0idGl0bGUiIHZhbHVlPSJBbmdlbHMgQW5kIERlbW9ucyIgZGVzY3JpcHRpb249ImJvb2sudGl0bGU9QW5nZWxzIEFuZCBEZW1vbnMiLz4KLQkJCQkJPHZlcmlmeUlucHV0RmllbGQgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iRGFuIEJyb3duIiBkZXNjcmlwdGlvbj0iYm9vay5hdXRob3I9RGFuIEJyb3duIi8+Ci0JCQkJCTxjbGlja0J1dHRvbiBodG1sSWQ9InNhdmUiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgZGV0YWlsIiBkZXNjcmlwdGlvbj0idGl0bGU9Qm9vayBkZXRhaWwiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iY2xvc2UiIGRlc2NyaXB0aW9uPSJidXR0b246IGNsb3NlIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGxpc3QiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGxpc3QiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iYWRkYm9vayIgZGVzY3JpcHRpb249ImJ1dHRvbjogYWRkYm9vayIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8c2V0SW5wdXRGaWVsZCBuYW1lPSJ0aXRsZSIgdmFsdWU9IkV4cGVydCBPbmUtdG8tT25lIEoyRUUgRGV2ZWxvcG1lbnQgd2l0aG91dCBFSkIiIGRlc2NyaXB0aW9uPSJzZXQgdGl0bGUiLz4KLQkJCQkJPHNldElucHV0RmllbGQgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iUm9kIEpvaG5zb24iIGRlc2NyaXB0aW9uPSJzZXQgYXV0aG9yIi8+Ci0JCQkJCTxjbGlja0J1dHRvbiBodG1sSWQ9InNhdmUiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgbGlzdCIgZGVzY3JpcHRpb249InRpdGxlPUJvb2sgbGlzdCIvPgotCQkJCQk8Y2xpY2tCdXR0b24gaHRtbElkPSJkZXRhaWw1IiBkZXNjcmlwdGlvbj0iYnV0dG9uOiBkZXRhaWw1Ii8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGRldGFpbCIgZGVzY3JpcHRpb249InRpdGxlPUJvb2sgZGV0YWlsIi8+Ci0JCQkJCTx2ZXJpZnlJbnB1dEZpZWxkIG5hbWU9ImlkIiB2YWx1ZT0iNSIgZGVzY3JpcHRpb249ImJvb2suaWQ9NSIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJ0aXRsZSIgdmFsdWU9IkV4cGVydCBPbmUtdG8tT25lIEoyRUUgRGV2ZWxvcG1lbnQgd2l0aG91dCBFSkIiIAotCQkJCQkJZGVzY3JpcHRpb249ImJvb2sudGl0bGU9RXhwZXJ0IE9uZS10by1PbmUgSjJFRSBEZXZlbG9wbWVudCB3aXRob3V0IEVKQiIvPgotCQkJCQk8dmVyaWZ5SW5wdXRGaWVsZCBuYW1lPSJhdXRob3IiIHZhbHVlPSJSb2QgSm9obnNvbiIgZGVzY3JpcHRpb249ImJvb2suYXV0aG9yPVJvZCBKb2huc29uIi8+Ci0JCQkJCTxjbGlja0J1dHRvbiBodG1sSWQ9InNhdmUiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgZGV0YWlsIiBkZXNjcmlwdGlvbj0idGl0bGU9Qm9vayBkZXRhaWwiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iY2xvc2UiIGRlc2NyaXB0aW9uPSJidXR0b246IGNsb3NlIi8+Ci0JCQkJCTx2ZXJpZnlUaXRsZSB0ZXh0PSJCb29rIGxpc3QiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGxpc3QiLz4KLQkJCQkJPGNsaWNrQnV0dG9uIGh0bWxJZD0iYWRkYm9vayIgZGVzY3JpcHRpb249ImJ1dHRvbjogYWRkYm9vayIvPgotCQkJCQk8dmVyaWZ5VGl0bGUgdGV4dD0iQm9vayBkZXRhaWwiIGRlc2NyaXB0aW9uPSJ0aXRsZT1Cb29rIGRldGFpbCIvPgotCQkJCQk8Y2xpY2tCdXR0b24gaHRtbElkPSJjbG9zZSIgZGVzY3JpcHRpb249ImJ1dHRvbjogY2xvc2UiLz4KLQkJCQkJPHZlcmlmeVRpdGxlIHRleHQ9IkJvb2sgbGlzdCIgZGVzY3JpcHRpb249InRpdGxlPUJvb2sgbGlzdCIvPgotCQkJCTwvc3RlcHM+Ci0JCTwvdGVzdFNwZWM+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvYnVpbGQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvYnVpbGQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMyZjdhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL2J1aWxkLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyBHZW5lcmFsIGJ1aWxkZmlsZSBmb3IgdGhlIHByb2plY3QgaW4gdGhhdCdzIHJvb3QgdGhpcyBmaWxlIGlzIGxvY2F0ZWQuCi0vLyBPYmV5cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ0dSQUlMU19IT01FJy4KLS8vIEFkYXB0IGJ1aWxkLnByb3BlcnRpZXMgdG8geW91IHBlcnNvbmFsIG5lZWRzLgotLy8gU3RhcnQgd2l0aCBhcmd1bWVudCAndGVzdCcgdG8gb25seSBydW4gdGhlIHRlc3RzIHdpdGhvdXQgYnVpbGQvZGVwbG95L3Jlc3RhcnQKLQotYW50ID0gbmV3IEFudEJ1aWxkZXIoKQotYW50LnByb3BlcnR5KGZpbGU6ICAgICAgICAgICdidWlsZC5wcm9wZXJ0aWVzJykKLWFudC5wcm9wZXJ0eShlbnZpcm9ubWVudDogICAnZW52JykKLXByb3BzID0gYW50LmFudFByb2plY3QucHJvcGVydGllcwotCi1ncmFpbHNIb21lID0gaW5pdEdyYWlsc0hvbWUoKQotCi1pZiAoYXJncy50b0xpc3QoKS5jb250YWlucygndGVzdCcpKXsKLSAgICBzdGFydFRlc3RzKCkKLSAgICByZXR1cm4KLX0KLS8qCi13aXRoSmV0dHkgeyBzdGFydFRlc3RzKCkgfQotKi8KLQotd2FyQXBwbGljYXRpb24oKQotZGVwbG95KCkKLQotd2l0aFNlcnZlciB7Ci0gICAgc3RhcnRUZXN0cygpCi19Ci0KLQotCi0KLS8vIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVN0cmluZyBpbml0R3JhaWxzSG9tZSAoKSB7Ci0gICAgZGVmIGdyYWlsc0hvbWUgPSBwcm9wcy5ncmFpbHNIb21lCi0gICAgaWYgKCEgZ3JhaWxzSG9tZSkgewotICAgICAgICBncmFpbHNIb21lID0gcHJvcHMuJ2Vudi5HUkFJTFNfSE9NRScKLSAgICB9Ci0gICAgcHJpbnRsbiAiZ3JhaWxzSG9tZSBpcyA8JGdyYWlsc0hvbWU+IgotICAgIHJldHVybiBncmFpbHNIb21lCi19Ci0KLWRlZiBzdGFydFRlc3RzKCl7Ci0gICAgbmV3IEJvb2tzVGVzdChncmFpbHNIb21lOmdyYWlsc0hvbWUsIHByb3BzOmFudC5hbnRQcm9qZWN0LnByb3BlcnRpZXMpLnJ1blRlc3RzKCkKLX0KLQotLy8gY2FsbCB0aGUgZ2VuZXJhbCAnd2FyJyB0YXJnZXQgYW5kICdpbml0JyBvbmx5IGlmIG5lZWRlZAotU3RyaW5nIHdhckFwcGxpY2F0aW9uICgpIHsKLSAgICBidWlsZEZpbGUgPSBncmFpbHNIb21lICsgJy9zcmMvZ3JhaWxzL2J1aWxkLnhtbCcKLQotICAgIGlmICggISBuZXcgamF2YS5pby5GaWxlKCd0bXAnKS5leGlzdHMoKSkgewotICAgICAgICBhbnQuYW50KGFudGZpbGU6IGJ1aWxkRmlsZSwgdGFyZ2V0Oidpbml0JykKLSAgICB9Ci0gICAgYW50LmFudChhbnRmaWxlOmJ1aWxkRmlsZSwgdGFyZ2V0Oid3YXInKQotICAgIHJldHVybiBncmFpbHNIb21lCi19Ci0KLWRlZiBkZXBsb3kgKCkgewotICAgIHRhcmdldERpciA9ICIkcHJvcHMuc2VydmVyRGlyLyRwcm9wcy5zZXJ2ZXJXZWJhcHBEaXIiCi0gICAgYW50LmNvcHkoZmlsZTonZ3JhaWxzLWFwcC53YXInLCB0b2RpcjogdGFyZ2V0RGlyKQotfQotCi1kZWYgd2l0aFNlcnZlciAoQ2xvc3VyZSB5aWVsZCkgewotICAgIGlmIChwcm9wcy5zZXJ2ZXJEaXIgPX4gL1xiNS4vKSB7Ci0gICAgICAgIHdpdGhUb21jYXQ1KHlpZWxkKQotICAgICAgICByZXR1cm4KLSAgICB9Ci0gICAgd2l0aFVua25vd25TZXJ2ZXIoeWllbGQpCi19Ci0KLWRlZiB1bmtub3duU2VydmVyIChTdHJpbmcgY29tbWFuZCwgYm9vbGVhbiBkb1ByaW50KSB7Ci0gICAgZGVmIGZpbGVuYW1lID0gJ3NlcnZlci1vdXQudHh0JwotICAgIGFudC5leGVjKGRpcjogcHJvcHMuc2VydmVyRGlyLCBleGVjdXRhYmxlOiBwcm9wcy5leGVjdXRhYmxlLCBvdXRwdXQ6IGZpbGVuYW1lLAotICAgICAgICBzZWFyY2hwYXRoOiB0cnVlICl7Ci0gICAgICAgIGFyZyhsaW5lOiBjb21tYW5kKQotICAgIH0KLSAgICBpZiAoZG9QcmludCkgcHJpbnRsbiBuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKS50ZXh0Ci19Ci1kZWYgd2l0aFVua25vd25TZXJ2ZXIgKENsb3N1cmUgeWllbGQpIHsKLSAgICB1bmtub3duU2VydmVyKHByb3BzLnNlcnZlclN0b3BDb21tYW5kLCBmYWxzZSkKLSAgICBUaHJlYWQuc3RhcnQgeyB1bmtub3duU2VydmVyKHByb3BzLnNlcnZlclN0YXJ0Q29tbWFuZCwgdHJ1ZSkgfQotICAgIHNsZWVwIDEwICAgICAvLyB3YWl0IGZvciBzZXJ2ZXIgc3RhcnR1cAotICAgIHlpZWxkKCkKLSAgICB1bmtub3duU2VydmVyKHByb3BzLnNlcnZlclN0b3BDb21tYW5kLCB0cnVlKQotfQotCi1kZWYgdG9tY2F0IChTdHJpbmcgY29tbWFuZCkgewotICAgIGFudC5hbnQoYW50ZmlsZTpncmFpbHNIb21lICsgJy90b21jYXQueG1sJywgdGFyZ2V0OmNvbW1hbmQpewotICAgICAgICBwcm9wZXJ0eShuYW1lOididWlsZCcsIHZhbHVlOicuLycpCi0gICAgICAgIHByb3BlcnR5KG5hbWU6J3VzZXJuYW1lJywgdmFsdWU6cHJvcHMuc2VydmVyQWRtaW5Vc2VybmFtZSkKLSAgICAgICAgcHJvcGVydHkobmFtZToncGFzc3dvcmQnLCB2YWx1ZTpwcm9wcy5zZXJ2ZXJBZG1pblBhc3N3b3JkKQotICAgIH0KLX0KLWRlZiB3aXRoVG9tY2F0NSAoQ2xvc3VyZSB5aWVsZCkgewotICAgIGFudC5lY2hvKG1lc3NhZ2U6JyoqKiB0b21jYXQgaXMgYXNzdW1lZCB0byBiZSBydW5uaW5nJykKLSAgICB0cnkgeyB0b21jYXQoJ3VuZGVwbG95JykgfSBjYXRjaCAoRXhjZXB0aW9uIG1heU5vdFlldEJlVGhlcmUpe30KLSAgICB0b21jYXQoJ2RlcGxveScpCi0gICAgYW50LmVjaG8obWVzc2FnZTondG9tY2F0IGRlcGxveW1lbnQgZG9uZScpCi0gICAgeWllbGQoKQotfQotCi1kZWYgd2l0aEpldHR5IChDbG9zdXJlIHlpZWxkKSB7Ci0gICAgZGVmIHNlcnZlciAgID0gbmV3IG9yZy5tb3J0YmF5LmpldHR5LlNlcnZlcigpCi0gICAgZGVmIGxpc3RlbmVyID0gbmV3IG9yZy5tb3J0YmF5Lmh0dHAuU29ja2V0TGlzdGVuZXIoKQotICAgIGxpc3RlbmVyLnNldFBvcnQoODA4MCk7Ci0gICAgc2VydmVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKQotICAgIHNlcnZlci5hZGRXZWJBcHBsaWNhdGlvbigiLy4iLCJib29rcy53YXIiKQotICAgIHNlcnZlci5zdGFydCgpCi0gICAgICAgIFRocmVhZC5zdGFydCB7IHlpZWxkKCkgfQotICAgIHNlcnZlci5zdG9wKCkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9idWlsZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZWJjNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcHJvamVjdE5hbWUgICAgICAgICAgICAgICAgID0gVGhlIGJvb2tzIHByb2plY3QKLQotZXhlY3V0YWJsZSAgICAgICAgICAgICAgICAgID0gY21kLmV4ZQotCi13ZWJ0ZXN0X2hvc3QgICAgICAgICAgICAgICAgPSBsb2NhbGhvc3QKLXdlYnRlc3RfcG9ydCAgICAgICAgICAgICAgICA9IDgwODAKLXdlYnRlc3RfcHJvdG9jb2wgICAgICAgICAgICA9IGh0dHAKLXdlYnRlc3RfYmFzZXBhdGggICAgICAgICAgICA9IGJvb2tzCi0KLXdlYnRlc3Rfc3VtbWFyeSAgICAgICAgICAgICA9IHRydWUKLXdlYnRlc3Rfc2F2ZXJlc3BvbnNlICAgICAgICA9IHRydWUKLXdlYnRlc3RfcmVzdWx0cGF0aCAgICAgICAgICA9IHRtcC93ZWJ0ZXN0L3Jlc3VsdHMKLXdlYnRlc3RfcmVzdWx0ZmlsZSAgICAgICAgICA9IFdlYlRlc3RSZXN1bHRzLnhtbAotd2VidGVzdF9oYWx0b25lcnJvciAgICAgICAgID0gZmFsc2UKLXdlYnRlc3RfZXJyb3Jwcm9wZXJ0eSAgICAgICA9IHdlYlRlc3RFcnJvcgotd2VidGVzdF9oYWx0b25mYWlsdXJlICAgICAgID0gZmFsc2UKLXdlYnRlc3RfZmFpbHVyZXByb3BlcnR5ICAgICA9IHdlYlRlc3RGYWlsdXJlCi13ZWJ0ZXN0X3Nob3dodG1scGFyc2Vyb3V0cHV0PSB0cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9Cb29rc1BhZ2VGbG93Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL2dyYWlscy1hcHAvY29udHJvbGxlcnMvQm9va3NQYWdlRmxvdy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmM5NTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9Cb29rc1BhZ2VGbG93Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi1pbXBvcnQgZ3JhaWxzLnBhZ2VmbG93Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8vIHRvZG86IGNsYXNzIG5hbWUgZG9lc24ndCBtYXRjaCBmaWxlbmFtZSAoPykKLWNsYXNzIEJvb2tzUGFnZUZsb3cgewotCi0gICAgZmluYWwgU3RyaW5nIEJPT0tfREVUQUlMX0tFWSAgICAgICAgPSAnYm9va0RldGFpbCcKLSAgICBmaW5hbCBTdHJpbmcgQk9PS19TRVFVRU5DRV9OT19LRVkgICA9ICdib29rU2VxdWVuY2UnCi0gICAgZmluYWwgU3RyaW5nIEJPT0tfQ09MTEVDVElPTl9LRVkgICAgPSAnYm9va3MnCi0gICAgZmluYWwgU3RyaW5nIEFVVEhPUl9TRVFVRU5DRV9OT19LRVkgPSAnYXV0aG9yU2VxdWVuY2UnCi0gICAgZmluYWwgU3RyaW5nIEFVVEhPUl9DT0xMRUNUSU9OX0tFWSA9ICdhdXRob3JzJwotICAgIGZpbmFsIFN0cmluZyBTVUNDRVNTX1RPS0VOICAgICAgICAgID0gJ3N1Y2Nlc3MnCi0JZmluYWwgQXV0aG9yIERBTl9CUk9XTiA9IG5ldyBBdXRob3IoaWQ6MSwgbmFtZTonRGFuIEJyb3duJykKLQotICAgIE1hcCBib29rRGV0YWlsRm9ybUFjdGlvbiA9IFsKLSAgICAgICAgY2xhc3M6ICBCb29rRGV0YWlsQ29tbWFuZC5jbGFzcywKLSAgICAgICAgbmFtZTogICBCT09LX0RFVEFJTF9LRVksCi0gICAgICAgIHZhbGlkYXRvcjogeyB0YXJnZXQsIGVycm9ycyAtPiB9Ci0gICAgXQotCi0gICAgTWFwIGJvb2tEZXRhaWxGb3JtQWN0aW9uU2NvcGUgPSBbCi0gICAgICAgIGNsYXNzOiAgQm9va0RldGFpbENvbW1hbmQuY2xhc3MsCi0gICAgICAgIG5hbWU6ICAgQk9PS19ERVRBSUxfS0VZLAotICAgICAgICBzY29wZTogJ2Zsb3cnCi0gICAgXQotCi0KLSAgICBDbG9zdXJlIGxvYWRCb29rcyA9IHsgcmVxdWVzdENvbnRleHQgLT4KLSAgICAgICAgcmVxdWVzdENvbnRleHQuZmxvd1Njb3BlW0JPT0tfQ09MTEVDVElPTl9LRVldID0gWwotICAgICAgICAgICAgbmV3IEJvb2soaWQ6MSwgdGl0bGU6J1RoZSBEYSBWaW5jaSBDb2RlJywgICBhdXRob3I6REFOX0JST1dOKSwKLSAgICAgICAgICAgIG5ldyBCb29rKGlkOjIsIHRpdGxlOidEZWNlcHRpb24gUG9pbnQnLCAgICAgYXV0aG9yOkRBTl9CUk9XTiksCi0gICAgICAgICAgICBuZXcgQm9vayhpZDozLCB0aXRsZTonRGlnaXRhbCBGb3J0cmVzcycsICAgIGF1dGhvcjpEQU5fQlJPV04pLAotICAgICAgICAgICAgbmV3IEJvb2soaWQ6NCwgdGl0bGU6J0FuZ2VscyBBbmQgRGVtb25zJywgICBhdXRob3I6REFOX0JST1dOKQotICAgICAgICBdCi0gICAgICAgIHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtCT09LX1NFUVVFTkNFX05PX0tFWV0gPSA0Ci0gICAgICAgIHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtBVVRIT1JfQ09MTEVDVElPTl9LRVldID0gWyBEQU5fQlJPV04gXQotICAgICAgICByZXF1ZXN0Q29udGV4dC5mbG93U2NvcGVbQVVUSE9SX1NFUVVFTkNFX05PX0tFWV0gPSAxCi0gICAgICAgIHJldHVybiBTVUNDRVNTX1RPS0VOCi0gICAgfQotCi0vLyBDYWxsaW5nIHRoaXMgY2xvc3VyZSBmcm9tIGZpbmRCb29rIGRvZXNuJ3Qgd29yaywgZG9uJ3Qga25vdyB3aHkKLS8vIGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb246IE5vIHNpZ25hdHVyZSBvZiBtZXRob2QgQm9va3NQYWdlRmxvdyRfY2xvc3VyZTMuZ2V0Qm9va3MoKSBpcyBhcHBsaWNhYmxlIGZvciBhcmd1bWVudCB0eXBlczogWy4uLl0KLSAgICBDbG9zdXJlIGdldEJvb2tzID0geyByZXF1ZXN0Q29udGV4dCAtPgotICAgICAgIHJldHVybiBnZXRCb29rcyhyZXF1ZXN0Q29udGV4dCkKLSAgICB9Ci0KLQlkZWYgZ2V0Qm9va3MocmVxdWVzdENvbnRleHQpIHsKLQkJcmV0dXJuIHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtCT09LX0NPTExFQ1RJT05fS0VZXQotCX0KLQotICAgIENsb3N1cmUgZmluZEJvb2sgPSB7IHJlcXVlc3RDb250ZXh0IC0+Ci0gICAgICAgIGRlZiBib29rQ29tbWFuZCA9IHJlcXVlc3RDb250ZXh0LnJlcXVlc3RTY29wZVtCT09LX0RFVEFJTF9LRVldCi0gICAgICAgIGRlZiBib29rID0gZ2V0Qm9va3MocmVxdWVzdENvbnRleHQpLmZpbmR7aXQuaWQgPT0gYm9va0NvbW1hbmQuaWR9Ci0gICAgICAgIGlmIChib29rKSB7Ci0gICAgICAgICAgICBwcmludGxuKCdGb3VuZCBib29rIGlkOicgKyBib29rLmlkKQotICAgICAgICAgICAgYm9va0NvbW1hbmQudGl0bGUgPSBib29rLnRpdGxlCi0gICAgICAgICAgICBib29rQ29tbWFuZC5hdXRob3IgPSBib29rLmF1dGhvcgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTVUNDRVNTX1RPS0VOCi0gICAgICAgIC8vIHRvZG86IHdoYXQgYWJvdXQgZXJyb3IgdG9rZW4gd2hlbiBubyBib29rIGZvdW5kPwotICAgIH0KLQotICAgIC8vIHRvZG86IHRoaXMgaXMgc2FtZSBsb2dpYyBhcyBmaW5kQm9vayAoPykKLSAgICBDbG9zdXJlIHNhdmVCb29rID0geyByZXF1ZXN0Q29udGV4dCAtPgotICAgICAgICBkZWYgYm9va0NvbW1hbmQgPSByZXF1ZXN0Q29udGV4dC5yZXF1ZXN0U2NvcGVbQk9PS19ERVRBSUxfS0VZXQotICAgIAlkZWYgYm9vayA9IGdldEJvb2tzKHJlcXVlc3RDb250ZXh0KS5maW5ke2l0LmlkID09IGJvb2tDb21tYW5kLmlkfQotICAgICAgICBpZiAoYm9vaykgewotICAgICAgICAgICAgcHJpbnRsbignU2F2aW5nIGJvb2sgaWQ6JyArIGJvb2suaWQpCi0gICAgICAgICAgICBib29rLnRpdGxlID0gYm9va0NvbW1hbmQudGl0bGUKLSAgICAgICAgICAgIGJvb2suYXV0aG9yID0gYm9va0NvbW1hbmQuYXV0aG9yCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNVQ0NFU1NfVE9LRU4KLSAgICB9Ci0KLS8vIENhbGxpbmcgdGhpcyBjbG9zdXJlIGZyb20gYWRkQm9vayBkb2Vzbid0IHdvcmssIGRvbid0IGtub3cgd2h5LgotLy8gZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjogTm8gc2lnbmF0dXJlIG9mIG1ldGhvZCBCb29rc1BhZ2VGbG93JF9jbG9zdXJlNi5nZXRTZXF1ZW5jZSgpIGlzIGFwcGxpY2FibGUgZm9yIGFyZ3VtZW50IHR5cGVzOiBbLi4uXQotLy8JQ2xvc3VyZSBnZXRTZXF1ZW5jZSA9IHsgcmVxdWVzdENvbnRleHQgLT4KLS8vICAgICAgICBkZWYgc2VxdWVuY2UgPSByZXF1ZXN0Q29udGV4dC5mbG93U2NvcGVbQk9PS19TRVFVRU5DRV9OT19LRVldCi0vLyAgICAgICAgc2VxdWVuY2UrKwotLy8gICAgICAgIHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtCT09LX1NFUVVFTkNFX05PX0tFWV0gPSBzZXF1ZW5jZQotLy8JCXJldHVybiBzZXF1ZW5jZQotLy8JfQotCi0JZGVmIGdldFNlcXVlbmNlKHJlcXVlc3RDb250ZXh0KSB7Ci0gICAgICAgIGRlZiBzZXF1ZW5jZSA9IHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtCT09LX1NFUVVFTkNFX05PX0tFWV0KLSAgICAgICAgc2VxdWVuY2UrKwotICAgICAgICByZXF1ZXN0Q29udGV4dC5mbG93U2NvcGVbQk9PS19TRVFVRU5DRV9OT19LRVldID0gc2VxdWVuY2UKLQkJcmV0dXJuIHNlcXVlbmNlCi0JfQotCi0gICAgQ2xvc3VyZSBhZGRCb29rID0geyByZXF1ZXN0Q29udGV4dCAtPgotICAgIAlkZWYgc2VxdWVuY2UgPSBnZXRTZXF1ZW5jZShyZXF1ZXN0Q29udGV4dCkKLSAgICAgICAgZGVmIGJvb2tDb21tYW5kID0gcmVxdWVzdENvbnRleHQucmVxdWVzdFNjb3BlW0JPT0tfREVUQUlMX0tFWV0KLSAgICAgICAgZGVmIHRpdGxlID0gYm9va0NvbW1hbmQudGl0bGUKLSAgICAgICAgZGVmIGF1dGhvciA9IGJvb2tDb21tYW5kLmF1dGhvcgotICAgICAgICBCb29rIGJvb2sgPSBuZXcgQm9vayhpZDpzZXF1ZW5jZSwgdGl0bGU6dGl0bGUsIGF1dGhvcjphdXRob3IpCi0gICAgICAgIHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVtCT09LX0NPTExFQ1RJT05fS0VZXS5hZGQoYm9vaykKLSAgICAgICAgcmV0dXJuIFNVQ0NFU1NfVE9LRU4KLSAgICB9Ci0KLSAgICBAUHJvcGVydHkgZ3JhaWxzLnBhZ2VmbG93LkZsb3cgZmxvdyA9IG5ldyBQYWdlRmxvd0J1aWxkZXIoKS5mbG93IHsKLSAgICAgICAgbG9hZEJvb2tzKGFjdGlvbjpsb2FkQm9va3MpIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MoJ2xpc3RCb29rcycpCi0gICAgICAgIH0KLSAgICAgICAgbGlzdEJvb2tzKHZpZXc6J2xpc3RCb29rcycsIG1vZGVsOltib29rczpnZXRCb29rc10pIHsKLSAgICAgICAgICAgIGRldGFpbCgnYm9va0RldGFpbEJpbmQnKQotICAgICAgICAgICAgYWRkQm9vaygnYWRkQm9va1ZpZXdCaW5kJykKLSAgICAgICAgICAgIGVuZE5vVmlldygnZW5kTm9WaWV3JykKLSAgICAgICAgICAgIGVuZFZpZXcoJ2VuZFZpZXcnKQotICAgICAgICB9Ci0gICAgICAgIGJvb2tEZXRhaWxCaW5kKGFjdGlvbjpib29rRGV0YWlsRm9ybUFjdGlvbikgewotICAgICAgICAgICAgc3VjY2VzcygnYm9va0RldGFpbEZpbmQnKQotICAgICAgICB9Ci0gICAgICAgIGJvb2tEZXRhaWxGaW5kKGFjdGlvbjpmaW5kQm9vaykgewotICAgICAgICAgICAgc3VjY2VzcygnYm9va0RldGFpbFZpZXcnKQotICAgICAgICB9Ci0gICAgICAgIGJvb2tEZXRhaWxWaWV3KHZpZXc6J2Jvb2tEZXRhaWwnKSB7Ci0gICAgICAgICAgICBjbG9zZSgnbGlzdEJvb2tzJykKLSAgICAgICAgICAgIHNhdmUoJ3NhdmVCb29rRGV0YWlsQmluZCcpCi0gICAgICAgICAgICBzZWxlY3QoJ3NlbGVjdEF1dGhvckJpbmQnKQotICAgICAgICB9Ci0gICAgICAgIHNhdmVCb29rRGV0YWlsQmluZChhY3Rpb246Ym9va0RldGFpbEZvcm1BY3Rpb24pIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MoJ3NhdmVCb29rRGV0YWlsJykKLSAgICAgICAgfQotICAgICAgICBzYXZlQm9va0RldGFpbChhY3Rpb246c2F2ZUJvb2spIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MoJ2Jvb2tEZXRhaWxWaWV3JykKLSAgICAgICAgfQotICAgICAgICBhZGRCb29rVmlld0JpbmQoYWN0aW9uOmJvb2tEZXRhaWxGb3JtQWN0aW9uKSB7Ci0gICAgICAgICAgICBzdWNjZXNzKCdhZGRCb29rVmlldycpCi0gICAgICAgIH0KLSAgICAgICAgYWRkQm9va1ZpZXcodmlldzonYm9va0RldGFpbCcpIHsKLSAgICAgICAgICAgIHNhdmUoJ2FkZEJvb2tCaW5kJykKLSAgICAgICAgICAgIGNsb3NlKCdsaXN0Qm9va3MnKQotICAgICAgICAgICAgc2VsZWN0KCdzZWxlY3RBdXRob3JCaW5kJykKLSAgICAgICAgfQotICAgICAgICBhZGRCb29rQmluZChhY3Rpb246Ym9va0RldGFpbEZvcm1BY3Rpb24pIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MoJ2FkZEJvb2snKQotICAgICAgICAgICAgZXJyb3IoJ2FkZEJvb2tWaWV3JykKLSAgICAgICAgfQotICAgICAgICBhZGRCb29rKGFjdGlvbjphZGRCb29rKSB7Ci0gICAgICAgICAgICBzdWNjZXNzKCdsaXN0Qm9va3MnKQotICAgICAgICB9Ci0gICAgICAgIHNlbGVjdEF1dGhvckJpbmQoYWN0aW9uOmJvb2tEZXRhaWxGb3JtQWN0aW9uU2NvcGUpIHsKLSAgICAgICAgCXN1Y2Nlc3MoJ3NlbGVjdEF1dGhvcicpCi0gICAgICAgIH0KLSAgICAgICAgc2VsZWN0QXV0aG9yKAotICAgICAgICAJc3ViZmxvdzonYXV0aG9ycycsCi0gICAgICAgIAlpbnB1dDp7IGN0eCAtPiAKLSAgICAgICAgCQlbIAotICAgICAgICAJCQlhdXRob3JzOmN0eC5mbG93U2NvcGVbQVVUSE9SX0NPTExFQ1RJT05fS0VZXSwKLSAgICAgICAgCQkJYXV0aG9yU2VxdWVuY2U6Y3R4LmZsb3dTY29wZVtBVVRIT1JfU0VRVUVOQ0VfTk9fS0VZXSAKLSAgICAgICAgCQldIAotICAgICAgICAJfSwKLSAgICAgICAgCW91dHB1dDp7IGN0eCAtPiAKLSAgICAgICAgCQlbCi0gICAgICAgIAkJCXNlbGVjdGVkQXV0aG9yOmN0eC5yZXF1ZXN0U2NvcGVbJ3NlbGVjdGVkQXV0aG9yJ10sCi0gICAgICAgIAkJCUFVVEhPUl9TRVFVRU5DRV9OT19LRVk6Y3R4LmZsb3dTY29wZVsnYXV0aG9yU2VxdWVuY2UnXSwKLSAgICAgICAgCQkJQVVUSE9SX0NPTExFQ1RJT05fS0VZOmN0eC5mbG93U2NvcGVbJ2F1dGhvcnMnXQotICAgICAgICAJCV0gCi0gICAgICAgIH0pIHsKLSAgICAgICAgCWVuZCgnYmluZFNlbGVjdGVkQXV0aG9yJykKLSAgICAgICAgfQotICAgICAgICBiaW5kU2VsZWN0ZWRBdXRob3IoCi0gICAgICAgIAlhY3Rpb246eyBjdHggLT4gCi0gICAgICAgIAkJY3R4LmZsb3dTY29wZVtCT09LX0RFVEFJTF9LRVldLmF1dGhvciA9IGN0eC5mbG93U2NvcGVbJ3NlbGVjdGVkQXV0aG9yJ10KLSAgICAgICAgCQljdHgucmVxdWVzdFNjb3BlW0JPT0tfREVUQUlMX0tFWV0gPSBjdHguZmxvd1Njb3BlW0JPT0tfREVUQUlMX0tFWV0KLSAgICAgICAgCQlyZXR1cm4gU1VDQ0VTU19UT0tFTiAKLSAgICAgICAgfSkgewotICAgICAgICAJc3VjY2VzcygncmV0dXJuVG9EZXRhaWxWaWV3JykKLSAgICAgICAgfQotICAgICAgICByZXR1cm5Ub0RldGFpbFZpZXcoYWN0aW9uOnsgY3R4IC0+IGlmIChjdHgucmVxdWVzdFNjb3BlW0JPT0tfREVUQUlMX0tFWV0uaWQgPiAwKSB7IHJldHVybiAnZWRpdCcgfSBlbHNlIHsgcmV0dXJuICdhZGQnIH0gfSkgewotICAgICAgICAJZWRpdCgnYm9va0RldGFpbFZpZXcnKQotICAgICAgICAJYWRkKCdhZGRCb29rVmlldycpCi0gICAgICAgIH0KLSAgICAgICAgZW5kTm9WaWV3KCkKLSAgICAgICAgZW5kVmlldyh2aWV3OidlbmQnLGVuZDp0cnVlKQotICAgIH0KLX0KLQotY2xhc3MgQm9vayB7Ci0gICAgQFByb3BlcnR5IGludCBpZAotICAgIEBQcm9wZXJ0eSBTdHJpbmcgdGl0bGUKLSAgICBAUHJvcGVydHkgQXV0aG9yIGF1dGhvcgotfQotCi1jbGFzcyBCb29rRGV0YWlsQ29tbWFuZCB7Ci0gICAgQFByb3BlcnR5IGludCBpZCA9IDAKLSAgICBAUHJvcGVydHkgU3RyaW5nIHRpdGxlCi0gICAgQFByb3BlcnR5IEF1dGhvciBhdXRob3IgPSBuZXcgQXV0aG9yKCkKLX0KLQotY2xhc3MgQXV0aG9yIHsKLQlAUHJvcGVydHkgaW50IGlkID0gMDsKLQlAUHJvcGVydHkgU3RyaW5nIG5hbWU7Ci19Ci0KLWNsYXNzIEF1dGhvckRldGFpbENvbW1hbmQgewotCUBQcm9wZXJ0eSBpbnQgaWQgPSAwCi0JQFByb3BlcnR5IFN0cmluZyBuYW1lCi19Ci0KLWNsYXNzIEF1dGhvcnNQYWdlRmxvdyB7Ci0KLSAgICBmaW5hbCBTdHJpbmcgQVVUSE9SX0NPTExFQ1RJT05fS0VZID0gJ2F1dGhvcnMnCi0gICAgZmluYWwgU3RyaW5nIFNVQ0NFU1NfVE9LRU4gICAgICAgICAgPSAnc3VjY2VzcycKLQlmaW5hbCBTdHJpbmcgQVVUSE9SX0RFVEFJTF9LRVkgPSAnYXV0aG9yRGV0YWlsJwotCWZpbmFsIFN0cmluZyBTRUxFQ1RFRF9BVVRIT1IgPSAnc2VsZWN0ZWRBdXRob3InCi0KLQlNYXAgYXV0aG9yRGV0YWlsRm9ybUFjdGlvbiA9IFsKLQkJY2xhc3M6QXV0aG9yRGV0YWlsQ29tbWFuZCwKLQkJbmFtZTpBVVRIT1JfREVUQUlMX0tFWQotCV0KLQotCWRlZiBnZXRBdXRob3JzKHJlcXVlc3RDb250ZXh0KSB7Ci0JCXJldHVybiByZXF1ZXN0Q29udGV4dC5mbG93U2NvcGVbQVVUSE9SX0NPTExFQ1RJT05fS0VZXQotCX0KLQotCUNsb3N1cmUgZ2V0QXV0aG9ycyA9IHsgcmVxdWVzdENvbnRleHQgLT4KLQkJcmV0dXJuIGdldEF1dGhvcnMocmVxdWVzdENvbnRleHQpCi0JfQotCi0JZGVmIGdldFNlcXVlbmNlKHJlcXVlc3RDb250ZXh0KSB7Ci0JCWRlZiBzZXF1ZW5jZSA9IHJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVsnYXV0aG9yU2VxdWVuY2UnXQotCQlzZXF1ZW5jZSsrCi0JCXJlcXVlc3RDb250ZXh0LmZsb3dTY29wZVsnYXV0aG9yU2VxdWVuY2UnXSA9IHNlcXVlbmNlCi0JCXJldHVybiBzZXF1ZW5jZQotCX0KLQotCUNsb3N1cmUgc2VsZWN0QXV0aG9yID0geyByZXF1ZXN0Q29udGV4dCAtPgotCQlkZWYgYXV0aG9yRGV0YWlsID0gcmVxdWVzdENvbnRleHQucmVxdWVzdFNjb3BlW0FVVEhPUl9ERVRBSUxfS0VZXQotCQlyZXF1ZXN0Q29udGV4dC5yZXF1ZXN0U2NvcGVbU0VMRUNURURfQVVUSE9SXSA9IGdldEF1dGhvcnMocmVxdWVzdENvbnRleHQpLmZpbmQgeyBpdC5pZCA9PSBhdXRob3JEZXRhaWwuaWQgfQotCQlyZXR1cm4gU1VDQ0VTU19UT0tFTgotCX0KLQotCUNsb3N1cmUgc2F2ZUF1dGhvciA9IHsgcmVxdWVzdENvbnRleHQgLT4KLQkJZGVmIHNlcXVlbmNlID0gZ2V0U2VxdWVuY2UocmVxdWVzdENvbnRleHQpCi0JCWRlZiBhdXRob3JEZXRhaWwgPSByZXF1ZXN0Q29udGV4dC5yZXF1ZXN0U2NvcGVbQVVUSE9SX0RFVEFJTF9LRVldCi0JCWdldEF1dGhvcnMocmVxdWVzdENvbnRleHQpLmFkZChuZXcgQXV0aG9yKGlkOnNlcXVlbmNlLG5hbWU6YXV0aG9yRGV0YWlsLm5hbWUpKQotCQlyZXR1cm4gU1VDQ0VTU19UT0tFTjsKLQl9Ci0KLQlAUHJvcGVydHkgYm9vbGVhbiBhY2Nlc3NpYmxlID0gZmFsc2UKLQlAUHJvcGVydHkgZ3JhaWxzLnBhZ2VmbG93LkZsb3cgZmxvdyA9IG5ldyBQYWdlRmxvd0J1aWxkZXIoKS5mbG93IHsKLQkJbGlzdEF1dGhvcnModmlldzonbGlzdEF1dGhvcnMnLG1vZGVsOlthdXRob3JzOmdldEF1dGhvcnNdKSB7Ci0JCQlzZWxlY3QoJ3NlbGVjdEF1dGhvckJpbmQnKQotCQkJYWRkKCdhZGRBdXRob3JCaW5kJykKLQkJfQotCQlzZWxlY3RBdXRob3JCaW5kKGFjdGlvbjphdXRob3JEZXRhaWxGb3JtQWN0aW9uKSB7Ci0JCQlzdWNjZXNzKCdzZWxlY3RBdXRob3InKQotCQl9Ci0JCXNlbGVjdEF1dGhvcihhY3Rpb246c2VsZWN0QXV0aG9yKSB7Ci0JCQlzdWNjZXNzKCdlbmQnKQotCQl9Ci0JCWFkZEF1dGhvckJpbmQoYWN0aW9uOmF1dGhvckRldGFpbEZvcm1BY3Rpb24pIHsKLQkJCXN1Y2Nlc3MoJ2FkZEF1dGhvclZpZXcnKQotCQl9Ci0JCWFkZEF1dGhvclZpZXcodmlldzonYXV0aG9yRGV0YWlsJykgewotCQkJY2xvc2UoJ2xpc3RBdXRob3JzJykKLQkJCXNhdmUoJ3NhdmVOZXdBdXRob3JCaW5kJykJCQkKLQkJfQotCQlzYXZlTmV3QXV0aG9yQmluZChhY3Rpb246YXV0aG9yRGV0YWlsRm9ybUFjdGlvbikgewotCQkJc3VjY2Vzcygnc2F2ZU5ld0F1dGhvcicpCi0JCQllcnJvcignYWRkQXV0aG9yVmlldycpCi0JCX0KLQkJc2F2ZU5ld0F1dGhvcihhY3Rpb246c2F2ZUF1dGhvcikgewotCQkJc3VjY2VzcygnbGlzdEF1dGhvcnMnKQotCQl9Ci0JCWVuZCgpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3BhZ2VGbG93LmRvdCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3BhZ2VGbG93LmRvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzZmMyNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy9wYWdlRmxvdy5kb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1kaWdyYXBoIEcgewotICAgIG5vZGUgW3NoYXBlPWJveCwgZm9udG5hbWU9SGVsdmV0aWNhXTsKLSAgICB7cmFuaz1zb3VjZTsgbG9hZEJvb2tzfQotCWxvYWRCb29rcyAtPiBsaXN0Qm9va3MgW2xhYmVsPSJzdWNjZXNzIl0KLQlsaXN0Qm9va3MgLT4gYm9va0RldGFpbEJpbmQgW2xhYmVsPSJkZXRhaWwiXQotCWxpc3RCb29rcyAtPiBhZGRCb29rVmlld0JpbmQgW2xhYmVsPSJhZGRCb29rIl0KLQlib29rRGV0YWlsQmluZCAtPiBib29rRGV0YWlsRmluZCBbbGFiZWw9InN1Y2Nlc3MiXQotCWJvb2tEZXRhaWxGaW5kIC0+IGJvb2tEZXRhaWxWaWV3IFtsYWJlbD0ic3VjY2VzcyJdCi0JYm9va0RldGFpbFZpZXcgLT4gbGlzdEJvb2tzIFtsYWJlbD0iY2xvc2UiXQotCWJvb2tEZXRhaWxWaWV3IC0+IHNhdmVCb29rRGV0YWlsQmluZCBbbGFiZWw9InNhdmUiXQotCXNhdmVCb29rRGV0YWlsQmluZCAtPiBzYXZlQm9va0RldGFpbCBbbGFiZWw9InN1Y2Nlc3MiXQotCXNhdmVCb29rRGV0YWlsIC0+IGJvb2tEZXRhaWxWaWV3IFtsYWJlbD0ic3VjY2VzcyJdCi0JYWRkQm9va1ZpZXdCaW5kIC0+IGFkZEJvb2tWaWV3IFtsYWJlbD0ic3VjY2VzcyJdCi0JYWRkQm9va1ZpZXcgLT4gYWRkQm9va0JpbmQgW2xhYmVsPSJzYXZlIl0KLQlhZGRCb29rVmlldyAtPiBsaXN0Qm9va3MgW2xhYmVsPSJjbG9zZSJdCi0JYWRkQm9va0JpbmQgLT4gYWRkQm9vayBbbGFiZWw9InN1Y2Nlc3MiXQotCWFkZEJvb2tCaW5kIC0+IGFkZEJvb2tWaWV3IFtsYWJlbD0iZXJyb3IiXQotCWFkZEJvb2sgLT4gbGlzdEJvb2tzIFtsYWJlbD0ic3VjY2VzcyJdCi0JbG9hZEJvb2tzIFtsYWJlbD0ibG9hZEJvb2tzXG4gYWN0aW9uIDogQ2xvc3VyZVxsIl0KLQlsaXN0Qm9va3MgW2xhYmVsPSJsaXN0Qm9va3NcbiB2aWV3IDogbGlzdEJvb2tzXGwgbW9kZWwgOiBNYXBcbCIsc2hhcGU9ZWxsaXBzZSxzdHlsZT1maWxsZWQsY29sb3I9Ii43IC4zIDEuMCJdCi0JYm9va0RldGFpbEJpbmQgW2xhYmVsPSJib29rRGV0YWlsQmluZFxuIGFjdGlvbiA6IE1hcFxsIl0KLQlib29rRGV0YWlsRmluZCBbbGFiZWw9ImJvb2tEZXRhaWxGaW5kXG4gYWN0aW9uIDogQ2xvc3VyZVxsIl0KLQlib29rRGV0YWlsVmlldyBbbGFiZWw9ImJvb2tEZXRhaWxWaWV3XG4gdmlldyA6IGJvb2tEZXRhaWxcbCIsc2hhcGU9ZWxsaXBzZSxzdHlsZT1maWxsZWQsY29sb3I9Ii43IC4zIDEuMCJdCi0Jc2F2ZUJvb2tEZXRhaWxCaW5kIFtsYWJlbD0ic2F2ZUJvb2tEZXRhaWxCaW5kXG4gYWN0aW9uIDogTWFwXGwiXQotCXNhdmVCb29rRGV0YWlsIFtsYWJlbD0ic2F2ZUJvb2tEZXRhaWxcbiBhY3Rpb24gOiBDbG9zdXJlXGwiXQotCWFkZEJvb2tWaWV3QmluZCBbbGFiZWw9ImFkZEJvb2tWaWV3QmluZFxuIGFjdGlvbiA6IE1hcFxsIl0KLQlhZGRCb29rVmlldyBbbGFiZWw9ImFkZEJvb2tWaWV3XG4gdmlldyA6IGJvb2tEZXRhaWxcbCIsc2hhcGU9ZWxsaXBzZSxzdHlsZT1maWxsZWQsY29sb3I9Ii43IC4zIDEuMCJdCi0JYWRkQm9va0JpbmQgW2xhYmVsPSJhZGRCb29rQmluZFxuIGFjdGlvbiA6IE1hcFxsIG1ldGhvZCA6IGJpbmRBbmRWYWxpZGF0ZVxsIl0KLQlhZGRCb29rIFtsYWJlbD0iYWRkQm9va1xuIGFjdGlvbiA6IENsb3N1cmVcbCJdCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvcGFnZUZsb3cucG5nIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3MvcGFnZUZsb3cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTM1YTM1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3BhZ2VGbG93LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvYXV0aG9yRGV0YWlsLmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvYXV0aG9yRGV0YWlsLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5NTQyYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2F1dGhvckRldGFpbC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuc3VwcG9ydC5CaW5kU3RhdHVzIiU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2ZtdCIgcHJlZml4PSJmbXQiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3RhZ3MiIHByZWZpeD0ic3ByaW5nIiAlPgotCi08aHRtbD4KLSAgIDxoZWFkPgotICAgICAgPHRpdGxlPkF1dGhvciBkZXRhaWw8L3RpdGxlPgotICAgPC9oZWFkPgotCi0gICA8Ym9keT4KLSAgICAgIDxoMT5BdXRob3IgZGV0YWlsPC9oMT4KLSAgICAgIDxzcHJpbmc6aGFzQmluZEVycm9ycyBuYW1lPSJhdXRob3JEZXRhaWwiPgotICAgICAgICAgPGM6Zm9yRWFjaCBpdGVtcz0iJHtlcnJvcnMuYWxsRXJyb3JzfSIgdmFyPSJlcnJvciI+Ci0gICAgICAgICAgICA8c3Bhbj48YzpvdXQgdmFsdWU9IiR7ZXJyb3J9Ii8+PC9zcGFuPgotICAgICAgICAgPC9jOmZvckVhY2g+Ci0gICAgICA8L3NwcmluZzpoYXNCaW5kRXJyb3JzPgotICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICAgICAgIDxmaWVsZHNldD4KLSAgICAgICAgICAgIDxzcHJpbmc6YmluZCBwYXRoPSJhdXRob3JEZXRhaWwuaWQiPgotICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPGM6b3V0IHZhbHVlPSIke3N0YXR1cy5leHByZXNzaW9ufSIvPiIgdmFsdWU9IjxjOm91dCB2YWx1ZT0iJHtzdGF0dXMudmFsdWV9Ii8+IiBpZD0iYXV0aG9ySWQiLz4KLSAgICAgICAgICAgIDwvc3ByaW5nOmJpbmQ+Ci0gICAgICAgICAgICA8bGFiZWw+bmFtZTwvbGFiZWw+Ci0gICAgICAgICAgICA8c3ByaW5nOmJpbmQgcGF0aD0iYXV0aG9yRGV0YWlsLm5hbWUiPgotICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IjxjOm91dCB2YWx1ZT0iJHtzdGF0dXMuZXhwcmVzc2lvbn0iLz4iIHZhbHVlPSI8YzpvdXQgdmFsdWU9IiR7c3RhdHVzLnZhbHVlfSIvPiIgaWQ9ImF1dGhvck5hbWUiPgotICAgICAgICAgICAgPC9zcHJpbmc6YmluZD4KLSAgICAgICAgICAgIDxicj4KLSAgICAgICAgICAgIDxicj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Il9ldmVudElkX3NhdmUiIHZhbHVlPSJTYXZlIiBpZD0ic2F2ZSI+Ci0gICAgICAgICA8L2ZpZWxkc2V0PgotICAgICAgPC9mb3JtPgotICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDbG9zZSIgbmFtZT0iX2V2ZW50SWRfY2xvc2UiIGlkPSJjbG9zZSI+Ci0gICAgICA8L2Zvcm0+Ci0gICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2Jvb2tEZXRhaWwuanNwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3Mvd2ViLWFwcC9XRUItSU5GL2pzcC9ib29rRGV0YWlsLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzlhOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2Jvb2tEZXRhaWwuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuQmluZFN0YXR1cyIlPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSIgcHJlZml4PSJjIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9mbXQiIHByZWZpeD0iZm10IiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy90YWdzIiBwcmVmaXg9InNwcmluZyIgJT4KLQotPGh0bWw+Ci0gICA8aGVhZD4KLSAgICAgIDx0aXRsZT5Cb29rIGRldGFpbDwvdGl0bGU+Ci0gICA8L2hlYWQ+Ci0KLSAgIDxib2R5PgotICAgICAgPGgxPkJvb2sgZGV0YWlsPC9oMT4KLSAgICAgIDxzcHJpbmc6aGFzQmluZEVycm9ycyBuYW1lPSJib29rRGV0YWlsIj4KLSAgICAgICAgIDxjOmZvckVhY2ggaXRlbXM9IiR7ZXJyb3JzLmFsbEVycm9yc30iIHZhcj0iZXJyb3IiPgotICAgICAgICAgICAgPHNwYW4+PGM6b3V0IHZhbHVlPSIke2Vycm9yfSIvPjwvc3Bhbj4KLSAgICAgICAgIDwvYzpmb3JFYWNoPgotICAgICAgPC9zcHJpbmc6aGFzQmluZEVycm9ycz4KLSAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCI+Ci0gICAgICAgICA8ZmllbGRzZXQ+Ci0gICAgICAgICAgICA8c3ByaW5nOmJpbmQgcGF0aD0iYm9va0RldGFpbC5pZCI+Ci0gICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8YzpvdXQgdmFsdWU9IiR7c3RhdHVzLmV4cHJlc3Npb259Ii8+IiB2YWx1ZT0iPGM6b3V0IHZhbHVlPSIke3N0YXR1cy52YWx1ZX0iLz4iIGlkPSJib29rSWQiLz4KLSAgICAgICAgICAgIDwvc3ByaW5nOmJpbmQ+Ci0gICAgICAgICAgICA8bGFiZWw+dGl0bGU8L2xhYmVsPgotICAgICAgICAgICAgPHNwcmluZzpiaW5kIHBhdGg9ImJvb2tEZXRhaWwudGl0bGUiPgotICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IjxjOm91dCB2YWx1ZT0iJHtzdGF0dXMuZXhwcmVzc2lvbn0iLz4iIHZhbHVlPSI8YzpvdXQgdmFsdWU9IiR7c3RhdHVzLnZhbHVlfSIvPiIgaWQ9ImJvb2tBdXRob3IiPgotICAgICAgICAgICAgPC9zcHJpbmc6YmluZD4KLSAgICAgICAgICAgIDxicj4KLSAgICAgICAgICAgIDxsYWJlbD5hdXRob3I8L2xhYmVsPgotICAgICAgICAgICAgPHNwcmluZzpiaW5kIHBhdGg9ImJvb2tEZXRhaWwuYXV0aG9yLm5hbWUiPgotICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImJvb2tUaXRsZSI+PGM6b3V0IHZhbHVlPSIke3N0YXR1cy52YWx1ZX0iLz48L3NwYW4+Ci0gICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJfZXZlbnRJZF9zZWxlY3QiIHZhbHVlPSIuLi4iIGlkPSJzZWxlY3QiPgotICAgICAgICAgICAgPC9zcHJpbmc6YmluZD4KLSAgICAgICAgICAgIDxicj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Il9ldmVudElkX3NhdmUiIHZhbHVlPSJTYXZlIiBpZD0ic2F2ZSI+Ci0gICAgICAgICA8L2ZpZWxkc2V0PgotICAgICAgPC9mb3JtPgotICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDbG9zZSIgbmFtZT0iX2V2ZW50SWRfY2xvc2UiIGlkPSJjbG9zZSI+Ci0gICAgICA8L2Zvcm0+Ci0gICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2VuZC5qc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2VuZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjI1YmQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvYm9va3Mvd2ViLWFwcC9XRUItSU5GL2pzcC9lbmQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5QYWdlIGZsb3cgZW5kcyBoZXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPkJvb2tzIGV4YW1wbGUgZW5kcyBoZXJlPC9oMT4KLQotPGZvcm0gbWV0aG9kPSJQT1NUIj4KLTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJyZXN0YXJ0Ij4KLTwvZm9ybT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2xpc3RBdXRob3JzLmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvbGlzdEF1dGhvcnMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc4MTg5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvbGlzdEF1dGhvcnMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCVAIHBhZ2UKLSAgICAgICAgaW1wb3J0PSJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuQmluZFN0YXR1cyIgJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvZm10IiBwcmVmaXg9ImZtdCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvdGFncyIKLSAgICAgICAgICAgcHJlZml4PSJzcHJpbmciICU+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPHRpdGxlPkF1dGhvciBsaXN0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+QXV0aG9yIGxpc3Q8L2gxPgotCi08Zm9ybSBtZXRob2Q9IlBPU1QiPgotPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iX2V2ZW50SWRfYWRkIiB2YWx1ZT0iQWRkIGF1dGhvciAuLi4iPgotPC9mb3JtPgotPHRhYmxlPgotICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPlRpdGxlPC90ZD4KLSAgICAgICAgICAgIDx0ZD5BdXRob3I8L3RkPgotICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC90aGVhZD4KLSAgICA8dGJvZHk+Ci0gICAgICAgIDxjOmZvckVhY2ggaXRlbXM9IiR7YXV0aG9yc30iIHZhcj0iYXV0aG9yIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQ+PGM6b3V0IHZhbHVlPSIke2F1dGhvci5uYW1lfSIvPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjxjOm91dCB2YWx1ZT0iJHthdXRob3IuaWR9Ii8+Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgbmFtZT0iX2V2ZW50SWRfc2VsZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJTZWxlY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9ImRldGFpbDxjOm91dCB2YWx1ZT0iJHthdXRob3IuaWR9Ii8+Ij4KLSAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L2M6Zm9yRWFjaD4KLSAgICA8L3Rib2R5PgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvbGlzdEJvb2tzLmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL2Jvb2tzL3dlYi1hcHAvV0VCLUlORi9qc3AvbGlzdEJvb2tzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MzA1ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9ib29rcy93ZWItYXBwL1dFQi1JTkYvanNwL2xpc3RCb29rcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08JUAgcGFnZQotICAgICAgICBpbXBvcnQ9Im9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuc3VwcG9ydC5CaW5kU3RhdHVzIiAlPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSIgcHJlZml4PSJjIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9mbXQiIHByZWZpeD0iZm10IiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy90YWdzIgotICAgICAgICAgICBwcmVmaXg9InNwcmluZyIgJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8dGl0bGU+Qm9vayBsaXN0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+Qm9vayBsaXN0PC9oMT4KLQotPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJfZXZlbnRJZF9hZGRCb29rIiB2YWx1ZT0iQWRkIGJvb2sgLi4uIiBpZD0iYWRkYm9vayI+Ci0gICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iX2V2ZW50SWRfZW5kTm9WaWV3IiB2YWx1ZT0iRW5kIChleHBlY3QgZXhjZXB0aW9uKSI+Ci0gICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iX2V2ZW50SWRfZW5kVmlldyIgdmFsdWU9IkVuZCI+Ci08L2Zvcm0+Ci0KLTwvZm9ybT4KLTx0YWJsZT4KLSAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD5UaXRsZTwvdGQ+Ci0gICAgICAgICAgICA8dGQ+QXV0aG9yPC90ZD4KLSAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGhlYWQ+Ci0gICAgPHRib2R5PgotICAgICAgICA8Yzpmb3JFYWNoIGl0ZW1zPSIke2Jvb2tzfSIgdmFyPSJib29rIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQ+PGM6b3V0IHZhbHVlPSIke2Jvb2sudGl0bGV9Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PGM6b3V0IHZhbHVlPSIke2Jvb2suYXV0aG9yLm5hbWV9Ii8+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPGM6b3V0IHZhbHVlPSIke2Jvb2suaWR9Ii8+Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgbmFtZT0iX2V2ZW50SWRfZGV0YWlsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJEZXRhaWxzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkZXRhaWw8YzpvdXQgdmFsdWU9IiR7Ym9vay5pZH0iLz4iPgotICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvYzpmb3JFYWNoPgotICAgIDwvdGJvZHk+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9SRUFETUUudHh0IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTMzYzdmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUhpYmVybmF0ZSBFeGFtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1XQVJOSU5HOiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgSmF2YSA1LjAKLQotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgYSBjbGFzcyBjYW4gYmUgbWFwcGVkIHdpdGggSGliZXJuYXRlIGFuZCBzdGlsbCBiZSB0cmVhdGVkIGFzIGEgbm9ybWFsIEdyYWlscyBkb21haW4gY2xhc3MuIEluY2x1ZGluZyB0aGUgYWJpbGl0eSB0bzoKLQotLSBTY2FmZm9sZCB0aGUgZG9tYWluIGNsYXNzCi0tIFZhbGlkYXRlIEFnYWluc3QgY29uc3RyYWludHMKLS0gQWNjZXNzIGR5bmFtaWMgbWV0aG9kcwotCi1UaGUgZG9tYWluIGNsYXNzIGluIHF1ZXN0aW9uIGNhbiBiZSBmb3VuZCBpbiAic3JjL2phdmEvY29tL3JlY2lwZXMvUmVjaXBlLmphdmEiIGFuZCBpcyBtYXBwZWQgdXNpbmcgdGhlIEhpYmVybmF0ZSBhbm5vdGF0aW9uIHN1cHBvcnQuCi0KLUluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmsgdGhlIEdyYWlscyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpYWwgR3JhaWxzQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgYXQgdGhlIGxpbmU6Ci0KLSAgIEBQcm9wZXJ0eSBjb25maWdDbGFzcyA9IEdyYWlsc0Fubm90YXRpb25Db25maWd1cmF0aW9uLmNsYXNzCi0KLVRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IHVzZSBIaWJlcm5hdGUgYW5ub3RhdGlvbnMsIHdpdGggbm9ybWFsIFhNTCBIaWJlcm5hdGUgbWFwcGluZyBubyBleHRyYSBjb25maWd1cmF0aW9uIGlzIG5lZWRlZC4KLQotVGhlIG9ubHkgcmVtYWluaW5nIHRoaW5nIHRvIGJlIGRvbmUgaXMgdGhlICJoaWJlcm5hdGUuY2ZnLnhtbCIgZmlsZSBpcyBwbGFjZWQgd2l0aGluIHRoZSAiaGliZXJuYXRlIiBkaXJlY3RvcnkgYW5kIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIGNsYXNzOgotCi0KLTxoaWJlcm5hdGUtY29uZmlndXJhdGlvbj4KLSAgICA8c2Vzc2lvbi1mYWN0b3J5PiAgICAgIAotICAgICAgICA8bWFwcGluZyBwYWNrYWdlPSJjb20ucmVjaXBlcyIgLz4KLSAgICAgICAgPG1hcHBpbmcgY2xhc3M9ImNvbS5yZWNpcGVzLlJlY2lwZSIgLz4KLSAgICA8L3Nlc3Npb24tZmFjdG9yeT4KLTwvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24+Ci0KLVRvIHJ1biB0aGUgZXhhbXBsZSBhZnRlciBpbnN0YWxsaW5nIEdyYWlscyB0eXBlOgotCi1ncmFpbHMgaW5pdAotZ3JhaWxzIHJ1bi1hcHAKLQotQW5kIHRoZW4gaW4geW91ciBicm93c2VyIGdvIHRvOgotCi1odHRwOi8vbG9jYWxob3N0OjgwODAvcmVjaXBlcy9yZWNpcGUvbGlzdApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9ncmFpbHMtYXBwL2NvbmYvQXBwbGljYXRpb25EYXRhU291cmNlLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvZ3JhaWxzLWFwcC9jb25mL0FwcGxpY2F0aW9uRGF0YVNvdXJjZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDZkODAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9ncmFpbHMtYXBwL2NvbmYvQXBwbGljYXRpb25EYXRhU291cmNlLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZy5HcmFpbHNBbm5vdGF0aW9uQ29uZmlndXJhdGlvbgotCi1jbGFzcyBBcHBsaWNhdGlvbkRhdGFTb3VyY2UgewotICAgQFByb3BlcnR5IGNvbmZpZ0NsYXNzID0gR3JhaWxzQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24uY2xhc3MKLSAgIEBQcm9wZXJ0eSBib29sZWFuIHBvb2xlZCA9IHRydWUKLSAgIEBQcm9wZXJ0eSBTdHJpbmcgZGJDcmVhdGUgPSAiY3JlYXRlLWRyb3AiIC8vIG9uZSBvZiAnY3JlYXRlJywgJ2NyZWF0ZS1kcm9wJywndXBkYXRlJwotICAgQFByb3BlcnR5IFN0cmluZyB1cmwgPSAiamRiYzpoc3FsZGI6bWVtOnRlc3REQiIKLSAgIEBQcm9wZXJ0eSBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lID0gIm9yZy5oc3FsZGIuamRiY0RyaXZlciIKLSAgIEBQcm9wZXJ0eSBTdHJpbmcgdXNlcm5hbWUgPSAic2EiCi0gICBAUHJvcGVydHkgU3RyaW5nIHBhc3N3b3JkID0gIiIKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9SZWNpcGVDb250cm9sbGVyLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvZ3JhaWxzLWFwcC9jb250cm9sbGVycy9SZWNpcGVDb250cm9sbGVyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczMDA3OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9yZWNpcGVzL2dyYWlscy1hcHAvY29udHJvbGxlcnMvUmVjaXBlQ29udHJvbGxlci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWltcG9ydCBjb20ucmVjaXBlcy5SZWNpcGUKLQotY2xhc3MgUmVjaXBlQ29udHJvbGxlciB7Ci0gICAgQFByb3BlcnR5IHNjYWZmb2xkID0gUmVjaXBlLmNsYXNzCi19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvZ3JhaWxzLXRlc3RzL1JlY2lwZVRlc3RzLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvZ3JhaWxzLXRlc3RzL1JlY2lwZVRlc3RzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1MzNiYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc2FtcGxlcy9yZWNpcGVzL2dyYWlscy10ZXN0cy9SZWNpcGVUZXN0cy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1pbXBvcnQgY29tLnJlY2lwZXMuUmVjaXBlCi0KLWNsYXNzIFJlY2lwZVRlc3RzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotCi0Jdm9pZCB0ZXN0RHluYW1pY01ldGhvZHMoKSB7Ci0JCWRlZiByID0gbmV3IFJlY2lwZSh0aXRsZToiQ2hpY2tlbiBUaWtrYSIsIGRlc2NyaXB0aW9uOiJZdW1teSBJbmRpYW4gRGlzaCIpCi0JCXIuc2F2ZSgpCi0JCQotCQlyID0gUmVjaXBlLmZpbmRCeVRpdGxlKCJDaGlja2VuIFRpa2thIikKLQkJYXNzZXJ0IHIgIT0gbnVsbAotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvaGliZXJuYXRlL2hpYmVybmF0ZS5jZmcueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9oaWJlcm5hdGUvaGliZXJuYXRlLmNmZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDQzOGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9oaWJlcm5hdGUvaGliZXJuYXRlLmNmZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGhpYmVybmF0ZS1jb25maWd1cmF0aW9uIFBVQkxJQwotCQkiLS8vSGliZXJuYXRlL0hpYmVybmF0ZSBDb25maWd1cmF0aW9uIERURCAzLjAvL0VOIgotCQkiaHR0cDovL2hpYmVybmF0ZS5zb3VyY2Vmb3JnZS5uZXQvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24tMy4wLmR0ZCI+Ci08aGliZXJuYXRlLWNvbmZpZ3VyYXRpb24+Ci0gICAgPHNlc3Npb24tZmFjdG9yeT4gICAgICAKLSAgICAgICAgPG1hcHBpbmcgcGFja2FnZT0iY29tLnJlY2lwZXMiIC8+Ci0gICAgICAgIDxtYXBwaW5nIGNsYXNzPSJjb20ucmVjaXBlcy5SZWNpcGUiIC8+Ci0gICAgPC9zZXNzaW9uLWZhY3Rvcnk+Ci08L2hpYmVybmF0ZS1jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9zcmMvamF2YS9jb20vcmVjaXBlcy9SZWNpcGUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zYW1wbGVzL3JlY2lwZXMvc3JjL2phdmEvY29tL3JlY2lwZXMvUmVjaXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGU1M2EuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NhbXBsZXMvcmVjaXBlcy9zcmMvamF2YS9jb20vcmVjaXBlcy9SZWNpcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20ucmVjaXBlczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkludFJhbmdlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUudmFsaWRhdGlvbi5Db25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHk7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVHJhbnNpZW50OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMjAtRmViLTIwMDYKLSAqLwotQEVudGl0eQotcHVibGljIGNsYXNzIFJlY2lwZSB7Ci0gICAgcHJpdmF0ZSBMb25nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgRGF0ZSBkYXRlOwotCi0gICAgQElkCi0gICAgQEdlbmVyYXRlZFZhbHVlCi0gICAgcHVibGljIExvbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChMb25nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotICAgICAgICByZXR1cm4gZGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkgewotICAgICAgICB0aGlzLmRhdGUgPSBkYXRlOwotICAgIH0KLQotICAgIEBUcmFuc2llbnQKLSAgICBwdWJsaWMgTWFwIGdldENvbnN0cmFpbnRzKCkgewotICAgICAgICBDb25zdHJhaW5lZFByb3BlcnR5IHRpdGxlQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eShSZWNpcGUuY2xhc3MsICJ0aXRsZSIsIFN0cmluZy5jbGFzcyApOwotICAgICAgICB0aXRsZUNvbnN0cmFpbnQuc2V0T3JkZXIoMSk7Ci0gICAgICAgIHRpdGxlQ29uc3RyYWludC5zZXRMZW5ndGgobmV3IEludFJhbmdlKDUsMTUpKTsKLSAgICAgICAgQ29uc3RyYWluZWRQcm9wZXJ0eSBkZXNjQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eShSZWNpcGUuY2xhc3MsICJ0aXRsZSIsIFN0cmluZy5jbGFzcyApOwotICAgICAgICBkZXNjQ29uc3RyYWludC5zZXRPcmRlcigyKTsKLSAgICAgICAgZGVzY0NvbnN0cmFpbnQuc2V0V2lkZ2V0KCJ0ZXh0YXJlYSIpOwotCi0KLSAgICAgICAgTWFwIGNvbnN0cmFpbnRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgY29uc3RyYWludHMucHV0KCJ0aXRsZSIsIHRpdGxlQ29uc3RyYWludCk7Ci0gICAgICAgIGNvbnN0cmFpbnRzLnB1dCgiZGVzY3JpcHRpb24iLCBkZXNjQ29uc3RyYWludCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvb3JtL0hpYmVybmF0ZUNyaXRlcmlhQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9vcm0vSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGVhY2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9vcm0vSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2UgZ3JhaWxzLm9ybTsKLQotaW1wb3J0IGdyYWlscy51dGlsLkV4dGVuZFByb3h5OwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQ7Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuUHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLmNyaXRlcmlvbi5Dcml0ZXJpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jcml0ZXJpb24uT3JkZXI7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jcml0ZXJpb24uUmVzdHJpY3Rpb25zOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuU2Vzc2lvbkhvbGRlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRyYW5zYWN0aW9uLnN1cHBvcnQuVHJhbnNhY3Rpb25TeW5jaHJvbml6YXRpb25NYW5hZ2VyOwotCi0vKioKLSAqIDxwPldyYXBzIHRoZSBIaWJlcm5hdGUgQ3JpdGVyaWEgQVBJIGluIGEgYnVpbGRlci4gVGhlIGJ1aWxkZXIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSAiY3JlYXRlQ3JpdGVyaWEoKSIgZHluYW1pYyBzdGF0aWMgCi0gKiBtZXRob2Qgb2YgR3JhaWxzIGRvbWFpbiBjbGFzc2VzIChFeGFtcGxlIGluIEdyb292eSk6IAotICogCi0gKiA8cHJlPgotICogCQlkZWYgYyA9IEFjY291bnQuY3JlYXRlQ3JpdGVyaWEoKQotICogCQlkZWYgcmVzdWx0cyA9IGMgewotICogCQkJbGlrZSgiaG9sZGVyRmlyc3ROYW1lIiwgIkZyZWQlIikKLSAqIAkJCWFuZCB7Ci0gKiAJCQkJYmV0d2VlbigiYmFsYW5jZSIsIDUwMCwgMTAwMCkKLSAqIAkJCQllcSgiYnJhbmNoIiwgIkxvbmRvbiIpCi0gKiAJCQl9Ci0gKiAJCQltYXhSZXN1bHRzKDEwKQotICogCQkJb3JkZXIoImhvbGRlckxhc3ROYW1lIiwgImRlc2MiKQotICogCQl9Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+VGhlIGJ1aWxkZXIgY2FuIGFsc28gYmUgaW5zdGFudGlhdGVkIHN0YW5kYWxvbmUgd2l0aCBhIFNlc3Npb25GYWN0b3J5IGFuZCBwZXJzaXN0ZW50IENsYXNzIGluc3RhbmNlOgotICogCi0gKiA8cHJlPgotICogCSBuZXcgSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyKGNsYXp6LCBzZXNzaW9uRmFjdG9yeSkubGlzdCB7Ci0gKiAJCWVxKCJmaXJzdE5hbWUiLCAiRnJlZCIpCi0gKiAJIH0KLSAqIDwvcHJlPgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMTAsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEhpYmVybmF0ZUNyaXRlcmlhQnVpbGRlciBleHRlbmRzIEJ1aWxkZXJTdXBwb3J0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORCA9ICJhbmQiOyAvLyBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTlVMTCA9ICJpc051bGwiOyAvLyBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTk9UX05VTEwgPSAibm90TnVsbCI7IC8vIGJ1aWxkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1QgPSAibm90IjsvLyBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1IgPSAib3IiOyAvLyBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRVFVQUxTID0gImlkRXEiOyAvLyBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRU1QVFkgPSAiaXNFbXB0eSI7IC8vYnVpbGRlcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX05PVF9FTVBUWSA9ICJpc05vdEVtcHR5IjsgLy9idWlsZGVyCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVUV0VFTiA9ICJiZXR3ZWVuIjsvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMUyA9ICJlcSI7Ly9tZXRob2QJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxTX1BST1BFUlRZID0gImVxUHJvcGVydHkiOy8vbWV0aG9kCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOID0gImd0IjsvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTl9QUk9QRVJUWSA9ICJndFByb3BlcnR5IjsvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9ICJnZSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU5fT1JfRVFVQUxfUFJPUEVSVFkgPSAiZ2VQcm9wZXJ0eSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTElLRSA9ICJpbGlrZSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTiA9ICJpbiI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU4gPSAibHQiOyAvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFU1NfVEhBTl9QUk9QRVJUWSA9ICJsdFByb3BlcnR5IjsvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFU1NfVEhBTl9PUl9FUVVBTCA9ICJsZSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU5fT1JfRVFVQUxfUFJPUEVSVFkgPSAibGVQcm9wZXJ0eSI7Ly9tZXRob2QJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElLRSA9ICJsaWtlIjsvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTCA9ICJuZSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfUFJPUEVSVFkgPSAibmVQcm9wZXJ0eSI7Ly9tZXRob2QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFX0VRVUFMUyA9ICJzaXplRXEiOyAvL21ldGhvZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0RFU0NFTkRJTkcgPSAiZGVzYyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQVNDRU5ESU5HID0gImFzYyI7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0NBTEwgPSAiZG9DYWxsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9DQUxMID0gImxpc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfQ0FMTCA9ICJnZXQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRURVJfUFJFRklYID0gInNldCI7Ci0JCi0JCi0JcHJpdmF0ZSBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeTsKLQlwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKLQlwcml2YXRlIENsYXNzIHRhcmdldENsYXNzOwotCXByaXZhdGUgQ3JpdGVyaWEgY3JpdGVyaWE7Ci0JcHJpdmF0ZSBib29sZWFuIHVuaXF1ZVJlc3VsdCA9IGZhbHNlOwotCXByaXZhdGUgUHJveHkgcmVzdWx0UHJveHkgPSBuZXcgRXh0ZW5kUHJveHkoKTsKLQlwcml2YXRlIFByb3h5IGNyaXRlcmlhUHJveHk7Ci0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCXByaXZhdGUgTGlzdCBsb2dpY2FsRXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGxvZ2ljYWxFeHByZXNzaW9uQXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gcGFydGljaXBhdGU7Ci0JCi0JCi0JcHVibGljIEhpYmVybmF0ZUNyaXRlcmlhQnVpbGRlcihDbGFzcyB0YXJnZXRDbGFzcywgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOwotCQl0aGlzLnNlc3Npb25GYWN0b3J5ID0gc2Vzc2lvbkZhY3Rvcnk7CQkKLQl9Ci0JCi0JcHVibGljIEhpYmVybmF0ZUNyaXRlcmlhQnVpbGRlcihDbGFzcyB0YXJnZXRDbGFzcywgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIGJvb2xlYW4gdW5pcXVlUmVzdWx0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGhpcy5zZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5OwotCQl0aGlzLnVuaXF1ZVJlc3VsdCA9IHVuaXF1ZVJlc3VsdDsKLQl9CQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlUmVzdWx0KGJvb2xlYW4gdW5pcXVlUmVzdWx0KSB7Ci0JCXRoaXMudW5pcXVlUmVzdWx0ID0gdW5pcXVlUmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgQ3JpdGVyaW9uIHRoYXQgY29tcGFyZXMgdG8gY2xhc3MgcHJvcGVydGllcyBmb3IgZXF1YWxpdHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBmaXJzdCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG90aGVyUHJvcGVydHlOYW1lIFRoZSBzZWNvbmQgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVxUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG90aGVyUHJvcGVydHlOYW1lKSB7Ci0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtlcVByb3BlcnR5XSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl0gYW5kIG90aGVyIHByb3BlcnR5IG5hbWUgWyIrb3RoZXJQcm9wZXJ0eU5hbWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSApOwotCQl9CQkKLQkJQ3JpdGVyaW9uIGMgPSBSZXN0cmljdGlvbnMuZXFQcm9wZXJ0eSggcHJvcGVydHlOYW1lLCBvdGhlclByb3BlcnR5TmFtZSApOwotCQkKLQkJaWYoaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpKSB7Ci0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoYyk7Ci0JCX1lbHNlIHsKLQkJCXRoaXMuY3JpdGVyaWEuYWRkKGMpOwotCQl9CQkKLQkJcmV0dXJuIGM7CQkKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDcml0ZXJpb24gdGhhdCBjb21wYXJlcyB0byBjbGFzcyBwcm9wZXJ0aWVzIGZvciAhZXF1YWxpdHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBmaXJzdCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG90aGVyUHJvcGVydHlOYW1lIFRoZSBzZWNvbmQgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG5lUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG90aGVyUHJvcGVydHlOYW1lKSB7Ci0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtuZVByb3BlcnR5XSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl0gYW5kIG90aGVyIHByb3BlcnR5IG5hbWUgWyIrb3RoZXJQcm9wZXJ0eU5hbWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5uZVByb3BlcnR5KCBwcm9wZXJ0eU5hbWUsIG90aGVyUHJvcGVydHlOYW1lICk7Ci0JCQotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0JCQotCQlyZXR1cm4gYzsJCQotCX0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIENyaXRlcmlvbiB0aGF0IHRlc3RzIGlmIHRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIGZpcnN0IHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gb3RoZXJQcm9wZXJ0eU5hbWUgVGhlIHNlY29uZCBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiBBIENyaXRlcmlvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ3RQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgb3RoZXJQcm9wZXJ0eU5hbWUpIHsKLQkJaWYoIXZhbGlkYXRlU2ltcGxlRXhwcmVzc2lvbigpKSB7Ci0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW2d0UHJvcGVydHldIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgb3RoZXIgcHJvcGVydHkgbmFtZSBbIitvdGhlclByb3BlcnR5TmFtZSsiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmd0UHJvcGVydHkoIHByb3BlcnR5TmFtZSwgb3RoZXJQcm9wZXJ0eU5hbWUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwkJCi0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBDcml0ZXJpb24gdGhhdCB0ZXN0cyBpZiB0aGUgZmlyc3QgcHJvcGVydHkgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBmaXJzdCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG90aGVyUHJvcGVydHlOYW1lIFRoZSBzZWNvbmQgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG90aGVyUHJvcGVydHlOYW1lKSB7Ci0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtnZVByb3BlcnR5XSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl0gYW5kIG90aGVyIHByb3BlcnR5IG5hbWUgWyIrb3RoZXJQcm9wZXJ0eU5hbWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5nZVByb3BlcnR5KCBwcm9wZXJ0eU5hbWUsIG90aGVyUHJvcGVydHlOYW1lICk7Ci0JCQotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0JCQotCQlyZXR1cm4gYzsJCQotCX0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIENyaXRlcmlvbiB0aGF0IHRlc3RzIGlmIHRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIGZpcnN0IHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gb3RoZXJQcm9wZXJ0eU5hbWUgVGhlIHNlY29uZCBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiBBIENyaXRlcmlvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3QgbHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgb3RoZXJQcm9wZXJ0eU5hbWUpIHsKLQkJaWYoIXZhbGlkYXRlU2ltcGxlRXhwcmVzc2lvbigpKSB7Ci0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW2x0UHJvcGVydHldIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgb3RoZXIgcHJvcGVydHkgbmFtZSBbIitvdGhlclByb3BlcnR5TmFtZSsiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmx0UHJvcGVydHkoIHByb3BlcnR5TmFtZSwgb3RoZXJQcm9wZXJ0eU5hbWUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwkJCi0JfQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgQ3JpdGVyaW9uIHRoYXQgdGVzdHMgaWYgdGhlIGZpcnN0IHByb3BlcnR5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgZmlyc3QgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBvdGhlclByb3BlcnR5TmFtZSBUaGUgc2Vjb25kIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBsZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBvdGhlclByb3BlcnR5TmFtZSkgewotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbbGVQcm9wZXJ0eV0gd2l0aCBwcm9wZXJ0eU5hbWUgWyIrcHJvcGVydHlOYW1lKyJdIGFuZCBvdGhlciBwcm9wZXJ0eSBuYW1lIFsiK290aGVyUHJvcGVydHlOYW1lKyJdIG5vdCBhbGxvd2VkIGhlcmUuIikpOwotCQl9CQkKLQkJQ3JpdGVyaW9uIGMgPSBSZXN0cmljdGlvbnMubGVQcm9wZXJ0eSggcHJvcGVydHlOYW1lLCBvdGhlclByb3BlcnR5TmFtZSApOwotCQkKLQkJaWYoaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpKSB7Ci0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoYyk7Ci0JCX1lbHNlIHsKLQkJCXRoaXMuY3JpdGVyaWEuYWRkKGMpOwotCQl9CQkKLQkJcmV0dXJuIGM7CQkKLQl9CQotCS8qKgotCSAqIENyZWF0ZXMgYSAiZ3JlYXRlciB0aGFuIiBDcml0ZXJpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSBUaGUgcHJvcGVydHkgdmFsdWUKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBndChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbZ3RdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWUgWyIrcHJvcGVydHlWYWx1ZSsiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmd0KCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwkJCi0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSAiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIiBDcml0ZXJpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSBUaGUgcHJvcGVydHkgdmFsdWUKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbZ2VdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWUgWyIrcHJvcGVydHlWYWx1ZSsiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmdlKCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwkJCi0JfQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgImxlc3MgdGhhbiIgQ3JpdGVyaW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlCi0JICogQHJldHVybiBBIENyaXRlcmlvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3QgbHQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYoIXZhbGlkYXRlU2ltcGxlRXhwcmVzc2lvbigpKSB7Ci0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW2x0XSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl0gYW5kIHZhbHVlIFsiK3Byb3BlcnR5VmFsdWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5sdCggcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlICk7Ci0JCQotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0JCQotCQlyZXR1cm4gYzsJCQotCX0JCi0JLyoqCi0JICogQ3JlYXRlcyBhICJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iIENyaXRlcmlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlIFRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtsZV0gd2l0aCBwcm9wZXJ0eU5hbWUgWyIrcHJvcGVydHlOYW1lKyJdIGFuZCB2YWx1ZSBbIitwcm9wZXJ0eVZhbHVlKyJdIG5vdCBhbGxvd2VkIGhlcmUuIikpOwotCQl9CQkKLQkJQ3JpdGVyaW9uIGMgPSBSZXN0cmljdGlvbnMubGUoIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSApOwotCQkKLQkJaWYoaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpKSB7Ci0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoYyk7Ci0JCX1lbHNlIHsKLQkJCXRoaXMuY3JpdGVyaWEuYWRkKGMpOwotCQl9CQkKLQkJcmV0dXJuIGM7CQkKLQl9CQotCS8qKgotCSAqIENyZWF0ZXMgYW4gImVxdWFscyIgQ3JpdGVyaW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHJldHVybiBBIENyaXRlcmlvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXEoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsJCQotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbZXFdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWUgWyIrcHJvcGVydHlWYWx1ZSsiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmVxKCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ3JpdGVyaW9uIHdpdGggZnJvbSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgYW5kICJsaWtlIiBleHByZXNzaW9uCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbGlrZSB2YWx1ZQotCSAqIAotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxpa2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKSB7CQkKLQkJaWYoIXZhbGlkYXRlU2ltcGxlRXhwcmVzc2lvbigpKSB7Ci0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW2xpa2VdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWUgWyIrdmFsdWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5saWtlKCBwcm9wZXJ0eU5hbWUsIHZhbHVlICk7Ci0JCQotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0JCQotCQlyZXR1cm4gYzsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIENyaXRlcmlvbiB3aXRoIGZyb20gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCAiaWxpa2UiIChhIGNhc2Ugc2Vuc2l0aXZlIHZlcnNpb24gb2YgImxpa2UiKSBleHByZXNzaW9uCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgaWxpa2UgdmFsdWUKLQkgKiAKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBpbGlrZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpIHsJCQotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbaWxpa2VdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWUgWyIrdmFsdWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5pbGlrZSggcHJvcGVydHlOYW1lLCB2YWx1ZSApOwotCQkKLQkJaWYoaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpKSB7Ci0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoYyk7Ci0JCX1lbHNlIHsKLQkJCXRoaXMuY3JpdGVyaWEuYWRkKGMpOwotCQl9CQkKLQkJcmV0dXJuIGM7Ci0JfQkJCi0JLyoqCi0JICogQXBwbHlzIGEgImluIiBjb250cmFpbiBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzIEEgY29sbGVjdGlvbiBvZiB2YWx1ZXMKLQkgKiAKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBpbihTdHJpbmcgcHJvcGVydHlOYW1lLCBDb2xsZWN0aW9uIHZhbHVlcykgewkJCi0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtpbl0gd2l0aCBwcm9wZXJ0eU5hbWUgWyIrcHJvcGVydHlOYW1lKyJdIGFuZCB2YWx1ZXMgWyIrdmFsdWVzKyJdIG5vdCBhbGxvd2VkIGhlcmUuIikpOwotCQl9CQkKLQkJQ3JpdGVyaW9uIGMgPSBSZXN0cmljdGlvbnMuaW4oIHByb3BlcnR5TmFtZSwgdmFsdWVzICk7Ci0JCQotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0JCQotCQlyZXR1cm4gYzsKLQl9Ci0JLyoqCi0JICogQXBwbHlzIGEgImluIiBjb250cmFpbiBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzIEEgY29sbGVjdGlvbiBvZiB2YWx1ZXMKLQkgKiAKLQkgKiBAcmV0dXJuIEEgQ3JpdGVyaW9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBpbihTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3RbXSB2YWx1ZXMpIHsJCQotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbaW5dIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgdmFsdWVzIFsiK3ZhbHVlcysiXSBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmluKCBwcm9wZXJ0eU5hbWUsIHZhbHVlcyApOwotCQkKLQkJaWYoaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpKSB7Ci0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoYyk7Ci0JCX1lbHNlIHsKLQkJCXRoaXMuY3JpdGVyaWEuYWRkKGMpOwotCQl9CQkKLQkJcmV0dXJuIGM7Ci0JfQotCQotCS8qKgotCSAqIE9yZGVycyBieSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgKGRlZmF1bHRzIHRvIGFzY2VuZGluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIG9yZGVyIGJ5Ci0JICogQHJldHVybiBBIE9yZGVyIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBvcmRlcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmKHRoaXMuY3JpdGVyaWEgPT0gbnVsbCkKLQkJCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW29yZGVyXSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl1ub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJCi0JCU9yZGVyIG8gPSBPcmRlci5hc2MocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5jcml0ZXJpYS5hZGRPcmRlcihvKTsKLQkJCi0JCXJldHVybiBvOwotCX0KLQotCS8qKgotCSAqIE9yZGVycyBieSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgYW5kIGRpcmVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gb3JkZXIgYnkKLQkgKiBAcGFyYW0gZGlyZWN0aW9uIEVpdGhlciAiYXNjIiBmb3IgYXNjZW5kaW5nIG9yICJkZXNjIiBmb3IgZGVzY2VuZGluZwotCSAqIAotCSAqIEByZXR1cm4gQSBPcmRlciBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3Qgb3JkZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGRpcmVjdGlvbikgewotCQlpZih0aGlzLmNyaXRlcmlhID09IG51bGwpCi0JCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtvcmRlcl0gd2l0aCBwcm9wZXJ0eU5hbWUgWyIrcHJvcGVydHlOYW1lKyJdbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCU9yZGVyIG87Ci0JCWlmKGRpcmVjdGlvbi5lcXVhbHMoIE9SREVSX0RFU0NFTkRJTkcgKSkgewotCQkJbyA9IE9yZGVyLmRlc2MocHJvcGVydHlOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW8gPSBPcmRlci5hc2MocHJvcGVydHlOYW1lKTsKLQkJfQotCQl0aGlzLmNyaXRlcmlhLmFkZE9yZGVyKG8pOwotCQkKLQkJcmV0dXJuIG87Ci0JfQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgQ3JpdGVyaW9uIHRoYXQgY29udHJhaW5zIGEgY29sbGVjdGlvbiBwcm9wZXJ0eSBieSBzaXplCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIGNvbnN0cmFpbiBieQotCSAqIAotCSAqIEByZXR1cm4gQSBDcml0ZXJpb24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNpemVFcShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgc2l6ZSkgewkJCi0JCWlmKCF2YWxpZGF0ZVNpbXBsZUV4cHJlc3Npb24oKSkgewotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFtzaXplRXFdIHdpdGggcHJvcGVydHlOYW1lIFsiK3Byb3BlcnR5TmFtZSsiXSBhbmQgc2l6ZSBbIitzaXplKyJdIG5vdCBhbGxvd2VkIGhlcmUuIikpOwotCQl9CQkKLQkJQ3JpdGVyaW9uIGMgPSBSZXN0cmljdGlvbnMuc2l6ZUVxKCBwcm9wZXJ0eU5hbWUsIHNpemUgKTsKLQkJCi0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQkJCi0JCXJldHVybiBjOwotCX0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhICJub3QgZXF1YWwiIENyaXRlcmlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlIFRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG5lKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CQkKLQkJaWYoIXZhbGlkYXRlU2ltcGxlRXhwcmVzc2lvbigpKSB7Ci0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gW25lXSB3aXRoIHByb3BlcnR5TmFtZSBbIitwcm9wZXJ0eU5hbWUrIl0gYW5kIHZhbHVlIFsiK3Byb3BlcnR5VmFsdWUrIl0gbm90IGFsbG93ZWQgaGVyZS4iKSk7Ci0JCX0JCQotCQlDcml0ZXJpb24gYyA9IFJlc3RyaWN0aW9ucy5uZSggcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlICk7Ci0JCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKGMpOwotCQl9ZWxzZSB7Ci0JCQl0aGlzLmNyaXRlcmlhLmFkZChjKTsKLQkJfQotCQlyZXR1cm4gYzsKLQl9CQotCi0JLyoqCi0JICogQ3JlYXRlcyBhICJiZXR3ZWVuIiBDcml0ZXJpb24gYmFzZWQgb24gdGhlIHByb3BlcnR5IG5hbWUgYW5kIHNwZWNpZmllZCBsbyBhbmQgaGkgdmFsdWVzCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBsbyBUaGUgbG93IHZhbHVlCi0JICogQHBhcmFtIGhpIFRoZSBoaWdoIHZhbHVlCi0JICogQHJldHVybiBBIENyaXRlcmlvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBPYmplY3QgYmV0d2VlbihTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbG8sIE9iamVjdCBoaSkgewotCQlpZighdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkpIHsKLQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbYmV0d2Vlbl0gd2l0aCBwcm9wZXJ0eU5hbWUgWyIrcHJvcGVydHlOYW1lKyJdICBub3QgYWxsb3dlZCBoZXJlLiIpKTsKLQkJfQkJCi0JCUNyaXRlcmlvbiBjID0gUmVzdHJpY3Rpb25zLmJldHdlZW4oIHByb3BlcnR5TmFtZSwgbG8saGkpOwotCQlpZihpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkpIHsKLQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJfWVsc2UgewotCQkJdGhpcy5jcml0ZXJpYS5hZGQoYyk7Ci0JCX0KLQkJcmV0dXJuIGM7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVOb2RlKCBuYW1lLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAgKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVTaW1wbGVFeHByZXNzaW9uKCkgewotCQlpZih0aGlzLmNyaXRlcmlhID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCi0JCWlmKCFpc0luc2lkZUxvZ2ljYWxFeHByZXNzaW9uKCkgJiYKLQkJICAgISh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIFByb3h5KSAmJgotCQkgICB0aGlzLnBhcmVudCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNJbnNpZGVMb2dpY2FsRXhwcmVzc2lvbigpIHsKLQkJaWYodGhpcy5sb2dpY2FsRXhwcmVzc2lvbnMuc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nIGN1cnJlbnRMb2dpY2FsRXhwcmVzc2lvbiA9IChTdHJpbmcpdGhpcy5sb2dpY2FsRXhwcmVzc2lvbnMuZ2V0KCB0aGlzLmxvZ2ljYWxFeHByZXNzaW9ucy5zaXplKCkgLSAxICk7Ci0JCQlpZihjdXJyZW50TG9naWNhbEV4cHJlc3Npb24uZXF1YWxzKCBBTkQgKSB8fAotCQkJICAgY3VycmVudExvZ2ljYWxFeHByZXNzaW9uLmVxdWFscyggT1IgKSB8fAotCQkJICAgY3VycmVudExvZ2ljYWxFeHByZXNzaW9uLmVxdWFscyggTk9UICkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgewkJCi0JCWlmKG5hbWUuZXF1YWxzKFJPT1RfQ0FMTCkgfHwgbmFtZS5lcXVhbHMoTElTVF9DQUxMKSB8fCBuYW1lLmVxdWFscyhHRVRfQ0FMTCkpIHsKLQkJCQotCQkJaWYodGhpcy5jcml0ZXJpYSAhPSBudWxsKQotCQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbCB0byBbIiArIG5hbWUgKyAiXSBub3Qgc3VwcG9ydGVkIGhlcmUiKSk7Ci0JCQkJCi0JCQlpZihuYW1lLmVxdWFscyhHRVRfQ0FMTCkpCi0JCQkJdGhpcy51bmlxdWVSZXN1bHQgPSB0cnVlOwotCQkJCi0JCQlpZihUcmFuc2FjdGlvblN5bmNocm9uaXphdGlvbk1hbmFnZXIuaGFzUmVzb3VyY2Uoc2Vzc2lvbkZhY3RvcnkpKSB7Ci0JCQkJdGhpcy5wYXJ0aWNpcGF0ZSA9IHRydWU7Ci0JCQkJdGhpcy5zZXNzaW9uID0gKChTZXNzaW9uSG9sZGVyKVRyYW5zYWN0aW9uU3luY2hyb25pemF0aW9uTWFuYWdlci5nZXRSZXNvdXJjZShzZXNzaW9uRmFjdG9yeSkpLmdldFNlc3Npb24oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2Vzc2lvbiA9IHNlc3Npb25GYWN0b3J5Lm9wZW5TZXNzaW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmNyaXRlcmlhID0gdGhpcy5zZXNzaW9uLmNyZWF0ZUNyaXRlcmlhKHRhcmdldENsYXNzKTsKLQkJCXRoaXMuY3JpdGVyaWFQcm94eSA9IG5ldyBFeHRlbmRQcm94eSgpOwotCQkJdGhpcy5jcml0ZXJpYVByb3h5LnNldEFkYXB0ZWUodGhpcy5jcml0ZXJpYSk7Ci0JCQl0aGlzLnBhcmVudCA9IHJlc3VsdFByb3h5OwotCQkJCQkJCi0JCQlyZXR1cm4gcmVzdWx0UHJveHk7Ci0JCX0gZWxzZSBpZihuYW1lLmVxdWFscyggQU5EICkgfHwKLQkJCQkgIG5hbWUuZXF1YWxzKCBPUiApIHx8Ci0JCQkJICBuYW1lLmVxdWFscyggTk9UICkpIHsKLQkJCWlmKHRoaXMuY3JpdGVyaWEgPT0gbnVsbCkKLQkJCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGwgdG8gWyIgKyBuYW1lICsgIl0gbm90IHN1cHBvcnRlZCBoZXJlIikpOwotCQkJCi0JCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9ucy5hZGQobmFtZSk7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQljbG9zZVNlc3Npb25Gb2xsb3dpbmdFeGNlcHRpb24oKTsKLQkJdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oKFN0cmluZykgbmFtZSwgZ2V0Q2xhc3MoKSwgbmV3IE9iamVjdFtdIHt9KSA7CQkKLQl9CQotCQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUNvbXBsZXRlZChPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgewotCQlpZihub2RlIGluc3RhbmNlb2YgUHJveHkpIHsKLQkJCWlmKCF1bmlxdWVSZXN1bHQpIHsKLQkJCQlyZXN1bHRQcm94eS5zZXRBZGFwdGVlKAotCQkJCQkJdGhpcy5jcml0ZXJpYS5saXN0KCkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0UHJveHkuc2V0QWRhcHRlZSgKLQkJCQkJCXRoaXMuY3JpdGVyaWEudW5pcXVlUmVzdWx0KCkKLQkJCQkpOwotCQkJfQotCQkJdGhpcy5jcml0ZXJpYSA9IG51bGw7Ci0JCQlpZighdGhpcy5wYXJ0aWNpcGF0ZSkgewotCQkJCXRoaXMuc2Vzc2lvbi5jbG9zZSgpOwotCQkJfQotCQl9CQkKLQkJZWxzZSBpZihub2RlLmVxdWFscyggQU5EICkgfHwKLQkJCQlub2RlLmVxdWFscyggT1IgKSkgewotCQkJCi0JCQlpZih0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5zaXplKCkgPCAyKQotCQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9naWNhbCBleHByZXNzaW9uIFsiICsgbm9kZSArIl0gbXVzdCBjb250YWluIGF0IGxlYXN0IDIgZXhwcmVzc2lvbnMiKSk7Ci0JCQkKLQkJCUNyaXRlcmlvbiBsaHMgPSAoQ3JpdGVyaW9uKXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLnJlbW92ZSh0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5zaXplKCkgLSAxKTsKLQkJCUNyaXRlcmlvbiByaHMgPSAoQ3JpdGVyaW9uKXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLnJlbW92ZSh0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5zaXplKCkgLSAxKTsKLQkJCQotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgUHJveHkpIHsKLQkJCQlpZihub2RlLmVxdWFscyggQU5EICkpCi0JCQkJCXRoaXMuY3JpdGVyaWEuYWRkKCBSZXN0cmljdGlvbnMuYW5kKCBsaHMsIHJocyApICk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNyaXRlcmlhLmFkZCggUmVzdHJpY3Rpb25zLm9yKCBsaHMsIHJocyApICk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBhcmVudC5lcXVhbHMoIEFORCApIHx8Ci0JCQkJCXBhcmVudC5lcXVhbHMoIE9SICkpIHsKLQkJCQkKLQkJCQlpZihub2RlLmVxdWFscyggQU5EICkpCi0JCQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZCggUmVzdHJpY3Rpb25zLmFuZCggbGhzLCByaHMgKSApOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5sb2dpY2FsRXhwcmVzc2lvbkFyZ3MuYWRkKCBSZXN0cmljdGlvbnMub3IoIGxocywgcmhzICkgKTsKLQkJCQkKLQkJCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9ucy5yZW1vdmUodGhpcy5sb2dpY2FsRXhwcmVzc2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihub2RlLmVxdWFscyhOT1QpKSB7Ci0JCQlpZih0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5zaXplKCkgPCAxKQotCQkJCXRocm93UnVudGltZUV4Y2VwdGlvbiggbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9naWNhbCBleHByZXNzaW9uIFsiICsgbm9kZSArIl0gbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZXhwcmVzc2lvbiIpKTsKLQkJCQotCQkJQ3JpdGVyaW9uIGMgPSAoQ3JpdGVyaW9uKXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLnJlbW92ZSh0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5zaXplKCkgLSAxKTsKLQkJCQotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgUHJveHkpIHsKLQkJCQl0aGlzLmNyaXRlcmlhLmFkZCggUmVzdHJpY3Rpb25zLm5vdCggYyApICk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBhcmVudC5lcXVhbHMoIEFORCApIHx8Ci0JCQkJCXBhcmVudC5lcXVhbHMoIE9SICkgfHwKLQkJCQkJcGFyZW50LmVxdWFscyggTk9UICkpIHsKLQkJCQl0aGlzLmxvZ2ljYWxFeHByZXNzaW9uQXJncy5hZGQoIFJlc3RyaWN0aW9ucy5ub3QoIGMgKSApOwotCQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25zLnJlbW92ZSh0aGlzLmxvZ2ljYWxFeHByZXNzaW9ucy5zaXplKCkgLSAxKTsKLQkJCX0JCQkKLQkJfQotCQlzdXBlci5ub2RlQ29tcGxldGVkKHBhcmVudCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gd2hlcmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgc2Vzc2lvbiBnZXRzIGNsb3NlZAotCSAqLwotCXByaXZhdGUgdm9pZCB0aHJvd1J1bnRpbWVFeGNlcHRpb24oUnVudGltZUV4Y2VwdGlvbiB0KSB7Ci0JCWNsb3NlU2Vzc2lvbkZvbGxvd2luZ0V4Y2VwdGlvbigpOwotCQl0aHJvdyB0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VTZXNzaW9uRm9sbG93aW5nRXhjZXB0aW9uKCkgewotCQlpZih0aGlzLnNlc3Npb24gIT0gbnVsbCAmJiB0aGlzLnNlc3Npb24uaXNPcGVuKCkgJiYgIXRoaXMucGFydGljaXBhdGUpIHsKLQkJCXRoaXMuc2Vzc2lvbi5jbG9zZSgpOwotCQl9Ci0JCWlmKHRoaXMuY3JpdGVyaWEgIT0gbnVsbCkgewotCQkJdGhpcy5jcml0ZXJpYSA9IG51bGw7Ci0JCX0JCQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNyZWF0ZU5vZGUobmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgewotCQlpZih0aGlzLmNyaXRlcmlhID09IG51bGwpCi0JCQl0aHJvd1J1bnRpbWVFeGNlcHRpb24oIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGwgdG8gWyIgKyBuYW1lICsgIl0gbm90IHN1cHBvcnRlZCBoZXJlIikpOwotCQkKLQkJQ3JpdGVyaW9uIGMgPSBudWxsOwkJCi0JCWlmKG5hbWUuZXF1YWxzKElEX0VRVUFMUykpIHsKLQkJCWMgPSBSZXN0cmljdGlvbnMuaWRFcSh2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkKLQkJCWlmKAluYW1lLmVxdWFscyggSVNfTlVMTCApIHx8Ci0JCQkJbmFtZS5lcXVhbHMoIElTX05PVF9OVUxMICkgfHwJCi0JCQkJbmFtZS5lcXVhbHMoIElTX0VNUFRZICkgfHwKLQkJCQluYW1lLmVxdWFscyggSVNfTk9UX0VNUFRZICkpIHsKLQkJCQlpZighKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsIHRvIFsiICsgbmFtZSArICJdIHdpdGggdmFsdWUgWyIrdmFsdWUrIl0gcmVxdWlyZXMgYSBTdHJpbmcgdmFsdWUuIikpOwotCQkJCQotCQkJCWlmKG5hbWUuZXF1YWxzKCBJU19OVUxMICkpIHsJCQkJCi0JCQkJCWMgPSBSZXN0cmljdGlvbnMuaXNOdWxsKCAoU3RyaW5nKXZhbHVlICkgOwkKLQkJCQl9Ci0JCQkJZWxzZSBpZihuYW1lLmVxdWFscyggSVNfTk9UX05VTEwgKSkgewotCQkJCQljID0gUmVzdHJpY3Rpb25zLmlzTm90TnVsbCggKFN0cmluZyl2YWx1ZSApOwotCQotCQkJCX0KLQkJCQllbHNlIGlmKG5hbWUuZXF1YWxzKCBJU19FTVBUWSApKSB7Ci0JCQkJCWMgPSBSZXN0cmljdGlvbnMuaXNFbXB0eSggKFN0cmluZyl2YWx1ZSApOwotCQkJCQl0aGlzLmNyaXRlcmlhLmFkZCggYyApOwkJCQotCQkJCX0KLQkJCQllbHNlIGlmKG5hbWUuZXF1YWxzKCBJU19OT1RfRU1QVFkgKSkgewotCQkJCQljID0gUmVzdHJpY3Rpb25zLmlzTm90RW1wdHkoIChTdHJpbmcpdmFsdWUgKTsKLQkJCQkJdGhpcy5jcml0ZXJpYS5hZGQoIGMgKTsJCQkKLQkJCQl9CQkKLQkJCX0KLQkJfQotCQlpZihjICE9IG51bGwpIHsKLQkJCWlmKGlzSW5zaWRlTG9naWNhbEV4cHJlc3Npb24oKSkgewotCQkJCXRoaXMubG9naWNhbEV4cHJlc3Npb25BcmdzLmFkZChjKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY3JpdGVyaWEuYWRkKCBjICk7Ci0JCQl9Ci0JCQlyZXR1cm4gYzsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lU3RyaW5nID0gKFN0cmluZyluYW1lOwotCQkJbmFtZVN0cmluZyA9IFNFVFRFUl9QUkVGSVggKyBuYW1lU3RyaW5nLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBuYW1lU3RyaW5nLnN1YnN0cmluZygxKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFByb3h5KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljcml0ZXJpYVByb3h5Lmludm9rZU1ldGhvZChuYW1lU3RyaW5nLCB2YWx1ZSk7Ci0JCQkJCQlyZXR1cm4gdGhpcy5jcml0ZXJpYTsKLQkJCQkJfQotCQkJCQljYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotCQkJCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihuYW1lU3RyaW5nLCBnZXRDbGFzcygpLCBuZXcgT2JqZWN0W10ge3ZhbHVlfSkgKTsKLQkJCQkJfQotCQkJfQotCQkJdGhyb3dSdW50aW1lRXhjZXB0aW9uKCBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihuYW1lU3RyaW5nLCBnZXRDbGFzcygpLCBuZXcgT2JqZWN0W10ge3ZhbHVlfSkpOwotCQl9Ci0JCXJldHVybiBjOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3BhZ2VmbG93L0Zsb3cuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvcGFnZWZsb3cvRmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ4NWZjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvcGFnZWZsb3cvRmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2UgZ3JhaWxzLnBhZ2VmbG93OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuc3R5bGUuVG9TdHJpbmdDcmVhdG9yOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogPHA+U2ltcGxlIGNvbnRhaW5lciBjbGFzcyBmb3IgYSBwYWdlIGZsb3cuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDksIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEZsb3cgewotCi0JcHJpdmF0ZSBMaXN0IHN0YXRlcyA9IG51bGw7Ci0JCi0JcHVibGljIEZsb3coKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0YXRlKFN0YXRlIHN0YXRlKSB7Ci0JCUFzc2VydC5ub3ROdWxsKHN0YXRlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5zdGF0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdGF0ZSB0bXBTdGF0ZSA9IChTdGF0ZSlpdGVyLm5leHQoKTsKLQkJCWlmICh0bXBTdGF0ZS5nZXRJZCgpLmVxdWFscyhzdGF0ZS5nZXRJZCgpKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZsb3cgYWxyZWFkeSBoYXMgYSBzdGF0ZSB3aXRoIGlkIFsiICsgdG1wU3RhdGUuZ2V0SWQoKSArICJdISIpOwotCQkJfQotCQl9Ci0JCXRoaXMuc3RhdGVzLmFkZChzdGF0ZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFN0YXRlcygpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGVzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmV3IFRvU3RyaW5nQ3JlYXRvcih0aGlzKS5hcHBlbmQodGhpcy5zdGF0ZXMpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9QYWdlRmxvd0J1aWxkZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvcGFnZWZsb3cvUGFnZUZsb3dCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOWNkNzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9QYWdlRmxvd0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBncmFpbHMucGFnZWZsb3c7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiA8cD5CdWlsZGVyIHRvIGNyZWF0ZSBhIHBhZ2UgZmxvdyBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCA5LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRmxvd0J1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPVyA9ICJmbG93IjsKLQkKLQlwdWJsaWMgUGFnZUZsb3dCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZsb3cgJiYgY2hpbGQgaW5zdGFuY2VvZiBTdGF0ZSkgewotCQkJKChGbG93KXBhcmVudCkuYWRkU3RhdGUoKFN0YXRlKWNoaWxkKTsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdGF0ZSAmJiBjaGlsZCBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHsKLQkJCSgoU3RhdGUpcGFyZW50KS5hZGRUcmFuc2l0aW9uKChUcmFuc2l0aW9uKWNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjbGFzc2VzIFsiICsgcGFyZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gKHBhcmVudCkgYW5kIFsiICsgY2hpbGQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAoY2hpbGQpISIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lKSB7Ci0JCWlmIChGTE9XLmVxdWFscyhuYW1lKSAmJiBnZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGbG93KCk7Ci0JCX0gZWxzZSBpZiAoZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgRmxvdykgewotCQkJcmV0dXJuIG5ldyBTdGF0ZSgoU3RyaW5nKW5hbWUsIG5ldyBIYXNoTWFwKCkpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbCB0byBbIiArIG5hbWUgKyAiXSB3aXRob3V0IGF0dHJpYnV0ZXMgaXMgbm90IHN1cHBvcnRlZCEiKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChnZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbCB0byBbIiArIG5hbWUgKyAiXSB3aXRoIHZhbHVlIFsiICsgdmFsdWUgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotCQl9IGVsc2UgaWYgKGdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEZsb3cpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXRlIFsiICsgbmFtZSArICJdIHJlcXVpcmVzIG9uZSBvZiB0aGVzZSBhdHRyaWJ1dGVzOiBbYWN0aW9uLCB2aWV3LCBkZWNpc2lvbiwgc3ViZmxvd10hIik7Ci0JCX0gZWxzZSBpZiAoZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgU3RhdGUgJiYgISgoU3RhdGUpZ2V0Q3VycmVudCgpKS5pc0VuZFN0YXRlKCkpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFyZ2V0IHN0YXRlIGlkIGlzIHJlcXVpcmVkIGFzIHZhbHVlIGZvciB0cmFuc2l0aW9uIFsiICsgbmFtZSArICJdLCBzdGF0ZSBbIiArICgoU3RhdGUpZ2V0Q3VycmVudCgpKS5nZXRJZCgpICsgIl0hIik7Ci0JCQl9IGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFyZ2V0IHN0YXRlIGlkIG11c3QgYmUgYSBzdHJpbmcgdmFsdWUgZm9yIHRyYW5zaXRpb24gWyIgKyBuYW1lICsgIl0sIHN0YXRlIFsiICsgKChTdGF0ZSlnZXRDdXJyZW50KCkpLmdldElkKCkgKyAiXSEiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBUcmFuc2l0aW9uKChTdGF0ZSlnZXRDdXJyZW50KCksIG5hbWUudG9TdHJpbmcoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgU3RhdGUgJiYgKChTdGF0ZSlnZXRDdXJyZW50KCkpLmlzRW5kU3RhdGUoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdHJhbnNpdGlvbnMgYWxsb3dlZCBmb3IgZW5kIHN0YXRlIFsiICsgKChTdGF0ZSlnZXRDdXJyZW50KCkpLmdldElkKCkgKyAiXSEiKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlsiICsgbmFtZSArIl0gbm90IGFsbG93ZWQgYXMgY2hpbGQhIik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChnZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbCB0byBbIiArIG5hbWUgKyAiXSB3aXRoIGF0dHJpYnV0ZXMgWyIgKyBhdHRyaWJ1dGVzICsgIl0gaXMgbm90IHN1cHBvcnRlZCEiKTsKLQkJfSBlbHNlIGlmIChnZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBGbG93KSB7Ci0JCQlpZiAoU3RyaW5nVXRpbHMuaXNCbGFuaygoU3RyaW5nKW5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RhdGUgaWQgaXMgcmVxdWlyZWQhIik7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXRlKChTdHJpbmcpbmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgU3RhdGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGwgdG8gWyIgKyBuYW1lICsgIl0gd2l0aCBhdHRyaWJ1dGVzIGlzIG5vdCBhbGxvd2VkISIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWyIgKyBuYW1lICsgIl0gbm90IGFsbG93ZWQgYSBjaGlsZCEiKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsIHRvIFsiICsgbmFtZSArICJdIHdpdGggYXR0cmlidXRlcyBhbmQgdmFsdWUgaXMgbm90IGFsbG93ZWQhIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3BhZ2VmbG93L1N0YXRlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3BhZ2VmbG93L1N0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDFkOWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9TdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIGdyYWlscy5wYWdlZmxvdzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuc3R5bGUuVG9TdHJpbmdDcmVhdG9yOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkFjdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRmxvd0F0dHJpYnV0ZU1hcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHQ7Ci0KLS8qKgotICogPHA+U2ltcGxlIGNvbnRhaW5lciBvYmplY3QgZm9yIGEgc3RhdGUgaW4gYSBwYWdlIGZsb3cuCi0gKiAKLSAqIDxwPlRoaXMgY2xhc3MgY2FuIG1hcCBhIHZpZXcgc3RhdGUsIGFuIGFjdGlvbiBzdGF0ZSwgYSBzdWIgZmxvdyBzdGF0ZQotICogb3IgYSBkZWNpc2lvbiBzdGF0ZS4KLSAqIAotICogPHA+T25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBtdXN0IGJlIHNldCwgb3RoZXJ3aXNlCi0gKiB0aGUgc3RhdGUgd2lsbCBiZSByZWdhcmRlZCBhcyBhbiBlbmQgc3RhdGU6Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2FjdGlvbn0KLSAqIDxsaT57QGxpbmsgI2FjdGlvbkNsYXNzfQotICogPGxpPntAbGluayAjYWN0aW9uQ2xvc3VyZX0KLSAqIDxsaT57QGxpbmsgI2FjdGlvbkZvcm1EZXRhaWxzfQotICogPGxpPntAbGluayAjdmlld05hbWV9Ci0gKiA8bGk+e0BsaW5rICN2aWV3Q2xvc3VyZX0KLSAqIDxsaT57QGxpbmsgI2RlY2lzaW9uRXhwcmVzc2lvbn0KLSAqIDxsaT57QGxpbmsgI2RlY2lzaW9uQ2xvc3VyZX0KLSAqIDxsaT57QGxpbmsgI3N1YkZsb3dJZH0KLSAqIDwvdWw+Ci0gKiAKLSAqIDxwPkluIGNhc2Ugb25lIG9mIHRoZSB7QGxpbmsgI2lzQWN0aW9uU3RhdGUoKX0sIHtAbGluayAjaXNWaWV3U3RhdGUoKX0sIHtAbGluayAjaXNEZWNpc2lvblN0YXRlKCl9IG9yCi0gKiB7QGxpbmsgI2lzU3ViZmxvd1N0YXRlKCl9IG1ldGhvZHMgaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoZSB7QGxpbmsgI3ZhbGlkYXRlKCl9IG1ldGhvZCB0aGUgIHJlc3VsdAotICogb2YgdGhvc2UgbWV0aG9kcyBtYXkgYmUgaW5jb3JyZWN0LgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCA5LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OID0gImFjdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0lTSU9OID0gImRlY2lzaW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCRkxPVyA9ICJzdWJmbG93IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUwgPSAibW9kZWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9ICJpbnB1dCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVCA9ICJvdXRwdXQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRVIgPSAibWFwcGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV9TVEFURSA9ICJ0cnVlU3RhdGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRV9TVEFURSA9ICJmYWxzZVN0YXRlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EID0gIm1ldGhvZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9ICJlbmQiOwotCQotCS8qKgotCSAqIDxwPkNsYXNzIHRoYXQgaW1wbGVtZW50cyBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuQWN0aW9uCi0JICogb3IgaGFzIGFuIG5vbi1hYnN0cmFjdCBleGVjdXRlIG1ldGhvZCB0aGF0IHRha2VzIGEKLQkgKiBSZXF1ZXN0Q29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgZWl0aGVyIFN0cmluZyBvcgotCSAqIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5FdmVudC4gVGhlIGNsYXNzIHNob3VsZCBoYXZlCi0JICogYSBwdWJsaWMgbm8tYXJnIGNvbnN0cnVjdG9yLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICogd2lsbCBiZSBjcmVhdGVkIGFzIHVzZWQgYXMgYWN0aW9uIGhhbmRsZXIuCi0JICogCi0JICogPHA+e0BsaW5rICNhY3Rpb25Qcm9wZXJ0aWVzfSB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzCi0JICogb2YgdGhlIGFjdGlvbiBpbnN0YW5jZS4gSWYge0BsaW5rICNhY3Rpb25Qcm9wZXJ0aWVzfSBjb250YWlucwotCSAqIHByb3BlcnRpZXMgbmFtZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgYWN0aW9uIGNsYXNzCi0JICogYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqLwotCXByaXZhdGUgQ2xhc3MgYWN0aW9uQ2xhc3MgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPkEgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkFjdGlvbiBpbnN0YW5jZSB0aGF0IHdpbGwKLQkgKiBiZSB1c2VkIGFzIGFjdGlvbiBoYW5kbGVyLgotCSAqIAotCSAqIDxwPntAbGluayAjYWN0aW9uUHJvcGVydGllc30gd2lsbCBub3QgYmUgdXNlZCB0byBzZXQgdGhlCi0JICogcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqLwotCXByaXZhdGUgQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+QSBjbG9zdXJlIHRoYXQgd2lsbCBoYW5kbGUgdGhlIGFjdGlvbiBsb2dpYy4KLQkgKiAKLQkgKiA8cD5UaGUgY2xvc3VyZSBjYW4gaGF2ZSBvbmUgcGFyYW1ldGVyLCB0aGUKLQkgKiB7QGxpbmsgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlJlcXVlc3RDb250ZXh0fQotCSAqIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQ2xvc3VyZSBhY3Rpb25DbG9zdXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5EZWxlZ2F0ZXMgYWN0aW9uIGhhbmRsaW5nIHRvIHtAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuYWN0aW9uLkZvcm1BY3Rpb259LgotCSAqIAotCSAqIDxwPlRoaXMgaXMgYSBjb252ZW5pZW5jZSBub3RhdGlvbiBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjYWN0aW9uQ2xhc3N9IGFuZAotCSAqIHtAbGluayAjYWN0aW9uUHJvcGVydGllc30uCi0JICogCi0JICogPHA+QWxsIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHtAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuYWN0aW9uLkZvcm1BY3Rpb259IGNhbgotCSAqIGJlIHNwZWNpZmllZCBpbiB0aGUgbWFwLgotCSAqLwotCXByaXZhdGUgTWFwIGFjdGlvbkZvcm1EZXRhaWxzID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5Ib2xkcyBwcm9wZXJ0aWVzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiB7QGxpbmsgI2FjdGlvblByb3BlcnRpZXN9LgotCSAqLwotCXByaXZhdGUgTWFwIGFjdGlvblByb3BlcnRpZXMgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPk1ldGhvZCB0aGF0IGhhcyB0byBiZSBleGVjdXRlZCBvbiBhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYWN0aW9uTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5Ib2xkcyB0aGUgdmlldyBuYW1lIG9mIHRoaXMgc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld05hbWUgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPkEgY2xvc3VyZSB0aGF0IHNob3VsZCByZXR1cm4gdGhlIHZpZXcgbmFtZS4KLQkgKiAKLQkgKiA8cD5UaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBub3QgbnVsbCBhbmQgb2YKLQkgKiB0eXBlIHtAbGluayBTdHJpbmd9IG9yIHtAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRXZlbnR9Ci0JICogb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICovCi0JcHJpdmF0ZSBDbG9zdXJlIHZpZXdDbG9zdXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5Nb2RlbCBuYW1lcyBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBvbiB0aGUgcmVxdWVzdCBjb250ZXh0LgotCSAqIAotCSAqIDxwPklmIGEgdmFsdWUgaXMgYSB7QGxpbmsgQ2xvc3VyZX0gaXQgd2lsbCBiZSBleGVjdXRlZCBldmVyeXRpbWUgdGhlCi0JICogbW9kZWwgbmVlZHMgdG8gYmUgcG9wdWxhdGVkLiBJZiBubyB2YWx1ZSBpcyByZXR1cm5lZCB0aGUgbmFtZSB3aWxsCi0JICogYmUgYWRkZWQgdG8gdGhlIG1vZGVsIHdpdGggYSBudWxsIHZhbHVlLgotCSAqLwotCXByaXZhdGUgTWFwIHZpZXdNb2RlbCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+VGhlIG5hbWUgb3IgaWQgb2YgYSBzdWJmbG93LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YkZsb3dJZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+QSBjbG9zdXJlIHRoYXQgbWFwcyB2YWx1ZXMgaW4gdGhlIGZsb3cgc2NvcGUgdG8gbWFwLiBUaGlzIG1hcAotCSAqIGlzIGFkZGVkIHRvIHRoZSBmbG93IHNjb3BlIG9mIHRoZSBzdWJmbG93IHRoYXQgaXMgc3RhcnRlZC4KLQkgKiAKLQkgKiA8cD5UaGUgY2xvc3VyZSBjYW4gaGF2ZSBvbmUgcGFyYW1ldGVyLCBhIHtAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHR9Ci0JICogaW5zdGFuY2Ugd2hpY2ggaXMgdGhlIHJlcXVlc3QgY29udGV4dCBvZiB0aGUgcGFyZW50IGZsb3cuCi0JICogCi0JICogPHA+VGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgbnVsbCBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWFwfS4KLQkgKiAKLQkgKiA8cD57QGxpbmsgI2F0dHJpYnV0ZU1hcHBlckNsYXNzfSBhbmQge0BsaW5rICNhdHRyaWJ1dGVNYXBwZXJ9IHNob3VsZAotCSAqIGJlIG51bGwgaWYgdGhpcyBmaWVsZCBpcyBzZXQuIAotCSAqLwotCXByaXZhdGUgQ2xvc3VyZSBzdWJGbG93SW5wdXQgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPkEgY2xvc3VyZSB0aGF0IHB1dHMgdmFsdWVzIGluIHRoZSBmbG93IHNjb3BlIG9mIGFuIGVuZGluZyBzdWJmbG93Ci0JICogaW4gdGhlIGZsb3cgc2NvcGUgb2YgdGhlIHJlc3VtaW5nIHBhcmVudCBmbG93IHNjb3BlLgotCSAqIAotCSAqIDxwPlRoZSBjbG9zdXJlIGNhbiBoYXZlIHR3byBwYXJhbWV0ZXJzOiB0aGUgc3ViZmxvdyBzY29wZSBhbmQgdGhlCi0JICogcGFyZW50IGZsb3cgc2NvcGUuCi0JICogCi0JICogPHA+e0BsaW5rICNhdHRyaWJ1dGVNYXBwZXJDbGFzc30gYW5kIHtAbGluayAjYXR0cmlidXRlTWFwcGVyfSBzaG91bGQKLQkgKiBiZSBudWxsIGlmIHRoaXMgZmllbGQgaXMgc2V0LiAKLQkgKi8KLQlwcml2YXRlIENsb3N1cmUgc3ViRmxvd091dHB1dCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+Q2xhc3MgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGbG93QXR0cmlidXRlTWFwcGVyfS4gVGhlIGNsYXNzCi0JICogc2hvdWxkIGhhdmUgYSBwdWJsaWMgbm8tYXJnIGNvbnN0cnVjdG9yLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGlzCi0JICogY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIGFuZCB1c2VkIGFzIGZsb3cgYXR0cmlidXRlIG1hcHBlciBiZXR3ZWVuCi0JICogdGhlIHBhcmVudCBmbG93IGFuZCB0aGUgc3ViZmxvdyBzY29wZXMuCi0JICogCi0JICogPHA+e0BsaW5rICNhdHRyaWJ1dGVNYXBwZXJQcm9wZXJ0aWVzfSB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZQotCSAqIHByb3BlcnRpZXMgb24gdGhpcyBmbG93IGF0dHJpYnV0ZSBtYXBwZXIgYXR0cmlidXRlLiBJZiB7QGxpbmsgI2F0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXN9Ci0JICogY29udGFpbnMgcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgZmxvdyBhdHRyaWJ1dGUKLQkgKiBtYXBwZXIgY2xhc3MgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIDxwPntAbGluayAjc3ViRmxvd0lucHV0fSwge0BsaW5rICNzdWJGbG93T3V0cHV0fSBhbmQge0BsaW5rICNhdHRyaWJ1dGVNYXBwZXJ9Ci0JICogc2hvdWxkIGJlIG51bGwgaWYgdGhpcyBmaWVsZCBpcyBzZXQuIAotCSAqLwotCXByaXZhdGUgQ2xhc3MgYXR0cmlidXRlTWFwcGVyQ2xhc3MgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPntAbGluayBGbG93QXR0cmlidXRlTWFwcGVyfSBpbnN0YW5jZSB1c2VkIGFzIGZsb3cgYXR0cmlidXRlIG1hcHBlcgotCSAqIGJldHdlZW4gdGhlIHBhcmVudCBmbHdvIGFuZCBzdWJmbG93IHNjb3Blcy4KLQkgKiAKLQkgKiA8cD57QGxpbmsgI2F0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXN9IHdpbGwgbm90IGJlIHVzZWQgdG8gc2V0Ci0JICogdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiA8cD57QGxpbmsgI3N1YkZsb3dJbnB1dH0sIHtAbGluayAjc3ViRmxvd091dHB1dH0gYW5kIHtAbGluayAjYXR0cmlidXRlTWFwcGVyQ2xhc3N9Ci0JICogc2hvdWxkIGJlIG51bGwgIGlmIHRoaXMgZmllbGQgaXMgc2V0LgotCSAqLwotCXByaXZhdGUgRmxvd0F0dHJpYnV0ZU1hcHBlciBhdHRyaWJ1dGVNYXBwZXIgPSBudWxsOwotCQotCS8qKgotCSAqIDxwPkhvbGQgcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBmb3IgaW5zdGFuY2VzIGZvciB7QGxpbmsgI2F0dHJpYnV0ZU1hcHBlckNsYXNzfS4KLQkgKi8KLQlwcml2YXRlIE1hcCBhdHRyaWJ1dGVNYXBwZXJQcm9wZXJ0aWVzID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5UaGUgc3RhdGUgdG8gdHJhbnNpdGlvbiB0byBpbiBjYXNlIHRoZSBkZWNpc2lvbiBzdGF0ZSByZXR1cm5zIHRydWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVjaXNpb25UcnVlU3RhdGVJZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+VGhlIHN0YXRlIHRvIHRyYW5zaXRpb24gdG8gaW4gY2FzZSB0aGUgZGVjaXNpb24gc3RhdGUgcmV0dXJucyBmYWxzZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWNpc2lvbkZhbHNlU3RhdGVJZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogPHA+T0dOTCBleHByZXNzaW9uIHRvIHRlc3QgdGhlIG91dGNvbWUgb2YgdGhlIGRlY2lzaW9uIHN0YXRlIGJhc2VkCi0JICogb24gdGhlIHJlcXVlc3QgY29udGV4dC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWNpc2lvbkV4cHJlc3Npb24gPSBudWxsOwotCQotCS8qKgotCSAqIDxwPkEgY2xvc3VyZSB0aGF0IGltcGxlbWVudHMgYSB0ZXN0IHRvIGRldGVybWluZSB0aGUgb3V0Y29tZSBvZgotCSAqIHRoZSBkZWNpc2lvbiBzdGF0ZS4KLQkgKiAKLQkgKiA8cD5UaGUgY2xvc3VyZSBjYW4gaGF2ZSBvbmUgcGFyYW1ldGVyLCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlJlcXVlc3RDb250ZXh0fS4KLQkgKiAKLQkgKiA8cD5WYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKLQkgKiAKLQkgKiA8dWw+Ci0JICogPGxpPnRydWUKLQkgKiA8bGk+ZmFsc2UKLQkgKiA8bGk+e0BsaW5rIEJvb2xlYW4jVFJVRX0KLQkgKiA8bGk+e0BsaW5rIEJvb2xlYW4jRkFMU0V9Ci0JICogPC91bD4KLQkgKi8KLQlwcml2YXRlIENsb3N1cmUgZGVjaXNpb25DbG9zdXJlID0gbnVsbDsKLQkKLQkKLQkvKioKLQkgKiA8cD5UaGUgaWQgb3IgbmFtZSBvZiB0aGlzIHN0YXRlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5UcmFuc2l0aW9ucyBmb3IgdGhpcyBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIExpc3QgdHJhbnNpdGlvbnMgPSBudWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiBlbmRTdGF0ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBTdGF0ZShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoaWQpOwotCQl0aGlzLnRyYW5zaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQlwdWJsaWMgU3RhdGUoU3RyaW5nIGlkLCBNYXAgYXR0cmlidXRlcykgewotCQl0aGlzKGlkKTsKLQkJQXNzZXJ0Lm5vdE51bGwoYXR0cmlidXRlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXRlci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChBQ1RJT04uZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgQUNUSU9OICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdIG11c3Qgbm90IGJlIG51bGwhIik7Ci0JCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCQkJYWN0aW9uQ2xhc3MgPSAoQ2xhc3MpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBY3Rpb24pIHsKLQkJCQkJYWN0aW9uID0gKEFjdGlvbillbnRyeS5nZXRWYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCQlhY3Rpb25Gb3JtRGV0YWlscyA9IChNYXApZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0JCQkJCWFjdGlvbkNsb3N1cmUgPSAoQ2xvc3VyZSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGUgWyIgKyBlbnRyeS5nZXRWYWx1ZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gZm9yIGF0dHJpYnV0ZSBbIiArIEFDVElPTiArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSEiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFZJRVcuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgVklFVyArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSBtdXN0IG5vdCBiZSBudWxsISIpOwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl2aWV3TmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0JCQkJCXZpZXdDbG9zdXJlID0gKENsb3N1cmUpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBWSUVXICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdISIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoREVDSVNJT04uZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgREVDSVNJT04gKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0gbXVzdCBub3QgYmUgbnVsbCEiKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZGVjaXNpb25FeHByZXNzaW9uID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCQkJZGVjaXNpb25DbG9zdXJlID0gKENsb3N1cmUpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBERUNJU0lPTiArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSEiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFNVQkZMT1cuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgU1VCRkxPVyArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSBtdXN0IG5vdCBiZSBudWxsISIpOwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlzdWJGbG93SWQgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBbIiArIGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSBmb3IgYXR0cmlidXRlIFsiICsgU1VCRkxPVyArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSEiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFBST1BFUlRJRVMuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLS8vCQkJCQlhY2NlcHQgdGhpcwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgewotLy8JCQkJCWlmIChpc0FjdGlvblN0YXRlKCkpIHsKLS8vCQkJCQkJYWN0aW9uUHJvcGVydGllcyA9IChNYXApZW50cnkuZ2V0VmFsdWUoKTsKLS8vCQkJCQl9IGVsc2UgaWYgKGlzU3ViZmxvd1N0YXRlKCkpIHsKLS8vCQkJCQkJYXR0cmlidXRlTWFwcGVyUHJvcGVydGllcyA9IChNYXApZW50cnkuZ2V0VmFsdWUoKTsKLS8vCQkJCQl9IGVsc2UgaWYgKGlzVmlld1N0YXRlKCkpIHsKLS8vCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFsiICsgUFJPUEVSVElFUyArICJdIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHZpZXcgc3RhdGUgWyIgKyBpZCArICJdISIpOwotLy8JCQkJCX0gZWxzZSBpZiAoaXNEZWNpc2lvblN0YXRlKCkpIHsKLS8vCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFsiICsgUFJPUEVSVElFUyArICJdIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRlY2lzaW9uIHN0YXRlIFsiICsgaWQgKyAiXSEiKTsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgZGV0ZXJtaW5lIHN0YXRlIHR5cGUgd2hlbiBoYW5kbGluZyBbIiArIFBST1BFUlRJRVMgKyAiXSBwcm9wZXJ0eSBmb3Igc3RhdGUgWyIgKyBpZCArIl0uIFRyeSBtb3ZpbmcgdGhlIHN0YXRlIGRpc2NyaW1pbmF0b3IgYXR0cmlidXRlIChbIiArIEFDVElPTiArICJdIG9yIFsiICsgU1VCRkxPVyArIl0pIGluIGZyb250IG9mIHRoZSBbIiArIFBST1BFUlRJRVMgKyAiXSBwcm9wZXJ0eSBpZiBoYXZlIHNwZWNpZmllZCBpdCEiKTsKLS8vCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIFRoaXMgaXMgYSBoYWNrLiBUaGUgY29kZSBhYm92ZSBkb2VzIG5vdCB3b3JrIGFzIG9yZGVyIG9mIGF0dHJpYnV0ZSBlbnRyaWVzIGlzIHVuZGVydGVybWluZWQuCi0JCQkJCSAqIFdlIHNldCBib3RoIGFjdGlvblByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXMuCi0JCQkJCSAqIEFzIGEgc2lkZSBlZmZlY3QgYXR0cmlidXRlIHdpdGggZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBhbmQgd2l0aCBwcm9wZXJ0aWVzIHByb3BlcnR5IHdpbGwKLQkJCQkJICogbm90IGZhaWwgaW4gdGhpcyBjb25zdHJ1dG9yIGJ1dCB3aWxsIGZhaWwgaW4gdmFsaWRhdGUgbWV0aG9kLgotCQkJCQkgKi8KLQkJCQkJYWN0aW9uUHJvcGVydGllcyA9IChNYXApZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYXR0cmlidXRlTWFwcGVyUHJvcGVydGllcyA9IChNYXApZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcmVkIHR5cGUgWyIgKyBlbnRyeS5nZXRWYWx1ZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gZm9yIGF0dHJpYnV0ZSBbIiArIFBST1BFUlRJRVMgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChNT0RFTC5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQkvLyBhY2NlcHQgdGhpcwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCQl2aWV3TW9kZWwgPSAoTWFwKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBbIiArIGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSBmb3IgYXR0cmlidXRlIFsiICsgTU9ERUwgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChJTlBVVC5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQkvLyBhY2NlcHQgdGhpcwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCQkJc3ViRmxvd0lucHV0ID0gKENsb3N1cmUpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBJTlBVVCArICJdIG9uIHN0YXRlIFsiICsgaWQgKyAiXSEiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKE9VVFBVVC5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQkvLyBhY2NlcHQgdGhpcwotCQkJCX0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCQkJc3ViRmxvd091dHB1dCA9IChDbG9zdXJlKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBbIiArIGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSBmb3IgYXR0cmlidXRlIFsiICsgT1VUUFVUICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdISIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTUFQUEVSLmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGFjY2VwdCB0aGlzCi0JCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCQkJYXR0cmlidXRlTWFwcGVyQ2xhc3MgPSAoQ2xhc3MpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBGbG93QXR0cmlidXRlTWFwcGVyKSB7Ci0JCQkJCWF0dHJpYnV0ZU1hcHBlciA9IChGbG93QXR0cmlidXRlTWFwcGVyKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBbIiArIGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSBhdHRyaWJ1dGUgWyIgKyBNQVBQRVIgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChUUlVFX1NUQVRFLmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIGZvciBwcm9wZXJ0eSBbIiArIFRSVUVfU1RBVEUgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0gbXVzdCBub3QgYmUgbnVsbCEiKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZGVjaXNpb25UcnVlU3RhdGVJZCA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBUUlVFX1NUQVRFICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdISIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRkFMU0VfU1RBVEUuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgRkFMU0VfU1RBVEUgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0gbXVzdCBub3QgYmUgbnVsbCEiKTsKLQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZGVjaXNpb25GYWxzZVN0YXRlSWQgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBbIiArIGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSBmb3IgYXR0cmlidXRlIFsiICsgRkFMU0VfU1RBVEUgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChNRVRIT0QuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgTUVUSE9EICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdIG11c3Qgbm90IGJlIG51bGwhIik7Ci0JCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWFjdGlvbk1ldGhvZCA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBNRVRIT0QgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChFTkQuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIHByb3BlcnR5IFsiICsgRU5EICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdIG11c3Qgbm90IGJlIG51bGwhIik7Ci0JCQkJfSBlbHNlIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQllbmRTdGF0ZSA9ICgoQm9vbGVhbillbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIFsiICsgZW50cnkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIGZvciBhdHRyaWJ1dGUgWyIgKyBFTkQgKyAiXSBvbiBzdGF0ZSBbIiArIGlkICsgIl0hIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3cgcHJvcGVydHkgWyIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIl0gb24gc3RhdGUgWyIgKyBpZCArICJdISIpOwotCQkJfQotIAkJfQotCX0KLQotCS8qKgotCSAqIDxwPkFkZHMgYSB0cmFuc2l0aW9uIHRvIHRoaXMgc3RhdGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJhbnNpdGlvbihUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKLQkJQXNzZXJ0Lm5vdE51bGwodHJhbnNpdGlvbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMudHJhbnNpdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUcmFuc2l0aW9uIHRtcFRyYW5zaXRpb24gPSAoVHJhbnNpdGlvbilpdGVyLm5leHQoKTsKLQkJCWlmICh0bXBUcmFuc2l0aW9uLmdldFRhcmdldFN0YXRlSWQoKS5lcXVhbHModHJhbnNpdGlvbi5nZXRUYXJnZXRTdGF0ZUlkKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhpcyBzdGF0ZSBbIiArIGdldElkKCkgKyAiXSBhbHJlYWR5IGhhcyBhIHRyYW5zaXRpb24gdG8gc3RhdGUgWyIgKyB0bXBUcmFuc2l0aW9uLmdldFRhcmdldFN0YXRlSWQoKSArICJdISIpOwotCQkJfQotCQl9Ci0JCXRoaXMudHJhbnNpdGlvbnMuYWRkKHRyYW5zaXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiA8cD5SZXR1cm5zIHRoZSBsaXN0IG9mIHRyYW5zaXRpb25zIGZvciB0aGlzIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gdHJhbnNpdGlvbnMgZm9yIHRoaXMgc3RhdGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHJhbnNpdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaXRpb25zOwotCX0KLQkKLQlwdWJsaWMgQWN0aW9uIGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QWN0aW9uKEFjdGlvbiBhY3Rpb24pIHsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JfQotCXB1YmxpYyBDbGFzcyBnZXRBY3Rpb25DbGFzcygpIHsKLQkJcmV0dXJuIGFjdGlvbkNsYXNzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25DbGFzcyhDbGFzcyBhY3Rpb25DbGFzcykgewotCQl0aGlzLmFjdGlvbkNsYXNzID0gYWN0aW9uQ2xhc3M7Ci0JfQotCXB1YmxpYyBDbG9zdXJlIGdldEFjdGlvbkNsb3N1cmUoKSB7Ci0JCXJldHVybiBhY3Rpb25DbG9zdXJlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25DbG9zdXJlKENsb3N1cmUgYWN0aW9uQ2xvc3VyZSkgewotCQl0aGlzLmFjdGlvbkNsb3N1cmUgPSBhY3Rpb25DbG9zdXJlOwotCX0KLQlwdWJsaWMgTWFwIGdldEFjdGlvbkZvcm1EZXRhaWxzKCkgewotCQlyZXR1cm4gYWN0aW9uRm9ybURldGFpbHM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFjdGlvbkZvcm1EZXRhaWxzKE1hcCBhY3Rpb25Gb3JtRGV0YWlscykgewotCQl0aGlzLmFjdGlvbkZvcm1EZXRhaWxzID0gYWN0aW9uRm9ybURldGFpbHM7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0QWN0aW9uUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGFjdGlvblByb3BlcnRpZXM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFjdGlvblByb3BlcnRpZXMoTWFwIGFjdGlvblByb3BlcnRpZXMpIHsKLQkJdGhpcy5hY3Rpb25Qcm9wZXJ0aWVzID0gYWN0aW9uUHJvcGVydGllczsKLQl9Ci0JcHVibGljIEZsb3dBdHRyaWJ1dGVNYXBwZXIgZ2V0QXR0cmlidXRlTWFwcGVyKCkgewotCQlyZXR1cm4gYXR0cmlidXRlTWFwcGVyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVNYXBwZXIoRmxvd0F0dHJpYnV0ZU1hcHBlciBhdHRyaWJ1dGVNYXBwZXIpIHsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwZXIgPSBhdHRyaWJ1dGVNYXBwZXI7Ci0JfQotCXB1YmxpYyBDbGFzcyBnZXRBdHRyaWJ1dGVNYXBwZXJDbGFzcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBlckNsYXNzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVNYXBwZXJDbGFzcyhDbGFzcyBhdHRyaWJ1dGVNYXBwZXJDbGFzcykgewotCQl0aGlzLmF0dHJpYnV0ZU1hcHBlckNsYXNzID0gYXR0cmlidXRlTWFwcGVyQ2xhc3M7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0QXR0cmlidXRlTWFwcGVyUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXMoTWFwIGF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXMpIHsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwZXJQcm9wZXJ0aWVzID0gYXR0cmlidXRlTWFwcGVyUHJvcGVydGllczsKLQl9Ci0JcHVibGljIENsb3N1cmUgZ2V0RGVjaXNpb25DbG9zdXJlKCkgewotCQlyZXR1cm4gZGVjaXNpb25DbG9zdXJlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbkNsb3N1cmUoQ2xvc3VyZSBkZWNpc2lvbkNsb3N1cmUpIHsKLQkJdGhpcy5kZWNpc2lvbkNsb3N1cmUgPSBkZWNpc2lvbkNsb3N1cmU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjaXNpb25FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZGVjaXNpb25FeHByZXNzaW9uOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbkV4cHJlc3Npb24oU3RyaW5nIGRlY2lzaW9uRXhwcmVzc2lvbikgewotCQl0aGlzLmRlY2lzaW9uRXhwcmVzc2lvbiA9IGRlY2lzaW9uRXhwcmVzc2lvbjsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXREZWNpc2lvbkZhbHNlU3RhdGVJZCgpIHsKLQkJcmV0dXJuIGRlY2lzaW9uRmFsc2VTdGF0ZUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbkZhbHNlU3RhdGVJZChTdHJpbmcgZGVjaXNpb25GYWxzZVN0YXRlSWQpIHsKLQkJdGhpcy5kZWNpc2lvbkZhbHNlU3RhdGVJZCA9IGRlY2lzaW9uRmFsc2VTdGF0ZUlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldERlY2lzaW9uVHJ1ZVN0YXRlSWQoKSB7Ci0JCXJldHVybiBkZWNpc2lvblRydWVTdGF0ZUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWNpc2lvblRydWVTdGF0ZUlkKFN0cmluZyBkZWNpc2lvblRydWVTdGF0ZUlkKSB7Ci0JCXRoaXMuZGVjaXNpb25UcnVlU3RhdGVJZCA9IGRlY2lzaW9uVHJ1ZVN0YXRlSWQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTdWJGbG93SWQoKSB7Ci0JCXJldHVybiBzdWJGbG93SWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFN1YkZsb3dJZChTdHJpbmcgc3ViRmxvd0lkKSB7Ci0JCXRoaXMuc3ViRmxvd0lkID0gc3ViRmxvd0lkOwotCX0KLQlwdWJsaWMgQ2xvc3VyZSBnZXRTdWJGbG93SW5wdXQoKSB7Ci0JCXJldHVybiBzdWJGbG93SW5wdXQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFN1YkZsb3dJbnB1dChDbG9zdXJlIHN1YkZsb3dJbnB1dCkgewotCQl0aGlzLnN1YkZsb3dJbnB1dCA9IHN1YkZsb3dJbnB1dDsKLQl9Ci0JcHVibGljIENsb3N1cmUgZ2V0U3ViRmxvd091dHB1dCgpIHsKLQkJcmV0dXJuIHN1YkZsb3dPdXRwdXQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFN1YkZsb3dPdXRwdXQoQ2xvc3VyZSBzdWJGbG93T3V0cHV0KSB7Ci0JCXRoaXMuc3ViRmxvd091dHB1dCA9IHN1YkZsb3dPdXRwdXQ7Ci0JfQotCXB1YmxpYyBDbG9zdXJlIGdldFZpZXdDbG9zdXJlKCkgewotCQlyZXR1cm4gdmlld0Nsb3N1cmU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFZpZXdDbG9zdXJlKENsb3N1cmUgdmlld0Nsb3N1cmUpIHsKLQkJdGhpcy52aWV3Q2xvc3VyZSA9IHZpZXdDbG9zdXJlOwotCX0KLQlwdWJsaWMgTWFwIGdldFZpZXdNb2RlbCgpIHsKLQkJcmV0dXJuIHZpZXdNb2RlbDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Vmlld01vZGVsKE1hcCB2aWV3TW9kZWwpIHsKLQkJdGhpcy52aWV3TW9kZWwgPSB2aWV3TW9kZWw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld05hbWUoKSB7Ci0JCXJldHVybiB2aWV3TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Vmlld05hbWUoU3RyaW5nIHZpZXdOYW1lKSB7Ci0JCXRoaXMudmlld05hbWUgPSB2aWV3TmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRBY3Rpb25NZXRob2QoKSB7Ci0JCXJldHVybiBhY3Rpb25NZXRob2Q7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1ldGhvZChTdHJpbmcgYWN0aW9uTWV0aG9kKSB7Ci0JCXRoaXMuYWN0aW9uTWV0aG9kID0gYWN0aW9uTWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiA8cD5WYWxpZGF0ZSB0aGUgdmFyaW91cyBmaWVsZHMgb2YgdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlPYmplY3RbXSBmaWVsZHMgPSBuZXcgT2JqZWN0W10geyBhY3Rpb24sIGFjdGlvbkNsYXNzLCBhY3Rpb25DbG9zdXJlLCBhY3Rpb25Gb3JtRGV0YWlscywgZGVjaXNpb25DbG9zdXJlLCBkZWNpc2lvbkV4cHJlc3Npb24sIHN1YkZsb3dJZCwgdmlld0Nsb3N1cmUsIHZpZXdOYW1lIH07Ci0JCWJvb2xlYW4gb25lTm90TnVsbCA9IGZhbHNlOwotCQkKLQkJaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsoaWQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTdGF0ZSBpZCBtdXN0IGJlIHNwZWNpZmllZCEiKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvbmVOb3ROdWxsKSB7Ci0JCQkJaWYgKGZpZWxkc1tpXSAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBkZXRlcm1pbmUgc3RhdGUgdHlwZSwgbW9yZSB0aGFuIG9uZSBkaXNjcmltaW5hdG9yIGZpZWxkIHdhcyBzcGVjaWZpZWQhIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvbmVOb3ROdWxsID0gZmllbGRzW2ldICE9IG51bGw7IAotCQkJfQotCQl9Ci0vLwkJaWYgKCFvbmVOb3ROdWxsKSB7Ci0vLwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBkZXRlcm1pbmUgc3RhdGUgdHlwZSwgbm8gZGVzY3JpbWluYXRvciBmaWVsZCB3YXMgc3BlY2lmaWVkISIpOwotLy8JCX0KLQkJCi0JCWlmIChpc1N1YmZsb3dTdGF0ZSgpKSB7Ci0JCQlpZiAoKHN1YkZsb3dJbnB1dCAhPSBudWxsIHx8IHN1YkZsb3dPdXRwdXQgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZU1hcHBlciAhPSBudWxsIHx8IGF0dHJpYnV0ZU1hcHBlckNsYXNzICE9IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYXR0cmlidXRlIG1hcHBlciBhbmQgYXR0cmlidXRlIG1hcHBlciBjbGFzcyBtdXN0IGJlIG51bGwgaWYgZWl0aGVyIHN1YmZsb3cgaW5wdXQgb3Igc3ViZmxvdyBvdXRwdXQgYXJlIHNldCEiKTsKLQkJCX0gZWxzZSBpZiAoYXR0cmlidXRlTWFwcGVyICE9IG51bGwgJiYgKHN1YkZsb3dJbnB1dCAhPSBudWxsIHx8IHN1YkZsb3dPdXRwdXQgIT0gbnVsbCB8fCBhdHRyaWJ1dGVNYXBwZXJDbGFzcyAhPSBudWxsKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN1YmZsb3cgaW5wdXQgYW5kIHN1YmZsb3cgb3V0cHV0IGFuZCBhdHRyaWJ1dGUgbWFwcGVyIGNsYXNzIG11c3QgYmUgbnVsbCBpZiBhdHRyaWJ1dGUgbWFwcGVyIGlzIHNldCEiKTsKLQkJCX0gZWxzZSBpZiAoYXR0cmlidXRlTWFwcGVyQ2xhc3MgIT0gbnVsbCAmJiAoc3ViRmxvd0lucHV0ICE9IG51bGwgfHwgc3ViRmxvd091dHB1dCAhPSBudWxsIHx8IGF0dHJpYnV0ZU1hcHBlciAhPSBudWxsKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN1YmZsb3cgaW5wdXQgYW5kIHN1YmZsb3cgb3V0cHV0IGFuZCBhdHRyaWJ1dGUgbWFwcGVyIGNsYXNzIG11c3QgYmUgbnVsbCBpZiBhdHRyaWJ1dGUgbWFwcGVyIGNsYXNzIGlzIHNldCEiKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpc0RlY2lzaW9uU3RhdGUoKSkgewotCQkJaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsoZGVjaXNpb25UcnVlU3RhdGVJZCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEZWNpc2lvbiB0cnVlIHN0YXRlIGlkIG11c3QgYmUgc2V0ISIpOwotCQkJfSBlbHNlIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKGRlY2lzaW9uRmFsc2VTdGF0ZUlkKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRlY2lzaW9uIGZhbHNlIHN0YXRlIGlkIG11c3QgYmUgc2V0ISIpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWN0aW9uQ2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKCFBY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhY3Rpb25DbGFzcykgJiYgIUNsYXNzVXRpbHMuaGFzTWV0aG9kKGFjdGlvbkNsYXNzLCAiZXhlY3V0ZSIsIG5ldyBDbGFzc1tdIHsgUmVxdWVzdENvbnRleHQuY2xhc3MgfSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBY3Rpb24gY2xhc3MgWyIgKyBhY3Rpb25DbGFzcy5nZXROYW1lKCkgKyAiXSBkb2VzIG5vdCBpbXBsZW1lbnQgWyIgKyBBY3Rpb24uY2xhc3MuZ2V0TmFtZSgpICsgIl0gYW5kIGhhcyBubyBwdWJsaWMgbWV0aG9kIFtleGVjdXRlKCIgKyBSZXF1ZXN0Q29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiKV0hIik7Ci0JCQl9IGVsc2UgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoYWN0aW9uQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWN0aW9uIGNsYXNzIFsiICsgYWN0aW9uQ2xhc3MuZ2V0TmFtZSgpICsgIl0gaXMgYWJzdHJhY3QhIik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChhdHRyaWJ1dGVNYXBwZXJDbGFzcyAhPSBudWxsKSB7Ci0JCQlpZiAoIUZsb3dBdHRyaWJ1dGVNYXBwZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWJ1dGVNYXBwZXJDbGFzcykpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGbG93IGF0dHJpYnV0ZSBtYXBwZXIgY2xhc3MgWyIgKyBhdHRyaWJ1dGVNYXBwZXJDbGFzcy5nZXROYW1lKCkgKyAiXSBkb2VzIG5vdCBpbXBsZW1lbnQgWyIgKyBGbG93QXR0cmlidXRlTWFwcGVyLmNsYXNzLmdldE5hbWUoKSArICJdISIpOwotCQkJfSBlbHNlIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KGF0dHJpYnV0ZU1hcHBlckNsYXNzLmdldE1vZGlmaWVycygpKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZsb3cgYXR0cmlidXRlIG1hcHBlciBjbGFzcyBbIiArIGF0dHJpYnV0ZU1hcHBlckNsYXNzLmdldE5hbWUoKSArICJdIGlzIGFic3RyYWN0ISIpOwotCQkJfQotCQl9Ci0JCQotIAl9Ci0JCi0JLyoqCi0JICogPHA+SXMgdGhpcyBzdGF0ZSBhbiBhY3Rpb24gc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlzIHRoaXMgc3RhdGUgaXMgYW4gYWN0aW9uIHN0YXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aW9uU3RhdGUoKSB7Ci0JCXJldHVybiAoYWN0aW9uICE9IG51bGwgfHwgYWN0aW9uQ2xhc3MgIT0gbnVsbCB8fCBhY3Rpb25DbG9zdXJlICE9IG51bGwgfHwgYWN0aW9uRm9ybURldGFpbHMgIT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPklzIHRoaXMgc3RhdGUgYSB2aWV3IHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHN0YXRlIGluIGEgdmlldyBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpZXdTdGF0ZSgpIHsKLQkJcmV0dXJuICgodmlld05hbWUgIT0gbnVsbCB8fCB2aWV3Q2xvc3VyZSAhPSBudWxsKSAmJiAhZW5kU3RhdGUpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5JcyB0aGlzIHN0YXRlIGEgZGVjaXNpb24gc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgc3RhdGUgaXMgYSBkZWNpc2lvbiBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2lzaW9uU3RhdGUoKSB7Ci0JCXJldHVybiAoZGVjaXNpb25FeHByZXNzaW9uICE9IG51bGwgfHwgZGVjaXNpb25DbG9zdXJlICE9IG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5JcyB0aGlzIHN0YXRlIGEgc3ViZmxvdyBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzdGF0ZSBpcyBhIHN1YmZsb3cgc3RhdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWJmbG93U3RhdGUoKSB7Ci0JCXJldHVybiAoc3ViRmxvd0lkICE9IG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5JcyB0aGlzIHN0YXRlIGFuIGVuZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzdGF0ZSBpcyBhbiBlbmQgc3RhdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRTdGF0ZSgpIHsKLQkJcmV0dXJuICgoZW5kU3RhdGUgJiYgaXNWaWV3U3RhdGUoKSkgfHwgKCFpc0FjdGlvblN0YXRlKCkgJiYgIWlzVmlld1N0YXRlKCkgJiYgIWlzRGVjaXNpb25TdGF0ZSgpICYmICFpc1N1YmZsb3dTdGF0ZSgpKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuZXcgVG9TdHJpbmdDcmVhdG9yKHRoaXMpCi0JCQkuYXBwZW5kKCJhY3Rpb249IiArIGFjdGlvbikKLQkJCS5hcHBlbmQoImFjdGlvbkNsYXNzPSIgKyBhY3Rpb25DbGFzcykKLQkJCS5hcHBlbmQoImFjdGlvbkNsb3N1cmU9IiArIGFjdGlvbkNsb3N1cmUpCi0JCQkuYXBwZW5kKCJhY3Rpb25Gb3JtRGV0YWlsPSIgKyBhY3Rpb25Gb3JtRGV0YWlscykKLQkJCS5hcHBlbmQoImFjdGlvblByb3BlcnRpZXM9IiArIGFjdGlvblByb3BlcnRpZXMpCi0JCQkuYXBwZW5kKCJhdHRyaWJ1dGVNYXBwZXI9IiArIGF0dHJpYnV0ZU1hcHBlcikKLQkJCS5hcHBlbmQoImF0dHJpYnV0ZU1hcHBlckNsYXNzPSIgKyBhdHRyaWJ1dGVNYXBwZXJDbGFzcykKLQkJCS5hcHBlbmQoImF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXM9IiArIGF0dHJpYnV0ZU1hcHBlclByb3BlcnRpZXMpCi0JCQkuYXBwZW5kKCJkZWNpc2lvbkNsb3N1cmU9IiArIGRlY2lzaW9uQ2xvc3VyZSkKLQkJCS5hcHBlbmQoImRlY2lzaW9uRXhwcmVzc2lvbj0iICsgZGVjaXNpb25FeHByZXNzaW9uKQotCQkJLmFwcGVuZCgiZGVjaXNpb25UcnVlU3RhdGVJZD0iICsgZGVjaXNpb25UcnVlU3RhdGVJZCkKLQkJCS5hcHBlbmQoImRlY2lzaW9uRmFsc2VTdGF0ZUlkPSIgKyBkZWNpc2lvbkZhbHNlU3RhdGVJZCkKLQkJCS5hcHBlbmQoInN1YkZsb3dJZD0iICsgc3ViRmxvd0lkKQotCQkJLmFwcGVuZCgic3ViRmxvd0lucHV0PSIgKyBzdWJGbG93SW5wdXQpCi0JCQkuYXBwZW5kKCJzdWJGbG93T3V0cHV0IiArIHN1YkZsb3dPdXRwdXQpCi0JCQkuYXBwZW5kKCJ0cmFuc2l0aW9ucz0iICsgdHJhbnNpdGlvbnMpCi0JCQkuYXBwZW5kKCJ2aWV3Q2xvc3VyZT0iICsgdmlld0Nsb3N1cmUpCi0JCQkuYXBwZW5kKCJ2aWV3TmFtZT0iICsgdmlld05hbWUpCi0JCQkuYXBwZW5kKCJ2aWV3TW9kZWw9IiArIHZpZXdNb2RlbCkKLQkJCS5hcHBlbmQoIlxuIikudG9TdHJpbmcoKTsKLQkJCi0JCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvcGFnZWZsb3cvVHJhbnNpdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9UcmFuc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzc2MzYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9UcmFuc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBncmFpbHMucGFnZWZsb3c7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLnN0eWxlLlRvU3RyaW5nQ3JlYXRvcjsKLQotLyoqCi0gKiA8cD5TaW1wbGUgY29udGFpbmVyIGNsYXNzIGZvciBhIHRyYW5zaXRpb24gYSBpbiBwYWdlIGZsb3cuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDksIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zaXRpb24gewotCi0JcHJpdmF0ZSBTdGF0ZSBzdGF0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U3RhdGVJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCi0JcHVibGljIFRyYW5zaXRpb24oU3RhdGUgc3RhdGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0U3RhdGVJZCkgewotCQlzdXBlcigpOwotCQlpZiAoc3RhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RhdGUgYXJndW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgYXJndW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOwotCQl9Ci0gCQlpZiAodGFyZ2V0U3RhdGVJZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgc3RhdGUgaWQgYXJndW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOwotCQl9Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy50YXJnZXRTdGF0ZUlkID0gdGFyZ2V0U3RhdGVJZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFN0YXRlSWQoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFN0YXRlSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBUb1N0cmluZ0NyZWF0b3IodGhpcykudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvdXRpbC9FeHRlbmRQcm94eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy91dGlsL0V4dGVuZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NWU2ODUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy91dGlsL0V4dGVuZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBncmFpbHMudXRpbDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS51dGlsLlByb3h5OwotLyoqIAotICogRXh0ZW5kcyB0aGUgR3Jvb3Z5IFByb3h5IGltcGxlbWVudGF0aW9uIGFuZCBhZGRzIHByb3h5aW5nIG9mIHByb3BlcnR5IGdldHRlcnMvc2V0dGVycwotICogCi0qIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotKiBAc2luY2UgT2N0IDIwLCAyMDA1Ci0qLwotcHVibGljIGNsYXNzIEV4dGVuZFByb3h5IGV4dGVuZHMgUHJveHkgewotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLQkJdHJ5IHsJCQkKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZSkgewotCQkJcmV0dXJuIEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKGdldEFkYXB0ZWUoKSkuZ2V0UHJvcGVydHkoZ2V0QWRhcHRlZSgpLHByb3BlcnR5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRyeSB7CQkJCi0JCQlzdXBlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eSxuZXdWYWx1ZSk7Ci0JCX0KLQkJY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZSkgewotCQkJSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoZ2V0QWRhcHRlZSgpKS5zZXRQcm9wZXJ0eShnZXRBZGFwdGVlKCkscHJvcGVydHksbmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvR2VuZXJhdGVVdGlscy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy91dGlsL0dlbmVyYXRlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZjgxOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvR2VuZXJhdGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGdyYWlscy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuc3ByaW5nLlNwcmluZ0NvbmZpZzsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy5HcmFpbHNUZW1wbGF0ZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Db25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmJlYW5zLmZhY3RvcnkuZHJpdmVycy54bWwuWG1sQXBwbGljYXRpb25Db250ZXh0RHJpdmVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGdlbmVyYXRpbmcgR3JhaWxzIGFydGlmYWN0cyBsaWtlcyB2aWV3cywgY29udHJvbGxlcnMgZXRjLgotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDEwLUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSdW5UZXN0cy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTID0gInZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MTEVSID0gImNvbnRyb2xsZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGFyZ3MubGVuZ3RoIDwgMikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgdHlwZSA9IGFyZ3NbMF07Ci0gICAgICAgIFN0cmluZyBkb21haW5DbGFzc05hbWUgPSBhcmdzWzFdOwotCi0KLQotICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHQgcGFyZW50ID0gbmV3IENsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dCgiYXBwbGljYXRpb25Db250ZXh0LnhtbCIpOwotICAgICAgICBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChEZWZhdWx0R3JhaWxzQXBwbGljYXRpb24pcGFyZW50LmdldEJlYW4oImdyYWlsc0FwcGxpY2F0aW9uIiwgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzKTsKLQotICAgICAgICBHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IGdldERvbWFpbkNhbGxGcm9tQXBwbGljYXRpb24oYXBwbGljYXRpb24sZG9tYWluQ2xhc3NOYW1lKTsKLQotICAgICAgICAvLyBib290c3RyYXAgYXBwbGljYXRpb24gdG8gdHJ5IGhpYmVybmF0ZSBkb21haW4gY2xhc3NlcwotICAgICAgICBpZihkb21haW5DbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTcHJpbmdDb25maWcgY29uZmlnID0gbmV3IFNwcmluZ0NvbmZpZyhhcHBsaWNhdGlvbik7Ci0gICAgICAgICAgICBDb25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ3R4ID0gKENvbmZpZ3VyYWJsZUFwcGxpY2F0aW9uQ29udGV4dCkKLSAgICAgICAgICAgICAgICBuZXcgWG1sQXBwbGljYXRpb25Db250ZXh0RHJpdmVyKCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KAotICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0QmVhblJlZmVyZW5jZXMoKSwgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHJ5Ci0gICAgICAgIGRvbWFpbkNsYXNzID0gZ2V0RG9tYWluQ2FsbEZyb21BcHBsaWNhdGlvbihhcHBsaWNhdGlvbixkb21haW5DbGFzc05hbWUpOwotICAgICAgICBpZihkb21haW5DbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlVuYWJsZSB0byBnZW5lcmF0ZSBbIit0eXBlKyJdIGRvbWFpbiBjbGFzcyBub3QgZm91bmQgZm9yIG5hbWUgWyIrZG9tYWluQ2xhc3NOYW1lKyJdIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gKEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yKWdjbC5wYXJzZUNsYXNzKGdjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuZ3Jvb3Z5IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgaWYoVklFV1MuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBMT0cuaW5mbygiR2VuZXJhdGluZyB2aWV3cyBmb3IgZG9tYWluIGNsYXNzIFsiK2RvbWFpbkNsYXNzLmdldE5hbWUoKSsiXSIpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlVmlld3MoZG9tYWluQ2xhc3MsIi4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKENPTlRST0xMRVIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgIExPRy5pbmZvKCJHZW5lcmF0aW5nIGNvbnRyb2xsZXIgZm9yIGRvbWFpbiBjbGFzcyBbIitkb21haW5DbGFzcy5nZXROYW1lKCkrIl0iKTsKLSAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlQ29udHJvbGxlcihkb21haW5DbGFzcywiLiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTE9HLmluZm8oIkdyYWlscyB3YXMgdW5hYmxlIHRvIGdlbmVyYXRlIHRlbXBsYXRlcyBmb3IgdW5zdXBwb3J0ZWQgdHlwZSBbIit0eXBlKyJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBHcmFpbHNEb21haW5DbGFzcyBnZXREb21haW5DYWxsRnJvbUFwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBTdHJpbmcgZG9tYWluQ2xhc3NOYW1lKSB7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoZG9tYWluQ2xhc3NOYW1lKTsKLSAgICAgICAgaWYoZG9tYWluQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgZG9tYWluQ2xhc3MgPSBhcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcyhkb21haW5DbGFzc05hbWUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIGRvbWFpbkNsYXNzTmFtZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb21haW5DbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvT3BlblJpY29CdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvT3BlblJpY29CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjZkOWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy91dGlsL09wZW5SaWNvQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIGdyYWlscy51dGlsOwotCi1pbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlOwotCi0vKioKLSAqIDxwPk9wZW5SaWNvQnVpbGRlciBwcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGluZyBPcGVuUmljbyBBSkFYIHJlc3BvbnNlcy4KLSAqIAotICogPHA+SWYgdGhpcyBidWlsZGVyIGlzIHVzZWQgaW4gY29udHJvbGxlcnMgbm8gdmlld3Mgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgc2luY2UKLSAqIGNvbnRlbnQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBIdHRwU2VydmxldFJlc3BvbnNlIGluc3RhbmNlLiBBbHNvIG5vIG9wZXJhdGlvbnMKLSAqIHNob3VsZCBiZSBwZXJmb3JtZWQgb24gdGhlIHJlc3BvbnNlIG9iamVjdCBwcmlvciB0byBwYXNzaW5nIGl0IHRvIHRoaXMgYnVpbGRlci4KLSAqIAotICogPHA+VGhpcyBidWlsZGVyIHdpbGwgc2V0IHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlc3BvbnNlIHRvICJ0ZXh0L3htbCIgYW5kIHdpbGwgCi0gKiByZW5kZXIgYSBjb3JyZWN0IFhNTCBwcm9sb2cgKDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4pLgotICogCi0gKiA8cD5UaGlzIGJ1aWxkZXIgc3VwcG9ydHMgbm8gbmFtZXNwYWNlcyBvciBoeXBoZW5zIGluIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcy4KLSAqIAotICogPHA+VXNlIHRoaXMgYnVpbGRlciB0byB3cml0ZSBhIE9wZW5SaWNvIHJlcG9uc2UgdG8gdGhlIGNsaWVudC4gU2VuZGluZyBhIHNpbXBsZQotICogRElWIHRhZyB0byB0aGUgY2xpZW50IHJlcXVpcmVzIHRoaXMgY29kZToKLSAqIAotICogPHByZT4KLSAqIG5ldyBPcGVuUmljb0J1aWxkZXIocmVzcG9uc2UpLmFqYXggeyBlbGVtZW50KGlkOiJwZXJzb25JbmZvIikgeyBkaXYoY2xhc3M6InBlcnNvbiIpIH0gfQotICogPC9wcmU+Ci0gKiAKLSAqIDxwPlNlbmRpbmcgb2JqZWN0IFhNTCB0byB0aGUgY2xpZW50IHJlcXVpcmVzIHRoaXMgY29kZToKLSAqIAotICogPHByZT4KLSAqIG5ldyBPcGVuUmljb0J1aWxkZXIocmVzcG9uc2UpLmFqYXggeyBvYmplY3QoaWQ6ImZvcm1MZXR0ZXJVcGRhdGVyIikgeyAKLSAqICAgICBwZXJzb24oCi0gKiAgICAgICAgIGZ1bGxOYW1lOiJQYXQgQmFybmVzIiwKLSAqICAgICAgICAgdGl0bGU6Ik1yLiIsCi0gKiAgICAgICAgIGZpcnN0TmFtZToiUGF0IiwKLSAqICAgICAgICAgbGFzdE5hbWU6IkJhcm5lcyIpCi0gKiAgICAgfQotICogfQotICogPC9wcmU+Ci0gKiAKLSAqIDxwPlRoZSBmaXJzdCBjYWxsIG9uIGEgT3BlblJpY29CdWlsZGVyIGluc3RhbmNlIHNob3VsZCBiZSAiYWpheCIsIHRoZSBzZWNvbmQgZWl0aGVyICJlbGVtZW50IiAodG8gcmV0dXJuIEhUTUwpCi0gKiBvciBvYmplY3QgKHRvIHJldHVybiBYTUwpIGJvdGggd2l0aCBhIHJlcXVpcmVkICJpZCIgYXR0cmlidXRlLiBWaW9sYXRpb25zIGFnYWluc3QgdGhlc2UgcnVsZXMgd2lsbCBiZQotICogcmVwb3J0ZWQgYXMgZXhjZXB0aW9ucy4KLSAqIAotICogPHA+T3BlblJpY28gcmVzcG9uc2VzIGNhbiBjb250YWluIG11bHRpcGxlIGVsZW1lbnQgYW5kL29yIG9iamVjdCBub2RlcyB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZGVyLgotICogCi0gKiA8cD5XaGVuIHVzaW5nIE9wZW5SaWNvQnVpbGRlciBpbiBjb250cm9sbGVycyB5b3UgbWF5IG5lZWQgdG8gcmV0dXJuIGEgbnVsbCB2YWx1ZSBhdCB0aGUgZW5kIG9mIGEgY2xvc3VyZSB0byBhdm9pZCBhbgotICogVW5zdXBwb3J0ZXJSZXR1cm5WYWx1ZUV4Y2VwdGlvbi4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgNSwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgT3BlblJpY29CdWlsZGVyIGV4dGVuZHMgTWFya3VwQnVpbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9YTUwgPSAidGV4dC94bWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFKQVggPSAiYWpheCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFKQVhfUkVTUE9OU0UgPSAiYWpheC1yZXNwb25zZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlQgPSAiZWxlbWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVCA9ICJvYmplY3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJyZXNwb25zZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTlJJQ08gPSAiT3BlblJpY29CdWlsZGVyOiAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSEVBREVSID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiI7Ci0JcHJpdmF0ZSBib29sZWFuIGFqYXhPbmx5ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VPbmx5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0ID0gdHJ1ZTsKLQkKLQlwdWJsaWMgT3BlblJpY29CdWlsZGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMobmV3IEdyYWlsc0h0dHBTZXJ2bGV0UmVzcG9uc2UocmVzcG9uc2UpKTsKLQl9Ci0JCi0JcHVibGljIE9wZW5SaWNvQnVpbGRlcihHcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlcihyZXNwb25zZS5nZXRXcml0ZXIoVEVYVF9YTUwsIFVURl84KSk7Ci0JCWdldFByaW50ZXIoKS5wcmludGxuKFhNTF9IRUFERVIpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSkgewotCQlpZiAocmVzcG9uc2VPbmx5KSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE9QRU5SSUNPICsgIm9ubHkgY2FsbCB0byBbZWxlbWVudCB7IH1dIGlzIGFsbG93ZWQgd2l0aCBhdHRyaWJ1dGUgW2lkXSwgbm90IFsiICsgbmFtZSArICJ7IH1dISIpOwotCQl9Ci0JCWlmIChzdGFydCAmJiBBSkFYLmVxdWFscyhuYW1lKSkgewotCQkJYWpheE9ubHkgPSBmYWxzZTsKLQkJCXJlc3BvbnNlT25seSA9IHRydWU7Ci0JCQlzdGFydCA9IGZhbHNlOwotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU5vZGUoQUpBWF9SRVNQT05TRSk7Ci0JCX0gZWxzZSBpZiAoYWpheE9ubHkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oT1BFTlJJQ08gKyAib25seSBjYWxsIHRvIFthamF4IHsgfV0gaXMgYWxsb3dlZCwgbm90IFsiICsgbmFtZSArICIgeyB9XSEiKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVOb2RlKG5hbWUpOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGNoZWNrRWxlbWVudE5hbWUoKFN0cmluZyluYW1lLCBhdHRyaWJ1dGVzKSkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU5vZGUobmFtZSwgYXR0cmlidXRlcywgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFJFU1BPTlNFOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChjaGVja0VsZW1lbnROYW1lKChTdHJpbmcpbmFtZSwgbnVsbCkpIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVOb2RlKG5hbWUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihPUEVOUklDTyArICJpbnZhbGlkIG1ldGhvZCBjYWxsIFsiICsgbmFtZSArICJ7IH1dISIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vZGVDb21wbGV0ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5vZGUpIHsKLQkJcmVzcG9uc2VPbmx5ID0gQUpBWF9SRVNQT05TRS5lcXVhbHMocGFyZW50KSAmJiBSRVNQT05TRS5lcXVhbHMobm9kZSk7Ci0JCXN1cGVyLm5vZGVDb21wbGV0ZWQocGFyZW50LCBub2RlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lLCBNYXAgYXR0cmlidXRlcykgewotCQlpZiAoYWpheE9ubHkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oT1BFTlJJQ08gKyAib25seSBjYWxsIHRvIFthamF4IHt9XSBhbGxvd2VkIHdpdGhvdXQgYXJndW1lbnRzLCBub3QgWyIgKyBlbGVtZW50TmFtZSArICIgeyB9XSEiKTsKLQkJfQotCQlpZiAocmVzcG9uc2VPbmx5KSB7Ci0JCQlyZXNwb25zZU9ubHkgPSBmYWxzZTsKLQkJCWlmICghKEVMRU1FTlQuZXF1YWxzKGVsZW1lbnROYW1lKSB8fCBPQkpFQ1QuZXF1YWxzKGVsZW1lbnROYW1lKSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE9QRU5SSUNPICsgIm9ubHkgY2FsbHMgdG8gW2VsZW1lbnQgeyB9XSBvciBbb2JqZWN0IHsgfV0gYXJlIGFsbG93ZWQsIG5vdCBbIiArIGVsZW1lbnROYW1lICsgIiB7IH1dISIpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCB8fCBhdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewkJCQkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihPUEVOUklDTyArICJjYWxsIHRvIFsiICsgZWxlbWVudE5hbWUgKyAiIHsgfV0gcmVxdWlyZXMgaWQgYXR0cmlidXRlISIpOwotCQkJfSBlbHNlIGlmICghKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoSUQpICYmIGF0dHJpYnV0ZXMuZ2V0KElEKSAhPSBudWxsKSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE9QRU5SSUNPICsgImNhbGwgdG8gWyIgKyBlbGVtZW50TmFtZSArICIgeyB9XSByZXF1aXJlcyBpZCBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSEiKTsKLQkJCX0gZWxzZSBpZiAoRUxFTUVOVC5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoVFlQRSwgRUxFTUVOVCk7Ci0JCQkJc3VwZXIuY3JlYXRlTm9kZShSRVNQT05TRSwgYXR0cmlidXRlcyk7Ci0JCQl9IGVsc2UgaWYgKE9CSkVDVC5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoVFlQRSwgT0JKRUNUKTsKLQkJCQlzdXBlci5jcmVhdGVOb2RlKFJFU1BPTlNFLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvUnVuVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvdXRpbC9SdW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmYwODQ4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9ncmFpbHMvdXRpbC9SdW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2UgZ3JhaWxzLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkRlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLnNwcmluZy5TcHJpbmdDb25maWc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc3VwcG9ydC5HcmFpbHNUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkNsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMueG1sLlhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA4LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBSdW5UZXN0cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUnVuVGVzdHMuY2xhc3MpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQXBwbGljYXRpb25Db250ZXh0IHBhcmVudCA9IG5ldyBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQoImFwcGxpY2F0aW9uQ29udGV4dC54bWwiKTsKLQkJRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbilwYXJlbnQuZ2V0QmVhbigiZ3JhaWxzQXBwbGljYXRpb24iLCBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb24uY2xhc3MpOwotCQlTcHJpbmdDb25maWcgY29uZmlnID0gbmV3IFNwcmluZ0NvbmZpZyhhcHBsaWNhdGlvbik7Ci0JCUNvbmZpZ3VyYWJsZUFwcGxpY2F0aW9uQ29udGV4dCBhcHBDdHggPSAoQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0KSAKLQkJCW5ldyBYbWxBcHBsaWNhdGlvbkNvbnRleHREcml2ZXIoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoCi0JCQkJY29uZmlnLmdldEJlYW5SZWZlcmVuY2VzKCksIHBhcmVudCk7Ci0JCQotCQlDbGFzc1tdIGFsbENsYXNzZXMgPSBhcHBsaWNhdGlvbi5nZXRBbGxDbGFzc2VzKCk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiR29pbmcgdGhyb3VnaCBbIithbGxDbGFzc2VzLmxlbmd0aCsiXSBjbGFzc2VzIik7Ci0gICAgICAgIFRlc3RTdWl0ZSBzID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNsYXNzIGNsYXp6ID0gYWxsQ2xhc3Nlc1tpXTsKLQkJCWlmIChUZXN0Q2FzZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSAmJiAhTW9kaWZpZXIuaXNBYnN0cmFjdChjbGF6ei5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQlsb2cuZGVidWcoIkFkZGluZyB0ZXN0IFsiICsgY2xhenouZ2V0TmFtZSgpICsgIl0iKTsKLQkJCQlzLmFkZFRlc3QobmV3IEdyYWlsc1Rlc3RTdWl0ZShhcHBDdHguZ2V0QmVhbkZhY3RvcnkoKSwgY2xhenopKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nLmRlYnVnKCJbIiArIGNsYXp6LmdldE5hbWUoKSArICJdIGlzIG5vdCBhIHRlc3QgY2FzZS4iKTsKLQkJCX0KLQkJfQotCQlUZXN0UnVubmVyLnJ1bihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvV2ViVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvZ3JhaWxzL3V0aWwvV2ViVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTZhOWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL2dyYWlscy91dGlsL1dlYlRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotcGFja2FnZSBncmFpbHMudXRpbAotCi0vLyBTdXBlcmNsYXNzIHNrZWxldG9uIGZvciBmdWN0aW9uYWwgdGVzdHMuCi0vLyBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBzdWl0ZSgpIG1ldGhvZC4KLQotY2xhc3MgV2ViVGVzdCB7Ci0KLSAgICBAUHJvcGVydHkgZ3JhaWxzSG9tZQotICAgIEBQcm9wZXJ0eSBwcm9wcwotICAgIEBQcm9wZXJ0eSBhbnQgPSBuZXcgQW50QnVpbGRlcigpICAgIC8vIG1heSBiZSBpbml0aWFsaXplIGxhemlseSBmb3IgbWVtb3J5IG9wdC4gaW4gc3ViY2xhc3NlcwotCi0gICAgcHVibGljIHdlYnRlc3RIb21lCi0gICAgcHVibGljIE1hcCBjb25maWdNYXAKLQotICAgIC8qKiB1c2VkIGZyb20gc3ViY2xhc3NlcyB0byBuZXN0IHRoZSBzdGVwcyBpbnRvICovCi0gICAgdm9pZCB3ZWJ0ZXN0KFN0cmluZyBuYW1lLCBDbG9zdXJlIHlpZWxkKXsKLSAgICAgICAgYW50LnRlc3RTcGVjKG5hbWU6bmFtZSl7Ci0gICAgICAgICAgICBjb25maWcoY29uZmlnTWFwKQotICAgICAgICAgICAgc3RlcHMoKXsKLSAgICAgICAgICAgICAgICB5aWVsZC5kZWxlZ2F0ZSA9IGFudAotICAgICAgICAgICAgICAgIHlpZWxkKCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgICBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNhbGwgYWxsIHRoZWlyIHRlc3QgbWV0aG9kcy4KLSAgICAqLwotICAgIHZvaWQgc3VpdGUoKSB7fQotCi0gICAgLyoqIE1haW4gZW50cnkgcG9pbnQgdG8gcnVuIHRoZSB3aG9sZSBzdWl0ZSBvZiB0ZXN0cy4gKi8KLSAgICB2b2lkIHJ1blRlc3RzICgpewotICAgICAgICBpbml0UHJvcHMoKQotICAgICAgICBpbml0Q29uZmlnTWFwKCkKLSAgICAgICAgcHJlcGFyZSgpCi0KLSAgICAgICAgc3VpdGUoKSAgICAgLy8gdGVtcGxhdGUgbWV0aG9kIGNhbGwKLQotICAgICAgICBzdHlsZSgpCi0gICAgfQotCi0KLSAgICB2b2lkIGluaXRQcm9wcyAoKSB7Ci0gICAgICAgIGFudC5wcm9wZXJ0eShmaWxlOiAgICAgICAgJ3dlYnRlc3QvY29uZi93ZWJ0ZXN0LnByb3BlcnRpZXMnKQotICAgICAgICBhbnQucHJvcGVydHkoZW52aXJvbm1lbnQ6ICdlbnYnKQotICAgICAgICBwcm9wcyA9IGFudC5hbnRQcm9qZWN0LnByb3BlcnRpZXMKLSAgICAgICAgZ3JhaWxzSG9tZSA9IHByb3BzLmdyYWlsc0hvbWUKLSAgICAgICAgaWYgKCEgZ3JhaWxzSG9tZSkgewotICAgICAgICAgICAgZ3JhaWxzSG9tZSA9IHByb3BzLidlbnYuR1JBSUxTX0hPTUUnCi0gICAgICAgIH0KLSAgICAgICAgd2VidGVzdEhvbWUgPSBncmFpbHNIb21lICsgJy9kb3dubG9hZHMvd2VidGVzdCcKLSAgICAgICAgcHJvcHMucHJvamVjdE5hbWUgPSBuZXcgRmlsZSgnLicpLmFic29sdXRlUGF0aC50b2tlbml6ZSgnLi9cXCcpWy0xXQotICAgICAgICBpZiAoISBwcm9wcy53ZWJ0ZXN0X2Jhc2VwYXRoKSBwcm9wcy53ZWJ0ZXN0X2Jhc2VwYXRoID0gcHJvcHMucHJvamVjdE5hbWUKLSAgICAgICAgcHJpbnRsbiAnVGVzdGluZyAnICsgcHJvcHMucHJvamVjdE5hbWUKLSAgICB9Ci0KLSAgIC8vIHByZXBhcmUgYSBjb25maWdtYXAgYmFzZWQgb24gd2VidGVzdC5wcm9wZXJ0aWVzCi0gICAgZGVmIGluaXRDb25maWdNYXAgKCkgewotICAgICAgICBjb25maWdNYXAgPSBbOl0KLSAgICAgICAgZGVmIHByZWZpeCA9ICd3ZWJ0ZXN0XycKLSAgICAgICAgcHJvcHMua2V5U2V0KCkuZWFjaHsgbmFtZSAtPgotICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSBjb25maWdNYXAucHV0KG5hbWUgLSBwcmVmaXgsIHByb3BzW25hbWVdKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcHJlcGFyZSB0aGUgYW50IHRhc2tkZWYsIGNsYXNzcGF0aCBhbmQgZmlsZXN5c3RlbSBmb3IgcmVwb3J0aW5nCi0gICAgdm9pZCBwcmVwYXJlKCkgeyAgICAgICAgCi0gICAgICAgIGFudC50YXNrZGVmKGZpbGU6IiR7d2VidGVzdEhvbWV9L3dlYnRlc3RUYXNrZGVmcy5wcm9wZXJ0aWVzIikKLSAgICAgICAgYW50LmRlbGV0ZSAoKSB7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjogcHJvcHMud2VidGVzdF9yZXN1bHRwYXRoLCBleGNsdWRlczoncmVhZG1lLnR4dCcpCi0gICAgICAgIH0KLSAgICAgICAgYW50Lm1rZGlyIChkaXI6IHByb3BzLndlYnRlc3RfcmVzdWx0cGF0aCkKLSAgICB9Ci0KLSAgICBkZWYgc3R5bGUoKSB7Ci0gICAgICAgIGFudC5zdHlsZSgKLSAgICAgICAgICAgIGJhc2VkaXI6ICAgIHByb3BzLndlYnRlc3RfcmVzdWx0cGF0aCwKLSAgICAgICAgICAgIGRlc3RkaXI6ICAgIHByb3BzLndlYnRlc3RfcmVzdWx0cGF0aCwKLSAgICAgICAgICAgIGluY2x1ZGVzOiAgIHByb3BzLndlYnRlc3RfcmVzdWx0ZmlsZSwKLSAgICAgICAgICAgIGV4dGVuc2lvbjogICcuaHRtbCcsCi0gICAgICAgICAgICBzdHlsZTogICAgICB3ZWJ0ZXN0SG9tZSsnL3Jlc291cmNlcy9XZWJUZXN0UmVwb3J0LnhzbCcpewotICAgICAgICAgICAgcGFyYW0obmFtZToncmVwb3J0dGltZScsICAgICBleHByZXNzaW9uOiBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICBwYXJhbShuYW1lOid0aXRsZScsICAgICAgICAgIGV4cHJlc3Npb246ICJUaGUgJHtwcm9wcy5wcm9qZWN0TmFtZX0gUHJvamVjdCIpCi0gICAgICAgICAgICBwYXJhbShuYW1lOidyZXNvdXJjZXMuZGlyJywgIGV4cHJlc3Npb246IG5ldyBGaWxlKHdlYnRlc3RIb21lKycvcmVzb3VyY2VzJykudG9VUkkoKSkKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9uIHdpbmRvd3MsIHN0YXJ0IHRoZSBzdGFuZGFyZCBicm93c2VyIG9uIHRoZSByZXBvcnQgZmlsZQotICAgICAgICBpZighIHByb3BzLidvcy5uYW1lJz8uY29udGFpbnMoJ1dpbmRvd3MnKSkgcmV0dXJuCi0gICAgICAgIGRlZiByZXBvcnRIdG1sID0gIiRwcm9wcy53ZWJ0ZXN0X3Jlc3VsdHBhdGgvJHByb3BzLndlYnRlc3RfcmVzdWx0ZmlsZSIgLSAnLnhtbCcgKyAnLmh0bWwnCi0gICAgICAgIGRlZiBmaWxlbmFtZSA9IG5ldyBGaWxlKHJlcG9ydEh0bWwpLmNhbm9uaWNhbFBhdGgKLSAgICAgICAgcHJpbnRsbiAib3BlbmluZzogJGZpbGVuYW1lIgotICAgICAgICAiY21kIC9jICRmaWxlbmFtZSIuZXhlY3V0ZSgpCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0Fic3RyYWN0R3JhaWxzQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0Fic3RyYWN0R3JhaWxzQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhOWI1ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEdyYWlsc0NsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5OZXdJbnN0YW5jZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlckltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEdyYWlsc0NsYXNzIGltcGxlbWVudHMgR3JhaWxzQ2xhc3MgewotCi0JcHJpdmF0ZSBDbGFzcyBjbGF6eiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLQlwcml2YXRlIEJlYW5XcmFwcGVyIHJlZmVyZW5jZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmF0dXJhbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnROYW1lOwotCi0KLQotICAgIC8qKgotICAgICAqIDxwPkNvbnRydWN0b3IgdG8gYmUgdXNlZCBieSBhbGwgY2hpbGQgY2xhc3NlcyB0byBjcmVhdGUgYQotICAgICAqIG5ldyBpbnN0YW5jZSBhbmQgZ2V0IHRoZSBuYW1lIHJpZ2h0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IHRoZSBHcmFpbHMgY2xhc3MKLSAgICAgKiBAcGFyYW0gdHJhaWxpbmdOYW1lIHRoZSB0cmFpbGluZyBwYXJ0IG9mIHRoZSBuYW1lIGZvciB0aGlzIGNsYXNzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RHcmFpbHNDbGFzcyhDbGFzcyBjbGF6eiwgU3RyaW5nIHRyYWlsaW5nTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRDbGF6eihjbGF6eik7Ci0KLSAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSBuZXcgQmVhbldyYXBwZXJJbXBsKG5ld0luc3RhbmNlKCkpOwotICAgICAgICB0aGlzLmZ1bGxOYW1lID0gY2xhenouZ2V0TmFtZSgpOwotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gQ2xhc3NVdGlscy5nZXRQYWNrYWdlTmFtZShjbGF6eik7Ci0gICAgICAgIHRoaXMubmF0dXJhbE5hbWUgPSBHcmFpbHNDbGFzc1V0aWxzLmdldE5hdHVyYWxOYW1lKGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKHRyYWlsaW5nTmFtZSkpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IGZ1bGxOYW1lOwotICAgICAgICAgICAgdGhpcy5zaG9ydE5hbWUgPSBnZXRTaG9ydENsYXNzbmFtZShjbGF6eik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNob3J0TmFtZSA9IGdldFNob3J0Q2xhc3NuYW1lKGNsYXp6KTsKLSAgICAgICAgICAgIGlmKHNob3J0TmFtZS5pbmRleE9mKCB0cmFpbGluZ05hbWUgKSA+IC0gMSkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHNob3J0TmFtZS5zdWJzdHJpbmcoMCwgc2hvcnROYW1lLmxlbmd0aCgpIC0gdHJhaWxpbmdOYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGZ1bGxOYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNob3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2xhenooQ2xhc3MgY2xhenopIHsKLQkJaWYgKGNsYXp6ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXp6IHBhcmFtZXRlciBzaG91bGQgbm90IGJlIG51bGwiKTsKLQkJfQotCQl0aGlzLmNsYXp6ID0gY2xheno7Ci0JfQotCQotCXB1YmxpYyBDbGFzcyBnZXRDbGF6eigpIHsKLQkJcmV0dXJuIHRoaXMuY2xheno7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhenooKS5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IG51bGw7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQl0YXJnZXRFeGNlcHRpb24gPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRhcmdldEV4Y2VwdGlvbiA9IGU7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTmV3SW5zdGFuY2VDcmVhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyBbIiArIGdldENsYXp6KCkuZ2V0TmFtZSgpICsgIl0hIiwgdGFyZ2V0RXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hdHVyYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYXR1cmFsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mdWxsTmFtZTsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdyYWlsc0NsYXNzVXRpbHMuZ2V0UHJvcGVydHlOYW1lUmVwcmVzZW50YXRpb24oZ2V0Q2xhenooKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaG9ydENsYXNzbmFtZShDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gQ2xhc3NVdGlscy5nZXRTaG9ydENsYXNzTmFtZShjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDxwPlRoZSByZWZlcmVuY2UgaW5zdGFuY2UgaXMgdXNlZCB0byBnZXQgY29uZmlndXJlZCBwcm9wZXJ0eSB2YWx1ZXMuCi0JICogCi0JICogQHJldHVybiBCZWFuV3JhcHBlciBpbnN0YW5jZSB0aGF0IGhvbGRzIHJlZmVyZW5jZQotCSAqLwotCXByb3RlY3RlZCBCZWFuV3JhcHBlciBnZXRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9va3MgZm9yIGEgcHJvcGVydHkgb2YgdGhlIHJlZmVyZW5jZSBpbnN0YW5jZSB3aXRoIGEgZ2l2ZW4gbmFtZSBhbmQgdHlwZS4gSWYgZm91bmQKLQkgKiBpdHMgdmFsdWUgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBsb29rIGZvciBhIHB1YmxpYyBzdGF0aWMgZmllbGQgd2l0aCBnaXZlbiBuYW1lIGFuZCB0eXBlLAotCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHByb3BlcnR5IHZhbHVlIG9yIG51bGwgaWYgbm8gcHJvcGVydHkgb3Igc3RhdGljIGZpZWxkIHdhcyBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSkgewotCQlCZWFuV3JhcHBlciByZWYgPSBnZXRSZWZlcmVuY2UoKTsKLQkJaWYgKHJlZi5pc1JlYWRhYmxlUHJvcGVydHkobmFtZSkgJiYgcmVmLmdldFByb3BlcnR5VHlwZShuYW1lKS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSByZWYuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKLQkJCWlmKHZhbHVlICE9IG51bGwgJiYgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKHZhbHVlLmdldENsYXNzKCkpKSB7Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCUZpZWxkIGZpZWxkID0gcmVmLmdldFdyYXBwZWRDbGFzcygpLmdldEZpZWxkKG5hbWUpOwotCQkJCWlmIChNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkgJiYgTW9kaWZpZXIuaXNQdWJsaWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpICYmIGZpZWxkLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIGZpZWxkLmdldChyZWYuZ2V0V3JhcHBlZEluc3RhbmNlKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4MzM3My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotCi0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzIGV4dGVuZHMgQWJzdHJhY3RHcmFpbHNDbGFzcwotCQlpbXBsZW1lbnRzIEluamVjdGFibGVHcmFpbHNDbGFzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllfTkFNRV9QUk9QRVJUWSA9ICJieU5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVkFJTEFCTEVfUFJPUEVSVFkgPSAiYXZhaWxhYmxlIjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYnlOYW1lID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGJ5VHlwZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGF2YWlsYWJsZSA9IHRydWU7Ci0JCi0JcHVibGljIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzKENsYXNzIGNsYXp6LCBTdHJpbmcgdHJhaWxpbmdOYW1lKSB7Ci0JCXN1cGVyKGNsYXp6LCB0cmFpbGluZ05hbWUpOwotCi0JCU9iamVjdCBieU5hbWVWYWx1ZSA9IGdldFByb3BlcnR5VmFsdWUoQllfTkFNRV9QUk9QRVJUWSwgQm9vbGVhbi5jbGFzcyk7Ci0JCXRoaXMuYnlOYW1lID0gYnlOYW1lVmFsdWUgIT0gbnVsbCAmJiBieU5hbWVWYWx1ZS5lcXVhbHMoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5ieVR5cGUgPSAhYnlOYW1lOwotCQkKLQkJT2JqZWN0IGF2YWlsYWJsZVZhbHVlID0gZ2V0UHJvcGVydHlWYWx1ZShBVkFJTEFCTEVfUFJPUEVSVFksIEJvb2xlYW4uY2xhc3MpOwotCQl0aGlzLmF2YWlsYWJsZSA9IGF2YWlsYWJsZVZhbHVlID09IG51bGwgfHwgYXZhaWxhYmxlVmFsdWUuZXF1YWxzKEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYnlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ieU5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYnlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5ieVR5cGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEF2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXZhaWxhYmxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjAxNDEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkFycmF5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuR3JhaWxzUmVzb3VyY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5HcmFpbHNDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuTW9yZVRoYW5PbmVBY3RpdmVEYXRhU291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuY2ZnLkdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5SZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgR3JhaWxzQXBwbGljYXRpb24gaW50ZXJmYWNlIHRoYXQgbWFuYWdlcyBhcHBsaWNhdGlvbiBsb2FkaW5nLAotICogc3RhdGUsIGFuZCBhcnRpZmFjdCBpbnN0YW5jZXMuCi0gKgotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICoKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uIGltcGxlbWVudHMgR3JhaWxzQXBwbGljYXRpb24gewotICAgIHByaXZhdGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgIHByaXZhdGUgR3JhaWxzQ29udHJvbGxlckNsYXNzW10gY29udHJvbGxlckNsYXNzZXMgPSBudWxsOwotICAgIHByaXZhdGUgR3JhaWxzUGFnZUZsb3dDbGFzc1tdIHBhZ2VGbG93cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBHcmFpbHNEb21haW5DbGFzc1tdIGRvbWFpbkNsYXNzZXMgPSBudWxsOwotICAgIHByaXZhdGUgR3JhaWxzRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbnVsbDsKLSAgICBwcml2YXRlIEdyYWlsc1NlcnZpY2VDbGFzc1tdIHNlcnZpY2VzID0gbnVsbDsKLSAgICBwcml2YXRlIEdyYWlsc0Jvb3RzdHJhcENsYXNzW10gYm9vdHN0cmFwQ2xhc3NlcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBHcmFpbHNUYWdMaWJDbGFzc1tdIHRhZ2xpYkNsYXNzZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNYXAgY29udHJvbGxlck1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXAgZG9tYWluTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcCBwYWdlRmxvd01hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXAgc2VydmljZU1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXAgYm9vdHN0cmFwTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcCB0YWdsaWJNYXAgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGFsbENsYXNzZXMgPSBudWxsOwotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzKTsKLSAgICBwcml2YXRlIE1hcCB0YWcybGliTWFwOwotCi0KLSAgICBwdWJsaWMgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKGZpbmFsIENsYXNzW10gY2xhc3NlcywgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgaWYoY2xhc3NlcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uc3RydWN0b3IgYXJndW1lbnQgJ2NsYXNzZXMnIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgY29uZmlndXJlTG9hZGVkQ2xhc3NlcyhjbGFzc2VzKTsKLSAgICAgICAgdGhpcy5jbCA9IGNsYXNzTG9hZGVyOwotICAgIH0KLSAgICBwdWJsaWMgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKGZpbmFsIFJlc291cmNlW10gcmVzb3VyY2VzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiTG9hZGluZyBHcmFpbHMgYXBwbGljYXRpb24uIik7Ci0KLSAgICAgICAgR3JhaWxzUmVzb3VyY2VMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgR3JhaWxzUmVzb3VyY2VMb2FkZXIocmVzb3VyY2VzKTsKLSAgICAgICAgR3JhaWxzUmVzb3VyY2VIb2xkZXIgcmVzb3VyY2VIb2xkZXIgPSBuZXcgR3JhaWxzUmVzb3VyY2VIb2xkZXIoKTsKLQotICAgICAgICB0aGlzLmNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHRoaXMuY2wuc2V0UmVzb3VyY2VMb2FkZXIocmVzb3VyY2VMb2FkZXIpOwotICAgICAgICAgICBDb2xsZWN0aW9uIGxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHJlc291cmNlcyAhPSBudWxsICYmIGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgZ3Jvb3Z5IGZpbGUgOlsiICsgcmVzb3VyY2VzW2ldLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2VzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc291cmNlSG9sZGVyLmdldENsYXNzTmFtZShyZXNvdXJjZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIVN0cmluZ1V0aWxzLmlzQmxhbmsoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhjbGFzc05hbWUsdHJ1ZSxmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkUmVzb3VyY2VzID0gcmVzb3VyY2VMb2FkZXIuZ2V0TG9hZGVkUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24oIkNvbXBpbGF0aW9uIGVycm9yIHBhcnNpbmcgZmlsZSBbIityZXNvdXJjZXNbaV0uZ2V0RmlsZW5hbWUoKSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYWxsIHRoZSBjbGFzc2VzIHRoYXQgd2VyZSBsb2FkZWQKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2cuZGVidWcoICJsb2FkZWQgY2xhc3NlczogWyIrQXJyYXlVdGlscy50b1N0cmluZyh0aGlzLmNsLmdldExvYWRlZENsYXNzZXMoKSkrIl0iICk7Ci0KLSAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0gdGhpcy5jbC5nZXRMb2FkZWRDbGFzc2VzKCk7Ci0gICAgICAgIHRoaXMuYWxsQ2xhc3NlcyA9IGNsYXNzZXM7Ci0gICAgICAgIGNvbmZpZ3VyZUxvYWRlZENsYXNzZXMoY2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUxvYWRlZENsYXNzZXMoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0KLSAgICAgICAgLy8gZmlyc3QgbG9hZCB0aGUgZG9tYWluIGNsYXNzZXMKLSAgICAgICAgdGhpcy5kb21haW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBsb2cuZGVidWcoIkdvaW5nIHRvIGluc3BlY3QgZG9tYWluIGNsYXNzZXMuIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnNwZWN0aW5nIFsiICsgY2xhc3Nlc1tpXS5nZXROYW1lKCkgKyAiXSIpOwotICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoY2xhc3Nlc1tpXS5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlsiICsgY2xhc3Nlc1tpXS5nZXROYW1lKCkgKyAiXSBpcyBhYnN0cmFjdC4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgaXQgaXMgYSBkb21haW4gY2xhc3MKLSAgICAgICAgICAgIGlmKEdyYWlsc0NsYXNzVXRpbHMuaXNEb21haW5DbGFzcyhjbGFzc2VzW2ldKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiWyIgKyBjbGFzc2VzW2ldLmdldE5hbWUoKSArICJdIGlzIGEgZG9tYWluIGNsYXNzLiIpOwotICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGdyYWlsc0RvbWFpbkNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5DbGFzcyhjbGFzc2VzW2ldKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRvbWFpbk1hcC5wdXQoZ3JhaWxzRG9tYWluQ2xhc3MuZ2V0RnVsbE5hbWUoKSwgZ3JhaWxzRG9tYWluQ2xhc3MpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiWyIgKyBjbGFzc2VzW2ldLmdldE5hbWUoKSArICJdIGlzIG5vdCBhIGRvbWFpbiBjbGFzcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29udHJvbGxlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMucGFnZUZsb3dNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnNlcnZpY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmJvb3RzdHJhcE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMudGFnbGliTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdChjbGFzc2VzW2ldLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEdyYWlsc0NsYXNzVXRpbHMuaXNDb250cm9sbGVyQ2xhc3MoY2xhc3Nlc1tpXSkgIC8qICYmIG5vdCBlbmRzIHdpdGggRnJvbUNvbnRyb2xsZXIgKi8pIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ3JhaWxzQ29udHJvbGxlckNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MoY2xhc3Nlc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyYWlsc0NvbnRyb2xsZXJDbGFzcy5nZXRBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJNYXAucHV0KGdyYWlsc0NvbnRyb2xsZXJDbGFzcy5nZXRGdWxsTmFtZSgpLCBncmFpbHNDb250cm9sbGVyQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoR3JhaWxzQ2xhc3NVdGlscy5pc1BhZ2VGbG93Q2xhc3MoY2xhc3Nlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNQYWdlRmxvd0NsYXNzIGdyYWlsc1BhZ2VGbG93Q2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc1BhZ2VGbG93Q2xhc3MoY2xhc3Nlc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyYWlsc1BhZ2VGbG93Q2xhc3MuZ2V0QXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRmxvd01hcC5wdXQoZ3JhaWxzUGFnZUZsb3dDbGFzcy5nZXRGdWxsTmFtZSgpLCBncmFpbHNQYWdlRmxvd0NsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEdyYWlsc0NsYXNzVXRpbHMuaXNEYXRhU291cmNlKGNsYXNzZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgR3JhaWxzRGF0YVNvdXJjZSB0bXBEYXRhU291cmNlID0gbmV3IERlZmF1bHRHcmFpbHNEYXRhU291cmNlKGNsYXNzZXNbaV0pOwotICAgICAgICAgICAgICAgIGlmICh0bXBEYXRhU291cmNlLmdldEF2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSB0bXBEYXRhU291cmNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vcmVUaGFuT25lQWN0aXZlRGF0YVNvdXJjZUV4Y2VwdGlvbigiTW9yZSB0aGFuIG9uZSBhY3RpdmUgZGF0YSBzb3VyY2UgaXMgY29uZmlndXJlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoR3JhaWxzQ2xhc3NVdGlscy5pc1NlcnZpY2UoY2xhc3Nlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNTZXJ2aWNlQ2xhc3MgZ3JhaWxzU2VydmljZUNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNTZXJ2aWNlQ2xhc3MoY2xhc3Nlc1tpXSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZU1hcC5wdXQoZ3JhaWxzU2VydmljZUNsYXNzLmdldEZ1bGxOYW1lKCksIGdyYWlsc1NlcnZpY2VDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEdyYWlsc0NsYXNzVXRpbHMuaXNCb290c3RyYXBDbGFzcyhjbGFzc2VzW2ldKSkgewotICAgICAgICAgICAgICAgIEdyYWlsc0Jvb3RzdHJhcENsYXNzIGdyYWlsc0Jvb3RzdHJhcENsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNCb290c3RyYXBDbGFzcyhjbGFzc2VzW2ldKTsKLSAgICAgICAgICAgICAgICB0aGlzLmJvb3RzdHJhcE1hcC5wdXQoZ3JhaWxzQm9vdHN0cmFwQ2xhc3MuZ2V0RnVsbE5hbWUoKSxncmFpbHNCb290c3RyYXBDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEdyYWlsc0NsYXNzVXRpbHMuaXNUYWdMaWJDbGFzcyhjbGFzc2VzW2ldKSkgewotICAgICAgICAgICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIGdyYWlsc1RhZ0xpYkNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNUYWdMaWJDbGFzcyhjbGFzc2VzW2ldKTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhZ2xpYk1hcC5wdXQoZ3JhaWxzVGFnTGliQ2xhc3MuZ2V0RnVsbE5hbWUoKSxncmFpbHNUYWdMaWJDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbnRyb2xsZXJDbGFzc2VzID0gKChHcmFpbHNDb250cm9sbGVyQ2xhc3NbXSljb250cm9sbGVyTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IEdyYWlsc0NvbnRyb2xsZXJDbGFzc1tjb250cm9sbGVyTWFwLnNpemUoKV0pKTsKLSAgICAgICAgdGhpcy5wYWdlRmxvd3MgPSAoKEdyYWlsc1BhZ2VGbG93Q2xhc3NbXSlwYWdlRmxvd01hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBHcmFpbHNQYWdlRmxvd0NsYXNzW3BhZ2VGbG93TWFwLnNpemUoKV0pKTsKLSAgICAgICAgdGhpcy5kb21haW5DbGFzc2VzID0gKChHcmFpbHNEb21haW5DbGFzc1tdKXRoaXMuZG9tYWluTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IEdyYWlsc0RvbWFpbkNsYXNzW2RvbWFpbk1hcC5zaXplKCldKSk7Ci0gICAgICAgIHRoaXMuc2VydmljZXMgPSAoKEdyYWlsc1NlcnZpY2VDbGFzc1tdKXRoaXMuc2VydmljZU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBHcmFpbHNTZXJ2aWNlQ2xhc3Nbc2VydmljZU1hcC5zaXplKCldKSk7Ci0gICAgICAgIHRoaXMuYm9vdHN0cmFwQ2xhc3NlcyA9ICgoR3JhaWxzQm9vdHN0cmFwQ2xhc3NbXSl0aGlzLmJvb3RzdHJhcE1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBHcmFpbHNCb290c3RyYXBDbGFzc1tib290c3RyYXBNYXAuc2l6ZSgpXSkpOwotICAgICAgICB0aGlzLnRhZ2xpYkNsYXNzZXMgPSAoKEdyYWlsc1RhZ0xpYkNsYXNzW10pdGhpcy50YWdsaWJNYXAudmFsdWVzKCkudG9BcnJheShuZXcgR3JhaWxzVGFnTGliQ2xhc3NbdGFnbGliTWFwLnNpemUoKV0pKTsKLQotICAgICAgICBjb25maWd1cmVEb21haW5DbGFzc1JlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgY29uZmlndXJlVGFnTGlicmFyaWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBhZGRDb250cm9sbGVyQ2xhc3MoQ2xhc3MgY29udHJvbGxlckNsYXNzKSB7Ci0gICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KGNvbnRyb2xsZXJDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChHcmFpbHNDbGFzc1V0aWxzLmlzQ29udHJvbGxlckNsYXNzKGNvbnRyb2xsZXJDbGFzcykpIHsKLSAgICAgICAgICAgIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBncmFpbHNDb250cm9sbGVyQ2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc0NvbnRyb2xsZXJDbGFzcyhjb250cm9sbGVyQ2xhc3MpOwotICAgICAgICAgICAgaWYgKGdyYWlsc0NvbnRyb2xsZXJDbGFzcy5nZXRBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlck1hcC5wdXQoZ3JhaWxzQ29udHJvbGxlckNsYXNzLmdldEZ1bGxOYW1lKCksIGdyYWlsc0NvbnRyb2xsZXJDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlc2V0IGNvbnRyb2xsZXIgbGlzdAotICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQ2xhc3NlcyA9ICgoR3JhaWxzQ29udHJvbGxlckNsYXNzW10pY29udHJvbGxlck1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBHcmFpbHNDb250cm9sbGVyQ2xhc3NbY29udHJvbGxlck1hcC5zaXplKCldKSk7Ci0gICAgICAgICAgICByZXR1cm4gZ3JhaWxzQ29udHJvbGxlckNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBsb2FkIGNvbnRyb2xsZXIgY2xhc3MgWyIrY29udHJvbGxlckNsYXNzKyJdLiBJdCBpcyBub3QgYSBjb250cm9sbGVyISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc1RhZ0xpYkNsYXNzIGFkZFRhZ0xpYkNsYXNzKENsYXNzIHRhZ0xpYkNsYXNzKSB7Ci0gICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KHRhZ0xpYkNsYXNzLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdyYWlsc0NsYXNzVXRpbHMuaXNUYWdMaWJDbGFzcyh0YWdMaWJDbGFzcykpIHsKLSAgICAgICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIGdyYWlsc1RhZ0xpYkNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNUYWdMaWJDbGFzcyh0YWdMaWJDbGFzcyk7Ci0gICAgICAgICAgICBpZiAoZ3JhaWxzVGFnTGliQ2xhc3MuZ2V0QXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhZ2xpYk1hcC5wdXQoZ3JhaWxzVGFnTGliQ2xhc3MuZ2V0RnVsbE5hbWUoKSwgZ3JhaWxzVGFnTGliQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXNldCB0YWdsaWIgbGlzdAotICAgICAgICAgICAgdGhpcy50YWdsaWJDbGFzc2VzID0gKChHcmFpbHNUYWdMaWJDbGFzc1tdKXRoaXMudGFnbGliTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IEdyYWlsc1RhZ0xpYkNsYXNzW3RhZ2xpYk1hcC5zaXplKCldKSk7Ci0gICAgICAgICAgICAvLyByZWNvbmZpZ3VyZSBjb250cm9sbGVyIG1hcHBpbmdzCi0gICAgICAgICAgICBjb25maWd1cmVUYWdMaWJyYXJpZXMoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGdyYWlsc1RhZ0xpYkNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBsb2FkIHRhZ2xpYiBjbGFzcyBbIit0YWdMaWJDbGFzcysiXS4gSXQgaXMgbm90IGEgdGFnbGliISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc1NlcnZpY2VDbGFzcyBhZGRTZXJ2aWNlQ2xhc3MoQ2xhc3Mgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KHNlcnZpY2VDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChHcmFpbHNDbGFzc1V0aWxzLmlzU2VydmljZShzZXJ2aWNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICBHcmFpbHNTZXJ2aWNlQ2xhc3MgZ3JhaWxzU2VydmljZUNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNTZXJ2aWNlQ2xhc3Moc2VydmljZUNsYXNzKTsKLSAgICAgICAgICAgIGlmIChncmFpbHNTZXJ2aWNlQ2xhc3MuZ2V0QXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VNYXAucHV0KGdyYWlsc1NlcnZpY2VDbGFzcy5nZXRGdWxsTmFtZSgpLCBncmFpbHNTZXJ2aWNlQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXNldCBzZXJ2aWNlcyBsaXN0Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gKChHcmFpbHNTZXJ2aWNlQ2xhc3NbXSl0aGlzLnNlcnZpY2VNYXAudmFsdWVzKCkudG9BcnJheShuZXcgR3JhaWxzU2VydmljZUNsYXNzW3NlcnZpY2VNYXAuc2l6ZSgpXSkpOwotICAgICAgICAgICAgcmV0dXJuIGdyYWlsc1NlcnZpY2VDbGFzczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBzZXJ2aWNlIGNsYXNzIFsiK3NlcnZpY2VDbGFzcysiXS4gSXQgaXMgbm90IGEgdmFsaWQgc2VydmljZSBjbGFzcyEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzcyBhZGREb21haW5DbGFzcyhDbGFzcyBkb21haW5DbGFzcykgewotICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoZG9tYWluQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoR3JhaWxzQ2xhc3NVdGlscy5pc0RvbWFpbkNsYXNzKGRvbWFpbkNsYXNzKSkgewotICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZ3JhaWxzRG9tYWluQ2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzKGRvbWFpbkNsYXNzKTsKLQotICAgICAgICAgICAgdGhpcy5kb21haW5NYXAucHV0KGdyYWlsc0RvbWFpbkNsYXNzLmdldEZ1bGxOYW1lKCksIGdyYWlsc0RvbWFpbkNsYXNzKTsKLQotCi0gICAgICAgICAgICAvLyByZXNldCBkb21haW4gY2xhc3MgbGlzdAotICAgICAgICAgICAgdGhpcy5kb21haW5DbGFzc2VzID0gKChHcmFpbHNEb21haW5DbGFzc1tdKXRoaXMuZG9tYWluTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IEdyYWlsc0RvbWFpbkNsYXNzW2RvbWFpbk1hcC5zaXplKCldKSk7Ci0gICAgICAgICAgICAvLyByZWNvbmZpZ3VyZSByZWxhdGlvbnNoaXBzCi0gICAgICAgICAgICBjb25maWd1cmVEb21haW5DbGFzc1JlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGdyYWlsc0RvbWFpbkNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBsb2FkIGRvbWFpbiBjbGFzcyBbIitkb21haW5DbGFzcysiXS4gSXQgaXMgbm90IGEgdmFsaWQgZG9tYWluIGNsYXNzISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzIGFkZERvbWFpbkNsYXNzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzKSB7Ci0gICAgICAgIGlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZG9tYWluTWFwLnB1dChkb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpLGRvbWFpbkNsYXNzKTsKLQotICAgICAgICAgICAgLy8gcmVzZXQgZG9tYWluIGNsYXNzIGxpc3QKLSAgICAgICAgICAgIHRoaXMuZG9tYWluQ2xhc3NlcyA9ICgoR3JhaWxzRG9tYWluQ2xhc3NbXSl0aGlzLmRvbWFpbk1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBHcmFpbHNEb21haW5DbGFzc1tkb21haW5NYXAuc2l6ZSgpXSkpOwotICAgICAgICAgICAvLyBpZighKGRvbWFpbkNsYXNzIGluc3RhbmNlb2YgRXh0ZXJuYWxHcmFpbHNEb21haW5DbGFzcykpIHsKLSAgICAgICAgICAgICAgICAvLyByZWNvbmZpZ3VyZSByZWxhdGlvbnNoaXBzCi0gICAgICAgICAgICAgICAgY29uZmlndXJlRG9tYWluQ2xhc3NSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgICAgIC8vIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9tYWluQ2xhc3M7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgR3JhaWxzQ29udHJvbGxlckNsYXNzIGdldFNjYWZmb2xkaW5nQ29udHJvbGxlcihHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcykgewotICAgICAgICBpZihkb21haW5DbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgR3JhaWxzQ29udHJvbGxlckNsYXNzIGNvbnRyb2xsZXJDbGFzcyA9IGNvbnRyb2xsZXJDbGFzc2VzW2ldOwotICAgICAgICAgICAgaWYoY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKSkgewotICAgICAgICAgICAgICAgIENsYXNzIHNjYWZmb2xkZWRDbGFzcyA9IGNvbnRyb2xsZXJDbGFzcy5nZXRTY2FmZm9sZGVkQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZihzY2FmZm9sZGVkQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihkb21haW5DbGFzcy5nZXRDbGF6eigpLmdldE5hbWUoKS5lcXVhbHMoc2NhZmZvbGRlZENsYXNzLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihkb21haW5DbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNvbnRyb2xsZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyQ2xhc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1hcCBvZiB0YWdzIHRvIHRhZyBsaWJyYXJpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlVGFnTGlicmFyaWVzKCkgewotICAgICAgICB0aGlzLnRhZzJsaWJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYkNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIHRhZ2xpYkNsYXNzID0gdGFnbGliQ2xhc3Nlc1tpXTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHRhZ2xpYkNsYXNzLmdldFRhZ05hbWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBqLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZighdGhpcy50YWdsaWJNYXAuY29udGFpbnNLZXkodGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50YWcybGliTWFwLnB1dCh0YWdOYW1lLHRhZ2xpYkNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIGN1cnJlbnQgPSAoR3JhaWxzVGFnTGliQ2xhc3MpdGhpcy50YWdsaWJNYXAuZ2V0KHRhZ05hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZighdGFnbGliQ2xhc3MuZXF1YWxzKGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZzJsaWJNYXAucHV0KHRhZ05hbWUsdGFnbGliQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBjb25maWd1cmUgdGFnIGxpYnJhcnkgWyIrdGFnbGliQ2xhc3MuZ2V0TmFtZSgpKyJdLiBMaWJyYXJ5IFsiK2N1cnJlbnQuZ2V0TmFtZSgpKyJdIGFscmVhZHkgY29udGFpbnMgYSB0YWcgY2FsbGVkIFsiK3RhZ05hbWUrIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgZG9tYWluIGNsYXNzZXMsIHRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIKLSAgICAgKiB0aGUgaW50aWFsIGNyZWF0aW9uIHRvIGF2b2lkIGxvb3BpbmcKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVEb21haW5DbGFzc1JlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvblV0aWwuY29uZmlndXJlRG9tYWluQ2xhc3NSZWxhdGlvbnNoaXBzKHRoaXMuZG9tYWluQ2xhc3Nlcyx0aGlzLmRvbWFpbk1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0NvbnRyb2xsZXJDbGFzc1tdIGdldENvbnRyb2xsZXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzQ29udHJvbGxlckNsYXNzIGdldENvbnRyb2xsZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChHcmFpbHNDb250cm9sbGVyQ2xhc3MpdGhpcy5jb250cm9sbGVyTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzQ29udHJvbGxlckNsYXNzIGdldENvbnRyb2xsZXJCeVVSSShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyQ2xhc3Nlc1tpXS5tYXBzVG9VUkkodXJpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyQ2xhc3Nlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzUGFnZUZsb3dDbGFzcyBnZXRQYWdlRmxvdyhTdHJpbmcgZnVsbG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChHcmFpbHNQYWdlRmxvd0NsYXNzKXRoaXMucGFnZUZsb3dNYXAuZ2V0KGZ1bGxuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzUGFnZUZsb3dDbGFzc1tdIGdldFBhZ2VGbG93cygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFnZUZsb3dzOwotICAgIH0KLQotICAgIHB1YmxpYyBHcm9vdnlDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2w7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzW10gZ2V0R3JhaWxzRG9tYWluQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyYWlsc0RvbWFpbkNsYXNzKENsYXNzIGRvbWFpbkNsYXNzKSB7Ci0gICAgICAgIGlmKGRvbWFpbkNsYXNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYoZG9tYWluTWFwLmNvbnRhaW5zS2V5KGRvbWFpbkNsYXNzLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsgIAotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzcyBnZXRHcmFpbHNEb21haW5DbGFzcyhTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIChHcmFpbHNEb21haW5DbGFzcyl0aGlzLmRvbWFpbk1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgR3JhaWxzRGF0YVNvdXJjZSBnZXRHcmFpbHNEYXRhU291cmNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNTZXJ2aWNlQ2xhc3NbXSBnZXRHcmFpbHNTZXJ2aWNlQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc1NlcnZpY2VDbGFzcyBnZXRHcmFpbHNTZXJ2aWNlQ2xhc3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChHcmFpbHNTZXJ2aWNlQ2xhc3MpdGhpcy5zZXJ2aWNlTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBbGxDbGFzc2VzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hbGxDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNCb290c3RyYXBDbGFzc1tdIGdldEdyYWlsc0Jvb3RzdHJhcENsYXNzZXMoKSB7CQkvLwotICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNUYWdMaWJDbGFzc1tdIGdldEdyYWlsc1RhYkxpYkNsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRhZ2xpYkNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc1RhZ0xpYkNsYXNzIGdldEdyYWlsc1RhZ0xpYkNsYXNzKFN0cmluZyB0YWdMaWJOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoR3JhaWxzVGFnTGliQ2xhc3MpdGhpcy50YWdsaWJNYXAuZ2V0KHRhZ0xpYk5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNUYWdMaWJDbGFzcyBnZXRUYWdMaWJDbGFzc0ZvclRhZyhTdHJpbmcgdGFnTmFtZSkgewotICAgICAgICByZXR1cm4gKEdyYWlsc1RhZ0xpYkNsYXNzKXRoaXMudGFnMmxpYk1hcC5nZXQodGFnTmFtZSk7Ci0gICAgfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzQm9vdHN0cmFwQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNCb290c3RyYXBDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZiZjE4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNCb290c3RyYXBDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JhaWxzQm9vdHN0cmFwQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdEdyYWlsc0NsYXNzIGltcGxlbWVudHMgR3JhaWxzQm9vdHN0cmFwQ2xhc3MgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9TVFJBUCA9ICJCb290U3RyYXAiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX0NMT1NVUkUgPSAiaW5pdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1lfQ0xPU1VSRSA9ICJkZXN0cm95IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbG9zdXJlIEJMQU5LX0NMT1NVUkUgPSBuZXcgQ2xvc3VyZShEZWZhdWx0R3JhaWxzQm9vdHN0cmFwQ2xhc3MuY2xhc3MpIHsKLQkJcHVibGljIE9iamVjdCBjYWxsKE9iamVjdFtdIGFyZ3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9OwotCi0JCi0JcHVibGljIERlZmF1bHRHcmFpbHNCb290c3RyYXBDbGFzcyhDbGFzcyBjbGF6eikgewotCQlzdXBlcihjbGF6eiwgQk9PVF9TVFJBUCk7Ci0JfQotCi0JcHVibGljIENsb3N1cmUgZ2V0SW5pdENsb3N1cmUoKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZWZlcmVuY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKElOSVRfQ0xPU1VSRSk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCXJldHVybiAoQ2xvc3VyZSlvYmo7Ci0JCX0KLQkJcmV0dXJuIEJMQU5LX0NMT1NVUkU7Ci0JfQotCi0JcHVibGljIENsb3N1cmUgZ2V0RGVzdHJveUNsb3N1cmUoKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRSZWZlcmVuY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKERFU1RST1lfQ0xPU1VSRSk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCXJldHVybiAoQ2xvc3VyZSlvYmo7Ci0JCX0KLQkJcmV0dXJuIEJMQU5LX0NMT1NVUkU7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FsbEluaXQoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKLQkJQ2xvc3VyZSBpbml0ID0gZ2V0SW5pdENsb3N1cmUoKTsKLQkJaW5pdC5jYWxsKCBuZXcgT2JqZWN0W10geyBzZXJ2bGV0Q29udGV4dCB9ICk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FsbERlc3Ryb3koKSB7Ci0JCUNsb3N1cmUgZGVzdHJveSA9IGdldEluaXRDbG9zdXJlKCk7Ci0JCWRlc3Ryb3kuY2FsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0YmExYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzQ29udHJvbGxlckNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuV29yZFV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLkRlZmF1bHRHcmFpbHNTY2FmZm9sZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLkdyYWlsc1NjYWZmb2xkZXI7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBleHRlbmRzIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzCi0JCWltcGxlbWVudHMgR3JhaWxzQ29udHJvbGxlckNsYXNzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVIgPSAiQ29udHJvbGxlciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSAiVmlldyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVEX1ZJRVdTID0gIlR5cGVkVmlld3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMT1NVUkVfUFJPUEVSVFkgPSAiZGVmYXVsdEFjdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUZGT0xESU5HX1BST1BFUlRZID0gInNjYWZmb2xkIjsKLQotCQotCi0JcHJpdmF0ZSBNYXAgdXJpMnZpZXdNYXAgPSBudWxsOwotCXByaXZhdGUgTWFwIHVyaTJjbG9zdXJlTWFwID0gbnVsbDsKLQlwcml2YXRlIE1hcCB2aWV3TmFtZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gdXJpcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNjYWZmb2xkaW5nOwotICAgIHByaXZhdGUgQ2xhc3Mgc2NhZmZvbGRlZENsYXNzOwotCi0KLSAgICBwdWJsaWMgRGVmYXVsdEdyYWlsc0NvbnRyb2xsZXJDbGFzcyhDbGFzcyBjbGF6eikgewotICAgICAgICBzdXBlcihjbGF6eiwgQ09OVFJPTExFUik7Ci0gICAgICAgIHRoaXMudXJpID0gU0xBU0ggKyAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhnZXRQYWNrYWdlTmFtZSgpKSA/IGdldFBhY2thZ2VOYW1lKCkucmVwbGFjZSgnLicsICcvJykgICsgU0xBU0ggOiAiIiApICsgV29yZFV0aWxzLnVuY2FwaXRhbGl6ZShnZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgZGVmYXVsdEFjdGlvbk5hbWUgPSAoU3RyaW5nKWdldFByb3BlcnR5VmFsdWUoREVGQVVMVF9DTE9TVVJFX1BST1BFUlRZLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICBpZihkZWZhdWx0QWN0aW9uTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0QWN0aW9uTmFtZSA9IElOREVYX0FDVElPTjsKLSAgICAgICAgfQotICAgICAgICBCb29sZWFuIHRtcCA9IChCb29sZWFuKWdldFByb3BlcnR5VmFsdWUoU0NBRkZPTERJTkdfUFJPUEVSVFksIEJvb2xlYW4uY2xhc3MpOwotICAgICAgICBpZih0bXAgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zY2FmZm9sZGluZyA9IHRtcC5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNjYWZmb2xkZWRDbGFzcyA9IChDbGFzcylnZXRQcm9wZXJ0eVZhbHVlKFNDQUZGT0xESU5HX1BST1BFUlRZLCBDbGFzcy5jbGFzcyk7Ci0gICAgICAgIGlmKHRoaXMuc2NhZmZvbGRlZENsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuc2NhZmZvbGRpbmcgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbiBjbG9zdXJlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMudXJpMnZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnVyaTJjbG9zdXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy52aWV3TmFtZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGlmKHRoaXMuc2NhZmZvbGRpbmcpIHsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBEZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5BQ1RJT05fTkFNRVMubGVuZ3RoO2krKykgewotICAgICAgICAgICAgICAgIGNsb3N1cmVOYW1lcy5hZGQoRGVmYXVsdEdyYWlsc1NjYWZmb2xkZXIuQUNUSU9OX05BTUVTW2ldKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmlld05hbWUgPSAoU3RyaW5nKWdldFByb3BlcnR5VmFsdWUoRGVmYXVsdEdyYWlsc1NjYWZmb2xkZXIuQUNUSU9OX05BTUVTW2ldICsgVklFVywgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAvLyBpZiBubyBleHBsaWNpdHkgdmlldyBuYW1lIGlzIHNwZWNpZmllZCBqdXN0IHVzZSBhY3Rpb24gbmFtZQotICAgICAgICAgICAgICAgIGlmKHZpZXdOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlld05hbWUgPURlZmF1bHRHcmFpbHNTY2FmZm9sZGVyLkFDVElPTl9OQU1FU1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcFVyaSA9IHVyaSArIFNMQVNIICsgRGVmYXVsdEdyYWlsc1NjYWZmb2xkZXIuQUNUSU9OX05BTUVTW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyB2aWV3VXJpID0gdXJpICsgU0xBU0ggKyB2aWV3TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayh2aWV3TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy51cmkydmlld01hcC5wdXQodG1wVXJpLCB2aWV3VXJpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3TmFtZXMucHV0KCBEZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5BQ1RJT05fTkFNRVNbaV0sIHZpZXdVcmkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy51cmkyY2xvc3VyZU1hcC5wdXQodG1wVXJpLCBEZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5BQ1RJT05fTkFNRVNbaV0pOwotICAgICAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHRtcFVyaSArICIvKioiLCBEZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5BQ1RJT05fTkFNRVNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGdldFJlZmVyZW5jZSgpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKWdldFByb3BlcnR5VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSwgQ2xvc3VyZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xvc3VyZU5hbWVzLmFkZChwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xvc3VyZU5hbWUgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2aWV3TmFtZSA9IChTdHJpbmcpZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpICsgVklFVywgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAvLyBpZiBubyBleHBsaWNpdHkgdmlldyBuYW1lIGlzIHNwZWNpZmllZCBqdXN0IHVzZSBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAgICAgICAgaWYodmlld05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2aWV3TmFtZSA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1hcCB0eXBlZFZpZXdzID0gKE1hcClnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCkgKyBUWVBFRF9WSUVXUywgTWFwLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVXJpID0gdXJpICsgU0xBU0ggKyBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2aWV3VXJpID0gdXJpICsgU0xBU0ggKyB2aWV3TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayh2aWV3TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy51cmkydmlld01hcC5wdXQodG1wVXJpLCB2aWV3VXJpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3TmFtZXMucHV0KCBjbG9zdXJlTmFtZSwgdmlld1VyaSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbG9zdXJlID0gKENsb3N1cmUpZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpLCBDbG9zdXJlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHRtcFVyaSwgcHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHRtcFVyaSArICIvKioiLCBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBjb2RlIGlzIGxpa2VseSBicm9rZW4gYW5kIG5lZWRzIHJlLXRoaW5raW5nIGFzIHRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHR5cGVkIHZpZXdzCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZFZpZXdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkVmlld3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZpZXdUeXBlID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZWRWaWV3TmFtZSA9IChTdHJpbmcpdHlwZWRWaWV3cy5nZXQodmlld1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlZFVyaSA9IHRtcFVyaSArIFNMQVNIICsgdmlld1R5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cmkydmlld01hcC5wdXQodHlwZWRVcmksIHR5cGVkVmlld05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHR5cGVkVXJpLCBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEFjdGlvbk5hbWUgIT0gbnVsbCAmJiBkZWZhdWx0QWN0aW9uTmFtZS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cmkyY2xvc3VyZU1hcC5wdXQodXJpICsgU0xBU0ggKyB2aWV3VHlwZSwgcHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXJpMnZpZXdNYXAucHV0KHVyaSArIFNMQVNIICsgdmlld1R5cGUsIHR5cGVkVmlld05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWZhdWx0QWN0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnVyaTJjbG9zdXJlTWFwLnB1dCh1cmksIGRlZmF1bHRBY3Rpb25OYW1lKTsKLSAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHVyaSArIFNMQVNILCBkZWZhdWx0QWN0aW9uTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnVyaTJ2aWV3TWFwLnB1dCh1cmkgKyBTTEFTSCwgdXJpICsgU0xBU0ggKyBkZWZhdWx0QWN0aW9uTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnVyaTJ2aWV3TWFwLnB1dCh1cmksdXJpICsgU0xBU0ggKyAgZGVmYXVsdEFjdGlvbk5hbWUpOwotICAgICAgICAgICAgdGhpcy52aWV3TmFtZXMucHV0KCBkZWZhdWx0QWN0aW9uTmFtZSwgdXJpICsgU0xBU0ggKyBkZWZhdWx0QWN0aW9uTmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsb3N1cmVOYW1lcy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgU3RyaW5nIGNsb3N1cmVOYW1lID0gKChTdHJpbmcpY2xvc3VyZU5hbWVzLml0ZXJhdG9yKCkubmV4dCgpKTsKLSAgICAgICAgICAgIHRoaXMudXJpMmNsb3N1cmVNYXAucHV0KHVyaSwgdGhpcy51cmkyY2xvc3VyZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0gICAgICAgICAgICBpZiAoIXRoaXMudXJpMnZpZXdNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy51cmkydmlld01hcC5wdXQodXJpLCB0aGlzLnVyaTJ2aWV3TWFwLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1hcCB0eXBlZFZpZXdzID0gKE1hcClnZXRQcm9wZXJ0eVZhbHVlKGNsb3N1cmVOYW1lICsgVFlQRURfVklFV1MsIE1hcC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAodHlwZWRWaWV3cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRWaWV3cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZpZXdUeXBlID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVkVmlld05hbWUgPSAoU3RyaW5nKXR5cGVkVmlld3MuZ2V0KHZpZXdUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy51cmkyY2xvc3VyZU1hcC5wdXQodXJpICsgU0xBU0ggKyB2aWV3VHlwZSwgdGhpcy51cmkyY2xvc3VyZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudXJpMnZpZXdNYXAucHV0KHVyaSArIFNMQVNIICsgdmlld1R5cGUsIHR5cGVkVmlld05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnVyaXMgID0gKFN0cmluZ1tdKXRoaXMudXJpMmNsb3N1cmVNYXAua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW3RoaXMudXJpMmNsb3N1cmVNYXAua2V5U2V0KCkuc2l6ZSgpXSk7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCXJldHVybiB0aGlzLnVyaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFwc1RvVVJJKFN0cmluZyB1cmkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodXJpc1tpXS5lcXVhbHModXJpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWaWV3QnlVUkkoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gKFN0cmluZyl0aGlzLnVyaTJ2aWV3TWFwLmdldCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsb3N1cmVQcm9wZXJ0eU5hbWUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gKFN0cmluZyl0aGlzLnVyaTJjbG9zdXJlTWFwLmdldCh1cmkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld0J5TmFtZShTdHJpbmcgdmlld05hbWUpIHsKLSAgICAgICAgaWYodGhpcy52aWV3TmFtZXMuY29udGFpbnNLZXkodmlld05hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyl0aGlzLnZpZXdOYW1lcy5nZXQodmlld05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgIHJldHVybiB0aGlzLnVyaSArIFNMQVNIICsgdmlld05hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NjYWZmb2xkaW5nKCkgewotCQlyZXR1cm4gdGhpcy5zY2FmZm9sZGluZzsKLQl9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0U2NhZmZvbGRlZENsYXNzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zY2FmZm9sZGVkQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNjYWZmb2xkaW5nIFRoZSBzY2FmZm9sZGluZyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NhZmZvbGRpbmcoYm9vbGVhbiBzY2FmZm9sZGluZykgewotICAgICAgICB0aGlzLnNjYWZmb2xkaW5nID0gc2NhZmZvbGRpbmc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzRGF0YVNvdXJjZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwNThmMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuRGF0YVNvdXJjZVJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICogQHNpbmNlIEF1ZyA2LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JhaWxzRGF0YVNvdXJjZSBleHRlbmRzIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzCi0JCWltcGxlbWVudHMgR3JhaWxzRGF0YVNvdXJjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1NPVVJDRSA9ICJEYXRhU291cmNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0NMQVNTX05BTUUgPSAiZHJpdmVyQ2xhc3NOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gInVzZXJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT09MSU5HID0gInBvb2xpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9DUkVBVEUgPSAiZGJDcmVhdGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ0xBU1MgPSAiY29uZmlnQ2xhc3MiOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHBvb2xlZCA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB1cmwgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGJDcmVhdGUgPSBudWxsOwotICAgIHByaXZhdGUgQ2xhc3MgY29uZmlnQ2xhc3MgPSBudWxsOwotCi0KLSAgICBwdWJsaWMgRGVmYXVsdEdyYWlsc0RhdGFTb3VyY2UoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgc3VwZXIoY2xhenosIERBVEFfU09VUkNFKTsKLQotICAgICAgICBjb25maWdDbGFzcyA9IChDbGFzcylnZXRQcm9wZXJ0eVZhbHVlKENPTkZJR19DTEFTUyxDbGFzcy5jbGFzcyk7Ci0KLSAgICAgICAgaWYgKGdldFByb3BlcnR5VmFsdWUoUE9PTElORywgYm9vbGVhbi5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wb29sZWQgPSBnZXRQcm9wZXJ0eVZhbHVlKFBPT0xJTkcsIGJvb2xlYW4uY2xhc3MpLmVxdWFscyhCb29sZWFuLlRSVUUpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRQcm9wZXJ0eVZhbHVlKERCX0NSRUFURSwgU3RyaW5nLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgX2RiQ3JlYXRlID0gKFN0cmluZylnZXRQcm9wZXJ0eVZhbHVlKERCX0NSRUFURSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmKF9kYkNyZWF0ZS5lcXVhbHMoICJjcmVhdGUtZHJvcCIgKSB8fCBfZGJDcmVhdGUuZXF1YWxzKCJjcmVhdGUiKSB8fCBfZGJDcmVhdGUuZXF1YWxzKCJ1cGRhdGUiKSkKLSAgICAgICAgICAgICAgICB0aGlzLmRiQ3JlYXRlID0gX2RiQ3JlYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldFByb3BlcnR5VmFsdWUoRFJJVkVSX0NMQVNTX05BTUUsIFN0cmluZy5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5kcml2ZXJDbGFzc05hbWUgPSAoU3RyaW5nKWdldFByb3BlcnR5VmFsdWUoRFJJVkVSX0NMQVNTX05BTUUsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNvdXJjZVJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKCJSZXF1aXJlZCBwcm9wZXJ0eSBbIiArIERSSVZFUl9DTEFTU19OQU1FICsgIl0gaXMgbWlzc2luZyBvbiBbIiArIGdldEZ1bGxOYW1lKCkgKyAiXSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRQcm9wZXJ0eVZhbHVlKFVSTCwgU3RyaW5nLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnVybCA9IChTdHJpbmcpZ2V0UHJvcGVydHlWYWx1ZShVUkwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNvdXJjZVJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKCJSZXF1aXJlZCBwcm9wZXJ0eSBbIiArIFVSTCArICJdIGlzIG1pc3Npbmcgb24gWyIgKyBnZXRGdWxsTmFtZSgpICsgIl0hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0UHJvcGVydHlWYWx1ZShVU0VSTkFNRSwgU3RyaW5nLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gKFN0cmluZylnZXRQcm9wZXJ0eVZhbHVlKFVTRVJOQU1FLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTb3VyY2VSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbigiUmVxdWlyZWQgcHJvcGVydHkgWyIgKyBVU0VSTkFNRSArICJdIGlzIG1pc3Npbmcgb24gWyIgKyBnZXRGdWxsTmFtZSgpICsgIl0hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0UHJvcGVydHlWYWx1ZShQQVNTV09SRCwgU3RyaW5nLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gKFN0cmluZylnZXRQcm9wZXJ0eVZhbHVlKFBBU1NXT1JELCBTdHJpbmcuY2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTb3VyY2VSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbigiUmVxdWlyZWQgcHJvcGVydHkgWyIgKyBQQVNTV09SRCArICJdIGlzIG1pc3Npbmcgb24gWyIgKyBnZXRGdWxsTmFtZSgpICsgIl0hIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvb2xlZCgpIHsKLQkJcmV0dXJuIHRoaXMucG9vbGVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kcml2ZXJDbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB0aGlzLnVybDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotCQlyZXR1cm4gdGhpcy51c2VybmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wYXNzd29yZDsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRPdGhlclByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGJDcmVhdGUoKSB7Ci0JCXJldHVybiBkYkNyZWF0ZTsKLQl9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0Q29uZmlndXJhdGlvbkNsYXNzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb25maWdDbGFzczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNEb21haW5DbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDc0OGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkR5bmFtaWNNZXRob2RzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkdyb292eUR5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5HcmFpbHNEb21haW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5JbnZhbGlkUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5tZXRhY2xhc3MuQ29uc3RyYWludHNEeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwNS1KdWwtMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzIGV4dGVuZHMgQWJzdHJhY3RHcmFpbHNDbGFzcyAgaW1wbGVtZW50cyBHcmFpbHNEb21haW5DbGFzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HICA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRHcmFpbHNEb21haW5DbGFzcy5jbGFzcyk7Ci0KLQkKLQlwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgaWRlbnRpZmllcjsKLQlwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgdmVyc2lvbjsKLQlwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHlbXSBwcm9wZXJ0aWVzOwotCXByaXZhdGUgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIHBlcnNpc3RhbnRQcm9wZXJ0aWVzOwotCXByaXZhdGUgTWFwIHByb3BlcnR5TWFwOwotCXByaXZhdGUgTWFwIHJlbGF0aW9uc2hpcE1hcDsKLQlwcml2YXRlIE1hcCBjb25zdHJhaW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5ID0gR3JhaWxzRG9tYWluQ2xhc3MuR09STTsKLSAgICBwcml2YXRlIExpc3Qgb3duZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJc3VwZXIoY2xhenosICIiKTsKLQkJCi0JCVByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBnZXRSZWZlcmVuY2UoKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXAgPSAoTWFwKWdldFByb3BlcnR5VmFsdWUoIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuUkVMQVRJT05TSElQUywgTWFwLmNsYXNzICk7Ci0JCWlmKHRoaXMucmVsYXRpb25zaGlwTWFwID09IG51bGwpIHsKLQkJCXRoaXMucmVsYXRpb25zaGlwTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkvLyBwcm9jZXNzIHRoZSBjb25zdHJhaW50cwotCQlldmFsdWF0ZUNvbnN0cmFpbnRzKCk7Ci0JCQotCQkvLyBnZXQgbWFwcGVkIGJ5IHNldHRpbmcKLQkJaWYoZ2V0UHJvcGVydHlWYWx1ZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5Lk1BUFBFRF9CWSwgU3RyaW5nLmNsYXNzKSAhPSBudWxsKQotCQkJdGhpcy5tYXBwZWRCeSA9IChTdHJpbmcpZ2V0UHJvcGVydHlWYWx1ZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5Lk1BUFBFRF9CWSwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICBDbGFzcyBiZWxvbmdzVG8gPSAoQ2xhc3MpZ2V0UHJvcGVydHlWYWx1ZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LkJFTE9OR1NfVE8sIENsYXNzLmNsYXNzKTsKLSAgICAgICAgaWYoYmVsb25nc1RvID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Qgb3duZXJzUHJvcCA9IChMaXN0KWdldFByb3BlcnR5VmFsdWUoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5CRUxPTkdTX1RPLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmKG93bmVyc1Byb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMub3duZXJzID0gb3duZXJzUHJvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub3duZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgdGhpcy5vd25lcnMuYWRkKGJlbG9uZ3NUbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaXJzdCBnbyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjbGFzcyBhbmQgY3JlYXRlIGRvbWFpbiBwcm9wZXJ0aWVzCi0JCS8vIHBvcHVsYXRpbmcgaW50byBhIG1hcAotCQlmb3IoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCi0JCQlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0JCQkJLy8gaWdub3JlIGNlcnRhaW4gcHJvcGVydGllcwotCQkJCWlmKCFkZXNjcmlwdG9yLmdldE5hbWUoKS5lcXVhbHMoIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuTUVUQV9DTEFTUyApICYmCi0JCQkJICAgIWRlc2NyaXB0b3IuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5DTEFTUyApICYmCi0JCQkJICAgIWRlc2NyaXB0b3IuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5UUkFOU0lFTlQpICYmCi0JCQkJICAgIWRlc2NyaXB0b3IuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5SRUxBVElPTlNISVBTKSAmJgotCQkJCSAgICFkZXNjcmlwdG9yLmdldE5hbWUoKS5lcXVhbHMoIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuRVZBTkVTQ0VOVCkgJiYKLQkJCQkgICAhZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKCBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5Lk9QVElPTkFMKSAmJgotCQkJCSAgICFkZXNjcmlwdG9yLmdldE5hbWUoKS5lcXVhbHMoIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuQ09OU1RSQUlOVFMgKSYmCi0JCQkJICAgIWRlc2NyaXB0b3IuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5NQVBQRURfQlkgKSAmJgotICAgICAgICAgICAgICAgICAgICFkZXNjcmlwdG9yLmdldE5hbWUoKS5lcXVhbHMoIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuQkVMT05HU19UTyApICkgIHsKLQkJCQkJCi0JCQkJCQotCQkJCQlHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5ID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KHRoaXMsIGRlc2NyaXB0b3IpOwotCQkJCQl0aGlzLnByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5KTsKLQkJCQkJCi0JCQkJCWlmKHByb3BlcnR5LmlzSWRlbnRpdHkoKSkgewotCQkJCQkJdGhpcy5pZGVudGlmaWVyID0gcHJvcGVydHk7CQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYocHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5WRVJTSU9OICkpIHsKLQkJCQkJCXRoaXMudmVyc2lvbiA9IHByb3BlcnR5OwotCQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQkvLyBpZiBubyBpZGVudGlmaWVyIHByb3BlcnR5IHRocm93IGV4Y2VwdGlvbgotCQlpZih0aGlzLmlkZW50aWZpZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEdyYWlsc0RvbWFpbkV4Y2VwdGlvbigiSWRlbnRpdHkgcHJvcGVydHkgbm90IGZvdW5kLCBidXQgcmVxdWlyZWQgaW4gZG9tYWluIGNsYXNzIFsiK2dldEZ1bGxOYW1lKCkrIl0iICk7Ci0JCX0KLQkJLy8gaWYgbm8gdmVyc2lvbiBwcm9wZXJ0eSB0aHJvdyBleGNlcHRpb24KLQkJaWYodGhpcy52ZXJzaW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBHcmFpbHNEb21haW5FeGNlcHRpb24oIlZlcnNpb24gcHJvcGVydHkgbm90IGZvdW5kLCBidXQgcmVxdWlyZWQgaW4gZG9tYWluIGNsYXNzIFsiK2dldEZ1bGxOYW1lKCkrIl0iICk7Ci0JCX0JCQotCQkvLyBzZXQgcHJvcGVydGllcyBmcm9tIG1hcCB2YWx1ZXMKLQkJdGhpcy5wcm9wZXJ0aWVzID0gKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHlbXSl0aGlzLnByb3BlcnR5TWFwLnZhbHVlcygpLnRvQXJyYXkoIG5ldyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W3RoaXMucHJvcGVydHlNYXAuc2l6ZSgpXSApOwotCQkKLQkJLy8gZXN0YWJsaXNoIHJlbGF0aW9uc2hpcHMKLQkJZXN0YWJsaXNoUmVsYXRpb25zaGlwcygpOwotCi0JCQotCQkvLyBzZXQgcGVyc2lzdGFudCBwcm9wZXJ0aWVzCi0JCUNvbGxlY3Rpb24gdGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihJdGVyYXRvciBpID0gdGhpcy5wcm9wZXJ0eU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotCQkJR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBjdXJyZW50UHJvcCA9IChHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KWkubmV4dCgpOwotCQkJaWYoY3VycmVudFByb3AuaXNQZXJzaXN0YW50KCkgJiYgIWN1cnJlbnRQcm9wLmlzSWRlbnRpdHkoKSAmJiAhY3VycmVudFByb3AuZ2V0TmFtZSgpLmVxdWFscyggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5WRVJTSU9OICkpIHsKLQkJCQl0ZW1wTGlzdC5hZGQoY3VycmVudFByb3ApOwotCQkJfQotCQl9Ci0JCXRoaXMucGVyc2lzdGFudFByb3BlcnRpZXMgPSAoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdKXRlbXBMaXN0LnRvQXJyYXkoIG5ldyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W3RlbXBMaXN0LnNpemUoKV0pOwkJCi0JfQotCQotCS8qKgotCSAqIEV2YWx1YXRlcyB0aGUgY29uc3RyYWludHMgY2xvc3VyZSB0byBidWlsZCB0aGUgbGlzdCBvZiBjb25zdHJhaW50cwotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV2YWx1YXRlQ29uc3RyYWludHMoKSB7Ci0JCUNsb3N1cmUgY29uc3RyYWludHNDbG9zdXJlID0gKENsb3N1cmUpZ2V0UHJvcGVydHlWYWx1ZSggR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5DT05TVFJBSU5UUywgQ2xvc3VyZS5jbGFzcyApOwotCQlpZihjb25zdHJhaW50c0Nsb3N1cmUgIT0gbnVsbCkgewotCQkJR3Jvb3Z5T2JqZWN0IGluc3RhbmNlID0gKEdyb292eU9iamVjdClnZXRSZWZlcmVuY2UoKS5nZXRXcmFwcGVkSW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJRHluYW1pY01ldGhvZHMgaW50ZXJjZXB0b3IgPSBuZXcgR3Jvb3Z5RHluYW1pY01ldGhvZHNJbnRlcmNlcHRvcihpbnN0YW5jZSk7Ci0JCQkJaW50ZXJjZXB0b3IuYWRkRHluYW1pY1Byb3BlcnR5KCBuZXcgQ29uc3RyYWludHNEeW5hbWljUHJvcGVydHkoKSApOwotCQkJCQotCQkJCXRoaXMuY29uc3RyYWludHMgPSAoTWFwKWluc3RhbmNlLmdldFByb3BlcnR5KEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuQ09OU1RSQUlOVFMpOwkJCQkKLQkJCQkKLQkJCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJCUxPRy5lcnJvcigiSW50cm9zcGVjdGlvbiBlcnJvciByZWFkaW5nIGRvbWFpbiBjbGFzcyBbIitnZXRGdWxsTmFtZSgpKyJdIGNvbnN0cmFpbnRzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgdHlwZSBiYXNlZCBvdGhlciB0eXBlcyByZWZlcmVuY2VkCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXN0YWJsaXNoUmVsYXRpb25zaGlwcygpIHsKLQkJZm9yKEl0ZXJhdG9yIGkgPSB0aGlzLnByb3BlcnR5TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7ICApIHsKLQkJCURlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGN1cnJlbnRQcm9wID0gKERlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KWkubmV4dCgpOwotCQkJQ2xhc3MgY3VycmVudFByb3BUeXBlID0gY3VycmVudFByb3AuZ2V0VHlwZSgpOwotCQkJLy8gZXN0YWJsaXNoIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIG9uZS10by1tYW55Ci0JCQkvLyBpZiBpdCBpcyBhIFNldCBhbmQgdGhlcmUgYXJlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZAotCQkJLy8gYW5kIGl0IGlzIGRlZmluZWQgYXMgcGVyc2lzdGVudAotCQkJaWYoCWN1cnJlbnRQcm9wVHlwZS5lcXVhbHMoIFNldC5jbGFzcyApICYmIAotCQkJCWN1cnJlbnRQcm9wLmlzUGVyc2lzdGFudCgpICkgewotCQkJCQotCQkJCWVzdGFibGlzaFJlbGF0aW9uc2hpcEZvclNldCggY3VycmVudFByb3ApOwotCQkJfQotCQkJLy8gb3RoZXJ3aXNlIGlmIHRoZSB0eXBlIGlzIGEgZG9tYWluIGNsYXNzIGVzdGFibGlzaCByZWxhdGlvbnNoaXAKLQkJCWVsc2UgaWYoR3JhaWxzQ2xhc3NVdGlscy5pc0RvbWFpbkNsYXNzKGN1cnJlbnRQcm9wVHlwZSkgJiYgCi0JCQkJCWN1cnJlbnRQcm9wLmlzUGVyc2lzdGFudCgpKSB7Ci0JCQkJCi0JCQkJZXN0YWJsaXNoRG9tYWluQ2xhc3NSZWxhdGlvbnNoaXAoIGN1cnJlbnRQcm9wICk7Ci0JCQl9CQkJCi0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBFc3RhYmxpc2hlcyBhIHJlbGF0aW9uc2hpcCBmb3IgYSBqYXZhLnV0aWwuU2V0Ci0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXN0YWJsaXNoUmVsYXRpb25zaGlwRm9yU2V0KERlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5KSB7Ci0JCS8vIGlzIGl0IGEgcmVsYXRpb25zaGlwCi0JCUNsYXNzIHJlbGF0ZWRDbGFzc1R5cGUgPSBnZXRSZWxhdGVkQ2xhc3NUeXBlKCBwcm9wZXJ0eS5nZXROYW1lKCkgKTsKLQkJCi0JCWlmKHJlbGF0ZWRDbGFzc1R5cGUgIT0gbnVsbCkgewotCQkJLy8gc2V0IHRoZSByZWZlcmVuY2VkIHR5cGUgaW4gdGhlIHByb3BlcnR5Ci0JCQlwcm9wZXJ0eS5zZXRSZWZlcmVuY2VkUHJvcGVydHlUeXBlKHJlbGF0ZWRDbGFzc1R5cGUpOwotCQkJLy8gaWYgdGhlIHJlbGF0ZWQgdHlwZSBpcyBhIGRvbWFpbiBjbGFzcwotCQkJLy8gdGhlbiBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiByZWxhdGlvbnNoaXAgaXQgaXMKLQkJCWlmKEdyYWlsc0NsYXNzVXRpbHMuaXNEb21haW5DbGFzcyggcmVsYXRlZENsYXNzVHlwZSApKSB7Ci0JCQkJCi0JCQkJCi0JCQkJLy8gY2hlY2sgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVkIGluIHRoZSByZWZlcmVuY2VkIHR5cGUKLQkJCQkvLyBpZiBpdCBpcyBhbHNvIGEgU2V0L2RvbWFpbiBjbGFzcyBldGMuCi0JCQkJTWFwIHJlbGF0ZWRDbGFzc1JlbGF0aW9uc2hpcHMgPSAoTWFwKUdyYWlsc0NsYXNzVXRpbHMuZ2V0UHJvcGVydHlWYWx1ZSggcmVsYXRlZENsYXNzVHlwZSwgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5SRUxBVElPTlNISVBTLCBNYXAuY2xhc3MgKTsKLQkJCQlDbGFzcyByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgPSBudWxsOwotCQkJCQotCQkJCS8vIGlmIHRoZSByZWxhdGVkIHR5cGUgaGFzIGEgcmVsYXRpb25zaGlwcyBtYXAgaXQgbWF5IGJlIGEgbWFueS10by1tYW55Ci0JCQkJLy8gZmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgZGVmaW5lZAotCQkJCWlmKAlyZWxhdGVkQ2xhc3NSZWxhdGlvbnNoaXBzICE9IG51bGwgJiYgCi0JCQkJCSFyZWxhdGVkQ2xhc3NSZWxhdGlvbnNoaXBzLmlzRW1wdHkoKSApIHsKLQkJCQkJCi0JCQkJCVN0cmluZyByZWxhdGVkQ2xhc3NQcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJCQkvLyByZXRyaWV2ZSB0aGUgcmVsYXRpb25zaGlwIHByb3BlcnR5Ci0JCQkJCWZvcihJdGVyYXRvciBpID0gcmVsYXRlZENsYXNzUmVsYXRpb25zaGlwcy5rZXlTZXQoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGN1cnJlbnRLZXkgPSAoU3RyaW5nKWkubmV4dCgpOwotCQkJCQkJQ2xhc3MgY3VycmVudENsYXNzID0gKENsYXNzKSByZWxhdGVkQ2xhc3NSZWxhdGlvbnNoaXBzLmdldCggY3VycmVudEtleSApOwotCQkJCQkJaWYoY3VycmVudENsYXNzLmdldE5hbWUoKS5lcXVhbHMoICBnZXRDbGF6eigpLmdldE5hbWUoKSApKSB7Ci0JCQkJCQkJcmVsYXRlZENsYXNzUHJvcGVydHlOYW1lID0gY3VycmVudEtleTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkJCQkJCQkJCQkJCi0JCQkJCS8vIGlmIHRoZXJlIGlzIG9uZSBkZWZpbmVkIGdldCB0aGUgdHlwZQotCQkJCQlpZihyZWxhdGVkQ2xhc3NQcm9wZXJ0eU5hbWUgIT0gbnVsbCkgewotCQkJCQkJcmVsYXRlZENsYXNzUHJvcGVydHlUeXBlID0gR3JhaWxzQ2xhc3NVdGlscy5nZXRQcm9wZXJ5VHlwZSggcmVsYXRlZENsYXNzVHlwZSwgcmVsYXRlZENsYXNzUHJvcGVydHlOYW1lKTsJCQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG90aGVyd2lzZSBmaWd1cmUgb3V0IGlmIHRoZXJlIGlzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJ5IHJldHJpZXZpbmcgYW55IHByb3BlcnRpZXMgdGhhdCBhcmUgb2YgdGhlIHJlbGF0ZWQgdHlwZQotCQkJCS8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcHJvcGVydHkgdGhlbiAoZm9yIHRoZSBtb21lbnQpIGlnbm9yZSB0aGUgcmVsYXRpb25zaGlwCi0JCQkJaWYocmVsYXRlZENsYXNzUHJvcGVydHlUeXBlID09IG51bGwpIHsKLQkJCQkJUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnRpZXNPZlR5cGUocmVsYXRlZENsYXNzVHlwZSwgZ2V0Q2xhenooKSk7Ci0JCQkJCWlmKGRlc2NyaXB0b3JzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQlyZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgPSBkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQllc3RhYmxpc2hSZWxhdGlvbnNoaXBGb3JTZXRUb1R5cGUocHJvcGVydHkscmVsYXRlZENsYXNzUHJvcGVydHlUeXBlKTsKLQkJCX0KLQkJCS8vIG90aGVyd2lzZSBzZXQgaXQgdG8gbm90IHBlcnNpc3RlbnQgYXMgeW91IGNhbid0IHBlcnNpc3QKLQkJCS8vIHJlbGF0aW9uc2hpcHMgdG8gbm9uLWRvbWFpbiBjbGFzc2VzCi0JCQllbHNlIHsKLQkJCQlwcm9wZXJ0eS5zZXRQZXJzaXN0YW50KGZhbHNlKTsKLQkJCX0JCQkJCQkJCQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbm8gcmVsYXRpb25zaGlwIGRlZmluZWQgZm9yIHNldC4gCi0JCQkvLyBzZXQgbm90IHBlcnNpc3RlbnQKLQkJCXByb3BlcnR5LnNldFBlcnNpc3RhbnQoZmFsc2UpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEVzdGFibGlzaGVzIHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCBpcyBhIGJpLWRpcmVjdGlvbmFsIG9yIHVuaS1kaXJlY3Rpb25hbCBvbmUtdG8tbWFueQotCSAqIGFuZCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5ncyB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBhcHBseSBzZXR0aW5ncyB0bwotCSAqIEBwYXJhbSByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgVGhlIHJlbGF0ZWQgdHlwZQotCSAqLwkKLQlwcml2YXRlIHZvaWQgZXN0YWJsaXNoUmVsYXRpb25zaGlwRm9yU2V0VG9UeXBlKERlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5LCBDbGFzcyByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUpIHsKLQkJCi0JCWlmKHJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB1bmktZGlyZWN0aW9uYWwgb25lLXRvLW1hbnkKLQkJCXByb3BlcnR5LnNldE9uZVRvTWFueSh0cnVlKTsJCQkKLQkJCXByb3BlcnR5LnNldEJpZGlyZWN0aW9uYWwoZmFsc2UpOwotCQl9CQkKLQkJZWxzZSBpZiggcmVsYXRlZENsYXNzUHJvcGVydHlUeXBlLmVxdWFscyggU2V0LmNsYXNzICkgKXsKLQkJCS8vIG1hbnktdG8tbWFueQotCQkJcHJvcGVydHkuc2V0TWFueVRvTWFueSh0cnVlKTsKLQkJCXByb3BlcnR5LnNldEJpZGlyZWN0aW9uYWwodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiggR3JhaWxzQ2xhc3NVdGlscy5pc0RvbWFpbkNsYXNzKCByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgKSApIHsKLQkJCS8vIGJpLWRpcmVjdGlvbmFsIG9uZS10by1tYW55Ci0JCQlwcm9wZXJ0eS5zZXRPbmVUb01hbnkoIHRydWUgKTsKLQkJCXByb3BlcnR5LnNldEJpZGlyZWN0aW9uYWwoIHRydWUgKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEVzdGFibGlzaCByZWxhdGlvbnNoaXAgd2l0aCByZWxhdGVkIGRvbWFpbiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXByaXZhdGUgdm9pZCBlc3RhYmxpc2hEb21haW5DbGFzc1JlbGF0aW9uc2hpcChEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQlDbGFzcyBwcm9wVHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKLQkJLy8gZXN0YWJsaXNoIHJlbGF0aW9uc2hpcCB0byB0eXBlCi0JCU1hcCByZWxhdGVkQ2xhc3NSZWxhdGlvbnNoaXBzID0gKE1hcClHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnR5VmFsdWUoIHByb3BUeXBlLCBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LlJFTEFUSU9OU0hJUFMsIE1hcC5jbGFzcyApOwkJCi0JCUNsYXNzIHJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZSA9IG51bGw7Ci0JCQotCQkvLyBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcHMgbWFwIHVzZSB0aGF0IHRvIGZpbmQgb3V0IAotCQkvLyB3aGV0aGVyIGl0IGlzIG1hcHBlZCB0byBhIFNldAotCQlpZigJcmVsYXRlZENsYXNzUmVsYXRpb25zaGlwcyAhPSBudWxsICYmCQotCQkJIXJlbGF0ZWRDbGFzc1JlbGF0aW9uc2hpcHMuaXNFbXB0eSgpICkgewotCi0JCQkJCQkJCQkKLQkJCVN0cmluZyByZWxhdGVkQ2xhc3NQcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJLy8gcmV0cmlldmUgdGhlIHByb3BlcnR5IG5hbWUKLQkJCWZvcihJdGVyYXRvciBpID0gcmVsYXRlZENsYXNzUmVsYXRpb25zaGlwcy5rZXlTZXQoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBjdXJyZW50S2V5ID0gKFN0cmluZylpLm5leHQoKTsKLQkJCQlDbGFzcyBjdXJyZW50Q2xhc3MgPSAoQ2xhc3MpcmVsYXRlZENsYXNzUmVsYXRpb25zaGlwcy5nZXQoIGN1cnJlbnRLZXkgKTsKLQkJCQlpZihwcm9wZXJ0eS5nZXREb21haW5DbGFzcygpLmdldENsYXp6KCkuZ2V0TmFtZSgpLmVxdWFscyggIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkgICkpIHsKLQkJCQkJcmVsYXRlZENsYXNzUHJvcGVydHlOYW1lID0gY3VycmVudEtleTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCQkvLyBnZXQgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CQkJCQkJCQkJCQkJCi0JCQlyZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgPSBHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnlUeXBlKCBwcm9wVHlwZSwgcmVsYXRlZENsYXNzUHJvcGVydHlOYW1lICk7CQkJCQkJCQkJCi0JCX0KLQkJLy8gb3RoZXJ3aXNlIHJldHJpZXZlIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgdHlwZSBmcm9tIHRoZSBhc3NvY2lhdGVkIGNsYXNzCi0JCWlmKHJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZSA9PSBudWxsKSB7Ci0JCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IEdyYWlsc0NsYXNzVXRpbHMuZ2V0UHJvcGVydGllc09mVHlwZShwcm9wVHlwZSwgZ2V0Q2xhenooKSk7Ci0JCQkKLQkJCS8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIHRoZW4gdGhlIGFzc29jaWF0aW9uIGlzIGVzdGFibGlzaGVkCi0JCQlpZihkZXNjcmlwdG9ycy5sZW5ndGggPT0gMSkgewotCQkJCXJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZSA9IGRlc2NyaXB0b3JzWzBdLmdldFByb3BlcnR5VHlwZSgpOwotCQkJfQotCQl9Ci0JCQotCQkKLQkJLy8JZXN0YWJsaXNoIHJlbGF0aW9uc2hpcCBiYXNlZCBvbiB0aGlzIHR5cGUKLQkJZXN0YWJsaXNoRG9tYWluQ2xhc3NSZWxhdGlvbnNoaXBUb1R5cGUoIHByb3BlcnR5LCByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgKTsJCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEBwYXJhbSByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXN0YWJsaXNoRG9tYWluQ2xhc3NSZWxhdGlvbnNoaXBUb1R5cGUoRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHksIENsYXNzIHJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZSkgewotCQkvLyB1bmktZGlyZWN0aW9uYWwgb25lLXRvLW9uZQotCQlpZihyZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgPT0gbnVsbCkgewotCQkJcHJvcGVydHkuc2V0T25lVG9PbmUodHJ1ZSk7Ci0JCQlwcm9wZXJ0eS5zZXRCaWRpcmVjdGlvbmFsKGZhbHNlKTsKLQkJfQotCQkvLyBiaS1kaXJlY3Rpb25hbCBtYW55LXRvLW9uZQotCQllbHNlIGlmKHJlbGF0ZWRDbGFzc1Byb3BlcnR5VHlwZS5lcXVhbHMoIFNldC5jbGFzcyApKSB7Ci0JCQlwcm9wZXJ0eS5zZXRNYW55VG9PbmUodHJ1ZSk7Ci0JCQlwcm9wZXJ0eS5zZXRCaWRpcmVjdGlvbmFsKHRydWUpOwotCQl9Ci0JCS8vIGJpLWRpcmVjdGlvbmFsIG9uZS10by1vbmUKLQkJZWxzZSBpZiggR3JhaWxzQ2xhc3NVdGlscy5pc0RvbWFpbkNsYXNzKCByZWxhdGVkQ2xhc3NQcm9wZXJ0eVR5cGUgKSApIHsKLQkJCXByb3BlcnR5LnNldE9uZVRvT25lKHRydWUpOwotCQkJcHJvcGVydHkuc2V0QmlkaXJlY3Rpb25hbCh0cnVlKTsKLQkJfQotCX0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPd25pbmdDbGFzcyhDbGFzcyBkb21haW5DbGFzcykgewotICAgICAgICByZXR1cm4gdGhpcy5vd25lcnMuY29udGFpbnMoZG9tYWluQ2xhc3MpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3MjZ2V0UHJvcGVydGllcygpCi0gICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllczsKLSAgICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3MjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMuaWRlbnRpZmllcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3MjZ2V0VmVyc2lvbigpCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMudmVyc2lvbjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLkdyYWlsc0RvbWFpbkNsYXNzI2dldFBlcnNpc3RhbnRQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIGdldFBlcnNpc3RhbnRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0YW50UHJvcGVydGllczsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLkdyYWlsc0RvbWFpbkNsYXNzI2dldFByb3BlcnR5QnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ2V0UHJvcGVydHlCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYodGhpcy5wcm9wZXJ0eU1hcC5jb250YWluc0tleShuYW1lKSkgewotCQkJcmV0dXJuIChHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KXRoaXMucHJvcGVydHlNYXAuZ2V0KG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IEludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigiTm8gcHJvcGVydHkgZm91bmQgZm9yIG5hbWUgWyIrbmFtZSsiXSIpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzcyNnZXRGaWVsZE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eUJ5TmFtZShwcm9wZXJ0eU5hbWUpLmdldEZpZWxkTmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkFic3RyYWN0R3JhaWxzQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NVdGlscy5nZXRTaG9ydENsYXNzTmFtZShzdXBlci5nZXROYW1lKCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3MjZ2V0VGFibGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVXRpbHMuZ2V0U2hvcnRDbGFzc05hbWUoZ2V0TmFtZSgpKS50b1VwcGVyQ2FzZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3MjaXNPbmVUb01hbnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09uZVRvTWFueShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eUJ5TmFtZShwcm9wZXJ0eU5hbWUpLmlzT25lVG9NYW55KCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzcyNpc01hbnlUb09uZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFueVRvT25lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5QnlOYW1lKHByb3BlcnR5TmFtZSkuaXNNYW55VG9PbmUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUsdHlwZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3MjZ2V0UmVsYXRpb25zaGlwVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRSZWxhdGVkQ2xhc3NUeXBlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsJCQotCQlyZXR1cm4gKENsYXNzKXRoaXMucmVsYXRpb25zaGlwTWFwLmdldChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3MjZ2V0UHJvcGVydHlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEdyYWlsc0NsYXNzVXRpbHMuZ2V0UHJvcGVydHlOYW1lUmVwcmVzZW50YXRpb24oZ2V0Q2xhenooKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzcyNpc0JpZGlyZWN0aW9uYWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eUJ5TmFtZShwcm9wZXJ0eU5hbWUpLmlzQmlkaXJlY3Rpb25hbCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3MjZ2V0Q29uc3RyYWludHMoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRoaXMuY29uc3RyYWludHMpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzI2dldFZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzI3NldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3MjZ2V0TWFwcGVkQnkoKQotCSAqLwkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTViNWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwNS1KdWwtMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgaW1wbGVtZW50cyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHsKLQotCQotCXByaXZhdGUgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RhbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOwotCXByaXZhdGUgYm9vbGVhbiBpZGVudGl0eTsKLQlwcml2YXRlIGJvb2xlYW4gb25lVG9NYW55OwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDbGFzcyB0eXBlOwotCXByaXZhdGUgYm9vbGVhbiBtYW55VG9NYW55OwotCXByaXZhdGUgYm9vbGVhbiBtYW55VG9PbmU7Ci0JcHJpdmF0ZSBib29sZWFuIG9uZVRvT25lOwotCi0JcHJpdmF0ZSBib29sZWFuIGJpZGlyZWN0aW9uYWw7Ci0KLQlwcml2YXRlIENsYXNzIHJlZmVyZW5jZWRQcm9wZXJ0eVR5cGU7Ci0JcHJpdmF0ZSBHcmFpbHNEb21haW5DbGFzcyByZWZlcmVuY2VkRG9tYWluQ2xhc3M7Ci0JcHJpdmF0ZSBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IG90aGVyU2lkZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYXR1cmFsTmFtZTsKLQotCi0gICAgcHVibGljIERlZmF1bHRHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KERlZmF1bHRHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcywgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpICB7Ci0gICAgICAgIHRoaXMuZG9tYWluQ2xhc3MgPSBkb21haW5DbGFzczsKLSAgICAgICAgLy8gcmVxdWlyZWQgYnkgZGVmYXVsdAotICAgICAgICB0aGlzLm9wdGlvbmFsID0gZmFsc2U7Ci0gICAgICAgIC8vIHBlcnNpc3RhbnQgYnkgZGVmYXVsdAotICAgICAgICB0aGlzLnBlcnNpc3RhbnQgPSB0cnVlOwotICAgICAgICB0aGlzLm5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5uYXR1cmFsTmFtZSA9IEdyYWlsc0NsYXNzVXRpbHMuZ2V0TmF0dXJhbE5hbWUoZGVzY3JpcHRvci5nZXROYW1lKCkpOwotICAgICAgICB0aGlzLnR5cGUgPSBkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICB0aGlzLmlkZW50aXR5ID0gZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKCBJREVOVElUWSApOwotICAgICAgICAvLyBnZXQgdGhlIG5vdCByZXF1aXJlZCBkZXNjcml0b3IgZnJvbSB0aGUgb3duZXIgYmVhbgotICAgICAgICBMaXN0IG9wdGlvbmFsUHJvcHM7Ci0gICAgICAgIExpc3QgdHJhbnNpZW50UHJvcHM7Ci0KLSAgICAgICAgb3B0aW9uYWxQcm9wcyA9IChMaXN0KWRvbWFpbkNsYXNzLmdldFByb3BlcnR5VmFsdWUoIE9QVElPTkFMLCBMaXN0LmNsYXNzICk7Ci0gICAgICAgIHRyYW5zaWVudFByb3BzPSAoTGlzdClkb21haW5DbGFzcy5nZXRQcm9wZXJ0eVZhbHVlKCBUUkFOU0lFTlQsIExpc3QuY2xhc3MgKTsKLQotICAgICAgICAvLyBVbmRvY3VtZW50ZWQgZmVhdHVyZSBhbGVydCEgU3RldmUgaW5zaXN0ZWQgb24gdGhpcyA6LSkKLSAgICAgICAgTGlzdCBldmFuZXNjZW50ID0gKExpc3QpZG9tYWluQ2xhc3MuZ2V0UHJvcGVydHlWYWx1ZSggRVZBTkVTQ0VOVCwgTGlzdC5jbGFzcyApOwotICAgICAgICBpZihldmFuZXNjZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKHRyYW5zaWVudFByb3BzID09IG51bGwpCi0gICAgICAgICAgICAgICAgdHJhbnNpZW50UHJvcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIHRyYW5zaWVudFByb3BzLmFkZEFsbChldmFuZXNjZW50KTsKLSAgICAgICAgfQotICAgICAgICAvLyBlc3RhYmxpc2ggb2YgcHJvcGVydHkgaXMgcmVxdWlyZWQKLSAgICAgICAgaWYob3B0aW9uYWxQcm9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IG9wdGlvbmFsUHJvcHMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdHMgYSBzdHJpbmcgb3RoZXJ3aXNlIGlnbm9yZS4gTm90ZTogTWF5YmUgcHV0IGEgd2FybmluZyBoZXJlPwotICAgICAgICAgICAgICAgIE9iamVjdCBjdXJyZW50T2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYoY3VycmVudE9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZyljdXJyZW50T2JqOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgbmFtZSBpbiB0aGUgbm90IHJlcXVpcmVkIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGlzIHByb3BlcnR5IG5hbWUgc2V0IG5vdCByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKCB0aGlzLm5hbWUgKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlc3RhYmxpc2ggaWYgcHJvcGVydHkgaXMgcGVyc2lzdGFudAotICAgICAgICBpZih0cmFuc2llbnRQcm9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IHRyYW5zaWVudFByb3BzLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgaXRzIGEgc3RyaW5nIG90aGVyd2lzZSBpZ25vcmUuIE5vdGU6IEFnYWluIG1heWJlIGEgd2FybmluZz8KLSAgICAgICAgICAgICAgICBPYmplY3QgY3VycmVudE9iaiA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRPYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpY3VycmVudE9iajsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IG5hbWUgaXMgb24gdGhlIG5vdCBwZXJzaXN0YW50IGxpc3QKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBzZXQgcGVyc2lzdGFudCB0byBmYWxzZQotICAgICAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKCB0aGlzLm5hbWUgKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJzaXN0YW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzUGVyc2lzdGFudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YW50KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0YW50OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzSWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmlkZW50aXR5OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSNpc09uZVRvTWFueSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVUb01hbnkoKSB7Ci0JCXJldHVybiB0aGlzLm9uZVRvTWFueTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkjaXNNYW55VG9PbmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFueVRvT25lKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2dldEZpZWxkTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkjaXNPbmVUb09uZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVUb09uZSgpIHsKLQkJcmV0dXJuIHRoaXMub25lVG9PbmU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSNnZXREb21haW5DbGFzcygpCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzIGdldERvbWFpbkNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5kb21haW5DbGFzczsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzTWFueVRvTWFueSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW55VG9NYW55KCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9NYW55OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYW55VG9NYW55IFRoZSBtYW55VG9NYW55IHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW55VG9NYW55KGJvb2xlYW4gbWFueVRvTWFueSkgewotCQl0aGlzLm1hbnlUb01hbnkgPSBtYW55VG9NYW55OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbmVUb01hbnkgVGhlIG9uZVRvTWFueSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lVG9NYW55KGJvb2xlYW4gb25lVG9NYW55KSB7Ci0JCXRoaXMub25lVG9NYW55ID0gb25lVG9NYW55OwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIG1hbnlUb09uZSBUaGUgbWFueVRvT25lIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW55VG9PbmUoYm9vbGVhbiBtYW55VG9PbmUpIHsKLQkJdGhpcy5tYW55VG9PbmUgPSBtYW55VG9PbmU7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gb25lVG9PbmUgVGhlIG9uZVRvT25lIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPbmVUb09uZShib29sZWFuIG9uZVRvT25lKSB7Ci0JCXRoaXMub25lVG9PbmUgPSBvbmVUb09uZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwZXJzaXN0YW50IFRoZSBwZXJzaXN0YW50IHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0YW50KGJvb2xlYW4gcGVyc2lzdGFudCkgewotCQl0aGlzLnBlcnNpc3RhbnQgPSBwZXJzaXN0YW50OwotCX0KLQotCQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgcmVsYXRpb25zaGlwIGlzIGJpZGlyZWN0aW9uYWwgb3Igbm90Ci0JICogQHBhcmFtIGJpZGlyZWN0aW9uYWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCaWRpcmVjdGlvbmFsKGJvb2xlYW4gYmlkaXJlY3Rpb25hbCkgewotCQl0aGlzLmJpZGlyZWN0aW9uYWwgPSBiaWRpcmVjdGlvbmFsOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2dldFR5cGVQcm9wZXJ0eU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVByb3BlcnR5TmFtZSgpIHsJCi0JCVN0cmluZyBzaG9ydFR5cGVOYW1lID0gQ2xhc3NVdGlscy5nZXRTaG9ydENsYXNzTmFtZSggdGhpcy50eXBlICk7Ci0JCXJldHVybiBzaG9ydFR5cGVOYW1lLnN1YnN0cmluZygwLDEpLnRvTG93ZXJDYXNlKCkgKyBzaG9ydFR5cGVOYW1lLnN1YnN0cmluZygxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkjZ2V0UmVmZXJlbmNlZFByb3BlcnR5VHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldFJlZmVyZW5jZWRQcm9wZXJ0eVR5cGUoKSB7Ci0JCWlmKHRoaXMudHlwZS5lcXVhbHMoIFNldC5jbGFzcyApICYmIHRoaXMucmVmZXJlbmNlZFByb3BlcnR5VHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkUHJvcGVydHlUeXBlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSNpc0JpZGlyZWN0aW9uYWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuYmlkaXJlY3Rpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IHR5cGUgb2YgdGhpcyBwcm9wZXJ0eQotCSAqIEBwYXJhbSByZWZlcmVuY2VkUHJvcGVydHlUeXBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVmZXJlbmNlZFByb3BlcnR5VHlwZShDbGFzcyByZWZlcmVuY2VkUHJvcGVydHlUeXBlKSB7Ci0JCXRoaXMucmVmZXJlbmNlZFByb3BlcnR5VHlwZSA9IHJlZmVyZW5jZWRQcm9wZXJ0eVR5cGU7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzQXNzb2NpYXRpb24oKQotCSAqLwotCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzIGdldFJlZmVyZW5jZWREb21haW5DbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZERvbWFpbkNsYXNzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZERvbWFpbkNsYXNzKEdyYWlsc0RvbWFpbkNsYXNzIHJlZmVyZW5jZWREb21haW5DbGFzcykgewotCQlpZihyZWZlcmVuY2VkRG9tYWluQ2xhc3MgIT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkRG9tYWluQ2xhc3MgPSByZWZlcmVuY2VkRG9tYWluQ2xhc3M7Ci0JCQl0aGlzLnJlZmVyZW5jZWRQcm9wZXJ0eVR5cGUgPSByZWZlcmVuY2VkRG9tYWluQ2xhc3MuZ2V0Q2xhenooKTsKLQkJfQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5I2lzQXNzb2NpYXRpb24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzb2NpYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBpc09uZVRvTWFueSgpIHx8Ci0gICAgICAgICAgICAgICAgaXNPbmVUb09uZSgpIHx8Ci0gICAgICAgICAgICAgICAgaXNNYW55VG9PbmUoKSB8fAotICAgICAgICAgICAgICAgIGlzTWFueVRvTWFueSgpOwotCX0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmF0dXJhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWxOYW1lOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgYXNzVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmKGlzTWFueVRvTWFueSgpKSB7Ci0gICAgICAgICAgICBhc3NUeXBlID0gIm1hbnktdG8tbWFueSI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihpc09uZVRvTWFueSgpKSB7Ci0gICAgICAgICAgICBhc3NUeXBlID0gIm9uZS10by1tYW55IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGlzT25lVG9PbmUoKSkgewotICAgICAgICAgICAgYXNzVHlwZSA9ICJvbmUtdG8tb25lIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGlzTWFueVRvT25lKCkpIHsKLSAgICAgICAgICAgIGFzc1R5cGUgPSAibWFueS10by1vbmUiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lIiwgdGhpcy5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgidHlwZSIsIHRoaXMudHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoInBlcnNpc3RlbnQiLCBpc1BlcnNpc3RhbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIm9wdGlvbmFsIiwgaXNPcHRpb25hbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiYXNzb2NpYXRpb24iLCBpc0Fzc29jaWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJiaWRpcmVjdGlvbmFsIiwgaXNCaWRpcmVjdGlvbmFsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJhc3NvY2lhdGlvbi10eXBlIiwgYXNzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSNnZXRPdGhlclNpZGUoKQotCSAqLwotCXB1YmxpYyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGdldE90aGVyU2lkZSgpIHsKLQkJcmV0dXJuIHRoaXMub3RoZXJTaWRlOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0T3RoZXJTaWRlKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdGhpcy5vdGhlclNpZGUgPSBwcm9wZXJ0eTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc1BhZ2VGbG93Q2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNQYWdlRmxvd0NsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjlhYjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc1BhZ2VGbG93Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBncmFpbHMucGFnZWZsb3cuRmxvdzsKLQotaW1wb3J0IGphdmEubGFuZy5DbGFzczsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuV29yZFV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMTAsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcmFpbHNQYWdlRmxvd0NsYXNzIGV4dGVuZHMgQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3MKLQkJaW1wbGVtZW50cyBHcmFpbHNQYWdlRmxvd0NsYXNzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfRkxPVyA9ICJQYWdlRmxvdyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPVyA9ICJmbG93IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJMRSA9ICJhY2Nlc3NpYmxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdXJpID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gYWNjZXNzaWJsZSA9IHRydWU7Ci0JCi0JcHVibGljIERlZmF1bHRHcmFpbHNQYWdlRmxvd0NsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCXN1cGVyKGNsYXp6LCBQQUdFX0ZMT1cpOwotCQkKLQkJaWYgKGdldFByb3BlcnR5VmFsdWUoRkxPVywgRmxvdy5jbGFzcykgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKCJPbiBjbGFzcyBbIiArIGNsYXp6LmdldE5hbWUoKSArICJdIHJlcXVpcmVkIHByb3BlcnR5IFsiICsgRkxPVyArICJdIG9mIHR5cGUgWyIgKyBGbG93LmNsYXNzLmdldE5hbWUoKSArICJdIGlzIG5vdCBwcmVzZW50ISIpOwotCQl9Ci0JCWlmIChnZXRQcm9wZXJ0eVZhbHVlKEFDQ0VTU0lCTEUsIEJvb2xlYW4uY2xhc3MpICE9IG51bGwpIHsKLQkJCXRoaXMuYWNjZXNzaWJsZSA9ICgoQm9vbGVhbilnZXRQcm9wZXJ0eVZhbHVlKEFDQ0VTU0lCTEUsIEJvb2xlYW4uY2xhc3MpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQkKLQkJdGhpcy51cmkgPSAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhnZXRQYWNrYWdlTmFtZSgpKSA/IFNMQVNIICsgZ2V0UGFja2FnZU5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSA6ICIiKSArIFNMQVNIICsgZ2V0Rmxvd0lkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGbG93SWQoKSB7Ci0JCXJldHVybiBXb3JkVXRpbHMudW5jYXBpdGFsaXplKGdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB0aGlzLnVyaTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QWNjZXNzaWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzaWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzU2VydmljZUNsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzU2VydmljZUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2U3OTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc1NlcnZpY2VDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc1NlcnZpY2VDbGFzcyBleHRlbmRzIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzCi0JCWltcGxlbWVudHMgR3JhaWxzU2VydmljZUNsYXNzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAiU2VydmljZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OQUwgPSAidHJhbnNhY3Rpb25hbCI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zYWN0aW9uYWwgPSB0cnVlOwotCQotCXB1YmxpYyBEZWZhdWx0R3JhaWxzU2VydmljZUNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCXN1cGVyKGNsYXp6LCBTRVJWSUNFKTsKLQkJCi0JCU9iamVjdCB0bXBUcmFuc2FjdGlvbmFsID0gZ2V0UHJvcGVydHlWYWx1ZShUUkFOU0FDVElPTkFMLCBCb29sZWFuLmNsYXNzKTsKLQkJdGhpcy50cmFuc2FjdGlvbmFsID0gdG1wVHJhbnNhY3Rpb25hbCA9PSBudWxsIHx8IHRtcFRyYW5zYWN0aW9uYWwuZXF1YWxzKEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2FjdGlvbmFsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc1RhZ0xpYkNsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzVGFnTGliQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlMTQyYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzVGFnTGliQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxNC1KYW4tMjAwNgotICoKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSB0YWcgbGliIGNsYXNzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc1RhZ0xpYkNsYXNzIGV4dGVuZHMgQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3MgaW1wbGVtZW50cyBHcmFpbHNUYWdMaWJDbGFzcyB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJQiA9ICJUYWdMaWIiOwotCi0gICAgcHJpdmF0ZSBMaXN0IHN1cHBvcnRlZENvbnRyb2xsZXJzOwotICAgIHByaXZhdGUgU2V0IHRhZ3MgPSBuZXcgSGFzaFNldCgpOwotICAgIC8qKgotICAgICAqIDxwPkRlZmF1bHQgY29udHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6ICAgICAgICB0aGUgdGFnIGxpYnJhcnkgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdEdyYWlsc1RhZ0xpYkNsYXNzKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHN1cGVyKGNsYXp6LCBUQUdfTElCKTsKLSAgICAgICAgQ2xhc3Mgc3VwcG9ydGVkQ29udHJvbGxlckNsYXNzID0gKENsYXNzKWdldFByb3BlcnR5VmFsdWUoU1VQUE9SVFNfQ09OVFJPTExFUiwgQ2xhc3MuY2xhc3MpOwotICAgICAgICBpZihzdXBwb3J0ZWRDb250cm9sbGVyQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgc3VwcG9ydGVkQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBzdXBwb3J0ZWRDb250cm9sbGVycy5hZGQoc3VwcG9ydGVkQ29udHJvbGxlckNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExpc3QgdG1wID0gKExpc3QpZ2V0UHJvcGVydHlWYWx1ZShTVVBQT1JUU19DT05UUk9MTEVSLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29udHJvbGxlcnMgPSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wcyA9IGdldFJlZmVyZW5jZSgpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3AgPSBwcm9wc1tpXTsKLSAgICAgICAgICAgIENsb3N1cmUgdGFnID0gKENsb3N1cmUpZ2V0UHJvcGVydHlWYWx1ZShwcm9wLmdldE5hbWUoKSxDbG9zdXJlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFncy5hZGQocHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sbGVyKEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBjb250cm9sbGVyQ2xhc3MpIHsKLSAgICAgICAgaWYoY29udHJvbGxlckNsYXNzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgaWYoc3VwcG9ydGVkQ29udHJvbGxlcnMgIT0gbnVsbCkgewotICAgICAgICAgICBpZihzdXBwb3J0ZWRDb250cm9sbGVycy5jb250YWlucyhjb250cm9sbGVyQ2xhc3MuZ2V0Q2xhenooKSkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0YWdzLmNvbnRhaW5zKHRhZ05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZ2V0VGFnTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiB0YWdzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0V4dGVybmFsR3JhaWxzRG9tYWluQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0V4dGVybmFsR3JhaWxzRG9tYWluQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMDZkNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9FeHRlcm5hbEdyYWlsc0RvbWFpbkNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotLyoqCi0gKiA8cD5SZXByZXNlbnRzIGEgcGVyc2lzdGFibGUgR3JhaWxzIGRvbWFpbiBjbGFzcyB0aGF0IGlzIGV4dGVybmFsbHkgbWFwcGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5Ci0gKiBhIG1hcmtlciBpbnRlcmZhY2Ugc28gdGhhdCBHcmFpbHMga25vd3MgdG8gdHJlYXQgdGhlc2UgZGlmZmVyZW50bHk8L3A+Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgRmViIDE4LCAyMDA2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxHcmFpbHNEb21haW5DbGFzcyBleHRlbmRzIEdyYWlsc0RvbWFpbkNsYXNzIHsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0FwcGxpY2F0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWVhOTA2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotCi0vKioKLSAqICA8cD5FeHBvc2VzIGFsbCBjbGFzc2VzIGZvciBhIEdyYWlscyBhcHBsaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWlsc0FwcGxpY2F0aW9uIHsKLSAgICAvKioKLSAgICAgKiBUaGUgaWQgb2YgdGhlIGdyYWlscyBhcHBsaWNhdGlvbiB3aXRoaW4gYSBiZWFuIGNvbnRleHQKLSAgICAgKi8KLSAgICBTdHJpbmcgQVBQTElDQVRJT05fSUQgPSAiZ3JhaWxzQXBwbGljYXRpb24iOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyBhbGwgY29udHJvbGxlcnMgaW4gYW4gYXBwbGljYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gY29udHJvbGxlcnMgaW4gYW4gYXBwbGljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzQ29udHJvbGxlckNsYXNzW10gZ2V0Q29udHJvbGxlcnMoKTsKLQotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIGNvbnRyb2xsZXIgd2l0aCB0aGUgZ2l2ZW4gZnVsbCBuYW1lIG9yIG51bGwgaWYgbm8gY29udHJvbGxlciB3YXMgZm91bmQgd2l0aCB0aGF0IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnVsbG5hbWUgdGhlIGNvbnRyb2xsZXIgZnVsbCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbGxlciBvciBudWxsIGlmIG5vIGNvbnRyb2xsZXIgd2FzIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ2V0Q29udHJvbGxlcihTdHJpbmcgZnVsbG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgY29udHJvbGxlcnMgdGhhdCBtYXBzIHRvIHRoZSBnaXZlbiBVUkkgb3IgbnVsbCBpZiBubyBjb250cm9sbGVyIHdhcyBmb3VuZCB3aXRoIHRoYXQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgdGhlIHVyaSBvZiB0aGUgcmVxdWVzdAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2xsZXIgb3IgbnVsbCBpZiBubyBjb250cm9sbGVyIHdhcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ2V0Q29udHJvbGxlckJ5VVJJKFN0cmluZyB1cmkpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyBhbGwgcGFnZSBmbG93cyBpbiBhbiBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcGFnZSBmbG93cyBpbiBhbiBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzUGFnZUZsb3dDbGFzc1tdIGdldFBhZ2VGbG93cygpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgcGFnZSBmbG93IHdpdGggdGhlIGdpdmVuIGZ1bGwgbmFtZSBvciBudWxsIGlmIG5vIHBhZ2UgZmxvdyB3YXMgZm91bmQgd2l0aCB0aGF0IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnVsbG5hbWUgdGhlIHBhZ2UgZmxvdyBmdWxsIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBwYWdlIGZsb3cgb3IgbnVsbCBpZiBubyBjb250cm9sbGVyIHdhcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzUGFnZUZsb3dDbGFzcyBnZXRQYWdlRmxvdyhTdHJpbmcgZnVsbG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIEdyYWlscyBEb21haW4gY2xhc3NlczwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRvbWFpbiBjbGFzc2VzIGluIHRoZSBkb21haW4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NbXSBnZXRHcmFpbHNEb21haW5DbGFzc2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBncmFpbHMgZG9tYWluIGNsYXNzCi0gICAgICogQHBhcmFtIGRvbWFpbkNsYXNzIFRoZSBjbGFzcyB0byBjaGVjawotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBpdCBpcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3JhaWxzRG9tYWluQ2xhc3MoQ2xhc3MgZG9tYWluQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0cmlldmVzIGEgZG9tYWluIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIG5hbWU8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZG9tYWluIGNsYXNzIHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiBUaGUgcmV0cmlldmVkIGRvbWFpbiBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzcyBnZXRHcmFpbHNEb21haW5DbGFzcyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBhY3RpdmUgZGF0YSBzb3VyY2UgZm9yIHRoaXMgR3JhaWxzIGFwcGxpY2F0aW9uIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFjdGl2ZSBkYXRhIHNvdXJjZSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIEdyYWlsc0RhdGFTb3VyY2UgZ2V0R3JhaWxzRGF0YVNvdXJjZSgpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgY2xhc3MgbG9hZGVyIGluc3RhbmNlIGZvciB0aGUgR3JhaWxzIGFwcGxpY2F0aW9uPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgYWxsIHNlcnZpY2UgY2xhc3NlcyBmb3IgdGhlIEdyYWlscyBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VydmljZSBjbGFzcyBmb3IgR3JhaWxzIGFwcGxpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIEdyYWlsc1NlcnZpY2VDbGFzc1tdIGdldEdyYWlsc1NlcnZpY2VDbGFzc2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBzZXJ2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBmdWxsIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgc2VydmljZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNTZXJ2aWNlQ2xhc3MgZ2V0R3JhaWxzU2VydmljZUNsYXNzKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgYWxsIHRoZSBib290c3RyYXAgY2xhc3NlcyBmb3IgdGhlIEdyYWlscyBhcHBsaWNhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBCb290U3RyYXAgY2xhc3NlcwotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNCb290c3RyYXBDbGFzc1tdIGdldEdyYWlsc0Jvb3RzdHJhcENsYXNzZXMoKTsKLQotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgYWxsIHRoZSB0YWcgbGliIGNsYXNzZXMgZm9yIHRoZSBHcmFpbHMgYXBwbGljYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgVGFnTGliIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzVGFnTGliQ2xhc3NbXSBnZXRHcmFpbHNUYWJMaWJDbGFzc2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIGEgdGFnIGxpYiBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFnTGliTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnbGliIGNsYXNzCi0gICAgICogQHJldHVybiBBIHRhZ2xpYiBjbGFzcyBpbnN0YW5jZSBvciBudWxsIGlmIG5vbiBleGlzdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzVGFnTGliQ2xhc3MgZ2V0R3JhaWxzVGFnTGliQ2xhc3MoU3RyaW5nIHRhZ0xpYk5hbWUpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0cmlldmVzIHRoZSB0YWcgbGliIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIHRhZwotICAgICAqCi0gICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZwotICAgICAqIEByZXR1cm4gQSBhcnJheSBvZiB0YWcgbGliIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzVGFnTGliQ2xhc3MgZ2V0VGFnTGliQ2xhc3NGb3JUYWcoU3RyaW5nIHRhZ05hbWUpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBHcmFpbHMgY29udHJvbGxlciBjbGFzcyB0byB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBAcGFyYW0gY29udHJvbGxlckNsYXNzIFRoZSBncmFpbHMgY29udHJvbGxlciBjbGFzcyB0byBhZGQKLSAgICAgKiBAcmV0dXJuIEEgR3JhaWxzQ29udHJvbGxlckNsYXNzIGluc3RhbmNlCi0gICAgICovCi0gICAgR3JhaWxzQ29udHJvbGxlckNsYXNzIGFkZENvbnRyb2xsZXJDbGFzcyhDbGFzcyBjb250cm9sbGVyQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBHcmFpbHMgdGFnbGliIGNsYXNzIHRvIHRoZSBhcHBsaWNhdGlvbi4gSWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlIG9sZCBvbmUgd2lsbCBiZSByZXBsYWNlZAotICAgICAqIAotICAgICAqIEBwYXJhbSB0YWdMaWJDbGFzcyBUaGUgdGFnbGliIGNsYXNzIHRvIGFkZAotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGFkZGVkIGNsYXNzCi0gICAgICovCi0gICAgR3JhaWxzVGFnTGliQ2xhc3MgYWRkVGFnTGliQ2xhc3MoQ2xhc3MgdGFnTGliQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBHcmFpbHMgc2VydmljZSBjbGFzcyB0byB0aGUgYXBwbGljYXRpb24uIElmIGl0IGFscmVhZHkgZXhpc3RzIHRoZSBvbGQgb25lIHdpbGwgYmUgcmVwbGFjZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2xhc3MgVGhlIHNlcnZpY2UgY2xhc3MgdG8gYWRkCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgYWRkZWQgY2xhc3Mgb3IgbnVsbCBpZiB0aGUgY2xhc3MgaXMgYWJzdHJhY3QgYW5kIHdhcyBub3QgYWRkZWQKLSAgICAgKi8KLSAgICBHcmFpbHNTZXJ2aWNlQ2xhc3MgYWRkU2VydmljZUNsYXNzKENsYXNzIHNlcnZpY2VDbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGRvbWFpbiBjbGFzcyB0byB0aGUgZ3JhaWxzIGFwcGxpY2F0aW9uCi0gICAgICogQHBhcmFtIGRvbWFpbkNsYXNzIFRoZSBkb21haW4gY2xhc3MgdG8gYWRkCi0gICAgICogQHJldHVybiBUaGUgR3JhaWxzRG9tYWluQ2xhc3MgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgY2xhc3MgaXMgYWJzdHJhY3QgYW5kIHdhcyBub3QgYWRkZWQKLSAgICAgKi8KLSAgICBHcmFpbHNEb21haW5DbGFzcyBhZGREb21haW5DbGFzcyhDbGFzcyBkb21haW5DbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGRvbWFpbiBjbGFzcyB0byB0aGUgZ3JhaWxzIGFwcGxpY2F0aW9uCi0gICAgICogQHBhcmFtIGRvbWFpbkNsYXNzIFRoZSBkb21haW4gY2xhc3MgdG8gYWRkCi0gICAgICogQHJldHVybiBUaGUgR3JhaWxzRG9tYWluQ2xhc3MgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgY2xhc3MgaXMgYWJzdHJhY3QgYW5kIHdhcyBub3QgYWRkZWQKLSAgICAgKi8KLSAgICAKLSAgICBHcmFpbHNEb21haW5DbGFzcyBhZGREb21haW5DbGFzcyhHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnRyb2xsZXIgdGhhdCBpcyBzY2FmZm9sZGluZyB0aGUgc3BlY2lmaWVkIGRvbWFpbiBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGRvbWFpbkNsYXNzIFRoZSBkb21haW4gY2xhc3MgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICovCi0gICAgR3JhaWxzQ29udHJvbGxlckNsYXNzIGdldFNjYWZmb2xkaW5nQ29udHJvbGxlcihHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE0ZGJjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0FwcGxpY2F0aW9uRmFjdG9yeUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuRmFjdG9yeUJlYW47Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LkluaXRpYWxpemluZ0JlYW47Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmlvLlJlc291cmNlOwotCi0vKioKLSAqIDxwPkZhY3RvcnkgYmVhbiB0aGF0IGNyZWF0ZXMgYSBHcmFpbHMgYXBwbGljYXRpb24gb2JqZWN0IGJhc2VkIG9uIEdyb292eSBmaWxlcy4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbiBpbXBsZW1lbnRzIEZhY3RvcnlCZWFuLCBJbml0aWFsaXppbmdCZWFuIHsKLQkKLQlwcml2YXRlIFJlc291cmNlW10gZ3Jvb3Z5RmlsZXMgPSBudWxsOwotCXByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb24gPSBudWxsOwotCQotCXB1YmxpYyBHcmFpbHNBcHBsaWNhdGlvbkZhY3RvcnlCZWFuKCkgewotCQlzdXBlcigpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0R3Jvb3Z5RmlsZXMoUmVzb3VyY2VbXSBncm9vdnlGaWxlcykgewotCQl0aGlzLmdyb292eUZpbGVzID0gZ3Jvb3Z5RmlsZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFmdGVyUHJvcGVydGllc1NldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5ncm9vdnlGaWxlcyA9PSBudWxsIHx8IGdyb292eUZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJHcm9vdnkgZmlsZXMgYXJlIG5vdCBkZWZpbmVkISIpOwotCQl9Ci0JCXRoaXMuZ3JhaWxzQXBwbGljYXRpb24gPSBuZXcgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKHRoaXMuZ3Jvb3Z5RmlsZXMpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5ncmFpbHNBcHBsaWNhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0Jvb3RzdHJhcENsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNCb290c3RyYXBDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWMzMTBhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0Jvb3RzdHJhcENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotLyoqCi0gKiA8cD5BIEJvb3RTdHJhcCBjbGFzcyBpcyBhIGNsYXNzIHRoYXQgaXMgbG9hZGVkIGFuZCBleGVjdXRlZCBvbiBhcHBsaWNhdGlvbiBsb2FkPC9wPgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBKdWwgNSwgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWlsc0Jvb3RzdHJhcENsYXNzIGV4dGVuZHMgR3JhaWxzQ2xhc3MgewotCQotCS8qKgotCSAqIENhbGxzIHRoZSBpbml0IGNsb3N1cmUgaWYgb25lIGV4aXN0cwotCSAqCi0JICovCi0Jdm9pZCBjYWxsSW5pdChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCk7Ci0JCi0JLyoqCi0JICogQ2FsbHMgdGhlIGRlc3Ryb3kgY2xvc3VyZSBpZiBvbmUgZXhpc3RzCi0JICoKLQkgKi8KLQl2b2lkIGNhbGxEZXN0cm95KCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5pdCBjbG9zdXJlIHdoaWNoIGlzIGNhbGxlZCBvbiBhcHBsaWNhdGlvbiBsb2FkCi0JICogCi0JICogQHJldHVybiBBIENsb3N1cmUgaW5zdGFuY2UKLQkgKi8KLQlDbG9zdXJlIGdldEluaXRDbG9zdXJlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzdHJveSBjbG9zdXJlIHdoaWNoIGlzIGNhbGxlZCBvbiBhcHBsaWNhdGlvbiBleGl0Ci0JICogCi0JICogQHJldHVybiBBIENsb3N1cmUgaW5zdGFuY2UKLQkgKi8KLQlDbG9zdXJlIGdldERlc3Ryb3lDbG9zdXJlKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0ODYzOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotLyoqCi0gKiA8cD5UaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFueSBjbGFzcyBpbiBhIEdyYWlscyBhcHBsaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWlsc0NsYXNzIHsKLQotICAgIC8qKgotICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGFzIGZhY3RvcnkgbWV0aG9kIGluIHRoZSBTcHJpbmcgYXBwbGljYXRpb24gY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IHRoZSB0cmFpbGluZyBjb252ZW50aW9uIHBhcnQgaWYgYXBwbGljYWJsZQotICAgICAqIGFuZCB3aXRob3V0IHRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCBwYWNrYWdlIHByZWZpeAotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2hvcnQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gd2l0aCB0aGUgdGhlIHRyYWlsaW5nIGNvbnZlbnRpb24gcGFydCBhbmQgd2l0aAotICAgICAqIHRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmdWxsIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBhcyBhIHByb3BlcnR5IG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUgcmVwcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gbmF0dXJhbCB0ZXJtcyAoZWcuICdsYXN0TmFtZScgYmVjb21lcyAnTGFzdCBOYW1lJykKLSAgICAgKiBAcmV0dXJuIFRoZSBuYXR1cmFsIHByb3BlcnR5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hdHVyYWxOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogPHA+IFJldHVybnMgdGhlIGFjdHVhbCBjbGF6eiByZXByZXNlbnRlZCBieSB0aGUgR3JhaWxzQ2xhc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldENsYXp6KCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzc1V0aWxzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDRjYjAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXJJbXBsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDgtSnVsLTIwMDUKLSAqIAotICogQ2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aCBHcmFpbHMgY2xhc3MgYXJ0aWZhY3RzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc0NsYXNzVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJlYW5XcmFwcGVySW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgc3BlY2lmaWVkIEdyb292eSBjbGFzcyBpcyBhIGJvb3RzdHJhcAotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgaXMgYSBib290c3RyYXAgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCb290c3RyYXBDbGFzcyggQ2xhc3MgY2xhenogKSB7Ci0gICAgICAgIHJldHVybiBjbGF6ei5nZXROYW1lKCkuZW5kc1dpdGgoRGVmYXVsdEdyYWlsc0Jvb3RzdHJhcENsYXNzLkJPT1RfU1RSQVApICAmJiAhQ2xvc3VyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgb2YgdGhlIHNwZWNpZmllZCBHcm9vdnkgY2xhc3MgaXMgYSB0YWdsaWIKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGEgdGFnbGliCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGFnTGliQ2xhc3MoIENsYXNzIGNsYXp6ICkgewotICAgICAgICByZXR1cm4gaXNUYWdMaWJDbGFzcyhjbGF6ei5nZXROYW1lKCkpICAmJiAhQ2xvc3VyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUYWdMaWJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWUuZW5kc1dpdGgoIERlZmF1bHRHcmFpbHNUYWdMaWJDbGFzcy5UQUdfTElCICk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgc3BlY2lmaWVkIEdyb292eSBjbGFzcyBpcyBhIGNvbnRyb2xsZXIKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGEgY29udHJvbGxlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyb2xsZXJDbGFzcyggQ2xhc3MgY2xhenogKSB7Ci0gICAgICAgIHJldHVybiBpc0NvbnRyb2xsZXJDbGFzcyhjbGF6ei5nZXROYW1lKCkpICAmJiAhQ2xvc3VyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cm9sbGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lLmVuZHNXaXRoKERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MuQ09OVFJPTExFUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwYWdlIGZsb3cgY2xhc3MgdHlwZTwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gIFRydWUgaWYgdGhlIGNsYXNzIGlzIGEgcGFnZSBmbG93IGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFnZUZsb3dDbGFzcyggQ2xhc3MgY2xhenogKSB7Ci0gICAgICAgIHJldHVybiBpc1BhZ2VGbG93Q2xhc3MoY2xhenouZ2V0TmFtZSgpKSAgJiYgIUNsb3N1cmUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFnZUZsb3dDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWUuZW5kc1dpdGgoRGVmYXVsdEdyYWlsc1BhZ2VGbG93Q2xhc3MuUEFHRV9GTE9XKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIGRhdGEgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjbGFzcyBpcyBhIGRhdGEgc291cmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGF0YVNvdXJjZShDbGFzcyBjbGF6eikgewotICAgICAgICByZXR1cm4gY2xhenouZ2V0TmFtZSgpLmVuZHNXaXRoKERlZmF1bHRHcmFpbHNEYXRhU291cmNlLkRBVEFfU09VUkNFKSAmJiAhQ2xvc3VyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGEgc2VydmljZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2UoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmljZShjbGF6ei5nZXROYW1lKCkpICYmICFDbG9zdXJlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2aWNlKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5lbmRzV2l0aChEZWZhdWx0R3JhaWxzU2VydmljZUNsYXNzLlNFUlZJQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgZG9tYWluIGNsYXNzLiBJbiBHcmFpbHMgYSBkb21haW4gY2xhc3MKLSAgICAgKiBpcyBhbnkgY2xhc3MgdGhhdCBoYXMgImlkIiBhbmQgInZlcnNpb24iIHByb3BlcnRpZXM8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb21haW5DbGFzcyggQ2xhc3MgY2xhenogKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGlkZW50aWZ5IGFuZCB2ZXJzaW9uIGZpZWxkIGV4aXN0Ci0gICAgICAgICAgICBjbGF6ei5nZXREZWNsYXJlZEZpZWxkKCBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LklERU5USVRZICk7Ci0gICAgICAgICAgICBjbGF6ei5nZXREZWNsYXJlZEZpZWxkKCBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LlZFUlNJT04gKTsKLSAgICAgICAgICAgIC8vIGFuZCBpdHMgbm90IGEgY2xvc3VyZQotICAgICAgICAgICAgaWYoQ2xvc3VyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHBhc3NlcyBhbGwgY29uZGl0aW9ucyByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyB3aGljaCBjb250YWlucyB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2sKLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvcGVydHlPZlR5cGUoIENsYXNzIGNsYXp6LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzcyB0eXBlICkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBDbGFzcyBwcm9wVHlwZSA9IGdldFByb3BlcnlUeXBlKCBjbGF6eiwgcHJvcGVydHlOYW1lICk7Ci0gICAgICAgICAgICBpZihwcm9wVHlwZSAhPSBudWxsICYmIHByb3BUeXBlLmVxdWFscyggdHlwZSApKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGFuZCB0eXBlIGZyb20gYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBHcmFpbHMgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eVR5cGUgVGhlIHByb3BlcnR5IHR5cGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciBudWxsIGlmIG5vbmUgZXhpc3RzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShDbGFzcyBjbGF6eiwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgcHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlCi0gICAgICAgIGlmKGNsYXp6ID09IG51bGwgfHwgU3RyaW5nVXRpbHMuaXNCbGFuayhwcm9wZXJ0eU5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJlYW5XcmFwcGVyIHdyYXBwZXIgPSAoQmVhbldyYXBwZXIpYmVhbldyYXBwZXJJbnN0YW5jZXMuZ2V0KCBjbGF6ei5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKHdyYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBuZXcgQmVhbldyYXBwZXJJbXBsKGNsYXp6Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgICAgICAgIGJlYW5XcmFwcGVySW5zdGFuY2VzLnB1dCggY2xhenouZ2V0TmFtZSgpLCB3cmFwcGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcFZhbHVlID0gd3JhcHBlci5nZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eU5hbWUgKTsKLSAgICAgICAgICAgIGlmKHBWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICBpZihwcm9wZXJ0eVR5cGUuaXNBc3NpZ25hYmxlRnJvbShwVmFsdWUuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIGluIGluc3RhbnRpYXRpbmcganVzdCByZXR1cm4gbnVsbAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIFByb3BlcnR5RGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBpbnN0YW5jZSBhbmQgcHJvcGVydHkgdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBUaGUgUHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yRm9yVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICBpZihpbnN0YW5jZSA9PSBudWxsIHx8IHByb3BlcnR5VmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIEJlYW5XcmFwcGVyIHdyYXBwZXIgPSBuZXcgQmVhbldyYXBwZXJJbXBsKGluc3RhbmNlKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSB3cmFwcGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB3cmFwcGVyLmdldFByb3BlcnR5VmFsdWUoIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSApOwotICAgICAgICAgICAgaWYocHJvcGVydHlWYWx1ZS5lcXVhbHModmFsdWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHdoaWNoIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSB0eXBlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFByb3BlcnlUeXBlKENsYXNzIGNsYXp6LCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmKGNsYXp6ID09IG51bGwgfHwgU3RyaW5nVXRpbHMuaXNCbGFuayhwcm9wZXJ0eU5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJlYW5XcmFwcGVyIHdyYXBwZXIgPSAoQmVhbldyYXBwZXIpYmVhbldyYXBwZXJJbnN0YW5jZXMuZ2V0KCBjbGF6ei5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKHdyYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBuZXcgQmVhbldyYXBwZXJJbXBsKGNsYXp6Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgICAgICAgIGJlYW5XcmFwcGVySW5zdGFuY2VzLnB1dCggY2xhenouZ2V0TmFtZSgpLCB3cmFwcGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlci5nZXRQcm9wZXJ0eVR5cGUocHJvcGVydHlOYW1lKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMgaW4gaW5zdGFudGlhdGluZyBqdXN0IHJldHVybiBudWxsIGZvciB0aGUgbW9tZW50Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIGNsYXNzIGZvciB0aGUgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyB0byByZXRyaWV2ZSB0aGUgcHJvcGVydGllcyBmcm9tCi0gICAgICogQHBhcmFtIHByb3BlcnR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydGllcyB5b3Ugd2lzaCB0byByZXRyaWV2ZQotICAgICAqCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBQcm9wZXJ0eURlc2NyaXB0b3IgaW5zdGFuY2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0aWVzT2ZUeXBlKENsYXNzIGNsYXp6LCBDbGFzcyBwcm9wZXJ0eVR5cGUpIHsKLSAgICAgICAgaWYoY2xhenogPT0gbnVsbCB8fCBwcm9wZXJ0eVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCi0gICAgICAgIFNldCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJlYW5XcmFwcGVyIHdyYXBwZXIgPSAoQmVhbldyYXBwZXIpYmVhbldyYXBwZXJJbnN0YW5jZXMuZ2V0KCBjbGF6ei5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKHdyYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBuZXcgQmVhbldyYXBwZXJJbXBsKGNsYXp6Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgICAgICAgIGJlYW5XcmFwcGVySW5zdGFuY2VzLnB1dCggY2xhenouZ2V0TmFtZSgpLCB3cmFwcGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHdyYXBwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKCBwcm9wZXJ0eVR5cGUgKSAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGRlc2NyaXB0b3JzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIGluIGluc3RhbnRpYXRpbmcganVzdCByZXR1cm4gbnVsbCBmb3IgdGhlIG1vbWVudAotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChQcm9wZXJ0eURlc2NyaXB0b3JbXSlwcm9wZXJ0aWVzLnRvQXJyYXkoIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3JbIHByb3BlcnRpZXMuc2l6ZSgpIF0gKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlCi0gICAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgZnJvbQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIHByb3BlcnR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBQcm9wZXJ0eURlc2NyaXB0b3IgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub25lIGV4aXN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5KENsYXNzIGNsYXp6LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzcyBwcm9wZXJ0eVR5cGUpIHsKLSAgICAgICAgaWYoY2xhenogPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCZWFuV3JhcHBlciB3cmFwcGVyID0gKEJlYW5XcmFwcGVyKWJlYW5XcmFwcGVySW5zdGFuY2VzLmdldCggY2xhenouZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBpZih3cmFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEJlYW5XcmFwcGVySW1wbChjbGF6ei5uZXdJbnN0YW5jZSgpKTsKLSAgICAgICAgICAgICAgICBiZWFuV3JhcHBlckluc3RhbmNlcy5wdXQoIGNsYXp6LmdldE5hbWUoKSwgd3JhcHBlciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gd3JhcHBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmKHBkLmdldFByb3BlcnR5VHlwZSgpLmVxdWFscyggcHJvcGVydHlUeXBlICkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIGluIGluc3RhbnRpYXRpbmcganVzdCByZXR1cm4gbnVsbCBmb3IgdGhlIG1vbWVudAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIHdpdGhvdXQgdGhlIHBhY2thZ2UgcHJlZml4Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MKLSAgICAgKiBAcmV0dXJuIFRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShDbGFzcyB0YXJnZXRDbGFzcykgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBpbnQgaSA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZihpID4gLTEpIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoIGkgKyAxLCBjbGFzc05hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZXF1aXZhbGVudCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBjbGFzcyB0byBnZXQgdGhlIHByb3BlcnR5IG5hbWUgZm9yCi0gICAgICogQHJldHVybiBBIHByb3BlcnR5IG5hbWUgcmVwZXJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIChlZy4gTXlDbGFzcyBiZWNvbWVzIG15Q2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lUmVwcmVzZW50YXRpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKLSAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IGdldFNob3J0TmFtZSh0YXJnZXRDbGFzcyk7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU5hbWVSZXByZXNlbnRhdGlvbihzaG9ydE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIHJlcHJlc2VudGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lUmVwcmVzZW50YXRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuaW5kZXhPZignICcpID4gLTEpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlQWxsKCJcXHMiLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHByb3BlcnR5IG5hbWUgaW50byBpdHMgbmF0dXJhbCBsYW5ndWFnZSBlcXVpdmFsZW50IGVnICgnZmlyc3ROYW1lJyBiZWNvbWVzICdGaXJzdCBOYW1lJykKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiBUaGUgY29udmVydGVkIHByb3BlcnR5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYXR1cmFsTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBMaXN0IHdvcmRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGNoYXJbXSBjaGFycyA9IG5hbWUudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgY2hhciBjID0gY2hhcnNbal07Ci0gICAgICAgICAgICBTdHJpbmcgdzsKLSAgICAgICAgICAgIGlmKGkgPj0gd29yZHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgdyA9ICIiOwotICAgICAgICAgICAgICAgIHdvcmRzLmFkZChpLCB3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHcgPSAoU3RyaW5nKXdvcmRzLmdldChpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpIHx8IENoYXJhY3Rlci5pc0RpZ2l0KGMpKSB7Ci0gICAgICAgICAgICAgICAgaWYoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpICYmIHcubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYyA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKHcubGVuZ3RoKCkgPiAxICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh3LmNoYXJBdCh3Lmxlbmd0aCgpIC0gMSkpICkgewotICAgICAgICAgICAgICAgICAgICB3ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRzLmFkZCgrK2ksdyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd29yZHMuc2V0KGksIHcgKyBjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGkgPT0gMCAmJiB3Lmxlbmd0aCgpID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh3LmNoYXJBdCh3Lmxlbmd0aCgpIC0gMSkpICkgCXsKLSAgICAgICAgICAgICAgICAgICAgd29yZHMuc2V0KGksIHcgKyBjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRzLmFkZCgrK2ksIFN0cmluZy52YWx1ZU9mKGMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSB3b3Jkcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gKFN0cmluZykgai5uZXh0KCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHdvcmQpOwotICAgICAgICAgICAgaWYoai5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQ29uZmlnVXRpbHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0NvbmZpZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGZlNDEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQ29uZmlnVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzU2NhZmZvbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy5TY2FmZm9sZERvbWFpbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBBIGNvbW1vbiBjbGFzcyB3aGVyZSBzaGFyZWQgY29uZmlndXJhdGlvbmFsIG1ldGhvZHMgY2FuIHJlc2lkZQotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDIyLUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNDb25maWdVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlU2NhZmZvbGRlcnMoR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0KSB7Ci0gICAgICAgIEdyYWlsc0NvbnRyb2xsZXJDbGFzc1tdIGNvbnRyb2xsZXJDbGFzc2VzID0gYXBwbGljYXRpb24uZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgR3JhaWxzQ29udHJvbGxlckNsYXNzIGNvbnRyb2xsZXJDbGFzcyA9IGNvbnRyb2xsZXJDbGFzc2VzW2ldOwotICAgICAgICAgICAgaWYoY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc1NjYWZmb2xkZXIgZ3MgPSAoR3JhaWxzU2NhZmZvbGRlcilhcHBDb250ZXh0LmdldEJlYW4oY29udHJvbGxlckNsYXNzLmdldEZ1bGxOYW1lKCkgKyAiU2NhZmZvbGRlciIpOwotICAgICAgICAgICAgICAgICAgICBpZihncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTY2FmZm9sZERvbWFpbiBzZCA9IGdzLmdldFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjYWZmb2xkRG9tYWluKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRjID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3Moc2QuZ2V0UGVyc2lzdGVudENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC5zZXRJZGVudGl0eVByb3BlcnR5TmFtZShkYy5nZXRJZGVudGlmaWVyKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC5zZXRWYWxpZGF0b3IoZGMuZ2V0VmFsaWRhdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDb250cm9sbGVyQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0NvbnRyb2xsZXJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmVlOGUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0NvbnRyb2xsZXJDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLkdyYWlsc1NjYWZmb2xkZXI7Ci0KLQotLyoqCi0gKiA8cD5SZXByZXNlbnRzIGEgY29udHJvbGxlciBjbGFzcyBpbiBHcmFpbHMuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZXh0ZW5kcyBJbmplY3RhYmxlR3JhaWxzQ2xhc3MgewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbmRleCBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIElOREVYX0FDVElPTiA9ICJpbmRleCI7Ci0gICAgLyoqCi0gICAgICogPHA+R2V0cyB0aGUgbGlzdCBvZiBhbGwgcG9zc2libGUgVVJJJ3MgYXZhaWxhYmxlIGluIHRoaXMgY29udHJvbGxlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbGwgcG9zc2libGUgVVJJJ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpOwotCi0gICAgLyoqCi0gICAgICogPHA+VGVzdHMgaWYgYSBjb250cm9sbGVyIG1hcHMgdG8gYSBnaXZlbiBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29udHJvbGxlciBtYXBzIHRvIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hcHNUb1VSSShTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlldyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIFVSSQotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZSBvZiBVUkkKLSAgICAgKiBAcmV0dXJuIHRoZSB2aWV3IG5hbWUgb2YgbnVsbCBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdCeVVSSShTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlldyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsb3N1cmUgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGNsb3N1cmVOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbG9zdXJlCi0gICAgICogQHJldHVybiBUaGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBjbG9zdXJlIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0J5TmFtZShTdHJpbmcgY2xvc3VyZU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogPHA+UmV0dXJucyBhIGNsb3N1cmUgcHJvcGVydHkgbmFtZSBmb3IgYSBzcGVjaWZpYyBVUkkgb3IgbnVsbCBpZiB0aGUgVVJJIGRvZXMgbm90IG1hcCB0byBhIGNsb3N1cmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9zdXJlIHByb3BlcnR5IG5hbWUgbWFwcGVkIHRvIHRoZSBVUkkgb3IgbnVsbCBpcyBubyBjbG9zdXJlIHdhcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xvc3VyZVByb3BlcnR5TmFtZShTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSBvZiB0aGUgY29udHJvbGxlciBjbGFzcyBpcyBzY2FmZm9sZGluZwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2NhZmZvbGRpbmcoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY2xhc3MgdGhhdCBpcyBiZWluZyBzY2FmZm9sZGVkIGJ5IHRoaXMgY29udHJvbGxlcgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRTY2FmZm9sZGVkQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0RhdGFTb3VyY2UuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0RhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkN2Q4MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogPHA+UmVwcmVzZW50cyBhIGRhdGEgc291cmNlIGluIEdyYWlscy4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNiwgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWlsc0RhdGFTb3VyY2UgZXh0ZW5kcyBJbmplY3RhYmxlR3JhaWxzQ2xhc3MgewotCi0JLyoqCi0JICogPHA+VHJ1ZSBpcyBjb25uZWN0aW9uIHBvb2xpbmcgaXMgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbm5lY3Rpb24gcG9vbGluZyBlbmFibGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQb29sZWQoKTsKLQkKLQkvKioKLQkgKiA8cD5UaGUgZHJpdmVyIGNsYXNzIG5hbWUgZm9yIHRoZSBkYXRhIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGRyaXZlciBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzc05hbWUoKTsKLQkKLQkvKioKLQkgKiA8cD5UaGUgVVJMIGZvciB0aGUgZGF0YSBzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCQotCS8qKgotCSAqIDxwPlRoZSB1c2VybmFtZSBmb3IgdGhlIGRhdGEgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdXNlcm5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCk7Ci0JCi0JLyoqCi0JICogPHA+VGhlIHBhc3N3b3JkIGZvciB0aGUgZGF0YSBzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBwYXNzd29yZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKTsKLQkKLQkvKioKLQkgKiA8cD5PdGhlciBwcm9wZXJ0aWVzIGZvciB0aGlzIGRhdGEgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gb3RoZXIgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE90aGVyUHJvcGVydGllcygpOwotCQotCS8qKgotCSAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGRhdGFiYXNlIHdpdGggSEJNIDIgRERMLCB2YWx1ZXMgY2FuIGJlICJjcmVhdGUiLCAiY3JlYXRlLWRyb3AiIG9yICJ1cGRhdGUiCi0JICogQHJldHVybiBUaGUgZGJDcmVhdGUgbWV0aG9kIHRvIHVzZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGJDcmVhdGUoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29uZmlndXJhdGlvbiBjbGFzcyB0byB1c2Ugd2hlbiBzZXR0aW5nIHVwIHRoZSBkYXRhYmFzZQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRDb25maWd1cmF0aW9uQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0RvbWFpbkNsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNEb21haW5DbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI3ZWZiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0RvbWFpbkNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiA8cD5SZXByZXNlbnRzIGEgcGVyc2lzdGFibGUgR3JhaWxzIGRvbWFpbiBjbGFzczwvcD4KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgSnVsIDUsIDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFpbHNEb21haW5DbGFzcyBleHRlbmRzIEdyYWlsc0NsYXNzIHsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IE9STSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIG1hcCB0aGUgY2xhc3MKLQkgKi8KLQlTdHJpbmcgR09STSA9ICJHT1JNIjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb21haW5DbGFzcwotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3BlY2lmeWluZyBkb21haW4gY2xhc3MgaXMgb24gdGhlIG93bmluZyBzaWRlIG9mIGEgcmVsYXRpb25zaGlwCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPd25pbmdDbGFzcyhDbGFzcyBkb21haW5DbGFzcyk7Ci0gICAgLyoqCi0JICogUmV0dXJucyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGRvbWFpbiBjbGFzcwotCSAqIEByZXR1cm4gVGhlIGRvbWFpbiBjbGFzcyBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgb2YgdGhlIHBlcnNpc3RhbnQgcHJvcGVydGllcyBvZiB0aGUgZG9tYWluIGNsYXNzCi0JICogQHJldHVybiBUaGUgZG9tYWluIGNsYXNzJyBwZXJzaXN0YW50IHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIGdldFBlcnNpc3RhbnRQcm9wZXJ0aWVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBwcm9wZXJ0eQotCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpZXIgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBnZXRJZGVudGlmaWVyKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiBwcm9wZXJ0eQotCSAqIEByZXR1cm4gVGhlIHZlcnNpb24gcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBnZXRWZXJzaW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgVGhlIHByb3BlcnR5IGZvciB0aGUgbmFtZQotCSAqIEB0aHJvd3Mgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5JbnZhbGlkUHJvcGVydHlFeGNlcHRpb24KLQkgKiBAcmV0dXJuIFRoZSBkb21haW4gY2xhc3MgcHJvcGVydHkgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ2V0UHJvcGVydHlCeU5hbWUoU3RyaW5nIG5hbWUpOwkKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWVsZCBuYW1lIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFibGUgbmFtZSBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogPHA+UmV0dXJucyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBHcmFpbHNDbGFzcy4gRm9yIGV4YW1wbGUgdGhlIHByb3BlcnR5IG5hbWUgZm9yIAotCSAqIGEgY2xhc3MgY2FsbGVkICJVc2VyIiB3b3VsZCBiZSAidXNlciI8L3A+Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBpcyBhIG9uZSB0byBtYW55IHJlbGF0aW9uc2hpcAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09uZVRvTWFueShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb3BlcnR5IGlzIGEgbWFueSB0byBvbmUgcmVsYXRpb25zaGlwCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFueVRvT25lKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvcGVydHkgaXMgYSBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gQSBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCaWRpcmVjdGlvbmFsKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHJlbGF0ZWQgY2xhc3Mgb2YgdGhlIGdpdmVuIHByb3BlcnR5Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgCi0JICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgY2xhc3Mgb3IgbnVsbCBpZiBubyByZWxhdGlvbnNoaXAgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICovCi0JcHVibGljIENsYXNzIGdldFJlbGF0ZWRDbGFzc1R5cGUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGNvbnN0cmFpbnRzIGFwcGxpZWQgdG8gdGhpcyBkb21haW4gY2xhc3Mgd2l0aCB0aGUga2V5cyBiZWluZyB0aGUgcHJvcGVydHkgbmFtZQotCSAqIGFuZCB0aGUgdmFsdWVzIGJlaW5nIENvbnN0cmFpbmVkUHJvcGVydHkgaW5zdGFuY2VzCi0JICogCi0JICogQHJldHVybiBBIG1hcCBvZiBjb25zdHJhaW50cwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCk7Ci0JLyoqCi0JICogUmV0cmVpdmVzIHRoZSB2YWxpZGF0b3IgZm9yIHRoaXMgZG9tYWluIGNsYXNzIAotCSAqIAotCSAqIEByZXR1cm4gQSB2YWxpZGF0b3IgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub25lIGV4aXN0cwotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsaWRhdG9yIGZvciB0aGlzIGRvbWFpbiBjbGFzcyAKLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yIFRoZSBkb21haW4gY2xhc3MgdmFsaWRhdG9yIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBPUk0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBtYXAgdGhlIGRvbWFpbiBjbGFzcyAoZGVmYXVsdCBpcyAiR09STSIpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2RhNWZhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLS8qKgotICogQSBwcm9wZXJ0eSBvZiBhIEdyYWlsc0RvbWFpbkNsYXNzIGluc3RhbmNlCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIEp1bCA1LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSB7Ci0JCi0JU3RyaW5nIElERU5USVRZID0gImlkIjsKLQlTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKLQlTdHJpbmcgT1BUSU9OQUwgPSAib3B0aW9uYWxzIjsKLQlTdHJpbmcgVFJBTlNJRU5UID0gInRyYW5zaWVudHMiOwotCVN0cmluZyBDT05TVFJBSU5UUyA9ICJjb25zdHJhaW50cyI7Ci0JU3RyaW5nIEVWQU5FU0NFTlQgPSAiZXZhbmVzY2VudCI7Ci0JU3RyaW5nIFJFTEFUSU9OU0hJUFMgPSAicmVsYXRpb25zaGlwcyI7Ci0JU3RyaW5nIE1FVEFfQ0xBU1MgPSAibWV0YUNsYXNzIjsKLQlTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOwotCVN0cmluZyBNQVBQRURfQlkgPSAibWFwcGVkQnkiOwotICAgIFN0cmluZyBCRUxPTkdTX1RPID0gImJlbG9uZ3NUbyI7Ci0KLSAgICAvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciB0aGUgZG9tYWluIGNsYXNzCi0JICogQHJldHVybiAgVGhlIHByb3BlcnR5IHR5cGUKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIDxwPlJldHVybnMgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgdHlwZS4gVGhpcyBkaWZmZXJzIGZyb20gZ2V0VHlwZSgpIGluIHRoYXQgaW4KLQkgKiB0aGUgY2FzZSBvZiBhbiBBc3NvY2lhdGlvbiBpdCB3aWxsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ29sbGVjdGlvbiwKLQkgKiBvdGhlcndpc2UgaXQgd2lsbCBkZWxlZ2F0ZSB0byBnZXRUeXBlKCk7PC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlZmVyZW5jZWQgdHlwZQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRSZWZlcmVuY2VkUHJvcGVydHlUeXBlKCk7Ci0JCi0JLyoqCi0JICogPHA+UmV0dXJucyB0aGUgb3RoZXIgc2lkZSBvZiBhIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgb3IgbnVsbCBpZiBub3Qga25vd24KLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBnZXRPdGhlclNpZGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzcyB0eXBlIGFzIGEgcHJvcGVydHkgbmFtZSByZXByZXNlbnRhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVQcm9wZXJ0eU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZG9tYWluIGNsYXNzIG9mIHRoZSBwcm9wZXJ0eSBpbnN0YW5jZQotCSAqIEByZXR1cm4gVGhlIHBhcmVudCBkb21haW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3MgZ2V0RG9tYWluQ2xhc3MoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRvbWFpbiBjbGFzcyBwcm9wZXJ0eSBpcyBhIHBlcnNpc3RhbnQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHBlcnNpc3RlbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhbnQoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBvcHRpb25hbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhlIHByb3BlcnR5IGlzIGFuIGlkZW50aWZpZXIKLQkgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHRoZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudGl0eSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAKLQkgKiBAcmV0dXJuIFdoZXRoZXIgaXQgaXMgYSBvbmVUb01hbnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09uZVRvTWFueSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAKLQkgKiBAcmV0dXJuIFdoZXRoZXIgaXQgaXMgYSBtYW55VG9PbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbnlUb09uZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwCi0JICogQHJldHVybiBUcnVlIGlmIGl0IGlzIGEgbWFueVRvTWFueQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbnlUb01hbnkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwCi0JICogQHJldHVybiBBIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JpZGlyZWN0aW9uYWwoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb21haW4gZmllbGQgbmFtZSBmb3IgdGhpcyBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiBpdCBpcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVUb09uZSgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIEdyYWlsc0RvbWFpbkNsYXNzIG9mIGEgcmVsYXRpb25zaGlwIHByb3BlcnR5IG9yIG51bGwgCi0JICogaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhIHJlbGF0aW9uc2hpcCBwcm9wZXJ0eQotCSAqIAotCSAqIEByZXR1cm4gVGhlIEdyYWlsc0RvbWFpbkNsYXNzCi0JICovCi0JcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzIGdldFJlZmVyZW5jZWREb21haW5DbGFzcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHByb3BlcnR5IGlzIGEgcmVsYXRpb25zaGlwIHByb3BlcnR5Ci0JICogQHJldHVybiBUcnVlIGlmIGl0IGlzIGFuIGFzc29jaWF0aXZlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NvY2lhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmF0dXJhbCBuYW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9wZXJ0eSAoZWcuICdsYXN0TmFtZScgYmVjb21lcyAnTGFzdCBOYW1lJwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmF0dXJhbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlZmVyZW5jZXMgZG9tYWluIGNsYXNzIG9uIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkR3JhaWxzRG9tYWluQ2xhc3MKLSAgICAgKi8KLSAgICB2b2lkIHNldFJlZmVyZW5jZWREb21haW5DbGFzcyhHcmFpbHNEb21haW5DbGFzcyByZWZlcmVuY2VkR3JhaWxzRG9tYWluQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb3RoZXIgc2lkZSBvZiBhbiBhc3NvY2lhdGl2ZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkUHJvcGVydHkKLSAgICAgKi8KLSAgICB2b2lkIHNldE90aGVyU2lkZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHJlZmVyZW5jZWRQcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNQYWdlRmxvd0NsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNQYWdlRmxvd0NsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDM4ZDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzUGFnZUZsb3dDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci0KLS8qKgotICogPHA+SW50ZXJmYWNlIGhvbGRpbmcgYSBwYWdlIGZsb3cgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMTAsIDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFpbHNQYWdlRmxvd0NsYXNzIGV4dGVuZHMgSW5qZWN0YWJsZUdyYWlsc0NsYXNzIHsKLQotCS8qKgotCSAqIDxwPlJldHVybnMgdGhlIGZsb3cgaWQuCi0JICogCi0JICogQHJldHVybiB0aGUgZmxvdyBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rmxvd0lkKCk7Ci0JCi0JLyoqCi0JICogPHA+UmV0dXJucyB0aGUgVVJJIG9mIHRoaXMgcGFnZSBmbG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSSSBvZiB0aGlzIHBhZ2UgZmxvdy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpOwotCQotCS8qKgotCSAqIDxwPlBhZ2UgZmxvdyBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggVVJJLiBJZiBzZXQgdG8gZmFsc2UgdGhlIHBhZ2UgZmxvdwotCSAqIGlzIGFjY2Vzc2libGUgYXMgYSBzdWIgZmxvdyBvciB0aHJvdWdoIHRoZSBfZmxvd0lkIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWdlIGZsb3cgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIGFuIFVSSS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRBY2Nlc3NpYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNSZXNvdXJjZUxvYWRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzUmVzb3VyY2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiOGYwMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNSZXNvdXJjZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSZXNvdXJjZUxvYWRlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuaW8uUmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIEdyb292eVJlc291cmNlTG9hZGVyIHRoYXQgbG9hZHMgZ3Jvb3Z5IGZpbGVzIHVzaW5nIFNwcmluZydzIElPIGFic3RyYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDIyLUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIEdyb292eVJlc291cmNlTG9hZGVyIHsKLSAgICBwcml2YXRlIFJlc291cmNlW10gcmVzb3VyY2VzOwotICAgIHByaXZhdGUgTGlzdCBsb2FkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgR3JhaWxzUmVzb3VyY2VMb2FkZXIoUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldExvYWRlZFJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGxvYWRlZFJlc291cmNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBsb2FkR3Jvb3Z5U291cmNlKFN0cmluZyByZXNvdXJjZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBncm9vdnlGaWxlID0gcmVzb3VyY2UucmVwbGFjZSgnLicsICcvJykgKyAiLmdyb292eSI7Ci0gICAgICAgIFJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgcmVzb3VyY2VzICE9IG51bGwgJiYgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5nZXRGaWxlbmFtZSgpLmVuZHNXaXRoKGdyb292eUZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kUmVzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc291cmNlcyBbIiArIHJlc291cmNlc1tpXS5nZXRGaWxlbmFtZSgpICsgIl0gYW5kIFsiICsgZm91bmRSZXNvdXJjZS5nZXRGaWxlbmFtZSgpICsgIl0gZW5kIHdpdGggWyIgKyBncm9vdnlGaWxlICsgIl0uIENhbm5vdCBsb2FkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIG1hdGNoISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGZvdW5kUmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRlZFJlc291cmNlcy5hZGQoZm91bmRSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kUmVzb3VyY2UuZ2V0VVJMKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0dyYWlsc1NlcnZpY2VDbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzU2VydmljZUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTE5MWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzU2VydmljZUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA3LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzU2VydmljZUNsYXNzIGV4dGVuZHMgSW5qZWN0YWJsZUdyYWlsc0NsYXNzIHsKLQotCS8qKgotCSAqIDxwPlNlcnZpY2Ugc2hvdWxkIGJlIGNvbmZpZ3VyZWQgd2l0aCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbmZpZ3VyZSB3aXRoIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2FjdGlvbmFsKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNUYWdMaWJDbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzVGFnTGliQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxN2Y1Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNUYWdMaWJDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPlJlcHJlc2VudHMgYSBHcmFpbHMgdGFiIGxpYnJhcnkgY2xhc3M8L3A+Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgSmFuIDE0LCAyMDA2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzVGFnTGliQ2xhc3MgZXh0ZW5kcyBJbmplY3RhYmxlR3JhaWxzQ2xhc3MgewotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChpZSBnbG9iYWwpIHRhZyBsaWJyYXJ5IGFwcHJvcHJpYXRlIGZvciBhbGwgY29udHJvbGxlciBjbGFzc2VzCi0gICAgICovCi0gICAgU3RyaW5nIFNVUFBPUlRTX0NPTlRST0xMRVIgPSAic3VwcG9ydHNDb250cm9sbGVyIjsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhpcyB0YWcgbGlicmFyeSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGNvbnRyb2xsZXIKLSAgICAgKiBAcGFyYW0gY29udHJvbGxlckNsYXNzIFRoZSBjb250cm9sbGVyQ2xhc3MgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaXMgc3VwcG9ydGVkCi0gICAgICovCi0gICAgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xsZXIoR3JhaWxzQ29udHJvbGxlckNsYXNzIGNvbnRyb2xsZXJDbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHRhZyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFnCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNUYWcoU3RyaW5nIHRhZ05hbWUpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0YWcgbmFtZXMgaW4gdGhpcyBsaWJyYXJ5Ci0gICAgICovCi0gICAgU2V0IGdldFRhZ05hbWVzKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9JbmplY3RhYmxlR3JhaWxzQ2xhc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0luamVjdGFibGVHcmFpbHNDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVjNGU0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0luamVjdGFibGVHcmFpbHNDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotLyoqCi0gKiA8cD5SZXByZXNlbnRzIGEgR3JhaWxzIGNsYXNzIHRoYXQgaXMgdG8gYmUgY29uZmlndXJlZCBpbiBTcHJpbmcgYW5kIGFzIHN1Y2gKLSAqIGlzIGluamVjdGFibGUuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBJbmplY3RhYmxlR3JhaWxzQ2xhc3MgZXh0ZW5kcyBHcmFpbHNDbGFzcyB7Ci0KLQkvKioKLQkgKiA8cD5JZiBhdXRvd2lyaW5nIGJ5IG5hbWUgaXMgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGF1dG93aXJpbmcgYnkgbmFtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJ5TmFtZSgpOwotCQotCS8qKgotCSAqIDxwPklmIGF1dG93aXJpbmcgYnkgdHlwZSBpcyBlbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gYXV0b3dpcmluZyBieSB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gYnlUeXBlKCk7Ci0JCi0JLyoqCi0JICogPHA+SWYgY2xhc3Mgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEF2YWlsYWJsZSgpOwkKLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzVhZTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA3LCAyMDA1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uIGltcGxlbWVudHMKLQkJRHluYW1pY01ldGhvZEludm9jYXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7Ci0JCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsJCQotCQlzdXBlcigpOwotCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2ROYW1lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZE1hdGNoKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2ROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGludm9rZShPYmplY3QgdGFyZ2V0LCBPYmplY3RbXSBhcmd1bWVudHMpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY01ldGhvZHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZWVkNTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY01ldGhvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkFycmF5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotCi0vKioKLSAqIEludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRhUmVnaXN0cnkoKS5zZXRNZXRhQ2xhc3MoRm9vLmNsYXNzLG15Rm9vTWV0YUNsYXNzKQotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA3LCAyMDA1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER5bmFtaWNNZXRob2RzIGltcGxlbWVudHMgRHluYW1pY01ldGhvZHMgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGR5bmFtaWNNZXRob2RJbnZvY2F0aW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHN0YXRpY01ldGhvZEludm9jYXRpb25zID0gbnVsbDsKLQlwcml2YXRlIE1hcCBkeW5hbWljUHJvcGVydGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBDbGFzcyBjbGF6eiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0RHluYW1pY01ldGhvZHMuY2xhc3MpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIERlbGVnYXRpbmdNZXRhQ2xhc3MgaW5zdGFuY2UgaW4gdGhlIHJlZ2lzdHJ5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gdGhlQ2xhc3MKLQkgKiBAdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REeW5hbWljTWV0aG9kcyhDbGFzcyB0aGVDbGFzcykKLQkJCXRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcyh0aGVDbGFzcywgdHJ1ZSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgb3B0aW9uYWxseSByZWdpc3RlcnMgYSBEZWxlZ2F0aW5nTWV0YUNsYXNzIGluIHRoZSBNZXRhQ2xhc1JlZ2lzdHJ5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgY2xhc3MKLQkgKiBAcGFyYW0gdGhlQ2xhc3MKLQkgKiBAcGFyYW0gaW5SZWdpc3RyeQotCSAqIEB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdER5bmFtaWNNZXRob2RzKENsYXNzIHRoZUNsYXNzLCBib29sZWFuIGluUmVnaXN0cnkpCi0JdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotCQkJc3VwZXIoKTsKLQkJCW5ldyBEZWxlZ2F0aW5nTWV0YUNsYXNzKHRoZUNsYXNzLCB0aGlzLCBpblJlZ2lzdHJ5KTsKLQkJCXRoaXMuY2xhenogPSB0aGVDbGFzczsKLQkJCXRoaXMuZHluYW1pY01ldGhvZEludm9jYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdGhpcy5zdGF0aWNNZXRob2RJbnZvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXRoaXMuZHluYW1pY1Byb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCX0JCi0JCi0JLyoqCi0JICogQSBub24tcmVnaXN0ZXJpbmcgY29uc3RydWN0b3IgdGhhdCBzaW1wbGUgY3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01ldGhvZHMoKSB7Ci0JCXRoaXMuZHluYW1pY01ldGhvZEludm9jYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLnN0YXRpY01ldGhvZEludm9jYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsJCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5EeW5hbWljTWV0aG9kcyNhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbihvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuRHluYW1pY01ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkRHluYW1pY01ldGhvZEludm9jYXRpb24oRHluYW1pY01ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbikgewkJCi0JCXRoaXMuZHluYW1pY01ldGhvZEludm9jYXRpb25zLmFkZChtZXRob2RJbnZvY2F0aW9uKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLkR5bmFtaWNNZXRob2RzI2FkZFN0YXRpY01ldGhvZEludm9jYXRpb24ob3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLlN0YXRpY01ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihTdGF0aWNNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24pIHsKLQkJdGhpcy5zdGF0aWNNZXRob2RJbnZvY2F0aW9ucy5hZGQobWV0aG9kSW52b2NhdGlvbik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5EeW5hbWljTWV0aG9kcyNhZGREeW5hbWljUHJvcGVydHkob3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLkR5bmFtaWNQcm9wZXJ0eSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREeW5hbWljUHJvcGVydHkoRHluYW1pY1Byb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXRoaXMuZHluYW1pY1Byb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5EeW5hbWljTWV0aG9kcyNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuSW52b2NhdGlvbkNhbGxiYWNrKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgSW52b2NhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CQkKLQkJRHluYW1pY1Byb3BlcnR5IGdldHRlciA9IChEeW5hbWljUHJvcGVydHkpdGhpcy5keW5hbWljUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQkJaWYgKGdldHRlciAhPSBudWxsICYmIGdldHRlci5pc1Byb3BlcnR5TWF0Y2gocHJvcGVydHlOYW1lKSkgewotCQkJY2FsbGJhY2subWFya0ludm9rZWQoKTsKLQkJCXJldHVybiBnZXR0ZXIuZ2V0KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLkR5bmFtaWNNZXRob2RzI3NldFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5JbnZvY2F0aW9uQ2FsbGJhY2spCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSxPYmplY3QgbmV3VmFsdWUsIEludm9jYXRpb25DYWxsYmFjayBjYWxsYmFjaykgewotCQlEeW5hbWljUHJvcGVydHkgc2V0dGVyID0gKER5bmFtaWNQcm9wZXJ0eSl0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCQlpZiAoc2V0dGVyICE9IG51bGwgJiYgc2V0dGVyLmlzUHJvcGVydHlNYXRjaChwcm9wZXJ0eU5hbWUpKSB7Ci0JCQljYWxsYmFjay5tYXJrSW52b2tlZCgpOwotCQkJc2V0dGVyLnNldChvYmplY3QsbmV3VmFsdWUpOwotCQl9CQkKLQl9CQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5EeW5hbWljTWV0aG9kcyNpbnZva2VNZXRob2QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuSW52b2NhdGlvbkNhbGxiYWNrKQotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLAotCQlPYmplY3RbXSBhcmd1bWVudHMsIEludm9jYXRpb25DYWxsYmFjayBjYWxsYmFjaykgewotCQlpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotCQkJTE9HLnRyYWNlKCJbRHluYW1pY01ldGhvZHNdIEF0dGVtcHRpbmcgaW52b2NhdGlvbiBvZiBkeW5hbWljIG1ldGhvZCBbIittZXRob2ROYW1lKyJdIG9uIHRhcmdldCBbIitvYmplY3QrIl0gd2l0aCBhcmd1bWVudHMgWyIrQXJyYXlVdGlscy50b1N0cmluZyggYXJndW1lbnRzICkrIl0iKTsJCQkKLQkJfQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZHluYW1pY01ldGhvZEludm9jYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRHluYW1pY01ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChEeW5hbWljTWV0aG9kSW52b2NhdGlvbilpdGVyLm5leHQoKTsKLQkJCWlmIChtZXRob2RJbnZvY2F0aW9uLmlzTWV0aG9kTWF0Y2gobWV0aG9kTmFtZSkpIHsKLQkJCQlpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotCQkJCQlMT0cudHJhY2UoIltEeW5hbWljTWV0aG9kc10gRHluYW1pYyBtZXRob2QgbWF0Y2hlZCwgbWFya2luZyBhbmQgaW52b2tpbmciKTsJCQkKLQkJCQl9CQkJCQotCQkJCWNhbGxiYWNrLm1hcmtJbnZva2VkKCk7Ci0JCQkJcmV0dXJuIG1ldGhvZEludm9jYXRpb24uaW52b2tlKG9iamVjdCwgYXJndW1lbnRzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLkR5bmFtaWNNZXRob2RzI2ludm9rZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10sIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5JbnZvY2F0aW9uQ2FsbGJhY2spCi0JICovCi0JcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlPYmplY3RbXSBhcmd1bWVudHMsIEludm9jYXRpb25DYWxsYmFjayBjYWxsQmFjaykgewotCQlpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotCQkJTE9HLnRyYWNlKCJbRHluYW1pY01ldGhvZHNdIEF0dGVtcHRpbmcgaW52b2NhdGlvbiBvZiBkeW5hbWljIHN0YXRpYyBtZXRob2QgWyIrbWV0aG9kTmFtZSsiXSBvbiB0YXJnZXQgWyIrb2JqZWN0KyJdIHdpdGggYXJndW1lbnRzIFsiK0FycmF5VXRpbHMudG9TdHJpbmcoIGFyZ3VtZW50cyApKyJdIik7Ci0JCQkvL0xPRy50cmFjZSgiW0R5bmFtaWNNZXRob2RzXSBSZWdpc3RlcmVkIGR5bmFtaWMgc3RhdGljIG1ldGhvZHM6IFsiK3RoaXMuc3RhdGljTWV0aG9kSW52b2NhdGlvbnMrIl0iKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLnN0YXRpY01ldGhvZEludm9jYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RhdGljTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKFN0YXRpY01ldGhvZEludm9jYXRpb24paXRlci5uZXh0KCk7Ci0JCQlpZiAobWV0aG9kSW52b2NhdGlvbi5pc01ldGhvZE1hdGNoKG1ldGhvZE5hbWUpKSB7Ci0JCQkJaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLQkJCQkJTE9HLnRyYWNlKCJbRHluYW1pY01ldGhvZHNdIFN0YXRpYyBtZXRob2QgbWF0Y2hlZCwgbWFya2luZyBhbmQgaW52b2tpbmciKTsJCQkKLQkJCQl9CQkJCQotCQkJCWNhbGxCYWNrLm1hcmtJbnZva2VkKCk7Ci0JCQkJcmV0dXJuIG1ldGhvZEludm9jYXRpb24uaW52b2tlKHRoaXMuY2xhenosIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIER5bmFtaWNQcm9wZXJ0eSBnZXREeW5hbWljUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gKER5bmFtaWNQcm9wZXJ0eSl0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhNGViMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvQWJzdHJhY3REeW5hbWljTWV0aG9kc0ludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuSW50ZXJjZXB0b3I7Ci0vKioKLSAqIEltcGxlbWVudHMgYW4gdGhlIEludGVyY2VwdG9yIGludGVyZmFjZSB0byBhZGQgc3VwcG9ydCBmb3IgdXNpbmcgUHJveHlNZXRhQ2xhc3MgdG8gZGVmaW5lIAotICogZHluYW1pYyBtZXRob2RzCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNCwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REeW5hbWljTWV0aG9kc0ludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3REeW5hbWljTWV0aG9kcwotCQlpbXBsZW1lbnRzIEludGVyY2VwdG9yLFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9JbnZva2UgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGRvR2V0ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1NldCA9IHRydWU7Ci0JcHJpdmF0ZSBPYmplY3QgcmV0dXJuVmFsdWU7Ci0JCi0KLQlwdWJsaWMgT2JqZWN0IGJlZm9yZUludm9rZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSwKLQkJCU9iamVjdFtdIGFyZ3VtZW50cykgewotCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrKCk7Ci0JCXRoaXMucmV0dXJuVmFsdWUgPSBzdXBlci5pbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGNhbGxiYWNrKTsKLQkJLy8gaWYgdGhlIG1ldGhvZCB3YXMgaW52b2tlZCBhcyBkeW5hbWljIAotCQkvLyBkb24ndCBpbnZva2UgdHJ1ZSB0YXJnZXQKLQkJaWYgKGNhbGxiYWNrLmlzSW52b2tlZCgpKSB7Ci0JCQlkb0ludm9rZSA9IGZhbHNlOwotCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQl9IGVsc2UgewotCQkJZG9JbnZva2UgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFmdGVySW52b2tlKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLAotCQkJT2JqZWN0W10gYXJndW1lbnRzLCBPYmplY3QgcmVzdWx0KSB7Ci0JCXJldHVybiB0aGlzLnJldHVyblZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvSW52b2tlKCkgewotCQlyZXR1cm4gZG9JbnZva2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBiZWZvcmVHZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUludm9jYXRpb25DYWxsYmFjayBjYWxsYmFjayA9IG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2soKTsKLQkJT2JqZWN0IHJldHVyblZhbHVlID0gc3VwZXIuZ2V0UHJvcGVydHkob2JqZWN0LHByb3BlcnR5LGNhbGxiYWNrKTsKLQkJLy8gaWYgdGhlIG1ldGhvZCB3YXMgaW52b2tlZCBhcyBkeW5hbWljIAotCQkvLyBkb24ndCBpbnZva2UgdHJ1ZSB0YXJnZXQKLQkJaWYgKGNhbGxiYWNrLmlzSW52b2tlZCgpKSB7Ci0JCQlkb0dldCA9IGZhbHNlOwotCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQl9IGVsc2UgewotCQkJZG9HZXQgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWZvcmVTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJSW52b2NhdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEludm9jYXRpb25DYWxsYmFjaygpOwotCQlzdXBlci5zZXRQcm9wZXJ0eShvYmplY3QscHJvcGVydHksbmV3VmFsdWUsY2FsbGJhY2spOwotCQkvLyBpZiB0aGUgbWV0aG9kIHdhcyBpbnZva2VkIGFzIGR5bmFtaWMgCi0JCS8vIGRvbid0IGludm9rZSB0cnVlIHRhcmdldAotCQlpZiAoY2FsbGJhY2suaXNJbnZva2VkKCkpIHsKLQkJCWRvU2V0ID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlkb1NldCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0dldCgpIHsKLQkJcmV0dXJuIGRvR2V0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvU2V0KCkgewotCQlyZXR1cm4gZG9TZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvQWJzdHJhY3REeW5hbWljUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI2YmMzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLS8qKgotICogPHA+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIGltcGxlbWVudG9ycyBvZiBkeW5hbWljIGdldHRlcnMgdG8gaW1wbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNCwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REeW5hbWljUHJvcGVydHkgaW1wbGVtZW50cyBEeW5hbWljUHJvcGVydHkgewotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCQotCQotCXB1YmxpYyBBYnN0cmFjdER5bmFtaWNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlNYXRjaChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZS5lcXVhbHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdFN0YXRpY01ldGhvZEludm9jYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9BYnN0cmFjdFN0YXRpY01ldGhvZEludm9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhOTdiYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvQWJzdHJhY3RTdGF0aWNNZXRob2RJbnZvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDcsIDIwMDUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhdGljTWV0aG9kSW52b2NhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY01ldGhvZEludm9jYXRpb24gewotCi0JcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQotCXB1YmxpYyBBYnN0cmFjdFN0YXRpY01ldGhvZEludm9jYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGF0dGVybihQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhdHRlcm4gZ2V0UGF0dGVybigpIHsKLQkJcmV0dXJuIHBhdHRlcm47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RNYXRjaChTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gdGhpcy5wYXR0ZXJuLm1hdGNoZXIobWV0aG9kTmFtZS5zdWJTZXF1ZW5jZSgwLCBtZXRob2ROYW1lLmxlbmd0aCgpKSkubWF0Y2hlcygpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlKENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMpCi0JCQkJCQkuYXBwZW5kKCJQYXR0ZXJuIix0aGlzLnBhdHRlcm4pCi0JCQkJCQkudG9TdHJpbmcoKTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EZWxlZ2F0aW5nTWV0YUNsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvRGVsZWdhdGluZ01ldGFDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmMzOGYyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EZWxlZ2F0aW5nTWV0YUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzc0ltcGw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgOCwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ01ldGFDbGFzcyBleHRlbmRzIE1ldGFDbGFzc0ltcGwgewotCi0JRHluYW1pY01ldGhvZHMgZHluYW1pY01ldGhvZHMgPSBudWxsOwotCQotCXB1YmxpYyBEZWxlZ2F0aW5nTWV0YUNsYXNzKENsYXNzIGNsYXp6LCBEeW5hbWljTWV0aG9kcyBkeW5hbWljTWV0aG9kcykKLQkJCXRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcyhjbGF6eixkeW5hbWljTWV0aG9kcyx0cnVlKTsKLQl9Ci0JCi0JcHVibGljIERlbGVnYXRpbmdNZXRhQ2xhc3MoQ2xhc3MgY2xhenosIER5bmFtaWNNZXRob2RzIGR5bmFtaWNNZXRob2RzLCBib29sZWFuIGluUmVnaXN0cnkpCi0JCQl0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKEludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRhUmVnaXN0cnkoKSwgY2xhenopOwotCQl0aGlzLmR5bmFtaWNNZXRob2RzID0gZHluYW1pY01ldGhvZHM7Ci0JCWlmKGluUmVnaXN0cnkpIHsKLQkJCXJlZ2lzdHJ5LnNldE1ldGFDbGFzcyhjbGF6eiwgdGhpcyk7Ci0JCX0KLQl9CQotCi0JcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrKCk7Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IHRoaXMuZHluYW1pY01ldGhvZHMuaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBjYWxsYmFjayk7Ci0JCWlmIChjYWxsYmFjay5pc0ludm9rZWQoKSkgewotCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrKCk7Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IHRoaXMuZHluYW1pY01ldGhvZHMuaW52b2tlU3RhdGljTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBjYWxsYmFjayk7Ci0JCWlmIChjYWxsYmFjay5pc0ludm9rZWQoKSkgewotCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmludm9rZVN0YXRpY01ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgewotCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrKCk7Ci0JCXRoaXMuZHluYW1pY01ldGhvZHMuc2V0UHJvcGVydHkob2JqZWN0LHByb3BlcnR5LG5ld1ZhbHVlLGNhbGxiYWNrKTsKLQkJaWYgKCFjYWxsYmFjay5pc0ludm9rZWQoKSkgewotCQkJc3VwZXIuc2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrKCk7Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IHRoaXMuZHluYW1pY01ldGhvZHMuZ2V0UHJvcGVydHkob2JqZWN0LHByb3BlcnR5LGNhbGxiYWNrKTsKLQkJaWYgKGNhbGxiYWNrLmlzSW52b2tlZCgpKSB7Ci0JCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkob2JqZWN0LHByb3BlcnR5KTsKLQkJfQkKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvRHluYW1pY01ldGhvZEludm9jYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EeW5hbWljTWV0aG9kSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWMwZmI2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EeW5hbWljTWV0aG9kSW52b2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3M7Ci0KLS8qKgotICogPHA+RHluYW1pYyBtZXRob2QgaW52b2NhdGlvbiBjYWxsYmFjayBpbnRlcmZhY2UuIEltcGxlbWVudGF0aW9uIGNsYXNzZXMKLSAqIGNhbiBhZGQgYSBwZXJzaXN0ZW5jZSBmdW5jdGlvbmFsaXR5IHRvIEdyYWlscyBsaWtlIHNhdmUgYW5kIGRlbGV0ZS4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNywgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNNZXRob2RJbnZvY2F0aW9uIHsKLQotCS8qKgotCSAqIDxwPkNoZWNrcyBpZiBhIG1ldGhvZCBuYW1lIG1hdGNoZXMgdGhlIGNyaXRlcmlhIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgc3RhdGljIG1ldGhvZCBuYW1lCi0JICogQHJldHVybiByZXN1bHQgb2YgY3JpdGVyaWEgbWF0Y2ggdGVzdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTWF0Y2goU3RyaW5nIG1ldGhvZE5hbWUpOwotCS8qKgotCSAqIDxwPlJldHVybnMgdGhlIG1ldGhvZCBuYW1lIGZvciB0aGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIG1ldGhvZCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0JCi0JLyoqCi0JICogPHA+SW52b2tlcyB0aGUgYWN0dWFsIG1ldGhvZC4gVGhlIHRhcmdldCBvYmplY3QgYW5kIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IG9uIHdoaWNoIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KLQkgKiBAcGFyYW0gYXJndW1ldG5zIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluIHRoZSBtZXRob2QgY2FsbAotCSAqIEBwYXJhbSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkeW5hbWljIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cyk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvRHluYW1pY01ldGhvZHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EeW5hbWljTWV0aG9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI2NGM5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9EeW5hbWljTWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLS8qKgotICogQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBtZXRob2RzIGZvciBhIGhhbmRsaW5nIGR5bmFtaWMgbWV0aG9kLCBzdGF0aWMgbWV0aG9kIGFuZCBwcm9wZXJ0eSAKLSAqIGludm9jYXRpb25zCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNywgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNNZXRob2RzIHsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZHluYW1pYyBtZXRob2QgaW52b2NhdGlvbgotCSAqIEBwYXJhbSBtZXRob2RJbnZvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRHluYW1pY01ldGhvZEludm9jYXRpb24oCi0JCQlEeW5hbWljTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgc3RhdGljIG1ldGhvZCBpbnZvY2F0aW9uCi0JICogQHBhcmFtIG1ldGhvZEludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRTdGF0aWNNZXRob2RJbnZvY2F0aW9uKAotCQkJU3RhdGljTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZHluYW1pYyBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZER5bmFtaWNQcm9wZXJ0eShEeW5hbWljUHJvcGVydHkgcHJvcGVydHkpOwotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgZHluYW1pYyBwcm9wZXJ0eSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIEEgRHluYW1pY1Byb3BlcnR5IGluc3RhbmNlIG9mIG51bGwgaWYgbm9uZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRHluYW1pY1Byb3BlcnR5IGdldER5bmFtaWNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQlJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLQkJCU9iamVjdCBuZXdWYWx1ZSwgSW52b2NhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLAotCQkJT2JqZWN0W10gYXJndW1lbnRzLCBJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlPYmplY3RbXSBhcmd1bWVudHMsIEludm9jYXRpb25DYWxsYmFjayBjYWxsQmFjayk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvRHluYW1pY1Byb3BlcnR5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvRHluYW1pY1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWRjOGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0R5bmFtaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLS8qKgotICogPHA+QSBEeW5hbWljIGNsYXNzIHByb3BlcnR5IGdldHRlciBpbnRlcmZhY2UKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI0LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRHluYW1pY1Byb3BlcnR5IHsKLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIHRhcmdldCBjbGFzcyBjb250YWlucyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGhhcyB0aGUgcHJvcGVydHkKLQkgKi8KLQlib29sZWFuIGlzUHJvcGVydHlNYXRjaChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIENhbGwgdGhlIGdldHRlciBvbiB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdCBUaGUgdGFyZ2V0IG9iamVjdAotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgZ2V0dGVyCi0JICovCi0JT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KTsKLQkKLQkvKioKLQkgKiBDYWxsIHRoZSBzZXR0ZXIgb24gdGhlIGdpdmVuIG9iamVjdAotCSAqIEBwYXJhbSBvYmplY3QgVGhlIHRhcmdldCBvYmplY3QKLQkgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQl2b2lkIHNldChPYmplY3Qgb2JqZWN0LCBPYmplY3QgbmV3VmFsdWUpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7CQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0dlbmVyaWNEeW5hbWljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkNjFmZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZ2VuZXJpYyBkeWFubWljIHByb3BlcnR5IGZvciBhbnkgdHlwZQotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjcsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNEeW5hbWljUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdER5bmFtaWNQcm9wZXJ0eSB7Ci0KLQlwcml2YXRlIENsYXNzIHR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlYWR5T25seTsKLQlwcml2YXRlIE1hcCBwcm9wZXJ0eVRvSW5zdGFuY2VNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0JcHJpdmF0ZSBPYmplY3QgaW5pdGlhbFZhbHVlOwotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIGluaXRpYWxWYWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcmVhZE9ubHkgVHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnR5Ci0JICovCi0JcHVibGljIEdlbmVyaWNEeW5hbWljUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgdHlwZSxPYmplY3QgaW5pdGlhbFZhbHVlLGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJc3VwZXIocHJvcGVydHlOYW1lKTsKLQkJaWYodHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uc3RydWN0b3IgYXJndW1lbnQgJ3R5cGUnIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRoaXMucmVhZHlPbmx5ID0gcmVhZE9ubHk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7OwotCQl0aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcmVhZE9ubHkgVHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnR5Ci0JICovCi0JcHVibGljIEdlbmVyaWNEeW5hbWljUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgdHlwZSxib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXN1cGVyKHByb3BlcnR5TmFtZSk7Ci0JCWlmKHR5cGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGFyZ3VtZW50ICd0eXBlJyBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLnJlYWR5T25seSA9IHJlYWRPbmx5OwotCQl0aGlzLnR5cGUgPSB0eXBlOzsKLQl9Ci0JCi0KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KSB7CQkJCi0JCVN0cmluZyBwcm9wZXJ0eUtleSA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iamVjdCkgKyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYocHJvcGVydHlUb0luc3RhbmNlTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5S2V5KSkgewotCQkJcmV0dXJuIHByb3BlcnR5VG9JbnN0YW5jZU1hcC5nZXQocHJvcGVydHlLZXkpOwotCQl9Ci0JCWVsc2UgaWYodGhpcy5pbml0aWFsVmFsdWUgIT0gbnVsbCkgewotCQkJcHJvcGVydHlUb0luc3RhbmNlTWFwLnB1dChwcm9wZXJ0eUtleSwgdGhpcy5pbml0aWFsVmFsdWUpOwotCQkJcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqZWN0LCBPYmplY3QgbmV3VmFsdWUpIHsJCQotCQlpZighcmVhZHlPbmx5KSB7Ci0gICAgICAgICAgICBpZihuZXdWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlUb0luc3RhbmNlTWFwLnB1dChTdHJpbmcudmFsdWVPZihTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvYmplY3QpKSArIGdldFByb3BlcnR5TmFtZSgpLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHRoaXMudHlwZS5pc0luc3RhbmNlKG5ld1ZhbHVlKSkKLQkJCQlwcm9wZXJ0eVRvSW5zdGFuY2VNYXAucHV0KFN0cmluZy52YWx1ZU9mKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iamVjdCkpICsgZ2V0UHJvcGVydHlOYW1lKCksIG5ld1ZhbHVlICk7Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiUHJvcGVydHkgJyIrdGhpcy5nZXRQcm9wZXJ0eU5hbWUoKSsiJyBmb3Igb2JqZWN0ICciK29iamVjdC5nZXRDbGFzcygpKyInIGNhbm5vdCBiZSBzZXQgd2l0aCB2YWx1ZSAnIituZXdWYWx1ZSsiJy4gSW5jb3JyZWN0IHR5cGUuIixvYmplY3QuZ2V0Q2xhc3MoKSk7CQotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiUHJvcGVydHkgJyIrdGhpcy5nZXRQcm9wZXJ0eU5hbWUoKSsiJyBmb3Igb2JqZWN0ICciK29iamVjdC5nZXRDbGFzcygpKyInIGlzIHJlYWQtb25seSEiLG9iamVjdC5nZXRDbGFzcygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9Hcm9vdnlEeW5hbWljTWV0aG9kc0ludGVyY2VwdG9yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvR3Jvb3Z5RHluYW1pY01ldGhvZHNJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNiYmJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9Hcm9vdnlEeW5hbWljTWV0aG9kc0ludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5sYW5nLlByb3h5TWV0YUNsYXNzOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIGNsYXNzIGZvciBkeW5hbWljIG1ldGhvZHMgYXBwbGllZCB0byBhIEdyb292eSBvYmplY3QgdGhhdCByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIEdyb292eU9iamVjdCBpbnN0YW5jZXMKLSAqIG1ldGEgY2xhc3MgaW5zdGFuY2UKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDctTm92LTIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyb292eUR5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IgZXh0ZW5kcwotCQlBYnN0cmFjdER5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IgewotCi0JcHJpdmF0ZSBQcm94eU1ldGFDbGFzcyBwbWM7Ci0JCi0JcHVibGljIEdyb292eUR5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IoR3Jvb3Z5T2JqZWN0IGdvKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMucG1jID0gUHJvcGVydHlBY2Nlc3NQcm94eU1ldGFDbGFzcy5nZXRJbnN0YW5jZShnby5nZXRDbGFzcygpKTsKLQkJcG1jLnNldEludGVyY2VwdG9yKCB0aGlzICk7Ci0JCWdvLnNldE1ldGFDbGFzcyhwbWMpOwkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvSW52b2NhdGlvbkNhbGxiYWNrLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvSW52b2NhdGlvbkNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2M3NTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL0ludm9jYXRpb25DYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3M7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDgsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEludm9jYXRpb25DYWxsYmFjayB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBJbnZvY2F0aW9uQ2FsbGJhY2soKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFya0ludm9rZWQoKSB7Ci0JCXRoaXMuaW52b2tlZCA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW52b2tlZCgpIHsKLQkJcmV0dXJuIHRoaXMuaW52b2tlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL1Byb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MmVlMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkludGVyY2VwdG9yOwotCi0vKioKLSAqIDxwPkFuIGludGVyZmFjZSB0aGF0IGFkZHMgdGhlIGFiaWxpdHkgdG8gaW50ZXJjZXB0Ci0gKiBwcm9wZXJ0eSBnZXR0ZXJzL3NldHRlcnMKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI0LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvciBleHRlbmRzIEludGVyY2VwdG9yICB7Ci0JCi0JLyoqCi0JICogSW50ZXJjZXB0cyBhIGdldFhYWCBjYWxsIGFuZCByZXR1cm5zIGEgcmVzdWx0LiBUaGUgcmVzdWx0IGlzIHJlcGxhY2VkIGJ5IHRoZSAKLQkgKiByZWFsIHZhbHVlIGlmIGRvR2V0KCkgcmV0dXJuIGZhbHNlCi0JICogCi0JICogQHBhcmFtIG9iamVjdCBUaGUgdGFyZ2V0IG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgYmVmb3JlR2V0KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci0JCi0JcHVibGljIHZvaWQgYmVmb3JlU2V0KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBkb1NldCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVhbCBwcm9wZXJ0eSBnZXR0ZXIgc2hvdWxkIGJlIGNhbGxlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvR2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9Qcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvUHJvcGVydHlBY2Nlc3NQcm94eU1ldGFDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IyMDdhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9Qcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5NZXRhQ2xhc3M7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnk7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuUHJveHlNZXRhQ2xhc3M7Ci0vKioKLSAqIDxwPkV4dGVuZHMgUHJveHlNZXRhQ2xhc3MgYW5kIGFkZHMgdGhlIGFiaWxpdHkgdG8gaW50ZXJjZXB0IGNhbGxzIHRvIHByb3BlcnR5IGdldHRlcnMvc2V0dGVycwotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjQsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5QWNjZXNzUHJveHlNZXRhQ2xhc3MgZXh0ZW5kcyBQcm94eU1ldGFDbGFzcyB7Ci0KLSAgICAvKioKLSAgICAgKiBjb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZCBmb3IgdGhlIG1vc3QgdXN1YWwgY2FzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3h5TWV0YUNsYXNzIGdldEluc3RhbmNlKENsYXNzIHRoZUNsYXNzKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFDbGFzc1JlZ2lzdHJ5IG1ldGFSZWdpc3RyeSA9IEludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRhUmVnaXN0cnkoKTsKLSAgICAgICAgTWV0YUNsYXNzIG1ldGEgPSBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKHRoZUNsYXNzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzKG1ldGFSZWdpc3RyeSwgdGhlQ2xhc3MsIG1ldGEpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgUHJvcGVydHlBY2Nlc3NQcm94eU1ldGFDbGFzcyhNZXRhQ2xhc3NSZWdpc3RyeSByZWdpc3RyeSwgQ2xhc3MgdGhlQ2xhc3MsIE1ldGFDbGFzcyBhZGFwdGVlKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCB0aGVDbGFzcywgYWRhcHRlZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gaW50ZXJjZXB0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBpZihpbnRlcmNlcHRvciBpbnN0YW5jZW9mIFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IpIHsKLSAgICAgICAgCVByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IgcGFlID0gKFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IpaW50ZXJjZXB0b3I7Ci0JICAgICAgICBPYmplY3QgcmVzdWx0ID0gcGFlLmJlZm9yZUdldChvYmplY3QscHJvcGVydHkpOwotCSAgICAgICAgaWYgKHBhZS5kb0dldCgpKSB7Ci0JICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTsgCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gaW50ZXJjZXB0b3IpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGludGVyY2VwdG9yIGluc3RhbmNlb2YgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcikgewotICAgICAgICAJUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvciBwYWUgPSAoUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcilpbnRlcmNlcHRvcjsKLQkgICAgICAgIHBhZS5iZWZvcmVTZXQob2JqZWN0LHByb3BlcnR5LG5ld1ZhbHVlKTsKLQkgICAgICAgIGlmIChwYWUuZG9TZXQoKSkgewotCSAgICAgICAgCXN1cGVyLnNldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksbmV3VmFsdWUpOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvU3RhdGljTWV0aG9kSW52b2NhdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL1N0YXRpY01ldGhvZEludm9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkOTVhZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9tZXRhY2xhc3MvU3RhdGljTWV0aG9kSW52b2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3M7Ci0KLS8qKgotICogPHA+U3RhdGljIG1ldGhvZCBpbnZvY2F0aW9uIGNhbGxiYWNrIGludGVyZmFjZS4gSW1wbGVtZW50YXRpb24gY2xhc3NlcwotICogY2FuIGFkZCBzdGF0aWMgcGVyc2lzdGVudCBmdW5jdGlvbmFsaXR5IHRvIEdyYWlscyBsaWtlIGZpbmRlciBtZXRob2RzLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA3LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGljTWV0aG9kSW52b2NhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD5DaGVja3MgaWYgYSBtZXRob2QgbmFtZSBtYXRjaGVzIHRoZSBjcml0ZXJpYSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIHN0YXRpYyBtZXRob2QgbmFtZQotCSAqIEByZXR1cm4gcmVzdWx0IG9mIGNyaXRlcmlhIG1hdGNoIHRlc3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZE1hdGNoKFN0cmluZyBtZXRob2ROYW1lKTsKLQkKLQkvKioKLQkgKiA8cD5JbnZva2VzIHRoZSBhY3R1YWwgbWV0aG9kLiBUaGUgY2xhc3MsIG1ldGhvZCBuYW1lIGFuZCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLgotCSAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRoZSBhcmd1bWVudCBhcnJheSBpcyBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIHRoZSBzdGF0aWMgbWV0aG9kIGlzIGNhbGxlZCBvbgotCSAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBzdGF0aWMgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQKLQkgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0YXRpYyBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlKENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL21ldGFjbGFzcy9XZWFrR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL1dlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTQ1YWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvbWV0YWNsYXNzL1dlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5tYXAuUmVmZXJlbmNlTWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBnZW5lcmljIGR5YW5taWMgcHJvcGVydHkgZm9yIGFueSB0eXBlIHVzZWQgYSBzb2Z0IGhhc2htYXAgaW1wbGVtZW50YXRpb24gZm9yIGdlbmVyaWMgcHJvcGVydGllcwotICogcmVnaXN0ZXJlZCBhcyBnbG9iYWwgaW4gdGhlIE1ldGFDbGFzcwotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjcsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFdlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5IGV4dGVuZHMgQWJzdHJhY3REeW5hbWljUHJvcGVydHkgewotCi0gICAgcHJpdmF0ZSBDbGFzcyB0eXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiByZWFkeU9ubHk7Ci0gICAgcHJpdmF0ZSBNYXAgcHJvcGVydHlUb0luc3RhbmNlTWFwID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBSZWZlcmVuY2VNYXAoUmVmZXJlbmNlTWFwLlNPRlQsUmVmZXJlbmNlTWFwLlNPRlQsdHJ1ZSkpOwotICAgIHByaXZhdGUgT2JqZWN0IGluaXRpYWxWYWx1ZTsKLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcmVhZE9ubHkgVHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIFdlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIENsYXNzIHR5cGUsT2JqZWN0IGluaXRpYWxWYWx1ZSxib29sZWFuIHJlYWRPbmx5KSB7Ci0gICAgICAgIHN1cGVyKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGFyZ3VtZW50ICd0eXBlJyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB0aGlzLnJlYWR5T25seSA9IHJlYWRPbmx5OwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOzsKLSAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcmVhZE9ubHkgVHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIFdlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIENsYXNzIHR5cGUsYm9vbGVhbiByZWFkT25seSkgewotICAgICAgICBzdXBlcihwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZih0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBhcmd1bWVudCAndHlwZScgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgdGhpcy5yZWFkeU9ubHkgPSByZWFkT25seTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTs7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iamVjdCkgKyBnZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgaWYocHJvcGVydHlUb0luc3RhbmNlTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5S2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VG9JbnN0YW5jZU1hcC5nZXQocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodGhpcy5pbml0aWFsVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHlUb0luc3RhbmNlTWFwLnB1dChwcm9wZXJ0eUtleSwgdGhpcy5pbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3Qgb2JqZWN0LCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgaWYoIXJlYWR5T25seSkgewotICAgICAgICAgICAgaWYodGhpcy50eXBlLmlzSW5zdGFuY2UobmV3VmFsdWUpKQotICAgICAgICAgICAgICAgIHByb3BlcnR5VG9JbnN0YW5jZU1hcC5wdXQoU3RyaW5nLnZhbHVlT2YoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqZWN0KSkgKyBnZXRQcm9wZXJ0eU5hbWUoKSwgbmV3VmFsdWUgKTsKLSAgICAgICAgICAgIGVsc2UgaWYobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIit0aGlzLmdldFByb3BlcnR5TmFtZSgpKyInIGZvciBvYmplY3QgJyIrb2JqZWN0LmdldENsYXNzKCkrIicgY2Fubm90IGJlIHNldCB3aXRoIHZhbHVlICciK25ld1ZhbHVlKyInLiBJbmNvcnJlY3QgdHlwZS4iLG9iamVjdC5nZXRDbGFzcygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oIlByb3BlcnR5ICciK3RoaXMuZ2V0UHJvcGVydHlOYW1lKCkrIicgZm9yIG9iamVjdCAnIitvYmplY3QuZ2V0Q2xhc3MoKSsiJyBpcyByZWFkLW9ubHkhIixvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9zcHJpbmcvR3JhaWxzUmVzb3VyY2VIb2xkZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL3NwcmluZy9HcmFpbHNSZXNvdXJjZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjcyYjcwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL3NwcmluZy9HcmFpbHNSZXNvdXJjZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuc3ByaW5nOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmlvLlJlc291cmNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuR3JhaWxzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCBob2xkcyByZWZlcmVuY2VzIHRvIGFsbCB0aGUgR3JhaWxzIHJlc291cmNlIGluc3RhbmNlcyB0byBzdXBwb3J0IGNsYXNzIHJlbG9hZGluZwotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMxLUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNSZXNvdXJjZUhvbGRlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhdHRlcm4gR1JBSUxTX1JFU09VUkNFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIi4rXFxcXGdyYWlscy1hcHBcXFxcXFx3K1xcXFwoLispXFwuZ3Jvb3Z5Iik7Ci0gICAgc3RhdGljewotICAgICAgICAgICAgaWYoRmlsZS5zZXBhcmF0b3IuZXF1YWxzKCIvIikpewotICAgICAgICAgICAgICAgIEdSQUlMU19SRVNPVVJDRV9QQVRURVJOID0KLSAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIuKy9ncmFpbHMtYXBwL1xcdysvKC4rKVxcLmdyb292eSIpOwotICAgICAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVYVF9JRCA9ICJncmFpbHNSZXNvdXJjZUhvbGRlciI7Ci0KLSAgICBwcml2YXRlIFJlc291cmNlW10gcmVzb3VyY2VzOwotCi0gICAgcHVibGljIFJlc291cmNlW10gZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhSZXNvdXJjZVtdIHJlc291cmNlcykgewotICAgICAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHJpZXZlcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgTWF0Y2hlciBtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbSA9IEdSQUlMU19SRVNPVVJDRV9QQVRURVJOLm1hdGNoZXIocmVzb3VyY2UuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkkvTyBlcnJvciByZWFkaW5nIGNsYXNzIG5hbWUgZnJvbSByZXNvdXJjZSBbIityZXNvdXJjZSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLGUgKTsKLSAgICAgICAgfQotICAgICAgICBpZihtLmZpbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvc3ByaW5nL1NwcmluZ0NvbmZpZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvc3ByaW5nL1NwcmluZ0NvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdhNjEwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL3NwcmluZy9TcHJpbmdDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLnNwcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Xb3JkVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy4qOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuQ29uZmlndXJhYmxlTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW47Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5zdXBwb3J0LkhpYmVybmF0ZURpYWxlY3REZXRlY3RvckZhY3RvcnlCZWFuOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUudmFsaWRhdGlvbi5HcmFpbHNEb21haW5DbGFzc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy4qOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnN1cHBvcnQuQ2xhc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLmVycm9ycy5HcmFpbHNFeGNlcHRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZWZsb3cuR3JhaWxzRmxvd0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmV4ZWN1dGlvbi5zZXJ2bGV0LkdyYWlsc1NlcnZsZXRGbG93RXhlY3V0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzVXJsSGFuZGxlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLlNpbXBsZUdyYWlsc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQudmlldy5HcmFpbHNWaWV3UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5kaWFsZWN0LkhTUUxEaWFsZWN0OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuZGlhbGVjdC5NeVNRTERpYWxlY3Q7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5DdXN0b21FZGl0b3JDb25maWd1cmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuTWV0aG9kSW52b2tpbmdGYWN0b3J5QmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5SZWxvYWRhYmxlUmVzb3VyY2VCdW5kbGVNZXNzYWdlU291cmNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuamRiYy5kYXRhc291cmNlLkRyaXZlck1hbmFnZXJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlVHJhbnNhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudHJhbnNhY3Rpb24uaW50ZXJjZXB0b3IuVHJhbnNhY3Rpb25Qcm94eUZhY3RvcnlCZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5pMThuLkNvb2tpZUxvY2FsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuaTE4bi5Mb2NhbGVDaGFuZ2VJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tdWx0aXBhcnQuY29tbW9ucy5Db21tb25zTXVsdGlwYXJ0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LmNvbmZpZy5GbG93RmFjdG9yeUJlYW47Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93Lm12Yy5GbG93Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC50YXJnZXQuSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYW9wLmZyYW1ld29yay5Qcm94eUZhY3RvcnlCZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmJlYW5zLmZhY3RvcnkuY29uZmlnLk1hcFRvUHJvcGVydGllc0ZhY3RvcnlCZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmJlYW5zLmZhY3RvcnkuZHJpdmVycy5CZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmRiLmhzcWxkYi5TZXJ2ZXJCZWFuOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD5DcmVhdGVzIGJlYW5zIGFuZCBiZWFuIHJlZmVyZW5jZXMgZm9yIGEgR3JhaWxzIGFwcGxpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBTcHJpbmdDb25maWcgewotCi0JcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwcmluZ0NvbmZpZy5jbGFzcyk7Ci0KLQlwdWJsaWMgU3ByaW5nQ29uZmlnKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCZWFuUmVmZXJlbmNlcygpIHsKLQkJQ29sbGVjdGlvbiBiZWFuUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIHVybE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCUFzc2VydC5ub3ROdWxsKGFwcGxpY2F0aW9uKTsKLQotCQkvLyBjb25maWd1cmUgZ2VuZXJhbCByZWZlcmVuY2VzCi0JCUJlYW4gY2xhc3NMb2FkZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKE1ldGhvZEludm9raW5nRmFjdG9yeUJlYW4uY2xhc3MpOwotCQljbGFzc0xvYWRlci5zZXRQcm9wZXJ0eSgidGFyZ2V0T2JqZWN0IiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZ3JhaWxzQXBwbGljYXRpb24iKSk7Ci0JCWNsYXNzTG9hZGVyLnNldFByb3BlcnR5KCJ0YXJnZXRNZXRob2QiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoImdldENsYXNzTG9hZGVyIikpOwotCQkKLQkJQmVhbiBjbGFzc0VkaXRvciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oQ2xhc3NFZGl0b3IuY2xhc3MpOwotCQljbGFzc0VkaXRvci5zZXRQcm9wZXJ0eSgiY2xhc3NMb2FkZXIiLCBjbGFzc0xvYWRlcik7Ci0JCQotCQlCZWFuIHByb3BlcnR5RWRpdG9ycyA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oQ3VzdG9tRWRpdG9yQ29uZmlndXJlci5jbGFzcyk7Ci0JCU1hcCBjdXN0b21FZGl0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJY3VzdG9tRWRpdG9ycy5wdXQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJqYXZhLmxhbmcuQ2xhc3MiKSwgY2xhc3NFZGl0b3IpOwotCQlwcm9wZXJ0eUVkaXRvcnMuc2V0UHJvcGVydHkoImN1c3RvbUVkaXRvcnMiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVNYXAoY3VzdG9tRWRpdG9ycykpOwotCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiY3VzdG9tRWRpdG9ycyIsIHByb3BlcnR5RWRpdG9ycykpOwotCQkJCi0JCS8vIGNvbmZpZ3VyZSBleGNlcHRpb24gaGFuZGxlcgotCQlCZWFuIGV4Y2VwdGlvbkhhbmRsZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKEdyYWlsc0V4Y2VwdGlvblJlc29sdmVyLmNsYXNzKTsKLQkJZXhjZXB0aW9uSGFuZGxlci5zZXRQcm9wZXJ0eSgiZXhjZXB0aW9uTWFwcGluZ3MiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoImphdmEubGFuZy5FeGNlcHRpb249ZXJyb3IiKSk7Ci0JCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJleGNlcHRpb25IYW5kbGVyIiwgZXhjZXB0aW9uSGFuZGxlcikpOwotCi0gICAgICAgIC8vIGNvbmZpZ3VyZSBtdWx0aXBhcnQgc3VwcG9ydAotICAgICAgICBCZWFuIG11bHRpcGFydFJlc29sdmVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihDb21tb25zTXVsdGlwYXJ0UmVzb2x2ZXIuY2xhc3MpOwotICAgICAgICBiZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgibXVsdGlwYXJ0UmVzb2x2ZXIiLCBtdWx0aXBhcnRSZXNvbHZlcikpOwotCi0gICAgICAgIC8vIGNvbmZpZ3VyZSBkYXRhIHNvdXJjZSAmIGhpYmVybmF0ZQotCQlMT0cuaW5mbygiW1NwcmluZ0NvbmZpZ10gQ29uZmlndXJpbmcgaTE4biBzdXBwb3J0Iik7Ci0JCXBvcHVsYXRlSTE4blN1cHBvcnQoYmVhblJlZmVyZW5jZXMpOwkJCi0JCQotCQkvLyBjb25maWd1cmUgZGF0YSBzb3VyY2UgJiBoaWJlcm5hdGUKLQkJTE9HLmluZm8oIltTcHJpbmdDb25maWddIENvbmZpZ3VyaW5nIEdyYWlscyBkYXRhIHNvdXJjZSIpOwotCQlwb3B1bGF0ZURhdGFTb3VyY2VSZWZlcmVuY2VzKGJlYW5SZWZlcmVuY2VzKTsKLQkJCi0JCS8vIGNvbmZpZ3VyZSBkb21haW4gY2xhc3NlcwotCQlMT0cuaW5mbygiW1NwcmluZ0NvbmZpZ10gQ29uZmlndXJpbmcgR3JhaWxzIGRvbWFpbiIpOwotCQlwb3B1bGF0ZURvbWFpbkNsYXNzUmVmZXJlbmNlcyhiZWFuUmVmZXJlbmNlcywgY2xhc3NMb2FkZXIpOwotCQkJCQotCQkvLyBjb25maWd1cmUgc2VydmljZXMKLQkJTE9HLmluZm8oIltTcHJpbmdDb25maWddIENvbmZpZ3VyaW5nIEdyYWlscyBzZXJ2aWNlcyIpOwotCQlwb3B1bGF0ZVNlcnZpY2VDbGFzc1JlZmVyZW5jZXMoYmVhblJlZmVyZW5jZXMpOwotCQkKLQkJLy8gY29uZmlndXJlIGdyYWlscyBwYWdlIGZsb3dzCi0JCUxPRy5pbmZvKCJbU3ByaW5nQ29uZmlnXSBDb25maWd1cmluZyBHcmFpbHMgcGFnZSBmbG93cyIpOwotCQlwb3B1bGF0ZVBhZ2VGbG93UmVmZXJlbmNlcyhiZWFuUmVmZXJlbmNlcywgdXJsTWFwcGluZ3MpOwotCQotCQkvLyBjb25maWd1cmUgZ3JhaWxzIGNvbnRyb2xsZXJzCi0JCUxPRy5pbmZvKCJbU3ByaW5nQ29uZmlnXSBDb25maWd1cmluZyBHcmFpbHMgY29udHJvbGxlcnMiKTsKLQkJcG9wdWxhdGVDb250cm9sbGVyUmVmZXJlbmNlcyhiZWFuUmVmZXJlbmNlcywgdXJsTWFwcGluZ3MpOwotCQkKLQkJLy8gY29uZmlndXJlIHNjYWZmb2xkaW5nCi0JCUxPRy5pbmZvKCJbU3ByaW5nQ29uZmlnXSBDb25maWd1cmluZyBHcmFpbHMgc2NhZmZvbGRpbmciKTsKLQkJcG9wdWxhdGVTY2FmZm9sZGluZ1JlZmVyZW5jZXMoYmVhblJlZmVyZW5jZXMpOwotCQkKLQkJCQkKLQkJcmV0dXJuIGJlYW5SZWZlcmVuY2VzOwotCX0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVJMThuU3VwcG9ydChDb2xsZWN0aW9uIGJlYW5SZWZlcmVuY2VzKSB7Ci0JCS8vIHNldHVwIG1lc3NhZ2Ugc291cmNlCi0JCUJlYW4gbWVzc2FnZVNvdXJjZSA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oIFJlbG9hZGFibGVSZXNvdXJjZUJ1bmRsZU1lc3NhZ2VTb3VyY2UuY2xhc3MgKTsKLQkJbWVzc2FnZVNvdXJjZS5zZXRQcm9wZXJ0eSggImJhc2VuYW1lIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJjbGFzc3BhdGg6bWVzc2FnZXMiKSk7CQkJCQotCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgibWVzc2FnZVNvdXJjZSIsIG1lc3NhZ2VTb3VyY2UpKTsKLQkJCi0JCS8vIHNldHVwIGxvY2FsZSBjaGFuZ2UgaW50ZXJjZXB0b3IKLQkJQmVhbiBsb2NhbGVDaGFuZ2VJbnRlcmNlcHRvciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oTG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3IuY2xhc3MpOwotCQlsb2NhbGVDaGFuZ2VJbnRlcmNlcHRvci5zZXRQcm9wZXJ0eSgicGFyYW1OYW1lIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJsYW5nIikpOwotCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgibG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3IiLCBsb2NhbGVDaGFuZ2VJbnRlcmNlcHRvcikpOwotCQkKLQkJLy8gc2V0dXAgbG9jYWxlIHJlc29sdmVyCi0JCUJlYW4gbG9jYWxlUmVzb2x2ZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKENvb2tpZUxvY2FsZVJlc29sdmVyLmNsYXNzKTsKLQkJYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImxvY2FsZVJlc29sdmVyIiwgbG9jYWxlUmVzb2x2ZXIpKTsKLQl9Ci0JLy8gY29uZmlndXJlcyBzY2FmZm9sZGluZwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNjYWZmb2xkaW5nUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGJlYW5SZWZlcmVuY2VzKSB7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBjb250cm9sbGVycwotCQlHcmFpbHNDb250cm9sbGVyQ2xhc3NbXSBzaW1wbGVDb250cm9sbGVycyA9IGFwcGxpY2F0aW9uLmdldENvbnRyb2xsZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2ltcGxlQ29udHJvbGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIHJldHJpZXZlIGFwcHJvcHJpYXRlIGRvbWFpbiBjbGFzcwotICAgICAgICAgICAgQ2xhc3Mgc2NhZmZvbGRlZENsYXNzID0gc2ltcGxlQ29udHJvbGxlcnNbaV0uZ2V0U2NhZmZvbGRlZENsYXNzKCk7Ci0gICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzczsKLSAgICAgICAgICAgIGlmKHNjYWZmb2xkZWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZG9tYWluQ2xhc3MgPSBhcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcyhzaW1wbGVDb250cm9sbGVyc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhZmZvbGRlZENsYXNzID0gZG9tYWluQ2xhc3MuZ2V0Q2xhenooKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHNjYWZmb2xkZWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmluZm8oIltTcHJpbmddIFNjYWZmb2xkaW5nIGRpc2FibGVkIGZvciBjb250cm9sbGVyIFsiK3NpbXBsZUNvbnRyb2xsZXJzW2ldLmdldEZ1bGxOYW1lKCkrIl0sIG5vIGVxdWl2YWxlbnQgZG9tYWluIGNsYXNzIG5hbWVkIFsiK3NpbXBsZUNvbnRyb2xsZXJzW2ldLmdldE5hbWUoKSsiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQmVhbiBzY2FmZm9sZGVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihEZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgc2NhZmZvbGQgZG9tYWluCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKHNjYWZmb2xkZWRDbGFzcy5nZXROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJzZXNzaW9uRmFjdG9yeSIpKTsKLQotICAgICAgICAgICAgICAgIEJlYW4gZG9tYWluID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihHcmFpbHNTY2FmZm9sZERvbWFpbi5jbGFzcywgY29uc3RydWN0b3JBcmd1bWVudHMpOwotLy8gICAgICAgICAgICAgICAgZG9tYWluLnNldFByb3BlcnR5KCJ2YWxpZGF0b3IiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCBkb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpICsgIlZhbGlkYXRvciIpKTsKLQotICAgICAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZCggU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSggc2NhZmZvbGRlZENsYXNzLmdldE5hbWUoKSArICJTY2FmZm9sZERvbWFpbiIsZG9tYWluICkgKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgY29uZmlndXJlIHJlcXVlc3QgaGFuZGxlcgotICAgICAgICAgICAgICAgIEJlYW4gcmVxdWVzdEhhbmRsZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKERlZmF1bHRTY2FmZm9sZFJlcXVlc3RIYW5kbGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlci5zZXRQcm9wZXJ0eSgic2NhZmZvbGREb21haW4iLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHNjYWZmb2xkZWRDbGFzcy5nZXROYW1lKCkgKyAiU2NhZmZvbGREb21haW4iKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgcmVzcG9uc2UgZmFjdG9yeQotICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJncmFpbHNBcHBsaWNhdGlvbiIpKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IHJlc3BvbnNlIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBCZWFuIGRlZmF1bHRSZXNwb25zZUhhbmRsZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKFZpZXdEZWxlZ2F0aW5nU2NhZmZvbGRSZXNwb25zZUhhbmRsZXIuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgLy8gY29uZmlndXJlIGEgc2ltcGxlIHZpZXcgZGVsZWdhdGluZyByZXNvbHZlcgotICAgICAgICAgICAgICAgIEJlYW4gZGVmYXVsdFZpZXdSZXNvbHZlciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oRGVmYXVsdEdyYWlsc1NjYWZmb2xkVmlld1Jlc29sdmVyLmNsYXNzLGNvbnN0cnVjdG9yQXJndW1lbnRzKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0UmVzcG9uc2VIYW5kbGVyLnNldFByb3BlcnR5KCJzY2FmZm9sZFZpZXdSZXNvbHZlciIsIGRlZmF1bHRWaWV3UmVzb2x2ZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyByZXNwb25zZSBoYW5kbGVyIGZhY3RvcnkKLSAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZ3JhaWxzQXBwbGljYXRpb24iKSk7Ci0gICAgICAgICAgICAgICAgY29uc3RydWN0b3JBcmd1bWVudHMuYWRkKGRlZmF1bHRSZXNwb25zZUhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgQmVhbiByZXNwb25zZUhhbmRsZXJGYWN0b3J5ID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbiggRGVmYXVsdEdyYWlsc1Jlc3BvbnNlSGFuZGxlckZhY3RvcnkuY2xhc3MsY29uc3RydWN0b3JBcmd1bWVudHMgKTsKLQotICAgICAgICAgICAgICAgIHNjYWZmb2xkZXIuc2V0UHJvcGVydHkoICJzY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3RvcnkiLCByZXNwb25zZUhhbmRsZXJGYWN0b3J5ICk7Ci0gICAgICAgICAgICAgICAgc2NhZmZvbGRlci5zZXRQcm9wZXJ0eSgic2NhZmZvbGRSZXF1ZXN0SGFuZGxlciIsIHJlcXVlc3RIYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZCggU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSggc2ltcGxlQ29udHJvbGxlcnNbaV0uZ2V0RnVsbE5hbWUoKSArICJTY2FmZm9sZGVyIixzY2FmZm9sZGVyICApICk7Ci0gICAgICAgICAgICB9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb250cm9sbGVyUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGJlYW5SZWZlcmVuY2VzLCBNYXAgdXJsTWFwcGluZ3MpIHsKLQkJQmVhbiBzaW1wbGVHcmFpbHNDb250cm9sbGVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihTaW1wbGVHcmFpbHNDb250cm9sbGVyLmNsYXNzKTsKLQkJc2ltcGxlR3JhaWxzQ29udHJvbGxlci5zZXRBdXRvd2lyZSgiYnlUeXBlIik7Ci0JCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKFNpbXBsZUdyYWlsc0NvbnRyb2xsZXIuQVBQTElDQVRJT05fQ09OVEVYVF9JRCwgc2ltcGxlR3JhaWxzQ29udHJvbGxlcikpOwotCQkKLQkJQmVhbiBncmFpbHNWaWV3UmVzb2x2ZXIgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKEdyYWlsc1ZpZXdSZXNvbHZlci5jbGFzcyk7Ci0JCQotCQlncmFpbHNWaWV3UmVzb2x2ZXIuc2V0UHJvcGVydHkoInZpZXdDbGFzcyIsU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnZpZXcuSnN0bFZpZXciKSk7Ci0JCWdyYWlsc1ZpZXdSZXNvbHZlci5zZXRQcm9wZXJ0eSgicHJlZml4IiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCIvV0VCLUlORi9ncmFpbHMtYXBwL3ZpZXdzLyIpKTsKLQkJZ3JhaWxzVmlld1Jlc29sdmVyLnNldFByb3BlcnR5KCJzdWZmaXgiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoIi5qc3AiKSk7Ci0JCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJqc3BWaWV3UmVzb2x2ZXIiLCBncmFpbHNWaWV3UmVzb2x2ZXIpKTsKLQkJCi0JCUJlYW4gc2ltcGxlVXJsSGFuZGxlck1hcHBpbmcgPSBudWxsOwotCQlpZiAoYXBwbGljYXRpb24uZ2V0Q29udHJvbGxlcnMoKS5sZW5ndGggPiAwIHx8IGFwcGxpY2F0aW9uLmdldFBhZ2VGbG93cygpLmxlbmd0aCA+IDApIHsKLQkJCXNpbXBsZVVybEhhbmRsZXJNYXBwaW5nID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihHcmFpbHNVcmxIYW5kbGVyTWFwcGluZy5jbGFzcyk7Ci0JCQkvL2JlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKEdyYWlsc1VybEhhbmRsZXJNYXBwaW5nLkFQUExJQ0FUSU9OX0NPTlRFWFRfSUQgKyAiVGFyZ2V0Iiwgc2ltcGxlVXJsSGFuZGxlck1hcHBpbmcpKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbiBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXJncy5hZGQoc2ltcGxlVXJsSGFuZGxlck1hcHBpbmcpOwotICAgICAgICAgICAgQmVhbiBzaW1wbGVVcmxIYW5kbGVyTWFwcGluZ1RhcmdldFNvdXJjZSA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlLmNsYXNzLCBhcmdzKTsKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKEdyYWlsc1VybEhhbmRsZXJNYXBwaW5nLkFQUExJQ0FUSU9OX0NPTlRFWFRfVEFSR0VUX1NPVVJDRSxzaW1wbGVVcmxIYW5kbGVyTWFwcGluZ1RhcmdldFNvdXJjZSkpOwotCi0gICAgICAgICAgICBCZWFuIHNpbXBsZVVybEhhbmRsZXJNYXBwaW5nUHJveHkgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKFByb3h5RmFjdG9yeUJlYW4uY2xhc3MpOwotICAgICAgICAgICAgc2ltcGxlVXJsSGFuZGxlck1hcHBpbmdQcm94eS5zZXRQcm9wZXJ0eSgidGFyZ2V0U291cmNlIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShHcmFpbHNVcmxIYW5kbGVyTWFwcGluZy5BUFBMSUNBVElPTl9DT05URVhUX1RBUkdFVF9TT1VSQ0UpKTsKLSAgICAgICAgICAgIHNpbXBsZVVybEhhbmRsZXJNYXBwaW5nUHJveHkuc2V0UHJvcGVydHkoInByb3h5SW50ZXJmYWNlcyIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgib3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5IYW5kbGVyTWFwcGluZyIpKTsKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKEdyYWlsc1VybEhhbmRsZXJNYXBwaW5nLkFQUExJQ0FUSU9OX0NPTlRFWFRfSUQsIHNpbXBsZVVybEhhbmRsZXJNYXBwaW5nUHJveHkpKTsKLSAgICAgICAgfQotCQkKLQkJR3JhaWxzQ29udHJvbGxlckNsYXNzW10gc2ltcGxlQ29udHJvbGxlcnMgPSBhcHBsaWNhdGlvbi5nZXRDb250cm9sbGVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpbXBsZUNvbnRyb2xsZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmFpbHNDb250cm9sbGVyQ2xhc3Mgc2ltcGxlQ29udHJvbGxlciA9IHNpbXBsZUNvbnRyb2xsZXJzW2ldOwotCQkJaWYgKCFzaW1wbGVDb250cm9sbGVyLmdldEF2YWlsYWJsZSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0gICAgICAgICAgICAvLyBzZXR1cCBjb250cm9sbGVyIGNsYXNzIGJ5IHJldHJpZXZpbmcgaXQgZnJvbSB0aGUgIGdyYWlscyBhcHBsaWNhdGlvbgotICAgICAgICAgICAgQmVhbiBjb250cm9sbGVyQ2xhc3MgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKE1ldGhvZEludm9raW5nRmFjdG9yeUJlYW4uY2xhc3MpOwotCQkJY29udHJvbGxlckNsYXNzLnNldFByb3BlcnR5KCJ0YXJnZXRPYmplY3QiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJncmFpbHNBcHBsaWNhdGlvbiIpKTsKLQkJCWNvbnRyb2xsZXJDbGFzcy5zZXRQcm9wZXJ0eSgidGFyZ2V0TWV0aG9kIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJnZXRDb250cm9sbGVyIikpOwotCQkJY29udHJvbGxlckNsYXNzLnNldFByb3BlcnR5KCJhcmd1bWVudHMiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoc2ltcGxlQ29udHJvbGxlci5nZXRGdWxsTmFtZSgpKSk7Ci0JCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShzaW1wbGVDb250cm9sbGVyLmdldEZ1bGxOYW1lKCkgKyAiQ2xhc3MiLCBjb250cm9sbGVyQ2xhc3MpKTsKLQotICAgICAgICAgICAgLy8gY29uZmlndXJlIGNvbnRyb2xsZXIgY2xhc3MgYXMgaG90IHN3YXBwYWJsZSB0YXJnZXQgc291cmNlCi0gICAgICAgICAgICBDb2xsZWN0aW9uIGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhcmdzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHNpbXBsZUNvbnRyb2xsZXIuZ2V0RnVsbE5hbWUoKSArICJDbGFzcyIpKTsKLSAgICAgICAgICAgIEJlYW4gY29udHJvbGxlclRhcmdldFNvdXJjZSA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlLmNsYXNzLCBhcmdzKTsKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHNpbXBsZUNvbnRyb2xsZXIuZ2V0RnVsbE5hbWUoKSArICJUYXJnZXRTb3VyY2UiLCBjb250cm9sbGVyVGFyZ2V0U291cmNlKSk7Ci0KLSAgICAgICAgICAgIC8vIHNldHVwIEFPUCBwcm94eSB0aGF0IHVzZXMgaG90IHN3YXBwYWJsZSB0YXJnZXQgc291cmNlCi0gICAgICAgICAgICBCZWFuIGNvbnRyb2xsZXJDbGFzc1Byb3h5ID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihQcm94eUZhY3RvcnlCZWFuLmNsYXNzKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJDbGFzc1Byb3h5LnNldFByb3BlcnR5KCJ0YXJnZXRTb3VyY2UiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHNpbXBsZUNvbnRyb2xsZXIuZ2V0RnVsbE5hbWUoKSArICJUYXJnZXRTb3VyY2UiKSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ2xhc3NQcm94eS5zZXRQcm9wZXJ0eSgicHJveHlJbnRlcmZhY2VzIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NvbnRyb2xsZXJDbGFzcyIpKTsKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHNpbXBsZUNvbnRyb2xsZXIuZ2V0RnVsbE5hbWUoKSArICJQcm94eSIsIGNvbnRyb2xsZXJDbGFzc1Byb3h5KSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b3R5cGUgYmVhbiB0aGF0IHVzZXMgdGhlIGNvbnRyb2xsZXIgQU9QIHByb3h5IGNvbnRyb2xsZXIgY2xhc3MgYmVhbiBhcyBhIGZhY3RvcnkKLSAgICAgICAgICAgIEJlYW4gY29udHJvbGxlciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVByb3RvdHlwZUJlYW4oKTsKLQkJCWNvbnRyb2xsZXIuc2V0RmFjdG9yeUJlYW4oU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShzaW1wbGVDb250cm9sbGVyLmdldEZ1bGxOYW1lKCkgKyAiUHJveHkiKSk7Ci0JCQljb250cm9sbGVyLnNldEZhY3RvcnlNZXRob2QoIm5ld0luc3RhbmNlIik7Ci0JCQljb250cm9sbGVyLnNldEF1dG93aXJlKCJieU5hbWUiKTsKLQotICAgICAgICAgICAgYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2Uoc2ltcGxlQ29udHJvbGxlci5nZXRGdWxsTmFtZSgpLCBjb250cm9sbGVyKSk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpbXBsZUNvbnRyb2xsZXIuZ2V0VVJJcygpLmxlbmd0aDsgeCsrKSB7Ci0JCQkJaWYoIXVybE1hcHBpbmdzLmNvbnRhaW5zS2V5KHNpbXBsZUNvbnRyb2xsZXIuZ2V0VVJJcygpW3hdKSkKLQkJCQkJdXJsTWFwcGluZ3MucHV0KHNpbXBsZUNvbnRyb2xsZXIuZ2V0VVJJcygpW3hdLCBTaW1wbGVHcmFpbHNDb250cm9sbGVyLkFQUExJQ0FUSU9OX0NPTlRFWFRfSUQpOwotCQkJfQkJCi0JCX0JCQotCQlpZiAoc2ltcGxlVXJsSGFuZGxlck1hcHBpbmcgIT0gbnVsbCkgewotCQkJc2ltcGxlVXJsSGFuZGxlck1hcHBpbmcuc2V0UHJvcGVydHkoIm1hcHBpbmdzIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlUHJvcGVydGllcyh1cmxNYXBwaW5ncykpOwotCQl9Ci0KLSAgICAgICAgR3JhaWxzVGFnTGliQ2xhc3NbXSB0YWdMaWJzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzVGFiTGliQ2xhc3NlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0xpYnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIGdyYWlsc1RhZ0xpYiA9IHRhZ0xpYnNbaV07Ci0gICAgICAgICAgICAvLyBzZXR1cCB0YWdsaWIgY2xhc3MgYnkgcmV0cmlldmluZyBpdCBmcm9tIHRoZSBncmFpbHMgYXBwbGljYXRpb24gYmVhbgotICAgICAgICAgICAgQmVhbiB0YWdsaWJDbGFzcyA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oTWV0aG9kSW52b2tpbmdGYWN0b3J5QmVhbi5jbGFzcyk7Ci0gICAgICAgICAgICB0YWdsaWJDbGFzcy5zZXRQcm9wZXJ0eSgidGFyZ2V0T2JqZWN0IiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZ3JhaWxzQXBwbGljYXRpb24iKSk7Ci0gICAgICAgICAgICB0YWdsaWJDbGFzcy5zZXRQcm9wZXJ0eSgidGFyZ2V0TWV0aG9kIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJnZXRHcmFpbHNUYWdMaWJDbGFzcyIpKTsKLSAgICAgICAgICAgIHRhZ2xpYkNsYXNzLnNldFByb3BlcnR5KCJhcmd1bWVudHMiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoZ3JhaWxzVGFnTGliLmdldEZ1bGxOYW1lKCkpKTsKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc1RhZ0xpYi5nZXRGdWxsTmFtZSgpICsgIkNsYXNzIiwgdGFnbGliQ2xhc3MpKTsKLQotICAgICAgICAgICAgLy8gY29uZmlndXJlIHRhZ2xpYiBjbGFzcyBhcyBob3Qgc3dhcHBhYmxlIHRhcmdldCBzb3VyY2UKLSAgICAgICAgICAgIENvbGxlY3Rpb24gYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGFyZ3MuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoZ3JhaWxzVGFnTGliLmdldEZ1bGxOYW1lKCkgKyAiQ2xhc3MiKSk7Ci0gICAgICAgICAgICBCZWFuIHRhZ2xpYlRhcmdldFNvdXJjZSA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlLmNsYXNzLCBhcmdzKTsKLQotICAgICAgICAgICAgLy8gc2V0dXAgQU9QIHByb3h5IHRoYXQgdXNlcyBob3Qgc3dhcHBhYmxlIHRhcmdldCBzb3VyY2UKLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc1RhZ0xpYi5nZXRGdWxsTmFtZSgpICsgIlRhcmdldFNvdXJjZSIsIHRhZ2xpYlRhcmdldFNvdXJjZSkpOwotICAgICAgICAgICAgQmVhbiB0YWdsaWJDbGFzc1Byb3h5ID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihQcm94eUZhY3RvcnlCZWFuLmNsYXNzKTsKLSAgICAgICAgICAgIHRhZ2xpYkNsYXNzUHJveHkuc2V0UHJvcGVydHkoInRhcmdldFNvdXJjZSIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoZ3JhaWxzVGFnTGliLmdldEZ1bGxOYW1lKCkgKyAiVGFyZ2V0U291cmNlIikpOwotICAgICAgICAgICAgdGFnbGliQ2xhc3NQcm94eS5zZXRQcm9wZXJ0eSgicHJveHlJbnRlcmZhY2VzIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc1RhZ0xpYkNsYXNzIikpOwotICAgICAgICAgICAgYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoZ3JhaWxzVGFnTGliLmdldEZ1bGxOYW1lKCkgKyAiUHJveHkiLCB0YWdsaWJDbGFzc1Byb3h5KSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b3R5cGUgYmVhbiB0aGF0IHJlZmVycyB0byB0aGUgQU9QIHByb3hpZWQgdGFnbGliIGNsYXNzIHVzZXMgaXQgYXMgYSBmYWN0b3J5Ci0gICAgICAgICAgICBCZWFuIHRhZ2xpYiA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVByb3RvdHlwZUJlYW4oKTsKLSAgICAgICAgICAgIHRhZ2xpYi5zZXRGYWN0b3J5QmVhbihTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc1RhZ0xpYi5nZXRGdWxsTmFtZSgpICsgIlByb3h5IikpOwotICAgICAgICAgICAgdGFnbGliLnNldEZhY3RvcnlNZXRob2QoIm5ld0luc3RhbmNlIik7Ci0gICAgICAgICAgICB0YWdsaWIuc2V0QXV0b3dpcmUoImJ5TmFtZSIpOwotCi0gICAgICAgICAgICBiZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShncmFpbHNUYWdMaWIuZ2V0RnVsbE5hbWUoKSwgdGFnbGliKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEYXRhU291cmNlUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGJlYW5SZWZlcmVuY2VzKSB7Ci0JCWJvb2xlYW4gZGVwZW5kc09uSHNxbGRiU2VydmVyID0gZmFsc2U7Ci0JCUdyYWlsc0RhdGFTb3VyY2UgZ3JhaWxzRGF0YVNvdXJjZSA9IGFwcGxpY2F0aW9uLmdldEdyYWlsc0RhdGFTb3VyY2UoKTsKLSAgICAgICAgQmVhbiBsb2NhbFNlc3Npb25GYWN0b3J5QmVhbiA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oQ29uZmlndXJhYmxlTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4uY2xhc3MpOwotCi0gICAgICAgIGlmIChncmFpbHNEYXRhU291cmNlICE9IG51bGwpIHsKLQkJCQotCQkJQmVhbiBkYXRhU291cmNlOwotCQkJaWYgKGdyYWlsc0RhdGFTb3VyY2UuaXNQb29sZWQoKSkgewotCQkJCWRhdGFTb3VyY2UgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKEJhc2ljRGF0YVNvdXJjZS5jbGFzcyk7Ci0JCQkJZGF0YVNvdXJjZS5zZXREZXN0cm95TWV0aG9kKCJjbG9zZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhU291cmNlID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihEcml2ZXJNYW5hZ2VyRGF0YVNvdXJjZS5jbGFzcyk7Ci0JCQl9Ci0JCQlkYXRhU291cmNlLnNldFByb3BlcnR5KCJkcml2ZXJDbGFzc05hbWUiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoZ3JhaWxzRGF0YVNvdXJjZS5nZXREcml2ZXJDbGFzc05hbWUoKSkpOwotCQkJZGF0YVNvdXJjZS5zZXRQcm9wZXJ0eSgidXJsIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKGdyYWlsc0RhdGFTb3VyY2UuZ2V0VXJsKCkpKTsKLQkJCWRhdGFTb3VyY2Uuc2V0UHJvcGVydHkoInVzZXJuYW1lIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKGdyYWlsc0RhdGFTb3VyY2UuZ2V0VXNlcm5hbWUoKSkpOwotCQkJZGF0YVNvdXJjZS5zZXRQcm9wZXJ0eSgicGFzc3dvcmQiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoZ3JhaWxzRGF0YVNvdXJjZS5nZXRQYXNzd29yZCgpKSk7Ci0gICAgICAgICAgICBpZihncmFpbHNEYXRhU291cmNlLmdldENvbmZpZ3VyYXRpb25DbGFzcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiW1NwcmluZ0NvbmZpZ10gVXNpbmcgY3VzdG9tIEhpYmVybmF0ZSBjb25maWd1cmF0aW9uIGNsYXNzIFsiK2dyYWlsc0RhdGFTb3VyY2UuZ2V0Q29uZmlndXJhdGlvbkNsYXNzKCkrIl0iKTsKLSAgICAgICAgICAgICAgICBsb2NhbFNlc3Npb25GYWN0b3J5QmVhbi5zZXRQcm9wZXJ0eSgiY29uZmlnQ2xhc3MiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoZ3JhaWxzRGF0YVNvdXJjZS5nZXRDb25maWd1cmF0aW9uQ2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJkYXRhU291cmNlIiwgZGF0YVNvdXJjZSkpOwotCQl9IGVsc2UgewotCQkJQmVhbiBkYXRhU291cmNlID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihCYXNpY0RhdGFTb3VyY2UuY2xhc3MpOwotCQkJZGF0YVNvdXJjZS5zZXREZXN0cm95TWV0aG9kKCJjbG9zZSIpOwotCQkJZGF0YVNvdXJjZS5zZXRQcm9wZXJ0eSgiZHJpdmVyQ2xhc3NOYW1lIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiKSk7Ci0JCQlkYXRhU291cmNlLnNldFByb3BlcnR5KCJ1cmwiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoImpkYmM6aHNxbGRiOmhzcWw6Ly9sb2NhbGhvc3Q6OTEwMS8iKSk7Ci0JCQlkYXRhU291cmNlLnNldFByb3BlcnR5KCJ1c2VybmFtZSIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgic2EiKSk7Ci0JCQlkYXRhU291cmNlLnNldFByb3BlcnR5KCJwYXNzd29yZCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgiIikpOwotCQkJYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImRhdGFTb3VyY2UiLCBkYXRhU291cmNlKSk7Ci0JCQkKLQkJCUJlYW4gaHNxbGRiU2VydmVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihTZXJ2ZXJCZWFuLmNsYXNzKTsKLQkJCWhzcWxkYlNlcnZlci5zZXRQcm9wZXJ0eSgiZGF0YVNvdXJjZSIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImRhdGFTb3VyY2UiKSk7Ci0JCQlNYXAgaHNxbGRiUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQloc3FsZGJQcm9wZXJ0aWVzLnB1dCgic2VydmVyLnBvcnQiLCAiOTEwMSIpOwotCQkJaHNxbGRiUHJvcGVydGllcy5wdXQoInNlcnZlci5kYXRhYmFzZS4wIiwgIm1lbTp0ZW1wIik7Ci0JCQloc3FsZGJTZXJ2ZXIuc2V0UHJvcGVydHkoInNlcnZlclByb3BlcnRpZXMiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVQcm9wZXJ0aWVzKGhzcWxkYlByb3BlcnRpZXMpKTsKLQkJCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJoc3FsZGJTZXJ2ZXIiLCBoc3FsZGJTZXJ2ZXIpKTsKLQkJCWRlcGVuZHNPbkhzcWxkYlNlcnZlciA9IHRydWU7Ci0JCX0KLQkJCi0JCU1hcCB2ZW5kb3JOYW1lRGlhbGVjdE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJdmVuZG9yTmFtZURpYWxlY3RNYXBwaW5ncy5wdXQoIkhTUUwgRGF0YWJhc2UgRW5naW5lIiwgSFNRTERpYWxlY3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdmVuZG9yTmFtZURpYWxlY3RNYXBwaW5ncy5wdXQoIk15U1FMIiwgTXlTUUxEaWFsZWN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQkKLQkJQmVhbiBkaWFsZWN0RGV0ZWN0b3IgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKEhpYmVybmF0ZURpYWxlY3REZXRlY3RvckZhY3RvcnlCZWFuLmNsYXNzKTsKLQkJZGlhbGVjdERldGVjdG9yLnNldFByb3BlcnR5KCJkYXRhU291cmNlIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZGF0YVNvdXJjZSIpKTsKLQkJZGlhbGVjdERldGVjdG9yLnNldFByb3BlcnR5KCJ2ZW5kb3JOYW1lRGlhbGVjdE1hcHBpbmdzIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlUHJvcGVydGllcyh2ZW5kb3JOYW1lRGlhbGVjdE1hcHBpbmdzKSk7Ci0JCWlmIChkZXBlbmRzT25Ic3FsZGJTZXJ2ZXIpIHsKLQkJCUNvbGxlY3Rpb24gZGVwZW5kc09uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVwZW5kc09uLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJoc3FsZGJTZXJ2ZXIiKSk7Ci0JCQlkaWFsZWN0RGV0ZWN0b3Iuc2V0RGVwZW5kc09uKGRlcGVuZHNPbik7Ci0JCX0KLQkJCi0JCU1hcCBoaWJlcm5hdGVQcm9wZXJ0aWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaGliZXJuYXRlUHJvcGVydGllc01hcC5wdXQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJoaWJlcm5hdGUuZGlhbGVjdCIpLCBkaWFsZWN0RGV0ZWN0b3IpOwotCQlpZihncmFpbHNEYXRhU291cmNlID09IG51bGwgKSB7Ci0JCQloaWJlcm5hdGVQcm9wZXJ0aWVzTWFwLnB1dChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoImhpYmVybmF0ZS5oYm0yZGRsLmF1dG8iKSwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJjcmVhdGUtZHJvcCIpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGdyYWlsc0RhdGFTb3VyY2UuZ2V0RGJDcmVhdGUoKSAhPSBudWxsKSB7Ci0JCQkJaGliZXJuYXRlUHJvcGVydGllc01hcC5wdXQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJoaWJlcm5hdGUuaGJtMmRkbC5hdXRvIiksIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZShncmFpbHNEYXRhU291cmNlLmdldERiQ3JlYXRlKCkpKTsKLQkJCX0KLQkJfQotCQlCZWFuIGhpYmVybmF0ZVByb3BlcnRpZXMgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKE1hcFRvUHJvcGVydGllc0ZhY3RvcnlCZWFuLmNsYXNzKTsKLQkJaGliZXJuYXRlUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWFwIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTWFwKGhpYmVybmF0ZVByb3BlcnRpZXNNYXApKTsKLQkJCQkKLQkJQmVhbiBncmFpbHNDbGFzc0xvYWRlciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oTWV0aG9kSW52b2tpbmdGYWN0b3J5QmVhbi5jbGFzcyk7Ci0JCWdyYWlsc0NsYXNzTG9hZGVyLnNldFByb3BlcnR5KCJ0YXJnZXRPYmplY3QiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJncmFpbHNBcHBsaWNhdGlvbiIpKTsKLQkJZ3JhaWxzQ2xhc3NMb2FkZXIuc2V0UHJvcGVydHkoInRhcmdldE1ldGhvZCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgiZ2V0Q2xhc3NMb2FkZXIiKSk7Ci0JCQotCi0JCWxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuLnNldFByb3BlcnR5KCJkYXRhU291cmNlIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZGF0YVNvdXJjZSIpKTsKLQkJQ2xhc3NMb2FkZXIgY2wgPSB0aGlzLmFwcGxpY2F0aW9uLmdldENsYXNzTG9hZGVyKCk7Ci0JCVVSTCBoaWJlcm5hdGVDb25maWcgPSBjbC5nZXRSZXNvdXJjZSgiaGliZXJuYXRlLmNmZy54bWwiKTsKLQkJaWYoaGliZXJuYXRlQ29uZmlnICE9IG51bGwpIHsKLQkJCWxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuLnNldFByb3BlcnR5KCJjb25maWdMb2NhdGlvbiIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgiY2xhc3NwYXRoOmhpYmVybmF0ZS5jZmcueG1sIikpOwotCQl9Ci0gICAgICAgIGxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuLnNldFByb3BlcnR5KCJoaWJlcm5hdGVQcm9wZXJ0aWVzIiwgaGliZXJuYXRlUHJvcGVydGllcyk7Ci0JCWxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuLnNldFByb3BlcnR5KCJncmFpbHNBcHBsaWNhdGlvbiIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImdyYWlsc0FwcGxpY2F0aW9uIikpOwotCQlsb2NhbFNlc3Npb25GYWN0b3J5QmVhbi5zZXRQcm9wZXJ0eSgiY2xhc3NMb2FkZXIiLCBncmFpbHNDbGFzc0xvYWRlcik7Ci0JCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCJzZXNzaW9uRmFjdG9yeSIsIGxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuKSk7Ci0JCQotCQlCZWFuIHRyYW5zYWN0aW9uTWFuYWdlciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oSGliZXJuYXRlVHJhbnNhY3Rpb25NYW5hZ2VyLmNsYXNzKTsKLQkJdHJhbnNhY3Rpb25NYW5hZ2VyLnNldFByb3BlcnR5KCJzZXNzaW9uRmFjdG9yeSIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoInNlc3Npb25GYWN0b3J5IikpOwotCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgidHJhbnNhY3Rpb25NYW5hZ2VyIiwgdHJhbnNhY3Rpb25NYW5hZ2VyKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRG9tYWluQ2xhc3NSZWZlcmVuY2VzKENvbGxlY3Rpb24gYmVhblJlZmVyZW5jZXMsIEJlYW4gY2xhc3NMb2FkZXIpIHsKLQkJR3JhaWxzRG9tYWluQ2xhc3NbXSBncmFpbHNEb21haW5DbGFzc2VzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3NlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyYWlsc0RvbWFpbkNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCUdyYWlsc0RvbWFpbkNsYXNzIGdyYWlsc0RvbWFpbkNsYXNzID0gZ3JhaWxzRG9tYWluQ2xhc3Nlc1tpXTsKLQkJCQotCQkJQmVhbiBkb21haW5DbGFzc0JlYW4gPSAJU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihNZXRob2RJbnZva2luZ0ZhY3RvcnlCZWFuLmNsYXNzKTsKLQkJCWRvbWFpbkNsYXNzQmVhbi5zZXRQcm9wZXJ0eSgidGFyZ2V0T2JqZWN0IiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZ3JhaWxzQXBwbGljYXRpb24iKSk7Ci0JCQlkb21haW5DbGFzc0JlYW4uc2V0UHJvcGVydHkoInRhcmdldE1ldGhvZCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgiZ2V0R3JhaWxzRG9tYWluQ2xhc3MiKSk7Ci0JCQlkb21haW5DbGFzc0JlYW4uc2V0UHJvcGVydHkoImFyZ3VtZW50cyIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZShncmFpbHNEb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpKSk7Ci0JCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShncmFpbHNEb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpICsgIkRvbWFpbkNsYXNzIiwgZG9tYWluQ2xhc3NCZWFuKSk7Ci0JCQkKLQkJCS8vIGNyZWF0ZSBwZXJzaXN0ZW50IGNsYXNzIGJlYW4gcmVmZXJlbmNlcwotCQkJQmVhbiBwZXJzaXN0ZW50Q2xhc3NCZWFuID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihNZXRob2RJbnZva2luZ0ZhY3RvcnlCZWFuLmNsYXNzKTsKLQkJCXBlcnNpc3RlbnRDbGFzc0JlYW4uc2V0UHJvcGVydHkoInRhcmdldE9iamVjdCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoZ3JhaWxzRG9tYWluQ2xhc3MuZ2V0RnVsbE5hbWUoKSArICJEb21haW5DbGFzcyIpKTsKLQkJCXBlcnNpc3RlbnRDbGFzc0JlYW4uc2V0UHJvcGVydHkoInRhcmdldE1ldGhvZCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZSgiZ2V0Q2xhenoiKSk7Ci0JCQkKLQkJCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc0RvbWFpbkNsYXNzLmdldEZ1bGxOYW1lKCkgKyAiUGVyc2lzdGVudENsYXNzIiwgcGVyc2lzdGVudENsYXNzQmVhbikpOwotCQkJCi0JCQkvKkNvbGxlY3Rpb24gY29uc3RydWN0b3JBcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjb25maWd1cmUgcGVyc2lzdGVudCBtZXRob2RzCi0JCQljb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgiZ3JhaWxzQXBwbGljYXRpb24iKSk7Ci0JCQljb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKGdyYWlsc0RvbWFpbkNsYXNzLmdldENsYXp6KCkuZ2V0TmFtZSgpKSk7Ci0JCQljb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgic2Vzc2lvbkZhY3RvcnkiKSk7Ci0JCQljb25zdHJ1Y3RvckFyZ3VtZW50cy5hZGQoY2xhc3NMb2FkZXIpOwotCQkJQmVhbiBoaWJlcm5hdGVQZXJzaXN0ZW50TWV0aG9kcyA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oRG9tYWluQ2xhc3NNZXRob2RzLmNsYXNzLCBjb25zdHJ1Y3RvckFyZ3VtZW50cyk7Ci0JCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShncmFpbHNEb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpICsgIlBlcnNpc3RlbnRNZXRob2RzIiwgaGliZXJuYXRlUGVyc2lzdGVudE1ldGhvZHMpKTsqLwotCi0JCQkvLyBjb25maWd1cmUgdmFsaWRhdG9yCQkJCi0JCQlCZWFuIHZhbGlkYXRvckJlYW4gPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKCBHcmFpbHNEb21haW5DbGFzc1ZhbGlkYXRvci5jbGFzcyk7Ci0JCQl2YWxpZGF0b3JCZWFuLnNldFByb3BlcnR5KCAiZG9tYWluQ2xhc3MiICxTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc0RvbWFpbkNsYXNzLmdldEZ1bGxOYW1lKCkgKyAiRG9tYWluQ2xhc3MiKSApOwotCQkJdmFsaWRhdG9yQmVhbi5zZXRQcm9wZXJ0eSggInNlc3Npb25GYWN0b3J5IiAsU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgic2Vzc2lvbkZhY3RvcnkiKSApOwotCQkJYmVhblJlZmVyZW5jZXMuYWRkKCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKCBncmFpbHNEb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpICsgIlZhbGlkYXRvciIsIHZhbGlkYXRvckJlYW4gKSApOwkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU2VydmljZUNsYXNzUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGJlYW5SZWZlcmVuY2VzKSB7Ci0JCUdyYWlsc1NlcnZpY2VDbGFzc1tdIHNlcnZpY2VDbGFzc2VzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzU2VydmljZUNsYXNzZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPHNlcnZpY2VDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmFpbHNTZXJ2aWNlQ2xhc3MgZ3JhaWxzU2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzZXNbaV07Ci0JCQlCZWFuIHNlcnZpY2VDbGFzcyA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oTWV0aG9kSW52b2tpbmdGYWN0b3J5QmVhbi5jbGFzcyk7Ci0JCQlzZXJ2aWNlQ2xhc3Muc2V0UHJvcGVydHkoInRhcmdldE9iamVjdCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImdyYWlsc0FwcGxpY2F0aW9uIikpOwotCQkJc2VydmljZUNsYXNzLnNldFByb3BlcnR5KCJ0YXJnZXRNZXRob2QiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoImdldEdyYWlsc1NlcnZpY2VDbGFzcyIpKTsKLQkJCXNlcnZpY2VDbGFzcy5zZXRQcm9wZXJ0eSgiYXJndW1lbnRzIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKGdyYWlsc1NlcnZpY2VDbGFzcy5nZXRGdWxsTmFtZSgpKSk7Ci0JCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShncmFpbHNTZXJ2aWNlQ2xhc3MuZ2V0RnVsbE5hbWUoKSArICJDbGFzcyIsIHNlcnZpY2VDbGFzcykpOwotCQkJCi0JCQlCZWFuIHNlcnZpY2VJbnN0YW5jZSA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oKTsKLQkJCXNlcnZpY2VJbnN0YW5jZS5zZXRGYWN0b3J5QmVhbihTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKGdyYWlsc1NlcnZpY2VDbGFzcy5nZXRGdWxsTmFtZSgpICsgIkNsYXNzIikpOwotCQkJc2VydmljZUluc3RhbmNlLnNldEZhY3RvcnlNZXRob2QoIm5ld0luc3RhbmNlIik7Ci0JCQlpZiAoZ3JhaWxzU2VydmljZUNsYXNzLmJ5TmFtZSgpKSB7Ci0JCQkJc2VydmljZUluc3RhbmNlLnNldEF1dG93aXJlKCJieU5hbWUiKTsKLQkJCX0gZWxzZSBpZiAoZ3JhaWxzU2VydmljZUNsYXNzLmJ5VHlwZSgpKSB7Ci0JCQkJc2VydmljZUluc3RhbmNlLnNldEF1dG93aXJlKCJieVR5cGUiKTsKLQkJCX0KLSAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2VydmljZSBpbnN0YW5jZSBhcyBhIGhvdHN3YXBwYWJsZSB0YXJnZXQgc291cmNlCi0KLSAgICAgICAgICAgIC8vIGlmIGl0cyB0cmFuc2FjdGlvbmFsIGNvbmZpZ3VyZSB0cmFuc2FjdGlvbmFsIHByb3h5Ci0gICAgICAgICAgICBpZiAoZ3JhaWxzU2VydmljZUNsYXNzLmlzVHJhbnNhY3Rpb25hbCgpKSB7Ci0JCQkJTWFwIHRyYW5zYWN0aW9uQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGVzLnB1dCgiKiIsICJQUk9QQUdBVElPTl9SRVFVSVJFRCIpOwotCQkJCUJlYW4gdHJhbnNhY3Rpb25hbFByb3h5ID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihUcmFuc2FjdGlvblByb3h5RmFjdG9yeUJlYW4uY2xhc3MpOwotCQkJCXRyYW5zYWN0aW9uYWxQcm94eS5zZXRQcm9wZXJ0eSgidGFyZ2V0Iiwgc2VydmljZUluc3RhbmNlKTsKLQkJCQl0cmFuc2FjdGlvbmFsUHJveHkuc2V0UHJvcGVydHkoInByb3h5VGFyZ2V0Q2xhc3MiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVMaXRlcmFsVmFsdWUoInRydWUiKSk7Ci0JCQkJdHJhbnNhY3Rpb25hbFByb3h5LnNldFByb3BlcnR5KCJ0cmFuc2FjdGlvbkF0dHJpYnV0ZXMiLCBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVQcm9wZXJ0aWVzKHRyYW5zYWN0aW9uQXR0cmlidXRlcykpOwotCQkJCXRyYW5zYWN0aW9uYWxQcm94eS5zZXRQcm9wZXJ0eSgidHJhbnNhY3Rpb25NYW5hZ2VyIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZSgidHJhbnNhY3Rpb25NYW5hZ2VyIikpOwotCQkJCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKFdvcmRVdGlscy51bmNhcGl0YWxpemUoZ3JhaWxzU2VydmljZUNsYXNzLmdldE5hbWUoKSkgKyAiU2VydmljZSIsIHRyYW5zYWN0aW9uYWxQcm94eSkpOwotCQkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgY29uZmlndXJlIGEgc3RhbmRhcmQgcHJveHkKLSAgICAgICAgICAgICAgICBiZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShXb3JkVXRpbHMudW5jYXBpdGFsaXplKGdyYWlsc1NlcnZpY2VDbGFzcy5nZXROYW1lKCkpICsgIlNlcnZpY2UiLCBzZXJ2aWNlSW5zdGFuY2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgR3JhaWxzIHBhZ2UgZmxvd3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQYWdlRmxvd1JlZmVyZW5jZXMoQ29sbGVjdGlvbiBiZWFuUmVmZXJlbmNlcywgTWFwIHVybE1hcHBpbmdzKSB7Ci0JCUdyYWlsc1BhZ2VGbG93Q2xhc3NbXSBwYWdlRmxvd3MgPSBhcHBsaWNhdGlvbi5nZXRQYWdlRmxvd3MoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZUZsb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmFpbHNQYWdlRmxvd0NsYXNzIHBhZ2VGbG93ID0gcGFnZUZsb3dzW2ldOwotCQkJaWYgKCFwYWdlRmxvdy5nZXRBdmFpbGFibGUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQmVhbiBwYWdlRmxvd0NsYXNzID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihNZXRob2RJbnZva2luZ0ZhY3RvcnlCZWFuLmNsYXNzKTsKLQkJCXBhZ2VGbG93Q2xhc3Muc2V0UHJvcGVydHkoInRhcmdldE9iamVjdCIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UoImdyYWlsc0FwcGxpY2F0aW9uIikpOwotCQkJcGFnZUZsb3dDbGFzcy5zZXRQcm9wZXJ0eSgidGFyZ2V0TWV0aG9kIiwgU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlTGl0ZXJhbFZhbHVlKCJnZXRQYWdlRmxvdyIpKTsKLQkJCXBhZ2VGbG93Q2xhc3Muc2V0UHJvcGVydHkoImFyZ3VtZW50cyIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUxpdGVyYWxWYWx1ZShwYWdlRmxvdy5nZXRGdWxsTmFtZSgpKSk7Ci0JCQliZWFuUmVmZXJlbmNlcy5hZGQoU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlQmVhblJlZmVyZW5jZShwYWdlRmxvdy5nZXRGdWxsTmFtZSgpICsgIkNsYXNzIiwgcGFnZUZsb3dDbGFzcykpOwotCQkJCi0JCQlCZWFuIHBhZ2VGbG93SW5zdGFuY2UgPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKCk7Ci0JCQlwYWdlRmxvd0luc3RhbmNlLnNldEZhY3RvcnlCZWFuKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UocGFnZUZsb3cuZ2V0RnVsbE5hbWUoKSArICJDbGFzcyIpKTsKLQkJCXBhZ2VGbG93SW5zdGFuY2Uuc2V0RmFjdG9yeU1ldGhvZCgibmV3SW5zdGFuY2UiKTsKLQkJCWlmIChwYWdlRmxvdy5ieVR5cGUoKSkgewotCQkJCXBhZ2VGbG93SW5zdGFuY2Uuc2V0QXV0b3dpcmUoImJ5VHlwZSIpOwotCQkJfSBlbHNlIGlmIChwYWdlRmxvdy5ieU5hbWUoKSkgewotCQkJCXBhZ2VGbG93SW5zdGFuY2Uuc2V0QXV0b3dpcmUoImJ5TmFtZSIpOwotCQkJfQotCQkJYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UocGFnZUZsb3cuZ2V0RnVsbE5hbWUoKSwgcGFnZUZsb3dJbnN0YW5jZSkpOwotCQkJCi0JCQlCZWFuIGZsb3dCdWlsZGVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihHcmFpbHNGbG93QnVpbGRlci5jbGFzcyk7Ci0JCQlmbG93QnVpbGRlci5zZXRQcm9wZXJ0eSgicGFnZUZsb3dDbGFzcyIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UocGFnZUZsb3cuZ2V0RnVsbE5hbWUoKSArICJDbGFzcyIpKTsKLQkJCQotCQkJQmVhbiBmbG93RmFjdG9yeUJlYW4gPSBTcHJpbmdDb25maWdVdGlscy5jcmVhdGVTaW5nbGV0b25CZWFuKEZsb3dGYWN0b3J5QmVhbi5jbGFzcyk7Ci0JCQlmbG93RmFjdG9yeUJlYW4uc2V0UHJvcGVydHkoImZsb3dCdWlsZGVyIiwgZmxvd0J1aWxkZXIpOwotCQkJYmVhblJlZmVyZW5jZXMuYWRkKFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UocGFnZUZsb3cuZ2V0Rmxvd0lkKCksIGZsb3dGYWN0b3J5QmVhbikpOwotCi0JCQlpZiAocGFnZUZsb3cuZ2V0QWNjZXNzaWJsZSgpKSB7Ci0JCQkJQmVhbiBmbG93RXhlY3V0aW9uTWFuYWdlciA9IFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZVNpbmdsZXRvbkJlYW4oR3JhaWxzU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyLmNsYXNzKTsKLQkJCQlmbG93RXhlY3V0aW9uTWFuYWdlci5zZXRQcm9wZXJ0eSgiZmxvdyIsIFNwcmluZ0NvbmZpZ1V0aWxzLmNyZWF0ZUJlYW5SZWZlcmVuY2UocGFnZUZsb3cuZ2V0Rmxvd0lkKCkpKTsKLQkJCQkKLQkJCQlCZWFuIGZsb3dDb250cm9sbGVyID0gU3ByaW5nQ29uZmlnVXRpbHMuY3JlYXRlU2luZ2xldG9uQmVhbihGbG93Q29udHJvbGxlci5jbGFzcyk7Ci0JCQkJZmxvd0NvbnRyb2xsZXIuc2V0UHJvcGVydHkoImZsb3dFeGVjdXRpb25NYW5hZ2VyIiwgZmxvd0V4ZWN1dGlvbk1hbmFnZXIpOwotCQkJCWJlYW5SZWZlcmVuY2VzLmFkZChTcHJpbmdDb25maWdVdGlscy5jcmVhdGVCZWFuUmVmZXJlbmNlKHBhZ2VGbG93LmdldEZ1bGxOYW1lKCkgKyAiQ29udHJvbGxlciIsIGZsb3dDb250cm9sbGVyKSk7Ci0JCQkJCi0JCQkJdXJsTWFwcGluZ3MucHV0KHBhZ2VGbG93LmdldFVyaSgpLCBwYWdlRmxvdy5nZXRGdWxsTmFtZSgpICsgIkNvbnRyb2xsZXIiKTsKLQkJCX0KLQkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvc3ByaW5nL1NwcmluZ0NvbmZpZ1V0aWxzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9zcHJpbmcvU3ByaW5nQ29uZmlnVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ODc0MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9zcHJpbmcvU3ByaW5nQ29uZmlnVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLnNwcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLkJlYW47Ci1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLkJlYW5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLkluc3RhbmNlOwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmJlYW5zLmZhY3RvcnkuZHJpdmVycy5MaXRlcmFsTGlzdDsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMuTGl0ZXJhbE1hcDsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMuTGl0ZXJhbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLkxpdGVyYWxWYWx1ZTsKLQotLyoqCi0gKiA8cD5IZWxwZXIgY2xhc3MgdG8gY3JlYXRlIFNwcmluZyBjb25maWd1cmF0aW9uIG9iamVjdHMgZm9yIGxvYWRpbmcgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFNwcmluZ0NvbmZpZ1V0aWxzIHsKLQotCXByaXZhdGUgU3ByaW5nQ29uZmlnVXRpbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZVNpbmdsZXRvbkJlYW4oKSB7Ci0JCXJldHVybiBjcmVhdGVTaW5nbGV0b25CZWFuKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJlYW4gY3JlYXRlU2luZ2xldG9uQmVhbihDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gY3JlYXRlU2luZ2xldG9uQmVhbihjbGF6eiwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbiBjcmVhdGVTaW5nbGV0b25CZWFuKENsYXNzIGNsYXp6LCBDb2xsZWN0aW9uIGNvbnN0cnVjdG9yQXJndW1lbnRzKSB7Ci0JCXJldHVybiBjcmVhdGVTaW5nbGV0b25CZWFuKGNsYXp6LCBudWxsLCBjb25zdHJ1Y3RvckFyZ3VtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbiBjcmVhdGVQcm90b3R5cGVCZWFuKCkgewotCQlyZXR1cm4gY3JlYXRlUHJvdG90eXBlQmVhbihudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZVByb3RvdHlwZUJlYW4oQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIGNyZWF0ZVByb3RvdHlwZUJlYW4oY2xhenosIG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJlYW4gY3JlYXRlUHJvdG90eXBlQmVhbihDbGFzcyBjbGF6eiwgQ29sbGVjdGlvbiBjb25zdHJ1Y3RvckFyZ3VtZW50cykgewotCQlyZXR1cm4gY3JlYXRlUHJvdG90eXBlQmVhbihjbGF6eiwgbnVsbCwgY29uc3RydWN0b3JBcmd1bWVudHMpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZVByb3RvdHlwZUJlYW4oQ2xhc3MgY2xhenosICBCZWFuUmVmZXJlbmNlIHBhcmVudCwgQ29sbGVjdGlvbiBjb25zdHJ1Y3RvckFyZ3VtZW50cykgewotCQlyZXR1cm4gY3JlYXRlQmVhbihjbGF6eiwgcGFyZW50LCBmYWxzZSwgY29uc3RydWN0b3JBcmd1bWVudHMsZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQmVhbiBjcmVhdGVTaW5nbGV0b25CZWFuKENsYXNzIGNsYXp6LCBCZWFuUmVmZXJlbmNlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlU2luZ2xldG9uQmVhbihjbGF6eiwgcGFyZW50LCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZVNpbmdsZXRvbkJlYW4oQ2xhc3MgY2xhenosIEJlYW5SZWZlcmVuY2UgcGFyZW50LCBDb2xsZWN0aW9uIGNvbnN0cnVjdG9yQXJndW1lbnRzKSB7Ci0JCXJldHVybiBjcmVhdGVCZWFuKGNsYXp6LCBwYXJlbnQsIGZhbHNlLCBjb25zdHJ1Y3RvckFyZ3VtZW50cyx0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZUFic3RyYWN0U2luZ2xldG9uQmVhbihDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gY3JlYXRlQWJzdHJhY3RTaW5nbGV0b25CZWFuKGNsYXp6LCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCZWFuIGNyZWF0ZUFic3RyYWN0U2luZ2xldG9uQmVhbihDbGFzcyBjbGF6eiwgQ29sbGVjdGlvbiBjb25zdHJ1Y3RvckFyZ3VtZW50cykgewotCQlyZXR1cm4gY3JlYXRlQmVhbihjbGF6eiwgbnVsbCwgdHJ1ZSwgY29uc3RydWN0b3JBcmd1bWVudHMsdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbiBjcmVhdGVCZWFuKGZpbmFsIENsYXNzIGNsYXp6LCBmaW5hbCBCZWFuUmVmZXJlbmNlIHBhcmVudCwgZmluYWwgYm9vbGVhbiBfYWJzdHJhY3QsIGZpbmFsIENvbGxlY3Rpb24gY29uc3RydWN0b3JBcmd1bWVudHMsIGZpbmFsIGJvb2xlYW4gaXNTaW5nbGV0b24pIHsKLQkJcmV0dXJuIG5ldyBCZWFuKCkgewotCQkJcHJpdmF0ZSBTdHJpbmcgYXV0b3dpcmUgPSBudWxsOwotCQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGRlcGVuZHNPbiA9IG51bGw7Ci0JCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQlwcml2YXRlIFN0cmluZyBkZXN0cm95TWV0aG9kID0gbnVsbDsKLQkJCXByaXZhdGUgU3RyaW5nIGluaXRNZXRob2QgPSBudWxsOwotCQkJcHJpdmF0ZSBNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwcml2YXRlIEJlYW5SZWZlcmVuY2UgZmFjdG9yeUJlYW4gPSBudWxsOwotCQkJcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeU1ldGhvZCA9IG51bGw7Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0QXV0b3dpcmUoKSB7Ci0JCQkJcmV0dXJuIGF1dG93aXJlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0Q2xhenooKSB7Ci0JCQkJcmV0dXJuIGNsYXp6OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDb25zdHJ1Y3RvckFyZ3VtZW50cygpIHsKLQkJCQlyZXR1cm4gY29uc3RydWN0b3JBcmd1bWVudHM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlcGVuZHNPbigpIHsKLQkJCQlyZXR1cm4gZGVwZW5kc09uOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXREZXN0cm95TWV0aG9kKCkgewotCQkJCXJldHVybiBkZXN0cm95TWV0aG9kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldEluaXRNZXRob2QoKSB7Ci0JCQkJcmV0dXJuIGluaXRNZXRob2Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBCZWFuUmVmZXJlbmNlIGdldFBhcmVudCgpIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7Ci0JCQkJcmV0dXJuIF9hYnN0cmFjdDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNMYXp5KCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNTaW5nbGV0b24oKSB7Ci0JCQkJcmV0dXJuIGlzU2luZ2xldG9uOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzZXRBdXRvd2lyZShTdHJpbmcgYXV0b3dpcmUpIHsKLQkJCQl0aGlzLmF1dG93aXJlID0gYXV0b3dpcmU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHNldERlcGVuZHNPbihDb2xsZWN0aW9uIGRlcGVuZHNPbikgewotCQkJCXRoaXMuZGVwZW5kc09uID0gZGVwZW5kc09uOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHNldERlc3Ryb3lNZXRob2QoU3RyaW5nIGRlc3Ryb3lNZXRob2QpIHsKLQkJCQl0aGlzLmRlc3Ryb3lNZXRob2QgPSBkZXN0cm95TWV0aG9kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzZXRJbml0TWV0aG9kKFN0cmluZyBpbml0TWV0aG9kKSB7Ci0JCQkJdGhpcy5pbml0TWV0aG9kID0gaW5pdE1ldGhvZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIEluc3RhbmNlIHZhbHVlKSB7Ci0JCQkJdGhpcy5wcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBCZWFuUmVmZXJlbmNlIGdldEZhY3RvcnlCZWFuKCkgewotCQkJCXJldHVybiB0aGlzLmZhY3RvcnlCZWFuOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5QmVhbihCZWFuUmVmZXJlbmNlIGZhY3RvcnlCZWFuKSB7Ci0JCQkJdGhpcy5mYWN0b3J5QmVhbiA9IGZhY3RvcnlCZWFuOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlNZXRob2QoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZmFjdG9yeU1ldGhvZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2V0RmFjdG9yeU1ldGhvZChTdHJpbmcgZmFjdG9yeU1ldGhvZCkgewotCQkJCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQmVhblJlZmVyZW5jZSBjcmVhdGVCZWFuUmVmZXJlbmNlKGZpbmFsIFN0cmluZyBiZWFuTmFtZSwgZmluYWwgQmVhbiBiZWFuKSB7Ci0JCXJldHVybiBuZXcgQmVhblJlZmVyZW5jZSgpIHsKLQkJCXB1YmxpYyBCZWFuIGdldEJlYW4oKSB7Ci0JCQkJcmV0dXJuIGJlYW47Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7Ci0JCQkJcmV0dXJuIGJlYW5OYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQmVhblJlZmVyZW5jZSBjcmVhdGVCZWFuUmVmZXJlbmNlKFN0cmluZyBiZWFuTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlQmVhblJlZmVyZW5jZShiZWFuTmFtZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGl0ZXJhbFZhbHVlIGNyZWF0ZUxpdGVyYWxWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBMaXRlcmFsVmFsdWUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXRlcmFsUHJvcGVydGllcyBjcmVhdGVQcm9wZXJ0aWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCWZpbmFsIE1hcCB0bXBQcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXRlci5uZXh0KCk7Ci0JCQl0bXBQcm9wcy5wdXQoY3JlYXRlTGl0ZXJhbFZhbHVlKGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpLCBjcmVhdGVMaXRlcmFsVmFsdWUoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsID8gZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpIDogIiIpKTsKLQkJfQotCQlyZXR1cm4gbmV3IExpdGVyYWxQcm9wZXJ0aWVzKCkgewotCQkJcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQkJCXJldHVybiB0bXBQcm9wczsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXRlcmFsTWFwIGNyZWF0ZU1hcChmaW5hbCBNYXAgbWFwKSB7Ci0JCXJldHVybiBuZXcgTGl0ZXJhbE1hcCgpIHsKLQkJCXB1YmxpYyBNYXAgZ2V0TWFwKCkgewotCQkJCXJldHVybiBtYXA7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGl0ZXJhbExpc3QgY3JlYXRlTGlzdChmaW5hbCBDb2xsZWN0aW9uIGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBMaXRlcmFsTGlzdCgpIHsKLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKCkgewotCQkJCXJldHVybiBsaXN0OwotCQkJfQkJCQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0NvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTgwMzZkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0NvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIGEgY29tcGlsYXRpb24gZXJyb3Igb2NjdXJzLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvRGF0YVNvdXJjZVJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9EYXRhU291cmNlUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0ZTg5YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9EYXRhU291cmNlUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+VGhyb3duIHdoZW4gYSBtaXNzaW5nIHByb3BlcnR5IG9uIGEgR3JhaWxzIGRhdGEgc291cmNlIGlzIG1pc3NpbmcuIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA2LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb24gZXh0ZW5kcwotCQlHcmFpbHNEYXRhU291cmNlRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBEYXRhU291cmNlUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERhdGFTb3VyY2VSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YVNvdXJjZVJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKFN0cmluZyBhcmcwLAotCQkJVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIERhdGFTb3VyY2VSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0dyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0dyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNDZhMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9HcmFpbHNDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAzMS1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgR3JhaWxzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLSAgICAgICAgc3VwZXIoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvR3JhaWxzRGF0YVNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvR3JhaWxzRGF0YVNvdXJjZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY2ZWM5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0dyYWlsc0RhdGFTb3VyY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+QmFzZSBleGNlcHRpb24gZm9yIGVycm9ycyByZWxhdGVkIHRvIEdyYWlscyBkYXRhIHNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDYsIDIwMDUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYWlsc0RhdGFTb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBHcmFpbHNFeGNlcHRpb24gewotCi0JcHVibGljIEdyYWlsc0RhdGFTb3VyY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc0RhdGFTb3VyY2VFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc0RhdGFTb3VyY2VFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBHcmFpbHNEYXRhU291cmNlRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvR3JhaWxzRG9tYWluRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9HcmFpbHNEb21haW5FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2OTZlNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9HcmFpbHNEb21haW5FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9uczsKLQotCi0vKioKLSAqIDxwPk9jY3VycyB3aGVuIGNyZWF0aW9uIG9mIHRoZSBHcmFpbHMgZG9tYWluIGZyb20gdGhlIEdyYWlscyBkb21haW4gY2xhc3NlcyBmYWlsczwvcD4KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDYtSnVsLTIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc0RvbWFpbkV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgR3JhaWxzRG9tYWluRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBHcmFpbHNEb21haW5FeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBHcmFpbHNEb21haW5FeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc0RvbWFpbkV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL0dyYWlsc0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvR3JhaWxzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzMxNzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvR3JhaWxzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPkJhc2UgY2xhc3MgZm9yIGFsbCBHcmFpbHMgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3QgcmVjb3ZlcmFibGUuIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFpbHNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBHcmFpbHNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc0V4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvSW52YWxpZFByb3BlcnR5RXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9JbnZhbGlkUHJvcGVydHlFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNDE3OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9JbnZhbGlkUHJvcGVydHlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9uczsKLQotCi0vKioKLSAqIAotICogRXhjZXB0aW9uIHdoaWNoIGlzIHRocm93biB3aGVuIGEgcHJvcGVydHkgb2YgYSBHcmFpbHMgY2xhc3MgaXMgaW52YWxpZGF0ZWQuCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA2LUp1bC0yMDA1Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgSW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIEludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL01vcmVUaGFuT25lQWN0aXZlRGF0YVNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvTW9yZVRoYW5PbmVBY3RpdmVEYXRhU291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTljZjQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvTW9yZVRoYW5PbmVBY3RpdmVEYXRhU291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIG1vcmUgdGhhbiBvbmUgYWN0aXZlIGRhdGEgc291cmNlIGlzIGNvbmZpZ3VyZWQuIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA2LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb3JlVGhhbk9uZUFjdGl2ZURhdGFTb3VyY2VFeGNlcHRpb24gZXh0ZW5kcwotCQlHcmFpbHNEYXRhU291cmNlRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBNb3JlVGhhbk9uZUFjdGl2ZURhdGFTb3VyY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vcmVUaGFuT25lQWN0aXZlRGF0YVNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgTW9yZVRoYW5PbmVBY3RpdmVEYXRhU291cmNlRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgTW9yZVRoYW5PbmVBY3RpdmVEYXRhU291cmNlRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvTmV3SW5zdGFuY2VDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2V4Y2VwdGlvbnMvTmV3SW5zdGFuY2VDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU4MmIxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL05ld0luc3RhbmNlQ3JlYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+T2NjdXJzIHdoZW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGluc3RhbmNlIGZhaWxzLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdJbnN0YW5jZUNyZWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBOZXdJbnN0YW5jZUNyZWF0aW9uRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXdJbnN0YW5jZUNyZWF0aW9uRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBOZXdJbnN0YW5jZUNyZWF0aW9uRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgTmV3SW5zdGFuY2VDcmVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL1JlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZXhjZXB0aW9ucy9SZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTI1NWUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9leGNlcHRpb25zL1JlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKLWltcG9ydCBqYXZhLmxhbmcuVGhyb3dhYmxlOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIGEgbmFtZWQgcHJvcGVydHkgb2YgYSBzcGVjaWZpYyB0eXBlIGlzIG5vdCBwcmVzZW50IGluIGEgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDEwLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgUmVxdWlyZWRQcm9wZXJ0eU1pc3NpbmdFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZFByb3BlcnR5TWlzc2luZ0V4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkUHJvcGVydHlNaXNzaW5nRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3N1cHBvcnQvQ2xhc3NFZGl0b3IuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zdXBwb3J0L0NsYXNzRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTZmZDkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3N1cHBvcnQvQ2xhc3NFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yU3VwcG9ydDsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgOCwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NFZGl0b3IgZXh0ZW5kcyBQcm9wZXJ0eUVkaXRvclN1cHBvcnQgewotCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0JCi0JcHVibGljIENsYXNzRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDbGFzc0VkaXRvcihPYmplY3QgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNUZXh0KCkgewotCQlyZXR1cm4gKChDbGFzcylnZXRWYWx1ZSgpKS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFzVGV4dChTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFZhbHVlKHRoaXMuY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGNsYXNzIFsiICsgY2xhc3NOYW1lICsgIl0hIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc3VwcG9ydC9HcmFpbHNUZXN0U3VpdGUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zdXBwb3J0L0dyYWlsc1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWNjOWJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zdXBwb3J0L0dyYWlsc1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc3VwcG9ydDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5BdXRvd2lyZUNhcGFibGVCZWFuRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIElvQyBjbGFzcyB0byBpbmplY3QgcHJvcGVydGllcyBvZiBHcmFpbHMgdGVzdCBjYXNlIGNsYXNzZXMuCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgMjgsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwcml2YXRlIEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5IGJlYW5GYWN0b3J5ID0gbnVsbDsKLQkKLQlwdWJsaWMgR3JhaWxzVGVzdFN1aXRlKEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5IGJlYW5GYWN0b3J5LCBDbGFzcyBjbGF6eikgewotCQlzdXBlcihjbGF6eik7Ci0JCUFzc2VydC5ub3ROdWxsKGJlYW5GYWN0b3J5LCAiQmVhbiBmYWN0b3J5IHNob3VsZCBub3QgYmUgbnVsbCEiKTsKLQkJdGhpcy5iZWFuRmFjdG9yeSA9IGJlYW5GYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1blRlc3QoVGVzdCB0ZXN0LCBUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKSB7Ci0JCQliZWFuRmFjdG9yeS5hdXRvd2lyZUJlYW5Qcm9wZXJ0aWVzKHRlc3QsIEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LkFVVE9XSVJFX0JZX1RZUEUsIGZhbHNlKTsKLQkJfQotCQl0ZXN0LnJ1bihyZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1NmI4ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9Db25zdHJhaW5lZFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzk1ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLlJhbmdlOwotaW1wb3J0IGdyb292eS5sYW5nLkludFJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy52YWxpZGF0b3IuQ3JlZGl0Q2FyZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMudmFsaWRhdG9yLkVtYWlsVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy52YWxpZGF0b3IuVXJsVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uZXhjZXB0aW9ucy5Db25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXJJbXBsOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzZXQgY29udHJhaW50cyBhZ2FpbnN0IGEgcHJvcGVydGllcyBvZiBhIGNsYXNzLiBDb25zdHJhaW50cyBjYW4gZWl0aGVyIGJlCi0gKiBzZXQgdmlhIHRoZSBwcm9wZXJ0eSBzZXR0ZXJzIG9yIHZpYSB0aGUgPHByZT5hcHBseUNvbnN0cmFpbnQoU3RyaW5nIGNvbnN0cmFpbnROYW1lLCBPYmplY3QgY29uc3RyYWluaW5nVmFsdWUpPC9wcmU+Ci0gKiBpbiBjb21iaW5hdGlvbiB3aXRoIGEgY29uc3RyYWludCBjb25zdGFudC4gRXhhbXBsZToKLSAqIAotICogPGNvZGU+Ci0gKiAgICAgIC4uLgotICogICAgICAKLSAqIAkJQ29uc3RyYWluZWRQcm9wZXJ0eSBjcCA9IG5ldyBDb25zdHJhaW5lZFByb3BlcnR5KG93bmluZ0NsYXNzLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSk7Ci0gKiAgICAgIGlmKGNwLnN1cHBvcnRzQ29uc3RyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5FTUFJTF9DT05TVFJBSU5UICkgKSB7Ci0gKiAgICAgIAljcC5hcHBseUNvbnN0cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuRU1BSUxfQ09OU1RSQUlOVCwgbmV3IEJvb2xlYW4odHJ1ZSkgKTsgICAgICAKLSAqICAgICAgfQotICogPC9jb2RlPgotICoKLSAqIEFsdGVybmF0aXZlbHkgY29uc3RyYWludHMgY2FuIGJlIGFwcGxpZWQgZGlyZWN0bHkgdXNpbmcgdGhlIGphdmEgYmVhbiBnZXR0ZXJzL3NldHRlcnMgaWYgYSBzdGF0aWMgKGFzIG9wb3NlZCB0byBkeW5hbWljKQotICogYXBwcm9hY2ggdG8gY29uc3RyYWludCBjcmVhdGlvbiBpcyBwb3NzaWJsZToKLSAqCi0gKiA8Y29kZT4KLSAqICAgICAgIGNwLnNldEVtYWlsKHRydWUpCi0gKiA8L2NvZGU+Ci0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwNy1Ob3YtMjAwNQotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWluZWRQcm9wZXJ0eSAgIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRURJVF9DQVJEX0NPTlNUUkFJTlQgPSAiY3JlZGl0Q2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQ09OU1RSQUlOVCA9ICJlbWFpbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxBTktfQ09OU1RSQUlOVCA9ICJibGFuayI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfQ09OU1RSQUlOVCA9ICJyYW5nZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fTElTVF9DT05TVFJBSU5UID0gImluTGlzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NPTlNUUkFJTlQgPSAidXJsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSEVTX0NPTlNUUkFJTlQgPSAibWF0Y2hlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVOR1RIX0NPTlNUUkFJTlQgPSAibGVuZ3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFX0NPTlNUUkFJTlQgPSAic2l6ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0NPTlNUUkFJTlQgPSAibWluIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfQ09OU1RSQUlOVCA9ICJtYXgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9TSVpFX0NPTlNUUkFJTlQgPSAibWF4U2l6ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX1NJWkVfQ09OU1RSQUlOVCA9ICJtaW5TaXplIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIX0NPTlNUUkFJTlQgPSAibWF4TGVuZ3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0NPTlNUUkFJTlQgPSAibWluTGVuZ3RoIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0NPTlNUUkFJTlQgPSAibm90RXF1YWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExBQkxFX0NPTlNUUkFJTlQgPSAibnVsbGFibGUiOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfU1VGRklYID0gIi5pbnZhbGlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFRURFRF9TVUZGSVggPSAiLmV4Y2VlZGVkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RNRVRfU1VGRklYID0gIi5ub3RtZXQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9QUkVGSVggPSAiLm5vdC4iOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0JJR19TVUZGSVggPSAiLnRvb2JpZyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTE9OR19TVUZGSVggPSAiLnRvb2xvbmciOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT1NNQUxMX1NVRkZJWCA9ICIudG9vc21hbGwiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT1NIT1JUX1NVRkZJWCA9ICIudG9vc2hvcnQiOwotCQotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGNvbnN0cmFpbnRzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlzdGF0aWMgewotICAgICAgICBjb25zdHJhaW50cy5wdXQoIENSRURJVF9DQVJEX0NPTlNUUkFJTlQsIENyZWRpdENhcmRDb25zdHJhaW50LmNsYXNzICk7Ci0gICAgICAgIGNvbnN0cmFpbnRzLnB1dCggRU1BSUxfQ09OU1RSQUlOVCwgRW1haWxDb25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggQkxBTktfQ09OU1RSQUlOVCwgQmxhbmtDb25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggUkFOR0VfQ09OU1RSQUlOVCwgUmFuZ2VDb25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggSU5fTElTVF9DT05TVFJBSU5ULCBJbkxpc3RDb25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggVVJMX0NPTlNUUkFJTlQsIFVybENvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBMRU5HVEhfQ09OU1RSQUlOVCwgU2l6ZUNvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBTSVpFX0NPTlNUUkFJTlQsIFNpemVDb25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggTUFUQ0hFU19DT05TVFJBSU5ULCBNYXRjaGVzQ29uc3RyYWludC5jbGFzcyApOwotCQljb25zdHJhaW50cy5wdXQoIE1JTl9DT05TVFJBSU5ULCBNaW5Db25zdHJhaW50LmNsYXNzICk7Ci0JCWNvbnN0cmFpbnRzLnB1dCggTUFYX0NPTlNUUkFJTlQsIE1heENvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBNQVhfU0laRV9DT05TVFJBSU5ULCBNYXhTaXplQ29uc3RyYWludC5jbGFzcyApOwotCQljb25zdHJhaW50cy5wdXQoIE1BWF9MRU5HVEhfQ09OU1RSQUlOVCwgTWF4U2l6ZUNvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBNSU5fU0laRV9DT05TVFJBSU5ULCBNaW5TaXplQ29uc3RyYWludC5jbGFzcyApOwotCQljb25zdHJhaW50cy5wdXQoIE1JTl9MRU5HVEhfQ09OU1RSQUlOVCwgTWluU2l6ZUNvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBOVUxMQUJMRV9DT05TVFJBSU5ULCBOdWxsYWJsZUNvbnN0cmFpbnQuY2xhc3MgKTsKLQkJY29uc3RyYWludHMucHV0KCBOT1RfRVFVQUxfQ09OU1RSQUlOVCwgTm90RXF1YWxDb25zdHJhaW50LmNsYXNzICk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCAiZGVmYXVsdEVycm9yTWVzc2FnZXMiICk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ29uc3RyYWluZWRQcm9wZXJ0eS5jbGFzcyk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkxBTktfTUVTU0FHRSA9IGJ1bmRsZS5nZXRTdHJpbmcoICJkZWZhdWx0LmJsYW5rLm1lc3NhZ2UiICk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRE9FU05UX01BVENIX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5kb2VzbnQubWF0Y2gubWVzc2FnZSIgKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX1VSTF9NRVNTQUdFID0gYnVuZGxlLmdldFN0cmluZyggImRlZmF1bHQuaW52YWxpZC51cmwubWVzc2FnZSIgKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX0NSRURJVF9DQVJEX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLmNyZWRpdENhcmQubWVzc2FnZSIgKTsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVkFMSURfTUVTU0FHRSA9IGJ1bmRsZS5nZXRTdHJpbmcoICJkZWZhdWx0LmludmFsaWQubWVzc2FnZSIgKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX0VNQUlMX01FU1NBR0UgID0gYnVuZGxlLmdldFN0cmluZyggImRlZmF1bHQuaW52YWxpZC5lbWFpbC5tZXNzYWdlIiApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVkFMSURfUkFOR0VfTUVTU0FHRSA9IGJ1bmRsZS5nZXRTdHJpbmcoICJkZWZhdWx0LmludmFsaWQucmFuZ2UubWVzc2FnZSIgKTsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTk9UX0lOX0xJU1RfTUVTU0FHRSA9IGJ1bmRsZS5nZXRTdHJpbmcoICJkZWZhdWx0Lm5vdC5pbmxpc3QubWVzc2FnZSIgKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX1NJWkVfTUVTU0FHRSA9IGJ1bmRsZS5nZXRTdHJpbmcoICJkZWZhdWx0LmludmFsaWQuc2l6ZS5tZXNzYWdlIiApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVkFMSURfTEVOR1RIX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLmxlbmd0aC5tZXNzYWdlIiApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVkFMSURfTUFYX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1heC5tZXNzYWdlIiApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVkFMSURfTUlOX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1pbi5tZXNzYWdlIiApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05PVF9FUVVBTF9NRVNTQUdFID0gYnVuZGxlLmdldFN0cmluZyggImRlZmF1bHQubm90LmVxdWFsLm1lc3NhZ2UiICk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5WQUxJRF9NQVhfTEVOR1RIX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1heC5sZW5ndGgubWVzc2FnZSIgKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX01BWF9TSVpFX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1heC5zaXplLm1lc3NhZ2UiICk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5WQUxJRF9NSU5fTEVOR1RIX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1pbi5sZW5ndGgubWVzc2FnZSIgKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlZBTElEX01JTl9TSVpFX01FU1NBR0UgPSBidW5kbGUuZ2V0U3RyaW5nKCAiZGVmYXVsdC5pbnZhbGlkLm1pbi5zaXplLm1lc3NhZ2UiICk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTlVMTF9NRVNTQUdFID0gYnVuZGxlLmdldFN0cmluZyggImRlZmF1bHQubnVsbC5tZXNzYWdlIiApOwotCS8vIG1vdmUgdGhlc2UgdG8gc3ViY2xhc3MJCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQlwcm90ZWN0ZWQgQ2xhc3MgcHJvcGVydHlUeXBlOwotCQotCXByb3RlY3RlZCBNYXAgYXBwbGllZENvbnN0cmFpbnRzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgQ2xhc3Mgb3duaW5nQ2xhc3M7Ci0JcHJpdmF0ZSBCZWFuV3JhcHBlciBiZWFuOwotCQotCS8vIHNpbXBsZSBjb25zdHJhaW50cwotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5ID0gdHJ1ZTsgLy8gd2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGRpc3BsYXllZAotCXByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7IC8vIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGVkaXRhYmxlCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbGU7IC8vIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGEgZmlsZQotICAgIHByaXZhdGUgaW50IG9yZGVyOyAvLyB3aGF0IG9yZGVyIHRvIHByb3BlcnR5IGFwcGVhcnMgaW4KLSAgICBwcml2YXRlIFN0cmluZyBmb3JtYXQ7IC8vIHRoZSBmb3JtYXQgb2YgdGhlIHByb3BlcnR5IChmb3IgZXhhbXBsZSBhIGRhdGUgcGF0dGVybikKLSAgICBwcml2YXRlIFN0cmluZyB3aWRnZXQ7IC8vIHRoZSB3aWRnZXQgdG8gdXNlIHRvIHJlbmRlciB0aGUgcHJvcGVydHkKLSAgICBwcml2YXRlIGJvb2xlYW4gcGFzc3dvcmQ7IC8vIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGEgcGFzc3dvcmQKLSAgICBwcml2YXRlIE1hcCBhdHRyaWJ1dGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOyAvLyBhIG1hcCBvZiBhdHRyaWJ1dGVzIG9mIHByb3BlcnR5Ci0KLQotICAgIC8qKgotCSAqIAotCSAqIEFic3RyYWN0IGNsYXNzIGZvciBjb25zdHJhaW50cyB0byBpbXBsZW1lbnQKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFic3RyYWN0Q29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWU7Ci0JCXByb3RlY3RlZCBDbGFzcyBjb25zdHJhaW50T3duaW5nQ2xhc3M7Ci0JCXByb3RlY3RlZCBPYmplY3QgY29uc3RyYWludFBhcmFtZXRlcjsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc1Nob3J0TmFtZTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnRQcm9wZXJ0eU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLQkJICogQHBhcmFtIGNvbnN0cmFpbnRPd25pbmdDbGFzcyBUaGUgY29uc3RyYWludE93bmluZ0NsYXNzIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE93bmluZ0NsYXNzKENsYXNzIGNvbnN0cmFpbnRPd25pbmdDbGFzcykgewotCQkJdGhpcy5jb25zdHJhaW50T3duaW5nQ2xhc3MgPSBjb25zdHJhaW50T3duaW5nQ2xhc3M7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzU2hvcnROYW1lID0gR3JhaWxzQ2xhc3NVdGlscy5nZXRQcm9wZXJ0eU5hbWVSZXByZXNlbnRhdGlvbihjb25zdHJhaW50T3duaW5nQ2xhc3MpOwotICAgICAgICB9Ci0JCS8qKgotCQkgKiBAcGFyYW0gY29uc3RyYWludFByb3BlcnR5TmFtZSBUaGUgY29uc3RyYWludFByb3BlcnR5TmFtZSB0byBzZXQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUpIHsKLQkJCXRoaXMuY29uc3RyYWludFByb3BlcnR5TmFtZSA9IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWU7Ci0JCX0JCQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gY29uc3RyYWludFBhcmFtZXRlciBUaGUgY29uc3RyYWludFBhcmFtZXRlciB0byBzZXQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoT2JqZWN0IGNvbnN0cmFpbnRQYXJhbWV0ZXIpIHsKLQkJCXRoaXMuY29uc3RyYWludFBhcmFtZXRlciA9IGNvbnN0cmFpbnRQYXJhbWV0ZXI7Ci0JCX0KLQkJcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLQkJCS8vVmFsaWRhdGlvblV0aWxzLnJlamVjdElmRW1wdHkoIGVycm9ycywgY29uc3RyYWludFByb3BlcnR5TmFtZSwgY29uc3RyYWludFByb3BlcnR5TmFtZSsiLmVtcHR5IiApOwotCQkJaWYoU3RyaW5nVXRpbHMuaXNCbGFuayh0aGlzLmNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb3BlcnR5ICdwcm9wZXJ0eU5hbWUnIG11c3QgYmUgc2V0IG9uIHRoZSBjb25zdHJhaW50Iik7Ci0JCQlpZihjb25zdHJhaW50T3duaW5nQ2xhc3MgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9wZXJ0eSAnb3duaW5nQ2xhc3MnIG11c3QgYmUgc2V0IG9uIHRoZSBjb25zdHJhaW50Iik7Ci0JCQlpZihjb25zdHJhaW50UGFyYW1ldGVyID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvcGVydHkgJ2NvbnN0cmFpbnRQYXJhbWV0ZXInIG11c3QgYmUgc2V0IG9uIHRoZSBjb25zdHJhaW50Iik7Ci0JCQkKLQkJCXByb2Nlc3NWYWxpZGF0ZShwcm9wZXJ0eVZhbHVlLCBlcnJvcnMpOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVqZWN0VmFsdWUoRXJyb3JzIGVycm9ycywgU3RyaW5nIGNvZGUsU3RyaW5nIGRlZmF1bHRNZXNzYWdlKSB7Ci0JCQllcnJvcnMucmVqZWN0VmFsdWUoY29uc3RyYWludFByb3BlcnR5TmFtZSxjbGFzc1Nob3J0TmFtZSArICcuJyAgKyBjb25zdHJhaW50UHJvcGVydHlOYW1lICsgJy4nICsgY29kZSwgZGVmYXVsdE1lc3NhZ2UpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlamVjdFZhbHVlKEVycm9ycyBlcnJvcnMsIFN0cmluZyBjb2RlLE9iamVjdFtdIGFyZ3MsU3RyaW5nIGRlZmF1bHRNZXNzYWdlKSB7Ci0JCQllcnJvcnMucmVqZWN0VmFsdWUoY29uc3RyYWludFByb3BlcnR5TmFtZSxjbGFzc1Nob3J0TmFtZSArICcuJyAgKyBjb25zdHJhaW50UHJvcGVydHlOYW1lICsgJy4nICsgY29kZSwgYXJncyxkZWZhdWx0TWVzc2FnZSk7Ci0JCX0JCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpOwotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzKQotCQkJCQkJCS5hcHBlbmQoIGNvbnN0cmFpbnRQYXJhbWV0ZXIgKQotCQkJCQkJCS50b1N0cmluZygpOwotCQl9Ci0JCQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQSBDb25zdHJhaW50IHRoYXQgdmFsaWRhdGVzIG5vdCBlcXVhbCB0byBzb21ldGhpbmcKLQkgKi8JCQotCXN0YXRpYyBjbGFzcyBOb3RFcXVhbENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQgewotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBOT1RfRVFVQUxfQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5vdEVxdWFsVG8uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE5vdEVxdWFsVG8oKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50UGFyYW1ldGVyOwotICAgICAgICB9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7CQkJCi0JCQlpZighdGhpcy5jb25zdHJhaW50UGFyYW1ldGVyLmVxdWFscyggcHJvcGVydHlWYWx1ZSApKSB7Ci0JCQkJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSwgY29uc3RyYWludFBhcmFtZXRlciAgfTsKLQkJCQlzdXBlci5yZWplY3RWYWx1ZSggZXJyb3JzLCBOT1RfRVFVQUxfQ09OU1RSQUlOVCxhcmdzLCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9OT1RfRVFVQUxfTUVTU0FHRSwgYXJncyApICk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JfQotCS8qKgotCSAqIEEgQ29uc3RyYWludCB0aGF0IHZhbGlkYXRlcyBub3QgZXF1YWwgdG8gc29tZXRoaW5nCi0JICovCQkKLQlzdGF0aWMgY2xhc3MgTnVsbGFibGVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHsKLQotCQlwcml2YXRlIGJvb2xlYW4gbnVsbGFibGU7Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBCb29sZWFuKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK05VTExBQkxFX0NPTlNUUkFJTlQrIl0gb2YgcHJvcGVydHkgWyIrY29uc3RyYWludFByb3BlcnR5TmFtZSsiXSBvZiBjbGFzcyBbIitjb25zdHJhaW50T3duaW5nQ2xhc3MrIl0gbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUiKTsKLQkJCQotCQkJdGhpcy5udWxsYWJsZSA9ICgoQm9vbGVhbiljb25zdHJhaW50UGFyYW1ldGVyKS5ib29sZWFuVmFsdWUoKTsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMQUJMRV9DT05TVFJBSU5UOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0gICAgICAgICAgICBpZighbnVsbGFibGUgJiYgcHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzc307Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoIGVycm9ycywgTlVMTEFCTEVfQ09OU1RSQUlOVCxhcmdzLCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9OVUxMX01FU1NBR0UsIGFyZ3MgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCQotCX0JCi0JLyoqCi0JICogQSBDb25zdHJhaW50IHRoYXQgdmFsaWRhdGVzIGEgc3RyaW5nIGlzIG5vdCBibGFuawotCSAqLwkKLQlzdGF0aWMgY2xhc3MgQmxhbmtDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBibGFuazsKLQkJCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlpZih0eXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5LkFic3RyYWN0Q29uc3RyYWludCNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihPYmplY3QgY29uc3RyYWludFBhcmFtZXRlcikgewotCQkJaWYoIShjb25zdHJhaW50UGFyYW1ldGVyIGluc3RhbmNlb2YgQm9vbGVhbikpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciBmb3IgY29uc3RyYWludCBbIitCTEFOS19DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgYmUgYSBib29sZWFuIHZhbHVlIik7Ci0JCQkKLQkJCXRoaXMuYmxhbmsgPSAoKEJvb2xlYW4pY29uc3RyYWludFBhcmFtZXRlcikuYm9vbGVhblZhbHVlKCk7Ci0JCQlzdXBlci5zZXRQYXJhbWV0ZXIoY29uc3RyYWludFBhcmFtZXRlcik7Ci0JCX0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkxBTktfQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSwgRXJyb3JzIGVycm9ycykgewotCi0gICAgICAgICAgICBpZighYmxhbmspIHsKLSAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsoKFN0cmluZylwcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcyB9OwotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoIGVycm9ycywgQkxBTktfQ09OU1RSQUlOVCxhcmdzLCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9CTEFOS19NRVNTQUdFLCBhcmdzICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotICAgIC8qKgotICAgICAqIEEgY29uc3RyYWludCBjbGFzcyB0aGF0IHZhbGlkYXRlcyBhIGNyZWRpdCBjYXJkIG51bWJlcgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBDcmVkaXRDYXJkQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjcmVkaXRDYXJkOwotCi0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0gICAgICAgICAgICBpZihjcmVkaXRDYXJkKSB7Ci0gICAgICAgICAgICAgICAgQ3JlZGl0Q2FyZFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ3JlZGl0Q2FyZFZhbGlkYXRvcigpOwotCi0gICAgICAgICAgICAgICAgaWYoIXZhbGlkYXRvci5pc1ZhbGlkKHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKSkgICkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHsgY29uc3RyYWludFByb3BlcnR5TmFtZSwgY29uc3RyYWludE93bmluZ0NsYXNzLCBwcm9wZXJ0eVZhbHVlIH07Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxDUkVESVRfQ0FSRF9DT05TVFJBSU5UICsgSU5WQUxJRF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX0NSRURJVF9DQVJEX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBCb29sZWFuKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIgZm9yIGNvbnN0cmFpbnQgWyIrRU1BSUxfQ09OU1RSQUlOVCsiXSBvZiBwcm9wZXJ0eSBbIitjb25zdHJhaW50UHJvcGVydHlOYW1lKyJdIG9mIGNsYXNzIFsiK2NvbnN0cmFpbnRPd25pbmdDbGFzcysiXSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSIpOwotCi0JCQl0aGlzLmNyZWRpdENhcmQgPSAoKEJvb2xlYW4pY29uc3RyYWludFBhcmFtZXRlcikuYm9vbGVhblZhbHVlKCk7Ci0JCQlzdXBlci5zZXRQYXJhbWV0ZXIoY29uc3RyYWludFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1JFRElUX0NBUkRfQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLSAgICAgICAgICAgIGlmKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLQkgKiAKLQkgKiBBIENvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgYW4gZW1haWwgYWRkcmVzcwotCSAqLwkKLQlzdGF0aWMgY2xhc3MgRW1haWxDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHsJCQkJCQkKLQotCQlwcml2YXRlIGJvb2xlYW4gZW1haWw7Ci0JCQotCQkKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCWlmKHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBCb29sZWFuKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK0VNQUlMX0NPTlNUUkFJTlQrIl0gb2YgcHJvcGVydHkgWyIrY29uc3RyYWludFByb3BlcnR5TmFtZSsiXSBvZiBjbGFzcyBbIitjb25zdHJhaW50T3duaW5nQ2xhc3MrIl0gbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUiKTsKLQkJCQotCQkJdGhpcy5lbWFpbCA9ICgoQm9vbGVhbiljb25zdHJhaW50UGFyYW1ldGVyKS5ib29sZWFuVmFsdWUoKTsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBFTUFJTF9DT05TVFJBSU5UOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0gICAgICAgICAgICBpZihlbWFpbCkgewotICAgICAgICAgICAgICAgIEVtYWlsVmFsaWRhdG9yIGVtYWlsVmFsaWRhdG9yID0gRW1haWxWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZighZW1haWxWYWxpZGF0b3IuaXNWYWxpZChwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkpICApIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSB9OwotICAgICAgICAgICAgICAgICAgICBzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsRU1BSUxfQ09OU1RSQUlOVCArIElOVkFMSURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9FTUFJTF9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBBIENvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgYSB1cmwKLQkgKi8JCQotCXN0YXRpYyBjbGFzcyBVcmxDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHsKLQotCQlwcml2YXRlIGJvb2xlYW4gdXJsOwotCQkKLQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlpZih0eXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5LkFic3RyYWN0Q29uc3RyYWludCNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihPYmplY3QgY29uc3RyYWludFBhcmFtZXRlcikgewotCQkJaWYoIShjb25zdHJhaW50UGFyYW1ldGVyIGluc3RhbmNlb2YgQm9vbGVhbikpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciBmb3IgY29uc3RyYWludCBbIitVUkxfQ09OU1RSQUlOVCsiXSBvZiBwcm9wZXJ0eSBbIitjb25zdHJhaW50UHJvcGVydHlOYW1lKyJdIG9mIGNsYXNzIFsiK2NvbnN0cmFpbnRPd25pbmdDbGFzcysiXSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSIpOwotCQkJCi0JCQl0aGlzLnVybCA9ICgoQm9vbGVhbiljb25zdHJhaW50UGFyYW1ldGVyKS5ib29sZWFuVmFsdWUoKTsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBVUkxfQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSwgRXJyb3JzIGVycm9ycykgewotICAgICAgICAgICAgaWYodXJsKSB7Ci0gICAgICAgICAgICAgICAgVXJsVmFsaWRhdG9yIHVybFZhbGlkYXRvciA9IG5ldyBVcmxWYWxpZGF0b3IoVXJsVmFsaWRhdG9yLkFMTE9XX0FMTF9TQ0hFTUVTICsgVXJsVmFsaWRhdG9yLkFMTE9XXzJfU0xBU0hFUyk7Ci0KLSAgICAgICAgICAgICAgICBpZighdXJsVmFsaWRhdG9yLmlzVmFsaWQocHJvcGVydHlWYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHsgY29uc3RyYWludFByb3BlcnR5TmFtZSwgY29uc3RyYWludE93bmluZ0NsYXNzLCBwcm9wZXJ0eVZhbHVlIH07Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxVUkxfQ09OU1RSQUlOVCArIElOVkFMSURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9VUkxfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJCi0JfQotCS8qKgotCSAqIAotCSAqIEEgQ29uc3RyYWludCB0aGF0IHZhbGlkYXRlcyBhIHJhbmdlCi0JICovCQotCXN0YXRpYyBjbGFzcyBSYW5nZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQgewotCQlSYW5nZSByYW5nZTsJCQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByYW5nZS4KLQkJICovCi0JCXB1YmxpYyBSYW5nZSBnZXRSYW5nZSgpIHsKLQkJCXJldHVybiByYW5nZTsKLQkJfQotCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCWlmKHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBDb21wYXJhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLQkJCQkJTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7Ci0JCX0KLQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBSYW5nZSkpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciBmb3IgY29uc3RyYWludCBbIitSQU5HRV9DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgYmUgYSBvZiB0eXBlIFtncm9vdnkubGFuZy5SYW5nZV0iKTsKLQkJCQotCQkJdGhpcy5yYW5nZSA9IChSYW5nZSljb25zdHJhaW50UGFyYW1ldGVyOwotCQkJc3VwZXIuc2V0UGFyYW1ldGVyKGNvbnN0cmFpbnRQYXJhbWV0ZXIpOwotCQl9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIFJBTkdFX0NPTlNUUkFJTlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLSAgICAgICAgICAgIGlmKCF0aGlzLnJhbmdlLmNvbnRhaW5zKHByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSwgcmFuZ2UuZ2V0RnJvbSgpLCByYW5nZS5nZXRUbygpICB9OwotCi0gICAgICAgICAgICAgICAgaWYocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxSQU5HRV9DT05TVFJBSU5UICsgSU5WQUxJRF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX1JBTkdFX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYocmFuZ2UuZ2V0RnJvbSgpLmNvbXBhcmVUbyggcHJvcGVydHlWYWx1ZSApID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLFNJWkVfQ09OU1RSQUlOVCArIFRPT1NNQUxMX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfU0laRV9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHJhbmdlLmdldFRvKCkuY29tcGFyZVRvKHByb3BlcnR5VmFsdWUpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxTSVpFX0NPTlNUUkFJTlQgKyBUT09CSUdfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9TSVpFX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBBIENvbnN0cmFpbnQgdGhhdCBpbXBsZW1lbnRzIGEgbWF4aW11bSB2YWx1ZSBjb25zdHJhaW50Ci0JICovCQkKLQlzdGF0aWMgY2xhc3MgTWF4Q29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7Ci0KLQotCQlwcml2YXRlIENvbXBhcmFibGUgbWF4VmFsdWU7Ci0JCQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhWYWx1ZS4KLQkJICovCi0JCXB1YmxpYyBDb21wYXJhYmxlIGdldE1heFZhbHVlKCkgewotCQkJcmV0dXJuIG1heFZhbHVlOwotCQl9Ci0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCWlmKHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBDb21wYXJhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLQkJCQkJTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7Ci0JCX0KLQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK01BWF9DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgW2phdmEubGFuZy5Db21wYXJhYmxlXSIpOwotCQkJCi0JCQl0aGlzLm1heFZhbHVlID0gKENvbXBhcmFibGUpY29uc3RyYWludFBhcmFtZXRlcjsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBNQVhfQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0gICAgICAgICAgICBpZihtYXhWYWx1ZS5jb21wYXJlVG8ocHJvcGVydHlWYWx1ZSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSwgbWF4VmFsdWUgIH07Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLE1BWF9DT05TVFJBSU5UICsgRVhDRUVERURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9NQVhfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBBIENvbnN0cmFpbnQgdGhhdCBpbXBsZW1lbnRzIGEgbWluaW11bSB2YWx1ZSBjb25zdHJhaW50Ci0JICovCQkKLQlzdGF0aWMgY2xhc3MgTWluQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7Ci0KLQkJcHJpdmF0ZSBDb21wYXJhYmxlIG1pblZhbHVlOwotCi0JCQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBtaW5WYWx1ZS4KLQkJICovCi0JCXB1YmxpYyBDb21wYXJhYmxlIGdldE1pblZhbHVlKCkgewotCQkJcmV0dXJuIG1pblZhbHVlOwotCQl9Ci0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCWlmKHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBDb21wYXJhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLQkJCQkJTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7Ci0JCX0KLQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK01JTl9DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgW2phdmEubGFuZy5Db21wYXJhYmxlXSIpOwotCQkJCi0JCQl0aGlzLm1pblZhbHVlID0gKENvbXBhcmFibGUpY29uc3RyYWludFBhcmFtZXRlcjsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBNSU5fQ09OU1RSQUlOVDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKQkJewotICAgICAgICAgICAgaWYobWluVmFsdWUuY29tcGFyZVRvKHByb3BlcnR5VmFsdWUpIDwgMCkgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBjb25zdHJhaW50UHJvcGVydHlOYW1lLCBjb25zdHJhaW50T3duaW5nQ2xhc3MsIHByb3BlcnR5VmFsdWUsIG1pblZhbHVlICB9OwotICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxNSU5fQ09OU1RSQUlOVCArIE5PVE1FVF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX01JTl9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JfQkKLQkvKioKLQkgKiBBIGNvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgdGhlIHByb3BlcnR5IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cHBsaWVkIGxpc3QKLQkgKi8JCi0Jc3RhdGljIGNsYXNzIEluTGlzdENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQgewotCi0JCUxpc3QgbGlzdDsKLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0LgotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBMaXN0KSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK0lOX0xJU1RfQ09OU1RSQUlOVCsiXSBvZiBwcm9wZXJ0eSBbIitjb25zdHJhaW50UHJvcGVydHlOYW1lKyJdIG9mIGNsYXNzIFsiK2NvbnN0cmFpbnRPd25pbmdDbGFzcysiXSBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIFtqYXZhLnV0aWwuTGlzdF0iKTsKLQkJCQotCQkJdGhpcy5saXN0ID0gKExpc3QpY29uc3RyYWludFBhcmFtZXRlcjsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBJTl9MSVNUX0NPTlNUUkFJTlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLSAgICAgICAgICAgIGlmKCF0aGlzLmxpc3QuY29udGFpbnMocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHsgY29uc3RyYWludFByb3BlcnR5TmFtZSwgY29uc3RyYWludE93bmluZ0NsYXNzLCBwcm9wZXJ0eVZhbHVlLCBsaXN0ICB9OwotICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxOT1RfUFJFRklYICsgSU5fTElTVF9DT05TVFJBSU5ULGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfTk9UX0lOX0xJU1RfTUVTU0FHRSxhcmdzICkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBBIGNvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgdGhlIHByb3BlcnR5IGFnYWluc3QgYSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24KLQkgKi8JCQotCXN0YXRpYyBjbGFzcyBNYXRjaGVzQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgcmVnZXg7Ci0JCQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByZWdleC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVnZXgoKSB7Ci0JCQlyZXR1cm4gcmVnZXg7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCWlmKHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBTdHJpbmcpKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIgZm9yIGNvbnN0cmFpbnQgWyIrTUFUQ0hFU19DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgYmUgb2YgdHlwZSBbamF2YS5sYW5nLlN0cmluZ10iKTsKLQkJCQotCQkJdGhpcy5yZWdleCA9IChTdHJpbmcpY29uc3RyYWludFBhcmFtZXRlcjsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBNQVRDSEVTX0NPTlNUUkFJTlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLSAgICAgICAgICAgIGlmKHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKS5tYXRjaGVzKCByZWdleCApKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSwgcmVnZXggIH07Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLE1BVENIRVNfQ09OU1RSQUlOVCArIElOVkFMSURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfRE9FU05UX01BVENIX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQSBjb25zdHJhaW50IHRoYXQgdmFsaWRhdGVzIHNpemUgb2YgdGhlIHByb3BlcnR5LCBmb3Igc3RyaW5ncyBhbmQgYXJyYXlzIHRoaXMgaXMgdGhlIGxlbmd0aCwgY29sbGVjdGlvbnMKLQkgKiB0aGUgc2l6ZSBhbmQgbnVtYmVycyB0aGUgdmFsdWUKLQkgKi8JCQotCXN0YXRpYyBjbGFzcyBTaXplQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7Ci0KLQkJcHJpdmF0ZSBJbnRSYW5nZSByYW5nZTsKLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByYW5nZS4KLQkJICovCi0JCXB1YmxpYyBJbnRSYW5nZSBnZXRSYW5nZSgpIHsKLQkJCXJldHVybiByYW5nZTsKLQkJfQotCQkKLQkJCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzcyB0eXBlKSB7Ci0JCQlpZih0eXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlyZXR1cm4gQ29tcGFyYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpIHx8Ci0JCQkJCU51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpIHx8Ci0JCQkJCUNvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSB8fAotCQkJCQl0eXBlLmlzQXJyYXkoKTsKLQkJfQotCi0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5LkFic3RyYWN0Q29uc3RyYWludCNzZXRQYXJhbWV0ZXIoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihPYmplY3QgY29uc3RyYWludFBhcmFtZXRlcikgewotCQkJaWYoIShjb25zdHJhaW50UGFyYW1ldGVyIGluc3RhbmNlb2YgSW50UmFuZ2UpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciBmb3IgY29uc3RyYWludCBbIitTSVpFX0NPTlNUUkFJTlQrIl0gb2YgcHJvcGVydHkgWyIrY29uc3RyYWludFByb3BlcnR5TmFtZSsiXSBvZiBjbGFzcyBbIitjb25zdHJhaW50T3duaW5nQ2xhc3MrIl0gbXVzdCBiZSBhIG9mIHR5cGUgW2dyb292eS5sYW5nLkludFJhbmdlXSIpOwotCQkJCi0JCQl0aGlzLnJhbmdlID0gKEludFJhbmdlKWNvbnN0cmFpbnRQYXJhbWV0ZXI7Ci0JCQlzdXBlci5zZXRQYXJhbWV0ZXIoY29uc3RyYWludFBhcmFtZXRlcik7Ci0JCX0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU0laRV9DT05TVFJBSU5UOwotICAgICAgICB9Ci0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLQotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIGNvbnN0cmFpbnRPd25pbmdDbGFzcywgcHJvcGVydHlWYWx1ZSwgIHJhbmdlLmdldEZyb20oKSwgcmFuZ2UuZ2V0VG8oKSAgfTsKLSAgICAgICAgICAgIGlmKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxTSVpFX0NPTlNUUkFJTlQgKyBJTlZBTElEX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfU0laRV9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGxlbmd0aCA9IG5ldyBJbnRlZ2VyKEFycmF5LmdldExlbmd0aCggcHJvcGVydHlWYWx1ZSApKTsKLSAgICAgICAgICAgICAgICBpZighcmFuZ2UuY29udGFpbnMobGVuZ3RoKSkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmKHJhbmdlLmdldEZyb20oKS5jb21wYXJlVG8oIGxlbmd0aCApID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxMRU5HVEhfQ09OU1RSQUlOVCArIFRPT1NIT1JUX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfTEVOR1RIX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihyYW5nZS5nZXRUbygpLmNvbXBhcmVUbyhsZW5ndGgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsTEVOR1RIX0NPTlNUUkFJTlQgKyBUT09MT05HX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfTEVOR1RIX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBjb2xsZWN0aW9uU2l6ZSA9IG5ldyBJbnRlZ2VyKCgoQ29sbGVjdGlvbilwcm9wZXJ0eVZhbHVlKS5zaXplKCkpOwotICAgICAgICAgICAgICAgIGlmKCFyYW5nZS5jb250YWlucyggY29sbGVjdGlvblNpemUgKSkgewotICAgICAgICAgICAgICAgICAgICBpZihyYW5nZS5nZXRGcm9tKCkuY29tcGFyZVRvKCBjb2xsZWN0aW9uU2l6ZSApID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxTSVpFX0NPTlNUUkFJTlQgKyBUT09TTUFMTF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX1NJWkVfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJhbmdlLmdldFRvKCkuY29tcGFyZVRvKGNvbGxlY3Rpb25TaXplKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLFNJWkVfQ09OU1RSQUlOVCArIFRPT0JJR19TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX1NJWkVfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgIGlmKHJhbmdlLmdldEZyb20oKS5jb21wYXJlVG8oIHByb3BlcnR5VmFsdWUgKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxTSVpFX0NPTlNUUkFJTlQgKyBUT09TTUFMTF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX1NJWkVfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihyYW5nZS5nZXRUbygpLmNvbXBhcmVUbyhwcm9wZXJ0eVZhbHVlKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsU0laRV9DT05TVFJBSU5UICsgVE9PQklHX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfU0laRV9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIEludGVnZXIgc3RyaW5nTGVuZ3RoID0gIG5ldyBJbnRlZ2VyKCgoU3RyaW5nKXByb3BlcnR5VmFsdWUgKS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYoIXJhbmdlLmNvbnRhaW5zKHN0cmluZ0xlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocmFuZ2UuZ2V0RnJvbSgpLmNvbXBhcmVUbyggc3RyaW5nTGVuZ3RoICkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLExFTkdUSF9DT05TVFJBSU5UICsgVE9PU0hPUlRfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9MRU5HVEhfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJhbmdlLmdldFRvKCkuY29tcGFyZVRvKHN0cmluZ0xlbmd0aCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxMRU5HVEhfQ09OU1RSQUlOVCArIFRPT0xPTkdfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9MRU5HVEhfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBBIGNvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgbWF4aW11bSBzaXplIG9mIHRoZSBwcm9wZXJ0eSwgZm9yIHN0cmluZ3MgYW5kIGFycmF5cyB0aGlzIGlzIHRoZSBsZW5ndGgsIGNvbGxlY3Rpb25zCi0JICogdGhlIHNpemUgYW5kIG51bWJlcnMgdGhlIHZhbHVlCi0JICovCQkKLQlzdGF0aWMgY2xhc3MgTWF4U2l6ZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQgewotCi0JCXByaXZhdGUgaW50IG1heFNpemU7Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWF4U2l6ZS4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TWF4U2l6ZSgpIHsKLQkJCXJldHVybiBtYXhTaXplOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBJbnRlZ2VyKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK01BWF9TSVpFX0NPTlNUUkFJTlQrIl0gb2YgcHJvcGVydHkgWyIrY29uc3RyYWludFByb3BlcnR5TmFtZSsiXSBvZiBjbGFzcyBbIitjb25zdHJhaW50T3duaW5nQ2xhc3MrIl0gbXVzdCBiZSBhIG9mIHR5cGUgW2phdmEubGFuZy5JbnRlZ2VyXSIpOwotCQkJCi0JCQl0aGlzLm1heFNpemUgPSAoKEludGVnZXIpY29uc3RyYWludFBhcmFtZXRlcikuaW50VmFsdWUoKTsKLQkJCXN1cGVyLnNldFBhcmFtZXRlcihjb25zdHJhaW50UGFyYW1ldGVyKTsKLQkJfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBNQVhfU0laRV9DT05TVFJBSU5UOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW50I3N1cHBvcnRzKGphdmEubGFuZy5DbGFzcykKLSAgICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3MgdHlwZSkgewotICAgICAgICAgICAgaWYodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgcmV0dXJuIENvbXBhcmFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgdHlwZS5pc0FycmF5KCk7Ci0gICAgICAgIH0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBjb25zdHJhaW50UHJvcGVydHlOYW1lLCBjb25zdHJhaW50T3duaW5nQ2xhc3MsIHByb3BlcnR5VmFsdWUsIG5ldyBJbnRlZ2VyKG1heFNpemUpIH07Ci0JCQlpZihwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsKLQkJCQlzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsTUFYX0xFTkdUSF9DT05TVFJBSU5UICsgRVhDRUVERURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9NQVhfTEVOR1RIX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICB9Ci0JCQllbHNlIGlmKHByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKCBwcm9wZXJ0eVZhbHVlICk7Ci0JCQkJaWYobGVuZ3RoID4gbWF4U2l6ZSkgewotCQkJCQlzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsTUFYX0xFTkdUSF9DT05TVFJBSU5UICsgRVhDRUVERURfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9NQVhfTEVOR1RIX01FU1NBR0UsIGFyZ3MgKSk7Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQkJZWxzZSBpZihwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGlmICgoKENvbGxlY3Rpb24pIHByb3BlcnR5VmFsdWUpLnNpemUoKSA+IG1heFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLCBNQVhfU0laRV9DT05TVFJBSU5UICsgRVhDRUVERURfU1VGRklYLCBhcmdzLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChERUZBVUxUX0lOVkFMSURfTUFYX1NJWkVfTUVTU0FHRSwgYXJncykpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyU2l6ZSA9ICgoTnVtYmVyKSBwcm9wZXJ0eVZhbHVlKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyU2l6ZSA+IG1heFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnJlamVjdFZhbHVlKGVycm9ycywgTUFYX1NJWkVfQ09OU1RSQUlOVCArIEVYQ0VFREVEX1NVRkZJWCwgYXJncywgTWVzc2FnZUZvcm1hdC5mb3JtYXQoREVGQVVMVF9JTlZBTElEX01BWF9TSVpFX01FU1NBR0UsIGFyZ3MpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoKChTdHJpbmcpIHByb3BlcnR5VmFsdWUpLmxlbmd0aCgpID4gbWF4U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsIE1BWF9MRU5HVEhfQ09OU1RSQUlOVCArIEVYQ0VFREVEX1NVRkZJWCwgYXJncywgTWVzc2FnZUZvcm1hdC5mb3JtYXQoREVGQVVMVF9JTlZBTElEX01BWF9MRU5HVEhfTUVTU0FHRSwgYXJncykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBBIGNvbnN0cmFpbnQgdGhhdCB2YWxpZGF0ZXMgbWluaW11bSBzaXplIG9yIGxlbmd0aCBvZiB0aGUgcHJvcGVydHksIGZvciBzdHJpbmdzIGFuZCBhcnJheXMgdGhpcyBpcyB0aGUgbGVuZ3RoLCBjb2xsZWN0aW9ucwotCSAqIHRoZSBzaXplIGFuZCBudW1iZXJzIHRoZSB2YWx1ZQotCSAqLwkJCi0Jc3RhdGljIGNsYXNzIE1pblNpemVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHsKLQotCQlwcml2YXRlIGludCBtaW5TaXplOwotCi0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWluU2l6ZS4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TWluU2l6ZSgpIHsKLQkJCXJldHVybiBtaW5TaXplOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eS5BYnN0cmFjdENvbnN0cmFpbnQjc2V0UGFyYW1ldGVyKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoT2JqZWN0IGNvbnN0cmFpbnRQYXJhbWV0ZXIpIHsKLQkJCWlmKCEoY29uc3RyYWludFBhcmFtZXRlciBpbnN0YW5jZW9mIEludGVnZXIpKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIgZm9yIGNvbnN0cmFpbnQgWyIrTUlOX1NJWkVfQ09OU1RSQUlOVCsiXSBvZiBwcm9wZXJ0eSBbIitjb25zdHJhaW50UHJvcGVydHlOYW1lKyJdIG9mIGNsYXNzIFsiK2NvbnN0cmFpbnRPd25pbmdDbGFzcysiXSBtdXN0IGJlIGEgb2YgdHlwZSBbamF2YS5sYW5nLkludGVnZXJdIik7Ci0JCQkKLQkJCXRoaXMubWluU2l6ZSA9ICgoSW50ZWdlciljb25zdHJhaW50UGFyYW1ldGVyKS5pbnRWYWx1ZSgpOwotCQkJc3VwZXIuc2V0UGFyYW1ldGVyKGNvbnN0cmFpbnRQYXJhbWV0ZXIpOwotCQl9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIE1JTl9TSVpFX0NPTlNUUkFJTlQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludCNzdXBwb3J0cyhqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLSAgICAgICAgICAgIGlmKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIHJldHVybiBDb21wYXJhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUuaXNBcnJheSgpOwotICAgICAgICB9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUsIEVycm9ycyBlcnJvcnMpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBjb25zdHJhaW50UHJvcGVydHlOYW1lLCBjb25zdHJhaW50T3duaW5nQ2xhc3MsIHByb3BlcnR5VmFsdWUsIG5ldyBJbnRlZ2VyKG1pblNpemUpIH07Ci0JCQlpZihwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsKLQkJCQlzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsTUlOX0xFTkdUSF9DT05TVFJBSU5UICsgTk9UTUVUX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfTUlOX0xFTkdUSF9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgfQotCQkJZWxzZSBpZihwcm9wZXJ0eVZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCggcHJvcGVydHlWYWx1ZSApOwotCQkJCWlmKGxlbmd0aCA8IG1pblNpemUpIHsKLQkJCQkJc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLE1JTl9MRU5HVEhfQ09OU1RSQUlOVCArIE5PVE1FVF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX01JTl9MRU5HVEhfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQllbHNlIGlmKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJaWYoICgoQ29sbGVjdGlvbilwcm9wZXJ0eVZhbHVlKS5zaXplKCkgPCBtaW5TaXplICkgewotCQkJCQlzdXBlci5yZWplY3RWYWx1ZShlcnJvcnMsTUlOX1NJWkVfQ09OU1RSQUlOVCArIE5PVE1FVF9TVUZGSVgsYXJncyxNZXNzYWdlRm9ybWF0LmZvcm1hdCggREVGQVVMVF9JTlZBTElEX01JTl9TSVpFX01FU1NBR0UsIGFyZ3MgKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CQkJCQotCQkJCWludCBudW1iZXJTaXplID0gKChOdW1iZXIpcHJvcGVydHlWYWx1ZSkuaW50VmFsdWUoKTsKLQkJCQlpZiggbnVtYmVyU2l6ZSA8IG1pblNpemUgKSB7Ci0JCQkJCXN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxNSU5fU0laRV9DT05TVFJBSU5UICsgTk9UTUVUX1NVRkZJWCxhcmdzLE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBERUZBVUxUX0lOVkFMSURfTUlOX1NJWkVfTUVTU0FHRSwgYXJncyApKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQllbHNlIGlmKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpZigoKFN0cmluZylwcm9wZXJ0eVZhbHVlICkubGVuZ3RoKCkgPCBtaW5TaXplKSB7Ci0JCQkJCXN1cGVyLnJlamVjdFZhbHVlKGVycm9ycyxNSU5fTEVOR1RIX0NPTlNUUkFJTlQgKyBOT1RNRVRfU1VGRklYLGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfSU5WQUxJRF9NSU5fTEVOR1RIX01FU1NBR0UsIGFyZ3MgKSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9CQotCQotCXB1YmxpYyBDb25zdHJhaW5lZFByb3BlcnR5KENsYXNzIGNsYXp6LFN0cmluZyBwcm9wZXJ0eU5hbWUsIENsYXNzIHByb3BlcnR5VHlwZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmluZ0NsYXNzID0gY2xheno7Ci0JCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQl0aGlzLnByb3BlcnR5VHlwZSA9IHByb3BlcnR5VHlwZTsKLQkJdGhpcy5iZWFuID0gbmV3IEJlYW5XcmFwcGVySW1wbCh0aGlzKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFwcGxpZWRDb25zdHJhaW50cy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBcHBsaWVkQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBhcHBsaWVkQ29uc3RyYWludHMudmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXJ0eVR5cGUuCi0JICovCi0JcHVibGljIENsYXNzIGdldFByb3BlcnR5VHlwZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5VHlwZTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWF4LgotCSAqLwotCXB1YmxpYyBDb21wYXJhYmxlIGdldE1heCgpIHsKLQkJTWF4Q29uc3RyYWludCBjID0gKE1heENvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNQVhfQ09OU1RSQUlOVCApOwotCQlpZihjID09IG51bGwpIHsKLQkJCVJhbmdlIHIgPSBnZXRSYW5nZSgpOwotCQkJaWYociA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gci5nZXRUbygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjLmdldE1heFZhbHVlKCk7CQkKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXggVGhlIG1heCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4KENvbXBhcmFibGUgbWF4KSB7Ci0JCWlmKG1heCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5yZW1vdmUoIE1BWF9DT05TVFJBSU5UICk7Ci0JCQlyZXR1cm47Ci0JCX0KLSAgICAgICAgaWYoIXByb3BlcnR5VHlwZS5lcXVhbHMoIG1heC5nZXRDbGFzcygpICkpIHsKLQkJCXRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oTUFYX0NPTlNUUkFJTlQscHJvcGVydHlUeXBlKTsKLQkJfQotCQlSYW5nZSByID0gZ2V0UmFuZ2UoKTsKLQkJaWYociAhPSBudWxsKSB7Ci0JCQlMT0cud2FybigiUmFuZ2UgY29uc3RyYWludCBhbHJlYWR5IHNldCBpZ25vcmluZyBjb25zdHJhaW50IFsiK01BWF9DT05TVFJBSU5UKyJdIGZvciB2YWx1ZSBbIittYXgrIl0iKTsKLQkJCXJldHVybjsKLQkJfQotCQlDb25zdHJhaW50IGMgPSAoTWF4Q29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIE1BWF9DT05TVFJBSU5UICk7Ci0JCWlmKGMgIT0gbnVsbCkgewotCQkJYy5zZXRQYXJhbWV0ZXIobWF4KTsJCQotCQl9Ci0JCWVsc2UgewotCQkJYyA9IG5ldyBNYXhDb25zdHJhaW50KCk7Ci0JCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIobWF4KTsKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggTUFYX0NPTlNUUkFJTlQsIGMgKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtaW4uCi0JICovCi0JcHVibGljIENvbXBhcmFibGUgZ2V0TWluKCkgewotCQlNaW5Db25zdHJhaW50IGMgPSAoTWluQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIE1JTl9DT05TVFJBSU5UICk7Ci0JCWlmKGMgPT0gbnVsbCkgewotCQkJUmFuZ2UgciA9IGdldFJhbmdlKCk7Ci0JCQlpZihyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiByLmdldEZyb20oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYy5nZXRNaW5WYWx1ZSgpOwkJCi0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbWluIFRoZSBtaW4gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbihDb21wYXJhYmxlIG1pbikgewotCQlpZihtaW4gPT0gbnVsbCkgewotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucmVtb3ZlKCBNSU5fQ09OU1RSQUlOVCApOwotCQkJcmV0dXJuOwotCQl9Ci0gICAgICAgIGlmKCFwcm9wZXJ0eVR5cGUuZXF1YWxzKCBtaW4uZ2V0Q2xhc3MoKSApKSB7Ci0JCQl0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKE1JTl9DT05TVFJBSU5ULHByb3BlcnR5VHlwZSk7Ci0JCX0KLQkJUmFuZ2UgciA9IGdldFJhbmdlKCk7Ci0JCWlmKHIgIT0gbnVsbCkgewotCQkJTE9HLndhcm4oIlJhbmdlIGNvbnN0cmFpbnQgYWxyZWFkeSBzZXQgaWdub3JpbmcgY29uc3RyYWludCBbIitNSU5fQ09OU1RSQUlOVCsiXSBmb3IgdmFsdWUgWyIrbWluKyJdIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29uc3RyYWludCBjID0gKE1pbkNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNSU5fQ09OU1RSQUlOVCApOwotCQlpZihjICE9IG51bGwpIHsKLQkJCWMuc2V0UGFyYW1ldGVyKG1pbik7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQljID0gbmV3IE1pbkNvbnN0cmFpbnQoKTsKLQkJCWMuc2V0T3duaW5nQ2xhc3ModGhpcy5vd25pbmdDbGFzcyk7Ci0JCQljLnNldFByb3BlcnR5TmFtZSh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCQljLnNldFBhcmFtZXRlcihtaW4pOwkJCQotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBNSU5fQ09OU1RSQUlOVCwgYyApOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluTGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbkxpc3QoKSB7Ci0JCUluTGlzdENvbnN0cmFpbnQgYyA9IChJbkxpc3RDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggSU5fTElTVF9DT05TVFJBSU5UICk7Ci0JCWlmKGMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkJCi0JCXJldHVybiBjLmdldExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5MaXN0IFRoZSBpbkxpc3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluTGlzdChMaXN0IGluTGlzdCkgewotCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIElOX0xJU1RfQ09OU1RSQUlOVCApOwotCQlpZihpbkxpc3QgPT0gbnVsbCkgewotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucmVtb3ZlKCBJTl9MSVNUX0NPTlNUUkFJTlQgKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCWlmKGMgIT0gbnVsbCkgewotCQkJCWMuc2V0UGFyYW1ldGVyKGluTGlzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljID0gbmV3IEluTGlzdENvbnN0cmFpbnQoKTsKLQkJCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJCWMuc2V0UHJvcGVydHlOYW1lKHRoaXMucHJvcGVydHlOYW1lKTsKLQkJCQljLnNldFBhcmFtZXRlcihpbkxpc3QpOwkJCQotCQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggSU5fTElTVF9DT05TVFJBSU5ULCBjICk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJhbmdlLgotCSAqLwotCXB1YmxpYyBSYW5nZSBnZXRSYW5nZSgpIHsKLQkJUmFuZ2VDb25zdHJhaW50IGMgPSAoUmFuZ2VDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggUkFOR0VfQ09OU1RSQUlOVCApOwotCQlpZihjID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gYy5nZXRSYW5nZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmdlKFJhbmdlIHJhbmdlKSB7CQkJCQotCQlpZih0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleSggTUFYX0NPTlNUUkFJTlQgKSkgewotCQkJTE9HLndhcm4oIlNldHRpbmcgcmFuZ2UgY29uc3RyYWludCBvbiBwcm9wZXJ0eSBbIitwcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrb3duaW5nQ2xhc3MrIl0gZm9yY2VkIHJlbW92YWwgb2YgbWF4IGNvbnN0cmFpbnQiKTsKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZSggTUFYX0NPTlNUUkFJTlQgKTsKLQkJfQotCQlpZih0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleSggTUlOX0NPTlNUUkFJTlQgKSkgewotCQkJTE9HLndhcm4oIlNldHRpbmcgcmFuZ2UgY29uc3RyYWludCBvbiBwcm9wZXJ0eSBbIitwcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrb3duaW5nQ2xhc3MrIl0gZm9yY2VkIHJlbW92YWwgb2YgbWluIGNvbnN0cmFpbnQiKTsKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZSggTUlOX0NPTlNUUkFJTlQgKTsKLQkJfQotCQlpZihyYW5nZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5yZW1vdmUoIFJBTkdFX0NPTlNUUkFJTlQgKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldChSQU5HRV9DT05TVFJBSU5UKTsKLQkJCWlmKGMgIT0gbnVsbCkgewotCQkJCWMuc2V0UGFyYW1ldGVyKHJhbmdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWMgPSBuZXcgUmFuZ2VDb25zdHJhaW50KCk7Ci0JCQkJYy5zZXRPd25pbmdDbGFzcyh0aGlzLm93bmluZ0NsYXNzKTsKLQkJCQljLnNldFByb3BlcnR5TmFtZSh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCQkJYy5zZXRQYXJhbWV0ZXIocmFuZ2UpOwkJCi0JCQkJCi0JCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBSQU5HRV9DT05TVFJBSU5ULGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsZW5ndGguCi0JICovCi0JcHVibGljIEludFJhbmdlIGdldExlbmd0aCgpIHsKLQkJaWYoIShTdHJpbmcuY2xhc3MgPT0gcHJvcGVydHlUeXBlKSAmJiAhcHJvcGVydHlUeXBlLmlzQXJyYXkoKSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiTGVuZ3RoIGNvbnN0cmFpbnQgb25seSBhcHBsaWVzIHRvIGEgU3RyaW5nIG9yIEFycmF5IHByb3BlcnR5IixMRU5HVEhfQ09OU1RSQUlOVCxvd25pbmdDbGFzcyk7Ci0JCX0JCQotCQlTaXplQ29uc3RyYWludCBjID0gKFNpemVDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggTEVOR1RIX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJcmV0dXJuIGMuZ2V0UmFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRSYW5nZSBsZW5ndGgpIHsKLQkJaWYoIShTdHJpbmcuY2xhc3MgPT0gcHJvcGVydHlUeXBlKSAgJiYgIXByb3BlcnR5VHlwZS5pc0FycmF5KCkpIHsKLQkJCXRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oIkxlbmd0aCBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBTdHJpbmcgb3IgQXJyYXkgcHJvcGVydHkiLExFTkdUSF9DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLQkJfQkJCQotCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIExFTkdUSF9DT05TVFJBSU5UICk7Ci0JCWlmKGxlbmd0aCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5yZW1vdmUoIExFTkdUSF9DT05TVFJBSU5UICk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjICE9IG51bGwpIHsKLQkJCQljLnNldFBhcmFtZXRlcihsZW5ndGgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYyA9IG5ldyBTaXplQ29uc3RyYWludCgpOwotCQkJCWMuc2V0T3duaW5nQ2xhc3ModGhpcy5vd25pbmdDbGFzcyk7Ci0JCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJCWMuc2V0UGFyYW1ldGVyKGxlbmd0aCk7CQkJCQkKLQkJCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5wdXQoIExFTkdUSF9DT05TVFJBSU5ULCBjICk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpemUuCi0JICovCi0JcHVibGljIFJhbmdlIGdldFNpemUoKSB7Ci0JCVNpemVDb25zdHJhaW50IGMgPSAoU2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBTSVpFX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJcmV0dXJuIGMuZ2V0UmFuZ2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKFJhbmdlIHNpemUpIHsKLQkJQ29uc3RyYWludCBjID0gKENvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBTSVpFX0NPTlNUUkFJTlQgKTsKLQkJaWYoc2l6ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5yZW1vdmUoIFNJWkVfQ09OU1RSQUlOVCApOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJaWYoYyAhPSBudWxsKSB7Ci0JCQkJYy5zZXRQYXJhbWV0ZXIoc2l6ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljID0gbmV3IFNpemVDb25zdHJhaW50KCk7Ci0JCQkJYy5zZXRPd25pbmdDbGFzcyh0aGlzLm93bmluZ0NsYXNzKTsKLQkJCQljLnNldFByb3BlcnR5TmFtZSh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCQkJYy5zZXRQYXJhbWV0ZXIoc2l6ZSk7CQkJCQkKLQkJCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5wdXQoIFNJWkVfQ09OU1RSQUlOVCwgYyApOwotCQkJfQkJCQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJsYW5rLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmxhbmsoKSB7Ci0JCXJldHVybiB0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleShCTEFOS19DT05TVFJBSU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmxhbmsgVGhlIGJsYW5rIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbGFuayhib29sZWFuIGJsYW5rKSB7Ci0JCWlmKCFTdHJpbmcuY2xhc3MuaXNJbnN0YW5jZSggcHJvcGVydHlUeXBlICkpIHsKLQkJCXRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oIkJsYW5rIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIFN0cmluZyBwcm9wZXJ0eSIsQkxBTktfQ09OU1RSQUlOVCxvd25pbmdDbGFzcyk7Ci0JCX0KLQkJCi0JCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggQkxBTktfQ09OU1RSQUlOVCApOwotCQlpZihjICE9IG51bGwpIHsKLQkJCWMuc2V0UGFyYW1ldGVyKEJvb2xlYW4udmFsdWVPZihibGFuaykgKTsKLQkJfQotCQllbHNlIHsKLQkJCWMgPSBuZXcgQmxhbmtDb25zdHJhaW50KCk7Ci0JCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIoQm9vbGVhbi52YWx1ZU9mKGJsYW5rKSk7Ci0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5wdXQoIEJMQU5LX0NPTlNUUkFJTlQsYyApOwkJCQkKLQkJfQkJCi0KLQl9Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlbWFpbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtYWlsKCkgewotCQlpZighU3RyaW5nLmNsYXNzLmlzSW5zdGFuY2UoIHByb3BlcnR5VHlwZSApKSB7Ci0JCQl0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJFbWFpbCBjb25zdHJhaW50IG9ubHkgYXBwbGllcyB0byBhIFN0cmluZyBwcm9wZXJ0eSIsRU1BSUxfQ09OU1RSQUlOVCxvd25pbmdDbGFzcyk7Ci0JCX0KLQkJCi0JCXJldHVybiB0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleSggRU1BSUxfQ09OU1RSQUlOVCApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWFpbCBUaGUgZW1haWwgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYWlsKGJvb2xlYW4gZW1haWwpIHsKLQkJaWYoIVN0cmluZy5jbGFzcy5pc0luc3RhbmNlKCBwcm9wZXJ0eVR5cGUgKSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiRW1haWwgY29uc3RyYWludCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgU3RyaW5nIHByb3BlcnR5IixFTUFJTF9DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLQkJfQotCQkKLQkJQ29uc3RyYWludCBjID0gKENvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBFTUFJTF9DT05TVFJBSU5UICk7Ci0JCWlmKGVtYWlsKSB7CQkJCi0JCQlpZihjICE9IG51bGwpIHsKLQkJCQljLnNldFBhcmFtZXRlcihCb29sZWFuLnZhbHVlT2YoZW1haWwpICk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljID0gbmV3IEVtYWlsQ29uc3RyYWludCgpOwotCQkJCWMuc2V0T3duaW5nQ2xhc3ModGhpcy5vd25pbmdDbGFzcyk7Ci0JCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJCWMuc2V0UGFyYW1ldGVyKEJvb2xlYW4udmFsdWVPZihlbWFpbCkpOwotCQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggRU1BSUxfQ09OU1RSQUlOVCxjICk7CQkJCQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoYyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucmVtb3ZlKCBFTUFJTF9DT05TVFJBSU5UICk7Ci0JCQl9Ci0JCX0JCQotCi0JfQotCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNyZWRpdENhcmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDcmVkaXRDYXJkKCkgewotICAgICAgICBpZighU3RyaW5nLmNsYXNzLmlzSW5zdGFuY2UoIHByb3BlcnR5VHlwZSApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJDcmVkaXRDYXJkIGNvbnN0cmFpbnQgb25seSBhcHBsaWVzIHRvIGEgU3RyaW5nIHByb3BlcnR5IixDUkVESVRfQ0FSRF9DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleSggQ1JFRElUX0NBUkRfQ09OU1RSQUlOVCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjcmVkaXRDYXJkIFRoZSBjcmVkaXRDYXJkIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDcmVkaXRDYXJkKGJvb2xlYW4gY3JlZGl0Q2FyZCkgewotICAgICAgICBpZighU3RyaW5nLmNsYXNzLmlzSW5zdGFuY2UoIHByb3BlcnR5VHlwZSApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJDcmVkaXRDYXJkIGNvbnN0cmFpbnQgb25seSBhcHBsaWVzIHRvIGEgU3RyaW5nIHByb3BlcnR5IixDUkVESVRfQ0FSRF9DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggQ1JFRElUX0NBUkRfQ09OU1RSQUlOVCApOwotICAgICAgICBpZihjcmVkaXRDYXJkKSB7Ci0gICAgICAgICAgICBpZihjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLnNldFBhcmFtZXRlcihCb29sZWFuLnZhbHVlT2YoY3JlZGl0Q2FyZCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGMgPSBuZXcgQ3JlZGl0Q2FyZENvbnN0cmFpbnQoKTsKLSAgICAgICAgICAgICAgICBjLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotICAgICAgICAgICAgICAgIGMuc2V0UHJvcGVydHlOYW1lKHRoaXMucHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICBjLnNldFBhcmFtZXRlcihCb29sZWFuLnZhbHVlT2YoY3JlZGl0Q2FyZCkpOwotICAgICAgICAgICAgICAgIHRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggQ1JFRElUX0NBUkRfQ09OU1RSQUlOVCxjICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZihjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5yZW1vdmUoIENSRURJVF9DQVJEX0NPTlNUUkFJTlQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXRjaGVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hlcygpIHsKLQkJaWYoIVN0cmluZy5jbGFzcy5pc0luc3RhbmNlKCBwcm9wZXJ0eVR5cGUgKSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiTWF0Y2hlcyBjb25zdHJhaW50IG9ubHkgYXBwbGllcyB0byBhIFN0cmluZyBwcm9wZXJ0eSIsTUFUQ0hFU19DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLQkJfQkJCi0JCU1hdGNoZXNDb25zdHJhaW50IGMgPSAoTWF0Y2hlc0NvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNQVRDSEVTX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gYy5nZXRSZWdleCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdleCBUaGUgbWF0Y2hlcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0Y2hlcyhTdHJpbmcgcmVnZXgpIHsKLQkJaWYoIVN0cmluZy5jbGFzcy5pc0luc3RhbmNlKCBwcm9wZXJ0eVR5cGUgKSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiTWF0Y2hlcyBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBTdHJpbmcgcHJvcGVydHkiLE1BVENIRVNfQ09OU1RSQUlOVCxvd25pbmdDbGFzcyk7Ci0JCX0KLQkJCi0JCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggTUFUQ0hFU19DT05TVFJBSU5UICk7Ci0JCWlmKHJlZ2V4ID09IG51bGwpIHsKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZSggTUFUQ0hFU19DT05TVFJBSU5UICk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjICE9IG51bGwpIHsKLQkJCQljLnNldFBhcmFtZXRlciggcmVnZXggKTsJCQkJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQljID0gbmV3IE1hdGNoZXNDb25zdHJhaW50KCk7Ci0JCQkJYy5zZXRPd25pbmdDbGFzcyh0aGlzLm93bmluZ0NsYXNzKTsKLQkJCQljLnNldFByb3BlcnR5TmFtZSh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCQkJYy5zZXRQYXJhbWV0ZXIocmVnZXgpOwkJCQkJCi0JCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBNQVRDSEVTX0NPTlNUUkFJTlQsYyApOwkJCQkKLQkJCX0JCQkKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhMZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRNYXhMZW5ndGgoKSB7Ci0JCU1heFNpemVDb25zdHJhaW50IGMgPSAoTWF4U2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNQVhfTEVOR1RIX0NPTlNUUkFJTlQgKTsKLQotICAgICAgICBpZihjID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKHRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmNvbnRhaW5zS2V5KCBMRU5HVEhfQ09OU1RSQUlOVCApKSB7Ci0gICAgICAgICAgICAgICAgU2l6ZUNvbnN0cmFpbnQgc2MgPSAoU2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KExFTkdUSF9DT05TVFJBSU5UKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2MuZ2V0UmFuZ2UoKS5nZXRUb0ludCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICB9Ci0KLQkJCi0JCXJldHVybiBjLmdldE1heFNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBtYXhMZW5ndGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heExlbmd0aChpbnQgbWF4TGVuZ3RoKSB7Ci0JCUNvbnN0cmFpbnQgYyA9IChNYXhTaXplQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIE1BWF9MRU5HVEhfQ09OU1RSQUlOVCApOwotCQlpZiggYyAhPSBudWxsKSB7Ci0JCQljLnNldFBhcmFtZXRlciggbmV3IEludGVnZXIobWF4TGVuZ3RoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljID0gbmV3IE1heFNpemVDb25zdHJhaW50KCk7Ci0JCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIobmV3IEludGVnZXIobWF4TGVuZ3RoKSk7CQkJCQkKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggTUFYX0xFTkdUSF9DT05TVFJBSU5ULGMgKTsJCQkKLQkJfQkJCi0JfQotCi0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtaW5MZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRNaW5MZW5ndGgoKSB7Ci0JCU1pblNpemVDb25zdHJhaW50IGMgPSAoTWluU2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNSU5fTEVOR1RIX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZih0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleSggTEVOR1RIX0NPTlNUUkFJTlQgKSkgewotICAgICAgICAgICAgICAgIFNpemVDb25zdHJhaW50IHNjID0gKFNpemVDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldChMRU5HVEhfQ09OU1RSQUlOVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNjLmdldFJhbmdlKCkuZ2V0RnJvbUludCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotCQlyZXR1cm4gYy5nZXRNaW5TaXplKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbWluTGVuZ3RoIFRoZSBtaW5MZW5ndGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbkxlbmd0aChpbnQgbWluTGVuZ3RoKSB7Ci0JCUNvbnN0cmFpbnQgYyA9IChNaW5TaXplQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIE1JTl9MRU5HVEhfQ09OU1RSQUlOVCApOwotCQlpZiggYyAhPSBudWxsKSB7Ci0JCQljLnNldFBhcmFtZXRlciggbmV3IEludGVnZXIobWluTGVuZ3RoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljID0gbmV3IE1pblNpemVDb25zdHJhaW50KCk7Ci0JCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIobmV3IEludGVnZXIobWluTGVuZ3RoKSk7CQkJCQkKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggTUlOX0xFTkdUSF9DT05TVFJBSU5ULGMgKTsJCQkKLQkJfQkKLQl9Ci0KLQotCQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbm90RXF1YWwuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROb3RFcXVhbCgpIHsKLQkJTm90RXF1YWxDb25zdHJhaW50IGMgPSAoTm90RXF1YWxDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggTk9UX0VRVUFMX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJcmV0dXJuIGMuZ2V0Tm90RXF1YWxUbygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWF4U2l6ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heFNpemUoKSB7Ci0JCU1heFNpemVDb25zdHJhaW50IGMgPSAoTWF4U2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNQVhfU0laRV9DT05TVFJBSU5UICk7Ci0JCWlmKGMgPT0gbnVsbCkKLQkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCi0JCXJldHVybiBjLmdldE1heFNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWF6U2l6ZSBUaGUgbWF6U2l6ZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4U2l6ZShpbnQgbWF6U2l6ZSkgewotCQlDb25zdHJhaW50IGMgPSAoTWF4U2l6ZUNvbnN0cmFpbnQpdGhpcy5hcHBsaWVkQ29uc3RyYWludHMuZ2V0KCBNQVhfU0laRV9DT05TVFJBSU5UICk7Ci0JCWlmKCBjICE9IG51bGwpIHsKLQkJCWMuc2V0UGFyYW1ldGVyKCBuZXcgSW50ZWdlcihtYXpTaXplKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljID0gbmV3IE1heFNpemVDb25zdHJhaW50KCk7Ci0JCQljLnNldE93bmluZ0NsYXNzKHRoaXMub3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIobmV3IEludGVnZXIobWF6U2l6ZSkpOwkJCQkJCi0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5wdXQoIE1BWF9TSVpFX0NPTlNUUkFJTlQsYyApOwkJCQotCQl9CQkKLQl9Ci0KLQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pblNpemUuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5TaXplKCkgewotCQlNaW5TaXplQ29uc3RyYWludCBjID0gKE1pblNpemVDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggTUlOX1NJWkVfQ09OU1RSQUlOVCApOwotCQlpZihjID09IG51bGwpCi0JCQlyZXR1cm4gSW50ZWdlci5NSU5fVkFMVUU7Ci0JCQotCQlyZXR1cm4gYy5nZXRNaW5TaXplKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbWluU2l6ZSBUaGUgbWluTGVuZ3RoIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW5TaXplKGludCBtaW5TaXplKSB7Ci0JCUNvbnN0cmFpbnQgYyA9IChNaW5TaXplQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIE1JTl9TSVpFX0NPTlNUUkFJTlQgKTsKLQkJaWYoIGMgIT0gbnVsbCkgewotCQkJYy5zZXRQYXJhbWV0ZXIoIG5ldyBJbnRlZ2VyKG1pblNpemUpKTsKLQkJfQotCQllbHNlIHsKLQkJCWMgPSBuZXcgTWluU2l6ZUNvbnN0cmFpbnQoKTsKLQkJCWMuc2V0T3duaW5nQ2xhc3ModGhpcy5vd25pbmdDbGFzcyk7Ci0JCQljLnNldFByb3BlcnR5TmFtZSh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCQljLnNldFBhcmFtZXRlcihuZXcgSW50ZWdlcihtaW5TaXplKSk7CQkJCQkKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggTUlOX1NJWkVfQ09OU1RSQUlOVCxjICk7CQkJCi0JCX0JCi0JfQkKLQkvKioKLQkgKiBAcGFyYW0gbm90RXF1YWwgVGhlIG5vdEVxdWFsIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RFcXVhbChPYmplY3Qgbm90RXF1YWwpIHsKLQkJaWYobm90RXF1YWwgPT0gbnVsbCkgewotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucmVtb3ZlKCBOT1RfRVFVQUxfQ09OU1RSQUlOVCApOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJQ29uc3RyYWludCBjID0gbmV3IE5vdEVxdWFsQ29uc3RyYWludCgpOwotCQkJYy5zZXRPd25pbmdDbGFzcyhvd25pbmdDbGFzcyk7Ci0JCQljLnNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotCQkJYy5zZXRQYXJhbWV0ZXIobm90RXF1YWwpOwotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBOT1RfRVFVQUxfQ09OU1RSQUlOVCwgYyApOwotCQl9Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG51bGxhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5jb250YWluc0tleShOVUxMQUJMRV9DT05TVFJBSU5UKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBudWxsYWJsZSBUaGUgbnVsbGFibGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKGJvb2xlYW4gbnVsbGFibGUpIHsKLQkJaWYobnVsbGFibGUpIHsKLQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZShOVUxMQUJMRV9DT05TVFJBSU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbnN0cmFpbnQgYyA9IG5ldyBOdWxsYWJsZUNvbnN0cmFpbnQoKTsKLQkJCWMuc2V0T3duaW5nQ2xhc3Mob3duaW5nQ2xhc3MpOwotCQkJYy5zZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLQkJCWMuc2V0UGFyYW1ldGVyKEJvb2xlYW4udmFsdWVPZihudWxsYWJsZSkpOwotCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBOVUxMQUJMRV9DT05TVFJBSU5ULCBjICk7CQkJCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvcGVydHlOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5TmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVybC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VybCgpIHsKLQkJaWYoIVN0cmluZy5jbGFzcy5pc0luc3RhbmNlKCBwcm9wZXJ0eVR5cGUgKSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiVVJMIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIFN0cmluZyBwcm9wZXJ0eSIsVVJMX0NPTlNUUkFJTlQsb3duaW5nQ2xhc3MpOwotCQl9CQkKLQkJcmV0dXJuIHRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmNvbnRhaW5zS2V5KCBVUkxfQ09OU1RSQUlOVCApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsKGJvb2xlYW4gdXJsKSB7Ci0JCWlmKCFTdHJpbmcuY2xhc3MuaXNJbnN0YW5jZSggcHJvcGVydHlUeXBlICkpIHsKLQkJCXRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oIlVSTCBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBTdHJpbmcgcHJvcGVydHkiLFVSTF9DT05TVFJBSU5ULG93bmluZ0NsYXNzKTsKLQkJfQkJCi0JCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggVVJMX0NPTlNUUkFJTlQgKTsJCQotCQlpZih1cmwpIHsJCQkKLQkJCWlmKGMgIT0gbnVsbCkgewotCQkJCWMuc2V0UGFyYW1ldGVyKEJvb2xlYW4udmFsdWVPZih1cmwpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWMgPSBuZXcgVXJsQ29uc3RyYWludCgpOwotCQkJCWMuc2V0T3duaW5nQ2xhc3Mob3duaW5nQ2xhc3MpOwotCQkJCWMuc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0JCQkJYy5zZXRQYXJhbWV0ZXIoQm9vbGVhbi52YWx1ZU9mKHVybCkpOwotCQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnB1dCggVVJMX0NPTlNUUkFJTlQsIGMgKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKGMgIT0gbnVsbCkgewotCQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZSggVVJMX0NPTlNUUkFJTlQgKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXkoKSB7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGRpc3BsYXkgVGhlIGRpc3BsYXkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXkoYm9vbGVhbiBkaXNwbGF5KSB7Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVkaXRhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0YWJsZSBUaGUgZWRpdGFibGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gb3JkZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIgVGhlIG9yZGVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcihpbnQgb3JkZXIpIHsKLQkJdGhpcy5vcmRlciA9IG9yZGVyOwotCX0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gZm9ybWF0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChTdHJpbmcgZm9ybWF0KSB7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiB3aWRnZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lkZ2V0KFN0cmluZyB3aWRnZXQpIHsKLSAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0JICogVmFsaWRhdGUgdGhpcyBjb25zdHJhaW50ZWQgcHJvcGVydHkgYWdhaW5zdCBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqIEBwYXJhbSBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSwgRXJyb3JzIGVycm9ycykgewotCQkKLQkJZm9yIChJdGVyYXRvciBpID0gdGhpcy5hcHBsaWVkQ29uc3RyYWludHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCkgaS5uZXh0KCk7CQkJCi0JCQljLnZhbGlkYXRlKCBwcm9wZXJ0eVZhbHVlLCBlcnJvcnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdpdGggdGhpcyBDb25zdHJhaW50ZWRQcm9wZXJ0eSBpbnN0YW5jZSBzdXBwb3J0cyBhcHBseWluZyB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3RyYWludE5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cmFpbnQoU3RyaW5nIGNvbnN0cmFpbnROYW1lKSB7Ci0JCQotCQlpZighY29uc3RyYWludHMuY29udGFpbnNLZXkoY29uc3RyYWludE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5iZWFuLmlzV3JpdGFibGVQcm9wZXJ0eShjb25zdHJhaW50TmFtZSk7Ci0JCX0JCQkJCQotCQlDbGFzcyBjb25zdHJhaW50Q2xhc3MgPSAoQ2xhc3MpY29uc3RyYWludHMuZ2V0KGNvbnN0cmFpbnROYW1lKTsKLQkJdHJ5IHsKLQkJCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KWNvbnN0cmFpbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJcmV0dXJuIGMuc3VwcG9ydHMocHJvcGVydHlUeXBlKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTE9HLmVycm9yKCJFeGNlcHRpb24gdGhyb3duIGluc3RhbnRpYXRpbmcgY29uc3RyYWludCBbIitjb25zdHJhaW50TmFtZSsiXSB0byBjbGFzcyBbIitvd25pbmdDbGFzcysiXSIsIGUpOwotCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRFeGNlcHRpb24oIkV4Y2VwdGlvbiB0aHJvd24gaW5zdGFudGlhdGluZyAgY29uc3RyYWludCBbIitjb25zdHJhaW50TmFtZSsiXSB0byBjbGFzcyBbIitvd25pbmdDbGFzcysiXSIpOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIGEgY29uc3RyYWludCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBjb25zcmFpbnQgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3RyYWludE5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQKLQkgKiBAcGFyYW0gY29uc3RyYWluaW5nVmFsdWUgVGhlIGNvbnN0cmFpbmluZyB2YWx1ZQotCSAqIAotCSAqIEB0aHJvd3MgQ29uc3RyYWludEV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIENvbnN0cmFpbmVkUHJvcGVydHkuIFVzZSA8Y29kZT5zdXBwb3J0c0NvbnRyYWludChTdHJpbmcgY29uc3RyYWludE5hbWUpPC9jb2RlPiB0byBjaGVjayBiZWZvcmUgY2FsbGluZyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUNvbnN0cmFpbnQoU3RyaW5nIGNvbnN0cmFpbnROYW1lLCBPYmplY3QgY29uc3RyYWluaW5nVmFsdWUpIHsKLQkJCi0JCWlmKGNvbnN0cmFpbnRzLmNvbnRhaW5zS2V5KGNvbnN0cmFpbnROYW1lKSkgewotCQkJaWYoY29uc3RyYWluaW5nVmFsdWUgPT0gbnVsbCkgewotCQkJCXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnJlbW92ZShjb25zdHJhaW50TmFtZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlDbGFzcyBjb25zdHJhaW50Q2xhc3MgPSAoQ2xhc3MpY29uc3RyYWludHMuZ2V0KGNvbnN0cmFpbnROYW1lKTsKLQkJCQl0cnkgewotCQkJCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCljb25zdHJhaW50Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQkJYy5zZXRPd25pbmdDbGFzcyh0aGlzLm93bmluZ0NsYXNzKTsKLQkJCQkJYy5zZXRQcm9wZXJ0eU5hbWUodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQkJCQljLnNldFBhcmFtZXRlciggY29uc3RyYWluaW5nVmFsdWUgKTsKLQkJCQkJdGhpcy5hcHBsaWVkQ29uc3RyYWludHMucHV0KCBjb25zdHJhaW50TmFtZSwgYyApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxPRy5lcnJvcigiRXhjZXB0aW9uIHRocm93biBhcHBseWluZyBjb25zdHJhaW50IFsiK2NvbnN0cmFpbnROYW1lKyJdIHRvIGNsYXNzIFsiK293bmluZ0NsYXNzKyJdIGZvciB2YWx1ZSBbIitjb25zdHJhaW5pbmdWYWx1ZSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRFeGNlcHRpb24oIkV4Y2VwdGlvbiB0aHJvd24gYXBwbHlpbmcgY29uc3RyYWludCBbIitjb25zdHJhaW50TmFtZSsiXSB0byBjbGFzcyBbIitvd25pbmdDbGFzcysiXSBmb3IgdmFsdWUgWyIrY29uc3RyYWluaW5nVmFsdWUrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYodGhpcy5iZWFuLmlzV3JpdGFibGVQcm9wZXJ0eShjb25zdHJhaW50TmFtZSkpIHsKLQkJCXRoaXMuYmVhbi5zZXRQcm9wZXJ0eVZhbHVlKCBjb25zdHJhaW50TmFtZSwgY29uc3RyYWluaW5nVmFsdWUgKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBDb25zdHJhaW50RXhjZXB0aW9uKCJDb25zdHJhaW50IFsiK2NvbnN0cmFpbnROYW1lKyJdIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHByb3BlcnR5IFsiK3Byb3BlcnR5TmFtZSsiXSBvZiBjbGFzcyBbIitvd25pbmdDbGFzcysiXSB3aXRoIHR5cGUgWyIrcHJvcGVydHlUeXBlKyJdIik7Ci0JCX0KLQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcykKLQkJCQkJCS5hcHBlbmQoIHRoaXMub3duaW5nQ2xhc3MgKQotCQkJCQkJLmFwcGVuZCggdGhpcy5wcm9wZXJ0eU5hbWUgKQotCQkJCQkJLmFwcGVuZCggdGhpcy5wcm9wZXJ0eVR5cGUgKQotCQkJCQkJLmFwcGVuZCggdGhpcy5hcHBsaWVkQ29uc3RyYWludHMgKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHlCdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9Db25zdHJhaW5lZFByb3BlcnR5QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EwM2U1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHlCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQZXJzaXN0ZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbjsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQ7Ci0vKioKLSAqIEJ1aWxkZXIgdXNlZCBhcyBhIGRlbGVnYXRlIHdpdGhpbiB0aGUgImNvbnN0cmFpbnRzIiBjbG9zdXJlIG9mIEdyYWlsc0RvbWFpbkNsYXNzIGluc3RhbmNlcyAKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTAtTm92LTIwMDUKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbmVkUHJvcGVydHlCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgewotCi0JcHJpdmF0ZSBPYmplY3QgdGFyZ2V0OwotCXByaXZhdGUgQmVhbldyYXBwZXIgYmVhbjsKLQlwcml2YXRlIE1hcCBjb25zdHJhaW5lZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgaW50IG9yZGVyID0gMTsKLQkKLQlwdWJsaWMgQ29uc3RyYWluZWRQcm9wZXJ0eUJ1aWxkZXIoT2JqZWN0IHRhcmdldCkgewotCQlzdXBlcigpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5iZWFuID0gbmV3IEJlYW5XcmFwcGVySW1wbCh0YXJnZXQpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0JCS8vIHdlIGRvIHRoaXMgc28gdGhhdCBtaXNzaW5nIHByb3BlcnR5IGV4Y2VwdGlvbiBpcyB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKW5hbWU7Ci0JCQlDb25zdHJhaW5lZFByb3BlcnR5IGNwOwotCQkJaWYoY29uc3RyYWluZWRQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkgewotCQkJCWNwID0gKENvbnN0cmFpbmVkUHJvcGVydHkpY29uc3RyYWluZWRQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eSk7CQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gdGhpcy5iZWFuLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eSk7Ci0JCQkJY3AgPSBuZXcgQ29uc3RyYWluZWRQZXJzaXN0ZW50UHJvcGVydHkodGhpcy50YXJnZXQuZ2V0Q2xhc3MoKSwgcHJvcGVydHksIHBkLmdldFByb3BlcnR5VHlwZSgpKTsKLQkJCQljcC5zZXRPcmRlcihvcmRlcisrKTsKLQkJCQljb25zdHJhaW5lZFByb3BlcnRpZXMucHV0KCBwcm9wZXJ0eSwgY3AgKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGNvbnN0cmFpbnROYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJaWYoY3Auc3VwcG9ydHNDb250cmFpbnQoY29uc3RyYWludE5hbWUpKSB7Ci0JCQkJCWNwLmFwcGx5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgYXR0cmlidXRlcy5nZXQoY29uc3RyYWludE5hbWUpKTsKLQkJCQl9CQkJCQkKLQkJCX0JCQkJCi0JCQlyZXR1cm4gY3A7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZFByb3BlcnR5RXhjZXB0aW9uIGlwZSkgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oKFN0cmluZyluYW1lLHRhcmdldC5nZXRDbGFzcygpLG5ldyBPYmplY3RbXXsgYXR0cmlidXRlc30pOwotCQl9CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oKFN0cmluZyluYW1lLHRhcmdldC5nZXRDbGFzcygpLG5ldyBPYmplY3RbXXsgYXR0cmlidXRlcyx2YWx1ZX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVOb2RlKG5hbWUsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBjcmVhdGVOb2RlKG5hbWUsQ29sbGVjdGlvbnMuRU1QVFlfTUFQLHZhbHVlKTsKLQl9CQotCQotCXB1YmxpYyBNYXAgZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5jb25zdHJhaW5lZFByb3BlcnRpZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9Db25zdHJhaW50LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODliOTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3ZhbGlkYXRpb24vQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBhIHZhbGlkYXRhYmxlIGNvbnN0cmFpbnQgCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDEwLU5vdi0yMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RyYWludCB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb25zdHJhaW50IHN1cHBvcnRzIGJlaW5nIGFwcGxpZWQgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHR5cGU7Ci0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gc3VwcG9ydAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29uc3RyYWludCBjYW4gYmUgYXBwbGllZCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHMoQ2xhc3MgdHlwZSk7Ci0JLyoqCi0JICogVmFsaWRhdGUgdGhpcyBjb25zdHJhaW50IGFnYWluc3QgYSBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlIFRoZSBwcm9wZXJ0eSB2YWx1ZSB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSBlcnJvcnMgVGhlIGVycm9ycyBpbnN0YW5jZSB0byByZWNvcmQgZXJyb3JzIGFnYWluc3QKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKTsKLQkKLQkvKioKLQkgKiBUaGUgcGFyYW1ldGVyIHdoaWNoIHRoZSBjb25zdHJhaW50IGlzIHZhbGlkYXRlZCBhZ2FpbnN0Ci0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcgotCSAqLwotCXZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBwYXJhbWV0ZXIpOwotCQotCS8qKgotCSAqIFRoZSBjbGFzcyB0aGUgY29uc3RyYWludCBhcHBsaWVzIHRvCi0JICogCi0JICogQHBhcmFtIG93bmluZ0NsYXNzCi0JICovCi0Jdm9pZCBzZXRPd25pbmdDbGFzcyhDbGFzcyBvd25pbmdDbGFzcyk7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBjb25zdHJhaW50IGFwcGxpZXMgdG8KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICovCi0Jdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBjb25zdHJhaW50Ci0gICAgICovCi0gICAgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9EZWZhdWx0RXJyb3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3ZhbGlkYXRpb24vRGVmYXVsdEVycm9yTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZDIxMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9EZWZhdWx0RXJyb3JNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotZGVmYXVsdC5kb2VzbnQubWF0Y2gubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1aXJlZCBwYXR0ZXJuIFt7M31dCi1kZWZhdWx0LmludmFsaWQudXJsLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBpcyBub3QgYSB2YWxpZCBVUkwKLWRlZmF1bHQuaW52YWxpZC5jcmVkaXRDYXJkLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBpcyBub3QgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXIKLWRlZmF1bHQuaW52YWxpZC5lbWFpbC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gaXMgbm90IGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuCi1kZWZhdWx0LmludmFsaWQubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSBpcyBub3QgYSB2YWxpZCBbezJ9XS4KLWRlZmF1bHQuaW52YWxpZC5yYW5nZS5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gZG9lcyBub3QgZmFsbCB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIGZyb20gW3szfV0gdG8gW3s0fV0KLWRlZmF1bHQuaW52YWxpZC5zaXplLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBkb2VzIG5vdCBmYWxsIHdpdGhpbiB0aGUgdmFsaWQgc2l6ZSByYW5nZSBmcm9tIFt7M31dIHRvIFt7NH1dCi1kZWZhdWx0LmludmFsaWQubGVuZ3RoLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBkb2VzIG5vdCBmYWxsIHdpdGhpbiB0aGUgdmFsaWQgbGVuZ3RoIHJhbmdlIGZyb20gW3szfV0gdG8gW3s0fV0KLWRlZmF1bHQuaW52YWxpZC5taW4ubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIFt7M31dCi1kZWZhdWx0LmludmFsaWQubWF4Lm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBleGNlZWRzIG1heGltIHZhbHVlIFt7M31dCi1kZWZhdWx0LmludmFsaWQubWF4Lmxlbmd0aC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gZXhjZWVkcyB0aGUgbWF4aW0gbGVuZ3RoIG9mIFt7M31dCi1kZWZhdWx0LmludmFsaWQubWluLmxlbmd0aC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiBbezN9XQotZGVmYXVsdC5pbnZhbGlkLm1heC5zaXplLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBleGNlZWRzIHRoZSBtYXhpbSBzaXplIG9mIFt7M31dCi1kZWZhdWx0LmludmFsaWQubWluLnNpemUubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSBzaXplIG9mIFt7M31dCi1kZWZhdWx0Lm5vdC5pbmxpc3QubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGlzIG5vdCBjb250YWluZWQgd2l0aGluIHRoZSBsaXN0IFt7M31dCi1kZWZhdWx0LmJsYW5rLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gY2Fubm90IGJlIGJsYW5rCi1kZWZhdWx0Lm5vdC5lcXVhbC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gbXVzdCBlcXVhbCBbezN9XQotZGVmYXVsdC5udWxsLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gY2Fubm90IGJlIG51bGwKLWRlZmF1bHQubm90LnVuaXF1ZS5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3szfV0gbXVzdCBiZSB1bmlxdWUKLWRlZmF1bHQubm90LmVkaXRhYmxlLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezN9XSBjYW5ub3QgYmUgY2hhbmdlZCBmcm9tIFt7NH1dIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL2V4Y2VwdGlvbnMvQ29uc3RyYWludEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3ZhbGlkYXRpb24vZXhjZXB0aW9ucy9Db25zdHJhaW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmQ0ZmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3ZhbGlkYXRpb24vZXhjZXB0aW9ucy9Db25zdHJhaW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uZXhjZXB0aW9uczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuR3JhaWxzRXhjZXB0aW9uOwotLyoqCi0gKiBBbiBleGNlcHRpb24gdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGFwcGx5aW5nIGEgY29uc3RyYWludCB0byBhIHByb3BlcnR5IAotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMC1Ob3YtMjAwNQotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc0V4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDg2Njk2ODcxNDE5NzUxNjc4OUw7Ci0KLQlwdWJsaWMgQ29uc3RyYWludEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29uc3RyYWludEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIENvbnN0cmFpbnRFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIENvbnN0cmFpbnRFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9tZXRhY2xhc3MvQ29uc3RyYWludHNEeW5hbWljUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL21ldGFjbGFzcy9Db25zdHJhaW50c0R5bmFtaWNQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg1ODUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL21ldGFjbGFzcy9Db25zdHJhaW50c0R5bmFtaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0RHluYW1pY1Byb3BlcnR5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLS8qKgotICogVGhpcyBpcyBhIGR5bmFtaWMgcHJvcGVydHkgdGhhdCBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgY2xvc3VyZSBzZXRzIGEgbmV3IHByb3h5IG1ldGEgY2xhc3MgZm9yIHRoZSBzY29wZSAKLSAqIG9mIHRoZSBjYWxsIGFuZCBpbnZva2VzIHRoZSBjbG9zdXJlIGl0c2VsZiB3aGljaCBidWlsZHMgdXAgYSBsaXN0IG9mIENvbnN0cmFpbmVkUHJvcGVydHkgaW5zdGFuY2VzCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA3LU5vdi0yMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50c0R5bmFtaWNQcm9wZXJ0eSBleHRlbmRzIEFic3RyYWN0RHluYW1pY1Byb3BlcnR5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImNvbnN0cmFpbnRzIjsKLQkKLQlwdWJsaWMgQ29uc3RyYWludHNEeW5hbWljUHJvcGVydHkoKSB7Ci0JCXN1cGVyKFBST1BFUlRZX05BTUUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmplY3QpIHsKLQkJQmVhbldyYXBwZXIgYmVhbiA9IG5ldyBCZWFuV3JhcHBlckltcGwob2JqZWN0KTsKLQkJQ2xvc3VyZSBjID0gKENsb3N1cmUpYmVhbi5nZXRQcm9wZXJ0eVZhbHVlKFBST1BFUlRZX05BTUUpOwotCQlDb25zdHJhaW5lZFByb3BlcnR5QnVpbGRlciBkZWxlZ2F0ZSA9IG5ldyBDb25zdHJhaW5lZFByb3BlcnR5QnVpbGRlcihvYmplY3QpOwotCQljLnNldERlbGVnYXRlKGRlbGVnYXRlKTsKLQkJYy5jYWxsKCk7Ci0JCXJldHVybiBkZWxlZ2F0ZS5nZXRDb25zdHJhaW5lZFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHNldCByZWFkLW9ubHkgcHJvcGVydHkgWyIrUFJPUEVSVFlfTkFNRSsiXSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvYnVpbGQueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk5NGM0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJncmFpbHMiIGRlZmF1bHQ9ImhlbHAiPgotCi0JPHByb3BlcnR5IG5hbWU9InNlcnZsZXQudmVyc2lvbiIgdmFsdWU9IjIuMyIvPgotCTxwcm9wZXJ0eSBuYW1lPSJwYXRoIiB2YWx1ZT0iIiAvPgotCi0gICAgPHRhc2tkZWYgbmFtZT0iZ3Jvb3Z5YyIgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnljIiAvPgotICAgIDx0YXNrZGVmIG5hbWU9Imdyb292eSIgIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5IiAvPgotCi0gICAgPHRhcmdldCBuYW1lPSJoZWxwIj4KLQkJPGVjaG8+VXNhZ2U6IGdyYWlscyBbdGFyZ2V0XQotCi1UYXJnZXRzOgotImNyZWF0ZS1hcHAiICAgICAgICAgIC0gQ3JlYXRlIGEgbmV3IGdyYWlscyBhcHAKLSJjcmVhdGUtY29udHJvbGxlciIgICAtIENyZWF0ZSBhIG5ldyBjb250cm9sbGVyCi0iY3JlYXRlLXNlcnZpY2UiICAgICAgLSBDcmVhdGUgYSBuZXcgc2VydmljZQotImNyZWF0ZS1kb21haW4tY2xhc3MiIC0gQ3JlYXRlIGEgbmV3IGRvbWFpbiBjbGFzcwotImNyZWF0ZS10ZXN0LXN1aXRlIiAgIC0gQ3JlYXRlIGEgbmV3IHRlc3Qgc3VpdGUKLSJnZW5lcmF0ZS1jb250cm9sbGVyIiAtIEdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgZnJvbSBhIGRvbWFpbiBjbGFzcwotImdlbmVyYXRlLXZpZXdzIiAgICAgIC0gR2VuZXJhdGVzIHRoZSB2aWV3cyBmcm9tIGEgZG9tYWluIGNsYXNzCi0iZ2VuZXJhdGUtYWxsIiAgICAgICAgLSBHZW5lcmF0ZXMgdGhlIGFsbCBhcnRpZmFjdHMgZnJvbSBhIGRvbWFpbiBjbGFzcwotInRlc3QtYXBwIiAgICAgICAgICAgIC0gUnVuIGN1cnJlbnQgYXBwJ3MgdW5pdCB0ZXN0cwotInJ1bi1hcHAiICAgICAgICAgICAgIC0gUnVuIHRoZSBhcHBsaWNhdGlvbiBsb2NhbGx5IGFuZCB3YWl0Ci0iY3JlYXRlLXdlYnRlc3QiICAgICAgLSBDcmVhdGUgdGhlIGZ1bmN0aW9uYWwgdGVzdCBsYXlvdXQKLSJydW4td2VidGVzdCIgICAgICAgICAtIFJ1biB0aGUgZnVuY3Rpb25hbCB0ZXN0cyBmb3IgYSBydW5uaW5nIGFwcAotICAgICAgICA8L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdC1wcm9wcyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgICAgIDxmYWlsIHVubGVzcz0iZW52LkdSQUlMU19IT01FIiBtZXNzYWdlPSJHUkFJTFNfSE9NRSBpcyBub3Qgc2V0LiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZ3JhaWxzLmhvbWUiIGxvY2F0aW9uPSIke2Vudi5HUkFJTFNfSE9NRX0iLz4KLSAgICAgICAgPGdyb292eSA+Ci0gICAgICAgICAgICAvLyByZXVzYWJsZSBjb2RlIGJsb2NrcywgYSBwaXR0eSB3ZSBjYW5ub3Qgc3RvcmUgQ2xvc3VyZXMgaW4gdGhlIHByb2plY3QuLi4KLSAgICAgICAgICAgIHByb3BlcnRpZXMubG93ZXIgPSAneFswXS50b0xvd2VyQ2FzZSgpICsgeFsxLi4tMV0nCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLmNhcHMgID0gJ3hbMF0udG9VcHBlckNhc2UoKSArIHhbMS4uLTFdJwotICAgICAgICAgICAgcHJvcGVydGllcy5ub3JtQ2FwcyA9ICcnJwotICAgICAgICAgICAgICAgIHggPSB4LnJlcGxhY2VBbGwoJyAnLCcnKQotICAgICAgICAgICAgICAgIHggPSB4WzBdLnRvVXBwZXJDYXNlKCkgKyB4WzEuLi0xXQotICAgICAgICAgICAgICAgIGlmICh4LmVuZHNXaXRoKHkpKSB4ID0geFswLi4oeC5zaXplKCkteS5zaXplKCktMSldCi0gICAgICAgICAgICAgICAgcmV0dXJuIHgKLSAgICAgICAgICAgICcnJwotICAgICAgICA8L2dyb292eT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iaW5pdC1wcm9wcyIgZGVzY3JpcHRpb249IkluaXRpYWxpc2UgdGhlIGN1cnJlbnQgYXBwIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofXNyYyIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9c3JjL2phdmEiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofXNyYy9ncm9vdnkiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWdyYWlscy1hcHAiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWdyYWlscy1hcHAvY29udHJvbGxlcnMiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWdyYWlscy1hcHAvc2VydmljZXMiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWdyYWlscy1hcHAvZG9tYWluIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH1ncmFpbHMtYXBwL3RhZ2xpYiIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9Z3JhaWxzLWFwcC92aWV3cyIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9Z3JhaWxzLWFwcC92aWV3cy9sYXlvdXRzIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH1ncmFpbHMtYXBwL2kxOG4iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWdyYWlscy1hcHAvY29uZiIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9Z3JhaWxzLXRlc3RzIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH13ZWItYXBwIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH13ZWItYXBwIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH13ZWItYXBwIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH13ZWItYXBwL2pzIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH13ZWItYXBwL2NzcyIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9d2ViLWFwcC9XRUItSU5GL2NsYXNzZXMiLz4KLSAgICAgICAgPCEtLTxta2RpciBkaXI9IiR7cGF0aH0KLSIvPi0tPgotICAgICAgICA8IS0tPG1rZGlyIGRpcj0iJHtwYXRofWh0bWwiLz4tLT4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtwYXRofWxpYiIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3BhdGh9c3ByaW5nIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7cGF0aH1oaWJlcm5hdGUiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtncmFpbHMuaG9tZX0vZGlzdCIvPgotCi0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhdGh9d2ViLWFwcC9XRUItSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vc3JjL3dhci9XRUItSU5GIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJhcHBsaWNhdGlvbkNvbnRleHQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGF0aH1ncmFpbHMtYXBwIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vc3JjL2dyYWlscy9ncmFpbHMtYXBwIiAvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Z3JhaWxzLmhvbWV9L3NyYy93YXIvV0VCLUlORi93ZWIke3NlcnZsZXQudmVyc2lvbn0udGVtcGxhdGUueG1sIiB0b2ZpbGU9IiR7cGF0aH13ZWItYXBwL1dFQi1JTkYvd2ViLnRlbXBsYXRlLnhtbCIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2dyYWlscy5ob21lfS9zcmMvd2FyL1dFQi1JTkYvc2l0ZW1lc2gueG1sIiB0b2ZpbGU9IiR7cGF0aH13ZWItYXBwL1dFQi1JTkYvc2l0ZW1lc2gueG1sIi8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhdGh9d2ViLWFwcC9qcyI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L3NyYy93YXIvanMiLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtwYXRofXdlYi1hcHAvY3NzIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vc3JjL3dhci9jc3MiLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtwYXRofXdlYi1hcHAvV0VCLUlORi90bGQiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9zcmMvd2FyL1dFQi1JTkYvdGxkLyR7c2VydmxldC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9zcmMvd2FyL1dFQi1JTkYvdGxkIiBpbmNsdWRlcz0ic3ByaW5nLnRsZCIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9zcmMvd2FyL1dFQi1JTkYvdGxkIiBpbmNsdWRlcz0iZ3JhaWxzLnRsZCIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhdGh9c3ByaW5nIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vc3JjL3dhci9XRUItSU5GL3NwcmluZyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8dG91Y2ggZmlsZT0iJHtwYXRofWdyYWlscy1hcHAvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzIj48L3RvdWNoPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1jb250cm9sbGVyIiBkZXBlbmRzPSJpbml0LXByb3BzIiBkZXNjcmlwdGlvbj0iR2VuZXJhdGVzIGEgY29udHJvbGxlciBmcm9tIGEgZG9tYWluIGNsYXNzIj4KLQotCQk8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotCQkJPCEtLTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtncmFpbHMuaG9tZX0vc3JjL3dlYi1hcHAvV0VCLUlORiIvPi0tPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RtcC93YXIvV0VCLUlORiIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RtcC93YXIvV0VCLUlORi9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L2xpYiIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9kaXN0Ii8+Ci0JCQk8ZmlsZXNldCBkaXI9ImxpYiIvPgotCQk8L3BhdGg+Ci0JCTxqYXZhIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGNsYXNzbmFtZT0iZ3JhaWxzLnV0aWwuR2VuZXJhdGVVdGlscyIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgPGFyZyB2YWx1ZT0iY29udHJvbGxlciIgLz4KLSAgICAgICAgICAgICA8YXJnIHZhbHVlPSIke2RvbWFpbi5jbGFzcy5uYW1lfSIgLz4KLTwhLS0JCQk8anZtYXJnIHZhbHVlPSItWGRlYnVnIi8+Ci0JCQk8anZtYXJnIHZhbHVlPSItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxhZGRyZXNzPTUwMDEwLHN1c3BlbmQ9eSxzZXJ2ZXI9eSIvPiAtLT4KLQkJPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS12aWV3cyIgZGVwZW5kcz0icGFja2FnZSIgZGVzY3JpcHRpb249IkdlbmVyYXRlcyB0aGUgdmlld3MgZnJvbSBhIGRvbWFpbiBjbGFzcyI+Ci0KLQkJPGlucHV0IGFkZHByb3BlcnR5PSJkb21haW4uY2xhc3MubmFtZSIgbWVzc2FnZT0iRW50ZXIgZG9tYWluIGNsYXNzIG5hbWU6IiAvPgotCi0JCTxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YmFzZWRpcn0vdG1wL3dhci9XRUItSU5GIi8+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YmFzZWRpcn0vdG1wL3dhci9XRUItSU5GL2NsYXNzZXMiLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vbGliIi8+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L2Rpc3QiLz4KLQkJCTxmaWxlc2V0IGRpcj0ibGliIi8+Ci0JCTwvcGF0aD4KLQkJPGphdmEgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgY2xhc3NuYW1lPSJncmFpbHMudXRpbC5HZW5lcmF0ZVV0aWxzIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICA8YXJnIHZhbHVlPSJ2aWV3IiAvPgotICAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7ZG9tYWluLmNsYXNzLm5hbWV9IiAvPgotCQk8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLWFsbCIgZGVwZW5kcz0icGFja2FnZSIgZGVzY3JpcHRpb249IkdlbmVyYXRlcyB0aGUgYWxsIGFydGlmYWN0cyBmcm9tIGEgZG9tYWluIGNsYXNzIj4KLQotCQk8aW5wdXQgYWRkcHJvcGVydHk9ImRvbWFpbi5jbGFzcy5uYW1lIiBtZXNzYWdlPSJFbnRlciBkb21haW4gY2xhc3MgbmFtZToiIC8+Ci0KLQkJPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS90bXAvd2FyL1dFQi1JTkYiLz4KLSAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtiYXNlZGlyfS90bXAvd2FyL1dFQi1JTkYvY2xhc3NlcyIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9saWIiLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vZGlzdCIvPgotCQkJPGZpbGVzZXQgZGlyPSJsaWIiLz4KLQkJPC9wYXRoPgotCQk8amF2YSBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBjbGFzc25hbWU9ImdyYWlscy51dGlsLkdlbmVyYXRlVXRpbHMiIGZvcms9InRydWUiPgotICAgICAgICAgICAgIDxhcmcgdmFsdWU9InZpZXciIC8+Ci0gICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtkb21haW4uY2xhc3MubmFtZX0iIC8+Ci0JCTwvamF2YT4KLQkJPGphdmEgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgY2xhc3NuYW1lPSJncmFpbHMudXRpbC5HZW5lcmF0ZVV0aWxzIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICA8YXJnIHZhbHVlPSJjb250cm9sbGVyIiAvPgotICAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7ZG9tYWluLmNsYXNzLm5hbWV9IiAvPgotCQk8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLQotICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLWFwcCIgZGVwZW5kcz0iaW5pdC1wcm9wcyIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBncmFpbHMgYXBwIj4KLQotCQk8aW5wdXQgYWRkcHJvcGVydHk9InByb2plY3QubmFtZSIgbWVzc2FnZT0iRW50ZXIgYXBwbGljYXRpb24gbmFtZToiIC8+Ci0KLQkJPGFudGNhbGwgdGFyZ2V0PSJpbml0Ij4KLQkJCTxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHtwcm9qZWN0Lm5hbWV9LyIvPgotCQk8L2FudGNhbGw+Ci0KLQkJPGdyb292eT4KLQkJCWRlZiBwcm9qTmFtZSA9IHByb3BlcnRpZXMuInByb2plY3QubmFtZSIKLQkJCXByb3BlcnRpZXMuInByb2plY3QuY2xhc3MubmFtZSIgPSAgRXZhbC54KHByb2pOYW1lLCBwcm9wZXJ0aWVzLmxvd2VyKQotCQk8L2dyb292eT4KLQotCQkJPGNvcHkgCWZpbGU9IiR7Z3JhaWxzLmhvbWV9L3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9EYXRhU291cmNlLmdyb292eSIKLQkJCQkgICAgdG9maWxlPSIke3Byb2plY3QubmFtZX0vZ3JhaWxzLWFwcC9jb25mL0FwcGxpY2F0aW9uRGF0YVNvdXJjZS5ncm9vdnkiLz4KLQkJCTxjb3B5IAlmaWxlPSIke2dyYWlscy5ob21lfS9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvQm9vdFN0cmFwLmdyb292eSIKLQkJCQkJdG9maWxlPSIke3Byb2plY3QubmFtZX0vZ3JhaWxzLWFwcC9jb25mL0FwcGxpY2F0aW9uQm9vdFN0cmFwLmdyb292eSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjcmVhdGUtY29udHJvbGxlciIgZGVwZW5kcz0iaW5pdC1wcm9wcyIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBjb250cm9sbGVyIj4KLQotCQk8aW5wdXQgYWRkcHJvcGVydHk9ImNvbnRyb2xsZXIubmFtZSIgbWVzc2FnZT0iRW50ZXIgY29udHJvbGxlciBuYW1lOiIgLz4KLQotCQk8Z3Jvb3Z5PgotCQkJZGVmIGN0cmxOYW1lID0gcHJvcGVydGllcy4iY29udHJvbGxlci5uYW1lIgotCQkJcHJvcGVydGllcy4iY29udHJvbGxlci5jbGFzcy5uYW1lIiA9IEV2YWwueHkoY3RybE5hbWUsJ0NvbnRyb2xsZXInLCBwcm9wZXJ0aWVzLm5vcm1DYXBzKQotCQk8L2dyb292eT4KLQotCQk8Y29weSAJZmlsZT0iJHtncmFpbHMuaG9tZX0vc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0NvbnRyb2xsZXIuZ3Jvb3Z5IgotCQkJCXRvZmlsZT0iZ3JhaWxzLWFwcC9jb250cm9sbGVycy8ke2NvbnRyb2xsZXIuY2xhc3MubmFtZX1Db250cm9sbGVyLmdyb292eSIKLSAgICAgICAgICAgICAgICBvdmVyd3JpdGU9ImZhbHNlIi8+Ci0KLQkJPHJlcGxhY2UgCWZpbGU9ImdyYWlscy1hcHAvY29udHJvbGxlcnMvJHtjb250cm9sbGVyLmNsYXNzLm5hbWV9Q29udHJvbGxlci5ncm9vdnkiCi0JCQkJCXRva2VuPSJAY29udHJvbGxlci5uYW1lQCIKLQkJCQkJdmFsdWU9IiR7Y29udHJvbGxlci5jbGFzcy5uYW1lfSIgLz4KLQkJPGVjaG8+Q3JlYXRlZCBjb250cm9sbGVyOiBncmFpbHMtYXBwL2NvbnRyb2xsZXJzLyR7Y29udHJvbGxlci5jbGFzcy5uYW1lfUNvbnRyb2xsZXIuZ3Jvb3Z5PC9lY2hvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5zdWl0ZS5uYW1lIiB2YWx1ZT0iJHtjb250cm9sbGVyLmNsYXNzLm5hbWV9IiAvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImludGVybmFsLWNyZWF0ZS10ZXN0LXN1aXRlIiAgLz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY3JlYXRlLXNlcnZpY2UiIGRlcGVuZHM9ImluaXQtcHJvcHMiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgc2VydmljZSI+Ci0KLQkJPGlucHV0IGFkZHByb3BlcnR5PSJzZXJ2aWNlLm5hbWUiIG1lc3NhZ2U9IkVudGVyIHNlcnZpY2UgbmFtZToiIC8+Ci0KLSAgICAgICAgPGdyb292eT4KLQkJCWRlZiBzZXJ2aWNlTmFtZSA9IHByb3BlcnRpZXMuInNlcnZpY2UubmFtZSIKLQkJCXByb3BlcnRpZXMuInNlcnZpY2UuY2xhc3MubmFtZSIgPSBFdmFsLnh5KHNlcnZpY2VOYW1lLCdTZXJ2aWNlJywgcHJvcGVydGllcy5ub3JtQ2FwcykKLQkJPC9ncm9vdnk+Ci0KLSAgICAgICAgPGNvcHkgCWZpbGU9IiR7Z3JhaWxzLmhvbWV9L3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9TZXJ2aWNlLmdyb292eSIKLQkJCQl0b2ZpbGU9ImdyYWlscy1hcHAvc2VydmljZXMvJHtzZXJ2aWNlLmNsYXNzLm5hbWV9U2VydmljZS5ncm9vdnkiCi0gICAgICAgICAgICAgICAgb3ZlcndyaXRlPSJmYWxzZSIvPgotCi0JCTxyZXBsYWNlIAlmaWxlPSJncmFpbHMtYXBwL3NlcnZpY2VzLyR7c2VydmljZS5jbGFzcy5uYW1lfVNlcnZpY2UuZ3Jvb3Z5IgotCQkJCQl0b2tlbj0iQHNlcnZpY2UubmFtZUAiCi0JCQkJCXZhbHVlPSIke3NlcnZpY2UuY2xhc3MubmFtZX0iIC8+Ci0JCTxlY2hvPkNyZWF0ZWQgc2VydmljZTogZ3JhaWxzLWFwcC9zZXJ2aWNlcy8ke3NlcnZpY2UuY2xhc3MubmFtZX1TZXJ2aWNlLmdyb292eTwvZWNobz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3VpdGUubmFtZSIgdmFsdWU9IiR7c2VydmljZS5jbGFzcy5uYW1lfSIgLz4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJpbnRlcm5hbC1jcmVhdGUtdGVzdC1zdWl0ZSIgaW5oZXJpdGFsbD0idHJ1ZSIgLz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY3JlYXRlLWRvbWFpbi1jbGFzcyIgZGVwZW5kcz0iaW5pdC1wcm9wcyIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBkb21haW4gY2xhc3MiPgotCi0JCTxpbnB1dCBhZGRwcm9wZXJ0eT0iZG9tYWluLmNsYXNzLm5hbWUiIG1lc3NhZ2U9IkVudGVyIGRvbWFpbiBjbGFzcyBuYW1lOiIgLz4KLQotICAgICAgICAgPGdyb292eT4KLQkJCWRlZiBkb21haW5OYW1lID0gcHJvcGVydGllcy4iZG9tYWluLmNsYXNzLm5hbWUiCi0JCQlwcm9wZXJ0aWVzLiJkb21haW4uY2xhc3MubmFtZSIgPSBFdmFsLngoZG9tYWluTmFtZSwgcHJvcGVydGllcy5jYXBzKQotCQk8L2dyb292eT4KLQotCi0gICAgICAgIDxjb3B5IAlmaWxlPSIke2dyYWlscy5ob21lfS9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvRG9tYWluQ2xhc3MuZ3Jvb3Z5IgotICAgICAgICAgICAgdG9maWxlPSJncmFpbHMtYXBwL2RvbWFpbi8ke2RvbWFpbi5jbGFzcy5uYW1lfS5ncm9vdnkiCi0gICAgICAgICAgICBvdmVyd3JpdGU9ImZhbHNlIi8+Ci0KLSAgICAgICAgPHJlcGxhY2UgCWZpbGU9ImdyYWlscy1hcHAvZG9tYWluLyR7ZG9tYWluLmNsYXNzLm5hbWV9Lmdyb292eSIKLSAgICAgICAgICAgIHRva2VuPSJAZG9tYWluLmNsYXNzLm5hbWVAIgotICAgICAgICAgICAgdmFsdWU9IiR7ZG9tYWluLmNsYXNzLm5hbWV9IiAvPgotICAgICAgICA8ZWNobz5Eb21haW4gY2xhc3MgY3JlYXRlZDogZ3JhaWxzLWFwcC9kb21haW4vJHtkb21haW4uY2xhc3MubmFtZX0uZ3Jvb3Z5PC9lY2hvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5zdWl0ZS5uYW1lIiB2YWx1ZT0iJHtkb21haW4uY2xhc3MubmFtZX0iIC8+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iaW50ZXJuYWwtY3JlYXRlLXRlc3Qtc3VpdGUiIGluaGVyaXRhbGw9InRydWUiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZS10ZXN0LXN1aXRlIiBkZXBlbmRzPSJpbml0LXByb3BzIiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IHRlc3Qgc3VpdGUiPgotCi0gICAgICAgIDxpbnB1dCBhZGRwcm9wZXJ0eT0idGVzdC5zdWl0ZS5uYW1lIiBtZXNzYWdlPSJFbnRlciB0ZXN0IHN1aXRlIG5hbWU6IiAvPgotCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iaW50ZXJuYWwtY3JlYXRlLXRlc3Qtc3VpdGUiIGluaGVyaXRhbGw9InRydWUiIC8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW50ZXJuYWwtY3JlYXRlLXRlc3Qtc3VpdGUiPgotICAgICAgICA8Z3Jvb3Z5PgotCQkJZGVmIHN1aXRlTmFtZSA9IHByb3BlcnRpZXMuInRlc3Quc3VpdGUubmFtZSIKLQkJCXByb3BlcnRpZXMuInRlc3Quc3VpdGUubmFtZSIgPSBFdmFsLnh5KHN1aXRlTmFtZSwnVGVzdHMnLCBwcm9wZXJ0aWVzLm5vcm1DYXBzKQotCQk8L2dyb292eT4KLQotICAgICAgICA8Y29weSAJZmlsZT0iJHtncmFpbHMuaG9tZX0vc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL1Rlc3RzLmdyb292eSIKLSAgICAgICAgICAgIHRvZmlsZT0iZ3JhaWxzLXRlc3RzLyR7dGVzdC5zdWl0ZS5uYW1lfVRlc3RzLmdyb292eSIKLSAgICAgICAgICAgIG92ZXJ3cml0ZT0iZmFsc2UiLz4KLQotICAgICAgICA8cmVwbGFjZSAJZmlsZT0iZ3JhaWxzLXRlc3RzLyR7dGVzdC5zdWl0ZS5uYW1lfVRlc3RzLmdyb292eSIKLSAgICAgICAgICAgIHRva2VuPSJAdGVzdC5zdWl0ZS5uYW1lQCIKLSAgICAgICAgICAgIHZhbHVlPSIke3Rlc3Quc3VpdGUubmFtZX0iIC8+Ci0gICAgICAgIDxlY2hvPkNyZWF0ZWQgdGVzdCBzdWl0ZTogZ3JhaWxzLXRlc3RzLyR7dGVzdC5zdWl0ZS5uYW1lfVRlc3RzLmdyb292eTwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlIGZpbGU9ImdyYWlscy1hcHAud2FyIi8+Ci0JCTxkZWxldGUgZGlyPSJ0bXAiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0LXByb3BzIj4KLQkJPHBhdGggaWQ9ImNsYXNzcGF0aCI+Ci0JCQk8ZmlsZXNldCBkaXI9ImxpYiIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9saWIiLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vZGlzdCIvPgotCQk8L3BhdGg+Ci0JCTxkZWxldGUgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0id2ViLWFwcC9XRUItSU5GL2NsYXNzZXMiLz4KLQkJPC9kZWxldGU+Ci0JCTxqYXZhYyBzcmNkaXI9InNyYy9qYXZhIiBkZXN0ZGlyPSJ3ZWItYXBwL1dFQi1JTkYvY2xhc3NlcyIgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIGRlYnVnPSJvbiIgZGVwcmVjYXRpb249Im9uIiBvcHRpbWl6ZT0ib2ZmIi8+Ci0KLQkJPGdyb292eWMgc3JjZGlyPSJzcmMvZ3Jvb3Z5IiBkZXN0ZGlyPSJ3ZWItYXBwL1dFQi1JTkYvY2xhc3NlcyIgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImJ1aWxkIj4KLQkJPGRlbGV0ZSBkaXI9InRtcC9yZXBvcnRzIi8+Ci0JCTxta2RpciBkaXI9InRtcC9yZXBvcnRzIi8+Ci0JCTxwYXRoIGlkPSJ0ZXN0X2NsYXNzcGF0aCI+Ci0JCQk8ZmlsZXNldCBkaXI9ImxpYiIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9saWIiLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vZGlzdCIvPgotCQkJPHBhdGggbG9jYXRpb249IndlYi1hcHAvV0VCLUlORi9jbGFzc2VzIi8+Ci0JCTwvcGF0aD4KLQkJPGp1bml0PgotCQkJPGNsYXNzcGF0aCByZWZpZD0idGVzdF9jbGFzc3BhdGgiLz4KLQotCQkJPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0ibm8iLz4KLQkJCTxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+Ci0JCQk8YmF0Y2h0ZXN0IHRvZGlyPSJ0bXAvcmVwb3J0cyIgZm9yaz0ieWVzIj4KLQkJCQk8ZmlsZXNldCBkaXI9IndlYi1hcHAvV0VCLUlORi9jbGFzc2VzIiBpbmNsdWRlcz0iKiovKlRlc3RzLmNsYXNzIiBleGNsdWRlcz0iKiovQWJzdHJhY3QqIi8+Ci0JCQk8L2JhdGNodGVzdD4KLQkJPC9qdW5pdD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0idGVzdC1hcHAiIGRlcGVuZHM9InBhY2thZ2UiIGRlc2NyaXB0aW9uPSJSdW4gY3VycmVudCBhcHAncyB1bml0IHRlc3RzIj4KLQkJPG1rZGlyIGRpcj0iJHtiYXNlZGlyfS90bXAvd2FyL1dFQi1JTkYvZ3JhaWxzLWFwcC90ZXN0cyIgLz4KLQkJPGNvcHkgdG9kaXI9IiR7YmFzZWRpcn0vdG1wL3dhci9XRUItSU5GL2dyYWlscy1hcHAvdGVzdHMiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2dyYWlscy10ZXN0cy8iIGluY2x1ZGVzPSIqKiIgLz4KLQkJPC9jb3B5PgotCQk8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotCQkJPCEtLTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtncmFpbHMuaG9tZX0vc3JjL3dlYi1hcHAvV0VCLUlORiIvPi0tPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RtcC93YXIvV0VCLUlORiIvPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RtcC93YXIvV0VCLUlORi9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L2xpYiIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9kaXN0Ii8+Ci0JCQk8ZmlsZXNldCBkaXI9ImxpYiIvPgotCQk8L3BhdGg+Ci0JCTxqYXZhIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGNsYXNzbmFtZT0iZ3JhaWxzLnV0aWwuUnVuVGVzdHMiIGZvcms9InRydWUiPgotPCEtLQkJCTxqdm1hcmcgdmFsdWU9Ii1YZGVidWciLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LGFkZHJlc3M9NTAwMTAsc3VzcGVuZD15LHNlcnZlcj15Ii8+IC0tPgotCQk8L2phdmE+Ci0JCTxkZWxldGUgZGlyPSIke2Jhc2VkaXJ9L3RtcC93YXIvV0VCLUlORi9ncmFpbHMtYXBwL3Rlc3RzIj48L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZGV2Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRldi5ydW4iIHZhbHVlPSJ0cnVlIiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdlIiBkZXBlbmRzPSJidWlsZCI+Ci0gICAgICAgIDxta2RpciBkaXI9InRtcC93YXIiLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9InRtcC93YXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ3ZWItYXBwIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qKiIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IldFQi1JTkYvKi50ZW1wbGF0ZS54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb250cm9sbGVycy5ob21lIiBsb2NhdGlvbj0iZ3JhaWxzLWFwcC9jb250cm9sbGVycyI+PC9wcm9wZXJ0eT4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9IndlYi54bWwudGVtcGxhdGUiICBsb2NhdGlvbj0id2ViLWFwcC9XRUItSU5GL3dlYi50ZW1wbGF0ZS54bWwiPjwvcHJvcGVydHk+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQud2ViLnhtbCIgIGxvY2F0aW9uPSJ0bXAvd2FyL1dFQi1JTkYvd2ViLnhtbCI+PC9wcm9wZXJ0eT4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRtcC53YXIuZGlyIiAgbG9jYXRpb249InRtcC93YXIiPjwvcHJvcGVydHk+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIiAgbG9jYXRpb249Ii4iPjwvcHJvcGVydHk+Ci0KLSAgICAgICAgPGdyb292eT48IVtDREFUQVsKLSAgICAgICAgICAgIGltcG9ydCBncm9vdnkudGV4dC5TaW1wbGVUZW1wbGF0ZUVuZ2luZQotCi0gICAgICAgICAgICBkZWYgY29udHJvbGxlcnNIb21lID0gcHJvcGVydGllcy4iY29udHJvbGxlcnMuaG9tZSIKLSAgICAgICAgICAgIGRlZiBjb250cm9sbGVycyA9IFtdCi0gICAgICAgICAgICBkZWYgZmxvd3MgPSBbXQotICAgICAgICAgICAgbmV3IEZpbGUoIiR7Y29udHJvbGxlcnNIb21lfSIpLmVhY2hGaWxlUmVjdXJzZSB7Ci0gICAgICAgICAgICAgICAgZGVmIG1hdGNoID0gaXQubmFtZSA9fiAiKFxcdyspKENvbnRyb2xsZXIuZ3Jvb3Z5XCQpIgotICAgICAgICAgICAgICAgIGlmKG1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBjb250cm9sbGVyTmFtZSA9IG1hdGNoWzBdWzFdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOYW1lID0gRXZhbC54KGNvbnRyb2xsZXJOYW1lLCBwcm9wZXJ0aWVzLmxvd2VyKQotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVycyA8PCBjb250cm9sbGVyTmFtZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXRjaCA9IGl0Lm5hbWUgPX4gIihcXHcrKShQYWdlRmxvdy5ncm9vdnlcJCkiCi0gICAgICAgICAgICAgICAgaWYobWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmIGZsb3dOYW1lID0gbWF0Y2hbMF1bMV0KLSAgICAgICAgICAgICAgICAgICAgZmxvd05hbWUgPSBFdmFsLngoZmxvd05hbWUsIHByb3BlcnRpZXMubG93ZXIpCi0gICAgICAgICAgICAgICAgICAgIGZsb3dzIDw8IGZsb3dOYW1lCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWYgZGV2UnVuID0gKCJ0cnVlIiA9PSBwcm9wZXJ0aWVzLiJkZXYucnVuIikKLQotICAgICAgICAgICAgZGVmIGJpbmRpbmcgPSBbICJjb250cm9sbGVycyIgOiBjb250cm9sbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd3MiIDogZmxvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2VkaXIiIDogcHJvcGVydGllcy4icHJvamVjdC5iYXNlLmRpciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc3RkaXIiIDogcHJvcGVydGllcy4idG1wLndhci5kaXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXYiIDogZGV2UnVuICAgICBdCi0gICAgICAgICAgICBkZWYgZW5naW5lID0gbmV3IFNpbXBsZVRlbXBsYXRlRW5naW5lKCkKLSAgICAgICAgICAgIGRlZiB0ZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZSggbmV3IEZpbGUoIHByb3BlcnRpZXMuIndlYi54bWwudGVtcGxhdGUiICkudGV4dCApLm1ha2UoYmluZGluZykKLQotICAgICAgICAgICAgbmV3IEZpbGUoIHByb3BlcnRpZXMuInRhcmdldC53ZWIueG1sIiApLndyaXRlKCB0ZW1wbGF0ZS50b1N0cmluZygpICkKLSAgICAgICAgXV0+PC9ncm9vdnk+Ci0KLQotICAgICAgICA8bWtkaXIgZGlyPSJ0bXAvd2FyL1dFQi1JTkYvY2xhc3NlcyIvPgotICAgICAgICA8dG91Y2ggZmlsZT0idG1wL3dhci9XRUItSU5GL2NsYXNzZXMvLmR1bW15Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9InRtcC93YXIvV0VCLUlORi9saWIiLz4KLSAgICAgICAgPHRvdWNoIGZpbGU9InRtcC93YXIvV0VCLUlORi9saWIvLmR1bW15Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9InRtcC93YXIvV0VCLUlORi9zcHJpbmciLz4KLSAgICAgICAgPHRvdWNoIGZpbGU9InRtcC93YXIvV0VCLUlORi9zcHJpbmcvLmR1bW15Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9InRtcC93YXIvV0VCLUlORi90bGQiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0idG1wL3dhci9qcyIvPgotICAgICAgICA8Y29weSB0b2Rpcj0idG1wL3dhci9XRUItSU5GL2xpYiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L2xpYiI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYW50bHItMi43LjZyYzEuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXNtLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImFzbS1hdHRycy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjZ2xpYi0yLjEuMy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJkb200ai0xLjYuMS5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJlaGNhY2hlLTEuMS5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJlamItMy4wLWVkcjIuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iaGliZXJuYXRlMy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqZGJjMl8wLXN0ZGV4dC5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdGEuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXNtLTIuMC5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJhc20tdXRpbC0yLjAuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tbW9ucy1sb2dnaW5nLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNpdGVtZXNoLTIuMi4xLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNwcmluZy13ZWJmbG93LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNwcmluZy1iaW5kaW5nLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNwcmluZy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJncm9vdnktYWxsLTEuMC1qc3ItMDUtU05BUFNIT1QuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic3ByaW5nbW9kdWxlcy1zYW5kYm94LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InN0YW5kYXJkLSR7c2VydmxldC52ZXJzaW9ufS5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqc3RsLSR7c2VydmxldC52ZXJzaW9ufS5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb21tb25zLWxhbmctMi4wLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxvZzRqLTEuMi44LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9nbmwtMi43LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImhzcWxkYi5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb21tb25zLWNvbGxlY3Rpb25zLTMuMC5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb21tb25zLXBvb2wtMS4yLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbW1vbnMtZGJjcC0xLjIuMS5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb21tb25zLWNsaS0xLjAuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tbW9ucy12YWxpZGF0b3IuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tbW9ucy1maWxldXBsb2FkLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Impha2FydGEtb3JvLTIuMC44LmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9kaXN0Ii8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImxpYiIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0icGFja2FnZTpqYXZhNSI+PC9hbnRjYWxsPgotICAgICAgICA8Y29weSB0b2Rpcj0idG1wL3dhci9XRUItSU5GL2dyYWlscy1hcHAiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJncmFpbHMtYXBwIiBpbmNsdWRlcz0iKioiLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSB0b2Rpcj0idG1wL3dhci9XRUItSU5GL2NsYXNzZXMiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJncmFpbHMtYXBwL2kxOG4iIGluY2x1ZGVzPSIqKiIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSJ0bXAvd2FyL1dFQi1JTkYvc3ByaW5nIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ic3ByaW5nIiBpbmNsdWRlcz0iKioiLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSB0b2Rpcj0idG1wL3dhci9XRUItSU5GL2NsYXNzZXMiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJoaWJlcm5hdGUiIGluY2x1ZGVzPSIqKiIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSJ0bXAvd2FyL1dFQi1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9zcmMvd2FyL1dFQi1JTkYiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxvZzRqLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnZTpjaGVja2o1Ij4KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXMuamF2YS41Ij4KLSAgICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxLjUiLz4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InBhY2thZ2U6amF2YTUiIGRlcGVuZHM9InBhY2thZ2U6Y2hlY2tqNSIgaWY9ImlzLmphdmEuNSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSJ0bXAvd2FyL1dFQi1JTkYvbGliIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vbGliIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJoaWJlcm5hdGUtYW5ub3RhdGlvbnMuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iZWpiMy1wZXJzaXN0ZW5jZS5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJ3YXIiIGRlcGVuZHM9ImNsZWFuLHBhY2thZ2UiPgotCQk8YmFzZW5hbWUgcHJvcGVydHk9InByb2plY3QuZGlyIiBmaWxlPSIuIi8+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC5kaXJ9LndhciIgYmFzZWRpcj0idG1wL3dhciIgLz4KLQk8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLWFwcDppbXBsIj4KLQkJPGJhc2VuYW1lIHByb3BlcnR5PSJwcm9qZWN0LmRpciIgZmlsZT0iLiIvPgotCi0JCTxncm9vdnk+Ci0JCQlpbXBvcnQgb3JnLm1vcnRiYXkuamV0dHkuKgotCQkJaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuKgotCi0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoJ29yZy5tb3J0YmF5LnhtbC5YbWxQYXJzZXIuTm90VmFsaWRhdGluZycsICd0cnVlJykKLSAgICAgICAgICAgIGRlZiBzZXJ2ZXIgPSBuZXcgU2VydmVyKCkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVmIGxpc3RlbmVyID0gbmV3IFNvY2tldExpc3RlbmVyKCkKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXRQb3J0KDgwODApCi0gICAgICAgICAgICAgICAgc2VydmVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKQotICAgICAgICAgICAgICAgIHNlcnZlci5hZGRXZWJBcHBsaWNhdGlvbigiLyIgKyBwcm9wZXJ0aWVzLiJwcm9qZWN0LmRpciIsICd0bXAvd2FyJykKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLidydW5UZXN0cycpIGFudC5hbnRjYWxsKHRhcmdldDond2VidGVzdC1pbXBsJykKLSAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpCi0JCQl9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLidydW5UZXN0cycpIHNlcnZlci5zdG9wKCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgPC9ncm9vdnk+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9IndhaXQtZm9yZXZlciIgPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJncm9vdnkiPgotICAgICAgICAgICAgd2hpbGUodHJ1ZSkgewotICAgICAgICAgICAgICAgIHNsZWVwKExvbmcuTUFYX1ZBTFVFKQotCQkJfQotCQk8L3NjcmlwdD4KLQk8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLWFwcCIgZGVwZW5kcz0iZGV2LCBwYWNrYWdlIiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBhcHBsaWNhdGlvbiBsb2NhbGx5IGFuZCB3YWl0Ij4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJydW4tYXBwOmltcGwiIC8+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0id2FpdC1mb3JldmVyIiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0LXdlYnRlc3QiIGRlcGVuZHM9ImluaXQtcHJvcHMiID4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgRG93bmxvYWQgV2ViVGVzdCBkaXN0cm8gaWYgbmVlZGVkLgotICAgICAgICAgICAgVXNlcnMgbWF5IG5lZWQgdG8gdXNlIHRoZSA8c2V0cHJveHkvPiB0YXNrIHRvIHdoZW4gYmVoaW5kIGEgZmlyZXdhbGwhCi0gICAgICAgICAgICBEb3dubG9hZHMgYXJlIGV4cGFuZGVkIGJlbG93IHRoZSBkb3dubG9hZHMgZGlyLgotICAgICAgICAgICAgVG9kbzogZXhwYW5kZWQgZGlycyBuZWVkIHRvIGRlbGV0ZWQgaWYgZG93bmxvYWQgY2FjaGUgaXMgdXBkYXRlZAotICAgICAgICAgICAgVG9kbzogZmFpbCBncmFjZWZ1bGx5IGlmIG5vdCBvbmxpbmUKLSAgICAgICAgICAgIFRvZG86IGZldGNoIGJ5IHJlbGVhc2UgdGFnCi0gICAgICAgIC0tPgotICAgICAgICA8bWtkaXIgIGRpcj0iJHtncmFpbHMuaG9tZX0vZG93bmxvYWRzL3dlYnRlc3QiIC8+Ci0gICAgICAgIDxnZXQgICAgZGVzdD0iJHtncmFpbHMuaG9tZX0vZG93bmxvYWRzL3dlYnRlc3QuemlwIiBzcmM9Imh0dHA6Ly93ZWJ0ZXN0LmNhbm9vLmNvbS93ZWJ0ZXN0L2J1aWxkLnppcCIKLSAgICAgICAgICAgICAgICB2ZXJib3NlPSJ0cnVlIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICAgICAgPHVuemlwICBkZXN0PSIke2dyYWlscy5ob21lfS9kb3dubG9hZHMvd2VidGVzdCIgc3JjPSIke2dyYWlscy5ob21lfS9kb3dubG9hZHMvd2VidGVzdC56aXAiIG92ZXJ3cml0ZT0iZmFsc2UiIC8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLXdlYnRlc3QiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBmdW5jdGlvbmFsIHRlc3RpbmcgbGF5b3V0IiBkZXBlbmRzPSJpbml0LXdlYnRlc3QiID4KLSAgICAgICAgPGNvcHkgdG9kaXI9Ii4iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9zcmMvZ3JhaWxzL3RlbXBsYXRlcy8iIGluY2x1ZGVzPSJ3ZWJ0ZXN0LyIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXdlYnRlc3QiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSB3ZWJ0ZXN0IGZvciBhIGRvbWFpbiBjbGFzcyIgZGVwZW5kcz0iaW5pdC1wcm9wcyIgPgotICAgICAgICA8aW5wdXQgYWRkcHJvcGVydHk9ImRvbWFpbi5jbGFzcy5uYW1lIiBtZXNzYWdlPSJFbnRlciBkb21haW4gY2xhc3MgbmFtZToiIC8+Ci0KLSAgICAgICAgPGdyb292eT4KLSAgICAgICAgICAgIGRlZiBkb21haW5OYW1lID0gcHJvcGVydGllcy4iZG9tYWluLmNsYXNzLm5hbWUiCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLiJ3ZWJ0ZXN0Lm5hbWUiID0gRXZhbC54KGRvbWFpbk5hbWUsIHByb3BlcnRpZXMuY2FwcykKLSAgICAgICAgPC9ncm9vdnk+Ci0KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtncmFpbHMuaG9tZX0vc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL1dlYlRlc3QuZ3Jvb3Z5IgotICAgICAgICAgICAgdG9maWxlPSJ3ZWJ0ZXN0L3Rlc3RzLyR7d2VidGVzdC5uYW1lfVRlc3QuZ3Jvb3Z5IiAvPgotICAgICAgICA8cmVwbGFjZSBmaWxlPSJ3ZWJ0ZXN0L3Rlc3RzLyR7d2VidGVzdC5uYW1lfVRlc3QuZ3Jvb3Z5IgotICAgICAgICAgICAgdG9rZW49IkB3ZWJ0ZXN0Lm5hbWUuY2Fwc0AiCi0gICAgICAgICAgICB2YWx1ZT0iJHt3ZWJ0ZXN0Lm5hbWV9IiAvPgotICAgICAgICA8cmVwbGFjZSBmaWxlPSJ3ZWJ0ZXN0L3Rlc3RzLyR7d2VidGVzdC5uYW1lfVRlc3QuZ3Jvb3Z5IgotICAgICAgICAgICAgdG9rZW49IkB3ZWJ0ZXN0Lm5hbWUubG93ZXJAIgotICAgICAgICAgICAgdmFsdWU9IiR7ZG9tYWluLmNsYXNzLm5hbWV9IiAvPgotICAgICAgICA8ZWNobz5XZWJ0ZXN0IGNyZWF0ZWQ6IHdlYnRlc3QvdGVzdHMvJHt3ZWJ0ZXN0Lm5hbWV9VGVzdC5ncm9vdnk8L2VjaG8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLXdlYnRlc3QiIGRlcGVuZHM9ImluaXQtcHJvcHMiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bmN0aW9uYWwgdGVzdHMgZm9yIGEgcnVubmluZyBhcHAiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InJ1bi1hcHA6aW1wbCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icnVuVGVzdHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0id2VidGVzdC1pbXBsIj4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJncm9vdnkudWkuR3Jvb3Z5TWFpbiIgPgotICAgICAgICAgICAgPGFyZyBsaW5lPSJ3ZWJ0ZXN0L3Rlc3RzL1Rlc3RTdWl0ZSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IndlYnRlc3QvdGVzdHMiLz4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z3JhaWxzLmhvbWV9L2xpYiIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyYWlscy5ob21lfS9kaXN0IiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Z3JhaWxzLmhvbWV9L2Rvd25sb2Fkcy93ZWJ0ZXN0L2xpYiIvPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtncmFpbHMuaG9tZX0vZG93bmxvYWRzL3dlYnRlc3QvbGliIiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL2dyYWlscy1hcHAvaTE4bi9kZWZhdWx0RXJyb3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC9pMThuL2RlZmF1bHRFcnJvck1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQyMTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC9pMThuL2RlZmF1bHRFcnJvck1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1kZWZhdWx0LmRvZXNudC5tYXRjaC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIHBhdHRlcm4gW3szfV0KLWRlZmF1bHQuaW52YWxpZC51cmwubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGlzIG5vdCBhIHZhbGlkIFVSTAotZGVmYXVsdC5pbnZhbGlkLmNyZWRpdENhcmQubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGlzIG5vdCBhIHZhbGlkIGNyZWRpdCBjYXJkIG51bWJlcgotZGVmYXVsdC5pbnZhbGlkLmVtYWlsLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBpcyBub3QgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy4KLWRlZmF1bHQuaW52YWxpZC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIGlzIG5vdCBhIHZhbGlkIFt7Mn1dLgotZGVmYXVsdC5pbnZhbGlkLnJhbmdlLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBkb2VzIG5vdCBmYWxsIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UgZnJvbSBbezN9XSB0byBbezR9XQotZGVmYXVsdC5pbnZhbGlkLnNpemUubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGRvZXMgbm90IGZhbGwgd2l0aGluIHRoZSB2YWxpZCBzaXplIHJhbmdlIGZyb20gW3szfV0gdG8gW3s0fV0KLWRlZmF1bHQuaW52YWxpZC5sZW5ndGgubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGRvZXMgbm90IGZhbGwgd2l0aGluIHRoZSB2YWxpZCBsZW5ndGggcmFuZ2UgZnJvbSBbezN9XSB0byBbezR9XQotZGVmYXVsdC5pbnZhbGlkLm1pbi5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgW3szfV0KLWRlZmF1bHQuaW52YWxpZC5tYXgubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGV4Y2VlZHMgbWF4aW0gdmFsdWUgW3szfV0KLWRlZmF1bHQuaW52YWxpZC5tYXgubGVuZ3RoLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBleGNlZWRzIHRoZSBtYXhpbSBsZW5ndGggb2YgW3szfV0KLWRlZmF1bHQuaW52YWxpZC5taW4ubGVuZ3RoLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gbGVuZ3RoIG9mIFt7M31dCi1kZWZhdWx0LmludmFsaWQubWF4LnNpemUubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7Mn1dIGV4Y2VlZHMgdGhlIG1heGltIHNpemUgb2YgW3szfV0KLWRlZmF1bHQuaW52YWxpZC5taW4uc2l6ZS5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHNpemUgb2YgW3szfV0KLWRlZmF1bHQubm90LmlubGlzdC5tZXNzYWdlPVByb3BlcnR5IFt7MH1dIG9mIGNsYXNzIFt7MX1dIHdpdGggdmFsdWUgW3syfV0gaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGxpc3QgW3szfV0KLWRlZmF1bHQuYmxhbmsubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSBjYW5ub3QgYmUgYmxhbmsKLWRlZmF1bHQubm90LmVxdWFsLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezJ9XSBtdXN0IGVxdWFsIFt7M31dCi1kZWZhdWx0Lm51bGwubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSBjYW5ub3QgYmUgbnVsbAotZGVmYXVsdC5ub3QudW5pcXVlLm1lc3NhZ2U9UHJvcGVydHkgW3swfV0gb2YgY2xhc3MgW3sxfV0gd2l0aCB2YWx1ZSBbezN9XSBtdXN0IGJlIHVuaXF1ZQotZGVmYXVsdC5ub3QuZWRpdGFibGUubWVzc2FnZT1Qcm9wZXJ0eSBbezB9XSBvZiBjbGFzcyBbezF9XSB3aXRoIHZhbHVlIFt7M31dIGNhbm5vdCBiZSBjaGFuZ2VkIGZyb20gW3s0fV0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC90YWdsaWIvQXBwbGljYXRpb25UYWdMaWIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC90YWdsaWIvQXBwbGljYXRpb25UYWdMaWIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVmYWIxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL2dyYWlscy1hcHAvdGFnbGliL0FwcGxpY2F0aW9uVGFnTGliLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgYztwV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotIC8qKgotICogVGhlIGJhc2UgYXBwbGljYXRpb24gdGFnIGxpYnJhcnkgZm9yIEdyYWlscyBtYW55IG9mIHdoaWNoIHRha2UgaW5zcGlyYXRpb24gZnJvbSBSYWlscyBoZWxwZXJzICh0aGFua3MgZ3V5cyEgOikKLSAqIFRoaXMgdGFnIGxpYnJhcnkgdGVuZHMgdG8gZ2V0IGV4dGVuZGVkIGJ5IG90aGVycyBhcyB0YWdzIHdpdGhpbiBoZXJlIGNhbiBiZSByZS11c2VkIGluIHNhaWQgbGlicmFyaWVzCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTctSmFuLTIwMDYKLSAqLwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0Lk5vU3VjaE1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5zdXBwb3J0LlJlcXVlc3RDb250ZXh0VXRpbHMgYXMgUkNVOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQ2xhc3NVdGlscyBhcyBHQ1U7Ci0KLWNsYXNzIEFwcGxpY2F0aW9uVGFnTGliIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbGluayB0byBhIHJlc291cmNlLCBnZW5lcmFsbHkgdXNlZCBhcyBhIG1ldGhvZCByYXRoZXIgdGhhbiBhIHRhZy4KLSAgICAgKgotICAgICAqIGVnLiA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJHtjcmVhdGVMaW5rVG8oZGlyOidjc3MnLGZpbGU6J21haW4uY3NzJyl9IiAvPgotICAgICAqLwotICAgIEBQcm9wZXJ0eSBjcmVhdGVMaW5rVG8gPSB7IGF0dHJzLCBib2R5IC0+Ci0gICAgICAgICBvdXQgPDwgZ3JhaWxzQXR0cmlidXRlcy5nZXRBcHBsaWNhdGlvblVyaShyZXF1ZXN0KQotICAgICAgICAgaWYoYXR0cnNbJ2RpciddKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIi8ke2F0dHJzWydkaXInXX0iCi0gICAgICAgICB9Ci0gICAgICAgICBpZihhdHRyc1snZmlsZSddKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIi8ke2F0dHJzWydmaWxlJ119IgotICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBHZW5lcmFsIGxpbmtpbmcgdG8gY29udHJvbGxlcnMsIGFjdGlvbnMgZXRjLiBFeGFtcGxlczoKLSAgICAgKgotICAgICAqICA8ZzpsaW5rIGFjdGlvbj0ibXlhY3Rpb24iPmxpbmsgMTwvZ3I6bGluaz4KLSAgICAgKiAgPGc6bGluayBjb250cm9sbGVyPSJteWN0cmwiIGFjdGlvbj0ibXlhY3Rpb24iPmxpbmsgMjwvZ3I6bGluaz4KLSAgICAgKi8KLSAgICBAUHJvcGVydHkgbGluayA9IHsgYXR0cnMsIGJvZHkgLT4KLSAgICAgICAgb3V0IDw8ICI8YSBocmVmPVwiIgotICAgICAgICAvLyBjcmVhdGUgdGhlIGxpbmsKLSAgICAgICAgY3JlYXRlTGluayhhdHRycykKLQotICAgICAgICBvdXQgPDwgJ1wiICcKLSAgICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgYXR0cmlidXRlcwotICAgICAgICBhdHRycy5lYWNoIHsgayx2IC0+Ci0gICAgICAgICAgICBvdXQgPDwgayA8PCAiPVwiIiA8PCB2IDw8ICJcIiAiCi0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICI+IgotICAgICAgICAvLyBvdXRwdXQgdGhlIGJvZHkKLSAgICAgICAgYm9keSgpCi0KLSAgICAgICAgLy8gY2xvc2UgdGFnCi0gICAgICAgIG91dCA8PCAiPC9hPiIKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBncmFpbHMgYXBwbGljYXRpb24gbGluayBmcm9tIGEgc2V0IG9mIGF0dHJpYnV0ZXMuIFRoaXMKLSAgICAgKiBsaW5rIGNhbiB0aGVuIGJlIGluY2x1ZGVkIGluIGxpbmtzLCBhamF4IGNhbGxzIGV0Yy4gR2VuZXJhbGx5IHVzZWQgYXMgYSBtZXRob2QgY2FsbAotICAgICAqIHJhdGhlciB0aGFuIGEgdGFnIGVnLgotICAgICAqCi0gICAgICogIDxhIGhyZWY9IiR7Y3JlYXRlTGluayhhY3Rpb246J2xpc3QnKX0iPkxpc3Q8L2E+Ci0gICAgICovCi0gICAgQFByb3BlcnR5IGNyZWF0ZUxpbmsgPSB7IGF0dHJzIC0+Ci0gICAgICAgIG91dCA8PCBncmFpbHNBdHRyaWJ1dGVzLmdldEFwcGxpY2F0aW9uVXJpKHJlcXVlc3QpCi0gICAgICAgIC8vIHByZWZlciBhIFVSTCBhdHRyaWJ1dGUKLSAgICAgICAgaWYoYXR0cnNbJ3VybCddKSB7Ci0gICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5yZW1vdmUoJ3VybCcpCi0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgYXR0cmlidXRlIG51bGwgc2V0IHRoZSBjb250cm9sbGVyIHVyaSB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0gICAgICAgIGlmKGF0dHJzWyJjb250cm9sbGVyIl0pIHsKLSAgICAgICAgICAgIG91dCA8PCAnLycgPDwgYXR0cnMucmVtb3ZlKCJjb250cm9sbGVyIikKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgb3V0IDw8IGdyYWlsc0F0dHJpYnV0ZXMuZ2V0Q29udHJvbGxlclVyaShyZXF1ZXN0KQotICAgICAgICB9Ci0gICAgICAgIGlmKGF0dHJzWyJhY3Rpb24iXSkgewotICAgICAgICAgICAgb3V0IDw8ICcvJyA8PCBhdHRycy5yZW1vdmUoImFjdGlvbiIpCi0gICAgICAgIH0KLSAgICAgICAgaWYoYXR0cnNbImlkIl0pIHsKLSAgICAgICAgICAgIG91dCA8PCAnLycgPDwgYXR0cnMucmVtb3ZlKCJpZCIpCi0gICAgICAgIH0KLSAgICAgICAgaWYoYXR0cnNbJ3BhcmFtcyddKSB7Ci0gICAgICAgICAgICBkZWYgcG1zID0gYXR0cnMucmVtb3ZlKCdwYXJhbXMnKQotICAgICAgICAgICAgb3V0IDw8ICc/JwotICAgICAgICAgICAgZGVmIGkgPSAwCi0gICAgICAgICAgICBwbXMuZWFjaCB7IGssdiAtPgotICAgICAgICAgICAgICAgIG91dCA8PCAiJHtrfT0ke3Z9IgotICAgICAgICAgICAgICAgIGlmKCsraSA8IHBtcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgb3V0IDw8ICcmJwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqICBhbGxvd3MgcmVuZGVyaW5nIG9mIHRlbXBsYXRlcyBpbnNpZGUgdmlld3MgZm9yIGNvbGxlY3Rpb25zLCBtb2RlbHMgYW5kIGJlYW5zLiBFeGFtcGxlczoKLSAgICAgKgotICAgICAqICA8ZzpyZW5kZXIgdGVtcGxhdGU9ImF0ZW1wbGF0ZSIgY29sbGVjdGlvbj0iJHt1c2Vyc30iIC8+Ci0gICAgICogIDxnOnJlbmRlciB0ZW1wbGF0ZT0iYXRlbXBsYXRlIiBtb2RlbD0iW3VzZXI6dXNlcixjb21wYW55OmNvbXBhbnldIiAvPgotICAgICAqICA8ZzpyZW5kZXIgdGVtcGxhdGU9ImF0ZW1wbGF0ZSIgYmVhbj0iJHt1c2VyfSIgLz4KLSAgICAgKi8KLSAgICBAUHJvcGVydHkgcmVuZGVyID0geyBhdHRycywgYm9keSAtPgotICAgICAgICBpZighYXR0cnNbJ3RlbXBsYXRlJ10pCi0gICAgICAgICAgICB0aHJvd1RhZ0Vycm9yKCJUYWcgW3JlbmRlcl0gaXMgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgW3RlbXBsYXRlXSIpCi0KLSAgICAgICAgZGVmIGVuZ2luZSA9IGdyYWlsc0F0dHJpYnV0ZXMuZ2V0UGFnZXNUZW1wbGF0ZUVuZ2luZSgpCi0gICAgICAgIGRlZiB1cmkgPSAnL1dFQi1JTkYvZ3JhaWxzLWFwcC92aWV3cycgPDwgZ3JhaWxzQXR0cmlidXRlcy5nZXRDb250cm9sbGVyVXJpKHJlcXVlc3QpCi0gICAgICAgIHVyaSA8PCAiL18ke2F0dHJzWyd0ZW1wbGF0ZSddfS5nc3AiCi0gICAgICAgIHVyaSA9IHVyaS50b1N0cmluZygpCi0KLSAgICAgICAgZGVmIHVybCA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKHVyaSkKLSAgICAgICAgaWYoIXVybCkKLSAgICAgICAgICAgIHRocm93VGFnRXJyb3IoIk5vIHRlbXBsYXRlIGZvdW5kIGZvciBuYW1lIFske2F0dHJzWyd0ZW1wbGF0ZSddfV0gaW4gdGFnIFtyZW5kZXJdIikKLQotICAgICAgICBkZWYgdCA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZSggIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKQotCi0gICAgICAgIGlmKGF0dHJzWydtb2RlbCddIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICB0Lm1ha2UoIGF0dHJzWydtb2RlbCddICkud3JpdGVUbyhvdXQpCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihhdHRyc1snY29sbGVjdGlvbiddKSB7Ci0gICAgICAgICAgICBhdHRyc1snY29sbGVjdGlvbiddLmVhY2ggewotICAgICAgICAgICAgICAgIHQubWFrZSggWydpdCc6IGl0XSApLndyaXRlVG8ob3V0KQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoYXR0cnNbJ2JlYW4nXSkgewotICAgICAgICAgICAgdC5tYWtlKCBbICdpdCcgOiBhdHRyc1snYmVhbiddIF0gKS53cml0ZVRvKG91dCkKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIHJlbmRlciBpbnB1dCBmb3IgYSBwcm9wZXJ0eSB2YWx1ZSBiYXNlZCBieSBhdHRlbXB0aW5nIHRvIGNob29zZSBhIHJlbmRlcmluZyBjb21wb25lbnQKLSAgICAgKiB0byB1c2UgYmFzZWQgb24gdGhlIHByb3BlcnR5IHR5cGUKLSAgICAgKi8KLSAgICBAUHJvcGVydHkgcmVuZGVySW5wdXQgPSB7IGF0dHJzLCBib2R5IC0+Ci0gICAgICAgIGRlZiBiZWFuID0gYXR0cnNbJ2JlYW4nXQotICAgICAgICBpZighYmVhbikgewotICAgICAgICAgICAgdGhyb3dUYWdFcnJvcigiVGFnIFtyZW5kZXJJbnB1dF0gaXMgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgW2JlYW5dIikKLSAgICAgICAgfQotICAgICAgICBpZighYXR0cnNbJ3Byb3BlcnR5J10pIHsKLSAgICAgICAgICAgIHRocm93VGFnRXJyb3IoIlRhZyBbcmVuZGVySW5wdXRdIGlzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFtwcm9wZXJ0eV0iKQotICAgICAgICB9Ci0KLSAgICAgICBkZWYgYXBwID0gZ3JhaWxzQXR0cmlidXRlcy5nZXRHcmFpbHNBcHBsaWNhdGlvbigpCi0gICAgICAgZGVmIGRjID0gYXBwLmdldEdyYWlsc0RvbWFpbkNsYXNzKGJlYW4uY2xhc3MubmFtZSkKLSAgICAgICBkZWYgcHYgPSBiZWFuLm1ldGFQcm9wZXJ0eVZhbHVlcy5maW5kIHsKLSAgICAgICAgICAgIGl0Lm5hbWUgPT0gYXR0cnNbJ3Byb3BlcnR5J10KLSAgICAgICB9Ci0gICAgICAgaWYoIXB2KSB7Ci0gICAgICAgICAgdGhyb3dUYWdFcnJvcigiUHJvcGVydHkgWyR7YXR0cnNbJ3Byb3BlcnR5J119XSBkb2VzIG5vdCBleGlzdCBpbiB0YWcgW3JlbmRlcklucHV0XSBmb3IgYmVhbiBbJHtiZWFufV0iKQotICAgICAgIH0KLSAgICAgICBkZWYgZW5naW5lID0gZ3JhaWxzQXR0cmlidXRlcy5nZXRQYWdlc1RlbXBsYXRlRW5naW5lKCkKLSAgICAgICBkZWYgdXJpID0gZmluZFVyaUZvclR5cGUocHYudHlwZSkKLQotICAgICAgIGlmKCF1cmkpCi0gICAgICAgICAgICB0aHJvd1RhZ0Vycm9yKCJUeXBlIFske3B2LnR5cGV9XSBpcyB1bnN1cHBvcnRlZCBieSB0YWcgW3JlbmRlcklucHV0XS4gTm8gdGVtcGxhdGUgZm91bmQuIikKLQotICAgICAgIGRlZiB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKCAgIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKQotICAgICAgIGlmKCF0KSB7Ci0gICAgICAgICAgICB0aHJvd1RhZ0Vycm9yKCJUeXBlIFske3B2LnR5cGV9XSBpcyB1bnN1cHBvcnRlZCBieSB0YWcgW3JlbmRlcklucHV0XS4gTm8gdGVtcGxhdGUgZm91bmQuIikKLSAgICAgICB9Ci0KLSAgICAgICBkZWYgYmluZGluZyA9IFsgbmFtZTpwdi5uYW1lLHZhbHVlOnB2LnZhbHVlXQotICAgICAgIGJpbmRpbmdbJ2NvbnN0cmFpbnRzJ10gPSAoZGMgPyBkYy5jb25zdHJhaW5lZFByb3BlcnRpZXMgOiBudWxsKQotCi0gICAgICAgdC5tYWtlKGJpbmRpbmcpLndyaXRlVG8ob3V0KQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGZpbmRVcmlGb3JUeXBlKHR5cGUpIHsKLSAgICAgICAgaWYodHlwZSA9PSBPYmplY3QuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZGVmIHVyaSA9ICIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvJHt0eXBlLm5hbWV9LmdzcCI7Ci0gICAgICAgIGRlZiB1cmwgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSh1cmkpCi0KLSAgICAgICAgaWYodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmkKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaW5kVXJpRm9yVHlwZSh0eXBlLnN1cGVyQ2xhc3MpCi0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC90YWdsaWIvRm9ybVRhZ0xpYi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9Gb3JtVGFnTGliLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExZWFmMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9Gb3JtVGFnTGliLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgYztwV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Ob1N1Y2hNZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuc3VwcG9ydC5SZXF1ZXN0Q29udGV4dFV0aWxzIGFzIFJDVTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NsYXNzVXRpbHMgYXMgR0NVOwotCi0gLyoqCi0gKiAgQSAgdGFnIGxpYiB0aGF0IHByb3ZpZGVzIHRhZ3MgZm9yIHdvcmtpbmcgd2l0aCBmb3JtIGNvbnRyb2xzCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTctSmFuLTIwMDYKLSAqLwotCi1jbGFzcyBGb3JtVGFnTGliIGV4dGVuZHMgQXBwbGljYXRpb25UYWdMaWIgewotICAgIC8qKgotICAgICAqICBHZW5lcmFsIGxpbmtpbmcgdG8gY29udHJvbGxlcnMsIGFjdGlvbnMgZXRjLiBFeGFtcGxlczoKLSAgICAgKgotICAgICAqICA8Zzpmb3JtIGFjdGlvbj0ibXlhY3Rpb24iPi4uLjwvZ3I6Zm9ybT4KLSAgICAgKiAgPGc6Zm9ybSBjb250cm9sbGVyPSJteWN0cmwiIGFjdGlvbj0ibXlhY3Rpb24iPi4uLjwvZ3I6Zm9ybT4KLSAgICAgKi8KLSAgICBAUHJvcGVydHkgZm9ybSA9IHsgYXR0cnMsIGJvZHkgLT4KLSAgICAgICAgb3V0IDw8ICI8Zm9ybSBhY3Rpb249XCIiCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbGluawotICAgICAgICBjcmVhdGVMaW5rKGF0dHJzKQotCi0gICAgICAgIG91dCA8PCAnXCIgJwotICAgICAgICAvLyBkZWZhdWx0IHRvIHBvc3QKLSAgICAgICAgaWYoIWF0dHJzWydtZXRob2QnXSkgewotICAgICAgICAgICAgb3V0IDw8ICdtZXRob2Q9InBvc3QiICcKLSAgICAgICAgfQotICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBhdHRyaWJ1dGVzCi0gICAgICAgIGF0dHJzLmVhY2ggeyBrLHYgLT4KLQotICAgICAgICAgICAgb3V0IDw8IGsgPDwgIj1cIiIgPDwgdiA8PCAiXCIgIgotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiPiIKLSAgICAgICAgLy8gb3V0cHV0IHRoZSBib2R5Ci0gICAgICAgIGJvZHkoKQotCi0gICAgICAgIC8vIGNsb3NlIHRhZwotICAgICAgICBvdXQgPDwgIjwvZm9ybT4iCi0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJtaXQgYnV0dG9uIHRoYXQgc3VibWl0cyB0byBhbiBhY3Rpb24gaW4gdGhlIGNvbnRyb2xsZXIgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtIGFjdGlvbgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyB0cmFuc2xhdGVkIGludG8gdGhlIGFjdGlvbiBuYW1lLCBmb3IgZXhhbXBsZSAiRWRpdCIgYmVjb21lcwotICAgICAqICJlZGl0IiBvciAiTGlzdCBQZW9wbGUiIGJlY29tZXMgImxpc3RQZW9wbGUiCi0gICAgICoKLSAgICAgKiAgPGc6YWN0aW9uU3VibWl0IHZhbHVlPSJFZGl0IiAvPgotICAgICAqCi0gICAgICovCi0gICAgQFByb3BlcnR5IGFjdGlvblN1Ym1pdCA9IHsgYXR0cnMgLT4KLSAgICAgICAgb3V0IDw8ICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJfYWN0aW9uIiAnCi0gICAgICAgIGRlZiB2YWx1ZSA9IGF0dHJzLnJlbW92ZSgndmFsdWUnKQotICAgICAgICBpZih2YWx1ZSkgewotICAgICAgICAgICAgIG91dCA8PCAidmFsdWU9JyR7dmFsdWV9JyIKLSAgICAgICAgfQotICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBhdHRyaWJ1dGVzCi0gICAgICAgIGF0dHJzLmVhY2ggeyBrLHYgLT4KLSAgICAgICAgICAgIG91dCA8PCBrIDw8ICI9XCIiIDw8IHYgPDwgIlwiICIKLSAgICAgICAgfQotICAgICAgICAvLyBjbG9zZSB0YWcKLSAgICAgICAgb3V0LnByaW50bG4gJy8+JwotCi0gICAgfQotICAgIC8qKgotICAgICAqIEEgc2ltcGxlIGRhdGUgcGlja2VyIHRoYXQgcmVuZGVycyBhIGRhdGUgYXMgc2VsZWN0cwotICAgICAqIGVnLiA8ZzpkYXRlUGlja2VyIG5hbWU9Im15RGF0ZSIgdmFsdWU9IiR7bmV3IERhdGUoKX0iIC8+Ci0gICAgICovCi0gICAgQFByb3BlcnR5IGRhdGVQaWNrZXIgPSB7IGF0dHJzIC0+Ci0gICAgICAgIGRlZiB2YWx1ZSA9IChhdHRyc1sndmFsdWUnXSA/IGF0dHJzWyd2YWx1ZSddIDogbmV3IERhdGUoKSkKLSAgICAgICAgZGVmIG5hbWUgPSBhdHRyc1snbmFtZSddCi0gICAgICAgIGRlZiBjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgIGMuc2V0VGltZSh2YWx1ZSkKLSAgICAgICAgZGVmIGRheSA9IGMuZ2V0KEdyZWdvcmlhbkNhbGVuZGFyLkRBWV9PRl9NT05USCkKLSAgICAgICAgZGVmIG1vbnRoID0gYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuTU9OVEgpCi0gICAgICAgIGRlZiB5ZWFyID0gYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuWUVBUikKLSAgICAgICAgZGVmIGhvdXIgPSBjLmdldChHcmVnb3JpYW5DYWxlbmRhci5IT1VSX09GX0RBWSkKLSAgICAgICAgZGVmIG1pbnV0ZSA9IGMuZ2V0KEdyZWdvcmlhbkNhbGVuZGFyLk1JTlVURSkKLQkJZGVmIGRmcyA9IG5ldyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMoUkNVLmdldExvY2FsZShyZXF1ZXN0KSkKLQotCi0gICAgICAgIG91dCA8PCAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nJHtuYW1lfScgdmFsdWU9J3N0cnVjdCcgLz4iCi0KLQkJLy8gY3JlYXRlIGRheSBzZWxlY3QKLSAgICAgICAgb3V0LnByaW50bG4gIjxzZWxlY3QgbmFtZT0nJHtuYW1lfV9kYXknPiIKLQotICAgICAgICBmb3IoaSBpbiAxLi4oZGF5LTEpKSB7Ci0gICAgICAgICAgICAgICBvdXQucHJpbnRsbiAiPG9wdGlvbiB2YWx1ZT0nJHtpfSc+JHtpfTwvb3B0aW9uPiIKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbiAiPG9wdGlvbiB2YWx1ZT0nJHtkYXl9JyBzZWxlY3RlZD0nc2VsZWN0ZWQnPiR7ZGF5fTwvb3B0aW9uPiIKLSAgICAgICAgZm9yKGkgaW4gKGRheSsxKS4uMzEpIHsKLSAgICAgICAgICAgICAgIG91dC5wcmludGxuICI8b3B0aW9uIHZhbHVlPScke2l9Jz4ke2l9PC9vcHRpb24+IgotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuICc8L3NlbGVjdD4nCi0JCS8vIGNyZWF0ZSBtb250aCBzZWxlY3QKLQkJb3V0LnByaW50bG4gIjxzZWxlY3QgbmFtZT0nJHtuYW1lfV9tb250aCc+IgotCQlkZnMubW9udGhzLmVhY2hXaXRoSW5kZXggeyBtLGkgLT4KLQkJCWlmKG0pIHsKLQkJCQlkZWYgbW9udGhJbmRleCA9IGkgKyAxCi0JCQkJb3V0IDw8ICI8b3B0aW9uIHZhbHVlPScke2l9JyIKLQkJCQlpZihtb250aCA9PSBpKSBvdXQgPDwgJ3NlbGVjdGVkPSJzZWxlY3RlZCInCi0JCQkJb3V0IDw8ICc+JwotCQkJCW91dCA8PCBtCi0JCQkJb3V0LnByaW50bG4gJzwvb3B0aW9uPicKLQkJCX0KLQkJfQotCQlvdXQucHJpbnRsbiAnPC9zZWxlY3Q+JwotCQkvLyBjcmVhdGUgeWVhciBzZWxlY3QKLQkJb3V0LnByaW50bG4gIjxzZWxlY3QgbmFtZT0nJHtuYW1lfV95ZWFyJz4iCi0gICAgICAgIGZvcihpIGluICh5ZWFyIC0gMTAwKS4uKHllYXItMSkpIHsKLQkJCW91dC5wcmludGxuICI8b3B0aW9uIHZhbHVlPScke2l9Jz4ke2l9PC9vcHRpb24+IgotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuICI8b3B0aW9uIHZhbHVlPScke3llYXJ9JyBzZWxlY3RlZD0nc2VsZWN0ZWQnPiR7eWVhcn08L29wdGlvbj4iCi0gICAgICAgIGZvcihpIGluICh5ZWFyICsgMSkuLih5ZWFyKzEwMCkpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuICI8b3B0aW9uIHZhbHVlPScke2l9Jz4ke2l9PC9vcHRpb24+IgotICAgICAgICB9Ci0JCW91dC5wcmludGxuICc8L3NlbGVjdD4nCi0JCS8vIGRvIGhvdXIgc2VsZWN0Ci0JCW91dC5wcmludGxuICI8c2VsZWN0IG5hbWU9JyR7bmFtZX1faG91cic+IgotICAgICAgICBmb3IoaSBpbiAwLi4yMykgewotCQkJZGVmIGggPSAnJyArIGkKLQkJCWlmKGkgPCAxMCkgaCA9ICcwJyArIGgKLQkJCW91dCA8PCAiPG9wdGlvbiB2YWx1ZT0nJHtofScgIgotCQkJaWYoaG91ciA9PSBoKSBvdXQgPDwgInNlbGVjdGVkPSdzZWxlY3RlZCciCi0JCQlvdXQgPDwgJz4nIDw8IGggPDwgJzwvb3B0aW9uPicKLQkJCW91dC5wcmludGxuKCkKLQkJfQotCQlvdXQucHJpbnRsbiAnPC9zZWxlY3Q+IDonCi0KLQkJLy8gZG8gbWludXRlIHNlbGVjdAotCQlvdXQucHJpbnRsbiAiPHNlbGVjdCBuYW1lPScke25hbWV9X21pbnV0ZSc+IgotICAgICAgICBmb3IoaSBpbiAwLi41OSkgewotCQkJZGVmIG0gPSAnJyArIGkKLQkJCWlmKGkgPCAxMCkgbSA9ICcwJyArIG0KLQkJCW91dCA8PCAiPG9wdGlvbiB2YWx1ZT0nJHttfScgIgotCQkJaWYobWludXRlID09IG0pIG91dCA8PCAic2VsZWN0ZWQ9J3NlbGVjdGVkJyIKLQkJCW91dCA8PCAnPicgPDwgbSA8PCAnPC9vcHRpb24+JwotCQkJb3V0LnByaW50bG4oKQotCQl9Ci0JCW91dC5wcmludGxuICc8L3NlbGVjdD4nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEEgaGVscGVyIHRhZyBmb3IgY3JlYXRpbmcgVGltZVpvbmUgc2VsZWN0cwotICAgICAqIGVnLiA8Zzp0aW1lWm9uZVNlbGVjdCBuYW1lPSJteVRpbWVab25lIiB2YWx1ZT0iJHt0en0iIC8+Ci0gICAgICovCi0gICAgQFByb3BlcnR5IHRpbWVab25lU2VsZWN0ID0geyBhdHRycyAtPgotICAgICAgICBhdHRyc1snZnJvbSddID0gVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzKCk7Ci0gICAgICAgIGF0dHJzWyd2YWx1ZSddID0gKGF0dHJzWyd2YWx1ZSddID8gYXR0cnNbJ3ZhbHVlJ10uSUQgOiBUaW1lWm9uZS5nZXREZWZhdWx0KCkuSUQgKQotCi0gICAgICAgIC8vIHNldCB0aGUgb3B0aW9uIHZhbHVlIGFzIGEgY2xvc3VyZSB0aGF0IGZvcm1hdHMgdGhlIFRpbWVab25lIGZvciBkaXNwbGF5Ci0gICAgICAgIGF0dHJzWydvcHRpb25WYWx1ZSddID0gewotICAgICAgICAgICAgVGltZVpvbmUgdHogPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShpdCk7Ci0gICAgICAgICAgICBkZWYgc2hvcnROYW1lID0gdHouZ2V0RGlzcGxheU5hbWUodHouaW5EYXlsaWdodFRpbWUoZGF0ZSksVGltZVpvbmUuU0hPUlQpOwotICAgICAgICAgICAgZGVmIGxvbmdOYW1lID0gdHouZ2V0RGlzcGxheU5hbWUodHouaW5EYXlsaWdodFRpbWUoZGF0ZSksVGltZVpvbmUuTE9ORyk7Ci0KLSAgICAgICAgICAgIGRlZiBvZmZzZXQgPSB0ei5yYXdPZmZzZXQ7Ci0gICAgICAgICAgICBkZWYgaG91ciA9IG9mZnNldCAvICg2MCo2MCoxMDAwKTsKLSAgICAgICAgICAgIGRlZiBtaW4gPSBNYXRoLmFicyhvZmZzZXQgLyAoNjAqMTAwMCkpICUgNjA7Ci0KLSAgICAgICAgICAgIHJldHVybiAiJHtzaG9ydE5hbWV9LCAke2xvbmdOYW1lfSAke2hvdXJ9OiR7bWlufSIKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVzZSBnZW5lcmljIHNlbGVjdAotICAgICAgICBzZWxlY3QoIGF0dHJzICkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQSBoZWxwZXIgdGFnIGZvciBjcmVhdGluZyBsb2NhbGUgc2VsZWN0cwotICAgICAqCi0gICAgICogZWcuIDxnOmxvY2FsZVNlbGVjdCBuYW1lPSJteUxvY2FsZSIgdmFsdWU9IiR7bG9jYWxlfSIgLz4KLSAgICAgKi8KLSAgICBAUHJvcGVydHkgbG9jYWxlU2VsZWN0ID0ge2F0dHJzIC0+Ci0gICAgICAgIGF0dHJzWydmcm9tJ10gPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpCi0gICAgICAgIGF0dHJzWyd2YWx1ZSddID0gKGF0dHJzWyd2YWx1ZSddID8gYXR0cnNbJ3ZhbHVlJ10gOiBSQ1UuZ2V0TG9jYWxlKHJlcXVlc3QpICkKLSAgICAgICAgLy8gc2V0IHRoZSBrZXkgYXMgYSBjbG9zdXJlIHRoYXQgZm9ybWF0cyB0aGUgbG9jYWxlCi0gICAgICAgIGF0dHJzWydvcHRpb25LZXknXSA9IHsgIiR7aXQubGFuZ3VhZ2V9XyR7aXQuY291bnRyeX0iIH0KLSAgICAgICAgLy8gc2V0IHRoZSBvcHRpb24gdmFsdWUgYXMgYSBjbG9zdXJlIHRoYXQgZm9ybWF0cyB0aGUgbG9jYWxlIGZvciBkaXNwbGF5Ci0gICAgICAgIGF0dHJzWydvcHRpb25WYWx1ZSddID0geyAiJHtpdC5sYW5ndWFnZX0sICR7aXQuY291bnRyeX0sICAke2l0LmRpc3BsYXlOYW1lfSIgfQotCi0gICAgICAgIC8vIHVzZSBnZW5lcmljIHNlbGVjdAotICAgICAgICBzZWxlY3QoIGF0dHJzICkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciB0YWcgZm9yIGNyZWF0aW5nIGN1cnJlbmN5IHNlbGVjdHMKLSAgICAgKgotICAgICAqIGVnLiA8ZzpjdXJyZW5jeVNlbGVjdCBuYW1lPSJteUN1cnJlbmN5IiB2YWx1ZT0iJHtjdXJyZW5jeX0iIC8+Ci0gICAgICovCi0gICAgQFByb3BlcnR5IGN1cnJlbmN5U2VsZWN0ID0geyBhdHRycywgYm9keSAtPgotICAgICAgICBpZighYXR0cnNbJ2Zyb20nXSkgewotICAgICAgICAgICAgYXR0cnNbJ2Zyb20nXSA9IFsnRVVSJywgJ1hDRCcsJ1VTRCcsJ1hPRicsJ05PSycsJ0FVRCcsJ1hBRicsJ05aRCcsJ01BRCcsJ0RLSycsJ0dCUCcsJ0NIRicsJ1hQRicsJ0lMUycsJ1JPTCcsJ1RSTCddCi0gICAgICAgIH0KLSAgICAgICAgZGVmIGN1cnJlbmN5ID0gKGF0dHJzWyd2YWx1ZSddID8gYXR0cnNbJ3ZhbHVlJ10gOiBDdXJyZW5jeS5nZXRJbnN0YW5jZSggUkNVLmdldExvY2FsZShyZXF1ZXN0KSApKQotICAgICAgICBhdHRyc1sndmFsdWUnXSA9IGN1cnJlbmN5LmN1cnJlbmN5Q29kZQotICAgICAgICAvLyBpbnZva2UgZ2VuZXJpYyBzZWxlY3QKLSAgICAgICAgc2VsZWN0KCBhdHRycyApCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgdGFnIGZvciBjcmVhdGluZyBIVE1MIHNlbGVjdHMKLSAgICAgKgotICAgICAqIEV4YW1wbGVzOgotICAgICAqIDxnOnNlbGVjdCBuYW1lPSJ1c2VyLmFnZSIgZnJvbT0iJHsxOC4uNjV9IiB2YWx1ZT0iJHthZ2V9IiAvPgotICAgICAqIDxnOnNlbGVjdCBuYW1lPSJ1c2VyLmNvbXBhbnkuaWQiIGZyb209IiR7Q29tcGFueS5saXN0KCl9IiB2YWx1ZT0iJHt1c2VyPy5jb21wYW55LmlkfSIgb3B0aW9uS2V5PSJpZCIgLz4KLSAgICAgKi8KLSAgICBAUHJvcGVydHkgc2VsZWN0ID0geyBhdHRycyAtPgotICAgICAgICBkZWYgZnJvbSA9IGF0dHJzLnJlbW92ZSgnZnJvbScpCi0gICAgICAgIGRlZiBvcHRpb25LZXkgPSBhdHRycy5yZW1vdmUoJ29wdGlvbktleScpCi0gICAgICAgIGRlZiBvcHRpb25WYWx1ZSA9IGF0dHJzLnJlbW92ZSgnb3B0aW9uVmFsdWUnKQotICAgICAgICBkZWYgdmFsdWUgPSBhdHRycy5yZW1vdmUoJ3ZhbHVlJykKLQotICAgICAgICBvdXQgPDwgIjxzZWxlY3QgbmFtZT0nJHthdHRycy5yZW1vdmUoJ25hbWUnKX0nICIKLSAgICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgYXR0cmlidXRlcwotICAgICAgICBhdHRycy5lYWNoIHsgayx2IC0+Ci0gICAgICAgICAgICBvdXQgPDwgayA8PCAiPVwiIiA8PCB2IDw8ICJcIiAiCi0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICc+JwotICAgICAgICBvdXQucHJpbnRsbigpCi0gICAgICAgIC8vIGNyZWF0ZSBvcHRpb25zIGZyb20gbGlzdAotICAgICAgICBpZihmcm9tKSB7Ci0gICAgICAgICAgICBmcm9tLmVhY2ggewotICAgICAgICAgICAgICAgIG91dCA8PCAnPG9wdGlvbiAnCi0gICAgICAgICAgICAgICAgaWYob3B0aW9uS2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvbktleSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgJ3ZhbHVlPSInIDw8IG9wdGlvbktleShpdCkgPDwgJyIgJwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICd2YWx1ZT0iJyA8PCBpdC5wcm9wZXJ0aWVzW29wdGlvbktleV0gPDwgJyIgJwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoaXQucHJvcGVydGllc1tvcHRpb25LZXldID09IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgJ3NlbGVjdGVkPSJzZWxlY3RlZCIgJwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQgPDwgInZhbHVlPScke2l0fScgIgotICAgICAgICAgICAgICAgICAgICBpZihpdCA9PSB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICdzZWxlY3RlZD0ic2VsZWN0ZWQiICcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXQgPDwgJz4nCi0gICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IG9wdGlvblZhbHVlKGl0KQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGl0LnByb3BlcnRpZXNbb3B0aW9uVmFsdWVdCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgb3V0IDw8IGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dCA8PCAnPC9vcHRpb24+JwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBjbG9zZSB0YWcKLSAgICAgICAgb3V0IDw8ICc8L3NlbGVjdD4nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBoZWxwZXIgdGFnIGZvciBjcmVhdGluZyBjaGVja2JveGVzCi0gICAgICoqLwotICAgIEBQcm9wZXJ0eSBjaGVja0JveCA9IHsgYXR0cnMgLT4KLSAgICAgICAgICBkZWYgdmFsdWUgPSBhdHRycy5yZW1vdmUoJ3ZhbHVlJykKLSAgICAgICAgICBkZWYgbmFtZSA9IGF0dHJzLnJlbW92ZSgnbmFtZScpCi0gICAgICAgICAgaWYoIXZhbHVlKSB2YWx1ZSA9IGZhbHNlCi0gICAgICAgICAgb3V0IDw8ICc8aW5wdXQgdHlwZT0iaGlkZGVuIicKLSAgICAgICAgICBvdXQgPDwgIm5hbWU9J18ke25hbWV9JyAvPiIKLSAgICAgICAgICBvdXQgPDwgJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgJwotICAgICAgICAgIG91dCA8PCAibmFtZT0nJHtuYW1lfScgIgotICAgICAgICAgIGlmKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICdjaGVja2VkPSJjaGVja2VkIiAnCi0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCAidmFsdWU9J3RydWUnICIKLSAgICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgYXR0cmlidXRlcwotICAgICAgICBhdHRycy5lYWNoIHsgayx2IC0+Ci0gICAgICAgICAgICBvdXQgPDwgayA8PCAiPVwiIiA8PCB2IDw8ICJcIiAiCi0gICAgICAgIH0KLSAgICAgICAgLy8gY2xvc2UgdGhlIHRhZywgd2l0aCBubyBib2R5Ci0gICAgICAgIG91dCA8PCAnIC8+JwotCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC90YWdsaWIvSmF2YXNjcmlwdFRhZ0xpYi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9KYXZhc2NyaXB0VGFnTGliLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4ZDA1OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9KYXZhc2NyaXB0VGFnTGliLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgYztwV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Ob1N1Y2hNZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuc3VwcG9ydC5SZXF1ZXN0Q29udGV4dFV0aWxzIGFzIFJDVTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NsYXNzVXRpbHMgYXMgR0NVOwotCi0gLyoqCi0gKiAgQSAgdGFnIGxpYiB0aGF0IHByb3ZpZGVzIHRhZ3MgZm9yIGRldmVsb3BpbmcgamF2YXNjcmlwdCBhbmQgYWpheCBhcHBsaWNhdGlvbnMKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxNy1KYW4tMjAwNgotICovCi1jbGFzcyBKYXZhc2NyaXB0VGFnTGliIGV4dGVuZHMgQXBwbGljYXRpb25UYWdMaWIgIHsKLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgcmVtb3RlIGZ1bmN0aW9uIGNhbGwgdXNpbmcgdGhlIHByb3RvdHlwZSBsaWJyYXJ5Ci0gICAgICovCi0gICAgQFByb3BlcnR5IHJlbW90ZUZ1bmN0aW9uID0geyBhdHRycyAgLT4KLSAgICAgICAgLy8gYmVmb3JlIHJlbW90ZSBmdW5jdGlvbgotICAgICAgICBkZWYgYWZ0ZXIgPSAnJwotICAgICAgICBpZihhdHRyc1siYmVmb3JlIl0pCi0gICAgICAgICAgICBvdXQgPDwgIiR7YXR0cnMucmVtb3ZlKCdiZWZvcmUnKX07IgotICAgICAgICBpZihhdHRyc1siYWZ0ZXIiXSkKLSAgICAgICAgICAgIGFmdGVyID0gIiR7YXR0cnMucmVtb3ZlKCdhZnRlcicpfTsiCi0KLSAgICAgICAgb3V0IDw8ICduZXcgQWpheC4nCi0gICAgICAgIGlmKGF0dHJzWyJ1cGRhdGUiXSkgewotICAgICAgICAgICAgb3V0IDw8ICdVcGRhdGVyKCcKLSAgICAgICAgICAgIGlmKGF0dHJzWyJ1cGRhdGUiXSBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgIG91dCA8PCAieyIKLSAgICAgICAgICAgICAgICBkZWYgdXBkYXRlID0gW10KLSAgICAgICAgICAgICAgICBpZihhdHRyc1sidXBkYXRlIl1bInN1Y2Nlc3MiXSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGUgPDwgInN1Y2Nlc3M6JyR7YXR0cnNbJ3VwZGF0ZSddWydzdWNjZXNzJ119JyIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYXR0cnNbInVwZGF0ZSJdWyJmYWlsdXJlIl0pIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlIDw8ICJmYWlsdXJlOicke2F0dHJzWyd1cGRhdGUnXVsnZmFpbHVyZSddfSciCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dCA8PCB1cGRhdGUuam9pbignLCcpCi0gICAgICAgICAgICAgICAgb3V0IDw8ICJ9LCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG91dCA8PCAiJyIgPDwgYXR0cnNbInVwZGF0ZSJdIDw8ICInLCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJzLnJlbW92ZSgidXBkYXRlIikKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVxdWVzdCgiCi0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwgIiciCi0gICAgICAgIGlmKGF0dHJzWyd1cmwnXSkgewotICAgICAgICAgICAgY3JlYXRlTGluayhhdHRyc1sndXJsJ10pCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjcmVhdGVMaW5rKGF0dHJzKQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8ICInLCIKLQotICAgICAgICAvLyBwcm9jZXNzIG9wdGlvbnMKLSAgICAgICAgb3V0IDw8IGdldEFqYXhPcHRpb25zKGF0dHJzKQotICAgICAgICAvLyBjbG9zZQotICAgICAgICBvdXQgPDwgJyk7JwotCi0gICAgICAgIC8vIGFmdGVyIHJlbW90ZSBmdW5jdGlvbgotICAgICAgICBpZihhZnRlcikKLSAgICAgICAgICAgb3V0IDw8ICBhZnRlcgotICAgIH0KLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBidWlsZCBhamF4IG9wdGlvbnMKLSAgICBkZWYgZ2V0QWpheE9wdGlvbnMob3B0aW9ucykgewotICAgICAgICBkZWYgYWpheE9wdGlvbnMgPSBbXQotCi0gICAgICAgIGlmKG9wdGlvbnMpIHsKLSAgICAgICAgICAgIC8vIHByb2Nlc3MgY2FsbGJhY2tzCi0gICAgICAgICAgICBkZWYgY2FsbGJhY2tzID0gb3B0aW9ucy5maW5kQWxsIHsgayx2IC0+Ci0gICAgICAgICAgICAgICAgayA9PX4gL29uKFxwe1VwcGVyfXxcZCl7MX1cdysvCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYWxsYmFja3MuZWFjaCB7IGssdiAtPgotICAgICAgICAgICAgICAgIGFqYXhPcHRpb25zIDw8ICIke2t9OmZ1bmN0aW9uKGUpeyR7dn19IgotICAgICAgICAgICAgICAgIG9wdGlvbnMucmVtb3ZlKGspCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkZWZhdWx0cwotICAgICAgICAgICAgaWYob3B0aW9uc1snYXN5bmNocm9ub3VzJ10pCi0gICAgICAgICAgICAgICAgYWpheE9wdGlvbnMgPDwgImFzeW5jaHJvbm91czoke29wdGlvbnMucmVtb3ZlKCdhc3luY2hyb25vdXMnKX0iCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWpheE9wdGlvbnMgPDwgImFzeW5jaHJvbm91czp0cnVlIgotCi0KLSAgICAgICAgICAgIGlmKG9wdGlvbnNbJ2V2YWxTY3JpcHRzJ10pCi0gICAgICAgICAgICAgICAgYWpheE9wdGlvbnMgPDwgImV2YWxTY3JpcHRzOiR7b3B0aW9ucy5yZW1vdmUoJ2V2YWxTY3JpcHRzJyl9IgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFqYXhPcHRpb25zIDw8ICJldmFsU2NyaXB0czp0cnVlIgotCi0gICAgICAgICAgICBpZihvcHRpb25zWydwYXJhbWV0ZXJzJ10pIHsKLSAgICAgICAgICAgICAgICBhamF4T3B0aW9ucyA8PCAicGFyYW1ldGVyczoke29wdGlvbnMucmVtb3ZlKCdwYXJhbWV0ZXJzJyl9IgotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcmVtYWluaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIG9wdGlvbnMuZWFjaCB7IGssIHYgLT4KLSAgICAgICAgICAgICAgICAgc3dpdGNoKHYpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAndHJ1ZSc6IGFqYXhPcHRpb25zIDw8ICIke2t9OiR7dn0iOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmFsc2UnOiBhamF4T3B0aW9ucyA8PCAiJHtrfToke3Z9IjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ugfi9ccypmdW5jdGlvbihcdyopXHMqLzogYWpheE9wdGlvbnMgPDwgIiR7a306JHt2fSI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OmFqYXhPcHRpb25zIDw8ICIke2t9Oicke3Z9JyI7IGJyZWFrOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHRzCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGFqYXhPcHRpb25zIDw8ICJhc3luY2hyb25vdXM6dHJ1ZSIKLSAgICAgICAgICAgICBhamF4T3B0aW9ucyA8PCAiZXZhbFNjcmlwdHM6dHJ1ZSIKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAieyR7YWpheE9wdGlvbnMuam9pbignLCcpfX0iCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBsaW5rIHRvIGEgcmVtb3RlIHVyaSB0aGF0IHVzZWQgdGhlIHByb3RvdHlwZSBsaWJyYXJ5IHRvIGludm9rZSB0aGUgbGluayB2aWEgYWpheAotICAgICAqLwotICAgIEBQcm9wZXJ0eSByZW1vdGVMaW5rID0geyBhdHRycywgYm9keSAtPgotICAgICAgIG91dCA8PCAiPGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwiIgotICAgICAgICAvLyBjcmVhdGUgcmVtb3RlIGZ1bmN0aW9uCi0gICAgICAgIHJlbW90ZUZ1bmN0aW9uKGF0dHJzKQotICAgICAgICBvdXQgPDwgJ3JldHVybiBmYWxzZTsiICcKLSAgICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgYXR0cmlidXRlcwotICAgICAgICBhdHRycy5lYWNoIHsgayx2IC0+Ci0gICAgICAgICAgICBvdXQgPDwgayA8PCAiPVwiIiA8PCB2IDw8ICJcIiAiCi0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICI+IgotICAgICAgICAvLyBvdXRwdXQgdGhlIGJvZHkKLSAgICAgICAgYm9keSgpCi0KLSAgICAgICAgLy8gY2xvc2UgdGFnCi0gICAgICAgIG91dCA8PCAiPC9hPiIKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGZvcm0gd2hpY2ggdXNlZCBwcm90b3R5cGUgdG8gc2VyaWFsaXplIGl0cyBwYXJhbWV0ZXJzIGFuZCBzdWJtaXQgdmlhIGFuIGFzeW5jaHJvbm91cyBhamF4IGNhbGwKLSAgICAgKi8KLSAgICBAUHJvcGVydHkgZm9ybVJlbW90ZSA9IHsgYXR0cnMsIGJvZHkgLT4KLSAgICAgICBhdHRyc1sncGFyYW1ldGVycyddID0gIkZvcm0uc2VyaWFsaXplKHRoaXMpIgotICAgICAgIG91dCA8PCAnPGZvcm0gb25zdWJtaXQ9IicgPDwgcmVtb3RlRnVuY3Rpb24oYXR0cnMpIDw8ICc7cmV0dXJuIGZhbHNlOyIgJwotICAgICAgIG91dCA8PCAnbWV0aG9kPSInIDw8ICAoYXR0cnNbJ21ldGhvZCddID8gYXR0cnNbJ21ldGhvZCddIDogJ3Bvc3QnKSA8PCAnIiAnCi0gICAgICAgb3V0IDw8ICdhY3Rpb249IicgPDwgIChhdHRyc1snYWN0aW9uJ10gPyBhdHRyc1snYWN0aW9uJ10gOiBjcmVhdGVMaW5rKGF0dHJzWyd1cmwnXSkpIDw8ICciPicKLQotICAgICAgICAvLyBvdXRwdXQgYm9keQotICAgICAgICAgICBib2R5KCkKLSAgICAgICAgLy8gY2xvc2UgdGFnCi0gICAgICAgb3V0IDw8ICc8L2Zvcm0+JwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDcmVhdGVzIGEgZm9ybSBzdWJtaXQgYnV0dG9uIHRoYXQgc3VibWl0cyB0aGUgY3VycmVudCBmb3JtIHRvIGEgcmVtb3RlIGFqYXggY2FsbAotICAgICAqLwotICAgIEBQcm9wZXJ0eSBzdWJtaXRUb1JlbW90ZSA9IHsgYXR0cnMsIGJvZHkgLT4KLSAgICAgICAgYXR0cnNbJ3BhcmFtZXRlcnMnXSA9ICJGb3JtLnNlcmlhbGl6ZSh0aGlzLmZvcm0pIgotICAgICAgICBvdXQgPDwgIjxpbnB1dCB0eXBlPSdidXR0b24nIG5hbWU9JyR7YXR0cnMucmVtb3ZlKCduYW1lJyl9JyB2YWx1ZT0nJHthdHRycy5yZW1vdmUoJ3ZhbHVlJyl9JyAiCi0gICAgICAgIG91dCA8PCAnb25jbGljaz0iJwotICAgICAgICByZW1vdGVGdW5jdGlvbihhdHRycykKLSAgICAgICAgb3V0IDw8ICc7cmV0dXJuIGZhbHNlOyIgLz4nCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC90YWdsaWIvVmFsaWRhdGlvblRhZ0xpYi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9WYWxpZGF0aW9uVGFnTGliLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3YmRmZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3RhZ2xpYi9WYWxpZGF0aW9uVGFnTGliLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgYztwV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Ob1N1Y2hNZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuc3VwcG9ydC5SZXF1ZXN0Q29udGV4dFV0aWxzIGFzIFJDVTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NsYXNzVXRpbHMgYXMgR0NVOwotCi0vKioKLSogIEEgIHRhZyBsaWIgdGhhdCBwcm92aWRlcyB0YWdzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIGFuZCBlcnJvcnMKLSoKLSogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0qIEBzaW5jZSAxNy1KYW4tMjAwNgotKi8KLQotY2xhc3MgVmFsaWRhdGlvblRhZ0xpYiBleHRlbmRzIEFwcGxpY2F0aW9uVGFnTGliIHsKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHJlcXVlc3QgaGFzIGVycm9ycyBlaXRoZXIgZm9yIGEgZmllbGQgb3IgZ2xvYmFsIGVycm9ycwotICAgICAqLwotICAgIEBQcm9wZXJ0eSBoYXNFcnJvcnMgPSB7IGF0dHJzLCBib2R5IC0+Ci0gICAgICAgIGRlZiBtb2RlbCA9IGF0dHJzWydtb2RlbCddCi0gICAgICAgIGRlZiBjaGVja0xpc3QgPSBbXQotICAgICAgICBpZihtb2RlbCkgewotICAgICAgICAgICAgY2hlY2tMaXN0ID0gbW9kZWwuZmluZEFsbCB7IGssdiAtPgotICAgICAgICAgICAgICAgIGdyYWlsc0FwcGxpY2F0aW9uLmlzR3JhaWxzRG9tYWluQ2xhc3Modi5jbGFzcykKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihhdHRyc1snYmVhbiddKSB7Ci0gICAgICAgICAgICBjaGVja0xpc3QgPDwgYXR0cnNbJ2JlYW4nXQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCQkJaWYocmVxdWVzdC5hdHRyaWJ1dGVOYW1lcykgewotCQkJCXJlcXVlc3QuYXR0cmlidXRlTmFtZXMuZWFjaCB7Ci0JCQkJCWRlZiByYSA9IHJlcXVlc3RbaXRdCi0JCQkJCWlmKHJhIGluc3RhbmNlb2YgRXJyb3JzKQotCQkJCQkJY2hlY2tMaXN0IDw8IHJhCi0JCQkJCWVsc2UgaWYoZ3JhaWxzQXBwbGljYXRpb24uaXNHcmFpbHNEb21haW5DbGFzcyhyYS5jbGFzcykpCi0JCQkJCQljaGVja0xpc3QgPDwgcmEKLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaSBpbiBjaGVja0xpc3QpIHsKLSAgICAgICAgICAgIGRlZiBlcnJvcnMgPSBudWxsCi0gICAgICAgICAgICBpZihncmFpbHNBcHBsaWNhdGlvbi5pc0dyYWlsc0RvbWFpbkNsYXNzKGkuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgaWYoaS5oYXNFcnJvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gaS5lcnJvcnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoaSBpbnN0YW5jZW9mIEVycm9ycykgewotICAgICAgICAgICAgICAgZXJyb3JzID0gaQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgaWYoYXR0cnNbJ2ZpZWxkJ10pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZXJyb3JzLmhhc0ZpZWxkRXJyb3JzKGF0dHJzWydmaWVsZCddKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9keSgpCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHkoKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb3BzIHRocm91Z2ggZWFjaCBlcnJvciBmb3IgZWl0aGVyIGZpZWxkIG9yIGdsb2JhbCBlcnJvcnMKLSAgICAgKi8KLSAgICBAUHJvcGVydHkgZWFjaEVycm9yID0geyBhdHRycywgYm9keSAtPgotICAgICAgICBkZWYgbW9kZWwgPSBhdHRyc1snbW9kZWwnXQotICAgICAgICBkZWYgZXJyb3JMaXN0ID0gW10KLSAgICAgICAgaWYobW9kZWwpIHsKLSAgICAgICAgICAgIGVycm9yTGlzdCA9IG1vZGVsLmZpbmRBbGwgeyBrLHYgLT4KLSAgICAgICAgICAgICAgICBncmFpbHNBcHBsaWNhdGlvbi5pc0dyYWlsc0RvbWFpbkNsYXNzKHYuY2xhc3MpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYXR0cnNbJ2JlYW4nXSkgewotICAgICAgICAgICAgZXJyb3JMaXN0IDw8IGF0dHJzWydiZWFuJ10KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcXVlc3QuYXR0cmlidXRlTmFtZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgZGVmIHJhID0gcmVxdWVzdFtpdF0KLSAgICAgICAgICAgICAgICBpZihyYSBpbnN0YW5jZW9mIEVycm9ycykKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0IDw8IHJhCi0gICAgICAgICAgICAgICAgZWxzZSBpZihncmFpbHNBcHBsaWNhdGlvbi5pc0dyYWlsc0RvbWFpbkNsYXNzKHJhLmNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0IDw8IHJhCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaSBpbiBlcnJvckxpc3QpIHsKLSAgICAgICAgICAgIGRlZiBlcnJvcnMgPSBudWxsCi0gICAgICAgICAgICBpZihncmFpbHNBcHBsaWNhdGlvbi5pc0dyYWlsc0RvbWFpbkNsYXNzKGkuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgaWYoaS5oYXNFcnJvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gaS5lcnJvcnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoaSBpbnN0YW5jZW9mIEVycm9ycykgewotICAgICAgICAgICAgICAgZXJyb3JzID0gaQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZXJyb3JzICYmIGVycm9ycy5oYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIGlmKGF0dHJzWydmaWVsZCddKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVycm9ycy5oYXNGaWVsZEVycm9ycyhhdHRyc1snZmllbGQnXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5nZXRGaWVsZEVycm9ycyggYXR0cnNbImZpZWxkIl0gKS5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5KGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWxsRXJyb3JzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgYm9keSggaXQgKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9vcHMgdGhyb3VnaCBlYWNoIGVycm9yIGFuZCByZW5kZXJzIGl0IHVzaW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIG1lY2hhbmlzbXMgKGRlZmF1bHRzIHRvICJsaXN0IiBpZiB1bnN1cHBvcnRlZCkKLSAgICAgKi8KLSAgICBAUHJvcGVydHkgcmVuZGVyRXJyb3JzID0geyBhdHRycywgYm9keSAtPgotICAgICAgICBkZWYgcmVuZGVyQXMgPSBhdHRycy5yZW1vdmUoJ2FzJykKLSAgICAgICAgaWYoIXJlbmRlckFzKSByZW5kZXJBcyA9ICdsaXN0JwotCi0gICAgICAgIGlmKHJlbmRlckFzID09ICdsaXN0JykgewotICAgICAgICAgICAgb3V0IDw8ICI8dWw+IgotICAgICAgICAgICAgZWFjaEVycm9yKGF0dHJzLCB7Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICI8bGk+IgotICAgICAgICAgICAgICAgIG1lc3NhZ2UoZXJyb3I6aXQpCi0gICAgICAgICAgICAgICAgb3V0IDw8ICI8L2xpPiIKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKQotICAgICAgICAgICAgb3V0IDw8ICI8L3VsPiIKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBhIG1lc3NhZ2UgY29kZSBmb3IgYSBnaXZlbiBlcnJvciBvciBjb2RlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZQotICAgICAqLwotICAgIEBQcm9wZXJ0eSBtZXNzYWdlID0geyBhdHRycyAtPgotICAgICAgICAgIGRlZiBtZXNzYWdlU291cmNlID0gZ3JhaWxzQXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJlYW4oIm1lc3NhZ2VTb3VyY2UiKQotCi0gICAgICAgICAgZGVmIGxvY2FsZSA9IFJDVS5nZXRMb2NhbGUocmVxdWVzdCkKLQotICAgICAgICAgIGlmKGF0dHJzWydlcnJvciddKSB7Ci0gICAgICAgICAgICAgICAgZGVmIGVycm9yID0gYXR0cnNbJ2Vycm9yJ10KLSAgICAgICAgICAgICAgICBkZWYgZGVmYXVsdE1lc3NhZ2UgPSAoIGF0dHJzWydkZWZhdWx0J10gPyBhdHRyc1snZGVmYXVsdCddIDogZXJyb3IuZGVmYXVsdE1lc3NhZ2UgKQotICAgICAgICAgICAgICAgIGRlZiBtZXNzYWdlID0gbWVzc2FnZVNvdXJjZS5nZXRNZXNzYWdlKCBlcnJvci5jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5hcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgKQotICAgICAgICAgICAgICAgIGlmKG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0IDw8IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA8PCBlcnJvci5jb2RlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZihhdHRyc1snY29kZSddKSB7Ci0gICAgICAgICAgICAgICAgZGVmIGNvZGUgPSBhdHRyc1snY29kZSddCi0gICAgICAgICAgICAgICAgZGVmIGRlZmF1bHRNZXNzYWdlID0gKCBhdHRyc1snZGVmYXVsdCddID8gYXR0cnNbJ2RlZmF1bHQnXSA6IGVycm9yLmRlZmF1bHRNZXNzYWdlICkKLSAgICAgICAgICAgICAgICBpZighZGVmYXVsdE1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlID0gY29kZQotCi0gICAgICAgICAgICAgICAgZGVmIG1lc3NhZ2UgPSBtZXNzYWdlU291cmNlLmdldE1lc3NhZ2UoIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgKQotICAgICAgICAgICAgICAgIGlmKG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0IDw8IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA8PCBjb2RlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICB9Ci0gICAgLy8gTWFwcyBvdXQgaG93IEdyYWlscyBjb250cmFpbnRzIG1hcCB0byBBcGFjaGUgY29tbW9ucyB2YWxpZGF0b3JzCi0gICAgc3RhdGljIENPTlNUUkFJTlRfVFlQRV9NQVAgPSBbIGVtYWlsIDogJ2VtYWlsJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdENhcmQgOiAnY3JlZGl0Q2FyZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA6ICdtYXNrJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rOiAncmVxdWlyZWQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6ICdyZXF1aXJlZCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiAnbWF4TGVuZ3RoJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6ICdtaW5MZW5ndGgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6ICdpbnRSYW5nZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnaW50UmFuZ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAnbWF4TGVuZ3RoLG1pbkxlbmd0aCcgXQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBhIGZvcm0gdXNpbmcgQXBhY2hlIGNvbW1vbnMgdmFsaWRhdG9yIGphdmFzY3JpcHQgYWdhaW5zdCBjb25zdHJhaW50cyBkZWZpbmVkIGluIGEgR3JhaWxzCi0gICAgICogZG9tYWluIGNsYXNzCi0gICAgICoKLSAgICAgKiBUT0RPOiBUaGlzIHRhZyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgKi8KLSAgICBAUHJvcGVydHkgdmFsaWRhdGUgPSB7IGF0dHJzLCBib2R5IC0+Ci0gICAgICAgIGRlZiBmb3JtID0gYXR0cnNbImZvcm0iXQotICAgICAgICBkZWYgYWdhaW5zdENsYXNzID0gYXR0cnNbImFnYWluc3QiXQotICAgICAgICBpZighZm9ybSkKLSAgICAgICAgICAgIHRocm93VGFnRXJyb3IoIlRhZyBbdmFsaWRhdGVdIGlzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFtmb3JtXSIpCi0KLSAgICAgICAgaWYoIWFnYWluc3RDbGFzcykgewotICAgICAgICAgICAgYWdhaW5zdENsYXNzID0gZm9ybS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgZm9ybS5zdWJzdHJpbmcoMSkKLSAgICAgICAgfQotCi0gICAgICAgIGRlZiBhcHAgPSBncmFpbHNBdHRyaWJ1dGVzLmdldEdyYWlsc0FwcGxpY2F0aW9uKCkKLSAgICAgICAgZGVmIGRjID0gYXBwLmdldEdyYWlsc0RvbWFpbkNsYXNzKGFnYWluc3RDbGFzcykKLQotICAgICAgICBpZighZGMpCi0gICAgICAgICAgICB0aHJvd1RhZ0Vycm9yKCJUYWcgW3ZhbGlkYXRlXSBjb3VsZCBub3QgZmluZCBhIGRvbWFpbiBjbGFzcyB0byB2YWxpZGF0ZSBhZ2FpbnN0IGZvciBuYW1lIFske2FnYWluc3RDbGFzc31dIikKLQotICAgICAgICBkZWYgY29uc3RyYWluZWRQcm9wZXJ0aWVzID0gZGMuY29uc3RyYWluZWRQcm9wZXJ0aWVzLmNvbGxlY3QgeyBrLHYgLT4gcmV0dXJuIHYgfQotICAgICAgICBkZWYgYXBwbGllZENvbnN0cmFpbnRzID0gW10KLQotICAgICAgICBjb25zdHJhaW5lZFByb3BlcnRpZXMuZWFjaCB7Ci0gICAgICAgICAgIGFwcGxpZWRDb25zdHJhaW50cyArPSBpdC5jb2xsZWN0eyBpdC5hcHBsaWVkQ29uc3RyYWludHMgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXBwbGllZENvbnN0cmFpbnRzID0gYXBwbGllZENvbnN0cmFpbnRzLmZsYXR0ZW4oKQotICAgICAgICBkZWYgZmllbGRWYWxpZGF0aW9ucyA9IFs6XQotICAgICAgICBhcHBsaWVkQ29uc3RyYWludHMuZWFjaCB7Ci0gICAgICAgICAgICBkZWYgdmFsaWRhdGVUeXBlID0gQ09OU1RSQUlOVF9UWVBFX01BUFtpdC5uYW1lXQotICAgICAgICAgICAgaWYodmFsaWRhdGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmllbGRWYWxpZGF0aW9uc1t2YWxpZGF0ZVR5cGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsaWRhdGlvbnNbdmFsaWRhdGVUeXBlXSA8PCBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsaWRhdGlvbnNbdmFsaWRhdGVUeXBlXSA9ICBbaXRdCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+XG4nCi0gICAgICAgIGZpZWxkVmFsaWRhdGlvbnMuZWFjaCB7IGssdiAtPgotICAgICAgICAgICBkZWYgdmFsaWRhdGVUeXBlID0gawotCi0gICAgICAgICAgIGlmKHZhbGlkYXRlVHlwZSkgewotCi0gICAgICAgICAgICAgICAgZGVmIHZhbGlkYXRlVHlwZXMgPSBbdmFsaWRhdGVUeXBlXQotCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGVUeXBlLmNvbnRhaW5zKCIsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVUeXBlcyA9IHZhbGlkYXRlVHlwZS5zcGxpdCgiLCIpCi0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVR5cGVzLmVhY2ggeyB2dCAtPgotICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQgcmVxdWlyZWQgc2NyaXB0Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBzY3JpcHROYW1lID0gIm9yZy9hcGFjaGUvY29tbW9ucy92YWxpZGF0b3IvamF2YXNjcmlwdC92YWxpZGF0ZSIgKyB2dC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgdnQuc3Vic3RyaW5nKDEpICsgIi5qcyIKLSAgICAgICAgICAgICAgICAgICAgZGVmIGluU3RyZWFtID0gZ2V0Q2xhc3MoKS5jbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHNjcmlwdE5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGlmKGluU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5TdHJlYW0udGV4dAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJmdW5jdGlvbiAke2Zvcm19XyR7dnR9KCkgeyIKLSAgICAgICAgICAgICAgICAgICAgdi5lYWNoIHsgY29uc3RyYWludCAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJ0aGlzLiR7Y29uc3RyYWludC5wcm9wZXJ0eU5hbWV9ID0gbmV3IEFycmF5KCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiZG9jdW1lbnQuZm9ybXNbJyR7Zm9ybX0nXS5lbGVtZW50c1snJHtjb25zdHJhaW50LnByb3BlcnR5TmFtZX0nXSwiIC8vIHRoZSBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICciVGVzdCBtZXNzYWdlIicgLy8gVE9ETzogUmVzb2x2ZSB0aGUgYWN0dWFsIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh2dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXNrJzogb3V0IDw8ICIsZnVuY3Rpb24oKSB7IHJldHVybiAnJHtjb25zdHJhaW50LnJlZ2V4fSc7IH0iO2JyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnRSYW5nZSc6IG91dCA8PCAiLGZ1bmN0aW9uKCkgeyBpZihhcmd1bWVudHNbMF09PSdtaW4nKSByZXR1cm4gJHtjb25zdHJhaW50LnJhbmdlLmZyb219OyBlbHNlIHJldHVybiAke2NvbnN0cmFpbnQucmFuZ2UudG99IH0iO2JyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmbG9hdFJhbmdlJzogb3V0IDw8ICIsZnVuY3Rpb24oKSB7IGlmKGFyZ3VtZW50c1swXT09J21pbicpIHJldHVybiAke2NvbnN0cmFpbnQucmFuZ2UuZnJvbX07IGVsc2UgcmV0dXJuICR7Y29uc3RyYWludC5yYW5nZS50b30gfSI7YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21heExlbmd0aCc6IG91dCA8PCAiLGZ1bmN0aW9uKCkgeyByZXR1cm4gJHtjb25zdHJhaW50Lm1heFNpemV9OyAgfSI7YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pbkxlbmd0aCc6IG91dCA8PCAiLGZ1bmN0aW9uKCkgeyByZXR1cm4gJHtjb25zdHJhaW50Lm1pblNpemV9OyAgfSI7YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgJyk7XG4nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJ9XG4iCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAnZnVuY3Rpb24gdmFsaWRhdGVGb3JtKGZvcm0pIHtcbicKLSAgICAgICAgIGZpZWxkVmFsaWRhdGlvbnMuZWFjaCB7IGssdiAtPgotICAgICAgICAgICAgICAgZGVmIHZhbGlkYXRlVHlwZSA9IGsuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIGsuc3Vic3RyaW5nKDEpCi0gICAgICAgICAgICAgICBvdXQgPDwgImlmKCF2YWxpZGF0ZSR7dmFsaWRhdGVUeXBlfShmb3JtKSkgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgfQotICAgICAgICBvdXQgPDwgJ3JldHVybiB0cnVlO1xuJzsKLSAgICAgICAgb3V0IDw8ICd9XG4nCi0gICAgICAvLyAgb3V0IDw8ICJkb2N1bWVudC5mb3Jtc1snJHthdHRyc1snZm9ybSddfSddLm9uc3VibWl0ID0gZnVuY3Rpb24oZSkge3JldHVybiB2YWxpZGF0ZUZvcm0odGhpcyl9XG4iCi0gICAgICAgIG91dCA8PCAnPC9zY3JpcHQ+JwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3ZpZXdzL2Vycm9yLmpzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL2dyYWlscy1hcHAvdmlld3MvZXJyb3IuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU4ZGZlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL2dyYWlscy1hcHAvdmlld3MvZXJyb3IuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+Ci08aHRtbD4KLSAgPGhlYWQ+Ci0JICA8dGl0bGU+R3JhaWxzIFJ1bnRpbWUgRXhjZXB0aW9uPC90aXRsZT4KLQkgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0JICAJCS5tZXNzYWdlIHsKLQkgIAkJCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwotCSAgCQkJcGFkZGluZzogNXB4OwotCSAgCQkJYmFja2dyb3VuZC1jb2xvcjojRTlFOUU5OwotCSAgCQl9Ci0JICAJCS5zdGFjayB7Ci0JICAJCQlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKLQkgIAkJCXBhZGRpbmc6IDVweDsJICAJCQotCSAgCQkJb3ZlcmZsb3c6YXV0bzsKLQkgIAkJCWhlaWdodDogMzAwcHg7Ci0JICAJCX0KLQkgIAkJLnNuaXBwZXQgewotCSAgCQkJcGFkZGluZzogNXB4OwotCSAgCQkJYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsKLQkgIAkJCWJvcmRlcjoxcHggc29saWQgYmxhY2s7Ci0JICAJCQltYXJnaW46M3B4OwotCSAgCQkJZm9udC1mYW1pbHk6Y291cmllcjsKLQkgIAkJfQotCSAgPC9zdHlsZT4KLSAgPC9oZWFkPgotICAKLSAgPGJvZHk+Ci0gICAgPGgxPkdyYWlscyBSdW50aW1lIEV4Y2VwdGlvbjwvaDE+Ci0gICAgPGgyPkVycm9yIERldGFpbHM8L2gyPgotICAJPGRpdiBjbGFzcz0ibWVzc2FnZSI+Ci0gIAkJPHN0cm9uZz5NZXNzYWdlOjwvc3Ryb25nPiA8YzpvdXQgdmFsdWU9IiR7ZXhjZXB0aW9uLm1lc3NhZ2V9IiAvPiA8YnIgLz4KLSAgCQk8c3Ryb25nPkNhdXNlZCBieTo8L3N0cm9uZz4gPGM6b3V0IHZhbHVlPSIke2V4Y2VwdGlvbi5jYXVzZS5tZXNzYWdlfSIgLz4gPGJyIC8+Ci0gIAkJPHN0cm9uZz5DbGFzczo8L3N0cm9uZz4gPGM6b3V0IHZhbHVlPSIke2V4Y2VwdGlvbi5jbGFzc05hbWV9IiAvPiA8YnIgLz4gIAkJICAJCQotICAJCTxzdHJvbmc+QXQgTGluZTo8L3N0cm9uZz4gWzxjOm91dCB2YWx1ZT0iJHtleGNlcHRpb24ubGluZU51bWJlcn0iIC8+XSA8YnIgLz4gIAkJCi0gIAkJPHN0cm9uZz5Db2RlIFNuaXBwZXQ6PC9zdHJvbmc+PGJyIC8+ICAgCQkKLSAgCQk8ZGl2IGNsYXNzPSJzbmlwcGV0Ij4KLSAgCQkJPGM6Zm9yRWFjaCB2YXI9ImNzIiBpdGVtcz0iJHtleGNlcHRpb24uY29kZVNuaXBwZXR9Ij4gCi0gIAkJCQk8YzpvdXQgdmFsdWU9IiR7Y3N9IiAvPjxiciAvPiAgCQkJCi0gIAkJCTwvYzpmb3JFYWNoPiAgCQotICAJCTwvZGl2PgkgIAkJCi0gIAk8L2Rpdj4KLSAgICA8aDI+U3RhY2sgVHJhY2U8L2gyPgotICAgIDxkaXYgY2xhc3M9InN0YWNrIj4KLQkgICAgPGM6b3V0IHZhbHVlPSIke2V4Y2VwdGlvbi5zdGFja1RyYWNlVGV4dH0iIC8+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3ZpZXdzL2xheW91dHMvbWFpbi5qc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy9ncmFpbHMtYXBwL3ZpZXdzL2xheW91dHMvbWFpbi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmU3ZDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvZ3JhaWxzLWFwcC92aWV3cy9sYXlvdXRzL21haW4uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly93d3cub3BlbnN5bXBob255LmNvbS9zaXRlbWVzaC9kZWNvcmF0b3IiIHByZWZpeD0iZGVjb3JhdG9yIiAlPgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTx0aXRsZT48ZGVjb3JhdG9yOnRpdGxlIGRlZmF1bHQ9IkRlZmF1bHQgVGl0bGUiIC8+PC90aXRsZT4KLQkJPGRlY29yYXRvcjpoZWFkIC8+CQkKLQk8L2hlYWQ+Ci0JPGJvZHkgb25sb2FkPSI8ZGVjb3JhdG9yOmdldFByb3BlcnR5IHByb3BlcnR5PSdib2R5Lm9ubG9hZCcvPiI+Ci0JCQkgPGRlY29yYXRvcjpib2R5IC8+CQkJCSAJCi0JPC9ib2R5PgkKLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0Jvb3RTdHJhcC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0Jvb3RTdHJhcC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmFmNzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9Cb290U3RyYXAuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1jbGFzcyBBcHBsaWNhdGlvbkJvb3RTdHJhcCB7Ci0KLSAgICAgQFByb3BlcnR5IENsb3N1cmUgaW5pdCA9IHsgc2VydmxldENvbnRleHQgLT4KLSAgICAgfQotICAgICBAUHJvcGVydHkgQ2xvc3VyZSBkZXN0cm95ID0gewotICAgICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvQ29udHJvbGxlci5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0NvbnRyb2xsZXIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI3MmJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvQ29udHJvbGxlci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWNsYXNzIEBjb250cm9sbGVyLm5hbWVAQ29udHJvbGxlciB7Ci0JCi0JQFByb3BlcnR5IFN0cmluZyBkZWZhdWx0QWN0aW9uID0gImxpc3QiCi0JCi0JQFByb3BlcnR5IGxpc3QgPSB7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvRGF0YVNvdXJjZS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0RhdGFTb3VyY2UuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU3YzVjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvRGF0YVNvdXJjZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWNsYXNzIEFwcGxpY2F0aW9uRGF0YVNvdXJjZSB7Ci0gICBAUHJvcGVydHkgYm9vbGVhbiBwb29sZWQgPSB0cnVlCi0gICBAUHJvcGVydHkgU3RyaW5nIGRiQ3JlYXRlID0gImNyZWF0ZS1kcm9wIiAvLyBvbmUgb2YgJ2NyZWF0ZScsICdjcmVhdGUtZHJvcCcsJ3VwZGF0ZScKLSAgIEBQcm9wZXJ0eSBTdHJpbmcgdXJsID0gImpkYmM6aHNxbGRiOm1lbTp0ZXN0REIiCi0gICBAUHJvcGVydHkgU3RyaW5nIGRyaXZlckNsYXNzTmFtZSA9ICJvcmcuaHNxbGRiLmpkYmNEcml2ZXIiCi0gICBAUHJvcGVydHkgU3RyaW5nIHVzZXJuYW1lID0gInNhIgotICAgQFByb3BlcnR5IFN0cmluZyBwYXNzd29yZCA9ICIiCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL0RvbWFpbkNsYXNzLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvRG9tYWluQ2xhc3MuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc3Nzk3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvRG9tYWluQ2xhc3MuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1jbGFzcyBAZG9tYWluLmNsYXNzLm5hbWVAIHsgCi0JQFByb3BlcnR5IExvbmcgaWQ7IAotCUBQcm9wZXJ0eSBMb25nIHZlcnNpb247IAotfQkKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvU2VydmljZS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL1NlcnZpY2UuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZmZTBhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvU2VydmljZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWNsYXNzIEBzZXJ2aWNlLm5hbWVAU2VydmljZSB7Ci0JCi0JQFByb3BlcnR5IGJvb2xlYW4gdHJhbnNhY3Rpb25hbCA9IHRydWUKLQkKLQlkZWYgc2VydmljZU1ldGhvZCgpIHsKLQkJLy8gVE9ETwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9UZXN0cy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL1Rlc3RzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyNjE0ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvYXJ0aWZhY3RzL1Rlc3RzLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotY2xhc3MgQHRlc3Quc3VpdGUubmFtZUBUZXN0cyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotCXZvaWQgdGVzdFNvbWV0aGluZygpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9XZWJUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvZ3JhaWxzL3RlbXBsYXRlcy9hcnRpZmFjdHMvV2ViVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDY1MzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL2FydGlmYWN0cy9XZWJUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQotY2xhc3MgQHdlYnRlc3QubmFtZS5jYXBzQFRlc3QgZXh0ZW5kcyBncmFpbHMudXRpbC5XZWJUZXN0IHsKLQotICAgIC8vIFVubGlrZSB1bml0IHRlc3RzLCBmdW5jdGlvbmFsIHRlc3RzIGFyZSBvZnRlbiBzZXF1ZW5jZSBkZXBlbmRlbnQuCi0gICAgLy8gU3BlY2lmeSB0aGF0IHNlcXVlbmNlIGhlcmUuCi0gICAgdm9pZCBzdWl0ZSgpIHsKLSAgICAgICAgdGVzdEB3ZWJ0ZXN0Lm5hbWUuY2Fwc0BMaXN0TmV3RGVsZXRlKCkKLSAgICAgICAgLy8gYWRkIHRlc3RzIGZvciBtb3JlIG9wZXJhdGlvbnMgaGVyZQotICAgIH0KLQotICAgIGRlZiB0ZXN0QHdlYnRlc3QubmFtZS5jYXBzQExpc3ROZXdEZWxldGUoKSB7Ci0gICAgICAgIHdlYnRlc3QoJ0B3ZWJ0ZXN0Lm5hbWUuY2Fwc0AgYmFzaWMgb3BlcmF0aW9uczogdmlldyBsaXN0LCBjcmVhdGUgbmV3IGVudHJ5LCBiYWNrIHRvIHZpZXcsIGRlbGV0ZSwgdmlldycpewotICAgICAgICAgICAgaW52b2tlKHVybDonQHdlYnRlc3QubmFtZS5sb3dlckAnKQotICAgICAgICAgICAgdmVyaWZ5VGV4dCh0ZXh0OidIb21lJykKLQotICAgICAgICAgICAgdmVyaWZ5TGlzdFBhZ2UoMCkKLQotICAgICAgICAgICAgY2xpY2tMaW5rKGxhYmVsOidOZXcgQHdlYnRlc3QubmFtZS5jYXBzQCcpCi0gICAgICAgICAgICB2ZXJpZnlUZXh0KHRleHQ6J0NyZWF0ZSBAd2VidGVzdC5uYW1lLmNhcHNAJykKLSAgICAgICAgICAgIGNsaWNrQnV0dG9uKGxhYmVsOidDcmVhdGUnKQotICAgICAgICAgICAgdmVyaWZ5VGV4dCh0ZXh0OidTaG93IEB3ZWJ0ZXN0Lm5hbWUuY2Fwc0AnLCBkZXNjcmlwdGlvbjonRGV0YWlsIHBhZ2UnKQotICAgICAgICAgICAgY2xpY2tFbGVtZW50KHhwYXRoOiIvL2J1dHRvblt0ZXh0KCk9J0JhY2snXSIpCi0KLSAgICAgICAgICAgIHZlcmlmeUxpc3RQYWdlKDEpCi0KLSAgICAgICAgICAgIGNsaWNrTGluayhocmVmOidkZWxldGUnLCBkZXNjcmlwdGlvbjonZGVsZXRlIHRoZSBmaXJzdCBlbGVtZW50ICh0aGVyZSBpcyBvbmx5IG9uZSknKQotICAgICAgICAgICAgdmVyaWZ5WFBhdGgoeHBhdGg6Ii8vZGl2W0BjbGFzcz0nbWVzc2FnZSddIiwgdGV4dDovQHdlYnRlc3QubmFtZS5jYXBzQC4qZGVsZXRlZC4vLCByZWdleDp0cnVlKQotCi0gICAgICAgICAgICB2ZXJpZnlMaXN0UGFnZSgwKQotCi0gICAgfSAgIH0KLQotICAgIFN0cmluZyBST1dfQ09VTlRfWFBBVEggPSAiY291bnQoLy90ZFtAY2xhc3M9J2FjdGlvbkJ1dHRvbnMnXS8uLikiCi0KLSAgICBkZWYgdmVyaWZ5TGlzdFBhZ2UoaW50IGNvdW50KSB7Ci0gICAgICAgIGFudC5ncm91cChkZXNjcmlwdGlvbjoidmVyaWZ5IEB3ZWJ0ZXN0Lm5hbWUuY2Fwc0AgbGlzdCB2aWV3IHdpdGggJGNvdW50IHJvdyhzKSIpewotICAgICAgICAgICAgdmVyaWZ5VGV4dCh0ZXh0OidAd2VidGVzdC5uYW1lLmNhcHNAIExpc3QnKQotICAgICAgICAgICAgdmVyaWZ5WFBhdGgoeHBhdGg6Uk9XX0NPVU5UX1hQQVRILCB0ZXh0OmNvdW50LCBkZXNjcmlwdGlvbjoiJGNvdW50IHJvdyhzKSBvZiBkYXRhIGV4cGVjdGVkIikKLSAgICB9ICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL3dlYnRlc3QvY29uZi93ZWJ0ZXN0LnByb3BlcnRpZXMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC9jb25mL3dlYnRlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlZWJkYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC9jb25mL3dlYnRlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXdlYnRlc3RfaG9zdCAgICAgICAgICAgICAgICA9IGxvY2FsaG9zdAotd2VidGVzdF9wb3J0ICAgICAgICAgICAgICAgID0gODA4MAotd2VidGVzdF9wcm90b2NvbCAgICAgICAgICAgID0gaHR0cAotCi0jIHVuY29tbWVudCB0byBvdmVycmlkZSBkZWZhdWx0Ci0jIHdlYnRlc3RfYmFzZXBhdGggICAgICAgICAgICA9IHByb2plY3ROYW1lCi0KLXdlYnRlc3Rfc3VtbWFyeSAgICAgICAgICAgICA9IHRydWUKLXdlYnRlc3Rfc2F2ZXJlc3BvbnNlICAgICAgICA9IHRydWUKLXdlYnRlc3RfcmVzdWx0cGF0aCAgICAgICAgICA9IHdlYnRlc3QvcmVwb3J0cwotd2VidGVzdF9yZXN1bHRmaWxlICAgICAgICAgID0gV2ViVGVzdFJlc3VsdHMueG1sCi13ZWJ0ZXN0X2hhbHRvbmVycm9yICAgICAgICAgPSBmYWxzZQotd2VidGVzdF9lcnJvcnByb3BlcnR5ICAgICAgID0gd2ViVGVzdEVycm9yCi13ZWJ0ZXN0X2hhbHRvbmZhaWx1cmUgICAgICAgPSBmYWxzZQotd2VidGVzdF9mYWlsdXJlcHJvcGVydHkgICAgID0gd2ViVGVzdEZhaWx1cmUKLXdlYnRlc3Rfc2hvd2h0bWxwYXJzZXJvdXRwdXQ9IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC9yZXBvcnRzL3JlYWRtZS50eHQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC9yZXBvcnRzL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjljZjAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL3dlYnRlc3QvcmVwb3J0cy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi10aGlzIGRpcmVjdG9yeSBpcyBmb3IgY29sbGVjdGluZwotCi0tIHRoZSB3ZWJ0ZXN0IFhNTCAgcmVzdWx0IGZpbGUKLS0gdGhlIHdlYnRlc3QgSFRNTCByZXN1bHQgb3ZlcnZpZXcKLS0gYWxsIGxhc3RyZXNwb25zZSBmbGlsZXMgY2FwdHVyZWQgd2hlbiBydW5uaW5nIHdlYnRlc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC90ZXN0cy9UZXN0U3VpdGUuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9ncmFpbHMvdGVtcGxhdGVzL3dlYnRlc3QvdGVzdHMvVGVzdFN1aXRlLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhZmExYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL2dyYWlscy90ZW1wbGF0ZXMvd2VidGVzdC90ZXN0cy9UZXN0U3VpdGUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gU3VpdGUgZm9yIGFsbCB3ZWJ0ZXN0cyBpbiB0aGlzIGFwcGxpY2F0aW9uLgotCi1pbXBvcnQgZ3JhaWxzLnV0aWwuV2ViVGVzdAotCi1jbGFzcyBUZXN0U3VpdGUgZXh0ZW5kcyBXZWJUZXN0IHsKLQotICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgewotICAgICAgICBuZXcgVGVzdFN1aXRlKCkucnVuVGVzdHMoKQotICAgIH0KLQotICAgIC8qKgotICAgICAgICBTY2FuIHRyb3VnaCBhbGwgdGVzdCBmaWxlcyBhbmQgY2FsbCB0aGVpciBzdWl0ZSBtZXRob2QuCi0gICAgKi8KLSAgICB2b2lkIHN1aXRlKCkgewotICAgICAgICBkZWYgc2Nhbm5lciA9IGFudC5maWxlU2Nhbm5lciB7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjond2VidGVzdC90ZXN0cycsIGluY2x1ZGVzOicqKi8qVGVzdC5ncm9vdnknKQotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmlsZSBpbiBzY2FubmVyKSB7Ci0gICAgICAgICAgICBkZWYgdGVzdCA9IGdldENsYXNzKCkuY2xhc3NMb2FkZXIucGFyc2VDbGFzcyhmaWxlKS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICB0ZXN0LmFudCA9IGFudAotICAgICAgICAgICAgdGVzdC5jb25maWdNYXAgPSBjb25maWdNYXAKLSAgICAgICAgICAgIHRlc3Quc3VpdGUoKQotICAgICAgICB9Ci0gICAgfQotCi0vKgotICAgIFlvdSBjYW4gYWx0ZXJuYXRpdmVseSBkZWZpbmUgeW91ciBzdWl0ZSBtYW51YWxseSBieSBjYWxsaW5nIGEgTXlUZXN0Lmdyb292eSBsaWtlIHNvCi0gICAgaW5zdGVhZCBvZiB0aGUgc3VpdGUgaW1wbC4gYWJvdmU6Ci0KLSAgICAgICAgbmV3IE15VGVzdChhbnQ6YW50LCBjb25maWdNYXA6Y29uZmlnTWFwKS5zdWl0ZSgpCi0gICAgICAgIG5ldyBNeU90aGVyVGVzdChhbnQ6YW50LCBjb25maWdNYXA6Y29uZmlnTWFwKS5zdWl0ZSgpCi0KLSAgICBUaGlzIGdpdmVzIHlvdSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcXVlbmNlIG9mIHRlc3QgZXhlY3V0aW9uLgotKi8KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvbWV0YWNsYXNzL0RvbWFpbkNsYXNzTWV0aG9kcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9tZXRhY2xhc3MvRG9tYWluQ2xhc3NNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWI4NjUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9tZXRhY2xhc3MvRG9tYWluQ2xhc3NNZXRob2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3M7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0RHluYW1pY01ldGhvZHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3MuV2Vha0dlbmVyaWNEeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3MuQWJzdHJhY3REeW5hbWljTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzcy4qOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24ubWV0YWNsYXNzLkNvbnN0cmFpbnRzRHluYW1pY1Byb3BlcnR5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluQ2xhc3NNZXRob2RzIGV4dGVuZHMgQWJzdHJhY3REeW5hbWljTWV0aG9kcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfRVJST1JTX1BST1BFUlRZID0gImhhc0Vycm9ycyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JTX1BST1BFUlRZID0gImVycm9ycyI7Ci0KLQlwdWJsaWMgRG9tYWluQ2xhc3NNZXRob2RzKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBDbGFzcyB0aGVDbGFzcywgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotCQkJdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotCQlzdXBlcih0aGVDbGFzcyk7Ci0JCS8vIGR5bmFtaWMgbWV0aG9kcwotCQlhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbihuZXcgU2F2ZVBlcnNpc3RlbnRNZXRob2Qoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyLGFwcGxpY2F0aW9uKSk7Ci0JCWFkZER5bmFtaWNNZXRob2RJbnZvY2F0aW9uKG5ldyBEZWxldGVQZXJzaXN0ZW50TWV0aG9kKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlcikpOwotCQlhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbihuZXcgUmVmcmVzaFBlcnNpc3RlbnRNZXRob2Qoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7CQkKLQkJYWRkRHluYW1pY01ldGhvZEludm9jYXRpb24obmV3IFZhbGlkYXRlUGVyc2lzdGVudE1ldGhvZChzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIsIGFwcGxpY2F0aW9uICkpOwotICAgICAgICBhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbihuZXcgQWJzdHJhY3REeW5hbWljTWV0aG9kSW52b2NhdGlvbihIQVNfRVJST1JTX1BST1BFUlRZKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgdGFyZ2V0LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICBFcnJvcnMgZXJyb3JzID0gKEVycm9ycylnZXREeW5hbWljUHJvcGVydHkoRVJST1JTX1BST1BFUlRZKS5nZXQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICBpZihlcnJvcnMgPT0gbnVsbCB8fCAhZXJyb3JzLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBzdGF0aWMgbWV0aG9kcwotCQlhZGRTdGF0aWNNZXRob2RJbnZvY2F0aW9uKG5ldyBGaW5kQWxsUGVyc2lzdGVudE1ldGhvZChzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpKTsKLQkJYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihuZXcgRmluZEFsbEJ5UGVyc2lzdGVudE1ldGhvZChhcHBsaWNhdGlvbixzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpKTsKLQkJYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihuZXcgRmluZEJ5UGVyc2lzdGVudE1ldGhvZChhcHBsaWNhdGlvbixzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpKTsKLQkJYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihuZXcgRmluZFBlcnNpc3RlbnRNZXRob2Qoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7Ci0JCWFkZFN0YXRpY01ldGhvZEludm9jYXRpb24obmV3IExpc3RPcmRlckJ5UGVyc2lzdGVudE1ldGhvZChzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpKTsKLQkJYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihuZXcgTGlzdFBlcnNpc3RlbnRNZXRob2Qoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7Ci0JCWFkZFN0YXRpY01ldGhvZEludm9jYXRpb24obmV3IEZpbmRXaGVyZVBlcnNpc3RlbnRNZXRob2Qoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7Ci0JCWFkZFN0YXRpY01ldGhvZEludm9jYXRpb24obmV3IEdldFBlcnNpc3RlbnRNZXRob2QoYXBwbGljYXRpb24sc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7Ci0gICAgICAgIGFkZFN0YXRpY01ldGhvZEludm9jYXRpb24obmV3IEV4aXN0c1BlcnNpc3RlbnRNZXRob2QoYXBwbGljYXRpb24sc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKSk7Ci0gICAgICAgIGFkZFN0YXRpY01ldGhvZEludm9jYXRpb24obmV3IENvdW50UGVyc2lzdGVudE1ldGhvZChzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpKTsKLSAgICAgICAgYWRkU3RhdGljTWV0aG9kSW52b2NhdGlvbihuZXcgQ3JlYXRlQ3JpdGVyaWFQZXJzaXN0ZW50TWV0aG9kKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlcikpOwotCQkKLQkJLy8gYWRkIGR5bmFtaWMgcHJvcGVydGllcwotCQlhZGREeW5hbWljUHJvcGVydHkoIG5ldyBTZXRQcm9wZXJ0aWVzRHluYW1pY1Byb3BlcnR5KCkgKTsKLQkJYWRkRHluYW1pY1Byb3BlcnR5KCBuZXcgQ29uc3RyYWludHNEeW5hbWljUHJvcGVydHkoKSApOwkJCi0JCWFkZER5bmFtaWNQcm9wZXJ0eSggbmV3IFdlYWtHZW5lcmljRHluYW1pY1Byb3BlcnR5KEVSUk9SU19QUk9QRVJUWSwgRXJyb3JzLmNsYXNzLG51bGwsZmFsc2UpICk7Ci0JCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvbWV0YWNsYXNzL1NldFByb3BlcnRpZXNEeW5hbWljUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvbWV0YWNsYXNzL1NldFByb3BlcnRpZXNEeW5hbWljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0MmIxYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL21ldGFjbGFzcy9TZXRQcm9wZXJ0aWVzRHluYW1pY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3M7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb2dubC5Ob1N1Y2hQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBvZ25sLk9nbmw7Ci1pbXBvcnQgb2dubC5PZ25sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CZWFuTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0RHluYW1pY1Byb3BlcnR5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5iaW5kaW5nLkdyYWlsc0RhdGFCaW5kZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLm1ldGFjbGFzcy5HcmFpbHNQYXJhbWV0ZXJNYXA7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5TZXJ2bGV0UmVxdWVzdERhdGFCaW5kZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZHluYW1pYyBwcm9wZXJ0eSB0aGF0IHVzZXMgYSBNYXAgb2YgT0dOTCBleHByZXNzaW9ucyB0byBzZXRzIHByb3BlcnRpZXMgb24gdGhlIHRhcmdldCBvYmplY3QKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI0LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXRQcm9wZXJ0aWVzRHluYW1pY1Byb3BlcnR5IGV4dGVuZHMgQWJzdHJhY3REeW5hbWljUHJvcGVydHkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBTZXRQcm9wZXJ0aWVzRHluYW1pY1Byb3BlcnR5LmNsYXNzICk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydGllcyI7Ci0JCi0KLQlwdWJsaWMgU2V0UHJvcGVydGllc0R5bmFtaWNQcm9wZXJ0eSgpIHsKLQkJc3VwZXIoUFJPUEVSVFlfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5CZWFuTWFwIGluc3RhbmNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG9iamVjdCkgewkJCQkKLQkJcmV0dXJuIG5ldyBCZWFuTWFwKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvcGVydHkgb24gdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLiBUaGUKLQkgKiB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhIE1hcCBjb250YWluaW5nIE9HTkwgZXhwcmVzc2lvbnMgZm9yIHRoZSBrZXlzCi0JICogYW5kIG9iamVjdHMgZm9yIHRoZSB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdCBUaGUgdGFyZ2V0IG9iamVjdAotCSAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmplY3QsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZihuZXdWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYobmV3VmFsdWUgaW5zdGFuY2VvZiBHcmFpbHNQYXJhbWV0ZXJNYXApIHsKLQkJCUdyYWlsc1BhcmFtZXRlck1hcCBwYXJhbWV0ZXJNYXAgPSAoR3JhaWxzUGFyYW1ldGVyTWFwKW5ld1ZhbHVlOwotCQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBwYXJhbWV0ZXJNYXAuZ2V0UmVxdWVzdCgpOwotCQkJU2VydmxldFJlcXVlc3REYXRhQmluZGVyIGRhdGFCaW5kZXIgPSBHcmFpbHNEYXRhQmluZGVyLmNyZWF0ZUJpbmRlcihvYmplY3QsIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSxyZXF1ZXN0KTsgCi0JCQlkYXRhQmluZGVyLmJpbmQocmVxdWVzdCk7Ci0JCX0KLQkJZWxzZSBpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCi0JCQlNYXAgcHJvcGVydHlNYXAgPSAoTWFwKW5ld1ZhbHVlOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wZXJ0eU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eU1hcC5nZXQocHJvcGVydHlOYW1lKTsJCQkJCi0JCQkJLy8gaWYgbnVsbCBza2lwCi0JCQkJaWYocHJvcGVydHlWYWx1ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLQkJCQkJTE9HLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHNldCBwcm9wZXJ0eSAnIitwcm9wZXJ0eU5hbWUrIicgdG8gdmFsdWUgJyIrcHJvcGVydHlWYWx1ZSsiJyBvbiBpbnN0YW5jZSAnIitvYmplY3QrIiciKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlPZ25sLnNldFZhbHVlKHByb3BlcnR5TmFtZSxvYmplY3QscHJvcGVydHlWYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoUHJvcGVydHlFeGNlcHRpb24gbnNwZSkgewotCQkJCQlpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLQkJCQkJCUxPRy5kZWJ1ZygiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSAnIitwcm9wZXJ0eU5hbWUrIicgdG8gdmFsdWUgJyIrcHJvcGVydHlWYWx1ZSsiJyBmb3Igb2JqZWN0ICciK29iamVjdCsiJyBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LiIgKyBuc3BlLmdldE1lc3NhZ2UoKSk7CQkJCQkKLQkJCQl9Y2F0Y2ggKE9nbmxFeGNlcHRpb24gZSkgewotCQkJCQlpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKLQkJCQkJCUxPRy5kZWJ1ZygiT0dOTCBlcnJvciBhdHRlbXB0IHRvIHNldCAnIitwcm9wZXJ0eU5hbWUrIicgdG8gdmFsdWUgJyIrcHJvcGVydHlWYWx1ZSsiJyBmb3Igb2JqZWN0ICciK29iamVjdCsiJzoiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0JCQkJfSAKLQkJCX0KLQkJCQotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbihQUk9QRVJUWV9OQU1FLG9iamVjdC5nZXRDbGFzcygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0NvbmZpZ3VyYWJsZUxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvQ29uZmlndXJhYmxlTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyZjFhZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvQ29uZmlndXJhYmxlTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0KLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmcuRGVmYXVsdEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmcuR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY2ZnLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5Mb2NhbFNlc3Npb25GYWN0b3J5QmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5VdGlsczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQSBTZXNzaW9uRmFjdG9yeSBiZWFuIHRoYXQgYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzIHRvIGJlIGNoYW5nZWQgYW5kIGN1c3RvbWlzZSBmb3IgdXNhZ2Ugd2l0aGluIEdyYWlscwotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA3LUp1bC0yMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVMb2NhbFNlc3Npb25GYWN0b3J5QmVhbiBleHRlbmRzCi0JCUxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuIHsKLQotCQotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotCXByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBDbGFzcyBjb25maWdDbGFzcyA9IERlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uLmNsYXNzOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ2xhc3MoQ2xhc3MgY29uZmlnQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5jb25maWdDbGFzcyA9IGNvbmZpZ0NsYXNzOwotICAgIH0KLQotICAgIC8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVMb2NhbFNlc3Npb25GYWN0b3J5QmVhbigpIHsKLQkJc3VwZXIoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdyYWlsc0FwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBHcmFpbHNBcHBsaWNhdGlvbiBnZXRHcmFpbHNBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGdyYWlsc0FwcGxpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBncmFpbHNBcHBsaWNhdGlvbiBUaGUgZ3JhaWxzQXBwbGljYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYWlsc0FwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGdyYWlsc0FwcGxpY2F0aW9uKSB7Ci0JCXRoaXMuZ3JhaWxzQXBwbGljYXRpb24gPSBncmFpbHNBcHBsaWNhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3VyIHRvIGFsbG93IGZvciBhIGNvbmZpZ3VyYWJsZSBjb25maWd1cmF0aW9uIGNsYXNzIAotCSAqLwotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZ3VyYXRpb24oKSB7Ci0JCUdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24gY29uZmlnID0gKEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24pQmVhblV0aWxzLmluc3RhbnRpYXRlQ2xhc3MoY29uZmlnQ2xhc3MpOwotCQljb25maWcuc2V0R3JhaWxzQXBwbGljYXRpb24oZ3JhaWxzQXBwbGljYXRpb24pOwotICAgICAgICAvLyB3ZSBzZXQgdGhpcyB0byBmYWxzZSBhcyBTcHJpbmcgbWlnaHQgd3JhcCB0aGUgc2Vzc2lvbiBmYWN0b3J5IGluIGEgdHJhbnNhY3Rpb25hbCBwcm94eQotICAgICAgICAvLyBpZiBjb25maWd1cmVkIGFzIHN1Y2gKLSAgICAgICAgY29uZmlnLnNldENvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIChDb25maWd1cmF0aW9uKWNvbmZpZzsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWZ0ZXJQcm9wZXJ0aWVzU2V0KCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKLQkJCUhpYmVybmF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gbnVsbDsKLQkJaWYgKHRoaXMuY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aGlzLmNsYXNzTG9hZGVyKTsKLQkJfQotICAgICAgICBzdXBlci5hZnRlclByb3BlcnRpZXNTZXQoKTsKLQotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZiA9IChTZXNzaW9uRmFjdG9yeSlnZXRPYmplY3QoKTsKLSAgICAgICAgaWYoc2YgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjID0gZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYoYyBpbnN0YW5jZW9mIEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNEb21haW5Db25maWd1cmF0aW9uIGdjID0gKEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24pYzsKLSAgICAgICAgICAgICAgICBnYy5jb25maWd1cmVEeW5hbWljTWV0aG9kcyhzZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9yaWdpbmFsQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9HcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0dyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjI2YTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0dyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkFic3RyYWN0R3JhaWxzQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5FeHRlcm5hbEdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLnZhbGlkYXRpb24uR3JhaWxzRG9tYWluQ2xhc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5FbnRpdHlNb2RlOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuZW5naW5lLlNlc3Npb25GYWN0b3J5SW1wbGVtZW50b3I7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5tZXRhZGF0YS5DbGFzc01ldGFkYXRhOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUudHlwZS5UeXBlOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUudHlwZS5Bc3NvY2lhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEdyYWlsc0RvbWFpbkNsYXNzIGludGVyZmFjZSB0aGF0IGFsbG93cyBDbGFzc2VzIG1hcHBlZCBpbgotICogSGliZXJuYXRlIHRvIGludGVncmF0ZSB3aXRoIEdyYWlscycgdmFsaWRhdGlvbiwgZHluYW1pYyBtZXRob2RzIGV0Yy4gc2VhbWxlc3NseQotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE4LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzcyBleHRlbmRzIEFic3RyYWN0R3JhaWxzQ2xhc3MgaW1wbGVtZW50cyBFeHRlcm5hbEdyYWlsc0RvbWFpbkNsYXNzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElCRVJOQVRFID0gImhpYmVybmF0ZSI7Ci0gICAgcHJpdmF0ZSBHcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzc1Byb3BlcnR5IGlkZW50aWZpZXI7Ci0gICAgcHJpdmF0ZSBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gcHJvcGVydGllczsKLSAgICBwcml2YXRlIE1hcCBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICogPHA+Q29udHJ1Y3RvciB0byBiZSB1c2VkIGJ5IGFsbCBjaGlsZCBjbGFzc2VzIHRvIGNyZWF0ZSBhCi0gICAgICogbmV3IGluc3RhbmNlIGFuZCBnZXQgdGhlIG5hbWUgcmlnaHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogICAgICAgIHRoZSBHcmFpbHMgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3MoQ2xhc3MgY2xhenosIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LENsYXNzTWV0YWRhdGEgbWV0YURhdGEpIHsKLSAgICAgICAgc3VwZXIoY2xhenosICIiKTsKLQotICAgICAgICBCZWFuV3JhcHBlciBiZWFuID0gZ2V0UmVmZXJlbmNlKCk7Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSBpZGVudGl0eSBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgaWRlbnQgPSBtZXRhRGF0YS5nZXRJZGVudGlmaWVyUHJvcGVydHlOYW1lKCk7Ci0gICAgICAgIENsYXNzIGlkZW50VHlwZSA9IGJlYW4uZ2V0UHJvcGVydHlUeXBlKGlkZW50KTsKLSAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gbmV3IEdyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzUHJvcGVydHkodGhpcyxpZGVudCk7Ci0gICAgICAgIHRoaXMuaWRlbnRpZmllci5zZXRJZGVudGl0eSh0cnVlKTsKLSAgICAgICAgdGhpcy5pZGVudGlmaWVyLnNldFR5cGUoaWRlbnRUeXBlKTsKLQotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoaWRlbnQsaWRlbnRpZmllcik7Ci0KLSAgICAgICAgLy8gY29uZmlndXJlIHJlbWFpbmluZyBwcm9wZXJ0aWVzCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMgPSBtZXRhRGF0YS5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07Ci0gICAgICAgICAgICBpZighcHJvcGVydHlOYW1lLmVxdWFscyhpZGVudCkpIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzc1Byb3BlcnR5IHByb3AgPSBuZXcgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3NQcm9wZXJ0eSh0aGlzLHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgcHJvcC5zZXRUeXBlKGJlYW4uZ2V0UHJvcGVydHlUeXBlKHByb3BlcnR5TmFtZSkpOwotICAgICAgICAgICAgICAgIFR5cGUgaGliZXJuYXRlVHlwZSA9IG1ldGFEYXRhLmdldFByb3BlcnR5VHlwZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgIC8vIGlmIGl0cyBhbiBhc3NvY2lhdGlvbiB0eXBlCi0gICAgICAgICAgICAgICAgaWYoaGliZXJuYXRlVHlwZS5pc0Fzc29jaWF0aW9uVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3Auc2V0QXNzb2NpYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYXNzb2NpYXRlZCB0eXBlIGZyb20gdGhlIHNlc3Npb24gZmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc2V0IGl0IG9uIHRoZSBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICBBc3NvY2lhdGlvblR5cGUgYXNzVHlwZSA9IChBc3NvY2lhdGlvblR5cGUpaGliZXJuYXRlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFzc29jaWF0ZWRFbnRpdHkgPSBhc3NUeXBlLmdldEFzc29jaWF0ZWRFbnRpdHlOYW1lKChTZXNzaW9uRmFjdG9yeUltcGxlbWVudG9yKXNlc3Npb25GYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRhZGF0YSBhc3NvY2lhdGVkTWV0YURhdGEgPSBzZXNzaW9uRmFjdG9yeS5nZXRDbGFzc01ldGFkYXRhKGFzc29jaWF0ZWRFbnRpdHkpOwotICAgICAgICAgICAgICAgICAgICBwcm9wLnNldFJlbGF0ZWRDbGFzc1R5cGUoYXNzb2NpYXRlZE1ldGFEYXRhLmdldE1hcHBlZENsYXNzKEVudGl0eU1vZGUuUE9KTykpOwotICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmUgdHlwZSBvZiByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgICAgICAgICAgaWYoaGliZXJuYXRlVHlwZS5pc0NvbGxlY3Rpb25UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3Auc2V0T25lVG9NYW55KHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoaGliZXJuYXRlVHlwZS5pc0VudGl0eVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5zZXRNYW55VG9PbmUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBub3QgcmVhbGx5IGJlIHRydWUsIGJ1dCBmb3Igb3VyIHB1cnBvc2VzIHRoaXMgaXMgb2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3Auc2V0T25lVG9PbmUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5TmFtZSxwcm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IChHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10pcHJvcGVydHlNYXAudmFsdWVzKCkudG9BcnJheShuZXcgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtwcm9wZXJ0eU1hcC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc093bmluZ0NsYXNzKENsYXNzIGRvbWFpbkNsYXNzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICdpc093bmluZ0NsYXNzJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGltcGxlbWVudGF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHlbXSBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gZ2V0UGVyc2lzdGFudFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ2V0SWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBnZXRWZXJzaW9uKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAnZ2V0VmVyc2lvbicgaXMgbm90IHN1cHBvcnRlZCBieSBpbXBsZW1lbnRhdGlvbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGdldFByb3BlcnR5QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSlwcm9wZXJ0eU1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAnZ2V0RmllbGROYW1lJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGltcGxlbWVudGF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICdnZXRUYWJsZU5hbWUnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaW1wbGVtZW50YXRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVRvTWFueShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5QnlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcC5pc09uZVRvTWFueSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYW55VG9PbmUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3AgPSBnZXRQcm9wZXJ0eUJ5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZihwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHByb3AuaXNNYW55VG9PbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICdpc0JpZGlyZWN0aW9uYWwnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaW1wbGVtZW50YXRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVsYXRlZENsYXNzVHlwZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5QnlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmKHByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wLmdldFJlZmVyZW5jZWRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCkgewotICAgICAgICBpZihnZXRSZWZlcmVuY2UoKS5pc1JlYWRhYmxlUHJvcGVydHkoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5DT05TVFJBSU5UUykpIHsKLSAgICAgICAgICAgIExpc3QgY29uc3RyYWludHNMaXN0ID0gKExpc3QpZ2V0UHJvcGVydHlWYWx1ZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5LkNPTlNUUkFJTlRTLExpc3QuY2xhc3MpOwotICAgICAgICAgICAgaWYoY29uc3RyYWludHNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNYXAgY29uc3RyYWludHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnN0cmFpbnRzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWluZWRQcm9wZXJ0eSBjcCA9IChDb25zdHJhaW5lZFByb3BlcnR5KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNNYXAucHV0KGNwLmdldFByb3BlcnR5TmFtZSgpLGNwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzTWFwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICBNYXAgY29uc3RyYWludHNNYXAgPSAoTWFwKWdldFByb3BlcnR5VmFsdWUoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eS5DT05TVFJBSU5UUyxNYXAuY2xhc3MpOwotICAgICAgICAgICAgICAgaWYoY29uc3RyYWludHNNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzTWFwOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIGlmKHRoaXMudmFsaWRhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yIGdkY3YgPSBuZXcgR3JhaWxzRG9tYWluQ2xhc3NWYWxpZGF0b3IoKTsKLSAgICAgICAgICAgIGdkY3Yuc2V0RG9tYWluQ2xhc3ModGhpcyk7Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvciA9IGdkY3Y7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBISUJFUk5BVEU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0dyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzUHJvcGVydHkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9HcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzc1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjNlZTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0dyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eTsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgQ2xhc3NlcyBtYXBwZWQgaW4KLSAqIEhpYmVybmF0ZSB0byBpbnRlZ3JhdGUgd2l0aCBHcmFpbHMnIHZhbGlkYXRpb24sIGR5bmFtaWMgbWV0aG9kcyBldGMuIHNlYW1sZXNzbHkKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxOC1GZWItMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3NQcm9wZXJ0eSBpbXBsZW1lbnRzIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgewotICAgIHByaXZhdGUgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3M7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG5hdHVyYWxOYW1lOwotICAgIHByaXZhdGUgQ2xhc3MgdHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaWRlbnRpdHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9uZVRvT25lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtYW55VG9PbmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFzc29jaWF0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBvbmVUb01hbnk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1hbnlUb01hbnk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGJpZGlyZWN0aW9uYWw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOwotICAgIHByaXZhdGUgQ2xhc3MgcmVsYXRlZENsYXNzVHlwZTsKLSAgICBwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzIHJlZmVyZW5jZWREb21haW5DbGFzczsKLSAgICBwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgb3RoZXJTaWRlOwotCi0KLSAgICBwdWJsaWMgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3NQcm9wZXJ0eShHcmFpbHNIaWJlcm5hdGVEb21haW5DbGFzcyBkb21haW5DbGFzcywgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICB0aGlzLmRvbWFpbkNsYXNzID0gZG9tYWluQ2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgdGhpcy5uYXR1cmFsTmFtZSA9IEdyYWlsc0NsYXNzVXRpbHMuZ2V0TmF0dXJhbE5hbWUocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlUHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gR3JhaWxzQ2xhc3NVdGlscy5nZXRQcm9wZXJ0eU5hbWVSZXByZXNlbnRhdGlvbih0aGlzLnR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzcyBnZXREb21haW5DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hdHVyYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYXR1cmFsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRG9tYWluQ2xhc3MoR3JhaWxzRG9tYWluQ2xhc3MgcmVmZXJlbmNlZEdyYWlsc0RvbWFpbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMucmVmZXJlbmNlZERvbWFpbkNsYXNzID0gICByZWZlcmVuY2VkR3JhaWxzRG9tYWluQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3RoZXJTaWRlKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcmVmZXJlbmNlZFByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMub3RoZXJTaWRlID0gcmVmZXJlbmNlZFByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGdldE90aGVyU2lkZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub3RoZXJTaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRSZWZlcmVuY2VkUHJvcGVydHlUeXBlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkQ2xhc3NUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWRlbnRpdHkoKSB7Ci0gICAgICAgIHJldHVybiBpZGVudGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGl0eShib29sZWFuIGlkZW50aXR5KSB7Ci0gICAgICAgIHRoaXMuaWRlbnRpdHkgPSBpZGVudGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gb3B0aW9uYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBvcHRpb25hbCkgewotICAgICAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVUb09uZSgpIHsKLSAgICAgICAgcmV0dXJuIG9uZVRvT25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uZVRvT25lKGJvb2xlYW4gb25lVG9PbmUpIHsKLSAgICAgICAgdGhpcy5vbmVUb09uZSA9IG9uZVRvT25lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWFueVRvT25lKCkgewotICAgICAgICByZXR1cm4gbWFueVRvT25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hbnlUb09uZShib29sZWFuIG1hbnlUb09uZSkgewotICAgICAgICB0aGlzLm1hbnlUb09uZSA9IG1hbnlUb09uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc29jaWF0aW9uKCkgewotICAgICAgICByZXR1cm4gYXNzb2NpYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXNzb2NpYXRpb24oYm9vbGVhbiBhc3NvY2lhdGlvbikgewotICAgICAgICB0aGlzLmFzc29jaWF0aW9uID0gYXNzb2NpYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVUb01hbnkoKSB7Ci0gICAgICAgIHJldHVybiBvbmVUb01hbnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T25lVG9NYW55KGJvb2xlYW4gb25lVG9NYW55KSB7Ci0gICAgICAgIHRoaXMub25lVG9NYW55ID0gb25lVG9NYW55OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWFueVRvTWFueSgpIHsKLSAgICAgICAgcmV0dXJuIG1hbnlUb01hbnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFueVRvTWFueShib29sZWFuIG1hbnlUb01hbnkpIHsKLSAgICAgICAgdGhpcy5tYW55VG9NYW55ID0gbWFueVRvTWFueTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0JpZGlyZWN0aW9uYWwoKSB7Ci0gICAgICAgIHJldHVybiBiaWRpcmVjdGlvbmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAnZ2V0RmllbGROYW1lJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGltcGxlbWVudGF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlkaXJlY3Rpb25hbChib29sZWFuIGJpZGlyZWN0aW9uYWwpIHsKLSAgICAgICAgdGhpcy5iaWRpcmVjdGlvbmFsID0gYmlkaXJlY3Rpb25hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzRG9tYWluQ2xhc3MgZ2V0UmVmZXJlbmNlZERvbWFpbkNsYXNzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VkRG9tYWluQ2xhc3M7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGVkQ2xhc3NUeXBlKENsYXNzIHJlbGF0ZWRUeXBlKSB7Ci0gICAgICAgIHRoaXMucmVsYXRlZENsYXNzVHlwZSA9IHJlbGF0ZWRUeXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9jZmcvRGVmYXVsdEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9jZmcvRGVmYXVsdEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkYzAyOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0RlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuRG9tYWluQ2xhc3NNZXRob2RzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuSGliZXJuYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuTWFwcGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuRW50aXR5TW9kZTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLm1ldGFkYXRhLkNsYXNzTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jZmcuQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVzIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBtYXBwaW5ncyBmb3IgdGhlIEdyYWlscyBkb21haW4gY2xhc3NlcwotICogYmFzZWQgb24gdGhlIHdvcmsgZG9uZSBpbiB0aGUgSGliZXJuYXRlIEFubm90YXRpb25zIHByb2plY3QKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDYtSnVsLTIwMDUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uIGV4dGVuZHMgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyAgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0R3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbi5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzExNTA4NzM0MjY4OTMwNTUxN0w7Ci0gICAgcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBncmFpbHNBcHBsaWNhdGlvbjsKLSAgICBwcml2YXRlIFNldCBkb21haW5DbGFzc2VzOwotICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWdMb2NrZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZUR5bmFtaWNNZXRob2RzID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmRvbWFpbkNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZy5HcmFpbHNEb21haW5Db25maWd1cmF0aW9uI2FkZERvbWFpbkNsYXNzKG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3MpCi0gICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNEb21haW5Db25maWd1cmF0aW9uIGFkZERvbWFpbkNsYXNzKCBHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyApIHsKLSAgICAgICAgaWYoZG9tYWluQ2xhc3MuZ2V0TWFwcGVkQnkoKS5lcXVhbHNJZ25vcmVDYXNlKCBHcmFpbHNEb21haW5DbGFzcy5HT1JNICkpIHsKLSAgICAgICAgICAgIHRoaXMuZG9tYWluQ2xhc3Nlcy5hZGQoZG9tYWluQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZy5HcmFpbHNEb21haW5Db25maWd1cmF0aW9uI3NldEdyYWlsc0FwcGxpY2F0aW9uKG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb24pCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdyYWlsc0FwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMuZ3JhaWxzQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLSAgICAgICAgaWYodGhpcy5ncmFpbHNBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzc1tdIGV4aXN0aW5nRG9tYWluQ2xhc3NlcyA9IHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3NlcygpOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGV4aXN0aW5nRG9tYWluQ2xhc3Nlcy5sZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICAgICAgYWRkRG9tYWluQ2xhc3MoZXhpc3RpbmdEb21haW5DbGFzc2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuaGliZXJuYXRlLmNmZy5Db25maWd1cmF0aW9uI2J1aWxkU2Vzc2lvbkZhY3RvcnkoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvbkZhY3RvcnkgYnVpbGRTZXNzaW9uRmFjdG9yeSgpIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24gewotCi0gICAgICAgIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5ID0gIHN1cGVyLmJ1aWxkU2Vzc2lvbkZhY3RvcnkoKTsKLSAgICAgICAgaWYoY29uZmlndXJlRHluYW1pY01ldGhvZHMpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKHNlc3Npb25GYWN0b3J5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Vzc2lvbkZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlRHluYW1pY01ldGhvZHMoU2Vzc2lvbkZhY3Rvcnkgc2YpIHsKLSAgICAgICAgR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvblV0aWwuY29uZmlndXJlRHluYW1pY01ldGhvZHMoc2YsdGhpcy5ncmFpbHNBcHBsaWNhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJlRHluYW1pY01ldGhvZHMoYm9vbGVhbiBzaG91bGRDb25maWd1cmUpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmVEeW5hbWljTWV0aG9kcyA9IHNob3VsZENvbmZpZ3VyZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciB0byBpbmNsdWRpbmcgYmluZGluZyBvZiBHcmFpbHMKLSAgICAgKiAgZG9tYWluIGNsYXNzZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZWNvbmRQYXNzQ29tcGlsZSgpIHRocm93cyBNYXBwaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbmZpZ0xvY2tlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCB0aGUgY2xhc3MgbG9hZGVyIHRvIGxvYWQgR3Jvb3Z5IGNsYXNzZXMKLSAgICAgICAgaWYodGhpcy5ncmFpbHNBcHBsaWNhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoIHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0Q2xhc3NMb2FkZXIoKSApOwotICAgICAgICAvLyBkbyBHcmFpbHMgY2xhc3MgY29uZmlndXJhdGlvbgotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IHRoaXMuZG9tYWluQ2xhc3Nlcy5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSAoR3JhaWxzRG9tYWluQ2xhc3MpaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIEdyYWlsc0RvbWFpbkJpbmRlci5iaW5kQ2xhc3MoZG9tYWluQ2xhc3MsIHN1cGVyLmNyZWF0ZU1hcHBpbmdzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsbCBzdXBlcgotICAgICAgICBzdXBlci5zZWNvbmRQYXNzQ29tcGlsZSgpOwotICAgICAgICB0aGlzLmNvbmZpZ0xvY2tlZCA9IHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkJpbmRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2NmZy9HcmFpbHNEb21haW5CaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMzJhOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkJpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY1ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmc7Ci0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5GZXRjaE1vZGU7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5NYXBwaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY2ZnLk1hcHBpbmdzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY2ZnLlNlY29uZFBhc3M7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5pZC5QZXJzaXN0ZW50SWRlbnRpZmllckdlbmVyYXRvcjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLm1hcHBpbmcuKjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLm1hcHBpbmcuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLnV0aWwuU3RyaW5nSGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLQotLyoqCi0gKiBIYW5kbGVzIHRoZSBiaW5kaW5nIEdyYWlscyBkb21haW4gY2xhc3NlcyBhbmQgcHJvcGVydGllcyB0byB0aGUgSGliZXJuYXRlIHJ1bnRpbWUgbWV0YSBtb2RlbC4KLSAqIEJhc2VkIG9uIHRoZSBIYm1CaW5kZXIgY29kZSBpbiBIaWJlcm5hdGUgY29yZSBhbmQgaW5mbHVlbmNlZCBieSBBbm5vdGF0aW9uc0JpbmRlci4KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDYtSnVsLTIwMDUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdyYWlsc0RvbWFpbkJpbmRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVJR05fS0VZX1NVRkZJWCA9ICJfSUQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyggR3JhaWxzRG9tYWluQmluZGVyLmNsYXNzICk7Ci0JCi0JLyoqCi0JICogQSBDb2xsZWN0aW9uIHR5cGUsIGZvciB0aGUgbW9tZW50IG9ubHkgU2V0IGlzIHN1cHBvcnRlZAotCSAqIAotCSAqIEBhdXRob3IgR3JhZW1lCi0JICoKLQkgKi8KLQlhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvblR5cGUgewotCQkKLQkJcHJpdmF0ZSBDbGFzcyBjbGF6ejsKLQotCQlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbiBjcmVhdGUoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBwcm9wZXJ0eSwgUGVyc2lzdGVudENsYXNzIG93bmVyLAotCQkJCU1hcHBpbmdzIG1hcHBpbmdzKSB0aHJvd3MgTWFwcGluZ0V4Y2VwdGlvbjsKLQotCQlDb2xsZWN0aW9uVHlwZShDbGFzcyBjbGF6eikgewotCQkJdGhpcy5jbGF6eiA9IGNsYXp6OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBjbGF6ei5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb25UeXBlIFNFVCA9IG5ldyBDb2xsZWN0aW9uVHlwZShTZXQuY2xhc3MpIHsKLQotCQkJcHVibGljIENvbGxlY3Rpb24gY3JlYXRlKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHksIFBlcnNpc3RlbnRDbGFzcyBvd25lciwgTWFwcGluZ3MgbWFwcGluZ3MpIHRocm93cyBNYXBwaW5nRXhjZXB0aW9uIHsKLQkJCQlvcmcuaGliZXJuYXRlLm1hcHBpbmcuU2V0IGNvbGwgPSBuZXcgb3JnLmhpYmVybmF0ZS5tYXBwaW5nLlNldChvd25lcik7Ci0JCQkJY29sbC5zZXRDb2xsZWN0aW9uVGFibGUob3duZXIuZ2V0VGFibGUoKSk7Ci0JCQkJYmluZENvbGxlY3Rpb24oIHByb3BlcnR5LCBjb2xsLCBvd25lciwgbWFwcGluZ3MgKTsKLQkJCQlyZXR1cm4gY29sbDsKLQkJCX0KLQotCQkJCi0JCX07Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgSU5TVEFOQ0VTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCXN0YXRpYyB7Ci0JCQlJTlNUQU5DRVMucHV0KCBTRVQudG9TdHJpbmcoKSwgU0VUICk7CQkJCi0JCX0KLQkJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZUZvckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCQlyZXR1cm4gKENvbGxlY3Rpb25UeXBlKUlOU1RBTkNFUy5nZXQoIGNsYXp6LmdldE5hbWUoKSApOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogU2Vjb25kIHBhc3MgY2xhc3MgZm9yIGdyYWlscyByZWxhdGlvbnNoaXBzLiBUaGlzIGlzIHJlcXVpcmVkIGFzIGFsbAotCSAqIHBlcnNpc3RlbnQgY2xhc3NlcyBuZWVkIHRvIGJlIGxvYWRlZCBpbiB0aGUgZmlyc3QgcGFzcyBhbmQgdGhlbiByZWxhdGlvbnNoaXBzCi0JICogZXN0YWJsaXNoZWQgaW4gdGhlIHNlY29uZCBwYXNzIGNvbXBpbGUKLQkgKiAKLQkgKiBAYXV0aG9yIEdyYWVtZQotCSAqCi0JICovCi0Jc3RhdGljIGNsYXNzIEdyYWlsc0NvbGxlY3Rpb25TZWNvbmRQYXNzIGltcGxlbWVudHMgU2Vjb25kUGFzcyB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU1NDA1MjY5NDIwOTI2MTEzNDhMOwotCQlwcml2YXRlIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHk7Ci0JCXByaXZhdGUgTWFwcGluZ3MgbWFwcGluZ3M7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotCi0JCXB1YmxpYyBHcmFpbHNDb2xsZWN0aW9uU2Vjb25kUGFzcyhHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5LCBNYXBwaW5ncyBtYXBwaW5ncywgQ29sbGVjdGlvbiBjb2xsKSB7Ci0JCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCQl0aGlzLm1hcHBpbmdzID0gbWFwcGluZ3M7Ci0JCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9TZWNvbmRQYXNzKE1hcCBwZXJzaXN0ZW50Q2xhc3NlcywgTWFwIGluaGVyaXRlZE1ldGFzKSB0aHJvd3MgTWFwcGluZ0V4Y2VwdGlvbiB7Ci0JCQliaW5kQ29sbGVjdGlvblNlY29uZFBhc3MoIHRoaXMucHJvcGVydHksIG1hcHBpbmdzLCBwZXJzaXN0ZW50Q2xhc3NlcywgY29sbGVjdGlvbixpbmhlcml0ZWRNZXRhcyApOwkJCQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRDb2xsZWN0aW9uU2Vjb25kUGFzcyhHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5LCBNYXBwaW5ncyBtYXBwaW5ncywgTWFwIHBlcnNpc3RlbnRDbGFzc2VzLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIE1hcCBpbmhlcml0ZWRNZXRhcykgewotCi0JCVBlcnNpc3RlbnRDbGFzcyBhc3NvY2lhdGVkQ2xhc3MgPSBudWxsOwotCQkvLyBDb25maWd1cmUgb25lLXRvLW1hbnkKLQkJaWYoY29sbGVjdGlvbi5pc09uZVRvTWFueSgpKSB7Ci0JCQlPbmVUb01hbnkgb25lVG9NYW55ID0gKE9uZVRvTWFueSljb2xsZWN0aW9uLmdldEVsZW1lbnQoKTsKLQkJCVN0cmluZyBhc3NvY2lhdGVkQ2xhc3NOYW1lID0gb25lVG9NYW55LmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCk7Ci0JCQkKLQkJCWFzc29jaWF0ZWRDbGFzcyA9IChQZXJzaXN0ZW50Q2xhc3MpcGVyc2lzdGVudENsYXNzZXMuZ2V0KGFzc29jaWF0ZWRDbGFzc05hbWUpOwotCQkJLy8gaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVudCBjbGFzcyBmb3IgdGhlIGFzc29jaWF0aW9uIHRocm93Ci0JCQkvLyBleGNlcHRpb24KLQkJCWlmKGFzc29jaWF0ZWRDbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE1hcHBpbmdFeGNlcHRpb24oICJBc3NvY2lhdGlvbiByZWZlcmVuY2VzIHVubWFwcGVkIGNsYXNzOiAiICsgb25lVG9NYW55LmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkgKTsKLQkJCX0KLQkJCQotCQkJb25lVG9NYW55LnNldEFzc29jaWF0ZWRDbGFzcyggYXNzb2NpYXRlZENsYXNzICk7Ci0JCQljb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZSggYXNzb2NpYXRlZENsYXNzLmdldFRhYmxlKCkgKTsKLQkJCWNvbGxlY3Rpb24uc2V0TGF6eSh0cnVlKTsKLQkJCQotCQkJTE9HLmluZm8oICJNYXBwaW5nIGNvbGxlY3Rpb246ICIKLQkJCQkJKyBjb2xsZWN0aW9uLmdldFJvbGUoKQotCQkJCQkrICIgLT4gIgotCQkJCQkrIGNvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpICk7Ci0JCQkKLQkJfQotCQkKLQkJLy8gc2V0dXAgdGhlIHByaW1hcnkga2V5IHJlZmVyZW5jZXMKLQkJS2V5VmFsdWUga2V5VmFsdWU7Ci0JCQotCQlTdHJpbmcgcHJvcGVydHlSZWYgPSBjb2xsZWN0aW9uLmdldFJlZmVyZW5jZWRQcm9wZXJ0eU5hbWUoKTsKLQkJLy8gdGhpcyBpcyB0byBzdXBwb3J0IG1hcHBpbmcgYnkgYSBwcm9wZXJ0eQotCQlpZihwcm9wZXJ0eVJlZiA9PSBudWxsKSB7Ci0JCQlrZXlWYWx1ZSA9IGNvbGxlY3Rpb24uZ2V0T3duZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlrZXlWYWx1ZSA9IChLZXlWYWx1ZSljb2xsZWN0aW9uLmdldE93bmVyKCkuZ2V0UHJvcGVydHkoIHByb3BlcnR5UmVmICkuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJRGVwZW5kYW50VmFsdWUga2V5ID0gbmV3IERlcGVuZGFudFZhbHVlKGNvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCksIGtleVZhbHVlKTsJCQotCQlrZXkuc2V0VHlwZU5hbWUobnVsbCk7Ci0JCQotLy8JCQotCQlpZihwcm9wZXJ0eS5pc0JpZGlyZWN0aW9uYWwoKSkgewotCQkJR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBvdGhlclNpZGUgPSBwcm9wZXJ0eS5nZXRPdGhlclNpZGUoKTsKLQkJCWlmKG90aGVyU2lkZS5pc01hbnlUb09uZSgpKSB7Ci0JCQkJY29sbGVjdGlvbi5zZXRJbnZlcnNlKHRydWUpOwotCQkJCUl0ZXJhdG9yIG1hcHBlZEJ5Q29sdW1ucyA9IGFzc29jaWF0ZWRDbGFzcy5nZXRQcm9wZXJ0eSggb3RoZXJTaWRlLmdldE5hbWUoKSApLmdldFZhbHVlKCkuZ2V0Q29sdW1uSXRlcmF0b3IoKTsKLQkJCQl3aGlsZShtYXBwZWRCeUNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCUNvbHVtbiBjb2x1bW4gPSAoQ29sdW1uKW1hcHBlZEJ5Q29sdW1ucy5uZXh0KCk7Ci0JCQkJCWxpbmtWYWx1ZVVzaW5nQUNvbHVtbkNvcHkob3RoZXJTaWRlLGNvbHVtbixrZXkpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQllbHNlIHsKLQkJCWJpbmRTaW1wbGVWYWx1ZSggcHJvcGVydHksa2V5LG1hcHBpbmdzICk7Ci0JCX0JCQkJCi0JCWNvbGxlY3Rpb24uc2V0S2V5KCBrZXkgKTsKLQkJLy8gbWFrZSByZXF1aXJlZCBhbmQgbm9uLXVwZGF0ZWFibGUKLQkJa2V5LnNldE51bGxhYmxlKGZhbHNlKTsKLQkJa2V5LnNldFVwZGF0ZWFibGUoZmFsc2UpOwotCQkKLQkJLy8gaWYgd2UgaGF2ZSBhIG1hbnktdG8tbWFueQotCQlpZihwcm9wZXJ0eS5pc01hbnlUb01hbnkoKSkgewotCQkJTWFueVRvT25lIGVsZW1lbnQgPSBuZXcgTWFueVRvT25lKCBjb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpICk7Ci0JCQljb2xsZWN0aW9uLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQliaW5kTWFueVRvT25lKHByb3BlcnR5LGVsZW1lbnQsIG1hcHBpbmdzKTsKLQkJfQotCQllbHNlIGlmICggcHJvcGVydHkuaXNPbmVUb01hbnkoKSAmJiAhcHJvcGVydHkuaXNCaWRpcmVjdGlvbmFsKCkgKSB7Ci0JCQkJLy8gZm9yIG5vbi1pbnZlcnNlIG9uZS10by1tYW55LCB3aXRoIGEgbm90LW51bGwgZmssIGFkZCBhIGJhY2tyZWYhCi0JCQlPbmVUb01hbnkgb25lVG9NYW55ID0gKE9uZVRvTWFueSkgY29sbGVjdGlvbi5nZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIGVudGl0eU5hbWUgPSAoIG9uZVRvTWFueSApLmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCk7Ci0JCQkJUGVyc2lzdGVudENsYXNzIHJlZmVyZW5jZWQgPSBtYXBwaW5ncy5nZXRDbGFzcyggZW50aXR5TmFtZSApOwotCQkJCUJhY2tyZWYgcHJvcCA9IG5ldyBCYWNrcmVmKCk7Ci0JCQkJcHJvcC5zZXROYW1lKCAnXycgKyBwcm9wZXJ0eS5nZXROYW1lKCkgKyAiQmFja3JlZiIgKTsKLQkJCQlwcm9wLnNldFVwZGF0ZWFibGUoIHRydWUgKTsKLQkJCQlwcm9wLnNldEluc2VydGFibGUoIHRydWUgKTsKLQkJCQlwcm9wLnNldENvbGxlY3Rpb25Sb2xlKCBjb2xsZWN0aW9uLmdldFJvbGUoKSApOwotCQkJCXByb3Auc2V0VmFsdWUoIGNvbGxlY3Rpb24uZ2V0S2V5KCkgKTsKLQkJCQlwcm9wLnNldE9wdGlvbmFsKCBwcm9wZXJ0eS5pc09wdGlvbmFsKCkgKTsKLQkJCQlyZWZlcmVuY2VkLmFkZFByb3BlcnR5KCBwcm9wICk7Ci0JCX0JCQotCX0JCQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbGlua1ZhbHVlVXNpbmdBQ29sdW1uQ29weShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3AsIENvbHVtbiBjb2x1bW4sIERlcGVuZGFudFZhbHVlIGtleSkgewotCQlDb2x1bW4gbWFwcGluZ0NvbHVtbiA9IG5ldyBDb2x1bW4oKTsKLQkJbWFwcGluZ0NvbHVtbi5zZXROYW1lKGNvbHVtbi5nZXROYW1lKCkpOwotCQltYXBwaW5nQ29sdW1uLnNldExlbmd0aChjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQltYXBwaW5nQ29sdW1uLnNldE51bGxhYmxlKCFwcm9wLmlzT3B0aW9uYWwoKSk7Ci0JCW1hcHBpbmdDb2x1bW4uc2V0U3FsVHlwZShjb2x1bW4uZ2V0U3FsVHlwZSgpKTsJCQotCQkKLQkJbWFwcGluZ0NvbHVtbi5zZXRWYWx1ZShrZXkpOwotCQlrZXkuYWRkQ29sdW1uKCBtYXBwaW5nQ29sdW1uICk7Ci0JCWtleS5nZXRUYWJsZSgpLmFkZENvbHVtbiggbWFwcGluZ0NvbHVtbiApOwkJCi0JfQotCi0JLyoqCi0JICogRmlyc3QgcGFzcyB0byBiaW5kIGNvbGxlY3Rpb24gdG8gSGliZXJuYXRlIG1ldGFtb2RlbCwgc2V0cyB1cCBzZWNvbmQgcGFzcwotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25pbmcgcGVyc2lzdGVudCBjbGFzcwotCSAqIEBwYXJhbSBtYXBwaW5ncyBUaGUgSGliZXJuYXRlIG1hcHBpbmdzIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBiaW5kQ29sbGVjdGlvbihHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IHByb3BlcnR5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIFBlcnNpc3RlbnRDbGFzcyBvd25lciwgTWFwcGluZ3MgbWFwcGluZ3MpIHsKLQkJCi0JCS8vIHNldCByb2xlCi0JCWNvbGxlY3Rpb24uc2V0Um9sZSggU3RyaW5nSGVscGVyLnF1YWxpZnkoIHByb3BlcnR5LmdldERvbWFpbkNsYXNzKCkuZ2V0RnVsbE5hbWUoKSAsIHByb3BlcnR5LmdldE5hbWUoKSApICk7Ci0JCQotCQkvLyBUT0RPOiBhZGQgY29kZSB0byBjb25maWd1cmUgb3B0aW1pc3RpYyBsb2NraW5nCi0JCQotCQkvLyBUT0RPOiBjb25maWd1cmUgZmV0Y2ggc3RyYXRlZ3kKLQkJY29sbGVjdGlvbi5zZXRGZXRjaE1vZGUoIEZldGNoTW9kZS5ERUZBVUxUICk7Ci0JCQotCQkvLyBpZiBpdHMgYSBvbmUtdG8tbWFueSBtYXBwaW5nCi0JCWlmKHByb3BlcnR5LmlzT25lVG9NYW55KCkpIHsKLQkJCQotCQkJT25lVG9NYW55IG9uZVRvTWFueSA9IG5ldyBPbmVUb01hbnkoIGNvbGxlY3Rpb24uZ2V0T3duZXIoKSApOwotCQkJY29sbGVjdGlvbi5zZXRFbGVtZW50KCBvbmVUb01hbnkgKTsKLQkJCQotCQkJYmluZE9uZVRvTWFueSggcHJvcGVydHksIG9uZVRvTWFueSwgbWFwcGluZ3MgKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0YWJsZU5hbWUgPSBwcm9wZXJ0eS5nZXRSZWZlcmVuY2VkRG9tYWluQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkKLQkJCVRhYmxlIHRhYmxlID0gbWFwcGluZ3MuYWRkVGFibGUoCi0JCQkJCQkJCW1hcHBpbmdzLmdldFNjaGVtYU5hbWUoKSwKLQkJCQkJCQkJbWFwcGluZ3MuZ2V0Q2F0YWxvZ05hbWUoKSwKLQkJCQkJCQkJdGFibGVOYW1lLAotCQkJCQkJCQludWxsLAotCQkJCQkJCQlmYWxzZQotCQkJCQkJCSk7Ci0JCQljb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZSh0YWJsZSk7Ci0JCX0KLQkJCi0JCS8vIHNldHVwIHNlY29uZCBwYXNzCi0JCW1hcHBpbmdzLmFkZFNlY29uZFBhc3MoIG5ldyBHcmFpbHNDb2xsZWN0aW9uU2Vjb25kUGFzcyhwcm9wZXJ0eSwgbWFwcGluZ3MsIGNvbGxlY3Rpb24pICk7Ci0JCQotCX0KLQkvKioKLQkgKiBCaW5kcyBhIEdyYWlscyBkb21haW4gY2xhc3MgdG8gdGhlIEhpYmVybmF0ZSBydW50aW1lIG1ldGEgbW9kZWwKLQkgKiBAcGFyYW0gZG9tYWluQ2xhc3MgVGhlIGRvbWFpbiBjbGFzcyB0byBiaW5kCi0JICogQHBhcmFtIG1hcHBpbmdzIFRoZSBleGlzdGluZyBtYXBwaW5ncwotCSAqIEB0aHJvd3MgTWFwcGluZ0V4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIGRvbWFpbiBjbGFzcyB1c2VzIGluaGVyaXRhbmNlIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZENsYXNzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzLCBNYXBwaW5ncyBtYXBwaW5ncykKLQkJdGhyb3dzIE1hcHBpbmdFeGNlcHRpb24gewkJCi0JCWlmKGRvbWFpbkNsYXNzLmdldENsYXp6KCkuZ2V0U3VwZXJjbGFzcygpID09IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIHsKLQkJCWJpbmRSb290KGRvbWFpbkNsYXNzLCBtYXBwaW5ncyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgTWFwcGluZ0V4Y2VwdGlvbigiR3JhaWxzIGRvbWFpbiBjbGFzc2VzIGRvIG5vdCBzdXBwb3J0IGluaGVyaXRhbmNlIik7CQkJCQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHBlcnNpc3RhbnQgY2xhc3MgdG8gdGhlIHJ1bnRpbWUgbW9kZWwgYmFzZWQgb24gdGhlIAotCSAqIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzCi0JICogQHBhcmFtIGRvbWFpbkNsYXNzIFRoZSBHcmFpbHMgZG9tYWluIGNsYXNzCi0JICogQHBhcmFtIHBlcnNpc3RlbnRDbGFzcyBUaGUgcGVyc2lzdGFudCBjbGFzcwotCSAqIEBwYXJhbSBtYXBwaW5ncyBFeGlzdGluZyBtYXBwaW5ncwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYmluZENsYXNzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzLCBQZXJzaXN0ZW50Q2xhc3MgcGVyc2lzdGVudENsYXNzLCBNYXBwaW5ncyBtYXBwaW5ncykgewotCQkKLQkJLy8gc2V0IGxhenkgbG9hZGluZyBmb3Igbm93Ci0JCXBlcnNpc3RlbnRDbGFzcy5zZXRMYXp5KHRydWUpOwotCQlwZXJzaXN0ZW50Q2xhc3Muc2V0RW50aXR5TmFtZShkb21haW5DbGFzcy5nZXRGdWxsTmFtZSgpKTsKLQkJcGVyc2lzdGVudENsYXNzLnNldFByb3h5SW50ZXJmYWNlTmFtZSggZG9tYWluQ2xhc3MuZ2V0RnVsbE5hbWUoKSApOwotCQlwZXJzaXN0ZW50Q2xhc3Muc2V0Q2xhc3NOYW1lKGRvbWFpbkNsYXNzLmdldEZ1bGxOYW1lKCkpOwotCQkvLyBzZXQgZHluYW1pYyBpbnNlcnQgdG8gZmFsc2UKLQkJcGVyc2lzdGVudENsYXNzLnNldER5bmFtaWNJbnNlcnQoZmFsc2UpOwotCQkvLyBzZXQgZHluYW1pYyB1cGRhdGUgdG8gZmFsc2UKLQkJcGVyc2lzdGVudENsYXNzLnNldER5bmFtaWNVcGRhdGUoZmFsc2UpOwotCQkvLyBzZXQgc2VsZWN0IGJlZm9yZSB1cGRhdGUgdG8gZmFsc2UKLQkJcGVyc2lzdGVudENsYXNzLnNldFNlbGVjdEJlZm9yZVVwZGF0ZShmYWxzZSk7Ci0JCQotCQkvLyBhZGQgaW1wb3J0IHRvIG1hcHBpbmdzCi0JCWlmICggbWFwcGluZ3MuaXNBdXRvSW1wb3J0KCkgJiYgcGVyc2lzdGVudENsYXNzLmdldEVudGl0eU5hbWUoKS5pbmRleE9mKCAnLicgKSA+IDAgKSB7Ci0JCQltYXBwaW5ncy5hZGRJbXBvcnQoIHBlcnNpc3RlbnRDbGFzcy5nZXRFbnRpdHlOYW1lKCksIFN0cmluZ0hlbHBlci51bnF1YWxpZnkoIHBlcnNpc3RlbnRDbGFzcwotCQkJCS5nZXRFbnRpdHlOYW1lKCkgKSApOwotCQl9CQkKLQl9Ci0KLQkKLQkvKioKLQkgKiBCaW5kcyBhIHJvb3QgY2xhc3MgKG9uZSB3aXRoIG5vIHN1cGVyIGNsYXNzZXMpIHRvIHRoZSBydW50aW1lIG1ldGEgbW9kZWwKLQkgKiBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgR3JhaWxzIGRvbWFpbiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBkb21haW5DbGFzcyBUaGUgR3JhaWxzIGRvbWFpbiBjbGFzcyAKLQkgKiBAcGFyYW0gbWFwcGluZ3MgVGhlIEhpYmVybmF0ZSBNYXBwaW5ncyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZFJvb3QoR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MsIE1hcHBpbmdzIG1hcHBpbmdzKSB7Ci0JCQotCQlSb290Q2xhc3Mgcm9vdCA9IG5ldyBSb290Q2xhc3MoKTsKLQkJYmluZENsYXNzKGRvbWFpbkNsYXNzLCByb290LCBtYXBwaW5ncyk7CQkKLQkJYmluZFJvb3RQZXJzaXN0ZW50Q2xhc3NDb21tb25WYWx1ZXMoZG9tYWluQ2xhc3MsIHJvb3QsIG1hcHBpbmdzKTsKLQkJCi0JCW1hcHBpbmdzLmFkZENsYXNzKHJvb3QpOwotCX0KLQotCi0JLyoqCi0JICogQmluZHMgYSBwZXJzaXN0ZW50IGNsYXNzZXMgdG8gdGhlIHRhYmxlIHJlcHJlc2VudGF0aW9uIGFuZCBiaW5kcyB0aGUgY2xhc3MgcHJvcGVydGllcwotCSAqIAotCSAqIEBwYXJhbSBkb21haW5DbGFzcwotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIG1hcHBpbmdzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBiaW5kUm9vdFBlcnNpc3RlbnRDbGFzc0NvbW1vblZhbHVlcyhHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcywgUm9vdENsYXNzIHJvb3QsIE1hcHBpbmdzIG1hcHBpbmdzKSB7Ci0JCQotCQkvLyBnZXQgdGhlIHNjaGVtYSBhbmQgY2F0YWxvZyBuYW1lcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBzY2hlbWEgPSBtYXBwaW5ncy5nZXRTY2hlbWFOYW1lKCk7Ci0JCVN0cmluZyBjYXRhbG9nID0gbWFwcGluZ3MuZ2V0Q2F0YWxvZ05hbWUoKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgdGFibGUgCi0JCVRhYmxlIHRhYmxlID0gbWFwcGluZ3MuYWRkVGFibGUoCi0JCQkJc2NoZW1hLAotCQkJCWNhdGFsb2csCi0JCQkJZG9tYWluQ2xhc3MuZ2V0VGFibGVOYW1lKCksCi0JCQkJbnVsbCwKLQkJCQlmYWxzZQotCQkpOwotCQlyb290LnNldFRhYmxlKHRhYmxlKTsKLQkJCi0JCUxPRy5pbmZvKCAiW0dyYWlsc0RvbWFpbkJpbmRlcl0gTWFwcGluZyBHcmFpbHMgZG9tYWluIGNsYXNzOiAiICsgZG9tYWluQ2xhc3MuZ2V0RnVsbE5hbWUoKSArICIgLT4gIiArIHJvb3QuZ2V0VGFibGUoKS5nZXROYW1lKCkgKTsKLQkJCi0JCWJpbmRTaW1wbGVJZCggZG9tYWluQ2xhc3MuZ2V0SWRlbnRpZmllcigpLCByb290LCBtYXBwaW5ncyApOwotCQliaW5kVmVyc2lvbiggZG9tYWluQ2xhc3MuZ2V0VmVyc2lvbigpLCByb290LCBtYXBwaW5ncyApOwotCQkKLQkJcm9vdC5jcmVhdGVQcmltYXJ5S2V5KCk7Ci0JCQotCQljcmVhdGVDbGFzc1Byb3BlcnRpZXMoZG9tYWluQ2xhc3Mscm9vdCxtYXBwaW5ncyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgYmluZHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzcGVjaWZpZWQgR3JhaWxzIGRvbWFpbiBjbGFzcyBhbmQgUGVyc2lzdGFudENsYXNzCi0JICogYW5kIGJpbmRzIHRoZW0gdG8gdGhlIEhpYmVybmF0ZSBydW50aW1lIG1ldGEgbW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluQ2xhc3MgVGhlIEdyYWlscyBkb21haW4gY2xhc3MKLQkgKiBAcGFyYW0gcGVyc2lzdGVudENsYXNzIFRoZSBIaWJlcm5hdGUgUGVyc2lzdGVudENsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1hcHBpbmdzIFRoZSBIaWJlcm5hdGUgTWFwcGluZ3MgaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY3JlYXRlQ2xhc3NQcm9wZXJ0aWVzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzLCBQZXJzaXN0ZW50Q2xhc3MgcGVyc2lzdGVudENsYXNzLCBNYXBwaW5ncyBtYXBwaW5ncykgewotCQkKLQkJR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIHBlcnNpc3RhbnRQcm9wZXJ0aWVzID0gZG9tYWluQ2xhc3MuZ2V0UGVyc2lzdGFudFByb3BlcnRpZXMoKTsKLQkJVGFibGUgdGFibGUgPSBwZXJzaXN0ZW50Q2xhc3MuZ2V0VGFibGUoKTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBwZXJzaXN0YW50UHJvcGVydGllcy5sZW5ndGg7aSsrKSB7Ci0JCQkKLQkJCUdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgY3VycmVudEdyYWlsc1Byb3AgPSBwZXJzaXN0YW50UHJvcGVydGllc1tpXTsKLQkJCS8vIFRPRE86IEltcGxlbWVudCBzdXBwb3J0IGZvciBtYW55IGZyb20gbWFueSByZWxhdGlvbnNoaXBzCi0JCQlpZihjdXJyZW50R3JhaWxzUHJvcC5pc01hbnlUb01hbnkoKSkKLQkJCQljb250aW51ZTsKLS8qCQkJaWYoY3VycmVudEdyYWlsc1Byb3AuaXNNYW55VG9PbmUoKSAmJiBjdXJyZW50R3JhaWxzUHJvcC5pc0JpZGlyZWN0aW9uYWwoKSApIHsKLQkJCQlHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IG90aGVyU2lkZSA9IGN1cnJlbnRHcmFpbHNQcm9wLmdldE90aGVyU2lkZSgpOwotCQkJCWlmKG90aGVyU2lkZS5pc09uZVRvTWFueSgpKQotCQkJCQl0YWJsZSA9IG51bGw7Ci0JCQl9Ki8KLQkJCQotCQkJaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIAotCQkJCUxPRy50cmFjZSgiW0dyYWlsc0RvbWFpbkJpbmRlcl0gQmluZGluZyBwZXJzaXN0ZW50IHByb3BlcnR5IFsiICsgY3VycmVudEdyYWlsc1Byb3AuZ2V0TmFtZSgpICsgIl0iKTsKLQkJCQotCQkJVmFsdWUgdmFsdWUgPSBudWxsOwotCQkJCi0JCQkvLyBzZWUgaWYgaXRzIGEgY29sbGVjdGlvbiB0eXBlCi0JCQlDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IENvbGxlY3Rpb25UeXBlLmNvbGxlY3Rpb25UeXBlRm9yQ2xhc3MoIGN1cnJlbnRHcmFpbHNQcm9wLmdldFR5cGUoKSApOwotCQkJaWYoY29sbGVjdGlvblR5cGUgIT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBjb2xsZWN0aW9uCi0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gY29sbGVjdGlvblR5cGUuY3JlYXRlKCAKLQkJCQkJCWN1cnJlbnRHcmFpbHNQcm9wLAotCQkJCQkJcGVyc2lzdGVudENsYXNzLAotCQkJCQkJbWFwcGluZ3MKLQkJCQkpOwotCQkJCW1hcHBpbmdzLmFkZENvbGxlY3Rpb24oY29sbGVjdGlvbik7Ci0JCQkJdmFsdWUgPSBjb2xsZWN0aW9uOwotCQkJfQotCQkJLy8gd29yayBvdXQgd2hhdCB0eXBlIG9mIHJlbGF0aW9uc2hpcCBpdCBpcyBhbmQgYmluZCB2YWx1ZQotCQkJZWxzZSBpZiAoIGN1cnJlbnRHcmFpbHNQcm9wLmlzTWFueVRvT25lKCkgKSB7Ci0JCQkJdmFsdWUgPSBuZXcgTWFueVRvT25lKCB0YWJsZSApOwotCQkJCWJpbmRNYW55VG9PbmUoIGN1cnJlbnRHcmFpbHNQcm9wLCAoTWFueVRvT25lKSB2YWx1ZSwgbWFwcGluZ3MgKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBjdXJyZW50R3JhaWxzUHJvcC5pc09uZVRvT25lKCkpIHsJCQkJCi0JCQkJLy92YWx1ZSA9IG5ldyBPbmVUb09uZSggdGFibGUsIHBlcnNpc3RlbnRDbGFzcyApOwotCQkJCS8vYmluZE9uZVRvT25lKCBjdXJyZW50R3JhaWxzUHJvcCwgKE9uZVRvT25lKXZhbHVlLCBtYXBwaW5ncyApOwotCQkJCXZhbHVlID0gbmV3IE1hbnlUb09uZSggdGFibGUgKTsKLQkJCQliaW5kTWFueVRvT25lKCBjdXJyZW50R3JhaWxzUHJvcCwgKE1hbnlUb09uZSkgdmFsdWUsIG1hcHBpbmdzICk7Ci0JCQl9CQotCQkJZWxzZSB7Ci0JCQkJdmFsdWUgPSBuZXcgU2ltcGxlVmFsdWUoIHRhYmxlICk7Ci0JCQkJYmluZFNpbXBsZVZhbHVlKCBwZXJzaXN0YW50UHJvcGVydGllc1tpXSwgKFNpbXBsZVZhbHVlKSB2YWx1ZSwgbWFwcGluZ3MgKTsKLQkJCX0KLQotCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gY3JlYXRlUHJvcGVydHkoIHZhbHVlLCBwZXJzaXN0ZW50Q2xhc3MsIHBlcnNpc3RhbnRQcm9wZXJ0aWVzW2ldLCBtYXBwaW5ncyApOwkJCQotCQkJCXBlcnNpc3RlbnRDbGFzcy5hZGRQcm9wZXJ0eSggcHJvcGVydHkgKTsJCQkJCQkKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBlcnNpc3RhbnQgY2xhc3MgcHJvcGVydHkgYmFzZWQgb24gdGhlIEdyYWlsRG9tYWluQ2xhc3NQcm9wZXJ0eSBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwZXJzaXN0ZW50Q2xhc3MKLQkgKiBAcGFyYW0gbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eShWYWx1ZSB2YWx1ZSwgUGVyc2lzdGVudENsYXNzIHBlcnNpc3RlbnRDbGFzcywgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBncmFpbHNQcm9wZXJ0eSwgTWFwcGluZ3MgbWFwcGluZ3MpIHsKLQkJLy8gc2V0IHR5cGUKLQkJdmFsdWUuc2V0VHlwZVVzaW5nUmVmbGVjdGlvbiggcGVyc2lzdGVudENsYXNzLmdldENsYXNzTmFtZSgpLCBncmFpbHNQcm9wZXJ0eS5nZXROYW1lKCkgKTsKLQkJCi0JCS8vIGlmIGl0IGlzIGEgTWFueVRvT25lIG9yIE9uZVRvT25lIHJlbGF0aW9uc2hpcAotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgVG9PbmUgKSB7Ci0JCQlUb09uZSB0b09uZSA9IChUb09uZSkgdmFsdWU7Ci0JCQlTdHJpbmcgcHJvcGVydHlSZWYgPSB0b09uZS5nZXRSZWZlcmVuY2VkUHJvcGVydHlOYW1lKCk7Ci0JCQlpZiAoIHByb3BlcnR5UmVmICE9IG51bGwgKSB7Ci0JCQkJLy8gVE9ETzogSG1tIHRoaXMgbWV0aG9kIGhhcyBwYWNrYWdlIHZpc2liaWxpdHkuIFdoeT8KLQkJCQkKLQkJCQkvL21hcHBpbmdzLmFkZFVuaXF1ZVByb3BlcnR5UmVmZXJlbmNlKCB0b09uZS5nZXRSZWZlcmVuY2VkRW50aXR5TmFtZSgpLCBwcm9wZXJ0eVJlZiApOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoIHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbiApIHsKLQkJCS8vQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pdmFsdWU7Ci0JCQkvL1N0cmluZyBwcm9wZXJ0eVJlZiA9IGNvbGxlY3Rpb24uZ2V0UmVmZXJlbmNlZFByb3BlcnR5TmFtZSgpOwotCQl9Ci0JCQotCQlpZih2YWx1ZS5nZXRUYWJsZSgpICE9IG51bGwpCi0JCQl2YWx1ZS5jcmVhdGVGb3JlaWduS2V5KCk7Ci0JCQotCQlQcm9wZXJ0eSBwcm9wID0gbmV3IFByb3BlcnR5KCk7Ci0JCXByb3Auc2V0VmFsdWUoIHZhbHVlICk7Ci0JCQotCQliaW5kUHJvcGVydHkoIGdyYWlsc1Byb3BlcnR5LCBwcm9wLCBtYXBwaW5ncyApOwotCQlyZXR1cm4gcHJvcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcGFyYW0gb25lVG9PbmUKLQkgKiBAcGFyYW0gbWFwcGluZ3MKLQkgKi8KLS8qCXByaXZhdGUgc3RhdGljIHZvaWQgYmluZE9uZVRvT25lKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHksIE9uZVRvT25lIG9uZVRvT25lLCBNYXBwaW5ncyBtYXBwaW5ncykgewotCQkKLQkJLy8gYmluZCB2YWx1ZQotCQliaW5kU2ltcGxlVmFsdWUocHJvcGVydHksIG9uZVRvT25lLCBtYXBwaW5ncyApOwotCQkvLyBzZXQgZm9yZWlnbiBrZXkgdHlwZQotCQlvbmVUb09uZS5zZXRGb3JlaWduS2V5VHlwZSggRm9yZWlnbktleURpcmVjdGlvbi5GT1JFSUdOX0tFWV9UT19QQVJFTlQgKTsKLQkJCi0JCW9uZVRvT25lLnNldEZvcmVpZ25LZXlOYW1lKCBwcm9wZXJ0eS5nZXRGaWVsZE5hbWUoKSArIEZPUkVJR05fS0VZX1NVRkZJWCApOwotCQkKLQkJLy8gVE9ETyBjb25maWd1cmUgZmV0Y2ggc2V0dGluZ3MKLQkJb25lVG9PbmUuc2V0RmV0Y2hNb2RlKCBGZXRjaE1vZGUuREVGQVVMVCApOwotCQkvLyBUT0RPIGNvbmZpZ3VyZSBsYXp5IGxvYWRpbmcKLQkJb25lVG9PbmUuc2V0TGF6eSh0cnVlKTsKLQkJCQkKLQkJb25lVG9PbmUuc2V0UHJvcGVydHlOYW1lKCBwcm9wZXJ0eS5nZXROYW1lKCkgKTsKLQkJb25lVG9PbmUuc2V0UmVmZXJlbmNlZEVudGl0eU5hbWUoIHByb3BlcnR5LmdldFR5cGUoKS5nZXROYW1lKCkgKTsKLQkJCi0JCQotCX0qLwotCi0JLyoqCi0JICogQHBhcmFtIGN1cnJlbnRHcmFpbHNQcm9wCi0JICogQHBhcmFtIG9uZQotCSAqIEBwYXJhbSBtYXBwaW5ncwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYmluZE9uZVRvTWFueShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGN1cnJlbnRHcmFpbHNQcm9wLCBPbmVUb01hbnkgb25lLCBNYXBwaW5ncyBtYXBwaW5ncykgewotCQlvbmUuc2V0UmVmZXJlbmNlZEVudGl0eU5hbWUoIGN1cnJlbnRHcmFpbHNQcm9wLmdldFJlZmVyZW5jZWRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCkgKTsJCQotCX0KLQotCS8qKgotCSAqIEJpbmRzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIHRvIHRoZSAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcGFyYW0gbWFueVRvT25lCi0JICogQHBhcmFtIG1hcHBpbmdzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBiaW5kTWFueVRvT25lKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcGVydHksIE1hbnlUb09uZSBtYW55VG9PbmUsIE1hcHBpbmdzIG1hcHBpbmdzKSB7Ci0JCQotCQkvLyBUT0RPIGNvbmZpZ3VyZSBmZXRjaGluZwotCQltYW55VG9PbmUuc2V0RmV0Y2hNb2RlKEZldGNoTW9kZS5ERUZBVUxUKTsKLQkJLy8gVE9ETyBjb25maWd1cmUgbGF6eSBsb2FkaW5nCi0JCW1hbnlUb09uZS5zZXRMYXp5KHRydWUpOwotCQkKLQkJLy8gYmluZCBjb2x1bW4KLQkJYmluZFNpbXBsZVZhbHVlKHByb3BlcnR5LG1hbnlUb09uZSxtYXBwaW5ncyk7Ci0KLQkJLy8gc2V0IHJlZmVyZW5jZWQgZW50aXR5Ci0JCW1hbnlUb09uZS5zZXRSZWZlcmVuY2VkRW50aXR5TmFtZSggcHJvcGVydHkuZ2V0UmVmZXJlbmNlZFByb3BlcnR5VHlwZSgpLmdldE5hbWUoKSApOwotCQltYW55VG9PbmUuc2V0SWdub3JlTm90Rm91bmQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRWZXJzaW9uKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgdmVyc2lvbiwgUm9vdENsYXNzIGVudGl0eSwgTWFwcGluZ3MgbWFwcGluZ3MpIHsKLQkJCi0JCVNpbXBsZVZhbHVlIHZhbCA9IG5ldyBTaW1wbGVWYWx1ZSggZW50aXR5LmdldFRhYmxlKCkgKTsKLQkJYmluZFNpbXBsZVZhbHVlKCB2ZXJzaW9uLCB2YWwsIG1hcHBpbmdzKTsKLQkJCi0JCWlmICggIXZhbC5pc1R5cGVTcGVjaWZpZWQoKSApIHsKLQkJCXZhbC5zZXRUeXBlTmFtZSggInZlcnNpb24iLmVxdWFscyggdmVyc2lvbi5nZXROYW1lKCkgKSA/ICJpbnRlZ2VyIiA6ICJ0aW1lc3RhbXAiICk7Ci0JCX0KLQkJUHJvcGVydHkgcHJvcCA9IG5ldyBQcm9wZXJ0eSgpOwotCQlwcm9wLnNldFZhbHVlKCB2YWwgKTsKLQkJCi0JCWJpbmRQcm9wZXJ0eSggdmVyc2lvbiwgcHJvcCwgbWFwcGluZ3MgKTsKLQkJdmFsLnNldE51bGxWYWx1ZSggInVuZGVmaW5lZCIgKTsKLQkJZW50aXR5LnNldFZlcnNpb24oIHByb3AgKTsKLQkJZW50aXR5LmFkZFByb3BlcnR5KCBwcm9wICk7CQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqIEBwYXJhbSBlbnRpdHkKLQkgKiBAcGFyYW0gbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRTaW1wbGVJZChHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGlkZW50aWZpZXIsIFJvb3RDbGFzcyBlbnRpdHksIE1hcHBpbmdzIG1hcHBpbmdzKSB7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIGlkIHZhbHVlCi0JCVNpbXBsZVZhbHVlIGlkID0gbmV3IFNpbXBsZVZhbHVlKGVudGl0eS5nZXRUYWJsZSgpKTsKLQkJLy8gc2V0IGlkZW50aWZpZXIgb24gZW50aXR5Ci0JCWVudGl0eS5zZXRJZGVudGlmaWVyKCBpZCApOwotCQkvLyBjb25maWd1cmUgZ2VuZXJhdG9yIHN0cmF0ZWd5Ci0JCWlkLnNldElkZW50aWZpZXJHZW5lcmF0b3JTdHJhdGVneSggIm5hdGl2ZSIgKTsKLQkJCi0JCVByb3BlcnRpZXMgcGFyYW1zID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQlpZiAoIG1hcHBpbmdzLmdldFNjaGVtYU5hbWUoKSAhPSBudWxsICkgewotCQkJcGFyYW1zLnNldFByb3BlcnR5KCBQZXJzaXN0ZW50SWRlbnRpZmllckdlbmVyYXRvci5TQ0hFTUEsIG1hcHBpbmdzLmdldFNjaGVtYU5hbWUoKSApOwotCQl9Ci0JCWlmICggbWFwcGluZ3MuZ2V0Q2F0YWxvZ05hbWUoKSAhPSBudWxsICkgewotCQkJcGFyYW1zLnNldFByb3BlcnR5KCBQZXJzaXN0ZW50SWRlbnRpZmllckdlbmVyYXRvci5DQVRBTE9HLCBtYXBwaW5ncy5nZXRDYXRhbG9nTmFtZSgpICk7Ci0JCX0KLQkJaWQuc2V0SWRlbnRpZmllckdlbmVyYXRvclByb3BlcnRpZXMocGFyYW1zKTsKLQkJCi0JCS8vIGJpbmQgdmFsdWUKLQkJYmluZFNpbXBsZVZhbHVlKGlkZW50aWZpZXIsIGlkLCBtYXBwaW5ncyApOwotCi0JCS8vIGNyZWF0ZSBwcm9wZXJ0eQotCQlQcm9wZXJ0eSBwcm9wID0gbmV3IFByb3BlcnR5KCk7Ci0JCXByb3Auc2V0VmFsdWUoaWQpOwotCQkKLQkJLy8gYmluZCBwcm9wZXJ0eQotCQliaW5kUHJvcGVydHkoIGlkZW50aWZpZXIsIHByb3AsIG1hcHBpbmdzICk7Ci0JCS8vIHNldCBpZGVudGlmaWVyIHByb3BlcnR5Ci0JCWVudGl0eS5zZXRJZGVudGlmaWVyUHJvcGVydHkoIHByb3AgKTsKLQkJCi0JCWlkLmdldFRhYmxlKCkuc2V0SWRlbnRpZmllclZhbHVlKCBpZCApOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGdyYWlsc1Byb3BlcnR5Ci0JICogQHBhcmFtIHByb3AKLQkgKiBAcGFyYW0gbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRQcm9wZXJ0eShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGdyYWlsc1Byb3BlcnR5LCBQcm9wZXJ0eSBwcm9wLCBNYXBwaW5ncyBtYXBwaW5ncykgewotCQkvLyBzZXQgdGhlIHByb3BlcnR5IG5hbWUKLQkJcHJvcC5zZXROYW1lKCBncmFpbHNQcm9wZXJ0eS5nZXROYW1lKCkgKTsKLQkJCi0JCXByb3Auc2V0SW5zZXJ0YWJsZSh0cnVlKTsKLQkJcHJvcC5zZXRVcGRhdGVhYmxlKHRydWUpOwotCQlwcm9wLnNldFByb3BlcnR5QWNjZXNzb3JOYW1lKCBtYXBwaW5ncy5nZXREZWZhdWx0QWNjZXNzKCkgKTsKLQkJcHJvcC5zZXRPcHRpb25hbCggZ3JhaWxzUHJvcGVydHkuaXNPcHRpb25hbCgpICk7Ci0JCS8vIHNldCB0byBjYXNjYWRlIGFsbCBmb3IgdGhlIG1vbWVudAotCQlpZihncmFpbHNQcm9wZXJ0eS5pc0Fzc29jaWF0aW9uKCkpIHsKLSAgICAgICAgICAgIGlmKGdyYWlsc1Byb3BlcnR5LmlzT25lVG9NYW55KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9wLnNldENhc2NhZGUoImFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihncmFpbHNQcm9wZXJ0eS5pc01hbnlUb09uZSgpIHx8IGdyYWlsc1Byb3BlcnR5LmlzT25lVG9PbmUoKSkgewotICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gZ3JhaWxzUHJvcGVydHkuZ2V0RG9tYWluQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZihkb21haW5DbGFzcy5pc093bmluZ0NsYXNzKGdyYWlsc1Byb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5zZXRDYXNjYWRlKCJzYXZlLXVwZGF0ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBvdGhlclNpZGUgPSBncmFpbHNQcm9wZXJ0eS5nZXRPdGhlclNpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYob3RoZXJTaWRlICE9IG51bGwgJiYgb3RoZXJTaWRlLmlzT25lVG9NYW55KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3Auc2V0Q2FzY2FkZSgic2F2ZS11cGRhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3Auc2V0Q2FzY2FkZSgiYWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIExPRy50cmFjZSggIltHcmFpbHNEb21haW5CaW5kZXJdIFNldCBjYXNjYWRpbmcgc3RyYXRlZ3kgb24gcHJvcGVydHkgWyIrZ3JhaWxzUHJvcGVydHkuZ2V0TmFtZSgpKyJdIHRvIFsiK3Byb3AuZ2V0Q2FzY2FkZSgpKyJdIiApOwotICAgICAgICAvLyBsYXp5IHRvIHRydWUKLQkJcHJvcC5zZXRMYXp5KHRydWUpOwotCQkKLQl9Ci0KLQkvKioKLXcJICogQmluZHMgYSBzaW1wbGUgdmFsdWUgdG8gdGhlIEhpYmVybmF0ZSBtZXRhbW9kZWwuIEEgc2ltcGxlIHZhbHVlIGlzIAotCSAqIGFueSB0eXBlIHdpdGhpbiB0aGUgSGliZXJuYXRlIHR5cGUgc3lzdGVtCi0JICogCi0JICogQHBhcmFtIGdyYWlsc1Byb3AgVGhlIGdyYWlscyBkb21haW4gY2xhc3MgcHJvcGVydHkKLQkgKiBAcGFyYW0gc2ltcGxlVmFsdWUgVGhlIHNpbXBsZSB2YWx1ZSB0byBiaW5kCi0JICogQHBhcmFtIG1hcHBpbmdzIFRoZSBIaWJlcm5hdGUgbWFwcGluZ3MgaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRTaW1wbGVWYWx1ZShHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGdyYWlsc1Byb3AsIFNpbXBsZVZhbHVlIHNpbXBsZVZhbHVlLE1hcHBpbmdzIG1hcHBpbmdzKSB7Ci0JCS8vIHNldCB0eXBlCi0JCXNpbXBsZVZhbHVlLnNldFR5cGVOYW1lKGdyYWlsc1Byb3AuZ2V0VHlwZSgpLmdldE5hbWUoKSk7Ci0JCVRhYmxlIHRhYmxlID0gc2ltcGxlVmFsdWUuZ2V0VGFibGUoKTsKLQkJQ29sdW1uIGNvbHVtbiA9IG5ldyBDb2x1bW4oKTsKLQkJaWYoZ3JhaWxzUHJvcC5pc01hbnlUb09uZSgpKQotCQkJY29sdW1uLnNldE51bGxhYmxlKGZhbHNlKTsKLQkJCi0JCWNvbHVtbi5zZXRWYWx1ZShzaW1wbGVWYWx1ZSk7Ci0JCWJpbmRDb2x1bW4oZ3JhaWxzUHJvcCwgY29sdW1uKTsKLQkJCQkJCQkJCi0JCWlmKHRhYmxlICE9IG51bGwpIHRhYmxlLmFkZENvbHVtbihjb2x1bW4pOwotCQkKLQkJc2ltcGxlVmFsdWUuYWRkQ29sdW1uKGNvbHVtbik7CQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBCaW5kcyBhIENvbHVtbiBpbnN0YW5jZSB0byB0aGUgSGliZXJuYXRlIG1ldGEgbW9kZWwKLQkgKiBAcGFyYW0gZ3JhaWxzUHJvcCBUaGUgR3JhaWxzIGRvbWFpbiBjbGFzcyBwcm9wZXJ0eQotCSAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiaW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBiaW5kQ29sdW1uKEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZ3JhaWxzUHJvcCwgQ29sdW1uIGNvbHVtbikgewkJCQkJCQotCQlpZihncmFpbHNQcm9wLmlzQXNzb2NpYXRpb24oKSkgewotCQkJaWYoZ3JhaWxzUHJvcC5pc09uZVRvTWFueSgpKSB7CQkJCQkJCQotCQkJCWNvbHVtbi5zZXROYW1lKCBncmFpbHNQcm9wLmdldERvbWFpbkNsYXNzKCkuZ2V0VGFibGVOYW1lKCkgKyBGT1JFSUdOX0tFWV9TVUZGSVggKTsKLQkJCX0KLQkJCWVsc2UgaWYoZ3JhaWxzUHJvcC5pc01hbnlUb09uZSgpKSB7CQkJCQkJCQotCQkJCWNvbHVtbi5zZXROYW1lKCBncmFpbHNQcm9wLmdldFJlZmVyZW5jZWREb21haW5DbGFzcygpLmdldFRhYmxlTmFtZSgpICsgRk9SRUlHTl9LRVlfU1VGRklYICk7Ci0JCQl9CQkJCi0JCQllbHNlIHsKLQkJCQljb2x1bW4uc2V0TmFtZSggZ3JhaWxzUHJvcC5nZXRGaWVsZE5hbWUoKSArIEZPUkVJR05fS0VZX1NVRkZJWCApOwotCQkJfQkJCQotCQkJY29sdW1uLnNldE51bGxhYmxlKHRydWUpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQljb2x1bW4uc2V0TnVsbGFibGUoZ3JhaWxzUHJvcC5pc09wdGlvbmFsKCkpOwotCQkJY29sdW1uLnNldE5hbWUoZ3JhaWxzUHJvcC5nZXRGaWVsZE5hbWUoKSk7Ci0JCX0KLQkJaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIAotCQkJTE9HLnRyYWNlKCJbR3JhaWxzRG9tYWluQmluZGVyXSBib3VuZCBwcm9wZXJ0eSBbIiArIGdyYWlsc1Byb3AgKyAiXSB0byBjb2x1bW4gbmFtZSBbIitjb2x1bW4uZ2V0TmFtZSgpKyJdIik7CQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2NmZy9HcmFpbHNEb21haW5Db25maWd1cmF0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlODc0ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZzsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA0LUF1Zy0yMDA1Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBHcmFpbHNEb21haW5Db25maWd1cmF0aW9uIHsKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG9tYWluIGNsYXNzIHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGRvbWFpbkNsYXNzCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24gYWRkRG9tYWluQ2xhc3MoCi0gICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBncmFpbHMgYXBwbGljYXRpb24gaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gVGhlIGdyYWlscyBhcHBsaWNhdGlvbiB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEdyYWlsc0FwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZXMgR3JhaWxzIGR5bmFtaWMgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBzZXNzaW9uIGZhY3RvcnkKLSAgICAgICogQHBhcmFtIHNmCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgY29uZmlndXJlRHluYW1pY01ldGhvZHMoU2Vzc2lvbkZhY3Rvcnkgc2YpOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBzaG91bGQgY29uZmlndXJlIGR5bmFtaWMgbWV0aG9kcyAoZGVmYXVsdHMgdG8gdHJ1ZSkKLSAgICAgKiBAcGFyYW0gc2hvdWxkQ29uZmlndXJlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29uZmlndXJlRHluYW1pY01ldGhvZHMoYm9vbGVhbiBzaG91bGRDb25maWd1cmUpOwotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb25VdGlsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTg5MTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2NmZy9HcmFpbHNEb21haW5Db25maWd1cmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMubWV0YWNsYXNzLkRvbWFpbkNsYXNzTWV0aG9kczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLkdyYWlsc0hpYmVybmF0ZURvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuRW50aXR5TW9kZTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUubWV0YWRhdGEuQ2xhc3NNZXRhZGF0YTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb25maWd1cmluZyB0aGUgR3JhaWxzIEhpYmVybmF0ZSBpbnRlZ3JhdGlvbgotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE4LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNEb21haW5Db25maWd1cmF0aW9uVXRpbCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb25VdGlsLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZXMgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkb21haW4gY2xhc3NlcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBhbGwgbG9hZGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb21haW5DbGFzc2VzCi0gICAgICogQHBhcmFtIGRvbWFpbk1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVEb21haW5DbGFzc1JlbGF0aW9uc2hpcHMoR3JhaWxzRG9tYWluQ2xhc3NbXSBkb21haW5DbGFzc2VzLCBNYXAgZG9tYWluTWFwKSB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb21haW5DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gcHJvcHMgPSBkb21haW5DbGFzc2VzW2ldLmdldFBlcnNpc3RhbnRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZihwcm9wc1tqXS5pc0Fzc29jaWF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBwcm9wID0gcHJvcHNbal07Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIHJlZmVyZW5jZWRHcmFpbHNEb21haW5DbGFzcyA9IChHcmFpbHNEb21haW5DbGFzcylkb21haW5NYXAuZ2V0KCBwcm9wc1tqXS5nZXRSZWZlcmVuY2VkUHJvcGVydHlUeXBlKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3Auc2V0UmVmZXJlbmNlZERvbWFpbkNsYXNzKHJlZmVyZW5jZWRHcmFpbHNEb21haW5DbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9tYWluQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIHByb3BzID0gZG9tYWluQ2xhc3Nlc1tpXS5nZXRQZXJzaXN0YW50UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYocHJvcHNbal0uaXNBc3NvY2lhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcCA9IHByb3BzW2pdOwotICAgICAgICAgICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gcmVmZXJlbmNlZFByb3BlcnRpZXMgPSAgcHJvcC5nZXRSZWZlcmVuY2VkRG9tYWluQ2xhc3MoKS5nZXRQZXJzaXN0YW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlZmVyZW5jZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihyZWZlcmVuY2VkUHJvcGVydGllc1trXS5nZXRSZWZlcmVuY2VkUHJvcGVydHlUeXBlKCkuZXF1YWxzKCBkb21haW5DbGFzc2VzW2ldLmdldENsYXp6KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5zZXRPdGhlclNpZGUocmVmZXJlbmNlZFByb3BlcnRpZXNba10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyBkeW5hbWljIG1ldGhvZHMgb24gYWxsIEhpYmVybmF0ZSBtYXBwZWQgZG9tYWluIGNsYXNzZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZiBUaGUgc2Vzc2lvbiBmYWN0b3J5IGluc3RhbmNlCi0gICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIFRoZSBncmFpbHMgYXBwbGljYXRpb24gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlRHluYW1pY01ldGhvZHMoU2Vzc2lvbkZhY3Rvcnkgc2YsIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY2xhc3NNZXRhRGF0YSA9IHNmLmdldEFsbENsYXNzTWV0YWRhdGEoKS52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xhc3NNZXRhRGF0YS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIENsYXNzTWV0YWRhdGEgY21kID0gKENsYXNzTWV0YWRhdGEpIGkubmV4dCgpOwotCi0gICAgICAgICAgICBDbGFzcyBwZXJzaXN0ZW50Q2xhc3MgPSBjbWQuZ2V0TWFwcGVkQ2xhc3MoRW50aXR5TW9kZS5QT0pPKTsKLQotICAgICAgICAgICAgLy8gaWYgaXRzIG5vdCBhIGdyYWlscyBkb21haW4gY2xhc3MgYW5kIG9uZSB3cml0dGVuIGluIGphdmEgdGhlbiBhZGQgaXQKLSAgICAgICAgICAgIC8vIHRvIGdyYWlscwotICAgICAgICAgICAgaWYoYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MocGVyc2lzdGVudENsYXNzLmdldE5hbWUoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi5hZGREb21haW5DbGFzcyhuZXcgR3JhaWxzSGliZXJuYXRlRG9tYWluQ2xhc3MocGVyc2lzdGVudENsYXNzLCBzZixjbWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRy5pbmZvKCJbR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbl0gUmVnaXN0ZXJpbmcgZHluYW1pYyBtZXRob2RzIG9uIGNsYXNzIFsiK3BlcnNpc3RlbnRDbGFzcysiXSIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBuZXcgRG9tYWluQ2xhc3NNZXRob2RzKGFwcGxpY2F0aW9uLHBlcnNpc3RlbnRDbGFzcyxzZixhcHBsaWNhdGlvbi5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJbR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbl0gSW50cm9zcGVjdGlvbiBleGNlcHRpb24gcmVnaXN0ZXJpbmcgZHluYW1pYyBtZXRob2RzIGZvciBbIitwZXJzaXN0ZW50Q2xhc3MrIl06IiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9leGNlcHRpb25zL0NvdWxkTm90RGV0ZXJtaW5lSGliZXJuYXRlRGlhbGVjdEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvQ291bGROb3REZXRlcm1pbmVIaWJlcm5hdGVEaWFsZWN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODc2MDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvQ291bGROb3REZXRlcm1pbmVIaWJlcm5hdGVEaWFsZWN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+VGhyb3duIHdoZW4gbm8gSGliZXJuYXRlIGRpYWxlY3QgY291bGQgYmUgZm91bmQgZm9yIGEgZGF0YWJhc2UgbmFtZSAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgQ291bGROb3REZXRlcm1pbmVIaWJlcm5hdGVEaWFsZWN0RXhjZXB0aW9uIGV4dGVuZHMKLQkJR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBDb3VsZE5vdERldGVybWluZUhpYmVybmF0ZURpYWxlY3RFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvdWxkTm90RGV0ZXJtaW5lSGliZXJuYXRlRGlhbGVjdEV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgQ291bGROb3REZXRlcm1pbmVIaWJlcm5hdGVEaWFsZWN0RXhjZXB0aW9uKFN0cmluZyBhcmcwLAotCQkJVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIENvdWxkTm90RGV0ZXJtaW5lSGliZXJuYXRlRGlhbGVjdEV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9leGNlcHRpb25zL0dyYWlsc0hpYmVybmF0ZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTJhNDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zLkdyYWlsc0V4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD5CYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgZXJyb3JzIHJlbGF0ZWQgdG8gSGliZXJuYXRlIGNvbmZpZ3VyYXRpb24gaW4gR3JhaWxzLiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgNiwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBHcmFpbHNIaWJlcm5hdGVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc0hpYmVybmF0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzSGliZXJuYXRlRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvR3JhaWxzUXVlcnlFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9leGNlcHRpb25zL0dyYWlsc1F1ZXJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDVhMGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2V4Y2VwdGlvbnMvR3JhaWxzUXVlcnlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuZXhjZXB0aW9uczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuR3JhaWxzRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPkJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBlcnJvcnMgcmVsYXRlZCB0byBEb21haW4gY2xhc3MgcXVlcmllcyBpbiBHcmFpbHMgCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE5vdiAyMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzUXVlcnlFeGNlcHRpb24gZXh0ZW5kcyBHcmFpbHNFeGNlcHRpb24gewotCi0JcHVibGljIEdyYWlsc1F1ZXJ5RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBHcmFpbHNRdWVyeUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIEdyYWlsc1F1ZXJ5RXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBHcmFpbHNRdWVyeUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvQWJzdHJhY3RDbGF1c2VkU3RhdGljUGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdENsYXVzZWRTdGF0aWNQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWZjYjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdENsYXVzZWRTdGF0aWNQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY3JpdGVyaW9uLkNyaXRlcmlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLmNyaXRlcmlvbi5FeHByZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMxLUF1Zy0yMDA1Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbGF1c2VkU3RhdGljUGVyc2lzdGVudE1ldGhvZCBleHRlbmRzCi0JCUFic3RyYWN0U3RhdGljUGVyc2lzdGVudE1ldGhvZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RDbGF1c2VkU3RhdGljUGVyc2lzdGVudE1ldGhvZC5jbGFzcyk7Ci0JLyoqCi0JICogCi0JICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEdyYWlsc01ldGhvZEV4cHJlc3Npb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOID0gIkxlc3NUaGFuIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFU1NfVEhBTl9PUl9FUVVBTCA9ICJMZXNzVGhhbk9yRXF1YWwiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOID0gIkdyZWF0ZXJUaGFuIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9ICJHcmVhdGVyVGhhbk9yRXF1YWwiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElLRSA9ICJMaWtlIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVFdFRU4gPSAiQmV0d2VlbiI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU19OT1RfTlVMTCA9ICJJc05vdE51bGwiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTlVMTCA9ICJJc051bGwiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UID0gIk5vdCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTCA9ICJFcXVhbCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUwgPSAiTm90RXF1YWwiOwotCQkKLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgcHJvcGVydHlOYW1lOwotCQlwcm90ZWN0ZWQgT2JqZWN0W10gYXJndW1lbnRzOwotCQlwcm90ZWN0ZWQgaW50IGFyZ3VtZW50c1JlcXVpcmVkOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWdhdGlvbjsKLQkJcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCQlwcm90ZWN0ZWQgQ2xhc3MgdGFyZ2V0Q2xhc3M7Ci0JCXByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0JCQotCQlHcmFpbHNNZXRob2RFeHByZXNzaW9uKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLENsYXNzIHRhcmdldENsYXNzLFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlLGludCBhcmd1bWVudHNSZXF1aXJlZCxib29sZWFuIG5lZ2F0aW9uKSB7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JCQl0aGlzLnRhcmdldENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0JCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmFyZ3VtZW50c1JlcXVpcmVkID0gYXJndW1lbnRzUmVxdWlyZWQ7Ci0JCQl0aGlzLm5lZ2F0aW9uID0gbmVnYXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiW0dyYWlsc01ldGhvZEV4cHJlc3Npb25dICIpOwotCQkJYnVmLmFwcGVuZChwcm9wZXJ0eU5hbWUpCi0JCQkJLmFwcGVuZCgiICIpCi0JCQkJLmFwcGVuZCh0eXBlKQotCQkJCS5hcHBlbmQoIiAiKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlidWYuYXBwZW5kKGFyZ3VtZW50c1tpXSk7Ci0JCQkJaWYoaSAhPSBhcmd1bWVudHMubGVuZ3RoKQotCQkJCQlidWYuYXBwZW5kKCIgYW5kICIpOwotCQkJfQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0KLQkJdm9pZCBzZXRBcmd1bWVudHMoT2JqZWN0W10gYXJncykKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkJaWYoYXJncy5sZW5ndGggIT0gYXJndW1lbnRzUmVxdWlyZWQpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWV0aG9kIGV4cHJlc3Npb24gJyIrdGhpcy50eXBlKyInIHJlcXVpcmVzICIgKyBhcmd1bWVudHNSZXF1aXJlZCArICIgYXJndW1lbnRzIik7Ci0JCQkKLQkJCUdyYWlsc0RvbWFpbkNsYXNzIGRjID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3ModGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLQkJCUdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcCA9IGRjLmdldFByb3BlcnR5QnlOYW1lKHByb3BlcnR5TmFtZSk7Ci0JCQkKLQkJCWlmKHByb3AgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiK3Byb3BlcnR5TmFtZSsiIGRvZXNuJ3QgZXhpc3QgZm9yIG1ldGhvZCBleHByZXNzaW9uICciK3RoaXMudHlwZSsiJyIpOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihhcmdzW2ldID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50ICIgKyBhcmdzWzBdICsgIiBjYW5ub3QgYmUgbnVsbCIpOwotCQkJCQotCQkJCWlmKCFwcm9wLmdldFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKCBhcmdzW2ldLmdldENsYXNzKCkgKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgIiArIGFyZ3NbMF0gKyAiIGRvZXMgbm90IG1hdGNoIHByb3BlcnR5ICciK3Byb3BlcnR5TmFtZSsiJyBvZiB0eXBlICIgKyBwcm9wLmdldFR5cGUoKSk7CQkJCQotCQkJfQotCi0JCQl0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7Ci0JCX0KLQkJCi0JCWFic3RyYWN0IENyaXRlcmlvbiBjcmVhdGVDcml0ZXJpb24oKTsKLQkJcHJvdGVjdGVkIENyaXRlcmlvbiBnZXRDcml0ZXJpb24oKSB7Ci0JCQlpZihhcmd1bWVudHMgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJhbWV0ZXJzIGFycmF5IG11c3QgYmUgc2V0IGJlZm9yZSByZXRyaWV2aW5nIENyaXRlcmlvbiIpOwotCQkJCi0JCQlpZihuZWdhdGlvbikgewotCQkJCXJldHVybiBFeHByZXNzaW9uLm5vdCggY3JlYXRlQ3JpdGVyaW9uKCkgKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBjcmVhdGVDcml0ZXJpb24oKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHN0YXRpYyBHcmFpbHNNZXRob2RFeHByZXNzaW9uIGNyZWF0ZShmaW5hbCBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbixDbGFzcyBjbGF6eiwgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKSB7Ci0JCQlpZihxdWVyeVBhcmFtZXRlci5lbmRzV2l0aCggTEVTU19USEFOX09SX0VRVUFMICkpIHsKLQkJCQlyZXR1cm4gbmV3IEdyYWlsc01ldGhvZEV4cHJlc3Npb24oCi0JCQkJCQlhcHBsaWNhdGlvbiwKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgTEVTU19USEFOX09SX0VRVUFMKSwKLQkJCQkJCUxFU1NfVEhBTl9PUl9FUVVBTCwgCi0JCQkJCQkxLAotCQkJCQkJaXNOZWdhdGlvbihxdWVyeVBhcmFtZXRlciwgTEVTU19USEFOX09SX0VRVUFMKSApIHsKLQkJCQkJQ3JpdGVyaW9uIGNyZWF0ZUNyaXRlcmlvbigpIHsKLQkJCQkJCXJldHVybiBFeHByZXNzaW9uLmxlKCB0aGlzLnByb3BlcnR5TmFtZSwgYXJndW1lbnRzWzBdICk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQkJCQotCQkJZWxzZSBpZihxdWVyeVBhcmFtZXRlci5lbmRzV2l0aCggTEVTU19USEFOICkpIHsKLQkJCQlyZXR1cm4gbmV3IEdyYWlsc01ldGhvZEV4cHJlc3Npb24oCi0JCQkJCQlhcHBsaWNhdGlvbiwgCi0JCQkJCQljbGF6eiwKLQkJCQkJCWNhbGNQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbWV0ZXIsIExFU1NfVEhBTiksCi0JCQkJCQlMRVNTX1RIQU4sIAotCQkJCQkJMSwgLy8gYXJndW1lbnQgY291bnQKLQkJCQkJCWlzTmVnYXRpb24ocXVlcnlQYXJhbWV0ZXIsIExFU1NfVEhBTikgKSB7Ci0JCQkJCUNyaXRlcmlvbiBjcmVhdGVDcml0ZXJpb24oKSB7Ci0JCQkJCQlyZXR1cm4gRXhwcmVzc2lvbi5sdCggdGhpcy5wcm9wZXJ0eU5hbWUsIGFyZ3VtZW50c1swXSApOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgaWYocXVlcnlQYXJhbWV0ZXIuZW5kc1dpdGgoIEdSRUFURVJfVEhBTl9PUl9FUVVBTCApKSB7Ci0JCQkJcmV0dXJuIG5ldyBHcmFpbHNNZXRob2RFeHByZXNzaW9uKAotCQkJCQkJYXBwbGljYXRpb24sIAotCQkJCQkJY2xhenosCi0JCQkJCQljYWxjUHJvcGVydHlOYW1lKHF1ZXJ5UGFyYW1ldGVyLCBHUkVBVEVSX1RIQU5fT1JfRVFVQUwpLAotCQkJCQkJR1JFQVRFUl9USEFOX09SX0VRVUFMLCAKLQkJCQkJCTEsCi0JCQkJCQlpc05lZ2F0aW9uKHF1ZXJ5UGFyYW1ldGVyLCBHUkVBVEVSX1RIQU5fT1JfRVFVQUwpICkgewotCQkJCQlDcml0ZXJpb24gY3JlYXRlQ3JpdGVyaW9uKCkgewotCQkJCQkJcmV0dXJuIEV4cHJlc3Npb24uZ2UoIHRoaXMucHJvcGVydHlOYW1lLCBhcmd1bWVudHNbMF0gKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9CQkJCi0JCQllbHNlIGlmKHF1ZXJ5UGFyYW1ldGVyLmVuZHNXaXRoKCBHUkVBVEVSX1RIQU4gKSkgewotCQkJCXJldHVybiBuZXcgR3JhaWxzTWV0aG9kRXhwcmVzc2lvbigKLQkJCQkJCWFwcGxpY2F0aW9uLCAKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgR1JFQVRFUl9USEFOKSwKLQkJCQkJCUdSRUFURVJfVEhBTiwKLQkJCQkJCTEsIAotCQkJCQkJaXNOZWdhdGlvbihxdWVyeVBhcmFtZXRlciwgR1JFQVRFUl9USEFOKSApIHsKLQkJCQkJQ3JpdGVyaW9uIGNyZWF0ZUNyaXRlcmlvbigpIHsKLQkJCQkJCXJldHVybiBFeHByZXNzaW9uLmd0KCB0aGlzLnByb3BlcnR5TmFtZSwgYXJndW1lbnRzWzBdICk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0JCQllbHNlIGlmKHF1ZXJ5UGFyYW1ldGVyLmVuZHNXaXRoKCBMSUtFICkpIHsKLQkJCQlyZXR1cm4gbmV3IEdyYWlsc01ldGhvZEV4cHJlc3Npb24oCi0JCQkJCQlhcHBsaWNhdGlvbiwKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgTElLRSksCi0JCQkJCQlMSUtFLAotCQkJCQkJMSwgCi0JCQkJCQlpc05lZ2F0aW9uKHF1ZXJ5UGFyYW1ldGVyLCBMSUtFKSApIHsKLQkJCQkJQ3JpdGVyaW9uIGNyZWF0ZUNyaXRlcmlvbigpIHsKLQkJCQkJCXJldHVybiBFeHByZXNzaW9uLmxpa2UoIHRoaXMucHJvcGVydHlOYW1lLCBhcmd1bWVudHNbMF0gKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCX0JCQkKLQkJCWVsc2UgaWYocXVlcnlQYXJhbWV0ZXIuZW5kc1dpdGgoIElTX05PVF9OVUxMICkpIHsKLQkJCQlyZXR1cm4gbmV3IEdyYWlsc01ldGhvZEV4cHJlc3Npb24oCi0JCQkJCQlhcHBsaWNhdGlvbiwKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgSVNfTk9UX05VTEwpLAotCQkJCQkJSVNfTk9UX05VTEwsCi0JCQkJCQkwLCAKLQkJCQkJCWlzTmVnYXRpb24ocXVlcnlQYXJhbWV0ZXIsIElTX05PVF9OVUxMKSApIHsKLQkJCQkJQ3JpdGVyaW9uIGNyZWF0ZUNyaXRlcmlvbigpIHsKLQkJCQkJCQlyZXR1cm4gRXhwcmVzc2lvbi5pc05vdE51bGwoIHRoaXMucHJvcGVydHlOYW1lICk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgaWYocXVlcnlQYXJhbWV0ZXIuZW5kc1dpdGgoIElTX05VTEwgKSkgewotCQkJCXJldHVybiBuZXcgR3JhaWxzTWV0aG9kRXhwcmVzc2lvbigKLQkJCQkJCWFwcGxpY2F0aW9uLCAKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgSVNfTlVMTCksCi0JCQkJCQlJU19OVUxMLAotCQkJCQkJMCwgCi0JCQkJCQlpc05lZ2F0aW9uKHF1ZXJ5UGFyYW1ldGVyLCBJU19OVUxMKSApIHsKLQkJCQkJQ3JpdGVyaW9uIGNyZWF0ZUNyaXRlcmlvbigpIHsKLQkJCQkJCXJldHVybiBFeHByZXNzaW9uLmlzTnVsbCggdGhpcy5wcm9wZXJ0eU5hbWUgKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgaWYocXVlcnlQYXJhbWV0ZXIuZW5kc1dpdGgoIEJFVFdFRU4gKSkgewotCQkJCQkKLQkJCQlyZXR1cm4gbmV3IEdyYWlsc01ldGhvZEV4cHJlc3Npb24oIAotCQkJCQkJYXBwbGljYXRpb24sCi0JCQkJCQljbGF6eiwKLQkJCQkJCWNhbGNQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbWV0ZXIsIEJFVFdFRU4pLAotCQkJCQkJQkVUV0VFTiwgCi0JCQkJCQkyLAotCQkJCQkJaXNOZWdhdGlvbihxdWVyeVBhcmFtZXRlciwgQkVUV0VFTikgKSB7Ci0JCQkJCUNyaXRlcmlvbiBjcmVhdGVDcml0ZXJpb24oKSB7Ci0JCQkJCQlyZXR1cm4gRXhwcmVzc2lvbi5iZXR3ZWVuKCB0aGlzLnByb3BlcnR5TmFtZSx0aGlzLmFyZ3VtZW50c1swXSwgdGhpcy5hcmd1bWVudHNbMV0gKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgaWYocXVlcnlQYXJhbWV0ZXIuZW5kc1dpdGgoIE5PVF9FUVVBTCApKSB7Ci0JCQkJcmV0dXJuIG5ldyBHcmFpbHNNZXRob2RFeHByZXNzaW9uKAotCQkJCQkJYXBwbGljYXRpb24sIAotCQkJCQkJY2xhenosCi0JCQkJCQljYWxjUHJvcGVydHlOYW1lKHF1ZXJ5UGFyYW1ldGVyLCBOT1RfRVFVQUwpLAotCQkJCQkJTk9UX0VRVUFMLCAKLQkJCQkJCTEsCi0JCQkJCQlpc05lZ2F0aW9uKHF1ZXJ5UGFyYW1ldGVyLCBOT1RfRVFVQUwpICkgewotCQkJCQlDcml0ZXJpb24gY3JlYXRlQ3JpdGVyaW9uKCkgewotCQkJCQkJcmV0dXJuIEV4cHJlc3Npb24ubmUoIHRoaXMucHJvcGVydHlOYW1lLHRoaXMuYXJndW1lbnRzWzBdKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9OwkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCQotCQkJCXJldHVybiBuZXcgR3JhaWxzTWV0aG9kRXhwcmVzc2lvbigKLQkJCQkJCWFwcGxpY2F0aW9uLCAKLQkJCQkJCWNsYXp6LAotCQkJCQkJY2FsY1Byb3BlcnR5TmFtZShxdWVyeVBhcmFtZXRlciwgbnVsbCksCi0JCQkJCQlFUVVBTCwgCi0JCQkJCQkxLAotCQkJCQkJaXNOZWdhdGlvbihxdWVyeVBhcmFtZXRlciwgRVFVQUwpICkgewotCQkJCQlDcml0ZXJpb24gY3JlYXRlQ3JpdGVyaW9uKCkgewotCQkJCQkJcmV0dXJuIEV4cHJlc3Npb24uZXEoIHRoaXMucHJvcGVydHlOYW1lLHRoaXMuYXJndW1lbnRzWzBdKTsKLQkJCQkJfQotCQkJCX07CQkJCi0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05lZ2F0aW9uKFN0cmluZyBxdWVyeVBhcmFtZXRlciwgU3RyaW5nIGNsYXVzZSkgewotCQkJU3RyaW5nIHByb3BOYW1lOwotCQkJaWYoY2xhdXNlICE9IG51bGwgJiYgIWNsYXVzZS5lcXVhbHMoIEVRVUFMICkpIHsKLQkJCQlpbnQgaSA9IHF1ZXJ5UGFyYW1ldGVyLmluZGV4T2YoY2xhdXNlKTsKLQkJCQlwcm9wTmFtZSA9IHF1ZXJ5UGFyYW1ldGVyLnN1YnN0cmluZygwLGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJvcE5hbWUgPSBxdWVyeVBhcmFtZXRlcjsKLQkJCX0KLQkJCWlmKHByb3BOYW1lLmVuZHNXaXRoKE5PVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY1Byb3BlcnR5TmFtZShTdHJpbmcgcXVlcnlQYXJhbWV0ZXIsIFN0cmluZyBjbGF1c2UpIHsKLQkJCVN0cmluZyBwcm9wTmFtZTsKLQkJCWlmKGNsYXVzZSAhPSBudWxsICYmICFjbGF1c2UuZXF1YWxzKCBFUVVBTCApKSB7Ci0JCQkJaW50IGkgPSBxdWVyeVBhcmFtZXRlci5pbmRleE9mKGNsYXVzZSk7Ci0JCQkJcHJvcE5hbWUgPSBxdWVyeVBhcmFtZXRlci5zdWJzdHJpbmcoMCxpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByb3BOYW1lID0gcXVlcnlQYXJhbWV0ZXI7Ci0JCQl9Ci0JCQlpZihwcm9wTmFtZS5lbmRzV2l0aChOT1QpKSB7Ci0JCQkJaW50IGkgPSBwcm9wTmFtZS5sYXN0SW5kZXhPZihOT1QpOwotCQkJCXByb3BOYW1lID0gcHJvcE5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQkJfQotCQkJcmV0dXJuIHByb3BOYW1lLnN1YnN0cmluZygwLDEpLnRvTG93ZXJDYXNlKCkKLQkJCQkrIHByb3BOYW1lLnN1YnN0cmluZygxKTsJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIG9wZXJhdG9yczsKLQlwcml2YXRlIFBhdHRlcm5bXSBvcGVyYXRvclBhdHRlcm5zOwotCXByb3RlY3RlZCBTdHJpbmcgb3BlcmF0b3JJblVzZTsKLQlwcm90ZWN0ZWQgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0JCi0JcHVibGljIEFic3RyYWN0Q2xhdXNlZFN0YXRpY1BlcnNpc3RlbnRNZXRob2QoR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24sIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmdbXSBvcGVyYXRvcnMpIHsKLQkJc3VwZXIoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyLCBwYXR0ZXJuKTsKLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQl0aGlzLm9wZXJhdG9ycyA9IG9wZXJhdG9yczsKLQkJdGhpcy5vcGVyYXRvclBhdHRlcm5zID0gbmV3IFBhdHRlcm5bdGhpcy5vcGVyYXRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMub3BlcmF0b3JQYXR0ZXJuc1tpXSA9IFBhdHRlcm4uY29tcGlsZSgiKFxcdyspKCIrdGhpcy5vcGVyYXRvcnNbaV0rIikoXFxwe1VwcGVyfSkoXFx3KykiKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzLkFic3RyYWN0U3RhdGljUGVyc2lzdGVudE1ldGhvZCNkb0ludm9rZUludGVybmFsKGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChmaW5hbCBDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJTGlzdCBleHByZXNzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWF0Y2hlciBtYXRjaCA9IHN1cGVyLmdldFBhdHRlcm4oKS5tYXRjaGVyKCBtZXRob2ROYW1lICk7Ci0JCS8vIGZpbmQgbWF0Y2gKLQkJbWF0Y2guZmluZCgpOwotCQkKLQkJU3RyaW5nW10gcXVlcnlQYXJhbWV0ZXJzID0gbnVsbDsKLQkJaW50IHRvdGFsUmVxdWlyZWRBcmd1bWVudHMgPSAwOwotCQkvLyBnZXQgdGhlIHNlcXVlbmNlIGNsYXVzZXMKLQkJU3RyaW5nIHF1ZXJ5U2VxdWVuY2UgPSBtYXRjaC5ncm91cCgyKTsKLQkJLy8gaWYgaXQgY29udGFpbnMgb3BlcmF0b3IgYW5kIHNwbGl0Ci0JCWJvb2xlYW4gY29udGFpbnNPcGVyYXRvciA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJTWF0Y2hlciBjdXJyZW50TWF0Y2hlciA9IG9wZXJhdG9yUGF0dGVybnNbaV0ubWF0Y2hlciggcXVlcnlTZXF1ZW5jZSApOwotCQkJaWYoY3VycmVudE1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJY29udGFpbnNPcGVyYXRvciA9IHRydWU7Ci0JCQkJb3BlcmF0b3JJblVzZSA9IHRoaXMub3BlcmF0b3JzW2ldOwotCQkJCQotCQkJCXF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJcXVlcnlQYXJhbWV0ZXJzWzBdID0gY3VycmVudE1hdGNoZXIuZ3JvdXAoMSk7Ci0JCQkJcXVlcnlQYXJhbWV0ZXJzWzFdID0gY3VycmVudE1hdGNoZXIuZ3JvdXAoMykgKyBjdXJyZW50TWF0Y2hlci5ncm91cCg0KTsKLQkJCQkKLQkJCQkvLyBsb29wIHRocm91Z2ggcXVlcnkgcGFyYW1ldGVycyBhbmQgY3JlYXRlIGV4cHJlc3Npb25zCi0JCQkJLy8gY2FsY3VsYXRpbmcgdGhlIG51bUJlciBvZiBhcmd1bWVudHMgcmVxdWlyZWQgZm9yIHRoZSBleHByZXNzaW9uCi0JCQkJaW50IGFyZ3VtZW50Q3Vyc29yID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHF1ZXJ5UGFyYW1ldGVycy5sZW5ndGg7IGorKykgewotCQkJCQlHcmFpbHNNZXRob2RFeHByZXNzaW9uIGN1cnJlbnRFeHByZXNzaW9uID0gR3JhaWxzTWV0aG9kRXhwcmVzc2lvbi5jcmVhdGUodGhpcy5hcHBsaWNhdGlvbixjbGF6eixxdWVyeVBhcmFtZXRlcnNbal0pOwotCQkJCQl0b3RhbFJlcXVpcmVkQXJndW1lbnRzICs9IGN1cnJlbnRFeHByZXNzaW9uLmFyZ3VtZW50c1JlcXVpcmVkOwotCQkJCQkvLyBwb3B1bGF0ZSB0aGUgYXJndW1lbnRzIGludG8gdGhlIEdyYWlsc0V4cHJlc3Npb24gZnJvbSB0aGUgYXJndW1lbnQgbGlzdAotCQkJCQlPYmplY3RbXSBjdXJyZW50QXJndW1lbnRzID0gbmV3IE9iamVjdFtjdXJyZW50RXhwcmVzc2lvbi5hcmd1bWVudHNSZXF1aXJlZF07Ci0JCQkJCWlmKChhcmd1bWVudEN1cnNvciArIGN1cnJlbnRFeHByZXNzaW9uLmFyZ3VtZW50c1JlcXVpcmVkKSA+IGFyZ3VtZW50cy5sZW5ndGgpCi0JCQkJCQl0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2ROYW1lLGNsYXp6LGFyZ3VtZW50cyk7Ci0JCQkJCQotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGN1cnJlbnRFeHByZXNzaW9uLmFyZ3VtZW50c1JlcXVpcmVkOyBrKyssYXJndW1lbnRDdXJzb3IrKykgewotCQkJCQkJY3VycmVudEFyZ3VtZW50c1trXSA9IGFyZ3VtZW50c1thcmd1bWVudEN1cnNvcl07Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWN1cnJlbnRFeHByZXNzaW9uLnNldEFyZ3VtZW50cyhjdXJyZW50QXJndW1lbnRzKTsKLQkJCQkJfWNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQkJCUxPRy5kZWJ1ZyhpYWUuZ2V0TWVzc2FnZSgpLGlhZSk7Ci0JCQkJCQl0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2ROYW1lLGNsYXp6LGFyZ3VtZW50cyk7Ci0JCQkJCX0KLQkJCQkJLy8gYWRkIHRvIGxpc3Qgb2YgZXhwcmVzc2lvbnMKLQkJCQkJZXhwcmVzc2lvbnMuYWRkKGN1cnJlbnRFeHByZXNzaW9uKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSB0aGVyZSBpcyBvbmx5IG9uZSBleHByZXNzaW9uCi0JCWlmKCFjb250YWluc09wZXJhdG9yKSB7Ci0JCQlHcmFpbHNNZXRob2RFeHByZXNzaW9uIHNvbG8gPSBHcmFpbHNNZXRob2RFeHByZXNzaW9uLmNyZWF0ZSh0aGlzLmFwcGxpY2F0aW9uLCBjbGF6eixxdWVyeVNlcXVlbmNlICk7Ci0JCQkKLQkJCWlmKHNvbG8uYXJndW1lbnRzUmVxdWlyZWQgPiBhcmd1bWVudHMubGVuZ3RoKQotCQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsY2xhenosYXJndW1lbnRzKTsKLQkJCQotCQkJdG90YWxSZXF1aXJlZEFyZ3VtZW50cyArPSBzb2xvLmFyZ3VtZW50c1JlcXVpcmVkOwkJCQotCQkJT2JqZWN0W10gc29sb0FyZ3MgPSBuZXcgT2JqZWN0W3NvbG8uYXJndW1lbnRzUmVxdWlyZWRdOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbG8uYXJndW1lbnRzUmVxdWlyZWQ7IGkrKykgewotCQkJCXNvbG9BcmdzW2ldID0gYXJndW1lbnRzW2ldOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlzb2xvLnNldEFyZ3VtZW50cyhzb2xvQXJncyk7Ci0JCQl9Ci0JCQljYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJTE9HLmRlYnVnKGlhZS5nZXRNZXNzYWdlKCksaWFlKTsKLQkJCQl0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2ROYW1lLGNsYXp6LGFyZ3VtZW50cyk7Ci0JCQl9Ci0JCQlleHByZXNzaW9ucy5hZGQoc29sbyk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgdG90YWwgb2YgYWxsIHRoZSBhcmd1bWVudHMgbmVjZXNzYXJ5IGRvZXMgbm90IGVxdWFsIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCi0JCS8vIHRocm93IGV4Y2VwdGlvbgotCQlpZih0b3RhbFJlcXVpcmVkQXJndW1lbnRzID4gYXJndW1lbnRzLmxlbmd0aCkKLQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsY2xhenosYXJndW1lbnRzKTsKLQkJCi0JCS8vIGNhbGN1bGF0ZSB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cwotCQlPYmplY3RbXSByZW1haW5pbmdBcmd1bWVudHMgPSBuZXcgT2JqZWN0W2FyZ3VtZW50cy5sZW5ndGggLSB0b3RhbFJlcXVpcmVkQXJndW1lbnRzXTsKLQkJaWYocmVtYWluaW5nQXJndW1lbnRzLmxlbmd0aCA+IDApIHsJCQotCQkJZm9yIChpbnQgaSA9IDAsIGogPSB0b3RhbFJlcXVpcmVkQXJndW1lbnRzOyBpIDwgcmVtYWluaW5nQXJndW1lbnRzLmxlbmd0aDsgaSsrLGorKykgewotCQkJCXJlbWFpbmluZ0FyZ3VtZW50c1tpXSA9IGFyZ3VtZW50c1tqXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpCi0JCQlMT0cudHJhY2UoIkNhbGN1bGF0ZWQgZXhwcmVzc2lvbnM6ICIgKyBleHByZXNzaW9ucyk7Ci0JCQotCQlyZXR1cm4gZG9JbnZva2VJbnRlcm5hbFdpdGhFeHByZXNzaW9ucyhjbGF6eiwgbWV0aG9kTmFtZSwgcmVtYWluaW5nQXJndW1lbnRzLCBleHByZXNzaW9ucyk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbFdpdGhFeHByZXNzaW9ucyhDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cywgTGlzdCBleHByZXNzaW9ucyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvQWJzdHJhY3REeW5hbWljUGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjE2NWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZVRlbXBsYXRlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDcsIDIwMDUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RHluYW1pY1BlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcwotCQlBYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uIHsKLQotCXByaXZhdGUgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotCQotCXB1YmxpYyBBYnN0cmFjdER5bmFtaWNQZXJzaXN0ZW50TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJc3VwZXIobWV0aG9kTmFtZSk7Ci0JCXRoaXMuc2Vzc2lvbkZhY3RvcnkgPSBzZXNzaW9uRmFjdG9yeTsKLQkJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotCX0KLQotCXByb3RlY3RlZCBIaWJlcm5hdGVUZW1wbGF0ZSBnZXRIaWJlcm5hdGVUZW1wbGF0ZSgpIHsKLQkJQXNzZXJ0Lm5vdE51bGwoc2Vzc2lvbkZhY3RvcnksICJTZXNzaW9uIGZhY3RvcnkgaXMgcmVxdWlyZWQhIik7Ci0JCXJldHVybiBuZXcgSGliZXJuYXRlVGVtcGxhdGUodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhpcy5jbGFzc0xvYWRlcik7Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IGRvSW52b2tlSW50ZXJuYWwodGFyZ2V0LCBhcmd1bWVudHMpOwotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENsYXNzTG9hZGVyKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gYXJndW1lbnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdFN0YXRpY1BlcnNpc3RlbnRNZXRob2QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzFiYzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9BYnN0cmFjdFN0YXRpY1BlcnNpc3RlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvZ25sLkRlZmF1bHRUeXBlQ29udmVydGVyOwotaW1wb3J0IG9nbmwuT2dubDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0U3RhdGljTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkNyaXRlcmlhOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jcml0ZXJpb24uT3JkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVUZW1wbGF0ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA4LCAyMDA1Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXRpY1BlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcwotCQlBYnN0cmFjdFN0YXRpY01ldGhvZEludm9jYXRpb24gewotCi0JcHJpdmF0ZSBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBEZWZhdWx0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFR5cGVDb252ZXJ0ZXIoKTsKLQlwcml2YXRlIE1hcCBjb250ZXh0ID0gT2dubC5jcmVhdGVEZWZhdWx0Q29udGV4dCh0aGlzKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9NQVggPSAibWF4IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9PRkZTRVQgPSAib2Zmc2V0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9PUkRFUiA9ICJvcmRlciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU09SVCA9ICJzb3J0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9ERVNDID0gImRlc2MiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0FTQyA9ICJhc2MiOwotCQkKLQlwdWJsaWMgQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kKFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFBhdHRlcm4ocGF0dGVybik7Ci0JCXRoaXMuc2Vzc2lvbkZhY3RvcnkgPSBzZXNzaW9uRmFjdG9yeTsKLQkJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotCX0KLQotCXByb3RlY3RlZCBIaWJlcm5hdGVUZW1wbGF0ZSBnZXRIaWJlcm5hdGVUZW1wbGF0ZSgpIHsKLQkJQXNzZXJ0Lm5vdE51bGwoc2Vzc2lvbkZhY3RvcnksICJTZXNzaW9uIGZhY3RvcnkgaXMgcmVxdWlyZWQhIik7Ci0JCXJldHVybiBuZXcgSGliZXJuYXRlVGVtcGxhdGUodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgaW52b2tlKENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCUNsYXNzTG9hZGVyIG9yaWdpbmFsQ2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aGlzLmNsYXNzTG9hZGVyKTsKLQkJT2JqZWN0IHJldHVyblZhbHVlID0gZG9JbnZva2VJbnRlcm5hbChjbGF6eiwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpOwotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXJndW1lbnRzRm9yQ3JpdGVyaWEoQ3JpdGVyaWEgYywgTWFwIGFyZ01hcCkgewotCQkKLQkJSW50ZWdlciBtYXhQYXJhbSA9IG51bGw7Ci0JCUludGVnZXIgb2Zmc2V0UGFyYW0gPSBudWxsOwotCQlpZihhcmdNYXAuY29udGFpbnNLZXkoQVJHVU1FTlRfTUFYKSkgewkJCQotCQkJbWF4UGFyYW0gPSAoSW50ZWdlciljb252ZXJ0ZXIuY29udmVydFZhbHVlKGNvbnRleHQsYXJnTWFwLmdldChBUkdVTUVOVF9NQVgpLEludGVnZXIuY2xhc3MpOwotCQl9Ci0JCWlmKGFyZ01hcC5jb250YWluc0tleShBUkdVTUVOVF9PRkZTRVQpKSB7Ci0JCQlvZmZzZXRQYXJhbSA9IChJbnRlZ2VyKWNvbnZlcnRlci5jb252ZXJ0VmFsdWUoY29udGV4dCxhcmdNYXAuZ2V0KEFSR1VNRU5UX09GRlNFVCksSW50ZWdlci5jbGFzcyk7Ci0JCX0KLQkJU3RyaW5nIG9yZGVyUGFyYW0gPSAoU3RyaW5nKWFyZ01hcC5nZXQoQVJHVU1FTlRfT1JERVIpOwotCQkKLQkJZmluYWwgU3RyaW5nIHNvcnQgPSAoU3RyaW5nKWFyZ01hcC5nZXQoQVJHVU1FTlRfU09SVCk7Ci0JCWZpbmFsIFN0cmluZyBvcmRlciA9IE9SREVSX0RFU0MuZXF1YWxzSWdub3JlQ2FzZShvcmRlclBhcmFtKSA/IE9SREVSX0RFU0MgOiBPUkRFUl9BU0M7Ci0JCWZpbmFsIGludCBtYXggPSBtYXhQYXJhbSA9PSBudWxsID8gLTEgOiBtYXhQYXJhbS5pbnRWYWx1ZSgpOwotCQlmaW5hbCBpbnQgb2Zmc2V0ID0gb2Zmc2V0UGFyYW0gPT0gbnVsbCA/IC0xIDogb2Zmc2V0UGFyYW0uaW50VmFsdWUoKTsKLQkJaWYobWF4ID4gLTEpCi0JCQljLnNldE1heFJlc3VsdHMobWF4KTsKLQkJaWYob2Zmc2V0ID4gLTEpCi0JCQljLnNldEZpcnN0UmVzdWx0KG9mZnNldCk7Ci0JCWlmKHNvcnQgIT0gbnVsbCkgewotCQkJaWYoT1JERVJfREVTQy5lcXVhbHMob3JkZXIpKSB7Ci0JCQkJYy5hZGRPcmRlciggT3JkZXIuZGVzYyhzb3J0KSApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYy5hZGRPcmRlciggT3JkZXIuYXNjKHNvcnQpICk7Ci0JCQl9Ci0JCX0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0NvdW50UGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9Db3VudFBlcnNpc3RlbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YjhmZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0NvdW50UGVyc2lzdGVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlF1ZXJ5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVUZW1wbGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIE1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8gY291bnQgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlCi0gKgotICogZWcuIEFjY291bnQuY291bnQoKSAvLyByZXR1cm5zIGhvdyBtYW55IGluIHRvdGFsCi0gKgotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE3LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3VudFBlcnNpc3RlbnRNZXRob2QgIGV4dGVuZHMgQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE1FVEhPRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeY291bnQkIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAiY291bnQiOwotCi0gICAgcHVibGljIENvdW50UGVyc2lzdGVudE1ldGhvZChTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgc3VwZXIoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyLCBNRVRIT0RfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsKGZpbmFsIENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIEhpYmVybmF0ZVRlbXBsYXRlIHQgPSBnZXRIaWJlcm5hdGVUZW1wbGF0ZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoInNlbGVjdCBjb3VudChwZXJzaXN0ZW50Q2xhc3MpIGZyb20gIik7Ci0gICAgICAgIGIuYXBwZW5kKGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgICAgIGIuYXBwZW5kKCIgYXMgcGVyc2lzdGVudENsYXNzIik7Ci0gICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICByZXR1cm4gdC5leGVjdXRlKG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5IHEgPSBzZXNzaW9uLmNyZWF0ZVF1ZXJ5KGIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudW5pcXVlUmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIGNvdW50aW5nIHdpdGggYSBxdWVyeQotICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihNRVRIT0RfU0lHTkFUVVJFLCBjbGF6eixhcmd1bWVudHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvQ3JlYXRlQ3JpdGVyaWFQZXJzaXN0ZW50TWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0NyZWF0ZUNyaXRlcmlhUGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI2YmU1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvQ3JlYXRlQ3JpdGVyaWFQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyYWlscy5vcm0uSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci0vKioKLSAqIENyZWF0ZXMgYSBIaWJlcm5hdGVDcml0ZXJpYUJ1aWxkZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IGNsYXNzIGFuZCByZXR1cm5zIGl0LgotICogCi0gKiBlZy4gQWNjb3VudC5jcmVhdGVDcml0ZXJpYSgpCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQ3JpdGVyaWFQZXJzaXN0ZW50TWV0aG9kIGV4dGVuZHMKLQkJQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFUVEVSTiA9ICJeY3JlYXRlQ3JpdGVyaWEkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1NJR05BVFVSRSA9ICJnZXQiOwotCQotCXB1YmxpYyBDcmVhdGVDcml0ZXJpYVBlcnNpc3RlbnRNZXRob2QoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlciwgUGF0dGVybi5jb21waWxlKE1FVEhPRF9QQVRURVJOKSk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJCi0JCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAwKSAKLQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKE1FVEhPRF9TSUdOQVRVUkUsIGNsYXp6LGFyZ3VtZW50cyk7Ci0JCQkJCi0JCXJldHVybiBuZXcgSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyKGNsYXp6LHN1cGVyLmdldEhpYmVybmF0ZVRlbXBsYXRlKCkuZ2V0U2Vzc2lvbkZhY3RvcnkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0RlbGV0ZVBlcnNpc3RlbnRNZXRob2QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRGVsZXRlUGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhjZjRmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRGVsZXRlUGVyc2lzdGVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5tZXRhY2xhc3M7Ci0KLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlVGVtcGxhdGU7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIAotICogQHNpbmNlIEF1ZyA3LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVQZXJzaXN0ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3REeW5hbWljUGVyc2lzdGVudE1ldGhvZCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfU0lHTkFUVVJFID0gImRlbGV0ZSI7Ci0KLSAgICBwdWJsaWMgRGVsZXRlUGVyc2lzdGVudE1ldGhvZChTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgc3VwZXIoTUVUSE9EX1NJR05BVFVSRSxzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChPYmplY3QgdGFyZ2V0LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLSAgICAgICAgSGliZXJuYXRlVGVtcGxhdGUgdCA9IGdldEhpYmVybmF0ZVRlbXBsYXRlKCk7Ci0gICAgICAgIHQuc2V0Rmx1c2hNb2RlKEhpYmVybmF0ZVRlbXBsYXRlLkZMVVNIX0NPTU1JVCk7Ci0gICAgICAgIHQuZGVsZXRlKHRhcmdldCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9FeGlzdHNQZXJzaXN0ZW50TWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0V4aXN0c1BlcnNpc3RlbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhOWU4Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0V4aXN0c1BlcnNpc3RlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb2dubC5EZWZhdWx0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvZ25sLk9nbmw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEEgc3RhdGljIG1ldGhvZCB0aGF0IGNoZWNrcyB3aGV0aGVyIGFuIGVudGl0eSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlIGZvciB0aGUgc3BlY2lmaWVkIGlkCi0gKgotICogZWcuIEFjY291bnQuZXhzaXRzKDEpCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE3LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeGlzdHNQZXJzaXN0ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTUVUSE9EX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5leGlzdHMkIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAiZXhpc3RzIjsKLQotICAgIHByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBNYXAgY29udGV4dCA9IE9nbmwuY3JlYXRlRGVmYXVsdENvbnRleHQodGhpcyk7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0VHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyID0gbmV3IERlZmF1bHRUeXBlQ29udmVydGVyKCk7Ci0KLSAgICBwdWJsaWMgRXhpc3RzUGVyc2lzdGVudE1ldGhvZChHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHN1cGVyKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlcixNRVRIT0RfUEFUVEVSTik7Ci0gICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLSAgICAgICAgLy8gaWYgbm8gYXJndW1lbnRzIHBhc3NlZCB0aHJvdyBleGNlcHRpb24KLSAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSwgY2xhenosYXJndW1lbnRzKTsKLQotICAgICAgICAvLyBpZiBpdHMgbm90IGEgbWFwIHRocm93IGV4Y2VwdGlvbgotICAgICAgICBPYmplY3QgYXJnID0gYXJndW1lbnRzWzBdOwotCi0gICAgICAgIGlmKGFyZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSB0aGlzLmFwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgICAgIGlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIGlkZW50aXR5VHlwZSA9IGRvbWFpbkNsYXNzLmdldElkZW50aWZpZXIoKS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZighaWRlbnRpdHlUeXBlLmlzQXNzaWduYWJsZUZyb20oYXJnLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gdHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWUoY29udGV4dCxhcmcsIGlkZW50aXR5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN1cGVyLmdldEhpYmVybmF0ZVRlbXBsYXRlKCkuZ2V0KCBjbGF6eiwgKFNlcmlhbGl6YWJsZSlhcmcgKSAhPSBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0ZpbmRBbGxCeVBlcnNpc3RlbnRNZXRob2QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZEFsbEJ5UGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjYwNjg2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZEFsbEJ5UGVyc2lzdGVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZUNhbGxiYWNrOwotLyoqCi0gKiBUaGUgImZpbmRCeSoiIHN0YXRpYyBwZXJzaXN0ZW50IG1ldGhvZC4gVGhpcyBtZXRob2QgYWxsb3dzIHF1ZXJ5aW5nIGZvcgotICogaW5zdGFuY2VzIG9mIGdyYWlscyBkb21haW4gY2xhc3NlcyBiYXNlZCBvbiB0aGVpciBwcm9wZXJ0aWVzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgZm91bmQgcmVzdWx0cwotICogCi0gKiAKLSAqIGVnLgotICogQWNjb3VudC5maW5kQWxsQnlIb2xkZXIoIkpvZSBCbG9ncyIpOyAvLyBXaGVyZSBjbGFzcyAiQWNjb3VudCIgaGFzIGEgcHJvcGVydHkgY2FsbGVkICJob2xkZXIiCi0gKiBBY2NvdW50LmZpbmRBbGxCeUhvbGRlckFuZEJyYW5jaCgiSm9lIEJsb2dzIiwgIkxvbmRvbiIgKTsgLy8gV2hlcmUgY2xhc3MgIkFjY291bnQiIGhhcyBhIHByb3BlcnRpZXMgY2FsbGVkICJob2xkZXIiIGFuZCAiYnJhbmNoIgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMy1EZWMtMjAwNQotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbmRBbGxCeVBlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcwotCQlBYnN0cmFjdENsYXVzZWRTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRPUl9PUiA9ICJPciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVE9SX0FORCA9ICJBbmQiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFUVEVSTiA9ICIoZmluZEFsbEJ5KShcXHcrKSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFUkFUT1JTID0gbmV3IFN0cmluZ1tdeyBPUEVSQVRPUl9BTkQsIE9QRVJBVE9SX09SIH07Ci0KLQlwdWJsaWMgRmluZEFsbEJ5UGVyc2lzdGVudE1ldGhvZChHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKGFwcGxpY2F0aW9uLCBzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIsIFBhdHRlcm4uY29tcGlsZShNRVRIT0RfUEFUVEVSTiksIE9QRVJBVE9SUyk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsV2l0aEV4cHJlc3Npb25zKGZpbmFsIENsYXNzIGNsYXp6LAotCQkJU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cywgZmluYWwgTGlzdCBleHByZXNzaW9ucykgewotCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKS5leGVjdXRlRmluZCggbmV3IEhpYmVybmF0ZUNhbGxiYWNrKCkgewotCi0JCQlwdWJsaWMgT2JqZWN0IGRvSW5IaWJlcm5hdGUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSGliZXJuYXRlRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotCQkJCUNyaXRlcmlhIGMgPSBzZXNzaW9uLmNyZWF0ZUNyaXRlcmlhKGNsYXp6KTsKLQkJCQkKLQkJCQkKLQkJCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMCkgewotCQkJCQlpZihhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBNYXApIHsKLQkJCQkJCU1hcCBhcmdNYXAgPSAoTWFwKWFyZ3VtZW50c1swXTsKLQkJCQkJCXBvcHVsYXRlQXJndW1lbnRzRm9yQ3JpdGVyaWEoYyxhcmdNYXApOwkJCQkJCQkJCQkKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJCQkJCQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGV4cHJlc3Npb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFpbHNNZXRob2RFeHByZXNzaW9uIGN1cnJlbnQgPSAoR3JhaWxzTWV0aG9kRXhwcmVzc2lvbikgaS5uZXh0KCk7Ci0JCQkJCWMuYWRkKCBjdXJyZW50LmdldENyaXRlcmlvbigpICk7Ci0JCQkJCQotCQkJCX0KLQotCQkJCXJldHVybiBjLmxpc3QoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kQWxsUGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kQWxsUGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTA3ZWQwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZEFsbFBlcnNpc3RlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmV4Y2VwdGlvbnMuR3JhaWxzUXVlcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlF1ZXJ5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY3JpdGVyaW9uLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVDYWxsYmFjazsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBBdWcgOCwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRmluZEFsbFBlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcyBBYnN0cmFjdFN0YXRpY1BlcnNpc3RlbnRNZXRob2QgewotCi0JcHVibGljIEZpbmRBbGxQZXJzaXN0ZW50TWV0aG9kKFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LAotCQkJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJc3VwZXIoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyLCBQYXR0ZXJuLmNvbXBpbGUoIl5maW5kQWxsJCIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoZmluYWwgQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLAotCQkJZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBnZXRIaWJlcm5hdGVUZW1wbGF0ZSgpLmxvYWRBbGwoY2xhenopOwotCQkKLQkJZmluYWwgT2JqZWN0IGFyZyA9IGFyZ3VtZW50c1swXTsKLQkJCi0JCS8vIGlmIHRoZSBhcmcgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGZpbmQgYnkgZXhhbXBsZQotCQlpZihhcmcgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCWZpbmFsIFN0cmluZyBxdWVyeSA9IChTdHJpbmcpYXJnOwotCQkJaWYoIXF1ZXJ5Lm1hdGNoZXMoICJmcm9tICIrY2xhenouZ2V0TmFtZSgpKyIuKiIgKSkgewotCQkJCXRocm93IG5ldyBHcmFpbHNRdWVyeUV4Y2VwdGlvbigiSW52YWxpZCBxdWVyeSBbIitxdWVyeSsiXSBmb3IgZG9tYWluIGNsYXNzIFsiK2NsYXp6KyJdIik7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKS5leGVjdXRlRmluZCggbmV3IEhpYmVybmF0ZUNhbGxiYWNrKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBkb0luSGliZXJuYXRlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEhpYmVybmF0ZUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsJCQkJCQkJCQkJCi0JCQkJCVF1ZXJ5IHEgPSBzZXNzaW9uLmNyZWF0ZVF1ZXJ5KHF1ZXJ5KTsKLQkJCQkJT2JqZWN0W10gcXVlcnlBcmdzID0gbnVsbDsKLQkJCQkJaW50IG1heCA9IC0xOwotCQkJCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMSkgewotCQkJCQkJaWYoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJCXF1ZXJ5QXJncyA9ICgoTGlzdClhcmd1bWVudHNbMV0pLnRvQXJyYXkoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoYXJndW1lbnRzWzFdLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJCQkJcXVlcnlBcmdzID0gKE9iamVjdFtdKWFyZ3VtZW50c1sxXTsKLQkJCQkJCX0KLQkJCQkJfQkJCQkJCi0JCQkJCW1heCA9IHJldHJpZXZlTWF4VmFsdWUoYXJndW1lbnRzKTsKLQkJCQkJaWYocXVlcnlBcmdzICE9IG51bGwpIHsJCQkJCQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyeUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlxLnNldFBhcmFtZXRlcihpLCBxdWVyeUFyZ3NbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKG1heCA+IC0xKSB7Ci0JCQkJCQlxLnNldE1heFJlc3VsdHMobWF4KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcS5saXN0KCk7Ci0KLQkJCQl9Ci0KLQkJCQlwcml2YXRlIGludCByZXRyaWV2ZU1heFZhbHVlKE9iamVjdFtdIGFyZ3VtZW50cykgewotCQkJCQlpbnQgbWF4ID0gLTE7Ci0JCQkJCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0JCQkJCQlpZihhcmd1bWVudHNbMV0gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQkJbWF4ID0gKChJbnRlZ2VyKWFyZ3VtZW50c1sxXSkuaW50VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0JCQkJCQkJaWYoYXJndW1lbnRzWzJdIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkJCQltYXggPSAoKEludGVnZXIpYXJndW1lbnRzWzJdKS5pbnRWYWx1ZSgpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBtYXg7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCQkJCi0JCX0KLQkJaWYoY2xhenouaXNBc3NpZ25hYmxlRnJvbSggYXJnLmdldENsYXNzKCkgKSkgewkJCQotCQkJcmV0dXJuIHN1cGVyLmdldEhpYmVybmF0ZVRlbXBsYXRlKCkuZXhlY3V0ZUZpbmQoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJCQotCQkJCQlFeGFtcGxlIGV4YW1wbGUgPSBFeGFtcGxlLmNyZWF0ZShhcmcpCi0JCQkJCQkJLmlnbm9yZUNhc2UoKTsKLQkJCQkJCi0JCQkJCUNyaXRlcmlhIGNyaXQgPSBzZXNzaW9uLmNyZWF0ZUNyaXRlcmlhKGNsYXp6KTsKLQkJCQkJY3JpdC5hZGQoZXhhbXBsZSk7Ci0JCQkJCQotCQkJCQlyZXR1cm4gY3JpdC5saXN0KCk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9KTsJCQkKLQkJfQotCi0JCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsY2xhenosYXJndW1lbnRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZEJ5UGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kQnlQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmFmN2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kQnlQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZUNhbGxiYWNrOwotCi0vKioKLSAqIFRoZSAiZmluZEJ5KiIgc3RhdGljIHBlcnNpc3RlbnQgbWV0aG9kLiBUaGlzIG1ldGhvZCBhbGxvd3MgcXVlcnlpbmcgZm9yCi0gKiBpbnN0YW5jZXMgb2YgZ3JhaWxzIGRvbWFpbiBjbGFzc2VzIGJhc2VkIG9uIHRoZWlyIHByb3BlcnRpZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvZiB0aGUgcXVlcnkKLSAqIAotICogZWcuCi0gKiBBY2NvdW50LmZpbmRCeUhvbGRlcigiSm9lIEJsb2dzIik7IC8vIFdoZXJlIGNsYXNzICJBY2NvdW50IiBoYXMgYSBwcm9wZXJ0eSBjYWxsZWQgImhvbGRlciIKLSAqIEFjY291bnQuZmluZEJ5SG9sZGVyQW5kQnJhbmNoKCJKb2UgQmxvZ3MiLCAiTG9uZG9uIiApOyAvLyBXaGVyZSBjbGFzcyAiQWNjb3VudCIgaGFzIGEgcHJvcGVydGllcyBjYWxsZWQgImhvbGRlciIgYW5kICJicmFuY2giCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMxLUF1Zy0yMDA1Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmluZEJ5UGVyc2lzdGVudE1ldGhvZCBleHRlbmRzIEFic3RyYWN0Q2xhdXNlZFN0YXRpY1BlcnNpc3RlbnRNZXRob2QgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRPUl9PUiA9ICJPciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVE9SX0FORCA9ICJBbmQiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFUVEVSTiA9ICIoZmluZEJ5KShcXHcrKSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFUkFUT1JTID0gbmV3IFN0cmluZ1tdeyBPUEVSQVRPUl9BTkQsIE9QRVJBVE9SX09SIH07Ci0KLQlwdWJsaWMgRmluZEJ5UGVyc2lzdGVudE1ldGhvZChHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbixTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAJCXN1cGVyKGFwcGxpY2F0aW9uLHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlciwgUGF0dGVybi5jb21waWxlKCBNRVRIT0RfUEFUVEVSTiApLE9QRVJBVE9SUyk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsV2l0aEV4cHJlc3Npb25zKGZpbmFsIENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzLCBmaW5hbCBMaXN0IGV4cHJlc3Npb25zKSB7Ci0JCXJldHVybiBzdXBlci5nZXRIaWJlcm5hdGVUZW1wbGF0ZSgpLmV4ZWN1dGUoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQotCQkJcHVibGljIE9iamVjdCBkb0luSGliZXJuYXRlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEhpYmVybmF0ZUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLQkJCQlDcml0ZXJpYSBjcml0ID0gc2Vzc2lvbi5jcmVhdGVDcml0ZXJpYShjbGF6eik7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gZXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYWlsc01ldGhvZEV4cHJlc3Npb24gY3VycmVudCA9IChHcmFpbHNNZXRob2RFeHByZXNzaW9uKSBpLm5leHQoKTsKLQkJCQkJY3JpdC5hZGQoIGN1cnJlbnQuZ2V0Q3JpdGVyaW9uKCkgKTsKLQkJCQkJCi0JCQkJfQotCQkJCUxpc3QgcmVzdWx0cyA9IGNyaXQubGlzdCgpOwotCQkJCWlmKHJlc3VsdHMuc2l6ZSgpID4gMCkgewotCQkJCQlyZXR1cm4gcmVzdWx0cy5nZXQoMCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZFBlcnNpc3RlbnRNZXRob2QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZFBlcnNpc3RlbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3N2IyMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0ZpbmRQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmV4Y2VwdGlvbnMuR3JhaWxzUXVlcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlF1ZXJ5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY3JpdGVyaW9uLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVDYWxsYmFjazsKLS8qKgotICogPHA+VGhlICJmaW5kIiBwZXJzaXN0ZW50IHN0YXRpYyBtZXRob2QgYWxsb3dzIHNlYXJjaGluZyBmb3IgaW5zdGFuY2VzIHVzaW5nIGVpdGhlciBhbiBleGFtcGxlIGluc3RhbmNlIG9yIGFuIEhRTCAKLSAqIHF1ZXJ5LiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb2YgdGhlIHF1ZXJ5LiBBIEdyYWlsc1F1ZXJ5RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgcXVlcnkgaXMgbm90IGEgdmFsaWQgcXVlcnkgZm9yIHRoZSBkb21haW4gY2xhc3MuCi0gKiAKLSAqIDxwPkV4YW1wbGVzIGluIEdyb292eToKLSAqIDxjb2RlPgotICogCQkvLyByZXRyaWV2ZSB0aGUgZmlyc3QgMTAgYWNjb3VudHMgb3JkZXJlZCBieSBhY2NvdW50IG51bWJlcgotICogCQlkZWYgYSA9IEFjY291bnQuZmluZCgiZnJvbSBBY2NvdW50IGFzIGEgb3JkZXIgYnkgYS5udW1iZXIgYXNjIiwgMTApCi0gKiAKLSAqIAkJLy8gd2l0aCBxdWVyeSBwYXJhbWV0ZXJzCi0gKiAJCWRlZiBhICA9IEFjY291bnQuZmluZCgiZnJvbSBBY2NvdW50IGFzIGEgd2hlcmUgYS5udW1iZXIgPSA/IGFuZCBhLmJyYW5jaCA9ID8iLCBbMzg0NzksICJMb25kb24iXSkgCi0gKiAKLSAqIAkJLy8gcXVlcnkgYnkgZXhhbXBsZQotICogCQlkZWYgYSA9IG5ldyBBY2NvdW50KCkKLSAqIAkJYS5udW1iZXIgPSA0OTU3NDkzNTcKLSAqIAkJZGVmIGEgPSBBY2NvdW50LmZpbmQoYSkKLSAqIAotICogPC9jb2RlPgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAzMS1BdWctMjAwNQotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbmRQZXJzaXN0ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFUVEVSTiA9ICJeZmluZCQiOwotCi0JcHVibGljIEZpbmRQZXJzaXN0ZW50TWV0aG9kKFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlzdXBlcihzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIsIFBhdHRlcm4uY29tcGlsZShNRVRIT0RfUEFUVEVSTikpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChmaW5hbCBDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJCi0JCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsY2xhenosYXJndW1lbnRzKTsKLQkJCi0JCWZpbmFsIE9iamVjdCBhcmcgPSBhcmd1bWVudHNbMF07Ci0JCQotCQkvLyBpZiB0aGUgYXJnIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBmaW5kIGJ5IGV4YW1wbGUKLQkJaWYoYXJnIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlmaW5hbCBTdHJpbmcgcXVlcnkgPSAoU3RyaW5nKWFyZzsKLQkJCWlmKCFxdWVyeS5tYXRjaGVzKCAiZnJvbSAiK2NsYXp6LmdldE5hbWUoKSsiLioiICkpIHsKLQkJCQl0aHJvdyBuZXcgR3JhaWxzUXVlcnlFeGNlcHRpb24oIkludmFsaWQgcXVlcnkgWyIrcXVlcnkrIl0gZm9yIGRvbWFpbiBjbGFzcyBbIitjbGF6eisiXSIpOwotCQkJfQkJCQotCQkJcmV0dXJuIHN1cGVyLmdldEhpYmVybmF0ZVRlbXBsYXRlKCkuZXhlY3V0ZUZpbmQoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CQkJCQkJCQkJCQotCQkJCQlRdWVyeSBxID0gc2Vzc2lvbi5jcmVhdGVRdWVyeShxdWVyeSk7Ci0JCQkJCU9iamVjdFtdIHF1ZXJ5QXJncyA9IG51bGw7Ci0JCQkJCWludCBtYXggPSAtMTsKLQkJCQkJaWYoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKLQkJCQkJCWlmKGFyZ3VtZW50c1sxXSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCQlxdWVyeUFyZ3MgPSAoKExpc3QpYXJndW1lbnRzWzFdKS50b0FycmF5KCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKGFyZ3VtZW50c1sxXS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotCQkJCQkJCXF1ZXJ5QXJncyA9IChPYmplY3RbXSlhcmd1bWVudHNbMV07Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCQltYXggPSByZXRyaWV2ZU1heFZhbHVlKGFyZ3VtZW50cyk7Ci0JCQkJCWlmKHF1ZXJ5QXJncyAhPSBudWxsKSB7CQkJCQkKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcXVlcnlBcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJcS5zZXRQYXJhbWV0ZXIoaSwgcXVlcnlBcmdzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihtYXggPiAtMSkgewotCQkJCQkJcS5zZXRNYXhSZXN1bHRzKG1heCk7Ci0JCQkJCX0KLQkJCQkJTGlzdCByZXN1bHRzID0gcS5saXN0KCk7Ci0JCQkJCWlmKHJlc3VsdHMuc2l6ZSgpID4gMCkKLQkJCQkJCXJldHVybiByZXN1bHRzLmdldCgwKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSBpbnQgcmV0cmlldmVNYXhWYWx1ZShPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJCQkJaW50IG1heCA9IC0xOwotCQkJCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMSkgewotCQkJCQkJaWYoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkJCW1heCA9ICgoSW50ZWdlcilhcmd1bWVudHNbMV0pLmludFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMikgewotCQkJCQkJCWlmKGFyZ3VtZW50c1syXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJCQkJbWF4ID0gKChJbnRlZ2VyKWFyZ3VtZW50c1syXSkuaW50VmFsdWUoKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gbWF4OwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQkJCQotCQl9Ci0JCWlmKGNsYXp6LmlzQXNzaWduYWJsZUZyb20oIGFyZy5nZXRDbGFzcygpICkpIHsJCQkKLQkJCXJldHVybiBzdXBlci5nZXRIaWJlcm5hdGVUZW1wbGF0ZSgpLmV4ZWN1dGVGaW5kKCBuZXcgSGliZXJuYXRlQ2FsbGJhY2soKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGRvSW5IaWJlcm5hdGUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSGliZXJuYXRlRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotCQkJCQkKLQkJCQkJRXhhbXBsZSBleGFtcGxlID0gRXhhbXBsZS5jcmVhdGUoYXJnKQotCQkJCQkJCS5pZ25vcmVDYXNlKCk7Ci0JCQkJCQotCQkJCQlDcml0ZXJpYSBjcml0ID0gc2Vzc2lvbi5jcmVhdGVDcml0ZXJpYShjbGF6eik7Ci0JCQkJCWNyaXQuYWRkKGV4YW1wbGUpOwotCQkJCQkKLQkJCQkJTGlzdCByZXN1bHRzID0gY3JpdC5saXN0KCk7Ci0JCQkJCWlmKHJlc3VsdHMuc2l6ZSgpID4gMCkKLQkJCQkJCXJldHVybiByZXN1bHRzLmdldCgwKTsKLQkJCQkJcmV0dXJuIG51bGw7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9KTsJCQkKLQkJfQotCi0JCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsY2xhenosYXJndW1lbnRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvRmluZFdoZXJlUGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kV2hlcmVQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzQxMjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9GaW5kV2hlcmVQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLmNyaXRlcmlvbi5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlQ2FsbGJhY2s7Ci0KLS8qKgotICogVGhlICJmaW5kV2hlcmUiIHBlcnNpc3RlbnQgc3RhdGljIG1ldGhvZC4gVGhpcyBtZXRob2QgdGFrZXMgYSBtYXAgd2l0aCB0aGUKLSAqIGtleXMgYmVpbmcgdGhlIHByb3BlcnR5IG5hbWVzIGFuZCB0aGUgdmFsdWVzIGJlaW5nIHRoZSB2YWx1ZXMgb2YgdGhvc2UgcHJvcGVydGllcwotICogYW5kIGxvY2F0ZXMgYW4gaW5zdGFuY2UgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KLSAqIAotICogZWcuIEFjY291bnQuZmluZFdoZXJlKCBbICJob2xkZXIiOiJKb2UgQmxvZ2dzIiwgYnJhbmNoOiJMb25kb24iIF0gKTsKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmluZFdoZXJlUGVyc2lzdGVudE1ldGhvZCBleHRlbmRzIEFic3RyYWN0U3RhdGljUGVyc2lzdGVudE1ldGhvZCB7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBVFRFUk4gPSAiXmZpbmRXaGVyZSQiOwotCi0JcHVibGljIEZpbmRXaGVyZVBlcnNpc3RlbnRNZXRob2QoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlciwgUGF0dGVybi5jb21waWxlKE1FVEhPRF9QQVRURVJOKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5tZXRhY2xhc3MuQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kI2RvSW52b2tlSW50ZXJuYWwoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsKGZpbmFsIENsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwKLQkJCU9iamVjdFtdIGFyZ3VtZW50cykgewotCQkKLQkJLy8gaWYgbm8gYXJndW1lbnRzIHBhc3NlZCB0aHJvdyBleGNlcHRpb24KLQkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1BBVFRFUk4sIGNsYXp6LGFyZ3VtZW50cyk7Ci0JCS8vIGlmIGl0cyBub3QgYSBtYXAgdGhyb3cgZXhjZXB0aW9uCi0JCU9iamVjdCBhcmcgPSBhcmd1bWVudHNbMF07Ci0JCWlmKCEoYXJnIGluc3RhbmNlb2YgTWFwKSkKLQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKE1FVEhPRF9QQVRURVJOLCBjbGF6eixhcmd1bWVudHMpOwotCQkKLQkJZmluYWwgTWFwIHF1ZXJ5TWFwID0gKE1hcClhcmc7Ci0JCQotCQkvLyBUT0RPOiBXZSBtYXkgd2FudCB0byB2YWxpZGF0ZSB0aGUgcXVlcnkgbWFwIHRvIG1ha2Ugc3VyZSBlYWNoIG5hbWVkIHByb3BlcnR5Ci0JCS8vIGlzIGEgdmFsaWQgcHJvcGVydHkgb2YgdGhlIEdyYWlsc0RvbWFpbkNsYXNzIHRodXMgaGlkaW5nIHRoZSBIaWJlcm5hdGUKLQkJLy8gZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgaXQgaXMgbm90Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKS5leGVjdXRlKCBuZXcgSGliZXJuYXRlQ2FsbGJhY2soKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCQkJQ3JpdGVyaWEgY3JpdCA9IHNlc3Npb24uY3JlYXRlQ3JpdGVyaWEoY2xhenopOwotCQkJCQotCQkJCWNyaXQuYWRkKCBFeHByZXNzaW9uLmFsbEVxKCBxdWVyeU1hcCApICk7Ci0JCQkJCi0JCQkJTGlzdCByZXN1bHRzID0gY3JpdC5saXN0KCk7Ci0JCQkJaWYocmVzdWx0cy5zaXplKCkgPiAwKQotCQkJCQlyZXR1cm4gcmVzdWx0cy5nZXQoMCk7Ci0JCQkJcmV0dXJuIG51bGw7CQkJCQkKLQkJCQkKLQkJCX0KLQkJCQotCQl9KTsKLQkJCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvR2V0UGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9HZXRQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjI2MWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9HZXRQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvZ25sLkRlZmF1bHRUeXBlQ29udmVydGVyOwotaW1wb3J0IG9nbmwuT2dubDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0vKioKLSAqIFRoZSAiZ2V0IiBzdGF0aWMgcGVyc2lzdGVudCBtZXRob2QgZm9yIEdyYWlscyBkb21haW4gY2xhc3Nlcy4gVGhpcyBtZXRob2QKLSAqIHRha2VzIGFuIGlkIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZSAKLSAqIAotICogZWcuIEFjY291bnQuZ2V0KDIpCi0gKiAKLSAqIE9yIGFuIEhRTCBxdWVyeSBhbmQgdHJpZXMgdG8gcmV0cmlldmUgYSB1bmlxdWUgcmVzdWx0IChub3RlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHJlc3VsdCBpcyBub3QgdW5pcXVlKQotICogCi0gKiBlZy4gQWNjb3VudC5nZXQoImZyb20gQWNjb3VudCBhcyBhIHdoZXJlIGEuaWQ9MikKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2V0UGVyc2lzdGVudE1ldGhvZCBleHRlbmRzIEFic3RyYWN0U3RhdGljUGVyc2lzdGVudE1ldGhvZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE1FVEhPRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeZ2V0JCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAiZ2V0IjsKLQlwcml2YXRlIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotCXByaXZhdGUgTWFwIGNvbnRleHQgPSBPZ25sLmNyZWF0ZURlZmF1bHRDb250ZXh0KHRoaXMpOwotCXByaXZhdGUgRGVmYXVsdFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlciA9IG5ldyBEZWZhdWx0VHlwZUNvbnZlcnRlcigpOwotCi0JcHVibGljIEdldFBlcnNpc3RlbnRNZXRob2QoR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24sIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlzdXBlcihzZXNzaW9uRmFjdG9yeSwgY2xhc3NMb2FkZXIsIE1FVEhPRF9QQVRURVJOKTsKLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChmaW5hbCBDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsCi0JCQlPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJLy8gaWYgbm8gYXJndW1lbnRzIHBhc3NlZCB0aHJvdyBleGNlcHRpb24KLQkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSwgY2xhenosYXJndW1lbnRzKTsKLQkJLy8gaWYgaXRzIG5vdCBhIG1hcCB0aHJvdyBleGNlcHRpb24KLQkJT2JqZWN0IGFyZyA9IGFyZ3VtZW50c1swXTsKLSAgICAgICAgCi0gICAgICAgIGlmKGFyZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSB0aGlzLmFwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKGNsYXp6LmdldE5hbWUoKSk7Ci0JCWlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLQkJCUNsYXNzIGlkZW50aXR5VHlwZSA9IGRvbWFpbkNsYXNzLmdldElkZW50aWZpZXIoKS5nZXRUeXBlKCk7Ci0JCQlpZighaWRlbnRpdHlUeXBlLmlzQXNzaWduYWJsZUZyb20oYXJnLmdldENsYXNzKCkpKSB7Ci0JCQkJYXJnID0gdHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWUoY29udGV4dCxhcmcsIGlkZW50aXR5VHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKS5nZXQoIGNsYXp6LCAoU2VyaWFsaXphYmxlKWFyZyApOwkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0xpc3RPcmRlckJ5UGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9MaXN0T3JkZXJCeVBlcnNpc3RlbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzOTMxMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL0xpc3RPcmRlckJ5UGVyc2lzdGVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5oaWJlcm5hdGUuQ3JpdGVyaWE7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5IaWJlcm5hdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jcml0ZXJpb24uT3JkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVDYWxsYmFjazsKLQotLyoqCi0gKiBUaGUgImxpc3RPcmRlckJ5KiIgc3RhdGljIHBlcnNpc3RlbnQgbWV0aG9kLiBUaGlzIG1ldGhvZCBhbGxvd3MKLSAqIG9yZGVyZWQgbGlzdGluZyBvZiBpbnN0YW5jZXMgYmFzZWQgb24gdGhlaXIgcHJvcGVydGllcy4KLSAqIAotICogZWcuCi0gKiBBY2NvdW50Lmxpc3RPcmRlckJ5SG9sZGVyKCk7Ci0gKiBBY2NvdW50Lmxpc3RPcmRlckJ5SG9sZGVyKG1heCk7IC8vIG1heCByZXN1bHRzCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE9yZGVyQnlQZXJzaXN0ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RTdGF0aWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFUVEVSTiA9ICIobGlzdE9yZGVyQnkpKFxcdyspIjsKLQotCXB1YmxpYyBMaXN0T3JkZXJCeVBlcnNpc3RlbnRNZXRob2QoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXN1cGVyKHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlciwgUGF0dGVybi5jb21waWxlKCBNRVRIT0RfUEFUVEVSTiApKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzcy5BYnN0cmFjdFN0YXRpY1BlcnNpc3RlbnRNZXRob2QjZG9JbnZva2VJbnRlcm5hbChqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoZmluYWwgQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLAotCQkJT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0KLQkJTWF0Y2hlciBtYXRjaCA9IGdldFBhdHRlcm4oKS5tYXRjaGVyKCBtZXRob2ROYW1lICk7Ci0JCS8vIGZpbmQgbWF0Y2gKLQkJbWF0Y2guZmluZCgpOwotCQkKLQkJU3RyaW5nIG5hbWVJblNpZ25hdHVyZSA9IG1hdGNoLmdyb3VwKDIpOwotCQlmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gbmFtZUluU2lnbmF0dXJlLnN1YnN0cmluZygwLDEpLnRvTG93ZXJDYXNlKCkgKwotCQkJCQkJCQkJCW5hbWVJblNpZ25hdHVyZS5zdWJzdHJpbmcoMSk7Ci0JCQotCQlpbnQgdGVtcCA9IC0xOwotCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMCkgewotCQkJT2JqZWN0IGFyZyA9IGFyZ3VtZW50c1swXTsKLQkJCWlmKGFyZyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQl0ZW1wID0gKChJbnRlZ2VyKWFyZykuaW50VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlmaW5hbCBpbnQgbWF4ID0gdGVtcDsKLQkJCi0JCXJldHVybiBzdXBlci5nZXRIaWJlcm5hdGVUZW1wbGF0ZSgpLmV4ZWN1dGVGaW5kKCBuZXcgSGliZXJuYXRlQ2FsbGJhY2soKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCQkJQ3JpdGVyaWEgY3JpdCA9IHNlc3Npb24uY3JlYXRlQ3JpdGVyaWEoY2xhenopOwotCQkJCWNyaXQuYWRkT3JkZXIoIE9yZGVyLmFzYyggcHJvcGVydHlOYW1lICkgKTsKLQkJCQlpZihtYXggPiAtMSkgewotCQkJCQljcml0LnNldE1heFJlc3VsdHMobWF4KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNyaXQubGlzdCgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9MaXN0UGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9MaXN0UGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODM0NjVjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvTGlzdFBlcnNpc3RlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmhpYmVybmF0ZS5Dcml0ZXJpYTsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZUNhbGxiYWNrOwotCi0vKioKLSAqIFRoZSAibGlzdCIgcGVyc2lzdGVudCBzdGF0aWMgbWV0aG9kLiBUaGlzIG1ldGhvZCBsaXN0cyBvZiBvZiB0aGUgcGVyc2lzdGVudAotICogaW5zdGFuY2VzIHVwIHRoZSBtYXhpbXVtIHNwZWNpZmllZCBhbW91bnQgKGlmIGFueSkKLSAqIAotICogZWcuCi0gKiBBY2NvdW50Lmxpc3QoKTsgLy8gbGlzdCBhbGwKLSAqIEFjY291bnQubGlzdChtYXg6MTAsb2Zmc2V0OjUwLHNvcnQ6ImhvbGRlciIsb3JkZXI6ImRlc2MiKTsgLy8gbGlzdCB1cCB0byAxMCwgb2Zmc2V0IGJ5IDUwLCBzb3J0ZWQgYnkgaG9sZGVyIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIAotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0UGVyc2lzdGVudE1ldGhvZCBleHRlbmRzIEFic3RyYWN0U3RhdGljUGVyc2lzdGVudE1ldGhvZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBVFRFUk4gPSAiXmxpc3QkIjsKLQotCXB1YmxpYyBMaXN0UGVyc2lzdGVudE1ldGhvZChTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJc3VwZXIoc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyLCBQYXR0ZXJuLmNvbXBpbGUoTUVUSE9EX1BBVFRFUk4pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvSW52b2tlSW50ZXJuYWwoZmluYWwgQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLAotCQkJZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCS8vIGlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgbGlzdCBhbGwKLQkJaWYoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKS5sb2FkQWxsKGNsYXp6KTsKLQkJfQotCQkvLyBvdGhlcndpc2UgcmV0cmlldmUgdGhlIG1heCBhcmd1bWVudAotCQllbHNlIHsKLQkJCi0JCQkvLyBhbmQgbGlzdCB1cCB0byB0aGUgbWF4Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SGliZXJuYXRlVGVtcGxhdGUoKQotCQkJCS5leGVjdXRlRmluZCggbmV3IEhpYmVybmF0ZUNhbGxiYWNrKCkgewotCi0JCQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJCQlDcml0ZXJpYSBjID0gIHNlc3Npb24KLQkJCQkJCQkuY3JlYXRlQ3JpdGVyaWEoY2xhenopOwotCQkJCQkJCi0JCQkJCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMCkgewotCQkJCQkJCWlmKGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCQkJCQlNYXAgYXJnTWFwID0gKE1hcClhcmd1bWVudHNbMF07Ci0JCQkJCQkJCXBvcHVsYXRlQXJndW1lbnRzRm9yQ3JpdGVyaWEoYyxhcmdNYXApOwkJCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9CQotCQkJCQkJcmV0dXJuIGMubGlzdCgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCSk7Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9SZWZyZXNoUGVyc2lzdGVudE1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9SZWZyZXNoUGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZiZTg3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvUmVmcmVzaFBlcnNpc3RlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzczsKLQotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci0vKioKLSAqIFRoZSAicmVmcmVzaCIgcGVyc2lzdGVudCBpbnN0YW5jZSBtZXRob2QuIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgY3VycmVudAotICogaW5zdGFuY2VzIHN0YXRlLgotICogCi0gKiBlZy4KLSAqIGluc3RhbmNlLnJlZnJlc2goKTsKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFBlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcyBBYnN0cmFjdER5bmFtaWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfU0lHTkFUVVJFID0gInJlZnJlc2giOwotCi0JcHVibGljIFJlZnJlc2hQZXJzaXN0ZW50TWV0aG9kKFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlzdXBlcihNRVRIT0RfU0lHTkFUVVJFLHNlc3Npb25GYWN0b3J5LCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlzdXBlci5nZXRIaWJlcm5hdGVUZW1wbGF0ZSgpLnJlZnJlc2godGFyZ2V0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL1NhdmVQZXJzaXN0ZW50TWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL1NhdmVQZXJzaXN0ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDE5OTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL21ldGFjbGFzcy9TYXZlUGVyc2lzdGVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5EZWxlZ2F0aW5nTWV0YUNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5Eb21haW5DbGFzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS52YWxpZGF0aW9uLkdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkJpbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiAKLSAqIEBzaW5jZSBBdWcgNywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVBlcnNpc3RlbnRNZXRob2QgZXh0ZW5kcyBBYnN0cmFjdER5bmFtaWNQZXJzaXN0ZW50TWV0aG9kIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAic2F2ZSI7Ci0gICAgcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLQotICAgIHB1YmxpYyBTYXZlUGVyc2lzdGVudE1ldGhvZChTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKE1FVEhPRF9TSUdOQVRVUkUsc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKTsKLQotICAgICAgICBpZihhcHBsaWNhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uc3RydWN0b3IgYXJndW1lbnQgJ2FwcGxpY2F0aW9uJyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb0ludm9rZUludGVybmFsKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCi0gICAgICAgIEVycm9ycyBlcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0YXJnZXQsIHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoIHRhcmdldC5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgICAgICBWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkb1ZhbGlkYXRpb24gPSB0cnVlOwotICAgICAgICBCb29sZWFuIHN1Y2Nlc3MgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgIGlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRvciA9IGRvbWFpbkNsYXNzLmdldFZhbGlkYXRvcigpOwotICAgICAgICAgICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgICAgICAgICBkb1ZhbGlkYXRpb24gPSAoKEJvb2xlYW4pYXJndW1lbnRzWzBdKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZG9WYWxpZGF0aW9uKSB7Ci0gICAgICAgICAgICBpZih2YWxpZGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRvciBpbnN0YW5jZW9mIEdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAoKEdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yKXZhbGlkYXRvcikuc2V0SGliZXJuYXRlVGVtcGxhdGUoZ2V0SGliZXJuYXRlVGVtcGxhdGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSh0YXJnZXQsZXJyb3JzKTsKLQotICAgICAgICAgICAgICAgIGlmKGVycm9ycy5oYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBEZWxlZ2F0aW5nTWV0YUNsYXNzIG1ldGFDbGFzcyA9IChEZWxlZ2F0aW5nTWV0YUNsYXNzKUludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRhUmVnaXN0cnkoKS5nZXRNZXRhQ2xhc3ModGFyZ2V0LmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkodGFyZ2V0LERvbWFpbkNsYXNzTWV0aG9kcy5FUlJPUlNfUFJPUEVSVFksZXJyb3JzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZighZXJyb3JzLmhhc0Vycm9ycygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSGliZXJuYXRlVGVtcGxhdGUgdCA9IGdldEhpYmVybmF0ZVRlbXBsYXRlKCk7Ci0gICAgICAgIHQuc2V0Rmx1c2hNb2RlKEhpYmVybmF0ZVRlbXBsYXRlLkZMVVNIX0NPTU1JVCk7Ci0KLSAgICAgICAgLy8gdGhpcyBwaWVjZSBvZiBjb2RlIHdpbGwgcmV0cmlldmUgYSBwZXJzaXN0ZW50IGluc3RhbnQKLSAgICAgICAgLy8gb2YgYSBkb21haW4gY2xhc3MgcHJvcGVydHkgaXMgb25seSB0aGUgaWQgaXMgc2V0IHRodXMKLSAgICAgICAgLy8gcmVsaWV2aW5nIHRoaXMgYnVyZGVuIG9mZiB0aGUgZGV2ZWxvcGVyCi0gICAgICAgIGlmKGRvbWFpbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJlYW5XcmFwcGVyIGJlYW4gPSBuZXcgQmVhbldyYXBwZXJJbXBsKHRhcmdldCk7Ci0gICAgICAgICAgICBHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5W10gcHJvcHMgPSBkb21haW5DbGFzcy5nZXRQZXJzaXN0YW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcCA9IHByb3BzW2ldOwotICAgICAgICAgICAgICAgIGlmKHByb3AuaXNNYW55VG9PbmUoKSB8fCBwcm9wLmlzT25lVG9PbmUoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcFZhbHVlID0gYmVhbi5nZXRQcm9wZXJ0eVZhbHVlKHByb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocHJvcFZhbHVlICE9IG51bGwgJiYgIXQuY29udGFpbnMocHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3Mgb3RoZXJTaWRlID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MocHJvcC5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG90aGVyU2lkZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyYXBwZXIgcHJvcEJlYW4gPSBuZXcgQmVhbldyYXBwZXJJbXBsKHByb3BWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemFibGUgaWQgPSAoU2VyaWFsaXphYmxlKXByb3BCZWFuLmdldFByb3BlcnR5VmFsdWUob3RoZXJTaWRlLmdldElkZW50aWZpZXIoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uc2V0UHJvcGVydHlWYWx1ZShwcm9wLmdldE5hbWUoKSx0LmdldChwcm9wLmdldFR5cGUoKSxpZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBpZih0LmNvbnRhaW5zKHRhcmdldCkpIHsKLSAgICAgICAgICAgIHQudXBkYXRlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0LnNhdmVPclVwZGF0ZSh0YXJnZXQpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvVmFsaWRhdGVQZXJzaXN0ZW50TWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvbWV0YWNsYXNzL1ZhbGlkYXRlUGVyc2lzdGVudE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNhN2QyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9tZXRhY2xhc3MvVmFsaWRhdGVQZXJzaXN0ZW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzOwotCi0KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5EZWxlZ2F0aW5nTWV0YUNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm1ldGFjbGFzcy5Eb21haW5DbGFzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS52YWxpZGF0aW9uLkdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkJpbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotLyoqCi0gKiBBIG1ldGhvZCB0aGF0IHZhbGlkYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGRvbWFpbiBjbGFzcyBhZ2FpbnN0IGl0cyBjb25zdHJhaW50cyAKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDctTm92LTIwMDUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlUGVyc2lzdGVudE1ldGhvZCBleHRlbmRzIEFic3RyYWN0RHluYW1pY1BlcnNpc3RlbnRNZXRob2QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FID0gInZhbGlkYXRlIjsKLQlwcml2YXRlIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotCQotCi0KLQotCXB1YmxpYyBWYWxpZGF0ZVBlcnNpc3RlbnRNZXRob2QoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnksIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgewotCQlzdXBlcihNRVRIT0RfTkFNRSwgc2Vzc2lvbkZhY3RvcnksIGNsYXNzTG9hZGVyKTsKLQkJaWYoYXBwbGljYXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGFyZ3VtZW50ICdhcHBsaWNhdGlvbicgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VJbnRlcm5hbChPYmplY3QgdGFyZ2V0LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJRXJyb3JzIGVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKHRhcmdldCwgdGFyZ2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSBhcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcyggdGFyZ2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0JCVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQkKLQkJaWYoZG9tYWluQ2xhc3MgIT0gbnVsbCkKLQkJCXZhbGlkYXRvciA9IGFwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCB0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKS5nZXRWYWxpZGF0b3IoKTsKLQkJCi0JCUJvb2xlYW4gdmFsaWQgPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJaWYodmFsaWRhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKHZhbGlkYXRvciBpbnN0YW5jZW9mIEdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICgoR3JhaWxzRG9tYWluQ2xhc3NWYWxpZGF0b3IpdmFsaWRhdG9yKS5zZXRIaWJlcm5hdGVUZW1wbGF0ZShnZXRIaWJlcm5hdGVUZW1wbGF0ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSh0YXJnZXQsZXJyb3JzKTsKLQkJCQotCQkJaWYoZXJyb3JzLmhhc0Vycm9ycygpKSB7Ci0JCQkJdmFsaWQgPSBuZXcgQm9vbGVhbighZXJyb3JzLmhhc0Vycm9ycygpKTsJCi0JCQkJRGVsZWdhdGluZ01ldGFDbGFzcyBtZXRhQ2xhc3MgPSAoRGVsZWdhdGluZ01ldGFDbGFzcylJbnZva2VySGVscGVyLmdldEluc3RhbmNlKCkuZ2V0TWV0YVJlZ2lzdHJ5KCkuZ2V0TWV0YUNsYXNzKHRhcmdldC5nZXRDbGFzcygpKTsKLQkJCQltZXRhQ2xhc3Muc2V0UHJvcGVydHkodGFyZ2V0LERvbWFpbkNsYXNzTWV0aG9kcy5FUlJPUlNfUFJPUEVSVFksZXJyb3JzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvc3VwcG9ydC9HcmFpbHNPcGVuU2Vzc2lvbkluVmlld0ZpbHRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL3N1cHBvcnQvR3JhaWxzT3BlblNlc3Npb25JblZpZXdGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMDg2My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvc3VwcG9ydC9HcmFpbHNPcGVuU2Vzc2lvbkluVmlld0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuRmx1c2hNb2RlOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYW8uRGF0YUFjY2Vzc1Jlc291cmNlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLlNlc3Npb25GYWN0b3J5VXRpbHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5zdXBwb3J0Lk9wZW5TZXNzaW9uSW5WaWV3RmlsdGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuc3VwcG9ydC5XZWJBcHBsaWNhdGlvbkNvbnRleHRVdGlsczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD5Vc2VzIHRoZSBHcmFpbHNBcHBsaWNhdGlvbiBzZXNzc2lvbkZhY3RvcnkgdG8gYXBwbHkgdGhlIGZpbHRlcgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjAsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc09wZW5TZXNzaW9uSW5WaWV3RmlsdGVyIGV4dGVuZHMgT3BlblNlc3Npb25JblZpZXdGaWx0ZXIgewotCi0gICAgcHJvdGVjdGVkIFNlc3Npb25GYWN0b3J5IGxvb2t1cFNlc3Npb25GYWN0b3J5KCkgewotICAgICAgICBXZWJBcHBsaWNhdGlvbkNvbnRleHQgcGFyZW50ID0KLSAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzLmdldFJlcXVpcmVkV2ViQXBwbGljYXRpb25Db250ZXh0KGdldFNlcnZsZXRDb250ZXh0KCkpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gKEFwcGxpY2F0aW9uQ29udGV4dClnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZShHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0KLSAgICAgICAgaWYoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFNlc3Npb25GYWN0b3J5KSBjb250ZXh0LmdldEJlYW4oZ2V0U2Vzc2lvbkZhY3RvcnlCZWFuTmFtZSgpLCBTZXNzaW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlc3Npb24gZ2V0U2Vzc2lvbihTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSkgdGhyb3dzIERhdGFBY2Nlc3NSZXNvdXJjZUZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBTZXNzaW9uRmFjdG9yeVV0aWxzLmdldFNlc3Npb24oc2Vzc2lvbkZhY3RvcnksIHRydWUpOwotICAgICAgICBzZXNzaW9uLnNldEZsdXNoTW9kZShGbHVzaE1vZGUuQVVUTyk7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsdGVySW50ZXJuYWwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGZpbHRlckNoYWluKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZiA9IGxvb2t1cFNlc3Npb25GYWN0b3J5KCk7Ci0gICAgICAgIGlmKHNmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN1cGVyLmRvRmlsdGVySW50ZXJuYWwocmVxdWVzdCxyZXNwb25zZSxmaWx0ZXJDaGFpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlU2Vzc2lvbihTZXNzaW9uIHNlc3Npb24sIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5KSB7Ci0gICAgICAgIGlmKCFGbHVzaE1vZGUuTkVWRVIuZXF1YWxzKHNlc3Npb24uZ2V0Rmx1c2hNb2RlKCkpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuY2xvc2VTZXNzaW9uKHNlc3Npb24sIHNlc3Npb25GYWN0b3J5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvc3VwcG9ydC9IaWJlcm5hdGVEaWFsZWN0RGV0ZWN0b3JGYWN0b3J5QmVhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL3N1cHBvcnQvSGliZXJuYXRlRGlhbGVjdERldGVjdG9yRmFjdG9yeUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0NTYyYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvc3VwcG9ydC9IaWJlcm5hdGVEaWFsZWN0RGV0ZWN0b3JGYWN0b3J5QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuZXhjZXB0aW9ucy5Db3VsZE5vdERldGVybWluZUhpYmVybmF0ZURpYWxlY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5kaWFsZWN0LkRpYWxlY3Q7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5kaWFsZWN0LkRpYWxlY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5GYWN0b3J5QmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuSW5pdGlhbGl6aW5nQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmpkYmMuc3VwcG9ydC5KZGJjVXRpbHM7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDYsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEhpYmVybmF0ZURpYWxlY3REZXRlY3RvckZhY3RvcnlCZWFuIGltcGxlbWVudHMgRmFjdG9yeUJlYW4sCi0JCUluaXRpYWxpemluZ0JlYW4gewotCi0JcHJpdmF0ZSBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydGllcyB2ZW5kb3JOYW1lRGlhbGVjdE1hcHBpbmdzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBoaWJlcm5hdGVEaWFsZWN0Q2xhc3NOYW1lID0gbnVsbDsKLQlwcml2YXRlIERpYWxlY3QgaGliZXJuYXRlRGlhbGVjdDsKLQkKLQlwdWJsaWMgSGliZXJuYXRlRGlhbGVjdERldGVjdG9yRmFjdG9yeUJlYW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZSBkYXRhU291cmNlKSB7Ci0JCXRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVuZG9yTmFtZURpYWxlY3RNYXBwaW5ncyhQcm9wZXJ0aWVzIG1hcHBpbmdzKSB7Ci0JCXRoaXMudmVuZG9yTmFtZURpYWxlY3RNYXBwaW5ncyA9IG1hcHBpbmdzOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5oaWJlcm5hdGVEaWFsZWN0Q2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZnRlclByb3BlcnRpZXNTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZGF0YVNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEYXRhIHNvdXJjZSBpcyBub3Qgc2V0ISIpOwotCQl9Ci0JCWlmICh0aGlzLnZlbmRvck5hbWVEaWFsZWN0TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVmVuZG9yIG5hbWUvZGlhbGVjdCBtYXBwaW5ncyBhcmUgbm90IHNldCEiKTsKLQkJfQotCQkKLQkJU3RyaW5nIGRiTmFtZSA9IChTdHJpbmcpSmRiY1V0aWxzLmV4dHJhY3REYXRhYmFzZU1ldGFEYXRhKHRoaXMuZGF0YVNvdXJjZSwgImdldERhdGFiYXNlUHJvZHVjdE5hbWUiKTsKLQkJSW50ZWdlciBtYWpvclZlcnNpb24gPSAoSW50ZWdlcilKZGJjVXRpbHMuZXh0cmFjdERhdGFiYXNlTWV0YURhdGEodGhpcy5kYXRhU291cmNlLCAiZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24iKTsKLQkJCi0JCXRoaXMuaGliZXJuYXRlRGlhbGVjdCA9IERpYWxlY3RGYWN0b3J5LmRldGVybWluZURpYWxlY3QoZGJOYW1lLG1ham9yVmVyc2lvbi5pbnRWYWx1ZSgpKTsKLQkJdGhpcy5oaWJlcm5hdGVEaWFsZWN0Q2xhc3NOYW1lID0gdGhpcy5oaWJlcm5hdGVEaWFsZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkvL3RoaXMuaGliZXJuYXRlRGlhbGVjdENsYXNzTmFtZSA9IHRoaXMudmVuZG9yTmFtZURpYWxlY3RNYXBwaW5ncy5nZXRQcm9wZXJ0eShkYk5hbWUpOwotCQkKLQkJaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsodGhpcy5oaWJlcm5hdGVEaWFsZWN0Q2xhc3NOYW1lKSkgewotCQkJdGhyb3cgbmV3IENvdWxkTm90RGV0ZXJtaW5lSGliZXJuYXRlRGlhbGVjdEV4Y2VwdGlvbigiQ291bGQgbm90IGRldGVybWluZSBIaWJlcm5hdGUgZGlhbGVjdCBmb3IgZGF0YWJhc2UgbmFtZSBbIiArIGRiTmFtZSArICJdISIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvdmFsaWRhdGlvbi9Db25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL3ZhbGlkYXRpb24vQ29uc3RyYWluZWRQZXJzaXN0ZW50UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkOTRhYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvdmFsaWRhdGlvbi9Db25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBvcmcuaGliZXJuYXRlLkhpYmVybmF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5jcml0ZXJpb24uUmVzdHJpY3Rpb25zOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVUZW1wbGF0ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8qKgotICogRXh0ZW5kcyBDb25zdHJhaW5lZFByb3BlcnR5IHRvIHByb3ZpZGUgYWRkaXRpb25hbCB2YWxpZGF0aW9uIGFnYWluc3QgZGF0YWJhc2Ugc3BlY2lmaWMgY29uc3RyYWludHMKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTAtTm92LTIwMDUKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbmVkUGVyc2lzdGVudFByb3BlcnR5IGV4dGVuZHMgQ29uc3RyYWluZWRQcm9wZXJ0eSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklRVUVfQ09OU1RSQUlOVCA9ICJ1bmlxdWUiOwotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTk9UX1VOSVFVRV9NRVNTQUdFID0gYnVuZGxlLmdldFN0cmluZygiZGVmYXVsdC5ub3QudW5pcXVlLm1lc3NhZ2UiKTsKLQlwcml2YXRlIEhpYmVybmF0ZVRlbXBsYXRlIGhpYmVybmF0ZVRlbXBsYXRlOwotCQotCXN0YXRpYyB7CQkKLQkJY29uc3RyYWludHMucHV0KCBVTklRVUVfQ09OU1RSQUlOVCwgVW5pcXVlQ29uc3RyYWludC5jbGFzcyApOwotCX0KLQkKLQlzdGF0aWMgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQgaW1wbGVtZW50cyBQZXJzaXN0ZW50Q29uc3RyYWludCB7Ci0JCQotCQlwcm90ZWN0ZWQgSGliZXJuYXRlVGVtcGxhdGUgY29uc3RyYWludEhpYmVybmF0ZVRlbXBsYXRlOwotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLnZhbGlkYXRpb24uUGVyc2lzdGVudENvbnN0cmFpbnQjc2V0SGliZXJuYXRlVGVtcGxhdGUob3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVUZW1wbGF0ZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEhpYmVybmF0ZVRlbXBsYXRlKEhpYmVybmF0ZVRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCQl0aGlzLmNvbnN0cmFpbnRIaWJlcm5hdGVUZW1wbGF0ZSA9IHRlbXBsYXRlOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eS5BYnN0cmFjdENvbnN0cmFpbnQjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9ycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0JCQlpZihjb25zdHJhaW50SGliZXJuYXRlVGVtcGxhdGUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQZXJzaXN0ZW50Q29uc3RyYWludCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBIaWJlcm5hdGVUZW1wbGF0ZS4iKTsKLQkJCQotCQkJc3VwZXIudmFsaWRhdGUocHJvcGVydHlWYWx1ZSwgZXJyb3JzKTsKLQkJfQkJCQkKLQl9Ci0JCi0JLyoqCi0JICogCi0gICAgICogQSBjb25zdHJhaW50IHRoYXQgdmFsaWRhdGVzIHRoZSB1bmlxdWVuZXNzIG9mIGEgcHJvcGVydHkKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW50Q29uc3RyYWludCB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gdW5pcXVlOwotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVuaXF1ZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgewotCQkJcmV0dXJuIHVuaXF1ZTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHkuQWJzdHJhY3RDb25zdHJhaW50I3NldFBhcmFtZXRlcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKE9iamVjdCBjb25zdHJhaW50UGFyYW1ldGVyKSB7Ci0JCQlpZighKGNvbnN0cmFpbnRQYXJhbWV0ZXIgaW5zdGFuY2VvZiBCb29sZWFuKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGZvciBjb25zdHJhaW50IFsiK1VOSVFVRV9DT05TVFJBSU5UKyJdIG9mIHByb3BlcnR5IFsiK2NvbnN0cmFpbnRQcm9wZXJ0eU5hbWUrIl0gb2YgY2xhc3MgWyIrY29uc3RyYWludE93bmluZ0NsYXNzKyJdIG11c3QgYmUgYSBib29sZWFuIHZhbHVlIik7Ci0JCQkKLQkJCXRoaXMudW5pcXVlID0gKChCb29sZWFuKWNvbnN0cmFpbnRQYXJhbWV0ZXIpLmJvb2xlYW5WYWx1ZSgpOwotCQkJc3VwZXIuc2V0UGFyYW1ldGVyKGNvbnN0cmFpbnRQYXJhbWV0ZXIpOwotCQl9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIFVOSVFVRV9DT05TVFJBSU5UOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRlKGZpbmFsIE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0KLSAgICAgICAgICAgIGlmKHVuaXF1ZSkgewotICAgICAgICAgICAgICAgIExpc3QgcmVzdWx0cyA9IHRoaXMuY29uc3RyYWludEhpYmVybmF0ZVRlbXBsYXRlLmV4ZWN1dGVGaW5kKCBuZXcgSGliZXJuYXRlQ2FsbGJhY2soKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0luSGliZXJuYXRlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEhpYmVybmF0ZUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmNyZWF0ZUNyaXRlcmlhKCBjb25zdHJhaW50T3duaW5nQ2xhc3MgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCBSZXN0cmljdGlvbnMuZXEoIGNvbnN0cmFpbnRQcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5saXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgaWYocmVzdWx0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBjb25zdHJhaW50UHJvcGVydHlOYW1lLCBjb25zdHJhaW50T3duaW5nQ2xhc3MsIHByb3BlcnR5VmFsdWUgfTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVqZWN0VmFsdWUoZXJyb3JzLFVOSVFVRV9DT05TVFJBSU5ULGFyZ3MsTWVzc2FnZUZvcm1hdC5mb3JtYXQoIERFRkFVTFRfTk9UX1VOSVFVRV9NRVNTQUdFLCBhcmdzICkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIHR5cGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCX0KLQkKLQotCXB1YmxpYyBDb25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eShDbGFzcyBjbGF6eiwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgcHJvcGVydHlUeXBlKSB7Ci0JCXN1cGVyKGNsYXp6LCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGliZXJuYXRlVGVtcGxhdGUuCi0JICovCi0JcHVibGljIEhpYmVybmF0ZVRlbXBsYXRlIGdldEhpYmVybmF0ZVRlbXBsYXRlKCkgewotCQlyZXR1cm4gaGliZXJuYXRlVGVtcGxhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gaGliZXJuYXRlVGVtcGxhdGUgVGhlIGhpYmVybmF0ZVRlbXBsYXRlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWJlcm5hdGVUZW1wbGF0ZShIaWJlcm5hdGVUZW1wbGF0ZSBoaWJlcm5hdGVUZW1wbGF0ZSkgewotCQl0aGlzLmhpYmVybmF0ZVRlbXBsYXRlID0gaGliZXJuYXRlVGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1bmlxdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCVVuaXF1ZUNvbnN0cmFpbnQgYyA9IChVbmlxdWVDb25zdHJhaW50KXRoaXMuYXBwbGllZENvbnN0cmFpbnRzLmdldCggVU5JUVVFX0NPTlNUUkFJTlQgKTsKLQkJaWYoYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGMuaXNVbmlxdWUoKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHVuaXF1ZSBUaGUgdW5pcXVlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpIHsKLQotCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5nZXQoIFVOSVFVRV9DT05TVFJBSU5UICk7Ci0JCQkKLQkJaWYoYyAhPSBudWxsKSB7Ci0JCQljLnNldFBhcmFtZXRlciggbmV3IEJvb2xlYW4odW5pcXVlKSApOwkJCQkKLQkJfQotCQllbHNlIHsKLQkJCWMgPSBuZXcgVW5pcXVlQ29uc3RyYWludCgpOwotCQkJYy5zZXRPd25pbmdDbGFzcyh0aGlzLm93bmluZ0NsYXNzKTsKLQkJCWMuc2V0UHJvcGVydHlOYW1lKHRoaXMucHJvcGVydHlOYW1lKTsKLQkJCWMuc2V0UGFyYW1ldGVyKG5ldyBCb29sZWFuKHVuaXF1ZSkpOwkJCQkJCi0JCQl0aGlzLmFwcGxpZWRDb25zdHJhaW50cy5wdXQoIFVOSVFVRV9DT05TVFJBSU5ULGMgKTsJCQkJCi0JCX0JCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eSN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBFcnJvcnMgZXJyb3JzKSB7Ci0JCi0JCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuYXBwbGllZENvbnN0cmFpbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJQ29uc3RyYWludCBjID0gKENvbnN0cmFpbnQpIGkubmV4dCgpOwotCQkJaWYoYyBpbnN0YW5jZW9mIFBlcnNpc3RlbnRDb25zdHJhaW50KSB7Ci0JCQkJUGVyc2lzdGVudENvbnN0cmFpbnQgcGMgPSAoUGVyc2lzdGVudENvbnN0cmFpbnQpYzsKLQkJCQlwYy5zZXRIaWJlcm5hdGVUZW1wbGF0ZSh0aGlzLmhpYmVybmF0ZVRlbXBsYXRlKTsKLQkJCQlwYy52YWxpZGF0ZSggcHJvcGVydHlWYWx1ZSwgZXJyb3JzICk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljLnZhbGlkYXRlKCBwcm9wZXJ0eVZhbHVlLCBlcnJvcnMpOwotCQkJfQotCQl9Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvdmFsaWRhdGlvbi9HcmFpbHNEb21haW5DbGFzc1ZhbGlkYXRvci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL3ZhbGlkYXRpb24vR3JhaWxzRG9tYWluQ2xhc3NWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczNTY3NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvdmFsaWRhdGlvbi9HcmFpbHNEb21haW5DbGFzc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLnZhbGlkYXRpb247Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuRG9tYWluQ2xhc3NNZXRob2RzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZVRlbXBsYXRlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIHZhbGlkYXRvciB0aGF0IHZhbGlkYXRlcyBhIGRvbWFpbiBjbGFzcyBiYXNlZCBvbiB0aGUgYXBwbGllZCBjb25zdHJhaW50cyAKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDctTm92LTIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc0RvbWFpbkNsYXNzVmFsaWRhdG9yIGltcGxlbWVudHMgVmFsaWRhdG9yIHsKLQotICAgIHByaXZhdGUgQ29sbGVjdGlvbiBjb25zdHJhaW5lZFByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBDbGFzcyB0YXJnZXRDbGFzczsKLSAgICBwcml2YXRlIEhpYmVybmF0ZVRlbXBsYXRlIHRlbXBsYXRlOwotICAgIHByaXZhdGUgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3M7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeTsKLQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRhcmdldENsYXNzLmVxdWFscyggY2xhenogKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb21haW5DbGFzcyBUaGUgZG9tYWluQ2xhc3MgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbkNsYXNzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMuZG9tYWluQ2xhc3MgPSBkb21haW5DbGFzczsKLSAgICAgICAgdGhpcy5kb21haW5DbGFzcy5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgICAgIHRoaXMudGFyZ2V0Q2xhc3MgPSB0aGlzLmRvbWFpbkNsYXNzLmdldENsYXp6KCk7Ci0gICAgICAgIHRoaXMuY29uc3RyYWluZWRQcm9wZXJ0aWVzID0gZG9tYWluQ2xhc3MuZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCkudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlc3Npb25GYWN0b3J5IFRoZSBzZXNzaW9uRmFjdG9yeSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkZhY3RvcnkoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5zZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5OwotICAgICAgICB0aGlzLnRlbXBsYXRlID0gbmV3IEhpYmVybmF0ZVRlbXBsYXRlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBvYmosIEVycm9ycyBlcnJvcnMpIHsKLSAgICAgICAgaWYoIWRvbWFpbkNsYXNzLmdldENsYXp6KCkuaXNJbnN0YW5jZShvYmopKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgWyIrb2JqKyJdIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbIitkb21haW5DbGFzcy5nZXRDbGF6eigpKyJdIHdoaWNoIHRoaXMgdmFsaWRhdG9yIGlzIGNvbmZpZ3VyZWQgZm9yIik7Ci0KLSAgICAgICAgQmVhbldyYXBwZXIgYmVhbiA9IG5ldyBCZWFuV3JhcHBlckltcGwob2JqKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25zdHJhaW5lZFByb3BlcnRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBDb25zdHJhaW5lZFBlcnNpc3RlbnRQcm9wZXJ0eSBjID0gKENvbnN0cmFpbmVkUGVyc2lzdGVudFByb3BlcnR5KWkubmV4dCgpOwotICAgICAgICAgICAgYy5zZXRIaWJlcm5hdGVUZW1wbGF0ZSh0aGlzLnRlbXBsYXRlKTsKLSAgICAgICAgICAgIGMudmFsaWRhdGUoYmVhbi5nZXRQcm9wZXJ0eVZhbHVlKCBjLmdldFByb3BlcnR5TmFtZSgpICksZXJyb3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKLSAgICAgICAgICAgICgoR3Jvb3Z5T2JqZWN0KW9iaikuc2V0UHJvcGVydHkoRG9tYWluQ2xhc3NNZXRob2RzLkVSUk9SU19QUk9QRVJUWSwgZXJyb3JzKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eShvYmosRG9tYWluQ2xhc3NNZXRob2RzLkVSUk9SU19QUk9QRVJUWSxlcnJvcnMpOwotICAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhpYmVybmF0ZVRlbXBsYXRlKEhpYmVybmF0ZVRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS92YWxpZGF0aW9uL1BlcnNpc3RlbnRDb25zdHJhaW50LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvdmFsaWRhdGlvbi9QZXJzaXN0ZW50Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWZjNDcyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS92YWxpZGF0aW9uL1BlcnNpc3RlbnRDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZVRlbXBsYXRlOwotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGEgcGVyc2lzdGVudCBjb25zdHJhaW50IHRoYXQgZXZhbHVhdGVzIHRoZSBkYXRhYmFzZS4KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTAtTm92LTIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW50Q29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQgewotCi0JLyoqCi0JICogU2V0cyB0aGUgaGliZXJuYXRlIHRlbXBsYXRlIHRvIHVzZSBmb3IgdGhlIHBlcnNpc3RlbnQgY29uc3RyYWludAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqLwotCXZvaWQgc2V0SGliZXJuYXRlVGVtcGxhdGUoSGliZXJuYXRlVGVtcGxhdGUgdGVtcGxhdGUpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZS5pbWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlLmltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwNzVmYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlLmltbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bW9kdWxlIHZlcnNpb249IjQiIHJlbGF0aXZlUGF0aHM9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIj4KLSAgPGNvbXBvbmVudCBuYW1lPSJNb2R1bGVSb290TWFuYWdlciIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciI+Ci0gICAgPG91dHB1dCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvLi4vLi4vdGFyZ2V0L2NsYXNzZXMiIC8+Ci0gICAgPGV4Y2x1ZGUtb3V0cHV0IC8+Ci0gICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIiBpc1Rlc3RTb3VyY2U9ImZhbHNlIiAvPgotICAgIDwvY29udGVudD4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJpbmhlcml0ZWRKZGsiIC8+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ic291cmNlRm9sZGVyIiBmb3JUZXN0cz0iZmFsc2UiIC8+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iR3Jvb3Z5IGZyb20gR3Jvb3Z5SiAwLjEuNiAoSXJpZGEpIiBsZXZlbD0iYXBwbGljYXRpb24iIC8+Ci0gICAgPG9yZGVyRW50cnlQcm9wZXJ0aWVzIC8+Ci0gIDwvY29tcG9uZW50PgotPC9tb2R1bGU+Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdEdyYWlsc1Jlc3BvbnNlSGFuZGxlckZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdEdyYWlsc1Jlc3BvbnNlSGFuZGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwOTRjNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNSZXNwb25zZUhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBTY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3RvcnkgdGhhdCB1c2VzIHRoZSB1cmkgZXh0ZW5zaW9uIHRvIGxvb2stdXAKLSAqIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlIGhhbmRsZXIuIElmIG5vbmUgZXhpc3RzIGZvciB0aGUgdXJpIHN1ZmZpeCBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGhhbmRsZXIKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc1Jlc3BvbnNlSGFuZGxlckZhY3RvcnkgaW1wbGVtZW50cwotCQlTY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLQlwcml2YXRlIFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyIGRlZmF1bHRSZXNwb25zZUhhbmRsZXI7Ci0JCi0JCi0JcHVibGljIERlZmF1bHRHcmFpbHNSZXNwb25zZUhhbmRsZXJGYWN0b3J5KEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBTY2FmZm9sZFJlc3BvbnNlSGFuZGxlciBkZWZhdWx0UmVzcG9uc2VIYW5kbGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmKGRlZmF1bHRSZXNwb25zZUhhbmRsZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFyZ3VtZW50ICdkZWZhdWx0UmVzcG9uc2VIYW5kbGVyJyBpcyByZXF1aXJlZCIpOwotCQlpZihhcHBsaWNhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXJndW1lbnQgJ2FwcGxpY2F0aW9uJyBpcyByZXF1aXJlZCIpOwkJCi0JCQotCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JCXRoaXMuZGVmYXVsdFJlc3BvbnNlSGFuZGxlciA9IGRlZmF1bHRSZXNwb25zZUhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyIGdldFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyKFN0cmluZyB1cmkpIHsKLQkJLy8gZm9yIG5vdyBqdXN0IHJldHVybiB0aGUgZGVmYXVsdAotCQlyZXR1cm4gZGVmYXVsdFJlc3BvbnNlSGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNTY2FmZm9sZFZpZXdSZXNvbHZlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzU2NhZmZvbGRWaWV3UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkMmQxNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNTY2FmZm9sZFZpZXdSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQ29udHJvbGxlckNsYXNzOwotLyoqCi0gKiBBIHZpZXcgcmVzb2x2ZXIgdGhhdCB1c2VzIGEgR3JhaWxzQXBwbGljYXRpb24gaW5zdGFuY2UgdG8gcmVzb2x2ZSB2aWV3IG5hbWVzIGZyb20gdXJpcwotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAzMCBOb3YgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyYWlsc1NjYWZmb2xkVmlld1Jlc29sdmVyIGltcGxlbWVudHMgU2NhZmZvbGRWaWV3UmVzb2x2ZXIgewotCi0JcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLQotCXB1YmxpYyBEZWZhdWx0R3JhaWxzU2NhZmZvbGRWaWV3UmVzb2x2ZXIoR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVZpZXdGb3JVcmkoU3RyaW5nIHVyaSkgewotCQlHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gYXBwbGljYXRpb24uZ2V0Q29udHJvbGxlckJ5VVJJKHVyaSk7Ci0JCQotCQlpZihjb250cm9sbGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRyb2xsZXJDbGFzcy5nZXRWaWV3QnlVUkkodXJpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVWaWV3Rm9yVXJpQW5kQWN0aW9uKFN0cmluZyB1cmksIFN0cmluZyBhY3Rpb24pIHsKLQkJaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhhY3Rpb24pKSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZVZpZXdGb3JVcmkodXJpKTsKLQkJfQotCQlHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gYXBwbGljYXRpb24uZ2V0Q29udHJvbGxlckJ5VVJJKHVyaSk7Ci0JCQotCQlpZihjb250cm9sbGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRyb2xsZXJDbGFzcy5nZXRWaWV3QnlOYW1lKGFjdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNTY2FmZm9sZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNTY2FmZm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDQxYTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzU2NhZmZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuZXhjZXB0aW9ucy5TY2FmZm9sZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNoYWluRHluYW1pY01ldGhvZDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNvbnRyb2xsZXJEeW5hbWljTWV0aG9kczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLlJlZGlyZWN0RHluYW1pY01ldGhvZDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLlJlbmRlckR5bmFtaWNNZXRob2Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc2NhZmZvbGRpbmcgZm9yIEdyYWlscyBkb21haW4gY2xhc3MgYW5kIGNvbnRyb2xsZXIKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcmFpbHNTY2FmZm9sZGVyIGltcGxlbWVudHMgR3JhaWxzU2NhZmZvbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQUNUSU9OID0gImluZGV4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9BQ1RJT04gPSAibGlzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfQUNUSU9OID0gInNob3ciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX0FDVElPTiA9ICJlZGl0IjsJCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQUNUSU9OID0gImRlbGV0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BQ1RJT04gPSAiY3JlYXRlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BQ1RJT04gPSAic2F2ZSI7CQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9BQ1RJT04gPSAidXBkYXRlIjsJCi0JCi0JLy8gVE9ETzogSW1wbGVtZW50IHNlYXJjaCBzY2FmZm9sZGluZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfQUNUSU9OID0gInNlYXJjaCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfQUNUSU9OID0gImZpbmQiOwkKLQkKLQkKLQotCXByaXZhdGUgU2NhZmZvbGRSZXF1ZXN0SGFuZGxlciBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyOwotCXByaXZhdGUgU2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5IHNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBleHRlbmRzIGNsb3N1cmUgYW5kIHJldHJpZXZlcyB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50cyBmcm9tIHRoZSBjb250cm9sbGVyCi0JICogVGhpcyBpcyB1c2VkIHRvIGluamVjdCBjbG9zdXJlIHByb3BlcnRpZXMgaW50byBjb250cm9sbGVycyBzbyBjb250cm9sbGVyIGFjdGlvbnMgYXBwZWFyIGFzIGlmIGJ5IG1hZ2ljLgotCSAqLwotCXN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFjdGlvbiBleHRlbmRzIENsb3N1cmUgewotCQlwcm90ZWN0ZWQgR3Jvb3Z5T2JqZWN0IGNvbnRyb2xsZXI7Ci0JCXByb3RlY3RlZCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLQkJcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7Ci0JCXByb3RlY3RlZCBTY2FmZm9sZFJlcXVlc3RIYW5kbGVyIHNjYWZmb2xkUmVxdWVzdEhhbmRsZXI7Ci0JCXByb3RlY3RlZCBTY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3Rvcnkgc2NhZmZvbGRSZXNwb25zZUZhY3Rvcnk7Ci0JCXByb3RlY3RlZCBTY2FmZm9sZFJlc3BvbnNlSGFuZGxlciBzY2FmZm9sZFJlc3BvbnNlSGFuZGxlcjsKLQkJCi0JCXB1YmxpYyBBYnN0cmFjdEFjdGlvbihPYmplY3Qgb3duZXIpIHsKLQkJCXN1cGVyKG93bmVyKTsKLQkJCWNvbnRyb2xsZXIgPSAoR3Jvb3Z5T2JqZWN0KWdldE93bmVyKCk7Ci0JCQlyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCljb250cm9sbGVyLmdldFByb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5SRVFVRVNUX1BST1BFUlRZKTsKLQkJCXJlc3BvbnNlID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpY29udHJvbGxlci5nZXRQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuUkVTUE9OU0VfUFJPUEVSVFkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyIFRoZSBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIoCi0JCQkJU2NhZmZvbGRSZXF1ZXN0SGFuZGxlciBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyKSB7Ci0JCQl0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXIgPSBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5KFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQl0aGlzLnNjYWZmb2xkUmVzcG9uc2VGYWN0b3J5ID0gZmFjdG9yeTsKLQkJCXRoaXMuc2NhZmZvbGRSZXNwb25zZUhhbmRsZXIgPSB0aGlzLnNjYWZmb2xkUmVzcG9uc2VGYWN0b3J5LmdldFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKLQkJfQkJCQkJCi0JfQotCQotCS8qKgotCSAqIEEgY2xvc3VyZSB0aGF0IGhhbmRsZXMgYSBjYWxsIHRvIGEgc2NhZmZvbGRlZCBsaXN0IGFjdGlvbiAgICAKLQkgKi8KLQljbGFzcyBMaXN0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotCQlwdWJsaWMgTGlzdEFjdGlvbihPYmplY3Qgb3duZXIpIHsKLQkJCXN1cGVyKG93bmVyKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2NhbGwoamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsKE9iamVjdFtdIGFyZ3MpIHsKLQkJCU1hcCBtb2RlbCA9IHRoaXMuc2NhZmZvbGRSZXF1ZXN0SGFuZGxlci5oYW5kbGVMaXN0KHJlcXVlc3QscmVzcG9uc2UpOwotCQkJcmV0dXJuIHNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKHJlcXVlc3QscmVzcG9uc2UsTElTVF9BQ1RJT04sbW9kZWwpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEEgY2xvc3VyZSB0aGF0IGhhbmRsZXMgYSBjYWxsIHRvIGEgc2NhZmZvbGRlZCBsaXN0IGFjdGlvbgotCSAqLwotCWNsYXNzIEluZGV4QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotCQlwdWJsaWMgSW5kZXhBY3Rpb24oT2JqZWN0IG93bmVyKSB7Ci0JCQlzdXBlcihvd25lcik7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNjYWxsKGphdmEubGFuZy5PYmplY3RbXSkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgY2FsbChPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgICAgICBNYXAgYXJndW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGFyZ3VtZW50cy5wdXQoIFJlZGlyZWN0RHluYW1pY01ldGhvZC5BUkdVTUVOVF9BQ1RJT04sIExJU1RfQUNUSU9OICk7Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlci5pbnZva2VNZXRob2QoUmVkaXJlY3REeW5hbWljTWV0aG9kLk1FVEhPRF9TSUdOQVRVUkUsbmV3IE9iamVjdFtdeyBhcmd1bWVudHMgfSk7Ci0JCX0KLQotCX0KLQotICAgIC8qKgotCSAqIEEgY2xvc3VyZSB0aGF0IGhhbmRsZXMgYSBjYWxsIHRvIGEgc2NhZmZvbGRlZCBsaXN0IGFjdGlvbiAgICAKLQkgKi8KLQljbGFzcyBDcmVhdGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0JCXB1YmxpYyBDcmVhdGVBY3Rpb24oT2JqZWN0IG93bmVyKSB7Ci0JCQlzdXBlcihvd25lcik7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNjYWxsKGphdmEubGFuZy5PYmplY3RbXSkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgY2FsbChPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgICAgICBNYXAgbW9kZWwgPSB0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXIuaGFuZGxlQ3JlYXRlKHJlcXVlc3QscmVzcG9uc2UsbmV3IERlZmF1bHRTY2FmZm9sZENhbGxiYWNrKCkpOwotICAgICAgICAgICAgcmV0dXJuIHNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKHJlcXVlc3QscmVzcG9uc2UsQ1JFQVRFX0FDVElPTixtb2RlbCk7Ci0JCX0KLQkJCi0JfQkKLQkKLQkvKioKLQkgKiBBIGNsb3N1cmUgYWN0aW9uIHRoYXQgaW1wbGVtZW50cyBzaG93aW5nIGEgc2NhZmZvbGRlZCBpbnN0YW5jZSBieSBpZC4gSWYgdGhlIGlkIGlzIG5vdAotCSAqIHNwZWNpZmllZCBpdCByZWRpcmVjdHMgdG8gdGhlICJsaXN0IiBhY3Rpb24gCi0JICovCi0JY2xhc3MgU2hvd0FjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLQotCQlwdWJsaWMgU2hvd0FjdGlvbihPYmplY3Qgb3duZXIpIHsKLQkJCXN1cGVyKG93bmVyKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2NhbGwoamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsKE9iamVjdFtdIGFyZ3MpIHsKLQkJCQotCQkJU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBEZWZhdWx0U2NhZmZvbGRDYWxsYmFjaygpOwotCQkJTWFwIG1vZGVsID0gdGhpcy5zY2FmZm9sZFJlcXVlc3RIYW5kbGVyLmhhbmRsZVNob3cocmVxdWVzdCxyZXNwb25zZSwgY2FsbGJhY2spOwotCQkJCi0JCQlpZihjYWxsYmFjay5pc0ludm9rZWQoKSkgewkJCQkKLQkJCQlyZXR1cm4gc2NhZmZvbGRSZXNwb25zZUhhbmRsZXIuaGFuZGxlUmVzcG9uc2UocmVxdWVzdCxyZXNwb25zZSxTSE9XX0FDVElPTixtb2RlbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlNYXAgYXJndW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlhcmd1bWVudHMucHV0KCBSZWRpcmVjdER5bmFtaWNNZXRob2QuQVJHVU1FTlRfQUNUSU9OLCBMSVNUX0FDVElPTiApOwotCQkJCXJldHVybiBjb250cm9sbGVyLmludm9rZU1ldGhvZChSZWRpcmVjdER5bmFtaWNNZXRob2QuTUVUSE9EX1NJR05BVFVSRSxuZXcgT2JqZWN0W117IGFyZ3VtZW50cyB9KTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQSBjbG9zdXJlIGFjdGlvbiB0aGF0IGltcGxlbWVudHMgZWRpdGluZyBhIHNjYWZmb2xkZWQgaW5zdGFuY2UgYnkgaWQuIEF0IHRoZSBtb21lbnQgaXQgaXMgdGhlIHNhbWUKLQkgKiBhcyBTaG93QWN0aW9uLCBidXQgY291bGQgZGlmZmVyIGluIHRoZSBmdXR1cmUgYXMgaXQgbWF5IGxvYWQgb3RoZXIgbW9kZWwgaW5zdGFuY2VzIHRvIHN1cHBvcnQgZWRpdGluZwotCSAqIGFuIGluc3RhbmNlIGluY2x1ZGluZyB0aGUgR3JhaWxzRG9tYWluQ2xhc3MgaW5zdGFuY2UKLQkgKi8KLQljbGFzcyBFZGl0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotCi0JCXB1YmxpYyBFZGl0QWN0aW9uKE9iamVjdCBvd25lcikgewotCQkJc3VwZXIob3duZXIpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjY2FsbChqYXZhLmxhbmcuT2JqZWN0W10pCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gYXJncykgewotCQkJCi0JCQlTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IERlZmF1bHRTY2FmZm9sZENhbGxiYWNrKCk7Ci0JCQlNYXAgbW9kZWwgPSB0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXIuaGFuZGxlU2hvdyhyZXF1ZXN0LHJlc3BvbnNlLCBjYWxsYmFjayk7Ci0JCQkKLQkJCWlmKGNhbGxiYWNrLmlzSW52b2tlZCgpKSB7Ci0JCQkJcmV0dXJuIHNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKHJlcXVlc3QscmVzcG9uc2UsRURJVF9BQ1RJT04sbW9kZWwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQ2xvc3VyZSBsaXN0QWN0aW9uID0gKENsb3N1cmUpY29udHJvbGxlci5nZXRQcm9wZXJ0eShMSVNUX0FDVElPTik7Ci0JCQkJTWFwIGFyZ3VtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJYXJndW1lbnRzLnB1dCggUmVkaXJlY3REeW5hbWljTWV0aG9kLkFSR1VNRU5UX0FDVElPTiwgbGlzdEFjdGlvbiApOwotCQkJCWFyZ3VtZW50cy5wdXQoIFJlZGlyZWN0RHluYW1pY01ldGhvZC5BUkdVTUVOVF9FUlJPUlMsIGNhbGxiYWNrLmdldEVycm9ycygpICk7Ci0JCQkJcmV0dXJuIGNvbnRyb2xsZXIuaW52b2tlTWV0aG9kKFJlZGlyZWN0RHluYW1pY01ldGhvZC5NRVRIT0RfU0lHTkFUVVJFLG5ldyBPYmplY3RbXXsgYXJndW1lbnRzIH0pOwotCQkJfQotCQl9Ci0JCQotCX0JCi0JCi0JLyoqCi0JICogQSBjbG9zdXJlIGFjdGlvbiB0aGF0IGltcGxlbWVudHMgZGVsZXRpb24gb2YgYSBzY2FmZm9sZGVkIGluc3RhbmNlIGJ5IGlkLiBUaGUgaW5zdGFuY2UgaXMgZGVsZXRlZCBhbmQgdGhlbgotCSAqIHRoZSBhY3Rpb24gcmVkaXJlY3RzIHRvICJsaXN0IgotCSAqLwotCWNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKE9iamVjdCBvd25lcikgewotCQkJc3VwZXIob3duZXIpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjY2FsbChqYXZhLmxhbmcuT2JqZWN0W10pCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gYXJncykgewotCQkJCi0JCQlTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IERlZmF1bHRTY2FmZm9sZENhbGxiYWNrKCk7Ci0JCQkvLyBkZWxldGUKLQkJCXRoaXMuc2NhZmZvbGRSZXF1ZXN0SGFuZGxlci5oYW5kbGVEZWxldGUocmVxdWVzdCxyZXNwb25zZSwgY2FsbGJhY2spOwotCQkJCi0JCQkvLyBub3cgcmVkaXJlY3QgdG8gbGlzdAotCQkJQ2xvc3VyZSBsaXN0QWN0aW9uID0gKENsb3N1cmUpY29udHJvbGxlci5nZXRQcm9wZXJ0eShMSVNUX0FDVElPTik7Ci0JCQlNYXAgYXJndW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWFyZ3VtZW50cy5wdXQoIFJlZGlyZWN0RHluYW1pY01ldGhvZC5BUkdVTUVOVF9BQ1RJT04sIGxpc3RBY3Rpb24gKTsKLQkJCXJldHVybiBjb250cm9sbGVyLmludm9rZU1ldGhvZChSZWRpcmVjdER5bmFtaWNNZXRob2QuTUVUSE9EX1NJR05BVFVSRSxuZXcgT2JqZWN0W117IGFyZ3VtZW50cyB9KTsJCQkJCQotCQl9Ci0JCQotCX0JCi0JCi0JLyoqCi0JICogQSBjbG9zdXJlIGFjdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIHNhdmluZyBvZiBuZXcgc2NhZmZvbGVkIGluc3RhbmNlcy4gSWYgdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0JICogdGhlIGFjdGlvbiByZWRpcmVjdHMgdG8gInNob3ciIGZvciB0aGUgaWQsIG90aGVyd2lzZSBpdCByZWRpcmVjdHMgdG8gImNyZWF0ZSIKLQkgKi8KLQljbGFzcyBTYXZlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gewotCi0JCXB1YmxpYyBTYXZlQWN0aW9uKE9iamVjdCBvd25lcikgewotCQkJc3VwZXIob3duZXIpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjY2FsbChqYXZhLmxhbmcuT2JqZWN0W10pCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gYXJncykgewotCQkJCi0JCQlTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IERlZmF1bHRTY2FmZm9sZENhbGxiYWNrKCk7Ci0JCQkvLyBzYXZlCi0JCQlNYXAgbW9kZWwgPSB0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXIuaGFuZGxlU2F2ZShyZXF1ZXN0LHJlc3BvbnNlLCBjYWxsYmFjayk7Ci0JCQlpZihjYWxsYmFjay5pc0ludm9rZWQoKSkgewotCQkJCUNsb3N1cmUgc2hvd0FjdGlvbiA9IChDbG9zdXJlKWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoU0hPV19BQ1RJT04pOwotCQkJCU1hcCBhcmd1bWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWFyZ3VtZW50cy5wdXQoIFJlZGlyZWN0RHluYW1pY01ldGhvZC5BUkdVTUVOVF9BQ1RJT04sIHNob3dBY3Rpb24gKTsKLSAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0KCBSZWRpcmVjdER5bmFtaWNNZXRob2QuQVJHVU1FTlRfSUQsIG1vZGVsLmdldChDaGFpbkR5bmFtaWNNZXRob2QuQVJHVU1FTlRfSUQpICk7Ci0JCQkJcmV0dXJuIGNvbnRyb2xsZXIuaW52b2tlTWV0aG9kKFJlZGlyZWN0RHluYW1pY01ldGhvZC5NRVRIT0RfU0lHTkFUVVJFLG5ldyBPYmplY3RbXXsgYXJndW1lbnRzIH0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWFwIGFyZ3VtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJYXJndW1lbnRzLnB1dCggUmVuZGVyRHluYW1pY01ldGhvZC5BUkdVTUVOVF9WSUVXLCBDUkVBVEVfQUNUSU9OICk7Ci0JCQkJYXJndW1lbnRzLnB1dCggUmVuZGVyRHluYW1pY01ldGhvZC5BUkdVTUVOVF9NT0RFTCxtb2RlbCApOwotCQkJCXJldHVybiBjb250cm9sbGVyLmludm9rZU1ldGhvZChSZW5kZXJEeW5hbWljTWV0aG9kLk1FVEhPRF9TSUdOQVRVUkUsbmV3IE9iamVjdFtdeyBhcmd1bWVudHMgfSk7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQl9CQotCQotCS8qKgotCSAqIEEgY2xvc3VyZSBhY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSB1cGRhdGluZyBvZiBhbiBleGlzdGluZyBzY2FmZm9sZWQgaW5zdGFuY2VzLiBJZiB0aGUgaW5zdGFuY2UgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkKLQkgKiB0aGUgYWN0aW9uIHJlZGlyZWN0cyB0byAic2hvdyIgZm9yIHRoZSBpZCwgb3RoZXJ3aXNlIGl0IHJlZGlyZWN0cyB0byAiZWRpdCIKLQkgKi8KLQljbGFzcyBVcGRhdGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7Ci0KLQkJcHVibGljIFVwZGF0ZUFjdGlvbihPYmplY3Qgb3duZXIpIHsKLQkJCXN1cGVyKG93bmVyKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2NhbGwoamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsKE9iamVjdFtdIGFyZ3MpIHsKLQkJCQotCQkJU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBEZWZhdWx0U2NhZmZvbGRDYWxsYmFjaygpOwotCQkJLy8gc2F2ZQotCQkJTWFwIG1vZGVsID0gdGhpcy5zY2FmZm9sZFJlcXVlc3RIYW5kbGVyLmhhbmRsZVVwZGF0ZShyZXF1ZXN0LHJlc3BvbnNlLCBjYWxsYmFjayk7Ci0JCQlpZihjYWxsYmFjay5pc0ludm9rZWQoKSkgewotCQkJCUNsb3N1cmUgc2hvd0FjdGlvbiA9IChDbG9zdXJlKWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoU0hPV19BQ1RJT04pOwotCQkJCU1hcCBhcmd1bWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWFyZ3VtZW50cy5wdXQoIENoYWluRHluYW1pY01ldGhvZC5BUkdVTUVOVF9BQ1RJT04sIHNob3dBY3Rpb24gKTsJCQkJCi0JCQkJYXJndW1lbnRzLnB1dCggQ2hhaW5EeW5hbWljTWV0aG9kLkFSR1VNRU5UX01PREVMLCBtb2RlbCApOwotCQkJCWFyZ3VtZW50cy5wdXQoIENoYWluRHluYW1pY01ldGhvZC5BUkdVTUVOVF9QQVJBTVMsIG1vZGVsICk7Ci0JCQkJcmV0dXJuIGNvbnRyb2xsZXIuaW52b2tlTWV0aG9kKENoYWluRHluYW1pY01ldGhvZC5NRVRIT0RfU0lHTkFUVVJFLG5ldyBPYmplY3RbXXsgYXJndW1lbnRzIH0pOwkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCU1hcCBhcmd1bWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWFyZ3VtZW50cy5wdXQoIFJlbmRlckR5bmFtaWNNZXRob2QuQVJHVU1FTlRfVklFVywgRURJVF9BQ1RJT04gKTsKLQkJCQlhcmd1bWVudHMucHV0KCBSZW5kZXJEeW5hbWljTWV0aG9kLkFSR1VNRU5UX01PREVMLG1vZGVsICk7Ci0JCQkJcmV0dXJuIGNvbnRyb2xsZXIuaW52b2tlTWV0aG9kKFJlbmRlckR5bmFtaWNNZXRob2QuTUVUSE9EX1NJR05BVFVSRSxuZXcgT2JqZWN0W117IGFyZ3VtZW50cyB9KTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCX0JCQotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGFjdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGFjdGlvbkNsYXNzVG9OYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEFDVElPTl9OQU1FUzsKLQkKLQlzdGF0aWMgewotCQlhY3Rpb25zLnB1dCggSU5ERVhfQUNUSU9OLCBJbmRleEFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoSW5kZXhBY3Rpb24uY2xhc3MsIElOREVYX0FDVElPTik7Ci0KLSAgICAgICAgYWN0aW9ucy5wdXQoIExJU1RfQUNUSU9OLCBMaXN0QWN0aW9uLmNsYXNzLmdldENvbnN0cnVjdG9ycygpWzBdICk7Ci0JCWFjdGlvbkNsYXNzVG9OYW1lTWFwLnB1dChMaXN0QWN0aW9uLmNsYXNzLCBMSVNUX0FDVElPTik7Ci0JCQotCQlhY3Rpb25zLnB1dCggU0hPV19BQ1RJT04sIFNob3dBY3Rpb24uY2xhc3MuZ2V0Q29uc3RydWN0b3JzKClbMF0gKTsKLQkJYWN0aW9uQ2xhc3NUb05hbWVNYXAucHV0KFNob3dBY3Rpb24uY2xhc3MsIFNIT1dfQUNUSU9OKTsKLQkJCi0JCWFjdGlvbnMucHV0KCBFRElUX0FDVElPTiwgRWRpdEFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoRWRpdEFjdGlvbi5jbGFzcywgRURJVF9BQ1RJT04pOwotCQkKLQkJYWN0aW9ucy5wdXQoIERFTEVURV9BQ1RJT04sIERlbGV0ZUFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoRGVsZXRlQWN0aW9uLmNsYXNzLCBERUxFVEVfQUNUSU9OKTsKLQkJCi0JCWFjdGlvbnMucHV0KCBTQVZFX0FDVElPTiwgU2F2ZUFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoU2F2ZUFjdGlvbi5jbGFzcywgU0FWRV9BQ1RJT04pOwotCQkKLQkJYWN0aW9ucy5wdXQoIFVQREFURV9BQ1RJT04sIFVwZGF0ZUFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoVXBkYXRlQWN0aW9uLmNsYXNzLCBVUERBVEVfQUNUSU9OKTsJCQotCQkKLQkJYWN0aW9ucy5wdXQoIENSRUFURV9BQ1RJT04sIENyZWF0ZUFjdGlvbi5jbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKVswXSApOwotCQlhY3Rpb25DbGFzc1RvTmFtZU1hcC5wdXQoQ3JlYXRlQWN0aW9uLmNsYXNzLCBDUkVBVEVfQUNUSU9OKTsJCQkJCi0JCQotCQkvLyBzZXR1cCB0aGUgYWN0aW9uIG5hbWVzCi0JCUFDVElPTl9OQU1FUyA9IChTdHJpbmdbXSlhY3Rpb25zLmtleVNldCgpLnRvQXJyYXkoIG5ldyBTdHJpbmdbYWN0aW9ucy5rZXlTZXQoKS5zaXplKCldICk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQWN0aW9uKFN0cmluZyBhY3Rpb25OYW1lKSB7Ci0JCWlmKGFjdGlvbnMuY29udGFpbnNLZXkoYWN0aW9uTmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDbG9zdXJlIGdldEFjdGlvbihHcm9vdnlPYmplY3QgY29udHJvbGxlcixTdHJpbmcgYWN0aW9uTmFtZSkgewotCQlDb25zdHJ1Y3RvciBjID0gKENvbnN0cnVjdG9yKWFjdGlvbnMuZ2V0KGFjdGlvbk5hbWUpOwotCQlBYnN0cmFjdEFjdGlvbiBhY3Rpb247Ci0JCXRyeSB7Ci0JCQlhY3Rpb24gPSAoQWJzdHJhY3RBY3Rpb24pYy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117dGhpcywgY29udHJvbGxlciB9KTsKLQkJCWFjdGlvbi5zZXRTY2FmZm9sZFJlcXVlc3RIYW5kbGVyKHRoaXMuc2NhZmZvbGRSZXF1ZXN0SGFuZGxlcik7CQotCQkJYWN0aW9uLnNldFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeSh0aGlzLnNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2NhZmZvbGRpbmdFeGNlcHRpb24oIklsbGVnYWwgYXJndW1lbnQgaW5zdGFudGlhdGluZyBhY3Rpb24gWyIrYWN0aW9uTmFtZSsiXSBmb3IgY29udHJvbGxlciBbIitjb250cm9sbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNjYWZmb2xkaW5nRXhjZXB0aW9uKCJFcnJvciBpbnN0YW50aWF0aW5nIGFjdGlvbiBbIithY3Rpb25OYW1lKyJdIGZvciBjb250cm9sbGVyIFsiK2NvbnRyb2xsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2NhZmZvbGRpbmdFeGNlcHRpb24oIklsbGVnYWwgYWNjZXNzIGluc3RhbnRpYXRpbmcgYWN0aW9uIFsiK2FjdGlvbk5hbWUrIl0gZm9yIGNvbnRyb2xsZXIgWyIrY29udHJvbGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTY2FmZm9sZGluZ0V4Y2VwdGlvbigiSW52b2NhdGlvbiBlcnJvciBpbnN0YW50aWF0aW5nIGFjdGlvbiBbIithY3Rpb25OYW1lKyJdIGZvciBjb250cm9sbGVyIFsiK2NvbnRyb2xsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0KLQkvKioKLQkgKiBAcGFyYW0gc2NhZmZvbGRSZXF1ZXN0SGFuZGxlciBUaGUgc2NhZmZvbGRSZXF1ZXN0SGFuZGxlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhZmZvbGRSZXF1ZXN0SGFuZGxlcigKLQkJCVNjYWZmb2xkUmVxdWVzdEhhbmRsZXIgc2NhZmZvbGRSZXF1ZXN0SGFuZGxlcikgewotCQl0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXIgPSBzY2FmZm9sZFJlcXVlc3RIYW5kbGVyOwkJCi0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIHNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeSBUaGUgc2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3RvcnkoCi0JCQlTY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3Rvcnkgc2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5KSB7Ci0JCXRoaXMuc2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5ID0gc2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRBY3Rpb25OYW1lcygpIHsJCQotCQlyZXR1cm4gQUNUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTmFtZShDbG9zdXJlIGFjdGlvbikgewotCQlyZXR1cm4gKFN0cmluZylhY3Rpb25DbGFzc1RvTmFtZU1hcC5nZXQoYWN0aW9uLmdldENsYXNzKCkpOwotCX0KLQotICAgIHB1YmxpYyBTY2FmZm9sZFJlcXVlc3RIYW5kbGVyIGdldFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNjYWZmb2xkUmVxdWVzdEhhbmRsZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvci5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvci5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzJiYWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDbGFzc1V0aWxzIGFzIEdDVTsKLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2VuZXJhdG9yIHRoYXQgZ2VuZXJhdGVzIGdyYWlscyBhcnRpZmFjdHMgKGNvbnRyb2xsZXJzLCB2aWV3cyBldGMuKQotICogZnJvbSB0aGUgZG9tYWluIG1vZGVsCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDktRmViLTIwMDYKLSAqLwotY2xhc3MgRGVmYXVsdEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yIGltcGxlbWVudHMgR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IgIHsKLQotICAgIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0R3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuY2xhc3MpOwotICAgIEBQcm9wZXJ0eSBTdHJpbmcgYmFzZWRpcgotICAgIEBQcm9wZXJ0eSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlCi0gICAgZGVmIGVuZ2luZSA9IG5ldyBncm9vdnkudGV4dC5TaW1wbGVUZW1wbGF0ZUVuZ2luZSgpCi0KLSAgICAvLyBhIGNsb3N1cmUgdGhhdCB1c2VzIHRoZSB0eXBlIHRvIHJlbmRlciB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yCi0gICAgZGVmIHJlbmRlckVkaXRvciA9IHsgcHJvcGVydHkgLT4KLSAgICAgICAgZGVmIGRvbWFpbkNsYXNzID0gcHJvcGVydHkuZG9tYWluQ2xhc3MKLSAgICAgICAgZGVmIGNwID0gZG9tYWluQ2xhc3MuY29uc3RyYWluZWRQcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdCi0gICAgICAgIAotICAgICAgICBkZWYgZGlzcGxheSA9IChjcCA/IGNwLmRpc3BsYXkgOiB0cnVlKSAgICAgICAgCi0gICAgICAgIGlmKCFkaXNwbGF5KSByZXR1cm4gJycKLSAgICAgICAgCi0JZGVmIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIjx0ciBjbGFzcz0ncHJvcCc+IikKLQlidWYgPDwgIjx0ZCB2YWxpZ249J3RvcCcgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHdpZHRoPScyMCUnPjxsYWJlbCBmb3I9JyR7cHJvcGVydHkubmFtZX0nPiR7cHJvcGVydHkubmF0dXJhbE5hbWV9OjwvbGFiZWw+PC90ZD4iCi0JYnVmIDw8ICI8dGQgdmFsaWduPSd0b3AnIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB3aWR0aD0nODAlJyBjbGFzcz0nXCR7aGFzRXJyb3JzKGJlYW46JHtkb21haW5DbGFzcy5wcm9wZXJ0eU5hbWV9LGZpZWxkOicke3Byb3BlcnR5Lm5hbWV9JywnZXJyb3JzJyl9Jz4iCi0gICAgICAgICAgICBpZihOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwcm9wZXJ0eS50eXBlKSkKLSAgICAgICAgICAgICAgICBidWYgPDwgcmVuZGVyTnVtYmVyRWRpdG9yKGRvbWFpbkNsYXNzLHByb3BlcnR5KQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eS50eXBlID09IFN0cmluZy5jbGFzcykKLSAgICAgICAgICAgICAgICBidWYgPDwgcmVuZGVyU3RyaW5nRWRpdG9yKGRvbWFpbkNsYXNzLHByb3BlcnR5KQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eS50eXBlID09IEJvb2xlYW4uY2xhc3MgfHwgcHJvcGVydHkudHlwZSA9PSBib29sZWFuLmNsYXNzKQotICAgICAgICAgICAgICAgIGJ1ZiA8PCByZW5kZXJCb29sZWFuRWRpdG9yKGRvbWFpbkNsYXNzLHByb3BlcnR5KQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eS50eXBlID09IERhdGUuY2xhc3MpCi0gICAgICAgICAgICAgICAgYnVmIDw8IHJlbmRlckRhdGVFZGl0b3IoZG9tYWluQ2xhc3MscHJvcGVydHkpCi0gICAgICAgICAgICBlbHNlIGlmKHByb3BlcnR5LnR5cGUgPT0gVGltZVpvbmUuY2xhc3MpCi0gICAgICAgICAgICAgICAgYnVmIDw8IHJlbmRlclNlbGVjdFR5cGVFZGl0b3IoInRpbWVab25lIixkb21haW5DbGFzcyxwcm9wZXJ0eSkKLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHkudHlwZSA9PSBMb2NhbGUuY2xhc3MpCi0gICAgICAgICAgICAgICAgYnVmIDw8IHJlbmRlclNlbGVjdFR5cGVFZGl0b3IoImxvY2FsZSIsZG9tYWluQ2xhc3MscHJvcGVydHkpCi0gICAgICAgICAgICBlbHNlIGlmKHByb3BlcnR5LnR5cGUgPT0gQ3VycmVuY3kuY2xhc3MpCi0gICAgICAgICAgICAgICAgYnVmIDw8IHJlbmRlclNlbGVjdFR5cGVFZGl0b3IoImN1cnJlbmN5Iixkb21haW5DbGFzcyxwcm9wZXJ0eSkKLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHkudHlwZT09KFtdIGFzIEJ5dGVbXSkuY2xhc3MpIC8vVE9ETzogQnVnIGluIGdyb292eSBtZWFucyBpIGhhdmUgdG8gZG8gdGhpcyA6KAotICAgICAgICAgICAgICAgIGJ1ZiA8PCByZW5kZXJCeXRlQXJyYXlFZGl0b3IoZG9tYWluQ2xhc3MscHJvcGVydHkpCi0gICAgICAgICAgICBlbHNlIGlmKHByb3BlcnR5Lm1hbnlUb09uZSB8fCBwcm9wZXJ0eS5vbmVUb09uZSkKLSAgICAgICAgICAgICAgICBidWYgPDwgcmVuZGVyTWFueVRvT25lKGRvbWFpbkNsYXNzLHByb3BlcnR5KQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eS5vbmVUb01hbnkgfHwgcHJvcGVydHkubWFueVRvTWFueSkKLSAgICAgICAgICAgICAgICBidWYgPDwgcmVuZGVyT25lVG9NYW55KGRvbWFpbkNsYXNzLHByb3BlcnR5KQotICAgICAgICAgICAgICAgIAotICAgICAgIGJ1ZiA8PCAnPC90ZD48L3RyPicKLSAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVZpZXdzKEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzLCBTdHJpbmcgZGVzdGRpcikgewotICAgICAgICBpZighZGVzdGRpcikKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50IFtkZXN0ZGlyXSBub3Qgc3BlY2lmaWVkIikKLQotICAgICAgICBkZWYgdmlld3NEaXIgPSBuZXcgRmlsZSgiJHtkZXN0ZGlyfS9ncmFpbHMtYXBwL3ZpZXdzLyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfSIpCi0gICAgICAgIGlmKCF2aWV3c0Rpci5leGlzdHMoKSkKLSAgICAgICAgICAgIHZpZXdzRGlyLm1rZGlycygpCi0KLSAgICAgICAgTE9HLmluZm8oIkdlbmVyYXRpbmcgbGlzdCB2aWV3IGZvciBkb21haW4gY2xhc3MgWyR7ZG9tYWluQ2xhc3MuZnVsbE5hbWV9XSIpCi0gICAgICAgIGdlbmVyYXRlTGlzdFZpZXcoZG9tYWluQ2xhc3Msdmlld3NEaXIpCi0gICAgICAgIExPRy5pbmZvKCJHZW5lcmF0aW5nIHNob3cgdmlldyBmb3IgZG9tYWluIGNsYXNzIFske2RvbWFpbkNsYXNzLmZ1bGxOYW1lfV0iKQotICAgICAgICBnZW5lcmF0ZVNob3dWaWV3KGRvbWFpbkNsYXNzLHZpZXdzRGlyKQotICAgICAgICBMT0cuaW5mbygiR2VuZXJhdGluZyBlZGl0IHZpZXcgZm9yIGRvbWFpbiBjbGFzcyBbJHtkb21haW5DbGFzcy5mdWxsTmFtZX1dIikKLSAgICAgICAgZ2VuZXJhdGVFZGl0Vmlldyhkb21haW5DbGFzcyx2aWV3c0RpcikKLSAgICAgICAgTE9HLmluZm8oIkdlbmVyYXRpbmcgY3JlYXRlIHZpZXcgZm9yIGRvbWFpbiBjbGFzcyBbJHtkb21haW5DbGFzcy5mdWxsTmFtZX1dIikKLSAgICAgICAgZ2VuZXJhdGVDcmVhdGVWaWV3KGRvbWFpbkNsYXNzLHZpZXdzRGlyKQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29udHJvbGxlcihHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcywgU3RyaW5nIGRlc3RkaXIpIHsKLSAgICAgICAgaWYoIWRlc3RkaXIpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBbZGVzdGRpcl0gbm90IHNwZWNpZmllZCIpCi0KLSAgICAgICAgaWYoZG9tYWluQ2xhc3MpIHsKLSAgICAgICAgICAgIGRlZiBkZXN0RmlsZSA9IG5ldyBGaWxlKCIke2Rlc3RkaXJ9L2dyYWlscy1hcHAvY29udHJvbGxlcnMvJHtkb21haW5DbGFzcy5zaG9ydE5hbWV9Q29udHJvbGxlci5ncm9vdnkiKQotICAgICAgICAgICAgaWYoZGVzdEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiQ29udHJvbGxlciAke2Rlc3RGaWxlLm5hbWV9IGFscmVhZHkgZXhpc3RzIHNraXBwaW5nIikKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKLQotICAgICAgICAgICAgZGVmIHRlbXBsYXRlVGV4dCA9ICcnJwotY2xhc3MgJHtjbGFzc05hbWV9Q29udHJvbGxlciB7Ci0gICAgQFByb3BlcnR5IGluZGV4ID0geyByZWRpcmVjdChhY3Rpb246bGlzdCxwYXJhbXM6cGFyYW1zKSB9Ci0KLSAgICBAUHJvcGVydHkgbGlzdCA9IHsKLSAgICAgICAgaWYoIXBhcmFtc1snbWF4J10pIHBhcmFtc1snbWF4J10gPSAxMAotICAgICAgICBbICR7cHJvcGVydHlOYW1lfUxpc3Q6ICR7Y2xhc3NOYW1lfS5saXN0KCBwYXJhbXMgKSBdCi0gICAgfQotCi0gICAgQFByb3BlcnR5IHNob3cgPSB7Ci0gICAgICAgIFsgJHtwcm9wZXJ0eU5hbWV9IDogJHtjbGFzc05hbWV9LmdldCggcGFyYW1zWydpZCddICkgXQotICAgIH0KLQotICAgIEBQcm9wZXJ0eSBkZWxldGUgPSB7Ci0gICAgICAgIGRlZiAke3Byb3BlcnR5TmFtZX0gPSAke2NsYXNzTmFtZX0uZ2V0KCBwYXJhbXNbJ2lkJ10gKQotICAgICAgICBpZigke3Byb3BlcnR5TmFtZX0pIHsKLSAgICAgICAgICAgICR7cHJvcGVydHlOYW1lfS5kZWxldGUoKQotICAgICAgICAgICAgZmxhc2hbJ21lc3NhZ2UnXSA9ICIke2NsYXNzTmFtZX0gXFwke3BhcmFtc1snaWQnXX0gZGVsZXRlZC4iCi0gICAgICAgICAgICByZWRpcmVjdChhY3Rpb246bGlzdCkKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZsYXNoWydtZXNzYWdlJ10gPSAiJHtjbGFzc05hbWV9IG5vdCBmb3VuZCB3aXRoIGlkIFxcJHtwYXJhbXNbJ2lkJ119IgotICAgICAgICAgICAgcmVkaXJlY3QoYWN0aW9uOmxpc3QpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAUHJvcGVydHkgZWRpdCA9IHsKLSAgICAgICAgZGVmICR7cHJvcGVydHlOYW1lfSA9ICR7Y2xhc3NOYW1lfS5nZXQoIHBhcmFtc1snaWQnXSApCi0KLSAgICAgICAgaWYoISR7cHJvcGVydHlOYW1lfSkgewotICAgICAgICAgICAgICAgIGZsYXNoWydtZXNzYWdlJ10gPSAiJHtjbGFzc05hbWV9IG5vdCBmb3VuZCB3aXRoIGlkIFxcJHtwYXJhbXNbJ2lkJ119IgotICAgICAgICAgICAgICAgIHJlZGlyZWN0KGFjdGlvbjpsaXN0KQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFsgJHtwcm9wZXJ0eU5hbWV9IDogJHtwcm9wZXJ0eU5hbWV9IF0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBQcm9wZXJ0eSB1cGRhdGUgPSB7Ci0gICAgICAgIGRlZiAke3Byb3BlcnR5TmFtZX0gPSAke2NsYXNzTmFtZX0uZ2V0KCBwYXJhbXNbJ2lkJ10gKQotICAgICAgICBpZigke3Byb3BlcnR5TmFtZX0pIHsKLSAgICAgICAgICAgICAke3Byb3BlcnR5TmFtZX0ucHJvcGVydGllcyA9IHBhcmFtcwotICAgICAgICAgICAgaWYoJHtwcm9wZXJ0eU5hbWV9LnNhdmUoKSkgewotICAgICAgICAgICAgICAgIHJlZGlyZWN0KGFjdGlvbjpzaG93LGlkOiR7cHJvcGVydHlOYW1lfS5pZCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlbmRlcih2aWV3OidlZGl0Jyxtb2RlbDpbJHtwcm9wZXJ0eU5hbWV9OiR7cHJvcGVydHlOYW1lfV0pCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmbGFzaFsnbWVzc2FnZSddID0gIiR7Y2xhc3NOYW1lfSBub3QgZm91bmQgd2l0aCBpZCBcXCR7cGFyYW1zWydpZCddfSIKLSAgICAgICAgICAgIHJlZGlyZWN0KGFjdGlvbjplZGl0LGlkOnBhcmFtc1snaWQnXSkKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBQcm9wZXJ0eSBjcmVhdGUgPSB7Ci0gICAgICAgIGRlZiAke3Byb3BlcnR5TmFtZX0gPSBuZXcgJHtjbGFzc05hbWV9KCkKLSAgICAgICAgJHtwcm9wZXJ0eU5hbWV9LnByb3BlcnRpZXMgPSBwYXJhbXMKLSAgICAgICAgcmV0dXJuIFsnJHtwcm9wZXJ0eU5hbWV9Jzoke3Byb3BlcnR5TmFtZX1dCi0gICAgfQotCi0gICAgQFByb3BlcnR5IHNhdmUgPSB7Ci0gICAgICAgIGRlZiAke3Byb3BlcnR5TmFtZX0gPSBuZXcgJHtjbGFzc05hbWV9KCkKLSAgICAgICAgJHtwcm9wZXJ0eU5hbWV9LnByb3BlcnRpZXMgPSBwYXJhbXMKLSAgICAgICAgaWYoJHtwcm9wZXJ0eU5hbWV9LnNhdmUoKSkgewotICAgICAgICAgICAgcmVkaXJlY3QoYWN0aW9uOnNob3csaWQ6JHtwcm9wZXJ0eU5hbWV9LmlkKQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVuZGVyKHZpZXc6J2NyZWF0ZScsbW9kZWw6WyR7cHJvcGVydHlOYW1lfToke3Byb3BlcnR5TmFtZX1dKQotICAgICAgICB9Ci0gICAgfQotCi19JycnCi0KLSAgICAgICAgICAgIGRlZiBiaW5kaW5nID0gWyBjbGFzc05hbWU6IGRvbWFpbkNsYXNzLnNob3J0TmFtZSwgcHJvcGVydHlOYW1lOmRvbWFpbkNsYXNzLnByb3BlcnR5TmFtZSBdCi0gICAgICAgICAgICBkZWYgdCA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZSh0ZW1wbGF0ZVRleHQpCi0KLSAgICAgICAgICAgIGRlc3RGaWxlLndpdGhXcml0ZXIgeyB3IC0+Ci0gICAgICAgICAgICAgICAgdC5tYWtlKGJpbmRpbmcpLndyaXRlVG8odykKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTE9HLmluZm8oIkNvbnRyb2xsZXIgZ2VuZXJhdGVkIGF0ICR7ZGVzdEZpbGV9IikKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgcmVuZGVyU3RyaW5nRWRpdG9yKGRvbWFpbkNsYXNzLCBwcm9wZXJ0eSkgewotICAgICAgICBkZWYgY3AgPSBkb21haW5DbGFzcy5jb25zdHJhaW5lZFByb3BlcnRpZXNbcHJvcGVydHkubmFtZV0KLSAgICAgICAgaWYoIWNwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPScke3Byb3BlcnR5Lm5hbWV9JyB2YWx1ZT0nXCR7JHtkb21haW5DbGFzcy5wcm9wZXJ0eU5hbWV9Py4ke3Byb3BlcnR5Lm5hbWV9fScgLz4iCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZihjcC5tYXhMZW5ndGggPiAyNTAgJiYgIWNwLnBhc3N3b3JkICYmICFjcC5pbkxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjx0ZXh0YXJlYSByb3dzPScxJyBjb2xzPScxJyBuYW1lPScke3Byb3BlcnR5Lm5hbWV9Jz5cJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19PC90ZXh0YXJlYT4iCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihjcC5pbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICBkZWYgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCc8c2VsZWN0ICcpCi0gICAgICAgICAgICAgICAgICAgc2IgPDwgIm5hbWU9JyR7cHJvcGVydHkubmFtZX0nPiI+Ci0gICAgICAgICAgICAgICAgICAgY3AuaW5MaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgc2IgPDwgIjxvcHRpb24gdmFsdWU9JyR7aXR9Jz4ke2l0fTwvb3B0aW9uPiIKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgc2IgPDwgJzwvc2VsZWN0PicKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmIHNiID0gbmV3IFN0cmluZ0J1ZmZlcignPGlucHV0ICcpCi0gICAgICAgICAgICAgICAgICAgIGNwLnBhc3N3b3JkID8gc2IgPDwgJ3R5cGU9InBhc3N3b3JkIiAnIDogc2IgPDwgJ3R5cGU9InRleHQiICcKLSAgICAgICAgICAgICAgICAgICAgaWYoIWNwLmVkaXRhYmxlKSBzYiA8PCAncmVhZG9ubHk9InJlYWRvbmx5IiAnCi0gICAgICAgICAgICAgICAgICAgIGlmKGNwLm1heExlbmd0aCA8IEludGVnZXIuTUFYX1ZBTFVFICkgc2IgPDwgIm1heGxlbmd0aD0nJHtjcC5tYXhMZW5ndGh9JyAiCi0gICAgICAgICAgICAgICAgICAgIHNiIDw8ICJuYW1lPScke3Byb3BlcnR5Lm5hbWV9JyB2YWx1ZT0nXCR7JHtkb21haW5DbGFzcy5wcm9wZXJ0eU5hbWV9Py4ke3Byb3BlcnR5Lm5hbWV9fSc+PC9pbnB1dD4iCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSByZW5kZXJCeXRlQXJyYXlFZGl0b3IoZG9tYWluQ2xhc3MscHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuICI8aW5wdXQgdHlwZT0nZmlsZScgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfSc+PC9pbnB1dD4iCi0gICAgfQotCi0gICAgcHJpdmF0ZSByZW5kZXJNYW55VG9PbmUoZG9tYWluQ2xhc3MscHJvcGVydHkpIHsKLSAgICAgICAgaWYocHJvcGVydHkuYXNzb2NpYXRpb24pIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAiPGc6c2VsZWN0IG9wdGlvbktleT1cImlkXCIgZnJvbT1cIlwkeyR7cHJvcGVydHkudHlwZS5uYW1lfS5saXN0KCl9XCIgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfS5pZCcgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfT8uaWR9Jz48L2c6c2VsZWN0PiIKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgcmVuZGVyT25lVG9NYW55KGRvbWFpbkNsYXNzLHByb3BlcnR5KSB7Ci0gICAgICAgIGRlZiBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKQotICAgICAgICBkZWYgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpCi0gICAgICAgIHB3LnByaW50bG4gJzx1bD4nCi0gICAgICAgIHB3LnByaW50bG4gIiAgICA8ZzplYWNoIHZhcj0nJHtwcm9wZXJ0eS5uYW1lWzBdfScgaW49J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfS4ke3Byb3BlcnR5Lm5hbWV9fSc+IgotICAgICAgICBwdy5wcmludGxuICIgICAgICAgIDxsaT48ZzpsaW5rIGNvbnRyb2xsZXI9JyR7cHJvcGVydHkucmVmZXJlbmNlZERvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0nIGFjdGlvbj0nc2hvdycgaWQ9J1wkeyR7cHJvcGVydHkubmFtZVswXX0uaWR9Jz5cJHske3Byb3BlcnR5Lm5hbWVbMF19fTwvZzpsaW5rPjwvbGk+IgotICAgICAgICBwdy5wcmludGxuICIgICAgPC9nOmVhY2g+IgotICAgICAgICBwdy5wcmludGxuICI8L3VsPiIKLSAgICAgICAgcHcucHJpbnRsbiAiPGc6bGluayBjb250cm9sbGVyPScke3Byb3BlcnR5LnJlZmVyZW5jZWREb21haW5DbGFzcy5wcm9wZXJ0eU5hbWV9JyBwYXJhbXM9J1tcIiR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfS5pZFwiOiR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uaWRdJyBhY3Rpb249J2NyZWF0ZSc+QWRkICR7cHJvcGVydHkucmVmZXJlbmNlZERvbWFpbkNsYXNzLnNob3J0TmFtZX08L2c6bGluaz4iCi0gICAgICAgIHJldHVybiBzdy50b1N0cmluZygpCi0gICAgfQotCi0gICAgcHJpdmF0ZSByZW5kZXJOdW1iZXJFZGl0b3IoZG9tYWluQ2xhc3MscHJvcGVydHkpIHsKLSAgICAgICAgZGVmIGNwID0gZG9tYWluQ2xhc3MuY29uc3RyYWluZWRQcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdCi0gICAgICAgIGlmKCFjcCkgewotICAgICAgICAgICAgaWYocHJvcGVydHkudHlwZSA9PSBCeXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8ZzpzZWxlY3QgZnJvbT0nXCR7LTEyOC4uMTI3fScgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvZzpzZWxlY3Q+IgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICI8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvaW5wdXQ+IgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYoY3AucmFuZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxnOnNlbGVjdCBmcm9tPSdcJHske2NwLnJhbmdlLmZyb219Li4ke2NwLnJhbmdlLnRvfX0nIG5hbWU9JyR7cHJvcGVydHkubmFtZX0nIHZhbHVlPSdcJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19Jz48L2c6c2VsZWN0PiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoY3Auc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiPGc6c2VsZWN0IGZyb209J1wkeyR7Y3Auc2l6ZS5mcm9tfS4uJHtjcC5zaXplLnRvfX0nIG5hbWU9JyR7cHJvcGVydHkubmFtZX0nIHZhbHVlPSdcJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19Jz48L2c6c2VsZWN0PiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9JyR7cHJvcGVydHkubmFtZX0nIHZhbHVlPSdcJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19Jz48L2lucHV0PiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgcmVuZGVyQm9vbGVhbkVkaXRvcihkb21haW5DbGFzcyxwcm9wZXJ0eSkgewotCi0gICAgICAgIGRlZiBjcCA9IGRvbWFpbkNsYXNzLmNvbnN0cmFpbmVkUHJvcGVydGllc1twcm9wZXJ0eS5uYW1lXQotICAgICAgICBpZighY3ApIHsKLSAgICAgICAgICAgIHJldHVybiAiPGc6Y2hlY2tCb3ggbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvZzpjaGVja0JveD4iCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkZWYgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcignPGc6Y2hlY2tCb3ggJykKLSAgICAgICAgICAgIGlmKGNwLndpZGdldCkgYnVmIDw8ICJ3aWRnZXQ9JyR7Y3Aud2lkZ2V0fSciOwotCi0gICAgICAgICAgICBidWYgPDwgIm5hbWU9JyR7cHJvcGVydHkubmFtZX0nIHZhbHVlPSdcJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19JyAiCi0gICAgICAgICAgICBjcC5hdHRyaWJ1dGVzLmVhY2ggeyBrLHYgLT4KLSAgICAgICAgICAgICAgICAgIGJ1ZiA8PCAiJHtrfT1cIiR7dn1cIiAiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPDwgJz48L2c6Y2hlY2tCb3g+JwotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgcmVuZGVyRGF0ZUVkaXRvcihkb21haW5DbGFzcyxwcm9wZXJ0eSkgewotICAgICAgICBkZWYgY3AgPSBkb21haW5DbGFzcy5jb25zdHJhaW5lZFByb3BlcnRpZXNbcHJvcGVydHkubmFtZV0KLSAgICAgICAgaWYoIWNwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjxnOmRhdGVQaWNrZXIgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvZzpkYXRlUGlja2VyPiIKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlZiBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCc8ZzpkYXRlUGlja2VyICcpCi0gICAgICAgICAgICBpZihjcC53aWRnZXQpIGJ1ZiA8PCAid2lkZ2V0PScke2NwLndpZGdldH0nICI7Ci0KLSAgICAgICAgICAgIGlmKGNwLmZvcm1hdCkgYnVmIDw8ICJmb3JtYXQ9JyR7Y3AuZm9ybWF0fScgIjsKLSAgICAgICAgICAgIGNwLmF0dHJpYnV0ZXMuZWFjaCB7IGssdiAtPgotICAgICAgICAgICAgICAgICAgYnVmIDw8ICIke2t9PVwiJHt2fVwiICIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZiA8PCAibmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvZzpkYXRlUGlja2VyPiIKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSByZW5kZXJTZWxlY3RUeXBlRWRpdG9yKHR5cGUsZG9tYWluQ2xhc3MscHJvcGVydHkpIHsKLSAgICAgICBkZWYgY3AgPSBkb21haW5DbGFzcy5jb25zdHJhaW5lZFByb3BlcnRpZXNbcHJvcGVydHkubmFtZV0KLSAgICAgICAgaWYoIWNwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjxnOiR7dHlwZX1TZWxlY3QgbmFtZT0nJHtwcm9wZXJ0eS5uYW1lfScgdmFsdWU9J1wkeyR7ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lfT8uJHtwcm9wZXJ0eS5uYW1lfX0nPjwvZzoke3R5cGV9U2VsZWN0PiIKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlZiBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCc8Zzoke3R5cGV9U2VsZWN0ICcpCi0gICAgICAgICAgICBpZihjcC53aWRnZXQpIGJ1ZiA8PCAid2lkZ2V0PScke2NwLndpZGdldH0nICI7Ci0gICAgICAgICAgICBjcC5hdHRyaWJ1dGVzLmVhY2ggeyBrLHYgLT4KLSAgICAgICAgICAgICAgICAgIGJ1ZiA8PCAiJHtrfT1cIiR7dn1cIiAiCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPDwgIm5hbWU9JyR7cHJvcGVydHkubmFtZX0nIHZhbHVlPSdcJHske2RvbWFpbkNsYXNzLnByb3BlcnR5TmFtZX0/LiR7cHJvcGVydHkubmFtZX19Jz48L2c6JHt0eXBlfVNlbGVjdD4iCi0gICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCkKLSAgICAgICAgfQotICAgIH0KLQotCi0KLQotICAgIHByaXZhdGUgZ2VuZXJhdGVMaXN0Vmlldyhkb21haW5DbGFzcywgZGVzdERpcikgewotICAgICAgICBkZWYgbGlzdEZpbGUgPSBuZXcgRmlsZSgiJHtkZXN0RGlyfS9saXN0LmdzcCIpCi0gICAgICAgIGlmKCFsaXN0RmlsZS5leGlzdHMoKSB8fCBvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGRlZiB0ZW1wbGF0ZVRleHQgPSAnJycKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICAgPHRpdGxlPiR7Y2xhc3NOYW1lfSBMaXN0PC90aXRsZT4KLSAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iXFwke2NyZWF0ZUxpbmtUbyhkaXI6J2NzcycsZmlsZTonbWFpbi5jc3MnKX0iPjwvbGluaz4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9Im5hdiI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUJ1dHRvbiI+PGc6bGluayBhY3Rpb249ImluZGV4Ij5Ib21lPC9nOmxpbms+PC9zcGFuPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVCdXR0b24iPjxnOmxpbmsgYWN0aW9uPSJjcmVhdGUiPk5ldyAke2NsYXNzTmFtZX08L2c6bGluaz48L3NwYW4+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KLSAgICAgICAgICAgPGgxPiR7Y2xhc3NOYW1lfSBMaXN0PC9oMT4KLSAgICAgICAgICAgIDxnOmlmIHRlc3Q9ImZsYXNoWydtZXNzYWdlJ10iPgotICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgXFwke2ZsYXNoWydtZXNzYWdlJ119Ci0gICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPC9nOmlmPgotICAgICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gZG9tYWluQ2xhc3MucHJvcGVydGllcy5maW5kQWxsIHsgaXQubmFtZSAhPSAndmVyc2lvbicgJiYgaXQudHlwZSAhPSBTZXQuY2xhc3MgfQotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChwcm9wcywgbmV3IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLkRvbWFpbkNsYXNzUHJvcGVydHlDb21wYXJhdG9yKGRvbWFpbkNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgIDwlcHJvcHMuZWFjaFdpdGhJbmRleCB7IHAsaSAtPgotICAgICAgICAgICAgICAgICAgIAlpZihpIDwgNikgeyU+ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiR7cC5uYXR1cmFsTmFtZX08L3RoPgotICAgICAgICAgICAgICAgICAgIDwlfX0lPgotICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPgotICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgIDxnOmVhY2ggaW49IlxcJHske3Byb3BlcnR5TmFtZX1MaXN0fSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgPCVwcm9wcy5lYWNoV2l0aEluZGV4IHsgcCxpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPCA2KSB7JT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XFwke2l0LiR7cC5uYW1lfX08L3RkPgotICAgICAgICAgICAgICAgICAgICAgICA8JX19JT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJhY3Rpb25CdXR0b25zIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWN0aW9uQnV0dG9uIj48ZzpsaW5rIGFjdGlvbj0ic2hvdyIgaWQ9IlxcJHtpdC5pZH0iPlNob3c8L2c6bGluaz48L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICA8L2c6ZWFjaD4KLSAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9ib2R5PgotPC9ib2R5PgotICAgICAgICAgICAgJycnCi0KLSAgICAgICAgICAgIGRlZiB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlVGV4dCkKLSAgICAgICAgICAgIGRlZiBiaW5kaW5nID0gWyBkb21haW5DbGFzczogZG9tYWluQ2xhc3MsIGNsYXNzTmFtZTpkb21haW5DbGFzcy5zaG9ydE5hbWUscHJvcGVydHlOYW1lOmRvbWFpbkNsYXNzLnByb3BlcnR5TmFtZSBdCi0KLSAgICAgICAgICAgIGxpc3RGaWxlLndpdGhXcml0ZXIgeyB3IC0+Ci0gICAgICAgICAgICAgICAgdC5tYWtlKGJpbmRpbmcpLndyaXRlVG8odykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRy5pbmZvKCJsaXN0IHZpZXcgZ2VuZXJhdGVkIGF0ICR7bGlzdEZpbGUuYWJzb2x1dGVQYXRofSIpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGdlbmVyYXRlU2hvd1ZpZXcoZG9tYWluQ2xhc3MsZGVzdERpcikgewotICAgICAgICBkZWYgc2hvd0ZpbGUgPSBuZXcgRmlsZSgiJHtkZXN0RGlyfS9zaG93LmdzcCIpCi0gICAgICAgIGlmKCFzaG93RmlsZS5leGlzdHMoKSB8fCBvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGRlZiB0ZW1wbGF0ZVRleHQgPSAnJycKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICAgPHRpdGxlPlNob3cgJHtjbGFzc05hbWV9PC90aXRsZT4KLSAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iXFwke2NyZWF0ZUxpbmtUbyhkaXI6J2NzcycsZmlsZTonbWFpbi5jc3MnKX0iPjwvbGluaz4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9Im5hdiI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUJ1dHRvbiI+PGc6bGluayBhY3Rpb249ImluZGV4Ij5Ib21lPC9nOmxpbms+PC9zcGFuPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVCdXR0b24iPjxnOmxpbmsgYWN0aW9uPSJsaXN0Ij4ke2NsYXNzTmFtZX0gTGlzdDwvZzpsaW5rPjwvc3Bhbj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZW51QnV0dG9uIj48ZzpsaW5rIGFjdGlvbj0iY3JlYXRlIj5OZXcgJHtjbGFzc05hbWV9PC9nOmxpbms+PC9zcGFuPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+Ci0gICAgICAgICAgIDxoMT5TaG93ICR7Y2xhc3NOYW1lfTwvaDE+Ci0gICAgICAgICAgIDxnOmlmIHRlc3Q9IlxcJHtmbGFzaFsnbWVzc2FnZSddfSI+Ci0gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPlxcJHtmbGFzaFsnbWVzc2FnZSddfTwvZGl2PgotICAgICAgICAgICA8L2c6aWY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyI+Ci0gICAgICAgICAgICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBkb21haW5DbGFzcy5wcm9wZXJ0aWVzLmZpbmRBbGwgeyBpdC5uYW1lICE9ICd2ZXJzaW9uJyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHByb3BzLCBuZXcgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IoZG9tYWluQ2xhc3MpKQotICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgPCVwcm9wcy5lYWNoIHsgcCAtPiU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InByb3AiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyIgd2lkdGg9IjIwJSIgY2xhc3M9Im5hbWUiPiR7cC5uYXR1cmFsTmFtZX06PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlIGlmKHAub25lVG9NYW55KSB7ICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICB2YWxpZ249InRvcCIgc3R5bGU9InRleHQtYWxpZ246bGVmdDsiIGNsYXNzPSJ2YWx1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZzplYWNoIHZhcj0iJHtwLm5hbWVbMF19IiBpbj0iXFwkeyR7cHJvcGVydHlOYW1lfS4ke3AubmFtZX19Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48ZzpsaW5rIGNvbnRyb2xsZXI9IiR7cC5yZWZlcmVuY2VkRG9tYWluQ2xhc3M/LnByb3BlcnR5TmFtZX0iIGFjdGlvbj0ic2hvdyIgaWQ9IlxcJHske3AubmFtZVswXX0uaWR9Ij5cXCR7JHtwLm5hbWVbMF19fTwvZzpsaW5rPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZzplYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlIH0gZWxzZSBpZihwLm1hbnlUb09uZSB8fCBwLm9uZVRvT25lKSB7ICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IiBjbGFzcz0idmFsdWUiPjxnOmxpbmsgY29udHJvbGxlcj0iJHtwLnJlZmVyZW5jZWREb21haW5DbGFzcz8ucHJvcGVydHlOYW1lfSIgYWN0aW9uPSJzaG93IiBpZD0iXFwkeyR7cHJvcGVydHlOYW1lfT8uJHtwLm5hbWV9Py5pZH0iPlxcJHske3Byb3BlcnR5TmFtZX0/LiR7cC5uYW1lfX08L2c6bGluaz48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlICB7ICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IiBjbGFzcz0idmFsdWUiPlxcJHske3Byb3BlcnR5TmFtZX0uJHtwLm5hbWV9fTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JSB9ICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KLSAgICAgICAgICAgICAgIDxnOmZvcm0gY29udHJvbGxlcj0iJHtwcm9wZXJ0eU5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiIHZhbHVlPSJcXCR7JHtwcm9wZXJ0eU5hbWV9Py5pZH0iIC8+Ci0gICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPjxnOmFjdGlvblN1Ym1pdCB2YWx1ZT0iRWRpdCIgLz48L3NwYW4+Ci0gICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPjxnOmFjdGlvblN1Ym1pdCB2YWx1ZT0iRGVsZXRlIiAvPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDwvZzpmb3JtPgotICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9ib2R5PgotPC9ib2R5PgotICAgICAgICAgICAgJycnCi0KLSAgICAgICAgICAgIGRlZiB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlVGV4dCkKLSAgICAgICAgICAgIGRlZiBiaW5kaW5nID0gWyBkb21haW5DbGFzczogZG9tYWluQ2xhc3MsIGNsYXNzTmFtZTpkb21haW5DbGFzcy5zaG9ydE5hbWUscHJvcGVydHlOYW1lOmRvbWFpbkNsYXNzLnByb3BlcnR5TmFtZSBdCi0KLSAgICAgICAgICAgIHNob3dGaWxlLndpdGhXcml0ZXIgeyB3IC0+Ci0gICAgICAgICAgICAgICAgdC5tYWtlKGJpbmRpbmcpLndyaXRlVG8odykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRy5pbmZvKCJTaG93IHZpZXcgZ2VuZXJhdGVkIGF0ICR7c2hvd0ZpbGUuYWJzb2x1dGVQYXRofSIpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGdlbmVyYXRlRWRpdFZpZXcoZG9tYWluQ2xhc3MsZGVzdERpcikgewotICAgICAgICBkZWYgZWRpdEZpbGUgPSBuZXcgRmlsZSgiJHtkZXN0RGlyfS9lZGl0LmdzcCIpCi0gICAgICAgIGlmKCFlZGl0RmlsZS5leGlzdHMoKSB8fCBvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGRlZiB0ZW1wbGF0ZVRleHQgPSAnJycKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICAgPHRpdGxlPkVkaXQgJHtjbGFzc05hbWV9PC90aXRsZT4KLSAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iXFwke2NyZWF0ZUxpbmtUbyhkaXI6J2NzcycsZmlsZTonbWFpbi5jc3MnKX0iPjwvbGluaz4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxkaXYgY2xhc3M9Im5hdiI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUJ1dHRvbiI+PGc6bGluayBhY3Rpb249ImluZGV4Ij5Ib21lPC9nOmxpbms+PC9zcGFuPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVCdXR0b24iPjxnOmxpbmsgYWN0aW9uPSJsaXN0Ij4ke2NsYXNzTmFtZX0gTGlzdDwvZzpsaW5rPjwvc3Bhbj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZW51QnV0dG9uIj48ZzpsaW5rIGFjdGlvbj0iY3JlYXRlIj5OZXcgJHtjbGFzc05hbWV9PC9nOmxpbms+PC9zcGFuPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+Ci0gICAgICAgICAgIDxoMT5FZGl0ICR7Y2xhc3NOYW1lfTwvaDE+Ci0gICAgICAgICAgIDxnOmlmIHRlc3Q9IlxcJHtmbGFzaFsnbWVzc2FnZSddfSI+Ci0gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPlxcJHtmbGFzaFsnbWVzc2FnZSddfTwvZGl2PgotICAgICAgICAgICA8L2c6aWY+Ci0gICAgICAgICAgIDxnOmhhc0Vycm9ycyBiZWFuPSJcXCR7JHtwcm9wZXJ0eU5hbWV9fSI+Ci0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3JzIj4KLSAgICAgICAgICAgICAgICAgICAgPGc6cmVuZGVyRXJyb3JzIGJlYW49IlxcJHske3Byb3BlcnR5TmFtZX19IiBhcz0ibGlzdCIgLz4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgPC9nOmhhc0Vycm9ycz4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvcCI+Ci0JICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPklkOjwvc3Bhbj4KLQkgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPlxcJHske3Byb3BlcnR5TmFtZX0/LmlkfTwvc3Bhbj4KLQkgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIke3Byb3BlcnR5TmFtZX0uaWQiIHZhbHVlPSJcXCR7JHtwcm9wZXJ0eU5hbWV9Py5pZH0iIC8+Ci0gICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgCi0gICAgICAgICAgIDxnOmZvcm0gY29udHJvbGxlcj0iJHtwcm9wZXJ0eU5hbWV9IiBtZXRob2Q9InBvc3QiPgotICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiIHZhbHVlPSJcXCR7JHtwcm9wZXJ0eU5hbWV9Py5pZH0iIC8+Ci0gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciPgotICAgICAgICAgICAgICAgIDx0YWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gZG9tYWluQ2xhc3MucHJvcGVydGllcy5maW5kQWxsIHsgaXQubmFtZSAhPSAndmVyc2lvbicgJiYgaXQubmFtZSAhPSAnaWQnIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHByb3BzLCBuZXcgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IoZG9tYWluQ2xhc3MpKQotICAgICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICAgICA8JXByb3BzLmVhY2ggeyBwIC0+JT4KLQkJCQkke3JlbmRlckVkaXRvcihwKX0KLSAgICAgICAgICAgICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgPC9kaXY+Ci0KLSAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgotICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+PGc6YWN0aW9uU3VibWl0IHZhbHVlPSJVcGRhdGUiIC8+PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+PGc6YWN0aW9uU3VibWl0IHZhbHVlPSJEZWxldGUiIC8+PC9zcGFuPgotICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8L2c6Zm9ybT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9ib2R5PgotPC9ib2R5PgotICAgICAgICAgICAgJycnCi0KLSAgICAgICAgICAgIGRlZiB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlVGV4dCkKLSAgICAgICAgICAgIGRlZiBiaW5kaW5nID0gWyBkb21haW5DbGFzczogZG9tYWluQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOmRvbWFpbkNsYXNzLnNob3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckVkaXRvcjpyZW5kZXJFZGl0b3IgXQotCi0gICAgICAgICAgICBlZGl0RmlsZS53aXRoV3JpdGVyIHsgdyAtPgotICAgICAgICAgICAgICAgIHQubWFrZShiaW5kaW5nKS53cml0ZVRvKHcpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0cuaW5mbygiRWRpdCB2aWV3IGdlbmVyYXRlZCBhdCAke2VkaXRGaWxlLmFic29sdXRlUGF0aH0iKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBnZW5lcmF0ZUNyZWF0ZVZpZXcoZG9tYWluQ2xhc3MsZGVzdERpcikgewotICAgICAgICBkZWYgY3JlYXRlRmlsZSA9IG5ldyBGaWxlKCIke2Rlc3REaXJ9L2NyZWF0ZS5nc3AiKQotICAgICAgICBpZighY3JlYXRlRmlsZS5leGlzdHMoKSB8fCBvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGRlZiB0ZW1wbGF0ZVRleHQgPSAnJycKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICAgPHRpdGxlPkNyZWF0ZSAke2NsYXNzTmFtZX08L3RpdGxlPgotICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJcXCR7Y3JlYXRlTGlua1RvKGRpcjonY3NzJyxmaWxlOidtYWluLmNzcycpfSI+PC9saW5rPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGRpdiBjbGFzcz0ibmF2Ij4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZW51QnV0dG9uIj48ZzpsaW5rIGFjdGlvbj0iaW5kZXgiPkhvbWU8L2c6bGluaz48L3NwYW4+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUJ1dHRvbiI+PGc6bGluayBhY3Rpb249Imxpc3QiPiR7Y2xhc3NOYW1lfSBMaXN0PC9nOmxpbms+PC9zcGFuPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+Ci0gICAgICAgICAgIDxoMT5DcmVhdGUgJHtjbGFzc05hbWV9PC9oMT4KLSAgICAgICAgICAgPGc6aWYgdGVzdD0iXFwke2ZsYXNoWydtZXNzYWdlJ119Ij4KLSAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+XFwke2ZsYXNoWydtZXNzYWdlJ119PC9kaXY+Ci0gICAgICAgICAgIDwvZzppZj4KLSAgICAgICAgICAgPGc6aGFzRXJyb3JzIGJlYW49IlxcJHske3Byb3BlcnR5TmFtZX19Ij4KLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvcnMiPgotICAgICAgICAgICAgICAgICAgICA8ZzpyZW5kZXJFcnJvcnMgYmVhbj0iXFwkeyR7cHJvcGVydHlOYW1lfX0iIGFzPSJsaXN0IiAvPgotICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICA8L2c6aGFzRXJyb3JzPgotICAgICAgICAgICA8Zzpmb3JtIGFjdGlvbj0ic2F2ZSIgbWV0aG9kPSJwb3N0Ij4KLSAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyI+Ci0gICAgICAgICAgICAgICAgPHRhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBkb21haW5DbGFzcy5wcm9wZXJ0aWVzLmZpbmRBbGwgeyBpdC5uYW1lICE9ICd2ZXJzaW9uJyAmJiBpdC5uYW1lICE9ICdpZCcgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcHMsIG5ldyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy5Eb21haW5DbGFzc1Byb3BlcnR5Q29tcGFyYXRvcihkb21haW5DbGFzcykpCi0gICAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwlcHJvcHMuZWFjaCB7IHAgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwLnR5cGUgIT0gU2V0LmNsYXNzKSB7ICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtyZW5kZXJFZGl0b3IocCl9Ci0gICAgICAgICAgICAgICAgICAgICAgIDwlfX0lPgotICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+Ci0gICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9ybUJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj48L2lucHV0PgotICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgotICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8L2c6Zm9ybT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9ib2R5PgotPC9ib2R5PgotICAgICAgICAgICAgJycnCi0KLSAgICAgICAgICAgIGRlZiB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlVGV4dCkKLSAgICAgICAgICAgIGRlZiBiaW5kaW5nID0gWyBkb21haW5DbGFzczogZG9tYWluQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOmRvbWFpbkNsYXNzLnNob3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6ZG9tYWluQ2xhc3MucHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckVkaXRvcjpyZW5kZXJFZGl0b3IgXQotCi0gICAgICAgICAgICBjcmVhdGVGaWxlLndpdGhXcml0ZXIgeyB3IC0+Ci0gICAgICAgICAgICAgICAgdC5tYWtlKGJpbmRpbmcpLndyaXRlVG8odykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRy5pbmZvKCJDcmVhdGUgdmlldyBnZW5lcmF0ZWQgYXQgJHtjcmVhdGVGaWxlLmFic29sdXRlUGF0aH0iKQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdFNjYWZmb2xkQ2FsbGJhY2suamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdFNjYWZmb2xkQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyMWVhZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRTY2FmZm9sZENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2NhZmZvbGRDYWxsYmFjayBpbXBsZW1lbnRzIFNjYWZmb2xkQ2FsbGJhY2sgewotCi0JcHJpdmF0ZSBib29sZWFuIGludm9rZWQ7Ci0JcHJpdmF0ZSBFcnJvcnMgZXJyb3JzOwotCXByaXZhdGUgTWFwIG1vZGVsOwotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXJyb3JzLgotCSAqLwotCXB1YmxpYyBFcnJvcnMgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gZXJyb3JzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZXJyb3JzIFRoZSBlcnJvcnMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9ycyhFcnJvcnMgZXJyb3JzKSB7Ci0JCXRoaXMuZXJyb3JzID0gZXJyb3JzOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGludm9rZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnZva2VkKCkgewotCQlyZXR1cm4gaW52b2tlZDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGludm9rZWQgVGhlIGludm9rZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludm9rZWQoYm9vbGVhbiBpbnZva2VkKSB7Ci0JCXRoaXMuaW52b2tlZCA9IGludm9rZWQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIE1hcCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNYXAgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0U2NhZmZvbGREb21haW4uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdFNjYWZmb2xkRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YWJkODMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0U2NhZmZvbGREb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IG9nbmwuRGVmYXVsdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb2dubC5PZ25sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLmV4Y2VwdGlvbnMuU2NhZmZvbGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuKjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLmNyaXRlcmlvbi5PcmRlcjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLmNyaXRlcmlvbi5SZXN0cmljdGlvbnM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLkhpYmVybmF0ZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkJpbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBTY2FmZm9sZGluZyBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgSGliZXJuYXRlIGFzIHRoZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTY2FmZm9sZERvbWFpbiBpbXBsZW1lbnRzIFNjYWZmb2xkRG9tYWluIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdFNjYWZmb2xkRG9tYWluLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TVUZGSVggPSAiTGlzdCI7Ci0JcHJpdmF0ZSBDbGFzcyBwZXJzaXN0ZW50Q2xhc3M7Ci0JcHJpdmF0ZSBIaWJlcm5hdGVUZW1wbGF0ZSB0ZW1wbGF0ZTsKLQlwcml2YXRlIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5OwotCQotCXByaXZhdGUgTWFwIGNvbnRleHQgPSBPZ25sLmNyZWF0ZURlZmF1bHRDb250ZXh0KHRoaXMpOwotCXByaXZhdGUgRGVmYXVsdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IERlZmF1bHRUeXBlQ29udmVydGVyKCk7Ci0JcHJpdmF0ZSBCZWFuV3JhcHBlciBiZWFuOwotCXByaXZhdGUgQ2xhc3MgaWRlbnRpdHlDbGFzczsKLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0JcHJpdmF0ZSBTdHJpbmcgaWRlbnRpdHlQcm9wZXJ0eU5hbWU7Ci0JCi0JcHVibGljIERlZmF1bHRTY2FmZm9sZERvbWFpbihDbGFzcyBwZXJzaXN0ZW50Q2xhc3MsCi0JCQlTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSkgewotCQkKLQkJc2V0UGVyc2lzdGVudENsYXNzKHBlcnNpc3RlbnRDbGFzcyk7Ci0JCXNldFNlc3Npb25GYWN0b3J5KHNlc3Npb25GYWN0b3J5KTsJCQotCX0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgVGhlIHZhbGlkYXRvciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGl0eVByb3BlcnR5TmFtZShTdHJpbmcgaWRlbnRpdHlQcm9wZXJ0eU5hbWUpIHsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIGlkZW50aXR5UHJvcCA9IHRoaXMuYmVhbi5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoaWRlbnRpdHlQcm9wZXJ0eU5hbWUpOwotCQlpZGVudGl0eUNsYXNzID0gaWRlbnRpdHlQcm9wLmdldFByb3BlcnR5VHlwZSgpOwotCQl0aGlzLmlkZW50aXR5UHJvcGVydHlOYW1lID0gaWRlbnRpdHlQcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb25GYWN0b3J5IFRoZSBzZXNzaW9uRmFjdG9yeSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2Vzc2lvbkZhY3RvcnkoU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnkpIHsKLQkJdGhpcy5zZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5OwotCQl0aGlzLnRlbXBsYXRlID0gbmV3IEhpYmVybmF0ZVRlbXBsYXRlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotCQl0aGlzLnRlbXBsYXRlLnNldEZsdXNoTW9kZShIaWJlcm5hdGVUZW1wbGF0ZS5GTFVTSF9BVVRPKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0KCkgewotCQlyZXR1cm4gdGVtcGxhdGUubG9hZEFsbChwZXJzaXN0ZW50Q2xhc3MpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3QoZmluYWwgaW50IG1heCkgewotCQlyZXR1cm4gbGlzdChtYXgsIC0xLG51bGwsbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdChmaW5hbCBpbnQgbWF4LCBmaW5hbCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBsaXN0KG1heCwgb2Zmc2V0LG51bGwsbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGxpc3QoaW50IG1heCwgaW50IG9mZnNldCwgU3RyaW5nIHNvcnQpIHsKLQkJcmV0dXJuIGxpc3QobWF4LCBvZmZzZXQsc29ydCxudWxsKTsKLQl9Ci0KLQotCXB1YmxpYyBMaXN0IGxpc3QoZmluYWwgaW50IG1heCwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgU3RyaW5nIHNvcnQsIGZpbmFsIFN0cmluZyBvcmRlcikgewotCQlyZXR1cm4gdGVtcGxhdGUuZXhlY3V0ZUZpbmQoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQkJCXB1YmxpYyBPYmplY3QgZG9JbkhpYmVybmF0ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBIaWJlcm5hdGVFeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJQ3JpdGVyaWEgYyA9IHNlc3Npb24uY3JlYXRlQ3JpdGVyaWEocGVyc2lzdGVudENsYXNzKTsKLQkJCQkKLQkJCQlpZihtYXggPiAtMSkKLQkJCQkJYy5zZXRNYXhSZXN1bHRzKG1heCk7Ci0JCQkJaWYob2Zmc2V0ID4gLTEpCi0JCQkJCWMuc2V0Rmlyc3RSZXN1bHQob2Zmc2V0KTsKLQkJCQkKLQkJCQlpZihzb3J0ICE9IG51bGwpIHsKLQkJCQkJaWYob3JkZXIgIT0gbnVsbCkgewotCQkJCQkJaWYob3JkZXIuZXF1YWxzSWdub3JlQ2FzZSgiREVTQyIpKSB7Ci0JCQkJCQkJYy5hZGRPcmRlcihPcmRlci5kZXNjKHNvcnQpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWMuYWRkT3JkZXIoT3JkZXIuYXNjKHNvcnQpKTsJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljLmFkZE9yZGVyKE9yZGVyLmFzYyhzb3J0KSk7Ci0JCQkJCX0KLQotCQkJCX0JCQkJCi0JCQkJcmV0dXJuIGMubGlzdCgpOwotCQkJfQkJCQotCQl9KTsKLQl9Ci0JCi0KLQlwdWJsaWMgTGlzdCBmaW5kKFN0cmluZyBieSwgT2JqZWN0IHEpIHsKLQkJcmV0dXJuIGZpbmQoYnkscSwtMSwtMSk7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZChTdHJpbmcgYnksIE9iamVjdCBxLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBmaW5kKGJ5LHEsbWF4LC0xKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBmaW5kKGZpbmFsIFN0cmluZyBieSwgT2JqZWN0IHEsIGZpbmFsIGludCBtYXgsIGZpbmFsIGludCBvZmZzZXQpIHsKLQkJaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhieSkgfHwgcSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWlmKHRoaXMuYmVhbi5pc1JlYWRhYmxlUHJvcGVydHkoYnkpKSB7Ci0JCQlDbGFzcyBwcm9wZXJ0eVR5cGUgPSB0aGlzLmJlYW4uZ2V0UHJvcGVydHlUeXBlKGJ5KTsKLQkJCWlmKCFwcm9wZXJ0eVR5cGUuaXNBc3NpZ25hYmxlRnJvbSggcS5nZXRDbGFzcygpICkpIHsKLQkJCQlxID0gY29udmVydGVyLmNvbnZlcnRWYWx1ZShjb250ZXh0LCBxLCBwcm9wZXJ0eVR5cGUpOwotCQkJfQotCQkJCi0JCQlmaW5hbCBPYmplY3QgcXVlcnkgPSBxOwotCQkJaWYocSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMudGVtcGxhdGUuZXhlY3V0ZUZpbmQoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQkJCQkJcHVibGljIE9iamVjdCBkb0luSGliZXJuYXRlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEhpYmVybmF0ZUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLQkJCQkJCUNyaXRlcmlhIGMgPSBzZXNzaW9uLmNyZWF0ZUNyaXRlcmlhKHBlcnNpc3RlbnRDbGFzcyk7Ci0JCQkJCQlpZihtYXggPiAtMSkKLQkJCQkJCQljLnNldE1heFJlc3VsdHMobWF4KTsKLQkJCQkJCWlmKG9mZnNldCA+IC0xKQotCQkJCQkJCWMuc2V0Rmlyc3RSZXN1bHQob2Zmc2V0KTsKLQkJCQkJCQotCQkJCQkJYy5hZGQoIFJlc3RyaWN0aW9ucy5lcSggYnksIHF1ZXJ5ICkgKTsKLQkJCQkJCQotCQkJCQkJcmV0dXJuIGMubGlzdCgpOwotCQkJCQl9CQkJCQkKLQkJCQl9KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGZpbmQoU3RyaW5nW10gYnksIE9iamVjdFtdIHEpIHsKLQkJcmV0dXJuIGZpbmQoYnkscSwtMSwtMSk7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZChTdHJpbmdbXSBieSwgT2JqZWN0W10gcSwgaW50IG1heCkgewotCQlyZXR1cm4gZmluZChieSxxLG1heCwtMSk7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZChmaW5hbCBTdHJpbmdbXSBieSwgT2JqZWN0W10gcSwgZmluYWwgaW50IG1heCwgZmluYWwgaW50IG9mZnNldCkgewotCQlpZihieSA9PSBudWxsIHx8IGJ5Lmxlbmd0aCA9PSAwIHx8IHEgPT0gbnVsbCB8fCBxLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCQotCQlmaW5hbCBMaXN0IGlnbm9yZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZih0aGlzLmJlYW4uaXNSZWFkYWJsZVByb3BlcnR5KGJ5W2ldKSAmJiBpIDwgcS5sZW5ndGgpIHsKLQkJCQlDbGFzcyBwcm9wZXJ0eVR5cGUgPSB0aGlzLmJlYW4uZ2V0UHJvcGVydHlUeXBlKGJ5W2ldKTsKLQkJCQlpZighcHJvcGVydHlUeXBlLmlzQXNzaWduYWJsZUZyb20oIHFbaV0uZ2V0Q2xhc3MoKSApKSB7Ci0JCQkJCXFbaV0gPSBjb252ZXJ0ZXIuY29udmVydFZhbHVlKGNvbnRleHQsIHFbaV0sIHByb3BlcnR5VHlwZSk7Ci0JCQkJfQotCQkJCWlmKHFbaV0gPT0gbnVsbCkgewotCQkJCQlpZ25vcmVMaXN0LmFkZChieVtpXSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWdub3JlTGlzdC5hZGQoYnlbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlmaW5hbCBPYmplY3RbXSBxdWVyeSA9IHE7IAotCQlpZihieS5sZW5ndGggPCBpZ25vcmVMaXN0LnNpemUoKSkgewotCQkJcmV0dXJuIHRoaXMudGVtcGxhdGUuZXhlY3V0ZUZpbmQoIG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGRvSW5IaWJlcm5hdGUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSGliZXJuYXRlRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotCQkJCQlDcml0ZXJpYSBjID0gc2Vzc2lvbi5jcmVhdGVDcml0ZXJpYShwZXJzaXN0ZW50Q2xhc3MpOwotCQkJCQlpZihtYXggPiAtMSkKLQkJCQkJCWMuc2V0TWF4UmVzdWx0cyhtYXgpOwotCQkJCQlpZihvZmZzZXQgPiAtMSkKLQkJCQkJCWMuc2V0Rmlyc3RSZXN1bHQob2Zmc2V0KTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmKCFpZ25vcmVMaXN0LmNvbnRhaW5zKGJ5W2ldKSkgewotCQkJCQkJCWMuYWRkKCBSZXN0cmljdGlvbnMuZXEoIGJ5W2ldLCBxdWVyeVtpXSApICk7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQkJCQkJCi0JCQkJCXJldHVybiBjLmxpc3QoKTsKLQkJCQl9CQkJCQkKLQkJCX0pOwkJCQotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2F2ZShPYmplY3QgZG9tYWluT2JqZWN0LCBTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0JCQotCQkJaWYodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQlFcnJvcnMgZXJyb3JzID0gbmV3IEJpbmRFeGNlcHRpb24oZG9tYWluT2JqZWN0LHBlcnNpc3RlbnRDbGFzcy5nZXROYW1lKCkpOwkJCQkKLQkJCQl2YWxpZGF0b3IudmFsaWRhdGUoZG9tYWluT2JqZWN0LGVycm9ycyk7Ci0JCQkJaWYoZXJyb3JzLmhhc0Vycm9ycygpKSB7Ci0JCQkJCWNhbGxiYWNrLnNldEVycm9ycyhlcnJvcnMpOwotCQkJCQljYWxsYmFjay5zZXRJbnZva2VkKGZhbHNlKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0JCQkJCQotCQkJfQotCQkJCi0JCQl0ZW1wbGF0ZS5zYXZlKGRvbWFpbk9iamVjdCk7CQkJCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlKGZpbmFsIE9iamVjdCBkb21haW5PYmplY3QsIGZpbmFsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spIHsJCQotCQkKLQkJdGVtcGxhdGUuZXhlY3V0ZSggbmV3IEhpYmVybmF0ZUNhbGxiYWNrKCkgewotCi0JCQlwdWJsaWMgT2JqZWN0IGRvSW5IaWJlcm5hdGUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSGliZXJuYXRlRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewotCQkJCVRyYW5zYWN0aW9uIHR4ID0gc2Vzc2lvbi5iZWdpblRyYW5zYWN0aW9uKCk7Ci0JCQkJaWYodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJRXJyb3JzIGVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKGRvbWFpbk9iamVjdCxwZXJzaXN0ZW50Q2xhc3MuZ2V0TmFtZSgpKTsKLQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKGRvbWFpbk9iamVjdCxlcnJvcnMpOwotCQkJCQlpZihlcnJvcnMuaGFzRXJyb3JzKCkpIHsKLQkJCQkJCWNhbGxiYWNrLnNldEVycm9ycyhlcnJvcnMpOwotCQkJCQkJY2FsbGJhY2suc2V0SW52b2tlZChmYWxzZSk7CQkJCQkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9CQkJCQkKLQkJCQl9CQotCQkJCQkJCQotCQkJCXNlc3Npb24udXBkYXRlKGRvbWFpbk9iamVjdCk7Ci0JCQkJdHguY29tbWl0KCk7Ci0JCQkJCi0JCQkJaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLQkJCQkJTE9HLnRyYWNlKCJbU2NhZmZvbGREb21haW5dIFVwZGF0ZWQgWyIrZG9tYWluT2JqZWN0KyJdLiBTZXR0aW5nIGludm9rZWQuIik7Ci0JCQkJfQotCQkJCWNhbGxiYWNrLnNldEludm9rZWQodHJ1ZSk7Ci0JCQkJCi0JCQkJCi0JCQkJcmV0dXJuIGRvbWFpbk9iamVjdDsKLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCXJldHVybiBjYWxsYmFjay5pc0ludm9rZWQoKTsKLQl9CQotCi0JcHVibGljIE9iamVjdCBkZWxldGUoU2VyaWFsaXphYmxlIGlkKSB7Ci0JCWlmKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCAnaWQnIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZCA9IChTZXJpYWxpemFibGUpY29udmVydGVyLmNvbnZlcnRWYWx1ZShjb250ZXh0LGlkLGlkZW50aXR5Q2xhc3MpOwotCQkKLQkJT2JqZWN0IGluc3RhbmNlID0gdGVtcGxhdGUuZ2V0KHBlcnNpc3RlbnRDbGFzcyxpZCk7Ci0JCWlmKGluc3RhbmNlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlLmRlbGV0ZShpbnN0YW5jZSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0ZW50Q2xhc3MoQ2xhc3MgcGVyc2lzdGVudENsYXNzKSB7Ci0JCWlmKHBlcnNpc3RlbnRDbGFzcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgJ3BlcnNpc3RlbnRDbGFzcycgY2Fubm90IGJlIG51bGwiKTsKLQkJCi0JCXRoaXMucGVyc2lzdGVudENsYXNzID0gcGVyc2lzdGVudENsYXNzOwotCQl0cnkgewotCQkJdGhpcy5iZWFuID0gbmV3IEJlYW5XcmFwcGVySW1wbChwZXJzaXN0ZW50Q2xhc3MubmV3SW5zdGFuY2UoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNjYWZmb2xkaW5nRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgcGVyc2lzdGVudCBjbGFzcyBbIitwZXJzaXN0ZW50Q2xhc3MrIl0gZm9yIHNjYWZmb2xkaW5nOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTY2FmZm9sZGluZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIHBlcnNpc3RlbnQgY2xhc3MgWyIrcGVyc2lzdGVudENsYXNzKyJdIGZvciBzY2FmZm9sZGluZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KFNlcmlhbGl6YWJsZSBpZCkgewotCQlpZihpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgJ2lkJyBjYW5ub3QgYmUgbnVsbCIpOwotCQlpZihpZGVudGl0eUNsYXNzICE9IG51bGwpCi0JCSAgICBpZCA9IChTZXJpYWxpemFibGUpY29udmVydGVyLmNvbnZlcnRWYWx1ZShjb250ZXh0LGlkLGlkZW50aXR5Q2xhc3MpOwotCi0gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5nZXQocGVyc2lzdGVudENsYXNzLGlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdXJhbE5hbWUoKSB7Ci0JCXJldHVybiBHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnR5TmFtZVJlcHJlc2VudGF0aW9uKHBlcnNpc3RlbnRDbGFzcykgKyBMSVNUX1NVRkZJWDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0UGVyc2lzdGVudENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50Q2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaW5ndWxhck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnR5TmFtZVJlcHJlc2VudGF0aW9uKHBlcnNpc3RlbnRDbGFzcyk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5pZGVudGl0eVByb3BlcnR5TmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVudENsYXNzLmdldE5hbWUoKTsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50Q2xhc3MubmV3SW5zdGFuY2UoKTsJCQotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTY2FmZm9sZGluZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIHBlcnNpc3RlbnQgY2xhc3MgWyIrcGVyc2lzdGVudENsYXNzKyJdIGZvciBzY2FmZm9sZGluZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2NhZmZvbGRpbmdFeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBwZXJzaXN0ZW50IGNsYXNzIFsiK3BlcnNpc3RlbnRDbGFzcysiXSBmb3Igc2NhZmZvbGRpbmc6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gCi0JfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkMWVkMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRTY2FmZm9sZFJlcXVlc3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuYmluZGluZy5HcmFpbHNEYXRhQmluZGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5TZXJ2bGV0UmVxdWVzdERhdGFCaW5kZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIgaW50ZXJmYWNlCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMwIE5vdiAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2NhZmZvbGRSZXF1ZXN0SGFuZGxlciBpbXBsZW1lbnRzIFNjYWZmb2xkUmVxdWVzdEhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRTY2FmZm9sZFJlcXVlc3RIYW5kbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9NQVggPSAibWF4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fT0ZGU0VUID0gIm9mZnNldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0lEID0gImlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU09SVCA9ICJzb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fT1JERVIgPSAib3JkZXIiOwotCi0gICAgcHJpdmF0ZSBTY2FmZm9sZERvbWFpbiBkb21haW47Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2FmZm9sZERvbWFpbihTY2FmZm9sZERvbWFpbiBkb21haW4pIHsKLSAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47Ci0gICAgfQotCi0gICAgcHVibGljIFNjYWZmb2xkRG9tYWluIGdldFNjYWZmb2xkRG9tYWluKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb21haW47Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBoYW5kbGVMaXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIGludCBtYXggPSAxMDsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIFN0cmluZyBtYXhQYXJhbSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFBBUkFNX01BWCk7Ci0gICAgICAgIFN0cmluZyBvZmZzZXRQYXJhbSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFBBUkFNX09GRlNFVCk7Ci0KLSAgICAgICAgaWYoIVN0cmluZ1V0aWxzLmlzQmxhbmsobWF4UGFyYW0pKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1heCA9IEludGVnZXIucGFyc2VJbnQobWF4UGFyYW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJbU2NhZmZvbGRSZXF1ZXN0SGFuZGxlcl0gRXJyb3IgcGFyc2luZyBtYXggcGFyYW1ldGVyIFsiK21heFBhcmFtKyJdIGZvciByZXF1ZXN0IiwgbmZlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZighU3RyaW5nVXRpbHMuaXNCbGFuayhvZmZzZXRQYXJhbSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gSW50ZWdlci5wYXJzZUludChvZmZzZXRQYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIltTY2FmZm9sZFJlcXVlc3RIYW5kbGVyXSBFcnJvciBwYXJzaW5nIG9mZnNldCBwYXJhbWV0ZXIgWyIrb2Zmc2V0UGFyYW0rIl0gZm9yIHJlcXVlc3QiLCBuZmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cudHJhY2UoIltTY2FmZm9sZFJlcXVlc3RIYW5kbGVyXSBFeGVjdXRpbmcgW2xpc3RdIGZvciBtYXggWyIrbWF4KyJdIGFuZCBvZmZzZXQgWyIrb2Zmc2V0KyJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1vZGVsID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbW9kZWwucHV0KCBkb21haW4uZ2V0UGx1cmFsTmFtZSgpLCBkb21haW4ubGlzdChtYXgsIG9mZnNldCwgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1fU09SVCksIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFBBUkFNX09SREVSKSkgKTsKLQotICAgICAgICBpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKCJbU2NhZmZvbGRSZXF1ZXN0SGFuZGxlcl0gUmV0dXJuZWQgbW9kZWwgWyIrbW9kZWwrIl0gZnJvbSBkb21haW4gbWV0aG9kIFtsaXN0XSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgaGFuZGxlU2hvdyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjaykgewotCi0gICAgICAgIFN0cmluZyBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFBBUkFNX0lEKTsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhpZCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiW1NjYWZmb2xkUmVxdWVzdEhhbmRsZXJdIE5vIElEIHBhcmFtZXRlciBbIitpZCsiXSBmb3IgcmVxdWVzdCBbc2hvd10iKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLnNldEludm9rZWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgTWFwIG1vZGVsID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgT2JqZWN0IGRvbWFpbk9iamVjdCA9IGRvbWFpbi5nZXQoaWQpOwotICAgICAgICBtb2RlbC5wdXQoZG9tYWluLmdldFNpbmd1bGFyTmFtZSgpLCBkb21haW5PYmplY3QpOwotICAgICAgICBjYWxsYmFjay5zZXRJbnZva2VkKHRydWUpOwotCi0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGhhbmRsZURlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1fSUQpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGlkKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJbU2NhZmZvbGRSZXF1ZXN0SGFuZGxlcl0gTm8gSUQgcGFyYW1ldGVyIFsiK2lkKyJdIGZvciByZXF1ZXN0IFtkZWxldGVdIik7Ci0gICAgICAgICAgICBjYWxsYmFjay5zZXRJbnZva2VkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIE1hcCBtb2RlbCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE9iamVjdCBkb21haW5PYmplY3QgPSBkb21haW4uZ2V0KGlkKTsKLSAgICAgICAgbW9kZWwucHV0KGRvbWFpbi5nZXRTaW5ndWxhck5hbWUoKSwgZG9tYWluT2JqZWN0KTsKLQotICAgICAgICBpZihkb21haW5PYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9tYWluLmRlbGV0ZShpZCk7Ci0gICAgICAgICAgICBjYWxsYmFjay5zZXRJbnZva2VkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgaGFuZGxlQ3JlYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICBPYmplY3QgZG9tYWluT2JqZWN0ID0gZG9tYWluLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZsZXRSZXF1ZXN0RGF0YUJpbmRlciBkYXRhQmluZGVyID0gR3JhaWxzRGF0YUJpbmRlci5jcmVhdGVCaW5kZXIoZG9tYWluT2JqZWN0LCBkb21haW4uZ2V0TmFtZSgpLHJlcXVlc3QpOwotICAgICAgICBkYXRhQmluZGVyLmJpbmQocmVxdWVzdCk7Ci0KLSAgICAgICAgTWFwIG1vZGVsID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbW9kZWwucHV0KCBkb21haW4uZ2V0U2luZ3VsYXJOYW1lKCksIGRvbWFpbk9iamVjdCk7Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgaGFuZGxlU2F2ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXBvbnNlLCBTY2FmZm9sZENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0KLSAgICAgICAgT2JqZWN0IGRvbWFpbk9iamVjdCA9IGRvbWFpbi5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0UmVxdWVzdERhdGFCaW5kZXIgZGF0YUJpbmRlciA9IEdyYWlsc0RhdGFCaW5kZXIuY3JlYXRlQmluZGVyKGRvbWFpbk9iamVjdCwgZG9tYWluLmdldE5hbWUoKSxyZXF1ZXN0KTsKLSAgICAgICAgZGF0YUJpbmRlci5iaW5kKHJlcXVlc3QpOwotCi0gICAgICAgIE1hcCBtb2RlbCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG1vZGVsLnB1dCggZG9tYWluLmdldFNpbmd1bGFyTmFtZSgpLCBkb21haW5PYmplY3QpOwotCi0gICAgICAgIGlmKCB0aGlzLmRvbWFpbi5zYXZlKGRvbWFpbk9iamVjdCxjYWxsYmFjaykgKSB7Ci0gICAgICAgICAgICBCZWFuV3JhcHBlciBkb21haW5CZWFuID0gbmV3IEJlYW5XcmFwcGVySW1wbChkb21haW5PYmplY3QpOwotICAgICAgICAgICAgT2JqZWN0IGlkZW50aXR5ID0gZG9tYWluQmVhbi5nZXRQcm9wZXJ0eVZhbHVlKGRvbWFpbi5nZXRJZGVudGl0eVByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgICAgIG1vZGVsLnB1dCggUEFSQU1fSUQsIGlkZW50aXR5ICk7Ci0gICAgICAgICAgICBjYWxsYmFjay5zZXRJbnZva2VkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBNYXAgaGFuZGxlVXBkYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgU3RyaW5nIGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1fSUQpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGlkKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJbU2NhZmZvbGRSZXF1ZXN0SGFuZGxlcl0gTm8gSUQgcGFyYW1ldGVyIFsiK2lkKyJdIGZvciByZXF1ZXN0IFt1cGRhdGVdIik7Ci0gICAgICAgICAgICBjYWxsYmFjay5zZXRJbnZva2VkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZG9tYWluT2JqZWN0ID0gdGhpcy5kb21haW4uZ2V0KGlkKTsKLSAgICAgICAgU2VydmxldFJlcXVlc3REYXRhQmluZGVyIGRhdGFCaW5kZXIgPSBHcmFpbHNEYXRhQmluZGVyLmNyZWF0ZUJpbmRlcihkb21haW5PYmplY3QsIGRvbWFpbi5nZXROYW1lKCkscmVxdWVzdCk7Ci0gICAgICAgIGRhdGFCaW5kZXIuYmluZChyZXF1ZXN0KTsKLQotICAgICAgICBNYXAgbW9kZWwgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBtb2RlbC5wdXQoCXRoaXMuZG9tYWluLmdldFNpbmd1bGFyTmFtZSgpLCBkb21haW5PYmplY3QpOwotICAgICAgICBtb2RlbC5wdXQoIFBBUkFNX0lELCBpZCApOwotICAgICAgICAvLyBleGVjdXRlIHVwZGF0ZQotICAgICAgICB0aGlzLmRvbWFpbi51cGRhdGUoZG9tYWluT2JqZWN0LGNhbGxiYWNrKTsKLQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBoYW5kbGVGaW5kKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5ZjZjOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RvbWFpbkNsYXNzUHJvcGVydHlDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy52YWxpZGF0aW9uLkNvbnN0cmFpbmVkUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENvbXBhcmF0b3IgdGhhdCB1c2VzIHRoZSBkb21haW4gY2xhc3MgcHJvcGVydHkgY29uc3RyYWludHMgdG8gZXN0YWJsaXNoIG9yZGVyIGluIHNvcnQgbWV0aG9kcyBhbmQgYWx3YXlzCi0gKiBwbGFjZXMgdGhlIGlkIGZpcnN0Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTAtRmViLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkNsYXNzUHJvcGVydHlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0gICAgcHJpdmF0ZSBNYXAgY29uc3RyYWluZWRQcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3M7Ci0KLSAgICBwdWJsaWMgRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IoR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MpIHsKLSAgICAgICAgaWYoZG9tYWluQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50ICdkb21haW5DbGFzcycgaXMgcmVxdWlyZWQhIik7Ci0KLSAgICAgICAgdGhpcy5jb25zdHJhaW5lZFByb3BlcnRpZXMgPSBkb21haW5DbGFzcy5nZXRDb25zdHJhaW5lZFByb3BlcnRpZXMoKTsKLSAgICAgICAgdGhpcy5kb21haW5DbGFzcyA9IGRvbWFpbkNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICBpZihvMS5lcXVhbHMoZG9tYWluQ2xhc3MuZ2V0SWRlbnRpZmllcigpKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZWxzZSBpZihvMi5lcXVhbHMoZG9tYWluQ2xhc3MuZ2V0SWRlbnRpZmllcigpKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgcHJvcDEgPSAoR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSlvMTsKLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eSBwcm9wMiA9IChHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5KW8yOwotCi0gICAgICAgIENvbnN0cmFpbmVkUHJvcGVydHkgY3AxID0gKENvbnN0cmFpbmVkUHJvcGVydHkpY29uc3RyYWluZWRQcm9wZXJ0aWVzLmdldChwcm9wMS5nZXROYW1lKCkpOwotICAgICAgICBDb25zdHJhaW5lZFByb3BlcnR5IGNwMiA9IChDb25zdHJhaW5lZFByb3BlcnR5KWNvbnN0cmFpbmVkUHJvcGVydGllcy5nZXQocHJvcDIuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZihjcDEgPT0gbnVsbCAmIGNwMiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByb3AxLmdldE5hbWUoKS5jb21wYXJlVG8ocHJvcDIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYoY3AxID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZSBpZihjcDIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZihjcDEuZ2V0T3JkZXIoKSA+IGNwMi5nZXRPcmRlcigpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgZWxzZSBpZihjcDEuZ2V0T3JkZXIoKSA8IGNwMi5nZXRPcmRlcigpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzU2NhZmZvbGREb21haW4uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzU2NhZmZvbGREb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzOTA2OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0dyYWlsc1NjYWZmb2xkRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5tZXRhY2xhc3MuRG9tYWluQ2xhc3NNZXRob2RzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUubWV0YWNsYXNzLkRlbGV0ZVBlcnNpc3RlbnRNZXRob2Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5tZXRhY2xhc3MuU2F2ZVBlcnNpc3RlbnRNZXRob2Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgZGVmYXVsdCBkb21haW4gdG8gZGVsZWdhdGUgdG8gR3JhaWxzIHNwZWNpZmljIGR5bmFtaWMgbWV0aG9kcwotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDIzLUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNTY2FmZm9sZERvbWFpbiBleHRlbmRzIERlZmF1bHRTY2FmZm9sZERvbWFpbiBpbXBsZW1lbnRzIFNjYWZmb2xkRG9tYWluewotICAgIHB1YmxpYyBHcmFpbHNTY2FmZm9sZERvbWFpbihDbGFzcyBwZXJzaXN0ZW50Q2xhc3MsIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKHBlcnNpc3RlbnRDbGFzcywgc2Vzc2lvbkZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNhdmUoT2JqZWN0IGRvbWFpbk9iamVjdCwgU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbilJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChkb21haW5PYmplY3QsU2F2ZVBlcnNpc3RlbnRNZXRob2QuTUVUSE9EX1NJR05BVFVSRSwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICBjYWxsYmFjay5zZXRFcnJvcnMoKEVycm9ycylJbnZva2VySGVscGVyLmdldFByb3BlcnR5KGRvbWFpbk9iamVjdCwgRG9tYWluQ2xhc3NNZXRob2RzLkVSUk9SU19QUk9QRVJUWSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGZpbmFsIE9iamVjdCBkb21haW5PYmplY3QsIGZpbmFsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgQm9vbGVhbiBiID0gKEJvb2xlYW4pSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoZG9tYWluT2JqZWN0LFNhdmVQZXJzaXN0ZW50TWV0aG9kLk1FVEhPRF9TSUdOQVRVUkUsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBiLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZighc3VjY2VzcykgewotICAgICAgICAgICAgY2FsbGJhY2suc2V0RXJyb3JzKChFcnJvcnMpSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShkb21haW5PYmplY3QsIERvbWFpbkNsYXNzTWV0aG9kcy5FUlJPUlNfUFJPUEVSVFkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZGVsZXRlKFNlcmlhbGl6YWJsZSBpZCkgewotICAgICAgICBPYmplY3QgZG9tYWluT2JqZWN0ID0gZ2V0KGlkKTsKLQotICAgICAgICBpZihkb21haW5PYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoZG9tYWluT2JqZWN0LCBEZWxldGVQZXJzaXN0ZW50TWV0aG9kLk1FVEhPRF9TSUdOQVRVUkUsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb21haW5PYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9HcmFpbHNTY2FmZm9sZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0dyYWlsc1NjYWZmb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0NzE1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0dyYWlsc1NjYWZmb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGZhY2lsaXRhdGVzIHRoZSByZXF1aXJlZCBtZXRob2RzIGZvciB1c2luZyBTY2FmZm9sZGluZyB3aXRoaW4gR3JhaWxzQ29udHJvbGxlcnMgCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMwIE5vdiAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzU2NhZmZvbGRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBzY2FmZm9sZGVyCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0FjdGlvbihTdHJpbmcgYWN0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBBIFN0cmluZyBhcnJheSBvZiBhY3Rpb25zIG5hbWVzIHN1cHBvcnRlZCBieSB0aGUgc2NhZmZvbGRlcgotCSAqLwotCVN0cmluZ1tdIGdldFN1cHBvcnRlZEFjdGlvbk5hbWVzKCk7Ci0JLyoqCi0JICogQHBhcmFtIGFjdGlvbk5hbWUKLQkgKiBAcmV0dXJuIEEgQ2xvc3VyZSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBhY3Rpb24gbmFtZQotCSAqLwotCUNsb3N1cmUgZ2V0QWN0aW9uKEdyb292eU9iamVjdCBjb250cm9sbGVyLFN0cmluZyBhY3Rpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbG9zdXJlIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGFjdGlvbiBUaGUgY2xvc3VyZSBhY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24KLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aW9uTmFtZShDbG9zdXJlIGFjdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqICBAcmV0dXJuIFRoZSBTY2FmZm9sZFJlcXVlc3RIYW5kbGVyIGluc3RhbmNlCi0gICAgICovCi0gICAgU2NhZmZvbGRSZXF1ZXN0SGFuZGxlciBnZXRTY2FmZm9sZFJlcXVlc3RIYW5kbGVyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3ZTc1OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0dyYWlsc1RlbXBsYXRlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIG1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgR3JhaWxzIGFydGlmYWN0cyBmcm9tIGEgZG9tYWluIGNsYXNzCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDktRmViLTIwMDYKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvciB7Ci0KLSAgICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBuZWNlc3Nhcnkgdmlld3MgZm9yIHRoZSBzdXBwbGllZCBkb21haW4gY2xhc3MKLSAgICAgKiBAcGFyYW0gZG9tYWluQ2xhc3MKLSAgICAgKi8KLSAgICB2b2lkIGdlbmVyYXRlVmlld3MoR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MsIFN0cmluZyBkZXN0RGlyKTsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgZm9yIHRoZSBzdXBwbGllZCBkb21haW4gY2xhc3MKLSAgICAgKiBAcGFyYW0gZG9tYWluQ2xhc3MKLSAgICAgKi8KLSAgICB2b2lkIGdlbmVyYXRlQ29udHJvbGxlcihHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcywgU3RyaW5nIGRlc3REaXIpOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgZ2VuZXJhdG9yIHNob3VsZCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKGRlZmF1bHRzIHRvIGZhbHNlKQotICAgICAqCi0gICAgICogQHBhcmFtIHNob3VsZE92ZXJ3cml0ZQotICAgICAqLwotICAgIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gc2hvdWxkT3ZlcndyaXRlKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvU2NhZmZvbGRDYWxsYmFjay5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTMyYTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2NhZmZvbGRDYWxsYmFjayB7Ci0KLQlib29sZWFuIGlzSW52b2tlZCgpOwotCQotCXZvaWQgc2V0SW52b2tlZChib29sZWFuIGludm9rZWQpOwotCQotCUVycm9ycyBnZXRFcnJvcnMoKTsKLQkKLQl2b2lkIHNldEVycm9ycyhFcnJvcnMgZXJyb3JzKTsKLQkKLQlNYXAgZ2V0TW9kZWwoKTsKLQkKLQl2b2lkIHNldE1vZGVsKE1hcCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkRG9tYWluLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGNhZGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZERvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBtYWluIGludGVyZmFjZSB1c2VkIGJ5IHNjYWZmb2xkZWQgY29udHJvbGxlcnMgdG8gYWNjZXNzIGluc3RhbmNlcyBvZiBwZXJzaXN0ZW50IGNsYXNzZXMKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2FmZm9sZERvbWFpbiB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBpZGVudGl0eSBwcm9wZXJ0eSBzbyB0aGF0IHR5cGUgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkCi0gICAgICogQHBhcmFtIGlkZW50aXR5UHJvcGVydHlOYW1lCi0gICAgICovCi0gICAgdm9pZCBzZXRJZGVudGl0eVByb3BlcnR5TmFtZShTdHJpbmcgaWRlbnRpdHlQcm9wZXJ0eU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsaWRhdG9yIHRvIHVzZQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IKLSAgICAgKi8KLSAgICB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKTsKLSAgICAvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHNjYWZmb2xkZWQgcGVyc2lzdGVudCBjbGFzcwotCSAqLwotCUNsYXNzIGdldFBlcnNpc3RlbnRDbGFzcygpOwotCQkKLQkvKiogCi0JICogQHJldHVybiBBbGwgcGVyc2lzdGVudCBpbnN0YW5jZXMgb2YgdGhlIHNjYWZmb2xkZWQgY2xhc3MgCi0JICovCi0JTGlzdCBsaXN0KCk7Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIG1heCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzIHRvIHJldHVybgotCSAqIEByZXR1cm4gQWxsIHBlcnNpc3RlbnQgaW5zdGFuY2VzIHVwIHRvIHRoZSBtYXhpbXVtIHNwZWNpZmllZCB2YWx1ZQotCSAqLwotCUxpc3QgbGlzdChpbnQgbWF4KTsKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIG51bWJlciB0byByZXR1cm4KLQkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgcG9zaXRpb24KLQkgKiBAcmV0dXJuIEFsbCBwZXJzaXN0ZW50IGluc3RhbmNlcyB1cCB0byB0aGUgbWF4aW11bSwgb2Zmc2V0IGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKi8KLQlMaXN0IGxpc3QoaW50IG1heCwgaW50IG9mZnNldCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1heCBUaGUgbWF4aW11bSBudW1iZXIgdG8gcmV0dXJuIChTZXQgdG8gLTEgZm9yIG5vIG1heGltdW0pCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHBvc2l0aW9uIChTZXQgdG8gLTEgZm9yIG5vIG9mZnNldCkKLQkgKiBAcGFyYW0gb3JkZXIgZWl0aGVyICJBU0MiIGZvciBhc2NlbmRpbmcgb3IgIkRFU0MiIGZvciBkZXNjZW5kaW5nCi0JICogCi0JICogQHJldHVybiBBbGwgcGVyc2lzdGVudCBpbnN0YW5jZXMgdXAgdG8gdGhlIG1heGltdW0sIG9mZnNldCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICovCi0JTGlzdCBsaXN0KGludCBtYXgsIGludCBvZmZzZXQsIFN0cmluZyBzb3J0KTsJCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1heCBUaGUgbWF4aW11bSBudW1iZXIgdG8gcmV0dXJuIChTZXQgdG8gLTEgZm9yIG5vIG1heGltdW0pCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHBvc2l0aW9uIChTZXQgdG8gLTEgZm9yIG5vIG9mZnNldCkKLQkgKiBAcGFyYW0gb3JkZXIgZWl0aGVyICJBU0MiIGZvciBhc2NlbmRpbmcgb3IgIkRFU0MiIGZvciBkZXNjZW5kaW5nCi0JICogQHBhcmFtIHNvcnQgVGhlIHByb3BlcnR5IG5hbWUgdG8gc29ydCBieSAKLQkgKiAKLQkgKiBAcmV0dXJuIEFsbCBwZXJzaXN0ZW50IGluc3RhbmNlcyB1cCB0byB0aGUgbWF4aW11bSwgb2Zmc2V0IGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKi8KLQlMaXN0IGxpc3QoaW50IG1heCwgaW50IG9mZnNldCwgU3RyaW5nIHNvcnQsIFN0cmluZyBvcmRlcik7CQotCS8qKgotCSAqIEZpbmRzIGFsbCBwZXJzaXN0ZW50IGluc3RhbmNlcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBieSBUaGUgcHJvcGVydHkgdG8gZmluZCBieQotCSAqIEBwYXJhbSBxIFRoZSBxdWVyeSBjcml0ZXJpYQotCSAqIEByZXR1cm4gQSBsaXN0IG9mIGZvdW5kIHBlcnNpc3RlbnQgaW5zdGFuY2VzCi0JICovCi0JTGlzdCBmaW5kKFN0cmluZyBieSwgT2JqZWN0IHEpOwotCQotCS8qKgotCSAqIEBzZWUgI2ZpbmQoU3RyaW5nLCBPYmplY3QpIGZvciBkZXNjcmlwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuCi0JICovCi0JTGlzdCBmaW5kKFN0cmluZyBieSwgT2JqZWN0IHEsIGludCBtYXgpOwotCQotCS8qKgotCSAqIEBzZWUgI2ZpbmQoU3RyaW5nLCBPYmplY3QpIGZvciBkZXNjcmlwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHBvc2l0aW9uCi0JICovCQotCUxpc3QgZmluZChTdHJpbmcgYnksT2JqZWN0IHEsIGludCBtYXgsIGludCBvZmZzZXQpOwotCQotCS8qKgotCSAqIEZpbmRzIGFsbCB0aGUgcGVyc2lzdGVudCBpbnN0YW5jZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBhbmQgcXVlcnkgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIGJ5IFRoZSBwcm9wZXJ0aWVzIHRvIGZpbmQgYnkKLQkgKiBAcGFyYW0gcSBUaGUgcXVlcnkgdmFsdWVzCi0JICogQHJldHVybiBBIGxpc3Qgb2YgcGVyc2lzdGVudCBpbnN0YW5jZXMKLQkgKi8KLQlMaXN0IGZpbmQoU3RyaW5nW10gYnksIE9iamVjdFtdIHEpOwotCQotCS8qKgotCSAqIEBzZWUgI2ZpbmQoU3RyaW5nW10sIE9iamVjdFtdKSBmb3IgZGVzY3JpcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybgotCSAqLwotCUxpc3QgZmluZChTdHJpbmdbXSBieSwgT2JqZWN0IHFbXSwgaW50IG1heCk7Ci0JCi0JLyoqCi0JICogQHNlZSAjZmluZChTdHJpbmdbXSwgT2JqZWN0W10pIGZvciBkZXNjcmlwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHBvc2l0aW9uCi0JICovCQotCUxpc3QgZmluZChTdHJpbmdbXSBieSxPYmplY3RbXSBxLCBpbnQgbWF4LCBpbnQgb2Zmc2V0KTsJCi0JCi0JLyoqCi0JICogU2F2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHBlcnNpc3RlbnQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzCi0JICogCi0JICogQHBhcmFtIGRvbWFpbk9iamVjdCBUaGUgZG9tYWluIG9iamVjdCB0byBzYXZlCi0JICogQHBhcmFtIGNhbGxiYWNrIEFueSB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IG1heSBoYXZlIG9jY3VyZWQgZHVyaW5nIHNhdmluZwotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGluc3RhbmNlIG9yIG51bGwgaWYgc2F2ZSB3YXMgdW5zdWNjZXNzZnVsCi0JICovCi0JYm9vbGVhbiBzYXZlKE9iamVjdCBkb21haW5PYmplY3QsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spOwotCQotCS8qKgotCSAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gZG9tYWluT2JqZWN0Ci0JICogQHJldHVybiBUaGUgdXBkYXRlZCBpbnN0YW5jZQotCSAqLwotCWJvb2xlYW4gdXBkYXRlKE9iamVjdCBkb21haW5PYmplY3QsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spOwotCQotCS8qKgotCSAqIAkKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JT2JqZWN0IGRlbGV0ZShTZXJpYWxpemFibGUgaWQpOwotCQotCS8qKgotCSAqIFJldHJpZXZlcyBhbiBwZXJzaXN0ZW50IGNsYXNzIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGlkCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCU9iamVjdCBnZXQoU2VyaWFsaXphYmxlIGlkKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVyYWwgbmFtZSBvZiB0aGUgZG9tYWluCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRQbHVyYWxOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBuYW1lIG9mIHRoZSBkb21haW4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldFNpbmd1bGFyTmFtZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgaWRlbnRpdHkgcHJvcGVydHkgbmFtZQotCSAqLwotCVN0cmluZyBnZXRJZGVudGl0eVByb3BlcnR5TmFtZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBkb21haW4gY2xhc3MKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgZG9tYWluIGNsYXNzCi0JICovCi0JT2JqZWN0IG5ld0luc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkUmVxdWVzdEhhbmRsZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvU2NhZmZvbGRSZXF1ZXN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE4ZmY1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvU2NhZmZvbGRSZXF1ZXN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBkZWZpbmluZyBtZXRob2RzIHRvIGhhbmRsZSBDUlVEIG9wZXJhdGlvbnMgaW52b2x2ZWQgaW4gc2NhZmZvbGRpbmcKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotcHVibGljIGludGVyZmFjZSBTY2FmZm9sZFJlcXVlc3RIYW5kbGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRvbWFpbiB0byB1c2UgZHVyaW5nIHNjYWZmb2xkaW5nLiBBIHNjYWZmb2xkIGRvbWFpbiBwcm92aWRlcyBtZXRob2RzIHRvIG1hbmlwdWxhdGUKLQkgKiB0aGUgc2NhZmZvbGRlZCBwZXJzaXN0ZW50IGNsYXNzCi0JICogQHBhcmFtIGRvbWFpbgotCSAqLwotCXZvaWQgc2V0U2NhZmZvbGREb21haW4oU2NhZmZvbGREb21haW4gZG9tYWluKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGRvbWFpbiBiZWluZyBzY2FmZm9sZGVkCi0gICAgICovCi0gICAgU2NhZmZvbGREb21haW4gZ2V0U2NhZmZvbGREb21haW4oKTsKLQotICAgIC8qKgotCSAqIEhhbmRsZXMgYSByZXF1ZXN0IHRvIGxpc3QgYWxsIHNjYWZmb2xkZWQgaW5zdGFuY2VzCi0JICogQHBhcmFtIHJlcXVlc3QgCi0JICogQHBhcmFtIHJlcG9uc2UKLQkgKiBAcmV0dXJuIE9wdGlvbmFsbHkgYSBtYXAgd2hpY2ggcmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1vZGVsCi0JICovCi0JTWFwIGhhbmRsZUxpc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVwb25zZSk7Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIHJlcXVlc3QgdG8gc2hvdyBhIHNjYWZmb2xkZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSByZXBvbnNlCi0JICogQHJldHVybiBPcHRpb25hbGx5IGEgbWFwIHdoaWNoIHJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtb2RlbAotCSAqLwotCU1hcCBoYW5kbGVTaG93KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spOwotCQotCS8qKgotCSAqIEhhbmRsZXMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBhIHNjYWZmb2xkZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSByZXBvbnNlCi0JICogQHJldHVybiBPcHRpb25hbGx5IGEgbWFwIHdoaWNoIHJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtb2RlbAotCSAqLwkKLQlNYXAgaGFuZGxlRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIGNyZWF0ZSByZXF1ZXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXBvbnNlCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICogQHJldHVybiBPcHRpb25hbGx5IGEgbWFwIHdoaWNoIHJlcGVyZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbW9kZWwKLSAgICAgKi8KLSAgICBNYXAgaGFuZGxlQ3JlYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcG9uc2UsIFNjYWZmb2xkQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIC8qKgotCSAqIEhhbmRsZXMgYSByZXF1ZXN0IHRvIHNhdmUgYSBzY2FmZm9sZGVkIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVwb25zZQotCSAqIEByZXR1cm4gT3B0aW9uYWxseSBhIG1hcCB3aGljaCByZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbW9kZWwKLQkgKi8JCi0JTWFwIGhhbmRsZVNhdmUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVwb25zZSwgU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjayk7Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIHJlcXVlc3QgdG8gdXBkYXRlIGEgc2NhZmZvbGRlZCBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIHJlcG9uc2UKLQkgKiBAcmV0dXJuIE9wdGlvbmFsbHkgYSBtYXAgd2hpY2ggcmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1vZGVsCi0JICovCQotCU1hcCBoYW5kbGVVcGRhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVwb25zZSwgU2NhZmZvbGRDYWxsYmFjayBjYWxsYmFjayk7CQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSByZXF1ZXN0IHRvIGZpbmQgYSBzY2FmZm9sZGVkIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVwb25zZQotCSAqIEByZXR1cm4gT3B0aW9uYWxseSBhIG1hcCB3aGljaCByZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbW9kZWwKLQkgKi8JCi0JTWFwIGhhbmRsZUZpbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVwb25zZSk7Ci0JCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFJlc3BvbnNlSGFuZGxlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFJlc3BvbnNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmUyYTEzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvU2NhZmZvbGRSZXNwb25zZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lk1vZGVsQW5kVmlldzsKLS8qKgotICogQW4gaW50ZXJmYWNlIGRlZmluaW5nIG1ldGhvZHMgdG8gaGFuZGxlIHJlc3BvbnNlcy4gSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSByZXNwb25zaWJsZSAKLSAqIGZvciB0cmFuc2Zvcm1pbmcgdGhlIG1vZGVsIGludG8gYW4gYXBwcm9wcmlhdGUgTW9kZWxBbmRWaWV3IGluc3RhbmNlIG9yIHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlCi0gKiByZXNwb25zZQotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAzMCBOb3YgMjAwNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHJlc3BvbnNlIGZvciBhIFNjYWZmb2xkZWQgbW9kZWwgYW5kIG9wdGlvbmFsbHkgcmV0dXJucyBhIE1vZGVsQW5kVmlldyBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IAotCSAqIEBwYXJhbSByZXNwb25zZQotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEByZXR1cm4KLQkgKi8KLQlNb2RlbEFuZFZpZXcgaGFuZGxlUmVzcG9uc2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjdGlvbk5hbWUsIE1hcCBtb2RlbCk7Ci0JCi0JLyoqCi0JICogVGhlIHZpZXcgcmVzb2x2ZXIgdG8gdXNlIGZvciByZXNvdmxpbmcgdmlld3MgZm9yIHRoZSByZXNwb25zZQotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqLwotCXZvaWQgc2V0U2NhZmZvbGRWaWV3UmVzb2x2ZXIoU2NhZmZvbGRWaWV3UmVzb2x2ZXIgcmVzb2x2ZXIpOwotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFJlc3BvbnNlSGFuZGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjODgyZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkUmVzcG9uc2VIYW5kbGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgZmFjdG9yeSBtZXRoZHMgZm9yIGNyZWF0aW5nIFNjYWZmb2xkUmVzcG9uc2UgaW5zdGFuY2VzCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMwIE5vdiAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NhZmZvbGRSZXNwb25zZUhhbmRsZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFJldHJpZXZlcyBhIHNjYWZmb2xkIHJlc3BvbnNlIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgdXJpCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCVNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyIGdldFNjYWZmb2xkUmVzcG9uc2VIYW5kbGVyKFN0cmluZyB1cmkpOwotCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFZpZXdSZXNvbHZlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFZpZXdSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVmNjRhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvU2NhZmZvbGRWaWV3UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIHRoZSBzdHJhdGVneSBmb3IgcmVzb2x2aW5nIHZpZXcgbmFtZXMgZnJvbSBhIHNjYWZmb2xkZWQgVVJJCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMwIE5vdiAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NhZmZvbGRWaWV3UmVzb2x2ZXIgewotCQotCVN0cmluZyByZXNvbHZlVmlld0ZvclVyaShTdHJpbmcgdXJpKTsKLQlTdHJpbmcgcmVzb2x2ZVZpZXdGb3JVcmlBbmRBY3Rpb24oU3RyaW5nIHVyaSwgU3RyaW5nIGFjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NlcnZsZXRDb250ZXh0VGVtcGxhdGVGYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NlcnZsZXRDb250ZXh0VGVtcGxhdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNmViNGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TZXJ2bGV0Q29udGV4dFRlbXBsYXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IGdyb292eS50ZXh0LlNpbXBsZVRlbXBsYXRlRW5naW5lOwotaW1wb3J0IGdyb292eS50ZXh0LlRlbXBsYXRlOwotaW1wb3J0IGdyb292eS50ZXh0LlRlbXBsYXRlRW5naW5lOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBIHRlbXBsYXRlIGZhY3RvcnkgdGhhdCBsb29rcyB1cCB0ZW1wbGF0ZXMgZnJvbSB0aGUgc2VydmxldCBjb250ZXh0Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDYtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRDb250ZXh0VGVtcGxhdGVGYWN0b3J5IGltcGxlbWVudHMgVGVtcGxhdGVGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZsZXRDb250ZXh0VGVtcGxhdGVGYWN0b3J5LmNsYXNzKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1BSRUZJWCA9ICIvV0VCLUlORi9ncmFpbHMtYXBwL3ZpZXdzL3NjYWZmb2xkaW5nLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TVUZGSVggPSAiLmdzcCI7Ci0KLSAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgIHByaXZhdGUgVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTsKLSAgICBwcml2YXRlIE1hcCBjYWNoZWRUZW1wbGF0ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIGNhY2hlZFVybHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dFRlbXBsYXRlRmFjdG9yeShTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgewotICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIGNsYXNzIHRvIGhvbGQgdGhlIGxhc3QgbW9kaWZpZWQgaW5mbyBhbmQgZmlsZSBuYW1lCi0gICAgICovCi0gICAgY2xhc3MgU3RvcmVkVGVtcGxhdGUgewotICAgICAgICBwcml2YXRlIFRlbXBsYXRlIHRlbXBsYXRlOwotICAgICAgICBwcml2YXRlIFVSTCB1cmw7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0gICAgfQotICAgIHB1YmxpYyBUZW1wbGF0ZSBmaW5kVGVtcGxhdGVGb3JUeXBlKENsYXNzIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJbVGVtcGxhdGVGYWN0b3J5XSBBdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRlbXBsYXRlIGZvciB0eXBlIFsiK3R5cGUrIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTCB0ZW1wbGF0ZVVybDsKLSAgICAgICAgICAgIGlmKGNhY2hlZFRlbXBsYXRlcy5jb250YWluc0tleSh0eXBlKSkgewotICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gKFVSTCljYWNoZWRVcmxzLmdldCh0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gbG9jYXRlVGVtcGxhdGVVcmwodHlwZSk7Ci0gICAgICAgICAgICAgICAgY2FjaGVkVXJscy5wdXQodHlwZSx0ZW1wbGF0ZVVybCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHRlbXBsYXRlVXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUZW1wbGF0ZSB0OwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29uID0gdGVtcGxhdGVVcmwub3BlbkNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmKGNhY2hlZFRlbXBsYXRlcy5jb250YWluc0tleSh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdG9yZWRUZW1wbGF0ZSBzdCA9IChTdG9yZWRUZW1wbGF0ZSljYWNoZWRUZW1wbGF0ZXMuZ2V0KHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBpZihjb24uZ2V0TGFzdE1vZGlmaWVkKCkgPiBzdC5sYXN0TW9kaWZpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ZW1wbGF0ZUVuZ2luZS5jcmVhdGVUZW1wbGF0ZSh0ZW1wbGF0ZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC50ZW1wbGF0ZSA9IHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC5sYXN0TW9kaWZpZWQgPSBjb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gc3QudGVtcGxhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0ZW1wbGF0ZUVuZ2luZS5jcmVhdGVUZW1wbGF0ZSh0ZW1wbGF0ZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0b3JlZFRlbXBsYXRlIHN0ID0gbmV3IFN0b3JlZFRlbXBsYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0Lmxhc3RNb2RpZmllZCA9IGNvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3QudGVtcGxhdGUgPSB0OwotICAgICAgICAgICAgICAgICAgICBzdC51cmwgPSB0ZW1wbGF0ZVVybDsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVkVGVtcGxhdGVzLnB1dCh0eXBlLHN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJbVGVtcGxhdGVGYWN0b3J5XSBCdWlsZGluZyB0ZW1wbGF0ZSBmb3IgVVJMIFsiK3RlbXBsYXRlVXJsKyJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gY29tcGlsZSB0ZW1wbGF0ZSBmb3IgdHlwZSBbIit0eXBlKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJDbGFzcyBub3QgZm91bmQgY29tcGlsaW5nIHRlbXBsYXRlIGZvciB0eXBlIFsiK3R5cGUrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICBMT0cuZXJyb3IoIkkvTyBlcnJvciByZWFkaW5nIHRlbXBsYXRlIGZvciB0eXBlIFsiK3R5cGUrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVSTCBsb2NhdGVUZW1wbGF0ZVVybChDbGFzcyB0eXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBpZih0eXBlID09IE9iamVjdC5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFVSTCByZXR1cm5VcmwgPSB0aGlzLnNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKFBBVEhfUFJFRklYICsgdHlwZS5nZXROYW1lKCkgKyBQQVRIX1NVRkZJWCk7Ci0gICAgICAgIGlmKHJldHVyblVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRlVGVtcGxhdGVVcmwodHlwZS5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Vcmw7Ci0gICAgfQotCi0gICAgcHVibGljIFRlbXBsYXRlIGZpbmROYW1lZFRlbXBsYXRlRm9yVHlwZShDbGFzcyB0eXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1RlbXBsYXRlRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9UZW1wbGF0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMTUxMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1RlbXBsYXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IGdyb292eS50ZXh0LlRlbXBsYXRlOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyB0ZW1wbGF0ZXMgZm9yIHNwZWNpZmljIHNjYWZmb2xkZWQgdHlwZXMKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwNi1KYW4tMjAwNgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIGEgdGVtcGxhdGUgZm9yIHRoZSBnaXZlbiB0eXBlCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gbG9jYXRlIGEgYSB0ZW1wbGF0ZSBmb3IKLSAgICAgKiBAcmV0dXJuIEEgVGVtcGxhdGUgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub24gd2FzIGZvdW5kIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUKLSAgICAgKgotICAgICAqLwotICAgIFRlbXBsYXRlIGZpbmRUZW1wbGF0ZUZvclR5cGUoQ2xhc3MgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIGEgbmFtZWQgdGVtcGxhdGUgZm9yIHRoZSBnaXZlbiB0eXBlCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRvIGxvY2F0ZQotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZQotICAgICAqIEByZXR1cm4gQSBUZW1wbGF0ZSBpbnN0YW5jZSBvciBudWxsIGlmIG5vbmUgd2FzIGZvdW5kCi0gICAgICovCi0gICAgVGVtcGxhdGUgZmluZE5hbWVkVGVtcGxhdGVGb3JUeXBlKENsYXNzIHR5cGUsIFN0cmluZyBuYW1lICk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1ZpZXdEZWxlZ2F0aW5nU2NhZmZvbGRSZXNwb25zZUhhbmRsZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvVmlld0RlbGVnYXRpbmdTY2FmZm9sZFJlc3BvbnNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTA5ZTJkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvVmlld0RlbGVnYXRpbmdTY2FmZm9sZFJlc3BvbnNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTW9kZWxBbmRWaWV3OwotLyoqCi0gKiBBIHJlc3BvbnNlIGhhbmRsZXIgdGhhdCBzaW1wbGUgZGVsZWdhdGVzIGNvbnRyb2wgdG8gYSB2aWV3IHJlc29sdmVkIGJ5IHRoZSBzZXQgVmlld1Jlc29sdmVyCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDMwIE5vdiAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3RGVsZWdhdGluZ1NjYWZmb2xkUmVzcG9uc2VIYW5kbGVyIGltcGxlbWVudHMgU2NhZmZvbGRSZXNwb25zZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBTY2FmZm9sZFZpZXdSZXNvbHZlciBzY2FmZm9sZFZpZXdSZXNvbHZlcjsKLQotCXB1YmxpYyBNb2RlbEFuZFZpZXcgaGFuZGxlUmVzcG9uc2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgYWN0aW9uTmFtZSwgTWFwIG1vZGVsKSB7Ci0JCWlmKHNjYWZmb2xkVmlld1Jlc29sdmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9wZXJ0eSBbdmlld1Jlc29sdmVyXSBpcyByZXF1aXJlZCB0byBiZSBzZXQsIGJ1dCBpcyBudWxsIik7Ci0JCQotCQkKLQkJcmV0dXJuIG5ldyBNb2RlbEFuZFZpZXcoCi0JCQkJc2NhZmZvbGRWaWV3UmVzb2x2ZXIucmVzb2x2ZVZpZXdGb3JVcmlBbmRBY3Rpb24ocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCksIGFjdGlvbk5hbWUpLCAKLQkJCQkJbW9kZWwgKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2FmZm9sZFZpZXdSZXNvbHZlcihTY2FmZm9sZFZpZXdSZXNvbHZlciByZXNvbHZlcikgewotCQl0aGlzLnNjYWZmb2xkVmlld1Jlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvZXhjZXB0aW9ucy9TY2FmZm9sZGluZ0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9leGNlcHRpb25zL1NjYWZmb2xkaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2FhYWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9leGNlcHRpb25zL1NjYWZmb2xkaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy5leGNlcHRpb25zOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5HcmFpbHNFeGNlcHRpb247Ci0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gZ2VuZXJhbGx5IHdoZW4gaW5pdGlhbGlzYXRpb24gb2Ygc2NhZmZvbGRpbmcgZmFpbHMKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMzAgTm92IDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFNjYWZmb2xkaW5nRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBTY2FmZm9sZGluZ0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2NhZmZvbGRpbmdFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBTY2FmZm9sZGluZ0V4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgU2NhZmZvbGRpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3RpZ2VyL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0Fubm90YXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3RpZ2VyL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvY2ZnL0dyYWlsc0Fubm90YXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYjY1NjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy90aWdlci9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2NmZy9HcmFpbHNBbm5vdGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZzsKLQotaW1wb3J0IG9yZy5oaWJlcm5hdGUuY2ZnLkFubm90YXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5IaWJlcm5hdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5NYXBwaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEFsbG93cyBjb25maWd1cmluZyBHcmFpbHMnIGhpYmVybmF0ZSBzdXBwb3J0IHRvIHdvcmsgaW4gY29uanVudGlvbiB3aXRoIEhpYmVybmF0ZSdzIGFubm90YXRpb24KLSAqIHN1cHBvcnQKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxOC1GZWItMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gIGV4dGVuZHMgQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBHcmFpbHNEb21haW5Db25maWd1cmF0aW9uewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgID0gTG9nRmFjdG9yeS5nZXRMb2coR3JhaWxzQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24uY2xhc3MpOwotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcxMTUwODczNDI2ODkzMDU1MTdMOwotICAgIHByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBTZXQgZG9tYWluQ2xhc3NlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlnTG9ja2VkOwotICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVEeW5hbWljTWV0aG9kcyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBHcmFpbHNBbm5vdGF0aW9uQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5kb21haW5DbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmcuR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbiNhZGREb21haW5DbGFzcyhvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzKQotICAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbiBhZGREb21haW5DbGFzcyggR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgKSB7Ci0gICAgICAgIGlmKGRvbWFpbkNsYXNzLmdldE1hcHBlZEJ5KCkuZXF1YWxzSWdub3JlQ2FzZSggR3JhaWxzRG9tYWluQ2xhc3MuR09STSApKSB7Ci0gICAgICAgICAgICB0aGlzLmRvbWFpbkNsYXNzZXMuYWRkKGRvbWFpbkNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmcuR3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbiNzZXRHcmFpbHNBcHBsaWNhdGlvbihvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHcmFpbHNBcHBsaWNhdGlvbihHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgewotICAgICAgICB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0gICAgICAgIGlmKHRoaXMuZ3JhaWxzQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NbXSBleGlzdGluZ0RvbWFpbkNsYXNzZXMgPSB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzZXMoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0RvbWFpbkNsYXNzZXMubGVuZ3RoO2krKykgewotICAgICAgICAgICAgICAgIGFkZERvbWFpbkNsYXNzKGV4aXN0aW5nRG9tYWluQ2xhc3Nlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmhpYmVybmF0ZS5jZmcuQ29uZmlndXJhdGlvbiNidWlsZFNlc3Npb25GYWN0b3J5KCkKLSAgICAgICovCi0gICAgcHVibGljIFNlc3Npb25GYWN0b3J5IGJ1aWxkU2Vzc2lvbkZhY3RvcnkoKSB0aHJvd3MgSGliZXJuYXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9ICBzdXBlci5idWlsZFNlc3Npb25GYWN0b3J5KCk7Ci0gICAgICAgIGlmKGNvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKSB7Ci0gICAgICAgICAgICBjb25maWd1cmVEeW5hbWljTWV0aG9kcyhzZXNzaW9uRmFjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb25GYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKFNlc3Npb25GYWN0b3J5IHNmKSB7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb25VdGlsLmNvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKHNmLHRoaXMuZ3JhaWxzQXBwbGljYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyZUR5bmFtaWNNZXRob2RzKGJvb2xlYW4gc2hvdWxkQ29uZmlndXJlKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJlRHluYW1pY01ldGhvZHMgPSBzaG91bGRDb25maWd1cmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgdG8gaW5jbHVkaW5nIGJpbmRpbmcgb2YgR3JhaWxzCi0gICAgICogIGRvbWFpbiBjbGFzc2VzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2Vjb25kUGFzc0NvbXBpbGUoKSB0aHJvd3MgTWFwcGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25maWdMb2NrZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBzZXQgdGhlIGNsYXNzIGxvYWRlciB0byBsb2FkIEdyb292eSBjbGFzc2VzCi0gICAgICAgIGlmKHRoaXMuZ3JhaWxzQXBwbGljYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKCB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldENsYXNzTG9hZGVyKCkgKTsKLSAgICAgICAgLy8gZG8gR3JhaWxzIGNsYXNzIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgZm9yKEl0ZXJhdG9yIGkgPSB0aGlzLmRvbWFpbkNsYXNzZXMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gKEdyYWlsc0RvbWFpbkNsYXNzKWkubmV4dCgpOwotCi0gICAgICAgICAgICBHcmFpbHNEb21haW5CaW5kZXIuYmluZENsYXNzKGRvbWFpbkNsYXNzLCBzdXBlci5jcmVhdGVNYXBwaW5ncygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbGwgc3VwZXIKLSAgICAgICAgc3VwZXIuc2Vjb25kUGFzc0NvbXBpbGUoKTsKLSAgICAgICAgdGhpcy5jb25maWdMb2NrZWQgPSB0cnVlOwotICAgIH19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dC54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjkxMzYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9hcHBsaWNhdGlvbkNvbnRleHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBiZWFucyBQVUJMSUMgIi0vL1NQUklORy8vRFREIEJFQU4vL0VOIiAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL2R0ZC9zcHJpbmctYmVhbnMuZHRkIj4KLQotPGJlYW5zPgotCTxpbXBvcnQgcmVzb3VyY2U9InNwcmluZy9yZXNvdXJjZXMueG1sIi8+Ci0JPGJlYW4gaWQ9ImdyYWlsc0FwcGxpY2F0aW9uIiBjbGFzcz0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbkZhY3RvcnlCZWFuIj4KLQkJPGRlc2NyaXB0aW9uPkdyYWlscyBhcHBsaWNhdGlvbiBmYWN0b3J5IGJlYW48L2Rlc2NyaXB0aW9uPgotCQk8cHJvcGVydHkgbmFtZT0iZ3Jvb3Z5RmlsZXMiPgotCQkJPHZhbHVlPioqLyouZ3Jvb3Z5PC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0KLSAgICA8YmVhbiBpZD0iZ3JhaWxzUmVzb3VyY2VIb2xkZXIiIHNpbmdsZXRvbj0iZmFsc2UiIGNsYXNzPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLnNwcmluZy5HcmFpbHNSZXNvdXJjZUhvbGRlciI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPgotICAgICAgICAgICAgICA8dmFsdWU+KiovKi5ncm9vdnk8L3ZhbHVlPgotICAgICAgICA8L3Byb3BlcnR5PgotICAgIDwvYmVhbj4KLQkKLTwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0LmdzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2dyb292eS5sYW5nLkdyb292eU9iamVjdC5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzNlZDcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0LmdzcAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRPRE8KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEubGFuZy5Cb29sZWFuLmdzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEubGFuZy5Cb29sZWFuLmdzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzOTY4NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLmxhbmcuQm9vbGVhbi5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTxpbnB1dCB2YWx1ZT0iPCU9dmFsdWUlPiIKLSAgICAgICB0eXBlPSJjaGVja2JveCIKLSAgICAgICBuYW1lPSI8JT1uYW1lJT4iCi0gICAgICAgIDwlIGlmKHZhbHVlKSB7ICU+Y2hlY2tlZD0iY2hlY2tlZCI8JX0lPgotICAgICAgICA8JSBpZihjb25zdHJhaW50cyAhPSBudWxsKSB7IGNvbnN0cmFpbnRzLmF0dHJpYnV0ZXMuZWFjaCB7IGssdiAtPiAlPgotICAgICAgICAgICAgICAgICA8JT1rJT49IjwlPXYlPiIKLSAgICAgICAgICAgICAgIDwlIH0gfSAlPi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLkJvb2xlYW4ueWVzbm8uZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLkJvb2xlYW4ueWVzbm8uZ3NwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwNjAxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEubGFuZy5Cb29sZWFuLnllc25vLmdzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxzZWxlY3QgbmFtZT0iPCU9bmFtZSU+IgotICAgICAgICA8JSBpZihjb25zdHJhaW50cyAhPSBudWxsKSB7IGNvbnN0cmFpbnRzLmF0dHJpYnV0ZXMuZWFjaCB7IGssdiAtPiAlPgotICAgICAgICAgICAgICAgICA8JT1rJT49IjwlPXYlPiIKLSAgICAgICAgICAgICAgIDwlIH0gfSAlPj4KLSA8JSBpZih2YWx1ZSkgeyAlPgotICAgIDxvcHRpb24gdmFsdWU9InRydWUiIHNlbGVjdGVkPSJzZWxlY3RlZCI+WWVzPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPk5vPC9vcHRpb24+Ci0gPCV9IGVsc2UgeyAlPgotICAgIDxvcHRpb24gdmFsdWU9InRydWUiPlllczwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9ImZhbHNlIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPk5vPC9vcHRpb24+Ci0gPCUgfSAlPgotPC9zZWxlY3Q+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLmxhbmcuQnl0ZS50ZW1wbGF0ZS5nc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLmxhbmcuQnl0ZS50ZW1wbGF0ZS5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDA0Y2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLkJ5dGUudGVtcGxhdGUuZ3NwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVE9ETwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLmxhbmcuQnl0ZVwxMzNcMTM1LmdzcCIgImIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLkJ5dGVcMTMzXDEzNS5nc3AiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE5OTNkLi4wMDAwMDAwCi0tLSAiYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLmxhbmcuQnl0ZVwxMzNcMTM1LmdzcCIKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxpbnB1dCB0eXBlPSJmaWxlIgotICAgICAgIG5hbWU9IjwlPW5hbWUlPiIKLSAgICAgICAgPCUgaWYoY29uc3RyYWludHMgIT0gbnVsbCkgeyBjb25zdHJhaW50cy5hdHRyaWJ1dGVzLmVhY2ggeyBrLHYgLT4gJT4KLSAgICAgICAgICAgICAgICAgPCU9ayU+PSI8JT12JT4iCi0gICAgICAgICAgICAgICA8JSB9IH0gJT4vPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEubGFuZy5OdW1iZXIuZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLk51bWJlci5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzYyNWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLk51bWJlci5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JSBpZih2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9IDA7ICU+Ci08JSBpZihjb25zdHJhaW50cyAhPSBudWxsKSB7Ci0gICAgaWYoY29uc3RyYWludHMucmFuZ2UgIT0gbnVsbCkgewotICAgICAgICAlPgotICAgICAgICA8c2VsZWN0IG5hbWU9IjwlPW5hbWUlPiIKLSAgICAgICAgICAgICAgICA8JSBjb25zdHJhaW50cy5hdHRyaWJ1dGVzLmVhY2ggeyBrLHYgLT4gJT4KLSAgICAgICAgICAgICAgICAgPCU9ayU+PSI8JT12JT4iCi0gICAgICAgICAgICAgICA8JSB9ICU+PgotICAgICAgICAgICAgPCUgZm9yKGkgaW4gY29uc3RyYWludHMucmFuZ2UpIHslPgotICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1pJT4iICA8JWlmKGkgPT0gdmFsdWUpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj48JT1pJT48L29wdGlvbj4KLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgIDwlfSBlbHNlIHslPgotICAgICAgIDxpbnB1dCBuYW1lPSI8JT1uYW1lJT4iCi0gICAgICAgICAgICAgIHZhbHVlPSI8JT12YWx1ZSU+IgotICAgICAgICAgICAgICAgPCUgY29uc3RyYWludHMuYXR0cmlidXRlcy5lYWNoIHsgayx2IC0+ICU+Ci0gICAgICAgICAgICAgICAgIDwlPWslPj0iPCU9diU+IgotICAgICAgICAgICAgICAgPCUgfSAlPi8+Ci0gICAgPCV9JT4KLTwlIH0gZWxzZSB7Ci0gICAgJT48aW5wdXQgbmFtZT0iPCU9bmFtZSU+IiB2YWx1ZT0iPCU9dmFsdWUlPiIgLz48JQotICAgfSAlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEubGFuZy5TdHJpbmcuZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLlN0cmluZy5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTQzNDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS5sYW5nLlN0cmluZy5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JSBpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIiAlPgotPCUgaWYoY29uc3RyYWludHMgIT0gbnVsbCkgewotICAgIGlmKGNvbnN0cmFpbnRzLm1heExlbmd0aCA8IDE1MCkgeyAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iPCUgaWYoY29uc3RyYWludHMucGFzc3dvcmQpIHsgJT5wYXNzd29yZDwlIH0gZWxzZSB7ICU+dGV4dDwlfSU+IgotICAgICAgICAgICAgICAgPCUgaWYoIWNvbnN0cmFpbnRzLmVkaXRhYmxlKXsgJT5yZWFkb25seT0icmVhZG9ubHkiPCUgfSAlPgotICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSI8JT1jb25zdHJhaW50cy5tYXhMZW5ndGglPiIKLSAgICAgICAgICAgICAgIG5hbWU9IjwlPW5hbWUlPiIKLSAgICAgICAgICAgICAgIHZhbHVlPSI8JT12YWx1ZSU+IgotICAgICAgICAgICAgICAgPCUgY29uc3RyYWludHMuYXR0cmlidXRlcy5lYWNoIHsgayx2IC0+ICU+Ci0gICAgICAgICAgICAgICAgIDwlPWslPj0iPCU9diU+IgotICAgICAgICAgICAgICAgPCUgfSAlPgotICAgICAgICAgICAgICAgLz4KLSAgICA8JSB9IGVsc2UgeyAlPgotICAgIDx0ZXh0YXJlYQotICAgICAgICAgIHJvd3M9IjEiCi0gICAgICAgICAgY29scz0iMSIKLSAgICAgICAgICBuYW1lPSI8JT1uYW1lJT4iCi0gICAgICAgICAgIDwlIGNvbnN0cmFpbnRzLmF0dHJpYnV0ZXMuZWFjaCB7IGssdiAtPiAlPgotICAgICAgICAgICAgIDwlPWslPj0iPCU9diU+IgotICAgICAgICAgICA8JSB9ICU+PjwlPXZhbHVlJT48L3RleHRhcmVhPgotICAgIDwlIH0gJT4KLTwlIH0gZWxzZSB7ICU+PHRleHRhcmVhIHJvd3M9IjEiIGNvbHM9IjEiIG5hbWU9IjwlPW5hbWUlPiI+PCU9dmFsdWUlPjwvdGV4dGFyZWE+PCUgfSAlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5DYWxlbmRhci5nc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuQ2FsZW5kYXIuZ3NwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTY0MTg4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5DYWxlbmRhci5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vL1RPRE8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuQ3VycmVuY3kuZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS51dGlsLkN1cnJlbmN5LmdzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiNWFkYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuQ3VycmVuY3kuZ3NwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCUKLSAgICBpZih2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHZhbHVlID0gamF2YS51dGlsLkN1cnJlbmN5LmdldEluc3RhbmNlKCByZXF1ZXN0LmdldExvY2FsZSgpICk7Ci0gICAgfQotJT4KLTxzZWxlY3QgbmFtZT0iPCU9bmFtZSU+IgotICAgICAgICA8JSBpZihjb25zdHJhaW50cyAhPSBudWxsKSB7IGNvbnN0cmFpbnRzLmF0dHJpYnV0ZXMuZWFjaCB7IGssdiAtPiAlPgotICAgICAgICAgICAgICAgICA8JT1rJT49IjwlPXYlPiIKLSAgICAgICAgICAgICAgIDwlIH0gfSAlPj4KLSAgICA8b3B0aW9uIHZhbHVlPSJFVVIiIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJFVVIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+RVVSPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iWENEIiA8JWlmKHZhbHVlLmN1cnJlbmN5Q29kZSA9PSAiWENEIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PlhDRDwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlVTRCIgPCVpZih2YWx1ZS5jdXJyZW5jeUNvZGUgPT0gIlVTRCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5VU0Q8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJYT0YiIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJYT0YiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+WE9GPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iTk9LIiA8JWlmKHZhbHVlLmN1cnJlbmN5Q29kZSA9PSAiTk9LIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+Pk5PSzwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IkFVRCIgPCVpZih2YWx1ZS5jdXJyZW5jeUNvZGUgPT0gIkFVRCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5BVUQ8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJYQUYiIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJYQUYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+WEFGPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iTlpEIiA8JWlmKHZhbHVlLmN1cnJlbmN5Q29kZSA9PSAiTlpEIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+Pk5aRDwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9Ik1BRCIgPCVpZih2YWx1ZS5jdXJyZW5jeUNvZGUgPT0gIk1BRCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5NQUQ8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJES0siIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJES0siKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+REtLPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iR0JQIiA8JWlmKHZhbHVlLmN1cnJlbmN5Q29kZSA9PSAiR0JQIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PkdCUDwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IkNIRiIgPCVpZih2YWx1ZS5jdXJyZW5jeUNvZGUgPT0gIkNIRiIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5DSEY8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJYUEYiIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJYUEYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+WFBGPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iSUxTIiA8JWlmKHZhbHVlLmN1cnJlbmN5Q29kZSA9PSAiSUxTIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PklMUzwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlJPTCIgPCVpZih2YWx1ZS5jdXJyZW5jeUNvZGUgPT0gIlJPTCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5ST0w8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJUUkwiIDwlaWYodmFsdWUuY3VycmVuY3lDb2RlID09ICJUUkwiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+VFJMPC9vcHRpb24+Ci08L3NlbGVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuRGF0ZS5nc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuRGF0ZS5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWI4NWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS51dGlsLkRhdGUuZ3NwCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTwlCi0gICAgaWYodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSBuZXcgRGF0ZSgpCi0gICAgYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgIGMuc2V0VGltZSh2YWx1ZSkKLSAgICBkYXkgPSBjLmdldChHcmVnb3JpYW5DYWxlbmRhci5EQVlfT0ZfTU9OVEgpCi0gICAgbW9udGggPSBjLmdldChHcmVnb3JpYW5DYWxlbmRhci5NT05USCkKLSAgICB5ZWFyID0gYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuWUVBUikKLSAgICBob3VyID0gYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuSE9VUl9PRl9EQVkpCi0gICAgbWludXRlID0gYy5nZXQoR3JlZ29yaWFuQ2FsZW5kYXIuTUlOVVRFKQotJT4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1uYW1lJT4iIHZhbHVlPSJzdHJ1Y3QiIC8+Ci0gICAgPHNlbGVjdCBuYW1lPSI8JT1uYW1lJT5fZGF5Ij4KLSAgICAgICAgPCUgZm9yKGkgaW4gMS4uKGRheS0xKSkgeyAlPgotICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9aSU+Ij48JT1pJT48L29wdGlvbj4KLSAgICAgICAgPCUgfSAlPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1kYXklPiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj48JT1kYXklPjwvb3B0aW9uPgotICAgICAgICA8JQotICAgICAgICAgZm9yKGkgaW4gKGRheSsxKS4uMzEpIHsgJT4KLSAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWklPiI+PCU9aSU+PC9vcHRpb24+Ci0gICAgICAgIDwlIH0gJT4KLSAgICA8L3NlbGVjdD4KLSAgICA8c2VsZWN0IG5hbWU9IjwlPW5hbWUlPl9tb250aCI+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjEiIDwlaWYobW9udGggPT0gMSkgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PkphbnVhcnk8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiIgPCVpZihtb250aCA9PSAyKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+RmVicnVhcnk8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyIgPCVpZihtb250aCA9PSAzKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+TWFyY2g8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNCIgPCVpZihtb250aCA9PSA0KSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+QXByaWw8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNSIgPCVpZihtb250aCA9PSA1KSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+TWF5PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjYiIDwlaWYobW9udGggPT0gNikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+Pkp1bmU8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNyIgPCVpZihtb250aCA9PSA3KSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+SnVseTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSI4IiA8JWlmKG1vbnRoID09IDgpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj5BdWd1c3Q8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOSIgPCVpZihtb250aCA9PSA5KSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+U2VwdGVtYmVyPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjEwIiA8JWlmKG1vbnRoID09IDEwKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+T2N0b2Jlcjwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMSIgPCVpZihtb250aCA9PSAxMSkgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+Pk5vdmVtYmVyPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjEyIiA8JWlmKG1vbnRoID09IDEyKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+RGVjZW1iZXI8L29wdGlvbj4KLSAgICA8L3NlbGVjdD4KLSAgICA8c2VsZWN0IG5hbWU9IjwlPW5hbWUlPl95ZWFyIj4KLSAgICAgICAgPCUgZm9yKGkgaW4gKHllYXIgLSA4MCkuLih5ZWFyLTEpKSB7ICU+Ci0gICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1pJT4iPjwlPWklPjwvb3B0aW9uPgotICAgICAgICA8JSB9ICU+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPXllYXIlPiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj48JT15ZWFyJT48L29wdGlvbj4KLSAgICAgICAgPCUgZm9yKGkgaW4gKHllYXIgKyAxKS4uKHllYXIrODApKSB7ICU+Ci0gICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1pJT4iPjwlPWklPjwvb3B0aW9uPgotICAgICAgICA8JSB9ICU+Ci0gICAgPC9zZWxlY3Q+IC0KLSAgICA8c2VsZWN0IG5hbWU9IjwlPW5hbWUlPl9ob3VyIj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDAiIDwlaWYoaG91ciA9PSAiMDAiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDA8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDEiIDwlaWYoaG91ciA9PSAiMDEiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDE8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDIiIDwlaWYoaG91ciA9PSAiMDIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDI8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDMiIDwlaWYoaG91ciA9PSAiMDMiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDM8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDQiIDwlaWYoaG91ciA9PSAiMDQiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDQ8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDUiIDwlaWYoaG91ciA9PSAiMDUiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDU8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDYiIDwlaWYoaG91ciA9PSAiMDYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDY8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDciIDwlaWYoaG91ciA9PSAiMDciKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDc8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDgiIDwlaWYoaG91ciA9PSAiMDgiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDg8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDkiIDwlaWYoaG91ciA9PSAiMDkiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDk8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAiIDwlaWYoaG91ciA9PSAiMTAiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTA8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTEiIDwlaWYoaG91ciA9PSAiMTEiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTE8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIiIDwlaWYoaG91ciA9PSAiMTIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTI8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiIDwlaWYoaG91ciA9PSAiMTMiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTM8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQiIDwlaWYoaG91ciA9PSAiMTQiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTQ8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTUiIDwlaWYoaG91ciA9PSAiMTUiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTU8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTYiIDwlaWYoaG91ciA9PSAiMTYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTY8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTciIDwlaWYoaG91ciA9PSAiMTciKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTc8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgiIDwlaWYoaG91ciA9PSAiMTgiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTg8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTkiIDwlaWYoaG91ciA9PSAiMTkiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTk8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAiIDwlaWYoaG91ciA9PSAiMjAiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjA8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjEiIDwlaWYoaG91ciA9PSAiMjEiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjE8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjIiIDwlaWYoaG91ciA9PSAiMjIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjI8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYoaG91ciA9PSAiMjMiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjM8L29wdGlvbj4KLSAgICA8L3NlbGVjdD46Ci0gICAgPHNlbGVjdCBuYW1lPSI8JT1uYW1lJT5fbWludXRlIj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDAiIDwlaWYobWludXRlID09ICIwMCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4wMDwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIwMSIgPCVpZihtaW51dGUgPT0gIjAxIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjAxPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjAyIiA8JWlmKG1pbnV0ZSA9PSAiMDIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDI8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDMiIDwlaWYobWludXRlID09ICIwMyIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4wMzwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIwNCIgPCVpZihtaW51dGUgPT0gIjA0IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjA0PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjA1IiA8JWlmKG1pbnV0ZSA9PSAiMDUiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDU8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDYiIDwlaWYobWludXRlID09ICIwNiIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4wNjwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIwNyIgPCVpZihtaW51dGUgPT0gIjA3IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjA3PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjA4IiA8JWlmKG1pbnV0ZSA9PSAiMDgiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MDg8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMDkiIDwlaWYobWludXRlID09ICIwOSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4wOTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMCIgPCVpZihtaW51dGUgPT0gIjEwIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjEwPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjExIiA8JWlmKG1pbnV0ZSA9PSAiMTEiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTE8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIiIDwlaWYobWludXRlID09ICIxMiIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4xMjwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMyIgPCVpZihtaW51dGUgPT0gIjEzIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjEzPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjE0IiA8JWlmKG1pbnV0ZSA9PSAiMTQiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTQ8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTUiIDwlaWYobWludXRlID09ICIxNSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4xNTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNiIgPCVpZihtaW51dGUgPT0gIjE2IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjE2PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjE3IiA8JWlmKG1pbnV0ZSA9PSAiMTciKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MTc8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgiIDwlaWYobWludXRlID09ICIxOCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4xODwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIxOSIgPCVpZihtaW51dGUgPT0gIjE5IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjE5PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjEwIiA8JWlmKG1pbnV0ZSA9PSAiMjAiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjA8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjEiIDwlaWYobWludXRlID09ICIyMSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4yMTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMiIgPCVpZihtaW51dGUgPT0gIjIyIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjIyPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMjMiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjM8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIyNCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4yNDwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjI1IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjI1PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMjYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MjY8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIyNyIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4yNzwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjI4IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjI4PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMjkiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+Mjk8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIzMCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4zMDwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjMxIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjMxPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMzIiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MzI8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIzMyIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4zMzwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjM0IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjM0PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMzUiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+MzU8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIzNiIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4zNjwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjM3IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjM3PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiMzgiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+Mzg8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICIzOSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj4zOTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjQwIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjQwPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNDEiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NDE8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI0MiIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj40Mjwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjQzIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjQzPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNDQiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NDQ8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI0NSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj40NTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjQ2IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjQ2PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNDciKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NDc8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI0OCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj40ODwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjQ5IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjQ5PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNTAiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NTA8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI1MSIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj41MTwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjUyIikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjUyPC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNTMiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NTM8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI1NCIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj41NDwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjU1IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjU1PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNTYiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NTY8L29wdGlvbj4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjMiIDwlaWYobWludXRlID09ICI1NyIpIHslPnNlbGVjdGVkPSJzZWxlY3RlZCI8JX0lPj41Nzwvb3B0aW9uPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyIgPCVpZihtaW51dGUgPT0gIjU4IikgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjU4PC9vcHRpb24+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjIzIiA8JWlmKG1pbnV0ZSA9PSAiNTkiKSB7JT5zZWxlY3RlZD0ic2VsZWN0ZWQiPCV9JT4+NTk8L29wdGlvbj4KLSAgICA8L3NlbGVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5Mb2NhbGUuZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS51dGlsLkxvY2FsZS5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODQ3MjIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9pbnRlcm5hbC9yZW5kZXIvamF2YS51dGlsLkxvY2FsZS5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08JSBpZih2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9IHJlcXVlc3QuZ2V0TG9jYWxlKCk7ICU+Ci08c2VsZWN0IG5hbWU9IjwlPW5hbWUlPiIKLSAgICAgICAgPCUgaWYoY29uc3RyYWludHMgIT0gbnVsbCkgeyBjb25zdHJhaW50cy5hdHRyaWJ1dGVzLmVhY2ggeyBrLHYgLT4gJT4KLSAgICAgICAgICAgICAgICAgPCU9ayU+PSI8JT12JT4iCi0gICAgICAgICAgICAgICA8JSB9IH0gJT4+Ci08JQotICAgIGxvY2FsZXMgPSBqYXZhLnV0aWwuTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKLSAgICBmb3IobCBpbiBsb2NhbGVzKSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1sLmxhbmd1YWdlJT5fPCU9bC5jb3VudHJ5JT4iIDwlaWYoIiR7bC5sYW5ndWFnZX1fJHtsLmNvdW50cnl9IiA9PSB2YWx1ZSkgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjwlPWwubGFuZ3VhZ2UlPiwgPCU9bC5jb3VudHJ5JT4sIDwlPWwuZGlzcGxheU5hbWUlPjwvb3B0aW9uPgotICAgICAgICA8JQotICAgIH0KLSU+Ci08L3NlbGVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuU2V0LmdzcCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5TZXQuZ3NwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQwNGNlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5TZXQuZ3NwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVE9ETwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5UaW1lWm9uZS5nc3AgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2ludGVybmFsL3JlbmRlci9qYXZhLnV0aWwuVGltZVpvbmUuZ3NwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY3YTY3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvaW50ZXJuYWwvcmVuZGVyL2phdmEudXRpbC5UaW1lWm9uZS5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08JQotICAgIGlmKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgdmFsdWUgPSBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0RGVmYXVsdCgpCi0gICAgfQotJT4KLTxzZWxlY3QgbmFtZT0iPCU9bmFtZSU+IgotICAgICAgIDwlIGlmKGNvbnN0cmFpbnRzICE9IG51bGwpIHsgY29uc3RyYWludHMuYXR0cmlidXRlcy5lYWNoIHsgayx2IC0+ICU+Ci0gICAgICAgICAgICAgICAgIDwlPWslPj0iPCU9diU+IgotICAgICAgICAgICAgICAgPCUgfSB9ICU+PgotPCUKLSAgICBkYXRlID0gbmV3IERhdGUoKQotICAgIGlkcyA9IFRpbWVab25lLmdldEF2YWlsYWJsZUlEcygpOwotICAgIGZvcihpZCBpbiBpZHMpIHsKLSAgICAgICAgVGltZVpvbmUgdHogPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShpZCk7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSB0ei5nZXREaXNwbGF5TmFtZSh0ei5pbkRheWxpZ2h0VGltZShkYXRlKSxUaW1lWm9uZS5TSE9SVCk7Ci0gICAgICAgIFN0cmluZyBsb25nTmFtZSA9IHR6LmdldERpc3BsYXlOYW1lKHR6LmluRGF5bGlnaHRUaW1lKGRhdGUpLFRpbWVab25lLkxPTkcpOwotCi0gICAgICAgIG9mZnNldCA9IHR6LnJhd09mZnNldDsKLSAgICAgICAgaG91ciA9IG9mZnNldCAvICg2MCo2MCoxMDAwKTsKLSAgICAgICAgbWluID0gTWF0aC5hYnMob2Zmc2V0IC8gKDYwKjEwMDApKSAlIDYwOwotICAgICAgICAlPgotICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9aWQlPiIgPCVpZihpZCA9PSB2YWx1ZS5JRCkgeyU+c2VsZWN0ZWQ9InNlbGVjdGVkIjwlfSU+PjwlPXNob3J0TmFtZSU+LCA8JT1sb25nTmFtZSU+IDwlPWhvdXIlPjo8JT1taW4lPjwvb3B0aW9uPgotICAgICAgICA8JQotICAgIH0KLSU+Ci08L3NlbGVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2xvZzRqLnByb3BlcnRpZXMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjcyYzYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1sb2c0ai5yb290TG9nZ2VyPWluZm8sIHN0ZG91dAotCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci0KLWxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz1kZWJ1Zywgc3Rkb3V0Ci1sb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPWZhbHNlCi1sb2c0ai5sb2dnZXIuZ3JhaWxzPWRlYnVnLCBzdGRvdXQKLWxvZzRqLmFkZGl0aXZpdHkuZ3JhaWxzPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi9zaXRlbWVzaC54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3NpdGVtZXNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhM2EyOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3NpdGVtZXNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxzaXRlbWVzaD4KLSAgICA8cGFnZS1wYXJzZXJzPgotICAgICAgICA8cGFyc2VyIGNvbnRlbnQtdHlwZT0idGV4dC9odG1sIgotICAgICAgICAgICAgY2xhc3M9ImNvbS5vcGVuc3ltcGhvbnkubW9kdWxlLnNpdGVtZXNoLnBhcnNlci5GYXN0UGFnZVBhcnNlciIgLz4KLSAgICAgICAgPHBhcnNlciBjb250ZW50LXR5cGU9InRleHQvaHRtbDtjaGFyc2V0PUlTTy04ODU5LTEiCi0gICAgICAgICAgICBjbGFzcz0iY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2gucGFyc2VyLkZhc3RQYWdlUGFyc2VyIiAvPgotICAgICAgICA8cGFyc2VyIGNvbnRlbnQtdHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiCi0gICAgICAgICAgICBjbGFzcz0iY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2gucGFyc2VyLkZhc3RQYWdlUGFyc2VyIiAvPiAgICAgICAgICAgIAotICAgIDwvcGFnZS1wYXJzZXJzPgotCi0gICAgPGRlY29yYXRvci1tYXBwZXJzPgotICAgICAgICA8bWFwcGVyIGNsYXNzPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2l0ZW1lc2guR3JhaWxzTGF5b3V0RGVjb3JhdG9yTWFwcGVyIiAvPgotICAgIDwvZGVjb3JhdG9yLW1hcHBlcnM+Ci08L3NpdGVtZXNoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvc3ByaW5nL3Jlc291cmNlcy54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3NwcmluZy9yZXNvdXJjZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ4YWU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvc3ByaW5nL3Jlc291cmNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLQkKLQkKLTwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90ZXN0LWFwcGxpY2F0aW9uQ29udGV4dC54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3Rlc3QtYXBwbGljYXRpb25Db250ZXh0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0YWM1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3Rlc3QtYXBwbGljYXRpb25Db250ZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLQk8aW1wb3J0IHJlc291cmNlPSJzcHJpbmcvcmVzb3VyY2VzLnhtbCIvPgotCTxiZWFuIGlkPSJncmFpbHNBcHBsaWNhdGlvbiIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbiI+Ci0JCTxkZXNjcmlwdGlvbj5HcmFpbHMgYXBwbGljYXRpb24gZmFjdG9yeSBiZWFuPC9kZXNjcmlwdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9Imdyb292eUZpbGVzIj4KLQkJCTx2YWx1ZT4qKi8qLmdyb292eTwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCQotPC9iZWFucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjMvYy50bGQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjMvYy50bGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODBlOGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvMi4zL2MudGxkCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgdGFnbGliCi0gIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci08dGFnbGliPgotICA8dGxpYi12ZXJzaW9uPjEuMDwvdGxpYi12ZXJzaW9uPgotICA8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4KLSAgPHNob3J0LW5hbWU+Yzwvc2hvcnQtbmFtZT4KLSAgPHVyaT5odHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZTwvdXJpPgotICA8ZGlzcGxheS1uYW1lPkpTVEwgY29yZTwvZGlzcGxheS1uYW1lPgotICA8ZGVzY3JpcHRpb24+SlNUTCAxLjAgY29yZSBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KLQotICA8dmFsaWRhdG9yPgotICAgIDx2YWxpZGF0b3ItY2xhc3M+Ci0Jb3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRsdi5Kc3RsQ29yZVRMVgotICAgIDwvdmFsaWRhdG9yLWNsYXNzPgotICAgIDxpbml0LXBhcmFtPgotCTxwYXJhbS1uYW1lPmV4cHJlc3Npb25BdHRyaWJ1dGVzPC9wYXJhbS1uYW1lPgotCTxwYXJhbS12YWx1ZT4KLQkgICAgb3V0OnZhbHVlCi0JICAgIG91dDpkZWZhdWx0Ci0JICAgIG91dDplc2NhcGVYbWwKLQkgICAgaWY6dGVzdAotCSAgICBpbXBvcnQ6dXJsCi0JICAgIGltcG9ydDpjb250ZXh0Ci0JICAgIGltcG9ydDpjaGFyRW5jb2RpbmcKLQkgICAgZm9yRWFjaDppdGVtcwotCSAgICBmb3JFYWNoOmJlZ2luCi0JICAgIGZvckVhY2g6ZW5kCi0JICAgIGZvckVhY2g6c3RlcAotCSAgICBmb3JUb2tlbnM6aXRlbXMKLQkgICAgZm9yVG9rZW5zOmJlZ2luCi0JICAgIGZvclRva2VuczplbmQKLQkgICAgZm9yVG9rZW5zOnN0ZXAKLQkgICAgcGFyYW06ZW5jb2RlCi0JICAgIHBhcmFtOm5hbWUKLQkgICAgcGFyYW06dmFsdWUKLSAgICAgICAgICAgIHJlZGlyZWN0OmNvbnRleHQKLSAgICAgICAgICAgIHJlZGlyZWN0OnVybAotCSAgICBzZXQ6cHJvcGVydHkKLQkgICAgc2V0OnRhcmdldAotCSAgICBzZXQ6dmFsdWUKLQkgICAgdXJsOmNvbnRleHQKLQkgICAgdXJsOnZhbHVlCi0JICAgIHdoZW46dGVzdAotCTwvcGFyYW0tdmFsdWU+Ci0JPGRlc2NyaXB0aW9uPgotCSAgICBXaGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCB0b2tlbiBwYWlycwotCSAgICBkZXNjcmliaW5nIHRhZzphdHRyaWJ1dGUgY29tYmluYXRpb25zIHRoYXQgYWNjZXB0IGV4cHJlc3Npb25zLgotCSAgICBUaGUgdmFsaWRhdG9yIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hpY2gKLQkgICAgYXR0cmlidXRlcyBuZWVkIHRoZWlyIHN5bnRheCB2YWxpZGF0ZWQuCi0JPC9kZXNjcmlwdGlvbj4KLSAgICAgPC9pbml0LXBhcmFtPgotICA8L3ZhbGlkYXRvcj4KLQotICA8dGFnPgotICAgIDxuYW1lPmNhdGNoPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5DYXRjaFRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBDYXRjaGVzIGFueSBUaHJvd2FibGUgdGhhdCBvY2N1cnMgaW4gaXRzIGJvZHkgYW5kIG9wdGlvbmFsbHkKLSAgICAgICAgZXhwb3NlcyBpdC4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8bmFtZT5jaG9vc2U8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLkNob29zZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTaW1wbGUgY29uZGl0aW9uYWwgdGFnIHRoYXQgZXN0YWJsaXNoZXMgYSBjb250ZXh0IGZvcgotICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUgY29uZGl0aW9uYWwgb3BlcmF0aW9ucywgbWFya2VkIGJ5Ci0gICAgICAgICZsdDt3aGVuJmd0OyBhbmQgJmx0O290aGVyd2lzZSZndDsKLSAgICA8L2Rlc2NyaXB0aW9uPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPm91dDwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuY29yZS5PdXRUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlMaWtlICZsdDslPSAuLi4gJmd0OywgYnV0IGZvciBleHByZXNzaW9ucy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+ZGVmYXVsdDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5lc2NhcGVYbWw8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+aWY8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmNvcmUuSWZUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU2ltcGxlIGNvbmRpdGlvbmFsIHRhZywgd2hpY2ggZXZhbHV0ZXMgaXRzIGJvZHkgaWYgdGhlCi0gICAgICAgIHN1cHBsaWVkIGNvbmRpdGlvbiBpcyB0cnVlIGFuZCBvcHRpb25hbGx5IGV4cG9zZXMgYSBCb29sZWFuCi0gICAgICAgIHNjcmlwdGluZyB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhpcyBjb25kaXRpb24KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnRlc3Q8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+aW1wb3J0PC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5jb3JlLkltcG9ydFRhZzwvdGFnLWNsYXNzPgotICAgIDx0ZWktY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRlaS5JbXBvcnRURUk8L3RlaS1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlSZXRyaWV2ZXMgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIGFuZCBleHBvc2VzIGl0cyBjb250ZW50cwotCXRvIGVpdGhlciB0aGUgcGFnZSwgYSBTdHJpbmcgaW4gJ3ZhcicsIG9yIGEgUmVhZGVyIGluICd2YXJSZWFkZXInLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dXJsPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhclJlYWRlcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5jb250ZXh0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPmNoYXJFbmNvZGluZzwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8bmFtZT5mb3JFYWNoPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5jb3JlLkZvckVhY2hUYWc8L3RhZy1jbGFzcz4KLSAgICA8dGVpLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50ZWkuRm9yRWFjaFRFSTwvdGVpLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotCVRoZSBiYXNpYyBpdGVyYXRpb24gdGFnLCBhY2NlcHRpbmcgbWFueSBkaWZmZXJlbnQKLSAgICAgICAgY29sbGVjdGlvbiB0eXBlcyBhbmQgc3VwcG9ydGluZyBzdWJzZXR0aW5nIGFuZCBvdGhlcgotICAgICAgICBmdW5jdGlvbmFsaXR5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPml0ZW1zPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPmJlZ2luPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPmVuZDwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLQk8bmFtZT5zdGVwPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPnZhcjwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLQk8bmFtZT52YXJTdGF0dXM8L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPmZvclRva2VuczwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuY29yZS5Gb3JUb2tlbnNUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlJdGVyYXRlcyBvdmVyIHRva2Vucywgc2VwYXJhdGVkIGJ5IHRoZSBzdXBwbGllZCBkZWxpbWV0ZXJzCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPml0ZW1zPC9uYW1lPgotCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0JPG5hbWU+ZGVsaW1zPC9uYW1lPgotCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0JPG5hbWU+YmVnaW48L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0JPG5hbWU+ZW5kPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPnN0ZXA8L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0JPG5hbWU+dmFyPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotCTxuYW1lPnZhclN0YXR1czwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+b3RoZXJ3aXNlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5PdGhlcndpc2VUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlTdWJ0YWcgb2YgJmx0O2Nob29zZSZndDsgdGhhdCBmb2xsb3dzICZsdDt3aGVuJmd0OyB0YWdzCi0JYW5kIHJ1bnMgb25seSBpZiBhbGwgb2YgdGhlIHByaW9yIGNvbmRpdGlvbnMgZXZhbHVhdGVkIHRvCi0JJ2ZhbHNlJwotICAgIDwvZGVzY3JpcHRpb24+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+cGFyYW08L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmNvcmUuUGFyYW1UYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlBZGRzIGEgcGFyYW1ldGVyIHRvIGEgY29udGFpbmluZyAnaW1wb3J0JyB0YWcncyBVUkwuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+cmVkaXJlY3Q8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmNvcmUuUmVkaXJlY3RUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlSZWRpcmVjdHMgdG8gYSBuZXcgVVJMLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnVybDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPmNvbnRleHQ8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+cmVtb3ZlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5SZW1vdmVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotCVJlbW92ZXMgYSBzY29wZWQgdmFyaWFibGUgKGZyb20gYSBwYXJ0aWN1bGFyIHNjb3BlLCBpZiBzcGVjaWZpZWQpLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+c2V0PC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5jb3JlLlNldFRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotCVNldHMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIGV2YWx1YXRpb24gaW4gYSAnc2NvcGUnCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dGFyZ2V0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnByb3BlcnR5PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPnVybDwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuY29yZS5VcmxUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLQlQcmludHMgb3IgZXhwb3NlcyBhIFVSTCB3aXRoIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMKLSAgICAgICAgKHZpYSB0aGUgYzpwYXJhbSB0YWcpLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+Y29udGV4dDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8bmFtZT53aGVuPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5jb3JlLldoZW5UYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3VidGFnIG9mICZsdDtjaG9vc2UmZ3Q7IHRoYXQgaW5jbHVkZXMgaXRzIGJvZHkgaWYgaXRzCi0gICAgICAgIGNvbmRpdGlvbiBldmFsdXRlcyB0byAndHJ1ZScKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnRlc3Q8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLTwvdGFnbGliPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvMi4zL2ZtdC50bGQgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjMvZm10LnRsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MjNlZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjMvZm10LnRsZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIHRhZ2xpYgotICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgotPHRhZ2xpYj4KLSAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KLSAgPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+Ci0gIDxzaG9ydC1uYW1lPmZtdDwvc2hvcnQtbmFtZT4KLSAgPHVyaT5odHRwOi8vamF2YS5zdW4uY29tL2pzdGwvZm10PC91cmk+Ci0gIDxkaXNwbGF5LW5hbWU+SlNUTCBmbXQ8L2Rpc3BsYXktbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkpTVEwgMS4wIGkxOG4tY2FwYWJsZSBmb3JtYXR0aW5nIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgotCi0gIDx2YWxpZGF0b3I+Ci0gICAgPHZhbGlkYXRvci1jbGFzcz4KLQlvcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGx2LkpzdGxGbXRUTFYKLSAgICA8L3ZhbGlkYXRvci1jbGFzcz4KLSAgICA8aW5pdC1wYXJhbT4KLQk8cGFyYW0tbmFtZT5leHByZXNzaW9uQXR0cmlidXRlczwvcGFyYW0tbmFtZT4KLQk8cGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICByZXF1ZXN0RW5jb2Rpbmc6dmFsdWUgCi0JICAgIHNldExvY2FsZTp2YWx1ZQotCSAgICBzZXRMb2NhbGU6dmFyaWFudAotCSAgICB0aW1lWm9uZTp2YWx1ZQotCSAgICBzZXRUaW1lWm9uZTp2YWx1ZQotCSAgICBidW5kbGU6YmFzZW5hbWUKLQkgICAgYnVuZGxlOnByZWZpeAotICAgICAgICAgICAgc2V0QnVuZGxlOmJhc2VuYW1lCi0JICAgIG1lc3NhZ2U6a2V5Ci0JICAgIG1lc3NhZ2U6YnVuZGxlCi0JICAgIHBhcmFtOnZhbHVlCi0JICAgIGZvcm1hdE51bWJlcjp2YWx1ZQotCSAgICBmb3JtYXROdW1iZXI6cGF0dGVybgotICAgICAgICAgICAgZm9ybWF0TnVtYmVyOmN1cnJlbmN5Q29kZQotICAgICAgICAgICAgZm9ybWF0TnVtYmVyOmN1cnJlbmN5U3ltYm9sCi0gICAgICAgICAgICBmb3JtYXROdW1iZXI6Z3JvdXBpbmdVc2VkCi0gICAgICAgICAgICBmb3JtYXROdW1iZXI6bWF4SW50ZWdlckRpZ2l0cwotICAgICAgICAgICAgZm9ybWF0TnVtYmVyOm1pbkludGVnZXJEaWdpdHMKLSAgICAgICAgICAgIGZvcm1hdE51bWJlcjptYXhGcmFjdGlvbkRpZ2l0cwotICAgICAgICAgICAgZm9ybWF0TnVtYmVyOm1pbkZyYWN0aW9uRGlnaXRzCi0JICAgIHBhcnNlTnVtYmVyOnZhbHVlCi0JICAgIHBhcnNlTnVtYmVyOnBhdHRlcm4KLQkgICAgcGFyc2VOdW1iZXI6cGFyc2VMb2NhbGUKLSAgICAgICAgICAgIHBhcnNlTnVtYmVyOmludGVnZXJPbmx5Ci0JICAgIGZvcm1hdERhdGU6dmFsdWUKLQkgICAgZm9ybWF0RGF0ZTpwYXR0ZXJuCi0JICAgIGZvcm1hdERhdGU6dGltZVpvbmUKLQkgICAgcGFyc2VEYXRlOnZhbHVlCi0JICAgIHBhcnNlRGF0ZTpwYXR0ZXJuCi0JICAgIHBhcnNlRGF0ZTp0aW1lWm9uZQotCSAgICBwYXJzZURhdGU6cGFyc2VMb2NhbGUKLQk8L3BhcmFtLXZhbHVlPgotCTxkZXNjcmlwdGlvbj4KLQkgICAgV2hpdGVzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgdG9rZW4gcGFpcnMKLQkgICAgZGVzY3JpYmluZyB0YWc6YXR0cmlidXRlIGNvbWJpbmF0aW9ucyB0aGF0IGFjY2VwdCBleHByZXNzaW9ucy4KLQkgICAgVGhlIHZhbGlkYXRvciB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoCi0JICAgIGF0dHJpYnV0ZXMgbmVlZCB0aGVpciBzeW50YXggdmFsaWRhdGVkLgotCTwvZGVzY3JpcHRpb24+Ci0gICAgIDwvaW5pdC1wYXJhbT4KLSAgPC92YWxpZGF0b3I+Ci0KLSAgPHRhZz4KLSAgICA8bmFtZT5yZXF1ZXN0RW5jb2Rpbmc8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmZtdC5SZXF1ZXN0RW5jb2RpbmdUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTZXRzIHRoZSByZXF1ZXN0IGNoYXJhY3RlciBlbmNvZGluZwotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+c2V0TG9jYWxlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5mbXQuU2V0TG9jYWxlVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RvcmVzIHRoZSBnaXZlbiBsb2NhbGUgaW4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhcmlhbnQ8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+dGltZVpvbmU8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmZtdC5UaW1lWm9uZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTcGVjaWZpZXMgdGhlIHRpbWUgem9uZSBmb3IgYW55IHRpbWUgZm9ybWF0dGluZyBvciBwYXJzaW5nIGFjdGlvbnMKLSAgICAgICAgbmVzdGVkIGluIGl0cyBib2R5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPnNldFRpbWVab25lPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5mbXQuU2V0VGltZVpvbmVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTdG9yZXMgdGhlIGdpdmVuIHRpbWUgem9uZSBpbiB0aGUgdGltZSB6b25lIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPmJ1bmRsZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuZm10LkJ1bmRsZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBMb2FkcyBhIHJlc291cmNlIGJ1bmRsZSB0byBiZSB1c2VkIGJ5IGl0cyB0YWcgYm9keQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+YmFzZW5hbWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5wcmVmaXg8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+c2V0QnVuZGxlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5mbXQuU2V0QnVuZGxlVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgTG9hZHMgYSByZXNvdXJjZSBidW5kbGUgYW5kIHN0b3JlcyBpdCBpbiB0aGUgbmFtZWQgc2NvcGVkIHZhcmlhYmxlIG9yCi0gICAgICAgIHRoZSBidW5kbGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+YmFzZW5hbWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+bWVzc2FnZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuZm10Lk1lc3NhZ2VUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgTWFwcyBrZXkgdG8gbG9jYWxpemVkIG1lc3NhZ2UgYW5kIHBlcmZvcm1zIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPmtleTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5idW5kbGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPnBhcmFtPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5lbC5mbXQuUGFyYW1UYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3VwcGxpZXMgYW4gYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQgdG8gYSBjb250YWluaW5nCi0gICAgICAgICZsdDttZXNzYWdlJmd0OyB0YWcKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxuYW1lPmZvcm1hdE51bWJlcjwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuZm10LkZvcm1hdE51bWJlclRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBGb3JtYXRzIGEgbnVtZXJpYyB2YWx1ZSBhcyBhIG51bWJlciwgY3VycmVuY3ksIG9yIHBlcmNlbnRhZ2UKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnR5cGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5jdXJyZW5jeUNvZGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+Y3VycmVuY3lTeW1ib2w8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+Z3JvdXBpbmdVc2VkPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPm1heEludGVnZXJEaWdpdHM8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+bWluSW50ZWdlckRpZ2l0czwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5tYXhGcmFjdGlvbkRpZ2l0czwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5taW5GcmFjdGlvbkRpZ2l0czwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+cGFyc2VOdW1iZXI8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmZtdC5QYXJzZU51bWJlclRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBQYXJzZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlciwgY3VycmVuY3ksIG9yIHBlcmNlbnRhZ2UKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnR5cGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5wYXJzZUxvY2FsZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5pbnRlZ2VyT25seTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPG5hbWU+Zm9ybWF0RGF0ZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuZWwuZm10LkZvcm1hdERhdGVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBGb3JtYXRzIGEgZGF0ZSBhbmQvb3IgdGltZSB1c2luZyB0aGUgc3VwcGxpZWQgc3R5bGVzIGFuZCBwYXR0ZXJuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnR5cGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+ZGF0ZVN0eWxlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnRpbWVTdHlsZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5wYXR0ZXJuPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnRpbWVab25lPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPnZhcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5zY29wZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8bmFtZT5wYXJzZURhdGU8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmVsLmZtdC5QYXJzZURhdGVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgUGFyc2VzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRlIGFuZC9vciB0aW1lCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT50eXBlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxuYW1lPmRhdGVTdHlsZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT50aW1lU3R5bGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT50aW1lWm9uZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT5wYXJzZUxvY2FsZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi08L3RhZ2xpYj4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuMy9zcHJpbmcudGxkIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvMi4zL3NwcmluZy50bGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZjdiZmYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvMi4zL3NwcmluZy50bGQKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4NCi08IURPQ1RZUEUgdGFnbGliIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+DQotDQotPHRhZ2xpYj4NCi0NCi0JPHRsaWItdmVyc2lvbj4xLjEuMTwvdGxpYi12ZXJzaW9uPg0KLQ0KLQk8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4NCi0NCi0JPHNob3J0LW5hbWU+U3ByaW5nPC9zaG9ydC1uYW1lPg0KLQ0KLQk8dXJpPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy90YWdzPC91cmk+DQotDQotCTxkZXNjcmlwdGlvbj5TcHJpbmcgRnJhbWV3b3JrIEpTUCBUYWcgTGlicmFyeS4gQXV0aG9yczogUm9kIEpvaG5zb24sIEp1ZXJnZW4gSG9lbGxlcjwvZGVzY3JpcHRpb24+DQotDQotDQotCTx0YWc+DQotDQotCQk8bmFtZT5odG1sRXNjYXBlPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuSHRtbEVzY2FwZVRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlTZXRzIGRlZmF1bHQgSFRNTCBlc2NhcGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHBhZ2UuDQotCQkJT3ZlcnJpZGVzIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwsIGlmIGFueS4NCi0JCTwvZGVzY3JpcHRpb24+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmRlZmF1bHRIdG1sRXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JPC90YWc+DQotDQotDQotCTx0YWc+DQotDQotCQk8bmFtZT5lc2NhcGVCb2R5PC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuRXNjYXBlQm9keVRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlFc2NhcGVzIGl0cyBlbmNsb3NlZCBib2R5IGNvbnRlbnQsIGFwcGx5aW5nIEhUTUwgZXNjYXBpbmcgYW5kL29yIEphdmFTY3JpcHQgZXNjYXBpbmcuDQotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nDQotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4NCi0JCTwvZGVzY3JpcHRpb24+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+amF2YVNjcmlwdEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPm1lc3NhZ2U8L25hbWU+DQotCQk8dGFnLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQudGFncy5NZXNzYWdlVGFnPC90YWctY2xhc3M+DQotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLQ0KLQkJPGRlc2NyaXB0aW9uPg0KLQkJCVJldHJpZXZlcyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBjb2RlLCBvciB0ZXh0IGlmIGNvZGUgaXNuJ3QgcmVzb2x2YWJsZS4NCi0JCQlUaGUgSFRNTCBlc2NhcGluZyBmbGFnIHBhcnRpY2lwYXRlcyBpbiBhIHBhZ2Utd2lkZSBvciBhcHBsaWNhdGlvbi13aWRlIHNldHRpbmcNCi0JCQkoaS5lLiBieSBIdG1sRXNjYXBlVGFnIG9yIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwpLg0KLQkJPC9kZXNjcmlwdGlvbj4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+Y29kZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5hcmd1bWVudHM8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+dGV4dDwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT52YXI8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+c2NvcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5qYXZhU2NyaXB0RXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCTwvdGFnPg0KLQ0KLQ0KLQk8dGFnPg0KLQ0KLQkJPG5hbWU+dGhlbWU8L25hbWU+DQotCQk8dGFnLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQudGFncy5UaGVtZVRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlSZXRyaWV2ZXMgdGhlIHRoZW1lIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29kZSwgb3IgdGV4dCBpZiBjb2RlIGlzbid0IHJlc29sdmFibGUuDQotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nDQotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4NCi0JCTwvZGVzY3JpcHRpb24+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmNvZGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+YXJndW1lbnRzPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnRleHQ8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+dmFyPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnNjb3BlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+amF2YVNjcmlwdEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPmhhc0JpbmRFcnJvcnM8L25hbWU+DQotCQk8dGFnLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQudGFncy5CaW5kRXJyb3JzVGFnPC90YWctY2xhc3M+DQotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLQ0KLQkJPGRlc2NyaXB0aW9uPg0KLQkJCVByb3ZpZGVzIEVycm9ycyBpbnN0YW5jZSBpbiBjYXNlIG9mIGJpbmQgZXJyb3JzLg0KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZw0KLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPHZhcmlhYmxlPg0KLQkJCTxuYW1lLWdpdmVuPmVycm9yczwvbmFtZS1naXZlbj4NCi0JCQk8dmFyaWFibGUtY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczwvdmFyaWFibGUtY2xhc3M+DQotCQk8L3ZhcmlhYmxlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5uYW1lPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPm5lc3RlZFBhdGg8L25hbWU+DQotCQk8dGFnLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQudGFncy5OZXN0ZWRQYXRoVGFnPC90YWctY2xhc3M+DQotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLQ0KLQkJPGRlc2NyaXB0aW9uPg0KLQkJCVNldHMgYSBuZXN0ZWQgcGF0aCB0byBiZSB1c2VkIGJ5IHRoZSBiaW5kIHRhZydzIHBhdGguDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPHZhcmlhYmxlPg0KLQkJCTxuYW1lLWdpdmVuPm5lc3RlZFBhdGg8L25hbWUtZ2l2ZW4+DQotCQkJPHZhcmlhYmxlLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ZhcmlhYmxlLWNsYXNzPg0KLQkJPC92YXJpYWJsZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+cGF0aDwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCTwvdGFnPg0KLQ0KLQ0KLQk8dGFnPg0KLQ0KLQkJPG5hbWU+YmluZDwvbmFtZT4NCi0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLkJpbmRUYWc8L3RhZy1jbGFzcz4NCi0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotDQotCQk8ZGVzY3JpcHRpb24+DQotCQkJUHJvdmlkZXMgQmluZFN0YXR1cyBvYmplY3QgZm9yIHRoZSBnaXZlbiBiaW5kIHBhdGguDQotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nDQotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4NCi0JCTwvZGVzY3JpcHRpb24+DQotDQotCQk8dmFyaWFibGU+DQotCQkJPG5hbWUtZ2l2ZW4+c3RhdHVzPC9uYW1lLWdpdmVuPg0KLQkJCTx2YXJpYWJsZS1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuQmluZFN0YXR1czwvdmFyaWFibGUtY2xhc3M+DQotCQk8L3ZhcmlhYmxlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5wYXRoPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+aWdub3JlTmVzdGVkUGF0aDwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5odG1sRXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCTwvdGFnPg0KLQ0KLQ0KLQk8dGFnPg0KLQ0KLQkJPG5hbWU+dHJhbnNmb3JtPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuVHJhbnNmb3JtVGFnPC90YWctY2xhc3M+DQotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLQ0KLQkJPGRlc2NyaXB0aW9uPg0KLQkJCVByb3ZpZGVzIHRyYW5zZm9ybWF0aW9uIG9mIHZhcmlhYmxlcyB0byBTdHJpbmdzLCB1c2luZyBhbiBhcHByb3ByaWF0ZQ0KLQkJCWN1c3RvbSBQcm9wZXJ0eUVkaXRvciBmcm9tIEJpbmRUYWcgKGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIEJpbmRUYWcpLg0KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZw0KLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT52YWx1ZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnZhcjwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5zY29wZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5odG1sRXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCTwvdGFnPg0KLQ0KLTwvdGFnbGliPg0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9jLnRsZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9jLnRsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2OThjOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjQvYy50bGQKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci0KLTx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIgotICAgIHZlcnNpb249IjIuMCI+Ci0gICAgCi0gIDxkZXNjcmlwdGlvbj5KU1RMIDEuMSBjb3JlIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgotICA8ZGlzcGxheS1uYW1lPkpTVEwgY29yZTwvZGlzcGxheS1uYW1lPgotICA8dGxpYi12ZXJzaW9uPjEuMTwvdGxpYi12ZXJzaW9uPgotICA8c2hvcnQtbmFtZT5jPC9zaG9ydC1uYW1lPgotICA8dXJpPmh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZTwvdXJpPgotCi0gIDx2YWxpZGF0b3I+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBQcm92aWRlcyBjb3JlIHZhbGlkYXRpb24gZmVhdHVyZXMgZm9yIEpTVEwgdGFncy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDx2YWxpZGF0b3ItY2xhc3M+Ci0gICAgICAgIG9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50bHYuSnN0bENvcmVUTFYKLSAgICA8L3ZhbGlkYXRvci1jbGFzcz4KLSAgPC92YWxpZGF0b3I+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIENhdGNoZXMgYW55IFRocm93YWJsZSB0aGF0IG9jY3VycyBpbiBpdHMgYm9keSBhbmQgb3B0aW9uYWxseQotICAgICAgICBleHBvc2VzIGl0LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+Y2F0Y2g8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLkNhdGNoVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgZm9yIHRoZQotZXhjZXB0aW9uIHRocm93biBmcm9tIGEgbmVzdGVkIGFjdGlvbi4gVGhlIHR5cGUgb2YgdGhlCi1zY29wZWQgdmFyaWFibGUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiB0aHJvd24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0JU2ltcGxlIGNvbmRpdGlvbmFsIHRhZyB0aGF0IGVzdGFibGlzaGVzIGEgY29udGV4dCBmb3IKLQltdXR1YWxseSBleGNsdXNpdmUgY29uZGl0aW9uYWwgb3BlcmF0aW9ucywgbWFya2VkIGJ5Ci0JJmx0O3doZW4mZ3Q7IGFuZCAmbHQ7b3RoZXJ3aXNlJmd0OwotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+Y2hvb3NlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5jb21tb24uY29yZS5DaG9vc2VUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLQlTaW1wbGUgY29uZGl0aW9uYWwgdGFnLCB3aGljaCBldmFsdXRlcyBpdHMgYm9keSBpZiB0aGUKLQlzdXBwbGllZCBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgb3B0aW9uYWxseSBleHBvc2VzIGEgQm9vbGVhbgotCXNjcmlwdGluZyB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhpcyBjb25kaXRpb24KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPmlmPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLklmVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1UaGUgdGVzdCBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgb3IKLW5vdCB0aGUgYm9keSBjb250ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnRlc3Q8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCTx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgZXhwb3J0ZWQgc2NvcGVkIHZhcmlhYmxlIGZvciB0aGUKLXJlc3VsdGluZyB2YWx1ZSBvZiB0aGUgdGVzdCBjb25kaXRpb24uIFRoZSB0eXBlCi1vZiB0aGUgc2NvcGVkIHZhcmlhYmxlIGlzIEJvb2xlYW4uICAgICAgICAKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIGZvciB2YXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgUmV0cmlldmVzIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBhbmQgZXhwb3NlcyBpdHMgY29udGVudHMKLSAgICAgICAgdG8gZWl0aGVyIHRoZSBwYWdlLCBhIFN0cmluZyBpbiAndmFyJywgb3IgYSBSZWFkZXIgaW4gJ3ZhclJlYWRlcicuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5pbXBvcnQ8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuSW1wb3J0VGFnPC90YWctY2xhc3M+Ci0gICAgPHRlaS1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGVpLkltcG9ydFRFSTwvdGVpLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gaW1wb3J0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT51cmw8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZSBmb3IgdGhlCi1yZXNvdXJjZSdzIGNvbnRlbnQuIFRoZSB0eXBlIG9mIHRoZSBzY29wZWQKLXZhcmlhYmxlIGlzIFN0cmluZy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIGZvciB2YXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZSBmb3IgdGhlCi1yZXNvdXJjZSdzIGNvbnRlbnQuIFRoZSB0eXBlIG9mIHRoZSBzY29wZWQKLXZhcmlhYmxlIGlzIFJlYWRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyUmVhZGVyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGNvbnRleHQgd2hlbiBhY2Nlc3NpbmcgYSByZWxhdGl2ZQotVVJMIHJlc291cmNlIHRoYXQgYmVsb25ncyB0byBhIGZvcmVpZ24KLWNvbnRleHQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmNvbnRleHQ8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1DaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGNvbnRlbnQgYXQgdGhlIGlucHV0Ci1yZXNvdXJjZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Y2hhckVuY29kaW5nPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotCVRoZSBiYXNpYyBpdGVyYXRpb24gdGFnLCBhY2NlcHRpbmcgbWFueSBkaWZmZXJlbnQKLSAgICAgICAgY29sbGVjdGlvbiB0eXBlcyBhbmQgc3VwcG9ydGluZyBzdWJzZXR0aW5nIGFuZCBvdGhlcgotICAgICAgICBmdW5jdGlvbmFsaXR5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5mb3JFYWNoPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLkZvckVhY2hUYWc8L3RhZy1jbGFzcz4KLSAgICA8dGVpLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50ZWkuRm9yRWFjaFRFSTwvdGVpLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotQ29sbGVjdGlvbiBvZiBpdGVtcyB0byBpdGVyYXRlIG92ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+aXRlbXM8L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JPHR5cGU+amF2YS5sYW5nLk9iamVjdDwvdHlwZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1JZiBpdGVtcyBzcGVjaWZpZWQ6Ci1JdGVyYXRpb24gYmVnaW5zIGF0IHRoZSBpdGVtIGxvY2F0ZWQgYXQgdGhlCi1zcGVjaWZpZWQgaW5kZXguIEZpcnN0IGl0ZW0gb2YgdGhlIGNvbGxlY3Rpb24gaGFzCi1pbmRleCAwLgotSWYgaXRlbXMgbm90IHNwZWNpZmllZDoKLUl0ZXJhdGlvbiBiZWdpbnMgd2l0aCBpbmRleCBzZXQgYXQgdGhlIHZhbHVlCi1zcGVjaWZpZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+YmVnaW48L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JPHR5cGU+aW50PC90eXBlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLUlmIGl0ZW1zIHNwZWNpZmllZDoKLUl0ZXJhdGlvbiBlbmRzIGF0IHRoZSBpdGVtIGxvY2F0ZWQgYXQgdGhlCi1zcGVjaWZpZWQgaW5kZXggKGluY2x1c2l2ZSkuCi1JZiBpdGVtcyBub3Qgc3BlY2lmaWVkOgotSXRlcmF0aW9uIGVuZHMgd2hlbiBpbmRleCByZWFjaGVzIHRoZSB2YWx1ZQotc3BlY2lmaWVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCTxuYW1lPmVuZDwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQk8dHlwZT5pbnQ8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotSXRlcmF0aW9uIHdpbGwgb25seSBwcm9jZXNzIGV2ZXJ5IHN0ZXAgaXRlbXMgb2YKLXRoZSBjb2xsZWN0aW9uLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+c3RlcDwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQk8dHlwZT5pbnQ8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgZXhwb3J0ZWQgc2NvcGVkIHZhcmlhYmxlIGZvciB0aGUKLWN1cnJlbnQgaXRlbSBvZiB0aGUgaXRlcmF0aW9uLiBUaGlzIHNjb3BlZAotdmFyaWFibGUgaGFzIG5lc3RlZCB2aXNpYmlsaXR5LiBJdHMgdHlwZSBkZXBlbmRzCi1vbiB0aGUgb2JqZWN0IG9mIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+dmFyPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgZm9yIHRoZQotc3RhdHVzIG9mIHRoZSBpdGVyYXRpb24uIE9iamVjdCBleHBvcnRlZCBpcyBvZiB0eXBlCi1qYXZheC5zZXJ2bGV0LmpzcC5qc3RsLmNvcmUuTG9vcFRhZ1N0YXR1cy4gVGhpcyBzY29wZWQgdmFyaWFibGUgaGFzIG5lc3RlZAotdmlzaWJpbGl0eS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8bmFtZT52YXJTdGF0dXM8L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLQlJdGVyYXRlcyBvdmVyIHRva2Vucywgc2VwYXJhdGVkIGJ5IHRoZSBzdXBwbGllZCBkZWxpbWV0ZXJzCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5mb3JUb2tlbnM8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuRm9yVG9rZW5zVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TdHJpbmcgb2YgdG9rZW5zIHRvIGl0ZXJhdGUgb3Zlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8bmFtZT5pdGVtczwvbmFtZT4KLQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVGhlIHNldCBvZiBkZWxpbWl0ZXJzICh0aGUgY2hhcmFjdGVycyB0aGF0Ci1zZXBhcmF0ZSB0aGUgdG9rZW5zIGluIHRoZSBzdHJpbmcpLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCTxuYW1lPmRlbGltczwvbmFtZT4KLQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCTx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotSXRlcmF0aW9uIGJlZ2lucyBhdCB0aGUgdG9rZW4gbG9jYXRlZCBhdCB0aGUKLXNwZWNpZmllZCBpbmRleC4gRmlyc3QgdG9rZW4gaGFzIGluZGV4IDAuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+YmVnaW48L25hbWU+Ci0JPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JPHR5cGU+aW50PC90eXBlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLUl0ZXJhdGlvbiBlbmRzIGF0IHRoZSB0b2tlbiBsb2NhdGVkIGF0IHRoZQotc3BlY2lmaWVkIGluZGV4IChpbmNsdXNpdmUpLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCTxuYW1lPmVuZDwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQk8dHlwZT5pbnQ8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotSXRlcmF0aW9uIHdpbGwgb25seSBwcm9jZXNzIGV2ZXJ5IHN0ZXAgdG9rZW5zCi1vZiB0aGUgc3RyaW5nLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+c3RlcDwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQk8dHlwZT5pbnQ8L3R5cGU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgZXhwb3J0ZWQgc2NvcGVkIHZhcmlhYmxlIGZvciB0aGUKLWN1cnJlbnQgaXRlbSBvZiB0aGUgaXRlcmF0aW9uLiBUaGlzIHNjb3BlZAotdmFyaWFibGUgaGFzIG5lc3RlZCB2aXNpYmlsaXR5LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCTxuYW1lPnZhcjwvbmFtZT4KLQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCTxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgZXhwb3J0ZWQgc2NvcGVkIHZhcmlhYmxlIGZvciB0aGUKLXN0YXR1cyBvZiB0aGUgaXRlcmF0aW9uLiBPYmplY3QgZXhwb3J0ZWQgaXMgb2YKLXR5cGUKLWphdmF4LnNlcnZsZXQuanNwLmpzdGwuY29yZS5Mb29wVGFnCi1TdGF0dXMuIFRoaXMgc2NvcGVkIHZhcmlhYmxlIGhhcyBuZXN0ZWQKLXZpc2liaWxpdHkuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPG5hbWU+dmFyU3RhdHVzPC9uYW1lPgotCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIExpa2UgJmx0OyU9IC4uLiAmZ3Q7LCBidXQgZm9yIGV4cHJlc3Npb25zLgotICAgIDwvZGVzY3JpcHRpb24+IAotICAgIDxuYW1lPm91dDwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5PdXRUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLUV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotRGVmYXVsdCB2YWx1ZSBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIG51bGwuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmRlZmF1bHQ8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1EZXRlcm1pbmVzIHdoZXRoZXIgY2hhcmFjdGVycyAmbHQ7LCZndDssJmFtcDssJywiIGluIHRoZQotcmVzdWx0aW5nIHN0cmluZyBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZWlyCi1jb3JyZXNwb25kaW5nIGNoYXJhY3RlciBlbnRpdHkgY29kZXMuIERlZmF1bHQgdmFsdWUgaXMKLXRydWUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmVzY2FwZVhtbDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTdWJ0YWcgb2YgJmx0O2Nob29zZSZndDsgdGhhdCBmb2xsb3dzICZsdDt3aGVuJmd0OyB0YWdzCi0gICAgICAgIGFuZCBydW5zIG9ubHkgaWYgYWxsIG9mIHRoZSBwcmlvciBjb25kaXRpb25zIGV2YWx1YXRlZCB0bwotICAgICAgICAnZmFsc2UnCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5vdGhlcndpc2U8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLk90aGVyd2lzZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBZGRzIGEgcGFyYW1ldGVyIHRvIGEgY29udGFpbmluZyAnaW1wb3J0JyB0YWcncyBVUkwuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5wYXJhbTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5QYXJhbVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFJlZGlyZWN0cyB0byBhIG5ldyBVUkwuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5yZWRpcmVjdDwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5SZWRpcmVjdFRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gcmVkaXJlY3QgdG8uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnVybDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGNvbnRleHQgd2hlbiByZWRpcmVjdGluZyB0byBhIHJlbGF0aXZlIFVSTAotcmVzb3VyY2UgdGhhdCBiZWxvbmdzIHRvIGEgZm9yZWlnbiBjb250ZXh0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5jb250ZXh0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBSZW1vdmVzIGEgc2NvcGVkIHZhcmlhYmxlIChmcm9tIGEgcGFydGljdWxhciBzY29wZSwgaWYgc3BlY2lmaWVkKS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPnJlbW92ZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuY29tbW9uLmNvcmUuUmVtb3ZlVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIHNjb3BlZCB2YXJpYWJsZSB0byBiZSByZW1vdmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TY29wZSBmb3IgdmFyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5zY29wZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU2V0cyB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpbiBhICdzY29wZScKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPnNldDwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5TZXRUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZSB0byBob2xkIHRoZSB2YWx1ZQotc3BlY2lmaWVkIGluIHRoZSBhY3Rpb24uIFRoZSB0eXBlIG9mIHRoZSBzY29wZWQgdmFyaWFibGUgaXMKLXdoYXRldmVyIHR5cGUgdGhlIHZhbHVlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotRXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIHNldC4gTXVzdCBldmFsdWF0ZSB0bwotYSBKYXZhQmVhbnMgb2JqZWN0IHdpdGggc2V0dGVyIHByb3BlcnR5IHByb3BlcnR5LCBvciB0byBhCi1qYXZhLnV0aWwuTWFwIG9iamVjdC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dGFyZ2V0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0IGluIHRoZSB0YXJnZXQgb2JqZWN0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5wcm9wZXJ0eTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIGZvciB2YXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQ3JlYXRlcyBhIFVSTCB3aXRoIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT51cmw8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuVXJsVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgZm9yIHRoZQotcHJvY2Vzc2VkIHVybC4gVGhlIHR5cGUgb2YgdGhlIHNjb3BlZCB2YXJpYWJsZSBpcwotU3RyaW5nLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YXI8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotU2NvcGUgZm9yIHZhci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVVJMIHRvIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBjb250ZXh0IHdoZW4gc3BlY2lmeWluZyBhIHJlbGF0aXZlIFVSTAotcmVzb3VyY2UgdGhhdCBiZWxvbmdzIHRvIGEgZm9yZWlnbiBjb250ZXh0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5jb250ZXh0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotCVN1YnRhZyBvZiAmbHQ7Y2hvb3NlJmd0OyB0aGF0IGluY2x1ZGVzIGl0cyBib2R5IGlmIGl0cwotCWNvbmRpdGlvbiBldmFsdXRlcyB0byAndHJ1ZScKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPndoZW48L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuV2hlblRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotVGhlIHRlc3QgY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUKLWJvZHkgY29udGVudCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT50ZXN0PC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQk8dHlwZT5ib29sZWFuPC90eXBlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotPC90YWdsaWI+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjQvZm10LnRsZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9mbXQudGxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjlhNTRhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9mbXQudGxkCisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCIKLSAgICB2ZXJzaW9uPSIyLjAiPgotICAgIAotICA8ZGVzY3JpcHRpb24+SlNUTCAxLjEgaTE4bi1jYXBhYmxlIGZvcm1hdHRpbmcgbGlicmFyeTwvZGVzY3JpcHRpb24+Ci0gIDxkaXNwbGF5LW5hbWU+SlNUTCBmbXQ8L2Rpc3BsYXktbmFtZT4KLSAgPHRsaWItdmVyc2lvbj4xLjE8L3RsaWItdmVyc2lvbj4KLSAgPHNob3J0LW5hbWU+Zm10PC9zaG9ydC1uYW1lPgotICA8dXJpPmh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvZm10PC91cmk+Ci0KLSAgPHZhbGlkYXRvcj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFByb3ZpZGVzIGNvcmUgdmFsaWRhdGlvbiBmZWF0dXJlcyBmb3IgSlNUTCB0YWdzLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHZhbGlkYXRvci1jbGFzcz4KLSAgICAgICAgb3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRsdi5Kc3RsRm10VExWCi0gICAgPC92YWxpZGF0b3ItY2xhc3M+Ci0gIDwvdmFsaWRhdG9yPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTZXRzIHRoZSByZXF1ZXN0IGNoYXJhY3RlciBlbmNvZGluZwotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+cmVxdWVzdEVuY29kaW5nPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuUmVxdWVzdEVuY29kaW5nVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIGFwcGxpZWQgd2hlbgotZGVjb2RpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RvcmVzIHRoZSBnaXZlbiBsb2NhbGUgaW4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5zZXRMb2NhbGU8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmZtdC5TZXRMb2NhbGVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotQSBTdHJpbmcgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlCi1wcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBsb2NhbGUsIHdoaWNoCi1tdXN0IGNvbnRhaW4gYSB0d28tbGV0dGVyIChsb3dlci1jYXNlKQotbGFuZ3VhZ2UgY29kZSAoYXMgZGVmaW5lZCBieSBJU08tNjM5KSwKLWFuZCBtYXkgY29udGFpbiBhIHR3by1sZXR0ZXIgKHVwcGVyLWNhc2UpCi1jb3VudHJ5IGNvZGUgKGFzIGRlZmluZWQgYnkgSVNPLTMxNjYpLgotTGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMgbXVzdCBiZQotc2VwYXJhdGVkIGJ5IGh5cGhlbiAoLSkgb3IgdW5kZXJzY29yZQotKF8pLiAgICAgICAgCi0JPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVZlbmRvci0gb3IgYnJvd3Nlci1zcGVjaWZpYyB2YXJpYW50LgotU2VlIHRoZSBqYXZhLnV0aWwuTG9jYWxlIGphdmFkb2NzIGZvcgotbW9yZSBpbmZvcm1hdGlvbiBvbiB2YXJpYW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyaWFudDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTcGVjaWZpZXMgdGhlIHRpbWUgem9uZSBmb3IgYW55IHRpbWUgZm9ybWF0dGluZyBvciBwYXJzaW5nIGFjdGlvbnMKLSAgICAgICAgbmVzdGVkIGluIGl0cyBib2R5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT50aW1lWm9uZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuZm10LlRpbWVab25lVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1UaGUgdGltZSB6b25lLiBBIFN0cmluZyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcwotYSB0aW1lIHpvbmUgSUQuIFRoaXMgbWF5IGJlIG9uZSBvZiB0aGUgdGltZSB6b25lCi1JRHMgc3VwcG9ydGVkIGJ5IHRoZSBKYXZhIHBsYXRmb3JtIChzdWNoIGFzCi0iQW1lcmljYS9Mb3NfQW5nZWxlcyIpIG9yIGEgY3VzdG9tIHRpbWUgem9uZQotSUQgKHN1Y2ggYXMgIkdNVC04IikuIFNlZQotamF2YS51dGlsLlRpbWVab25lIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCi1zdXBwb3J0ZWQgdGltZSB6b25lIGZvcm1hdHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFN0b3JlcyB0aGUgZ2l2ZW4gdGltZSB6b25lIGluIHRoZSB0aW1lIHpvbmUgY29uZmlndXJhdGlvbiB2YXJpYWJsZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+c2V0VGltZVpvbmU8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmZtdC5TZXRUaW1lWm9uZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1UaGUgdGltZSB6b25lLiBBIFN0cmluZyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcwotYSB0aW1lIHpvbmUgSUQuIFRoaXMgbWF5IGJlIG9uZSBvZiB0aGUgdGltZSB6b25lCi1JRHMgc3VwcG9ydGVkIGJ5IHRoZSBKYXZhIHBsYXRmb3JtIChzdWNoIGFzCi0iQW1lcmljYS9Mb3NfQW5nZWxlcyIpIG9yIGEgY3VzdG9tIHRpbWUgem9uZQotSUQgKHN1Y2ggYXMgIkdNVC04IikuIFNlZSBqYXZhLnV0aWwuVGltZVpvbmUgZm9yCi1tb3JlIGluZm9ybWF0aW9uIG9uIHN1cHBvcnRlZCB0aW1lIHpvbmUKLWZvcm1hdHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgd2hpY2gKLXN0b3JlcyB0aGUgdGltZSB6b25lIG9mIHR5cGUKLWphdmEudXRpbC5UaW1lWm9uZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHZhciBvciB0aGUgdGltZSB6b25lIGNvbmZpZ3VyYXRpb24KLXZhcmlhYmxlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5zY29wZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIExvYWRzIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHVzZWQgYnkgaXRzIHRhZyBib2R5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5idW5kbGU8L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmZtdC5CdW5kbGVUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVJlc291cmNlIGJ1bmRsZSBiYXNlIG5hbWUuIFRoaXMgaXMgdGhlIGJ1bmRsZSdzCi1mdWxseS1xdWFsaWZpZWQgcmVzb3VyY2UgbmFtZSwgd2hpY2ggaGFzIHRoZSBzYW1lCi1mb3JtIGFzIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUsIHRoYXQgaXMsIGl0IHVzZXMKLSIuIiBhcyB0aGUgcGFja2FnZSBjb21wb25lbnQgc2VwYXJhdG9yIGFuZCBkb2VzIG5vdAotaGF2ZSBhbnkgZmlsZSB0eXBlIChzdWNoIGFzICIuY2xhc3MiIG9yICIucHJvcGVydGllcyIpCi1zdWZmaXguCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmJhc2VuYW1lPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1QcmVmaXggdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZQota2V5IG9mIGFueSBuZXN0ZWQgJmx0O2ZtdDptZXNzYWdlJmd0OyBhY3Rpb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnByZWZpeDwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotICA8dGFnPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgTG9hZHMgYSByZXNvdXJjZSBidW5kbGUgYW5kIHN0b3JlcyBpdCBpbiB0aGUgbmFtZWQgc2NvcGVkIHZhcmlhYmxlIG9yCi0gICAgICAgIHRoZSBidW5kbGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+c2V0QnVuZGxlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuU2V0QnVuZGxlVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVJlc291cmNlIGJ1bmRsZSBiYXNlIG5hbWUuIFRoaXMgaXMgdGhlIGJ1bmRsZSdzCi1mdWxseS1xdWFsaWZpZWQgcmVzb3VyY2UgbmFtZSwgd2hpY2ggaGFzIHRoZSBzYW1lCi1mb3JtIGFzIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUsIHRoYXQgaXMsIGl0IHVzZXMKLSIuIiBhcyB0aGUgcGFja2FnZSBjb21wb25lbnQgc2VwYXJhdG9yIGFuZCBkb2VzIG5vdAotaGF2ZSBhbnkgZmlsZSB0eXBlIChzdWNoIGFzICIuY2xhc3MiIG9yICIucHJvcGVydGllcyIpCi1zdWZmaXguCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmJhc2VuYW1lPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgd2hpY2ggc3RvcmVzCi10aGUgaTE4biBsb2NhbGl6YXRpb24gY29udGV4dCBvZiB0eXBlCi1qYXZheC5zZXJ2bGV0LmpzcC5qc3RsLmZtdC5Mb2NhbGl6YXRpb25DCi1vbnRleHQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TY29wZSBvZiB2YXIgb3IgdGhlIGxvY2FsaXphdGlvbiBjb250ZXh0Ci1jb25maWd1cmF0aW9uIHZhcmlhYmxlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5zY29wZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIE1hcHMga2V5IHRvIGxvY2FsaXplZCBtZXNzYWdlIGFuZCBwZXJmb3JtcyBwYXJhbWV0cmljIHJlcGxhY2VtZW50Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5tZXNzYWdlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuTWVzc2FnZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTWVzc2FnZSBrZXkgdG8gYmUgbG9va2VkIHVwLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5rZXk8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1Mb2NhbGl6YXRpb24gY29udGV4dCBpbiB3aG9zZSByZXNvdXJjZQotYnVuZGxlIHRoZSBtZXNzYWdlIGtleSBpcyBsb29rZWQgdXAuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPmJ1bmRsZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZQotd2hpY2ggc3RvcmVzIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHZhci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTdXBwbGllcyBhbiBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudCB0byBhIGNvbnRhaW5pbmcKLSAgICAgICAgJmx0O21lc3NhZ2UmZ3Q7IHRhZwotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+cGFyYW08L25hbWU+Ci0gICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmZtdC5QYXJhbVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotQXJndW1lbnQgdXNlZCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgPC90YWc+Ci0KLSAgPHRhZz4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEZvcm1hdHMgYSBudW1lcmljIHZhbHVlIGFzIGEgbnVtYmVyLCBjdXJyZW5jeSwgb3IgcGVyY2VudGFnZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+Zm9ybWF0TnVtYmVyPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuRm9ybWF0TnVtYmVyVGFnPC90YWctY2xhc3M+Ci0gICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OdW1lcmljIHZhbHVlIHRvIGJlIGZvcm1hdHRlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TcGVjaWZpZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgdG8gYmUKLWZvcm1hdHRlZCBhcyBudW1iZXIsIGN1cnJlbmN5LCBvcgotcGVyY2VudGFnZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dHlwZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLUN1c3RvbSBmb3JtYXR0aW5nIHBhdHRlcm4uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnBhdHRlcm48L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1JU08gNDIxNyBjdXJyZW5jeSBjb2RlLiBBcHBsaWVkIG9ubHkKLXdoZW4gZm9ybWF0dGluZyBjdXJyZW5jaWVzIChpLmUuIGlmIHR5cGUgaXMKLWVxdWFsIHRvICJjdXJyZW5jeSIpOyBpZ25vcmVkIG90aGVyd2lzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Y3VycmVuY3lDb2RlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotQ3VycmVuY3kgc3ltYm9sLiBBcHBsaWVkIG9ubHkgd2hlbgotZm9ybWF0dGluZyBjdXJyZW5jaWVzIChpLmUuIGlmIHR5cGUgaXMgZXF1YWwKLXRvICJjdXJyZW5jeSIpOyBpZ25vcmVkIG90aGVyd2lzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Y3VycmVuY3lTeW1ib2w8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TcGVjaWZpZXMgd2hldGhlciB0aGUgZm9ybWF0dGVkIG91dHB1dAotd2lsbCBjb250YWluIGFueSBncm91cGluZyBzZXBhcmF0b3JzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5ncm91cGluZ1VzZWQ8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1NYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGludGVnZXIKLXBvcnRpb24gb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPm1heEludGVnZXJEaWdpdHM8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1NaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGludGVnZXIKLXBvcnRpb24gb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPm1pbkludGVnZXJEaWdpdHM8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1NYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlCi1mcmFjdGlvbmFsIHBvcnRpb24gb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPm1heEZyYWN0aW9uRGlnaXRzPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZQotZnJhY3Rpb25hbCBwb3J0aW9uIG9mIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5taW5GcmFjdGlvbkRpZ2l0czwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZQotd2hpY2ggc3RvcmVzIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IGFzIGEKLVN0cmluZy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHZhci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBQYXJzZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlciwgY3VycmVuY3ksIG9yIHBlcmNlbnRhZ2UKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPnBhcnNlTnVtYmVyPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuUGFyc2VOdW1iZXJUYWc8L3RhZy1jbGFzcz4KLSAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVN0cmluZyB0byBiZSBwYXJzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN0cmluZyBpbiB0aGUgdmFsdWUKLWF0dHJpYnV0ZSBzaG91bGQgYmUgcGFyc2VkIGFzIGEgbnVtYmVyLAotY3VycmVuY3ksIG9yIHBlcmNlbnRhZ2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnR5cGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1DdXN0b20gZm9ybWF0dGluZyBwYXR0ZXJuIHRoYXQgZGV0ZXJtaW5lcwotaG93IHRoZSBzdHJpbmcgaW4gdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyB0byBiZQotcGFyc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5wYXR0ZXJuPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTG9jYWxlIHdob3NlIGRlZmF1bHQgZm9ybWF0dGluZyBwYXR0ZXJuIChmb3IKLW51bWJlcnMsIGN1cnJlbmNpZXMsIG9yIHBlcmNlbnRhZ2VzLAotcmVzcGVjdGl2ZWx5KSBpcyB0byBiZSB1c2VkIGR1cmluZyB0aGUgcGFyc2UKLW9wZXJhdGlvbiwgb3IgdG8gd2hpY2ggdGhlIHBhdHRlcm4gc3BlY2lmaWVkCi12aWEgdGhlIHBhdHRlcm4gYXR0cmlidXRlIChpZiBwcmVzZW50KSBpcwotYXBwbGllZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+cGFyc2VMb2NhbGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TcGVjaWZpZXMgd2hldGhlciBqdXN0IHRoZSBpbnRlZ2VyIHBvcnRpb24gb2YKLXRoZSBnaXZlbiB2YWx1ZSBzaG91bGQgYmUgcGFyc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5pbnRlZ2VyT25seTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLU5hbWUgb2YgdGhlIGV4cG9ydGVkIHNjb3BlZCB2YXJpYWJsZSB3aGljaAotc3RvcmVzIHRoZSBwYXJzZWQgcmVzdWx0IChvZiB0eXBlCi1qYXZhLmxhbmcuTnVtYmVyKS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHZhci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBGb3JtYXRzIGEgZGF0ZSBhbmQvb3IgdGltZSB1c2luZyB0aGUgc3VwcGxpZWQgc3R5bGVzIGFuZCBwYXR0ZXJuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5mb3JtYXREYXRlPC9uYW1lPgotICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5mbXQuRm9ybWF0RGF0ZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1EYXRlIGFuZC9vciB0aW1lIHRvIGJlIGZvcm1hdHRlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNwZWNpZmllcyB3aGV0aGVyIHRoZSB0aW1lLCB0aGUgZGF0ZSwgb3IgYm90aAotdGhlIHRpbWUgYW5kIGRhdGUgY29tcG9uZW50cyBvZiB0aGUgZ2l2ZW4KLWRhdGUgYXJlIHRvIGJlIGZvcm1hdHRlZC4gCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnR5cGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1QcmVkZWZpbmVkIGZvcm1hdHRpbmcgc3R5bGUgZm9yIGRhdGVzLiBGb2xsb3dzCi10aGUgc2VtYW50aWNzIGRlZmluZWQgaW4gY2xhc3MKLWphdmEudGV4dC5EYXRlRm9ybWF0LiBBcHBsaWVkIG9ubHkKLXdoZW4gZm9ybWF0dGluZyBhIGRhdGUgb3IgYm90aCBhIGRhdGUgYW5kCi10aW1lIChpLmUuIGlmIHR5cGUgaXMgbWlzc2luZyBvciBpcyBlcXVhbCB0bwotImRhdGUiIG9yICJib3RoIik7IGlnbm9yZWQgb3RoZXJ3aXNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5kYXRlU3R5bGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1QcmVkZWZpbmVkIGZvcm1hdHRpbmcgc3R5bGUgZm9yIHRpbWVzLiBGb2xsb3dzCi10aGUgc2VtYW50aWNzIGRlZmluZWQgaW4gY2xhc3MKLWphdmEudGV4dC5EYXRlRm9ybWF0LiBBcHBsaWVkIG9ubHkKLXdoZW4gZm9ybWF0dGluZyBhIHRpbWUgb3IgYm90aCBhIGRhdGUgYW5kCi10aW1lIChpLmUuIGlmIHR5cGUgaXMgZXF1YWwgdG8gInRpbWUiIG9yICJib3RoIik7Ci1pZ25vcmVkIG90aGVyd2lzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dGltZVN0eWxlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotQ3VzdG9tIGZvcm1hdHRpbmcgc3R5bGUgZm9yIGRhdGVzIGFuZCB0aW1lcy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVRpbWUgem9uZSBpbiB3aGljaCB0byByZXByZXNlbnQgdGhlIGZvcm1hdHRlZAotdGltZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dGltZVpvbmU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1OYW1lIG9mIHRoZSBleHBvcnRlZCBzY29wZWQgdmFyaWFibGUgd2hpY2gKLXN0b3JlcyB0aGUgZm9ybWF0dGVkIHJlc3VsdCBhcyBhIFN0cmluZy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dmFyPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNjb3BlIG9mIHZhci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gIDwvdGFnPgotCi0gIDx0YWc+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBQYXJzZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgYW5kL29yIHRpbWUKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxuYW1lPnBhcnNlRGF0ZTwvbmFtZT4KLSAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuZm10LlBhcnNlRGF0ZVRhZzwvdGFnLWNsYXNzPgotICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotRGF0ZSBzdHJpbmcgdG8gYmUgcGFyc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVNwZWNpZmllcyB3aGV0aGVyIHRoZSBkYXRlIHN0cmluZyBpbiB0aGUKLXZhbHVlIGF0dHJpYnV0ZSBpcyBzdXBwb3NlZCB0byBjb250YWluIGEKLXRpbWUsIGEgZGF0ZSwgb3IgYm90aC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dHlwZTwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVByZWRlZmluZWQgZm9ybWF0dGluZyBzdHlsZSBmb3IgZGF5cwotd2hpY2ggZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGUKLWNvbXBvbmVudCBvZiB0aGUgZGF0ZSBzdHJpbmcgaXMgdG8gYmUKLXBhcnNlZC4gQXBwbGllZCBvbmx5IHdoZW4gZm9ybWF0dGluZyBhCi1kYXRlIG9yIGJvdGggYSBkYXRlIGFuZCB0aW1lIChpLmUuIGlmIHR5cGUKLWlzIG1pc3Npbmcgb3IgaXMgZXF1YWwgdG8gImRhdGUiIG9yICJib3RoIik7Ci1pZ25vcmVkIG90aGVyd2lzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+ZGF0ZVN0eWxlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotUHJlZGVmaW5lZCBmb3JtYXR0aW5nIHN0eWxlcyBmb3IgdGltZXMKLXdoaWNoIGRldGVybWluZXMgaG93IHRoZSB0aW1lCi1jb21wb25lbnQgaW4gdGhlIGRhdGUgc3RyaW5nIGlzIHRvIGJlCi1wYXJzZWQuIEFwcGxpZWQgb25seSB3aGVuIGZvcm1hdHRpbmcgYQotdGltZSBvciBib3RoIGEgZGF0ZSBhbmQgdGltZSAoaS5lLiBpZiB0eXBlCi1pcyBlcXVhbCB0byAidGltZSIgb3IgImJvdGgiKTsgaWdub3JlZAotb3RoZXJ3aXNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT50aW1lU3R5bGU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1DdXN0b20gZm9ybWF0dGluZyBwYXR0ZXJuIHdoaWNoCi1kZXRlcm1pbmVzIGhvdyB0aGUgZGF0ZSBzdHJpbmcgaXMgdG8gYmUKLXBhcnNlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLVRpbWUgem9uZSBpbiB3aGljaCB0byBpbnRlcnByZXQgYW55IHRpbWUKLWluZm9ybWF0aW9uIGluIHRoZSBkYXRlIHN0cmluZy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+dGltZVpvbmU8L25hbWU+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1Mb2NhbGUgd2hvc2UgcHJlZGVmaW5lZCBmb3JtYXR0aW5nIHN0eWxlcwotZm9yIGRhdGVzIGFuZCB0aW1lcyBhcmUgdG8gYmUgdXNlZCBkdXJpbmcKLXRoZSBwYXJzZSBvcGVyYXRpb24sIG9yIHRvIHdoaWNoIHRoZQotcGF0dGVybiBzcGVjaWZpZWQgdmlhIHRoZSBwYXR0ZXJuCi1hdHRyaWJ1dGUgKGlmIHByZXNlbnQpIGlzIGFwcGxpZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnBhcnNlTG9jYWxlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgPC9hdHRyaWJ1dGU+Ci0gICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotTmFtZSBvZiB0aGUgZXhwb3J0ZWQgc2NvcGVkIHZhcmlhYmxlIGluCi13aGljaCB0aGUgcGFyc2luZyByZXN1bHQgKG9mIHR5cGUKLWphdmEudXRpbC5EYXRlKSBpcyBzdG9yZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnZhcjwvbmFtZT4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICA8L2F0dHJpYnV0ZT4KLSAgICA8YXR0cmlidXRlPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci1TY29wZSBvZiB2YXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPgotICAgIDwvYXR0cmlidXRlPgotICA8L3RhZz4KLQotPC90YWdsaWI+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC8yLjQvc3ByaW5nLnRsZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9zcHJpbmcudGxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmY3YmZmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvdGxkLzIuNC9zcHJpbmcudGxkCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+DQotPCFET0NUWVBFIHRhZ2xpYiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPg0KLQ0KLTx0YWdsaWI+DQotDQotCTx0bGliLXZlcnNpb24+MS4xLjE8L3RsaWItdmVyc2lvbj4NCi0NCi0JPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+DQotDQotCTxzaG9ydC1uYW1lPlNwcmluZzwvc2hvcnQtbmFtZT4NCi0NCi0JPHVyaT5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvdGFnczwvdXJpPg0KLQ0KLQk8ZGVzY3JpcHRpb24+U3ByaW5nIEZyYW1ld29yayBKU1AgVGFnIExpYnJhcnkuIEF1dGhvcnM6IFJvZCBKb2huc29uLCBKdWVyZ2VuIEhvZWxsZXI8L2Rlc2NyaXB0aW9uPg0KLQ0KLQ0KLQk8dGFnPg0KLQ0KLQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4NCi0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLkh0bWxFc2NhcGVUYWc8L3RhZy1jbGFzcz4NCi0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotDQotCQk8ZGVzY3JpcHRpb24+DQotCQkJU2V0cyBkZWZhdWx0IEhUTUwgZXNjYXBlIHZhbHVlIGZvciB0aGUgY3VycmVudCBwYWdlLg0KLQkJCU92ZXJyaWRlcyBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sLCBpZiBhbnkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5kZWZhdWx0SHRtbEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCTwvdGFnPg0KLQ0KLQ0KLQk8dGFnPg0KLQ0KLQkJPG5hbWU+ZXNjYXBlQm9keTwvbmFtZT4NCi0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLkVzY2FwZUJvZHlUYWc8L3RhZy1jbGFzcz4NCi0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotDQotCQk8ZGVzY3JpcHRpb24+DQotCQkJRXNjYXBlcyBpdHMgZW5jbG9zZWQgYm9keSBjb250ZW50LCBhcHBseWluZyBIVE1MIGVzY2FwaW5nIGFuZC9vciBKYXZhU2NyaXB0IGVzY2FwaW5nLg0KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZw0KLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5odG1sRXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmphdmFTY3JpcHRFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JPC90YWc+DQotDQotDQotCTx0YWc+DQotDQotCQk8bmFtZT5tZXNzYWdlPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuTWVzc2FnZVRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlSZXRyaWV2ZXMgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29kZSwgb3IgdGV4dCBpZiBjb2RlIGlzbid0IHJlc29sdmFibGUuDQotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nDQotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4NCi0JCTwvZGVzY3JpcHRpb24+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmNvZGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+YXJndW1lbnRzPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnRleHQ8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+dmFyPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnNjb3BlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+amF2YVNjcmlwdEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPnRoZW1lPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuVGhlbWVUYWc8L3RhZy1jbGFzcz4NCi0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotDQotCQk8ZGVzY3JpcHRpb24+DQotCQkJUmV0cmlldmVzIHRoZSB0aGVtZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIGNvZGUsIG9yIHRleHQgaWYgY29kZSBpc24ndCByZXNvbHZhYmxlLg0KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZw0KLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5jb2RlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmFyZ3VtZW50czwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT50ZXh0PC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnZhcjwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5zY29wZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT5odG1sRXNjYXBlPC9uYW1lPg0KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmphdmFTY3JpcHRFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JPC90YWc+DQotDQotDQotCTx0YWc+DQotDQotCQk8bmFtZT5oYXNCaW5kRXJyb3JzPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuQmluZEVycm9yc1RhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlQcm92aWRlcyBFcnJvcnMgaW5zdGFuY2UgaW4gY2FzZSBvZiBiaW5kIGVycm9ycy4NCi0JCQlUaGUgSFRNTCBlc2NhcGluZyBmbGFnIHBhcnRpY2lwYXRlcyBpbiBhIHBhZ2Utd2lkZSBvciBhcHBsaWNhdGlvbi13aWRlIHNldHRpbmcNCi0JCQkoaS5lLiBieSBIdG1sRXNjYXBlVGFnIG9yIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwpLg0KLQkJPC9kZXNjcmlwdGlvbj4NCi0NCi0JCTx2YXJpYWJsZT4NCi0JCQk8bmFtZS1naXZlbj5lcnJvcnM8L25hbWUtZ2l2ZW4+DQotCQkJPHZhcmlhYmxlLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM8L3ZhcmlhYmxlLWNsYXNzPg0KLQkJPC92YXJpYWJsZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+bmFtZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JPC90YWc+DQotDQotDQotCTx0YWc+DQotDQotCQk8bmFtZT5uZXN0ZWRQYXRoPC9uYW1lPg0KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuTmVzdGVkUGF0aFRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlTZXRzIGEgbmVzdGVkIHBhdGggdG8gYmUgdXNlZCBieSB0aGUgYmluZCB0YWcncyBwYXRoLg0KLQkJPC9kZXNjcmlwdGlvbj4NCi0NCi0JCTx2YXJpYWJsZT4NCi0JCQk8bmFtZS1naXZlbj5uZXN0ZWRQYXRoPC9uYW1lLWdpdmVuPg0KLQkJCTx2YXJpYWJsZS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC92YXJpYWJsZS1jbGFzcz4NCi0JCTwvdmFyaWFibGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPnBhdGg8L25hbWU+DQotCQkJPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPmJpbmQ8L25hbWU+DQotCQk8dGFnLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQudGFncy5CaW5kVGFnPC90YWctY2xhc3M+DQotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLQ0KLQkJPGRlc2NyaXB0aW9uPg0KLQkJCVByb3ZpZGVzIEJpbmRTdGF0dXMgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYmluZCBwYXRoLg0KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZw0KLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuDQotCQk8L2Rlc2NyaXB0aW9uPg0KLQ0KLQkJPHZhcmlhYmxlPg0KLQkJCTxuYW1lLWdpdmVuPnN0YXR1czwvbmFtZS1naXZlbj4NCi0JCQk8dmFyaWFibGUtY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5zdXBwb3J0LkJpbmRTdGF0dXM8L3ZhcmlhYmxlLWNsYXNzPg0KLQkJPC92YXJpYWJsZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+cGF0aDwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLQkJPC9hdHRyaWJ1dGU+DQotDQotCQk8YXR0cmlidXRlPg0KLQkJCTxuYW1lPmlnbm9yZU5lc3RlZFBhdGg8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi0NCi0JPHRhZz4NCi0NCi0JCTxuYW1lPnRyYW5zZm9ybTwvbmFtZT4NCi0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLlRyYW5zZm9ybVRhZzwvdGFnLWNsYXNzPg0KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlQcm92aWRlcyB0cmFuc2Zvcm1hdGlvbiBvZiB2YXJpYWJsZXMgdG8gU3RyaW5ncywgdXNpbmcgYW4gYXBwcm9wcmlhdGUNCi0JCQljdXN0b20gUHJvcGVydHlFZGl0b3IgZnJvbSBCaW5kVGFnIChjYW4gb25seSBiZSB1c2VkIGluc2lkZSBCaW5kVGFnKS4NCi0JCQlUaGUgSFRNTCBlc2NhcGluZyBmbGFnIHBhcnRpY2lwYXRlcyBpbiBhIHBhZ2Utd2lkZSBvciBhcHBsaWNhdGlvbi13aWRlIHNldHRpbmcNCi0JCQkoaS5lLiBieSBIdG1sRXNjYXBlVGFnIG9yIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwpLg0KLQkJPC9kZXNjcmlwdGlvbj4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+dmFsdWU8L25hbWU+DQotCQkJPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQkJPGF0dHJpYnV0ZT4NCi0JCQk8bmFtZT52YXI8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+c2NvcGU8L25hbWU+DQotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotCQk8L2F0dHJpYnV0ZT4NCi0NCi0JCTxhdHRyaWJ1dGU+DQotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4NCi0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0JCTwvYXR0cmlidXRlPg0KLQ0KLQk8L3RhZz4NCi0NCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC9ncmFpbHMudGxkIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvZ3JhaWxzLnRsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkNDhjMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC9ncmFpbHMudGxkCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIgotICAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgIDxkZXNjcmlwdGlvbj5UaGUgR3JhaWxzIChHcm9vdnkgb24gUmFpbHMpIGN1c3RvbSB0YWcgbGlicmFyeTwvZGVzY3JpcHRpb24+Ci0KLQk8dGxpYi12ZXJzaW9uPjEuMDwvdGxpYi12ZXJzaW9uPgotCTxzaG9ydC1uYW1lPmdyYWlsczwvc2hvcnQtbmFtZT4KLSAgICA8dXJpPmh0dHA6Ly9ncmFpbHMuY29kZWhhdXMub3JnL3RhZ3M8L3VyaT4KLQotICAgIDx0YWc+Ci0JCTxuYW1lPmxpbms8L25hbWU+Ci0gICAgICAgIDx0YWctY2xhc3M+b3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5qc3AuSnNwTGlua1RhZzwvdGFnLWNsYXNzPgotICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgICAgICA8YXR0cmlidXRlPgotCQkJPG5hbWU+YWN0aW9uPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5jb250cm9sbGVyPC9uYW1lPgotCQkJPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmlkPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+CQkJCQotCQk8ZHluYW1pYy1hdHRyaWJ1dGVzPnRydWU8L2R5bmFtaWMtYXR0cmlidXRlcz4KLQk8L3RhZz4KLSAgICA8dGFnPgotICAgICAgICA8bmFtZT5yZW5kZXJJbnB1dDwvbmFtZT4KLSAgICAgICAgPHRhZy1jbGFzcz5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmpzcC5Kc3BSZW5kZXJJbnB1dFRhZzwvdGFnLWNsYXNzPgotICAgICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+Ci0gICAgICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8bmFtZT5iZWFuPC9uYW1lPgotICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8bmFtZT5wcm9wZXJ0eTwvbmFtZT4KLSAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLSAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC90YWc+Ci0gICAgPHRhZz4KLSAgICAgICAgPG5hbWU+aW52b2tlVGFnPC9uYW1lPgotICAgICAgICA8dGFnLWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuanNwLkpzcEludm9rZUdyYWlsc1RhZ0xpYlRhZzwvdGFnLWNsYXNzPgotICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotICAgICAgICA8dmFyaWFibGU+Ci0gICAgICAgICAgICA8bmFtZS1naXZlbj5pdDwvbmFtZS1naXZlbj4KLSAgICAgICAgICAgIDx2YXJpYWJsZS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC92YXJpYWJsZS1jbGFzcz4KLSAgICAgICAgICAgIDxkZWNsYXJlPnRydWU8L2RlY2xhcmU+Ci0gICAgICAgICAgICA8c2NvcGU+TkVTVEVEPC9zY29wZT4KLSAgICAgICAgPC92YXJpYWJsZT4KLSAgICAgICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+Ci0gICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0gICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICA8ZHluYW1pYy1hdHRyaWJ1dGVzPnRydWU8L2R5bmFtaWMtYXR0cmlidXRlcz4KLSAgICA8L3RhZz4KLTwvdGFnbGliPgotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC9zcHJpbmcudGxkIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi90bGQvc3ByaW5nLnRsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjNzA5MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3RsZC9zcHJpbmcudGxkCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgdGFnbGliIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci0KLTx0YWdsaWI+Ci0KLQk8dGxpYi12ZXJzaW9uPjEuMS4xPC90bGliLXZlcnNpb24+Ci0KLQk8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4KLQotCTxzaG9ydC1uYW1lPlNwcmluZzwvc2hvcnQtbmFtZT4KLQotCTx1cmk+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3RhZ3M8L3VyaT4KLQotCTxkZXNjcmlwdGlvbj5TcHJpbmcgRnJhbWV3b3JrIEpTUCBUYWcgTGlicmFyeS4gQXV0aG9yczogUm9kIEpvaG5zb24sIEp1ZXJnZW4gSG9lbGxlcjwvZGVzY3JpcHRpb24+Ci0KLQotCTx0YWc+Ci0KLQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuSHRtbEVzY2FwZVRhZzwvdGFnLWNsYXNzPgotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotCi0JCTxkZXNjcmlwdGlvbj4KLQkJCVNldHMgZGVmYXVsdCBIVE1MIGVzY2FwZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcGFnZS4KLQkJCU92ZXJyaWRlcyBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sLCBpZiBhbnkuCi0JCTwvZGVzY3JpcHRpb24+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmRlZmF1bHRIdG1sRXNjYXBlPC9uYW1lPgotCQkJPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCTwvdGFnPgotCi0KLQk8dGFnPgotCi0JCTxuYW1lPmVzY2FwZUJvZHk8L25hbWU+Ci0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLkVzY2FwZUJvZHlUYWc8L3RhZy1jbGFzcz4KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLQotCQk8ZGVzY3JpcHRpb24+Ci0JCQlFc2NhcGVzIGl0cyBlbmNsb3NlZCBib2R5IGNvbnRlbnQsIGFwcGx5aW5nIEhUTUwgZXNjYXBpbmcgYW5kL29yIEphdmFTY3JpcHQgZXNjYXBpbmcuCi0JCQlUaGUgSFRNTCBlc2NhcGluZyBmbGFnIHBhcnRpY2lwYXRlcyBpbiBhIHBhZ2Utd2lkZSBvciBhcHBsaWNhdGlvbi13aWRlIHNldHRpbmcKLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuCi0JCTwvZGVzY3JpcHRpb24+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+amF2YVNjcmlwdEVzY2FwZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JPC90YWc+Ci0KLQotCTx0YWc+Ci0KLQkJPG5hbWU+bWVzc2FnZTwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuTWVzc2FnZVRhZzwvdGFnLWNsYXNzPgotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotCi0JCTxkZXNjcmlwdGlvbj4KLQkJCVJldHJpZXZlcyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBjb2RlLCBvciB0ZXh0IGlmIGNvZGUgaXNuJ3QgcmVzb2x2YWJsZS4KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZwotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4KLQkJPC9kZXNjcmlwdGlvbj4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+Y29kZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5hcmd1bWVudHM8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+dGV4dDwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT52YXI8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+c2NvcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5qYXZhU2NyaXB0RXNjYXBlPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQk8L3RhZz4KLQotCi0JPHRhZz4KLQotCQk8bmFtZT50aGVtZTwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuVGhlbWVUYWc8L3RhZy1jbGFzcz4KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLQotCQk8ZGVzY3JpcHRpb24+Ci0JCQlSZXRyaWV2ZXMgdGhlIHRoZW1lIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29kZSwgb3IgdGV4dCBpZiBjb2RlIGlzbid0IHJlc29sdmFibGUuCi0JCQlUaGUgSFRNTCBlc2NhcGluZyBmbGFnIHBhcnRpY2lwYXRlcyBpbiBhIHBhZ2Utd2lkZSBvciBhcHBsaWNhdGlvbi13aWRlIHNldHRpbmcKLQkJCShpLmUuIGJ5IEh0bWxFc2NhcGVUYWcgb3IgYSAiZGVmYXVsdEh0bWxFc2NhcGUiIGNvbnRleHQtcGFyYW0gaW4gd2ViLnhtbCkuCi0JCTwvZGVzY3JpcHRpb24+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmNvZGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+YXJndW1lbnRzPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnRleHQ8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+dmFyPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnNjb3BlPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+amF2YVNjcmlwdEVzY2FwZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JPC90YWc+Ci0KLQotCTx0YWc+Ci0KLQkJPG5hbWU+aGFzQmluZEVycm9yczwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuQmluZEVycm9yc1RhZzwvdGFnLWNsYXNzPgotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotCi0JCTxkZXNjcmlwdGlvbj4KLQkJCVByb3ZpZGVzIEVycm9ycyBpbnN0YW5jZSBpbiBjYXNlIG9mIGJpbmQgZXJyb3JzLgotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nCi0JCQkoaS5lLiBieSBIdG1sRXNjYXBlVGFnIG9yIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwpLgotCQk8L2Rlc2NyaXB0aW9uPgotCi0JCTx2YXJpYWJsZT4KLQkJCTxuYW1lLWdpdmVuPmVycm9yczwvbmFtZS1naXZlbj4KLQkJCTx2YXJpYWJsZS1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzPC92YXJpYWJsZS1jbGFzcz4KLQkJPC92YXJpYWJsZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+bmFtZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCTwvdGFnPgotCi0KLQk8dGFnPgotCi0JCTxuYW1lPm5lc3RlZFBhdGg8L25hbWU+Ci0JCTx0YWctY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLk5lc3RlZFBhdGhUYWc8L3RhZy1jbGFzcz4KLQkJPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KLQotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTZXRzIGEgbmVzdGVkIHBhdGggdG8gYmUgdXNlZCBieSB0aGUgYmluZCB0YWcncyBwYXRoLgotCQk8L2Rlc2NyaXB0aW9uPgotCi0JCTx2YXJpYWJsZT4KLQkJCTxuYW1lLWdpdmVuPm5lc3RlZFBhdGg8L25hbWUtZ2l2ZW4+Ci0JCQk8dmFyaWFibGUtY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvdmFyaWFibGUtY2xhc3M+Ci0JCTwvdmFyaWFibGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnBhdGg8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JPC90YWc+Ci0KLQotCTx0YWc+Ci0KLQkJPG5hbWU+YmluZDwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuQmluZFRhZzwvdGFnLWNsYXNzPgotCQk8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgotCi0JCTxkZXNjcmlwdGlvbj4KLQkJCVByb3ZpZGVzIEJpbmRTdGF0dXMgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYmluZCBwYXRoLgotCQkJVGhlIEhUTUwgZXNjYXBpbmcgZmxhZyBwYXJ0aWNpcGF0ZXMgaW4gYSBwYWdlLXdpZGUgb3IgYXBwbGljYXRpb24td2lkZSBzZXR0aW5nCi0JCQkoaS5lLiBieSBIdG1sRXNjYXBlVGFnIG9yIGEgImRlZmF1bHRIdG1sRXNjYXBlIiBjb250ZXh0LXBhcmFtIGluIHdlYi54bWwpLgotCQk8L2Rlc2NyaXB0aW9uPgotCi0JCTx2YXJpYWJsZT4KLQkJCTxuYW1lLWdpdmVuPnN0YXR1czwvbmFtZS1naXZlbj4KLQkJCTx2YXJpYWJsZS1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuQmluZFN0YXR1czwvdmFyaWFibGUtY2xhc3M+Ci0JCTwvdmFyaWFibGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPnBhdGg8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT5pZ25vcmVOZXN0ZWRQYXRoPC9uYW1lPgotCQkJPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLQkJCTxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KLQkJPC9hdHRyaWJ1dGU+Ci0KLQkJPGF0dHJpYnV0ZT4KLQkJCTxuYW1lPmh0bWxFc2NhcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCTwvdGFnPgotCi0KLQk8dGFnPgotCi0JCTxuYW1lPnRyYW5zZm9ybTwvbmFtZT4KLQkJPHRhZy1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnRhZ3MuVHJhbnNmb3JtVGFnPC90YWctY2xhc3M+Ci0JCTxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0KLQkJPGRlc2NyaXB0aW9uPgotCQkJUHJvdmlkZXMgdHJhbnNmb3JtYXRpb24gb2YgdmFyaWFibGVzIHRvIFN0cmluZ3MsIHVzaW5nIGFuIGFwcHJvcHJpYXRlCi0JCQljdXN0b20gUHJvcGVydHlFZGl0b3IgZnJvbSBCaW5kVGFnIChjYW4gb25seSBiZSB1c2VkIGluc2lkZSBCaW5kVGFnKS4KLQkJCVRoZSBIVE1MIGVzY2FwaW5nIGZsYWcgcGFydGljaXBhdGVzIGluIGEgcGFnZS13aWRlIG9yIGFwcGxpY2F0aW9uLXdpZGUgc2V0dGluZwotCQkJKGkuZS4gYnkgSHRtbEVzY2FwZVRhZyBvciBhICJkZWZhdWx0SHRtbEVzY2FwZSIgY29udGV4dC1wYXJhbSBpbiB3ZWIueG1sKS4KLQkJPC9kZXNjcmlwdGlvbj4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+dmFsdWU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JCTxhdHRyaWJ1dGU+Ci0JCQk8bmFtZT52YXI8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+c2NvcGU8L25hbWU+Ci0JCQk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotCQkJPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgotCQk8L2F0dHJpYnV0ZT4KLQotCQk8YXR0cmlidXRlPgotCQkJPG5hbWU+aHRtbEVzY2FwZTwvbmFtZT4KLQkJCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0JCQk8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+Ci0JCTwvYXR0cmlidXRlPgotCi0JPC90YWc+Ci0KLTwvdGFnbGliPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi93ZWIyLjMudGVtcGxhdGUueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi93ZWIyLjMudGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE5ZGJjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL1dFQi1JTkYvd2ViMi4zLnRlbXBsYXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLTx3ZWItYXBwPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPmxvZzRqQ29uZmlnTG9jYXRpb248L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4vV0VCLUlORi9sb2c0ai5wcm9wZXJ0aWVzPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8ZmlsdGVyPgotCSAgIAk8ZmlsdGVyLW5hbWU+c2l0ZW1lc2g8L2ZpbHRlci1uYW1lPgotCSAgICA8ZmlsdGVyLWNsYXNzPmNvbS5vcGVuc3ltcGhvbnkubW9kdWxlLnNpdGVtZXNoLmZpbHRlci5QYWdlRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0JPC9maWx0ZXI+Ci0JCi0gIAk8ZmlsdGVyPgotCSAgICA8ZmlsdGVyLW5hbWU+aGliZXJuYXRlRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAJPGZpbHRlci1jbGFzcz5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLnN1cHBvcnQuR3JhaWxzT3BlblNlc3Npb25JblZpZXdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgIAk8L2ZpbHRlcj4KLQotICAgIDwlIGlmKGRldikgeyAlPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5yZWxvYWRGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LmZpbHRlci5HcmFpbHNSZWxvYWRTZXJ2bGV0RmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5yZWxvYWRGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPCUgfSAlPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgIAk8ZmlsdGVyLW5hbWU+c2l0ZW1lc2g8L2ZpbHRlci1uYW1lPgotCSAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgotCTwvZmlsdGVyLW1hcHBpbmc+Ci0JCi0JPGZpbHRlci1tYXBwaW5nPgotCSAgICA8ZmlsdGVyLW5hbWU+aGliZXJuYXRlRmlsdGVyPC9maWx0ZXItbmFtZT4KLQkgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+Ci0JPC9maWx0ZXItbWFwcGluZz4KLQotCi0gICAgPHNlcnZsZXQ+Ci0JCTxzZXJ2bGV0LW5hbWU+bG9nNGo8L3NlcnZsZXQtbmFtZT4KLQkJPHNlcnZsZXQtY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIudXRpbC5Mb2c0akNvbmZpZ1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotCTwhLS0gQ29udGV4dCBsb2FkZXIgc2VydmxldCBmb3IgdGhvc2Ugb2xkZXIgc2VydmxldCBlbmdpbmVzLiAtLT4KLQk8c2VydmxldD4KLQkJPHNlcnZsZXQtbmFtZT5jb250ZXh0PC9zZXJ2bGV0LW5hbWU+Ci0JCTxzZXJ2bGV0LWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlclNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotCTwhLS0gR3JhaWxzIGRpc3BhdGNoZXIgc2VydmxldCAtLT4KLQk8c2VydmxldD4KLQkJPHNlcnZsZXQtbmFtZT5ncmFpbHM8L3NlcnZsZXQtbmFtZT4KLQkJPHNlcnZsZXQtY2xhc3M+b3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzRGlzcGF0Y2hlclNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotICAgIDwhLS0gVGhlIEdyb292eSBTZXJ2ZXIgUGFnZXMgc2VydmxldCAtLT4KLSAgICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPmdzcDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXMuR3Jvb3Z5UGFnZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8JSBpZihkZXYpIHsgJT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5zaG93U291cmNlPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICBBbGxvd3MgZGV2ZWxvcGVycyB0byB2aWV3IHRoZSBpbnRlcm1lZGlhZGUgc291cmNlIGNvZGUsIHdoZW4gdGhleSBwYXNzCi0gICAgICAgICAgICAgICAgYSBzcGlsbEdyb292eSBhcmd1bWVudCBpbiB0aGUgVVJMLgotICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDwlIH0gJT4KLSAgICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5nc3A8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouZ3NwPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8IS0tIE1hcCBhbGwgcmVxdWVzdHMgdG8gdGhlIEdyYWlscyBkaXNwYXRjaGVyIHNlcnZsZXQgLS0+Ci0JPCUgZm9yICggYyBpbiBjb250cm9sbGVycyApIHsgJT4JCi0JCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCQk8c2VydmxldC1uYW1lPmdyYWlsczwvc2VydmxldC1uYW1lPgotCQkJPHVybC1wYXR0ZXJuPi8ke2N9Lyo8L3VybC1wYXR0ZXJuPgotCQk8L3NlcnZsZXQtbWFwcGluZz4KLQk8JSB9ICU+CQkKLQkKLQk8JSBmb3IgKCBmIGluIGZsb3dzICkgeyAlPgotCQk8c2VydmxldC1tYXBwaW5nPgotCQkJPHNlcnZsZXQtbmFtZT5ncmFpbHM8L3NlcnZsZXQtbmFtZT4KLQkJCTx1cmwtcGF0dGVybj4vJHtmfS8qPC91cmwtcGF0dGVybj4KLQkJPC9zZXJ2bGV0LW1hcHBpbmc+Ci0JPCUgfSAlPgkJCi0KLQkKLQk8dGFnbGliPgotCQk8dGFnbGliLXVyaT5odHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZTwvdGFnbGliLXVyaT4KLQkJPHRhZ2xpYi1sb2NhdGlvbj4vV0VCLUlORi90bGQvYy50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KLQk8L3RhZ2xpYj4KLQkKLQk8dGFnbGliPgotCQk8dGFnbGliLXVyaT5odHRwOi8vamF2YS5zdW4uY29tL2pzdGwvZm10PC90YWdsaWItdXJpPgotCQk8dGFnbGliLWxvY2F0aW9uPi9XRUItSU5GL3RsZC9mbXQudGxkPC90YWdsaWItbG9jYXRpb24+Ci0JPC90YWdsaWI+Ci0JCi0JPHRhZ2xpYj4KLQkJPHRhZ2xpYi11cmk+aHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3RhZ3M8L3RhZ2xpYi11cmk+Ci0JCTx0YWdsaWItbG9jYXRpb24+L1dFQi1JTkYvdGxkL3NwcmluZy50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KLQk8L3RhZ2xpYj4KLQkKLQk8dGFnbGliPgotCQk8dGFnbGliLXVyaT5odHRwOi8vZ3JhaWxzLmNvZGVoYXVzLm9yZy90YWdzPC90YWdsaWItdXJpPgotCQk8dGFnbGliLWxvY2F0aW9uPi9XRUItSU5GL3RsZC9ncmFpbHMudGxkPC90YWdsaWItbG9jYXRpb24+Ci0JPC90YWdsaWI+CQkKLTwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3dlYjIuNC50ZW1wbGF0ZS54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9XRUItSU5GL3dlYjIuNC50ZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2E1MDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvV0VCLUlORi93ZWIyLjQudGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTx3ZWItYXBwIHZlcnNpb249IjIuNCIKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+bG9nNGpDb25maWdMb2NhdGlvbjwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPi9XRUItSU5GL2xvZzRqLnByb3BlcnRpZXM8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxmaWx0ZXI+Ci0JICAgCTxmaWx0ZXItbmFtZT5zaXRlbWVzaDwvZmlsdGVyLW5hbWU+Ci0JICAgIDxmaWx0ZXItY2xhc3M+Y29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2guZmlsdGVyLlBhZ2VGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLQk8L2ZpbHRlcj4KLQkKLSAgCTxmaWx0ZXI+Ci0JICAgIDxmaWx0ZXItbmFtZT5oaWJlcm5hdGVGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgIAk8ZmlsdGVyLWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuc3VwcG9ydC5HcmFpbHNPcGVuU2Vzc2lvbkluVmlld0ZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgCTwvZmlsdGVyPgkKLQotICAgIDwlIGlmKGRldikgeyAlPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5yZWxvYWRGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LmZpbHRlci5HcmFpbHNSZWxvYWRTZXJ2bGV0RmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5yZWxvYWRGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPCUgfSAlPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgIAk8ZmlsdGVyLW5hbWU+c2l0ZW1lc2g8L2ZpbHRlci1uYW1lPgotCSAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgotCTwvZmlsdGVyLW1hcHBpbmc+Ci0JCi0JPGZpbHRlci1tYXBwaW5nPgotCSAgICA8ZmlsdGVyLW5hbWU+aGliZXJuYXRlRmlsdGVyPC9maWx0ZXItbmFtZT4KLQkgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+Ci0JPC9maWx0ZXItbWFwcGluZz4JCi0KLSAgICA8c2VydmxldD4KLQkJPHNlcnZsZXQtbmFtZT5sb2c0ajwvc2VydmxldC1uYW1lPgotCQk8c2VydmxldC1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi51dGlsLkxvZzRqQ29uZmlnU2VydmxldDwvc2VydmxldC1jbGFzcz4KLQkJPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0JPC9zZXJ2bGV0PgotCi0KLSAgICA8IS0tIENvbnRleHQgbG9hZGVyIHNlcnZsZXQgZm9yIHRob3NlIG9sZGVyIHNlcnZsZXQgZW5naW5lcy4gLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Y29udGV4dDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjI8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEdyYWlscyBkaXNwYXRjaGVyIHNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Z3JhaWxzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0Rpc3BhdGNoZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjM8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIFRoZSBHcm9vdnkgU2VydmVyIFBhZ2VzIHNlcnZsZXQgLS0+Ci0gICAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5nc3A8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzLkdyb292eVBhZ2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPCUgaWYoZGV2KSB7ICU+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+c2hvd1NvdXJjZTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgQWxsb3dzIGRldmVsb3BlcnMgdG8gdmlldyB0aGUgaW50ZXJtZWRpYWRlIHNvdXJjZSBjb2RlLCB3aGVuIHRoZXkgcGFzcwotICAgICAgICAgICAgICAgIGEgc3BpbGxHcm9vdnkgYXJndW1lbnQgaW4gdGhlIFVSTC4KLSAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8JSB9ICU+Ci0gICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Z3NwPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmdzcDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+ICAgIAotICAgIDwhLS0gTWFwIGFsbCByZXF1ZXN0cyB0byB0aGUgR3JhaWxzIGRpc3BhdGNoZXIgc2VydmxldCAtLT4KLQk8JSBmb3IgKCBjIGluIGNvbnRyb2xsZXJzICkgeyAlPgkKLQkJPHNlcnZsZXQtbWFwcGluZz4KLQkJCTxzZXJ2bGV0LW5hbWU+Z3JhaWxzPC9zZXJ2bGV0LW5hbWU+Ci0JCQk8dXJsLXBhdHRlcm4+LyR7Y30vKjwvdXJsLXBhdHRlcm4+Ci0JCTwvc2VydmxldC1tYXBwaW5nPgotCTwlIH0gJT4JCQotCQotCTwlIGZvciAoIGYgaW4gZmxvd3MgKSB7ICU+Ci0JCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCQk8c2VydmxldC1uYW1lPmdyYWlsczwvc2VydmxldC1uYW1lPgotCQkJPHVybC1wYXR0ZXJuPi8ke2Z9Lyo8L3VybC1wYXR0ZXJuPgotCQk8L3NlcnZsZXQtbWFwcGluZz4KLQk8JSB9ICU+CQkKLQotICAgIDxqc3AtY29uZmlnPgotICAgICAgICA8dGFnbGliPgotICAgICAgICAgICAgPHRhZ2xpYi11cmk+aHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlPC90YWdsaWItdXJpPgotICAgICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj4vV0VCLUlORi90bGQvYy50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICAgICAgPC90YWdsaWI+Ci0gICAgICAgIDx0YWdsaWI+Ci0gICAgICAgICAgICA8dGFnbGliLXVyaT5odHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2ZtdDwvdGFnbGliLXVyaT4KLSAgICAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+L1dFQi1JTkYvdGxkL2ZtdC50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICAgICAgPC90YWdsaWI+Ci0JCTx0YWdsaWI+Ci0JCQk8dGFnbGliLXVyaT5odHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvdGFnczwvdGFnbGliLXVyaT4KLQkJCTx0YWdsaWItbG9jYXRpb24+L1dFQi1JTkYvdGxkL3NwcmluZy50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KLQkJPC90YWdsaWI+Ci0JCTx0YWdsaWI+Ci0JCQk8dGFnbGliLXVyaT5odHRwOi8vZ3JhaWxzLmNvZGVoYXVzLm9yZy90YWdzPC90YWdsaWItdXJpPgotCQkJPHRhZ2xpYi1sb2NhdGlvbj4vV0VCLUlORi90bGQvZ3JhaWxzLnRsZDwvdGFnbGliLWxvY2F0aW9uPgotCQk8L3RhZ2xpYj4JCQkJCQkKLSAgICA8L2pzcC1jb25maWc+Ci0KLTwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9jc3MvbWFpbi5jc3MgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9jc3MvbWFpbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1M2JjODUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvY3NzL21haW4uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLWE6YWN0aXZlLGE6bGluayxhOnZpc2l0ZWQsYTpob3ZlciB7Ci0gICAgY29sb3I6IzBENTc5ODsgICAgCi19Ci0ubWVudUJ1dHRvbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjojODBCMERBOwotCWJvcmRlcjogMXB4IHNvbGlkIHdoaXRlOwotCWJvcmRlci1zdHlsZTogbm9uZSBzb2xpZCBub25lIG5vbmUgOwotCW1hcmdpbi1sZWZ0OjBweDsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotfQotCi0ubWVudUJ1dHRvbiBhOmFjdGl2ZSwubWVudUJ1dHRvbiBhOmxpbmssLm1lbnVCdXR0b24gYTp2aXNpdGVkLC5tZW51QnV0dG9uIGE6aG92ZXIgewotCWZvbnQtZmFtaWx5OkFyaWFsLHNhbnMtc2VyaWY7Ci0JY29sb3I6IHdoaXRlOwkKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsKLQlwYWRkaW5nOjIwcHg7Ci19Ci0uYWN0aW9uQnV0dG9uIGE6YWN0aXZlLC5hY3Rpb25CdXR0b24gYTpsaW5rLC5hY3Rpb25CdXR0b24gYTp2aXNpdGVkLC5hY3Rpb25CdXR0b24gYTpob3ZlciB7Ci0JZm9udC1mYW1pbHk6QXJpYWwsc2Fucy1zZXJpZjsKLQlmb250LXNpemU6MC44ZW07Ci0JZm9udC13ZWlnaHQ6Ym9sZDsKLQljb2xvcjogIzU3OEJCODsJCi19Ci0KLQotaDEgewotCWZvbnQtZmFtaWx5OkFyaWFsLHNhbnMtc2VyaWY7Ci0JY29sb3I6IzU3OEJCODsKLQlmb250LXNpemU6MS42ZW07Ci19Ci0KLWJvZHkgewotCW1hcmdpbjowcHg7Ci0JZm9udC1mYW1pbHk6QXJpYWwsc2Fucy1zZXJpZjsKLQljb2xvcjogIzYxNjE2MTsKLX0KLXRleHRhcmVhIHsKLQl3aWR0aDogMzAwcHg7Ci0JaGVpZ2h0OiAxMDBweDsKLX0KLXRhYmxlIHsKLQl3aWR0aDogMTAwJTsKLX0KLS5ib2R5IHsKLQlwYWRkaW5nOiAyNXB4OwotfQotLm5hdiB7Ci0Jd2lkdGg6MTAwJTsKLQltYXJnaW4tdG9wOiAzMHB4OwotCWJhY2tncm91bmQtY29sb3I6I0Q2RDZENjsKLQloZWlnaHQ6IDMwcHg7Ci0JYm9yZGVyOiAycHggc29saWQgIzU3OEJCODsKLQlib3JkZXItc3R5bGU6IHNvbGlkIG5vbmUgbm9uZSBub25lIDsJCi19Ci0KLXRoIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiM1NzhCQjg7Ci0JY29sb3I6d2hpdGU7Ci0Jd2lkdGg6MzBweDsKLQlmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmOwotCXBhZGRpbmc6NXB4OwotCQotfQotdGQgewotCWJhY2tncm91bmQtY29sb3I6I0YwRjBGMDsKLQl0ZXh0LWFsaWduOmNlbnRlcjsKLX0KLS5kaWFsb2cgCi17Ci0JcGFkZGluZzogMTVweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiNGMEYwRjA7Ci0JCi19Ci0uZGlhbG9nIGxhYmVsewotCXdpZHRoOiAxMjBweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmRpYWxvZyAudGV4dGZpZWxkLCB0ZXh0YXJlYXsKLQl3aWR0aDogMTgwcHg7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi10ZXh0YXJlYXsKLQl3aWR0aDogMjUwcHg7Ci0JaGVpZ2h0OiAxNTBweDsKLX0KLS5wcm9wIHsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0uYnV0dG9ucyB7Ci0JbWFyZ2luLXRvcDogMTVweDsKLX0KLS5hY3Rpb25CdXR0b25zIHsKLQl3aWR0aDoxMDBweDsKLX0KLWRpdiAuZXJyb3JzIHsKLQlib3JkZXI6IDJweCBzb2xpZCByZWQ7Ci0JcGFkZGluZzogNXB4OwotCW1hcmdpbi10b3A6MTBweDsKLQltYXJnaW4tYm90dG9tOjEwcHg7Ci19Ci10ZCAuZXJyb3JzIHsKLSAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsKLX0KLS5tZXNzYWdlIHsKLQlib3JkZXI6IDFweCBzb2xpZCAjRkZDQzAwOwotCXBhZGRpbmc6IDVweDsKLQltYXJnaW4tdG9wOjEwcHg7Ci0JbWFyZ2luLWJvdHRvbToxMHB4OwotfQotLnByb3AgLm5hbWUgewotCWZvbnQtd2VpZ2h0OmJvbGQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvYnVpbGRlci5qcyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL2J1aWxkZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTViYTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvYnVpbGRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8KLS8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZvciBmdWxsIGxpY2Vuc2UuCi0KLXZhciBCdWlsZGVyID0gewotICBOT0RFTUFQOiB7Ci0gICAgQVJFQTogJ21hcCcsCi0gICAgQ0FQVElPTjogJ3RhYmxlJywKLSAgICBDT0w6ICd0YWJsZScsCi0gICAgQ09MR1JPVVA6ICd0YWJsZScsCi0gICAgTEVHRU5EOiAnZmllbGRzZXQnLAotICAgIE9QVEdST1VQOiAnc2VsZWN0JywKLSAgICBPUFRJT046ICdzZWxlY3QnLAotICAgIFBBUkFNOiAnb2JqZWN0JywKLSAgICBUQk9EWTogJ3RhYmxlJywKLSAgICBURDogJ3RhYmxlJywKLSAgICBURk9PVDogJ3RhYmxlJywKLSAgICBUSDogJ3RhYmxlJywKLSAgICBUSEVBRDogJ3RhYmxlJywKLSAgICBUUjogJ3RhYmxlJwotICB9LAotICAvLyBub3RlOiBGb3IgRmlyZWZveCA8IDEuNSwgT1BUSU9OIGFuZCBPUFRHUk9VUCB0YWdzIGFyZSBjdXJyZW50bHkgYnJva2VuLAotICAvLyAgICAgICBkdWUgdG8gYSBGaXJlZm94IGJ1ZwotICBub2RlOiBmdW5jdGlvbihlbGVtZW50TmFtZSkgewotICAgIGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAKLSAgICAvLyB0cnkgaW5uZXJIVE1MIGFwcHJvYWNoCi0gICAgdmFyIHBhcmVudFRhZyA9IHRoaXMuTk9ERU1BUFtlbGVtZW50TmFtZV0gfHwgJ2Rpdic7Ci0gICAgdmFyIHBhcmVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudFRhZyk7Ci0gICAgdHJ5IHsgLy8gcHJldmVudCBJRSAiZmVhdHVyZSI6IGh0dHA6Ly9kZXYucnVieW9ucmFpbHMub3JnL3RpY2tldC8yNzA3Ci0gICAgICBwYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICI8IiArIGVsZW1lbnROYW1lICsgIj48LyIgKyBlbGVtZW50TmFtZSArICI+IjsKLSAgICB9IGNhdGNoKGUpIHt9Ci0gICAgdmFyIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmZpcnN0Q2hpbGQgfHwgbnVsbDsKLSAgICAgIAotICAgIC8vIHNlZSBpZiBicm93c2VyIGFkZGVkIHdyYXBwaW5nIHRhZ3MKLSAgICBpZihlbGVtZW50ICYmIChlbGVtZW50LnRhZ05hbWUgIT0gZWxlbWVudE5hbWUpKQotICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWxlbWVudE5hbWUpWzBdOwotICAgIAotICAgIC8vIGZhbGxiYWNrIHRvIGNyZWF0ZUVsZW1lbnQgYXBwcm9hY2gKLSAgICBpZighZWxlbWVudCkgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpOwotICAgIAotICAgIC8vIGFib3J0IGlmIG5vdGhpbmcgY291bGQgYmUgY3JlYXRlZAotICAgIGlmKCFlbGVtZW50KSByZXR1cm47Ci0KLSAgICAvLyBhdHRyaWJ1dGVzIChvciB0ZXh0KQotICAgIGlmKGFyZ3VtZW50c1sxXSkKLSAgICAgIGlmKHRoaXMuX2lzU3RyaW5nT3JOdW1iZXIoYXJndW1lbnRzWzFdKSB8fAotICAgICAgICAoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgQXJyYXkpKSB7Ci0gICAgICAgICAgdGhpcy5fY2hpbGRyZW4oZWxlbWVudCwgYXJndW1lbnRzWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLl9hdHRyaWJ1dGVzKGFyZ3VtZW50c1sxXSk7Ci0gICAgICAgICAgaWYoYXR0cnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0cnkgeyAvLyBwcmV2ZW50IElFICJmZWF0dXJlIjogaHR0cDovL2Rldi5ydWJ5b25yYWlscy5vcmcvdGlja2V0LzI3MDcKLSAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAiPCIgK2VsZW1lbnROYW1lICsgIiAiICsKLSAgICAgICAgICAgICAgICBhdHRycyArICI+PC8iICsgZWxlbWVudE5hbWUgKyAiPiI7Ci0gICAgICAgICAgICB9IGNhdGNoKGUpIHt9Ci0gICAgICAgICAgICBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5maXJzdENoaWxkIHx8IG51bGw7Ci0gICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZpcmVmb3ggMS4wLlggYnVnCi0gICAgICAgICAgICBpZighZWxlbWVudCkgewotICAgICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgIGZvcihhdHRyIGluIGFyZ3VtZW50c1sxXSkgCi0gICAgICAgICAgICAgICAgZWxlbWVudFthdHRyID09ICdjbGFzcycgPyAnY2xhc3NOYW1lJyA6IGF0dHJdID0gYXJndW1lbnRzWzFdW2F0dHJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZWxlbWVudC50YWdOYW1lICE9IGVsZW1lbnROYW1lKQotICAgICAgICAgICAgICBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtZW50TmFtZSlbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0KLSAgICAvLyB0ZXh0LCBvciBhcnJheSBvZiBjaGlsZHJlbgotICAgIGlmKGFyZ3VtZW50c1syXSkKLSAgICAgIHRoaXMuX2NoaWxkcmVuKGVsZW1lbnQsIGFyZ3VtZW50c1syXSk7Ci0KLSAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0sCi0gIF90ZXh0OiBmdW5jdGlvbih0ZXh0KSB7Ci0gICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKLSAgfSwKLSAgX2F0dHJpYnV0ZXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHsKLSAgICB2YXIgYXR0cnMgPSBbXTsKLSAgICBmb3IoYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpCi0gICAgICBhdHRycy5wdXNoKChhdHRyaWJ1dGU9PSdjbGFzc05hbWUnID8gJ2NsYXNzJyA6IGF0dHJpYnV0ZSkgKwotICAgICAgICAgICc9IicgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0udG9TdHJpbmcoKS5lc2NhcGVIVE1MKCkgKyAnIicpOwotICAgIHJldHVybiBhdHRycy5qb2luKCIgIik7Ci0gIH0sCi0gIF9jaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCwgY2hpbGRyZW4pIHsKLSAgICBpZih0eXBlb2YgY2hpbGRyZW49PSdvYmplY3QnKSB7IC8vIGFycmF5IGNhbiBob2xkIG5vZGVzIGFuZCB0ZXh0Ci0gICAgICBjaGlsZHJlbi5mbGF0dGVuKCkuZWFjaCggZnVuY3Rpb24oZSkgewotICAgICAgICBpZih0eXBlb2YgZT09J29iamVjdCcpCi0gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChlKQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYoQnVpbGRlci5faXNTdHJpbmdPck51bWJlcihlKSkKLSAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChlKSk7Ci0gICAgICB9KTsKLSAgICB9IGVsc2UKLSAgICAgIGlmKEJ1aWxkZXIuX2lzU3RyaW5nT3JOdW1iZXIoY2hpbGRyZW4pKSAKLSAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChjaGlsZHJlbikpOwotICB9LAotICBfaXNTdHJpbmdPck51bWJlcjogZnVuY3Rpb24ocGFyYW0pIHsKLSAgICByZXR1cm4odHlwZW9mIHBhcmFtPT0nc3RyaW5nJyB8fCB0eXBlb2YgcGFyYW09PSdudW1iZXInKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL2NvbnRyb2xzLmpzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvY29udHJvbHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDJiNjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvY29udHJvbHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLS8vICAgICAgICAgICAoYykgMjAwNSBJdmFuIEtyc3RpYyAoaHR0cDovL2Jsb2dzLmxhdy5oYXJ2YXJkLmVkdS9pdmFuKQotLy8gICAgICAgICAgIChjKSAyMDA1IEpvbiBUaXJzZW4gKGh0dHA6Ly93d3cudGlyc2VuLmNvbSkKLS8vIENvbnRyaWJ1dG9yczoKLS8vICBSaWNoYXJkIExpdnNleQotLy8gIFJhaHVsIEJoYXJnYXZhCi0vLyAgUm9iIFdpbGxzCi0vLyAKLS8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZvciBmdWxsIGxpY2Vuc2UuCi0KLS8vIEF1dG9jb21wbGV0ZXIuQmFzZSBoYW5kbGVzIGFsbCB0aGUgYXV0b2NvbXBsZXRpb24gZnVuY3Rpb25hbGl0eSAKLS8vIHRoYXQncyBpbmRlcGVuZGVudCBvZiB0aGUgZGF0YSBzb3VyY2UgZm9yIGF1dG9jb21wbGV0aW9uLiBUaGlzCi0vLyBpbmNsdWRlcyBkcmF3aW5nIHRoZSBhdXRvY29tcGxldGlvbiBtZW51LCBvYnNlcnZpbmcga2V5Ym9hcmQKLS8vIGFuZCBtb3VzZSBldmVudHMsIGFuZCBzaW1pbGFyLgotLy8KLS8vIFNwZWNpZmljIGF1dG9jb21wbGV0ZXJzIG5lZWQgdG8gcHJvdmlkZSwgYXQgdGhlIHZlcnkgbGVhc3QsIAotLy8gYSBnZXRVcGRhdGVkQ2hvaWNlcyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lCi0vLyB0aGUgdGV4dCBpbnNpZGUgdGhlIG1vbml0b3JlZCB0ZXh0Ym94IGNoYW5nZXMuIFRoaXMgbWV0aG9kIAotLy8gc2hvdWxkIGdldCB0aGUgdGV4dCBmb3Igd2hpY2ggdG8gcHJvdmlkZSBhdXRvY29tcGxldGlvbiBieQotLy8gaW52b2tpbmcgdGhpcy5nZXRUb2tlbigpLCBOT1QgYnkgZGlyZWN0bHkgYWNjZXNzaW5nCi0vLyB0aGlzLmVsZW1lbnQudmFsdWUuIFRoaXMgaXMgdG8gYWxsb3cgaW5jcmVtZW50YWwgdG9rZW5pemVkCi0vLyBhdXRvY29tcGxldGlvbi4gU3BlY2lmaWMgYXV0by1jb21wbGV0aW9uIGxvZ2ljIChBSkFYLCBldGMpCi0vLyBiZWxvbmdzIGluIGdldFVwZGF0ZWRDaG9pY2VzLgotLy8KLS8vIFRva2VuaXplZCBpbmNyZW1lbnRhbCBhdXRvY29tcGxldGlvbiBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkKLS8vIHdoZW4gYW4gYXV0b2NvbXBsZXRlciBpcyBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgJ3Rva2Vucycgb3B0aW9uCi0vLyBpbiB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIsIGUuZy46Ci0vLyBuZXcgQWpheC5BdXRvY29tcGxldGVyKCdpZCcsJ3VwZCcsICcvdXJsLycsIHsgdG9rZW5zOiAnLCcgfSk7Ci0vLyB3aWxsIGluY3JlbWVudGFsbHkgYXV0b2NvbXBsZXRlIHdpdGggYSBjb21tYSBhcyB0aGUgdG9rZW4uCi0vLyBBZGRpdGlvbmFsbHksICcsJyBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYW4gYmUgcmVwbGFjZWQgd2l0aAotLy8gYSB0b2tlbiBhcnJheSwgZS5nLiB7IHRva2VuczogWycsJywgJ1xuJ10gfSB3aGljaAotLy8gZW5hYmxlcyBhdXRvY29tcGxldGlvbiBvbiBtdWx0aXBsZSB0b2tlbnMuIFRoaXMgaXMgbW9zdCAKLS8vIHVzZWZ1bCB3aGVuIG9uZSBvZiB0aGUgdG9rZW5zIGlzIFxuIChhIG5ld2xpbmUpLCBhcyBpdCAKLS8vIGFsbG93cyBzbWFydCBhdXRvY29tcGxldGlvbiBhZnRlciBsaW5lYnJlYWtzLgotCi12YXIgQXV0b2NvbXBsZXRlciA9IHt9Ci1BdXRvY29tcGxldGVyLkJhc2UgPSBmdW5jdGlvbigpIHt9OwotQXV0b2NvbXBsZXRlci5CYXNlLnByb3RvdHlwZSA9IHsKLSAgYmFzZUluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHVwZGF0ZSwgb3B0aW9ucykgewotICAgIHRoaXMuZWxlbWVudCAgICAgPSAkKGVsZW1lbnQpOyAKLSAgICB0aGlzLnVwZGF0ZSAgICAgID0gJCh1cGRhdGUpOyAgCi0gICAgdGhpcy5oYXNGb2N1cyAgICA9IGZhbHNlOyAKLSAgICB0aGlzLmNoYW5nZWQgICAgID0gZmFsc2U7IAotICAgIHRoaXMuYWN0aXZlICAgICAgPSBmYWxzZTsgCi0gICAgdGhpcy5pbmRleCAgICAgICA9IDA7ICAgICAKLSAgICB0aGlzLmVudHJ5Q291bnQgID0gMDsKLQotICAgIGlmICh0aGlzLnNldE9wdGlvbnMpCi0gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgZWxzZQotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgIHRoaXMub3B0aW9ucy5wYXJhbU5hbWUgICAgPSB0aGlzLm9wdGlvbnMucGFyYW1OYW1lIHx8IHRoaXMuZWxlbWVudC5uYW1lOwotICAgIHRoaXMub3B0aW9ucy50b2tlbnMgICAgICAgPSB0aGlzLm9wdGlvbnMudG9rZW5zIHx8IFtdOwotICAgIHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgICAgPSB0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDAuNDsKLSAgICB0aGlzLm9wdGlvbnMubWluQ2hhcnMgICAgID0gdGhpcy5vcHRpb25zLm1pbkNoYXJzIHx8IDE7Ci0gICAgdGhpcy5vcHRpb25zLm9uU2hvdyAgICAgICA9IHRoaXMub3B0aW9ucy5vblNob3cgfHwgCi0gICAgZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlKXsgCi0gICAgICBpZighdXBkYXRlLnN0eWxlLnBvc2l0aW9uIHx8IHVwZGF0ZS5zdHlsZS5wb3NpdGlvbj09J2Fic29sdXRlJykgewotICAgICAgICB1cGRhdGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwotICAgICAgICBQb3NpdGlvbi5jbG9uZShlbGVtZW50LCB1cGRhdGUsIHtzZXRIZWlnaHQ6IGZhbHNlLCBvZmZzZXRUb3A6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0fSk7Ci0gICAgICB9Ci0gICAgICBFZmZlY3QuQXBwZWFyKHVwZGF0ZSx7ZHVyYXRpb246MC4xNX0pOwotICAgIH07Ci0gICAgdGhpcy5vcHRpb25zLm9uSGlkZSA9IHRoaXMub3B0aW9ucy5vbkhpZGUgfHwgCi0gICAgZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlKXsgbmV3IEVmZmVjdC5GYWRlKHVwZGF0ZSx7ZHVyYXRpb246MC4xNX0pIH07Ci0KLSAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b2tlbnMpID09ICdzdHJpbmcnKSAKLSAgICAgIHRoaXMub3B0aW9ucy50b2tlbnMgPSBuZXcgQXJyYXkodGhpcy5vcHRpb25zLnRva2Vucyk7Ci0KLSAgICB0aGlzLm9ic2VydmVyID0gbnVsbDsKLSAgICAKLSAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCdvZmYnKTsKLQotICAgIEVsZW1lbnQuaGlkZSh0aGlzLnVwZGF0ZSk7Ci0KLSAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgImJsdXIiLCB0aGlzLm9uQmx1ci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsKLSAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgImtleXByZXNzIiwgdGhpcy5vbktleVByZXNzLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcykpOwotICB9LAotCi0gIHNob3c6IGZ1bmN0aW9uKCkgewotICAgIGlmKEVsZW1lbnQuZ2V0U3R5bGUodGhpcy51cGRhdGUsICdkaXNwbGF5Jyk9PSdub25lJykgdGhpcy5vcHRpb25zLm9uU2hvdyh0aGlzLmVsZW1lbnQsIHRoaXMudXBkYXRlKTsKLSAgICBpZighdGhpcy5pZWZpeCAmJiAKLSAgICAgIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNU0lFJyk+MCkgJiYKLSAgICAgIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09wZXJhJyk8MCkgJiYKLSAgICAgIChFbGVtZW50LmdldFN0eWxlKHRoaXMudXBkYXRlLCAncG9zaXRpb24nKT09J2Fic29sdXRlJykpIHsKLSAgICAgIG5ldyBJbnNlcnRpb24uQWZ0ZXIodGhpcy51cGRhdGUsIAotICAgICAgICc8aWZyYW1lIGlkPSInICsgdGhpcy51cGRhdGUuaWQgKyAnX2llZml4IiAnKwotICAgICAgICdzdHlsZT0iZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEob3BhY2l0eT0wKTsiICcgKwotICAgICAgICdzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJubyI+PC9pZnJhbWU+Jyk7Ci0gICAgICB0aGlzLmllZml4ID0gJCh0aGlzLnVwZGF0ZS5pZCsnX2llZml4Jyk7Ci0gICAgfQotICAgIGlmKHRoaXMuaWVmaXgpIHNldFRpbWVvdXQodGhpcy5maXhJRU92ZXJsYXBwaW5nLmJpbmQodGhpcyksIDUwKTsKLSAgfSwKLSAgCi0gIGZpeElFT3ZlcmxhcHBpbmc6IGZ1bmN0aW9uKCkgewotICAgIFBvc2l0aW9uLmNsb25lKHRoaXMudXBkYXRlLCB0aGlzLmllZml4KTsKLSAgICB0aGlzLmllZml4LnN0eWxlLnpJbmRleCA9IDE7Ci0gICAgdGhpcy51cGRhdGUuc3R5bGUuekluZGV4ID0gMjsKLSAgICBFbGVtZW50LnNob3codGhpcy5pZWZpeCk7Ci0gIH0sCi0KLSAgaGlkZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zdG9wSW5kaWNhdG9yKCk7Ci0gICAgaWYoRWxlbWVudC5nZXRTdHlsZSh0aGlzLnVwZGF0ZSwgJ2Rpc3BsYXknKSE9J25vbmUnKSB0aGlzLm9wdGlvbnMub25IaWRlKHRoaXMuZWxlbWVudCwgdGhpcy51cGRhdGUpOwotICAgIGlmKHRoaXMuaWVmaXgpIEVsZW1lbnQuaGlkZSh0aGlzLmllZml4KTsKLSAgfSwKLQotICBzdGFydEluZGljYXRvcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5vcHRpb25zLmluZGljYXRvcikgRWxlbWVudC5zaG93KHRoaXMub3B0aW9ucy5pbmRpY2F0b3IpOwotICB9LAotCi0gIHN0b3BJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMub3B0aW9ucy5pbmRpY2F0b3IpIEVsZW1lbnQuaGlkZSh0aGlzLm9wdGlvbnMuaW5kaWNhdG9yKTsKLSAgfSwKLQotICBvbktleVByZXNzOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKHRoaXMuYWN0aXZlKQotICAgICAgc3dpdGNoKGV2ZW50LmtleUNvZGUpIHsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9UQUI6Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfUkVUVVJOOgotICAgICAgICAgdGhpcy5zZWxlY3RFbnRyeSgpOwotICAgICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfRVNDOgotICAgICAgICAgdGhpcy5oaWRlKCk7Ci0gICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfTEVGVDoKLSAgICAgICBjYXNlIEV2ZW50LktFWV9SSUdIVDoKLSAgICAgICAgIHJldHVybjsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9VUDoKLSAgICAgICAgIHRoaXMubWFya1ByZXZpb3VzKCk7Ci0gICAgICAgICB0aGlzLnJlbmRlcigpOwotICAgICAgICAgaWYobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignQXBwbGVXZWJLaXQnKT4wKSBFdmVudC5zdG9wKGV2ZW50KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9ET1dOOgotICAgICAgICAgdGhpcy5tYXJrTmV4dCgpOwotICAgICAgICAgdGhpcy5yZW5kZXIoKTsKLSAgICAgICAgIGlmKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ0FwcGxlV2ViS2l0Jyk+MCkgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgIGVsc2UgCi0gICAgICBpZihldmVudC5rZXlDb2RlPT1FdmVudC5LRVlfVEFCIHx8IGV2ZW50LmtleUNvZGU9PUV2ZW50LktFWV9SRVRVUk4pIAotICAgICAgICByZXR1cm47Ci0KLSAgICB0aGlzLmNoYW5nZWQgPSB0cnVlOwotICAgIHRoaXMuaGFzRm9jdXMgPSB0cnVlOwotCi0gICAgaWYodGhpcy5vYnNlcnZlcikgY2xlYXJUaW1lb3V0KHRoaXMub2JzZXJ2ZXIpOwotICAgICAgdGhpcy5vYnNlcnZlciA9IAotICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25PYnNlcnZlckV2ZW50LmJpbmQodGhpcyksIHRoaXMub3B0aW9ucy5mcmVxdWVuY3kqMTAwMCk7Ci0gIH0sCi0KLSAgb25Ib3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmZpbmRFbGVtZW50KGV2ZW50LCAnTEknKTsKLSAgICBpZih0aGlzLmluZGV4ICE9IGVsZW1lbnQuYXV0b2NvbXBsZXRlSW5kZXgpIAotICAgIHsKLSAgICAgICAgdGhpcy5pbmRleCA9IGVsZW1lbnQuYXV0b2NvbXBsZXRlSW5kZXg7Ci0gICAgICAgIHRoaXMucmVuZGVyKCk7Ci0gICAgfQotICAgIEV2ZW50LnN0b3AoZXZlbnQpOwotICB9LAotICAKLSAgb25DbGljazogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmZpbmRFbGVtZW50KGV2ZW50LCAnTEknKTsKLSAgICB0aGlzLmluZGV4ID0gZWxlbWVudC5hdXRvY29tcGxldGVJbmRleDsKLSAgICB0aGlzLnNlbGVjdEVudHJ5KCk7Ci0gICAgdGhpcy5oaWRlKCk7Ci0gIH0sCi0gIAotICBvbkJsdXI6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgLy8gbmVlZGVkIHRvIG1ha2UgY2xpY2sgZXZlbnRzIHdvcmtpbmcKLSAgICBzZXRUaW1lb3V0KHRoaXMuaGlkZS5iaW5kKHRoaXMpLCAyNTApOwotICAgIHRoaXMuaGFzRm9jdXMgPSBmYWxzZTsKLSAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOyAgICAgCi0gIH0sIAotICAKLSAgcmVuZGVyOiBmdW5jdGlvbigpIHsKLSAgICBpZih0aGlzLmVudHJ5Q291bnQgPiAwKSB7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZW50cnlDb3VudDsgaSsrKQotICAgICAgICB0aGlzLmluZGV4PT1pID8gCi0gICAgICAgICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5nZXRFbnRyeShpKSwic2VsZWN0ZWQiKSA6IAotICAgICAgICAgIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZ2V0RW50cnkoaSksInNlbGVjdGVkIik7Ci0gICAgICAgIAotICAgICAgaWYodGhpcy5oYXNGb2N1cykgeyAKLSAgICAgICAgdGhpcy5zaG93KCk7Ci0gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKLSAgICAgIHRoaXMuaGlkZSgpOwotICAgIH0KLSAgfSwKLSAgCi0gIG1hcmtQcmV2aW91czogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5pbmRleCA+IDApIHRoaXMuaW5kZXgtLQotICAgICAgZWxzZSB0aGlzLmluZGV4ID0gdGhpcy5lbnRyeUNvdW50LTE7Ci0gIH0sCi0gIAotICBtYXJrTmV4dDogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5pbmRleCA8IHRoaXMuZW50cnlDb3VudC0xKSB0aGlzLmluZGV4KysKLSAgICAgIGVsc2UgdGhpcy5pbmRleCA9IDA7Ci0gIH0sCi0gIAotICBnZXRFbnRyeTogZnVuY3Rpb24oaW5kZXgpIHsKLSAgICByZXR1cm4gdGhpcy51cGRhdGUuZmlyc3RDaGlsZC5jaGlsZE5vZGVzW2luZGV4XTsKLSAgfSwKLSAgCi0gIGdldEN1cnJlbnRFbnRyeTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZ2V0RW50cnkodGhpcy5pbmRleCk7Ci0gIH0sCi0gIAotICBzZWxlY3RFbnRyeTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKLSAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5nZXRDdXJyZW50RW50cnkoKSk7Ci0gIH0sCi0KLSAgdXBkYXRlRWxlbWVudDogZnVuY3Rpb24oc2VsZWN0ZWRFbGVtZW50KSB7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVFbGVtZW50KSB7Ci0gICAgICB0aGlzLm9wdGlvbnMudXBkYXRlRWxlbWVudChzZWxlY3RlZEVsZW1lbnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhciB2YWx1ZSA9IEVsZW1lbnQuY29sbGVjdFRleHROb2Rlc0lnbm9yZUNsYXNzKHNlbGVjdGVkRWxlbWVudCwgJ2luZm9ybWFsJyk7Ci0gICAgdmFyIGxhc3RUb2tlblBvcyA9IHRoaXMuZmluZExhc3RUb2tlbigpOwotICAgIGlmIChsYXN0VG9rZW5Qb3MgIT0gLTEpIHsKLSAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZWxlbWVudC52YWx1ZS5zdWJzdHIoMCwgbGFzdFRva2VuUG9zICsgMSk7Ci0gICAgICB2YXIgd2hpdGVzcGFjZSA9IHRoaXMuZWxlbWVudC52YWx1ZS5zdWJzdHIobGFzdFRva2VuUG9zICsgMSkubWF0Y2goL15ccysvKTsKLSAgICAgIGlmICh3aGl0ZXNwYWNlKQotICAgICAgICBuZXdWYWx1ZSArPSB3aGl0ZXNwYWNlWzBdOwotICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gbmV3VmFsdWUgKyB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIHRoaXMuZWxlbWVudC5mb2N1cygpOwotICAgIAotICAgIGlmICh0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGVFbGVtZW50KQotICAgICAgdGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlRWxlbWVudCh0aGlzLmVsZW1lbnQsIHNlbGVjdGVkRWxlbWVudCk7Ci0gIH0sCi0KLSAgdXBkYXRlQ2hvaWNlczogZnVuY3Rpb24oY2hvaWNlcykgewotICAgIGlmKCF0aGlzLmNoYW5nZWQgJiYgdGhpcy5oYXNGb2N1cykgewotICAgICAgdGhpcy51cGRhdGUuaW5uZXJIVE1MID0gY2hvaWNlczsKLSAgICAgIEVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKHRoaXMudXBkYXRlKTsKLSAgICAgIEVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKHRoaXMudXBkYXRlLmZpcnN0Q2hpbGQpOwotCi0gICAgICBpZih0aGlzLnVwZGF0ZS5maXJzdENoaWxkICYmIHRoaXMudXBkYXRlLmZpcnN0Q2hpbGQuY2hpbGROb2RlcykgewotICAgICAgICB0aGlzLmVudHJ5Q291bnQgPSAKLSAgICAgICAgICB0aGlzLnVwZGF0ZS5maXJzdENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZW50cnlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5nZXRFbnRyeShpKTsKLSAgICAgICAgICBlbnRyeS5hdXRvY29tcGxldGVJbmRleCA9IGk7Ci0gICAgICAgICAgdGhpcy5hZGRPYnNlcnZlcnMoZW50cnkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgeyAKLSAgICAgICAgdGhpcy5lbnRyeUNvdW50ID0gMDsKLSAgICAgIH0KLQotICAgICAgdGhpcy5zdG9wSW5kaWNhdG9yKCk7Ci0KLSAgICAgIHRoaXMuaW5kZXggPSAwOwotICAgICAgdGhpcy5yZW5kZXIoKTsKLSAgICB9Ci0gIH0sCi0KLSAgYWRkT2JzZXJ2ZXJzOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAibW91c2VvdmVyIiwgdGhpcy5vbkhvdmVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcykpOwotICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgImNsaWNrIiwgdGhpcy5vbkNsaWNrLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcykpOwotICB9LAotCi0gIG9uT2JzZXJ2ZXJFdmVudDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7ICAgCi0gICAgaWYodGhpcy5nZXRUb2tlbigpLmxlbmd0aD49dGhpcy5vcHRpb25zLm1pbkNoYXJzKSB7Ci0gICAgICB0aGlzLnN0YXJ0SW5kaWNhdG9yKCk7Ci0gICAgICB0aGlzLmdldFVwZGF0ZWRDaG9pY2VzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7Ci0gICAgICB0aGlzLmhpZGUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgZ2V0VG9rZW46IGZ1bmN0aW9uKCkgewotICAgIHZhciB0b2tlblBvcyA9IHRoaXMuZmluZExhc3RUb2tlbigpOwotICAgIGlmICh0b2tlblBvcyAhPSAtMSkKLSAgICAgIHZhciByZXQgPSB0aGlzLmVsZW1lbnQudmFsdWUuc3Vic3RyKHRva2VuUG9zICsgMSkucmVwbGFjZSgvXlxzKy8sJycpLnJlcGxhY2UoL1xzKyQvLCcnKTsKLSAgICBlbHNlCi0gICAgICB2YXIgcmV0ID0gdGhpcy5lbGVtZW50LnZhbHVlOwotCi0gICAgcmV0dXJuIC9cbi8udGVzdChyZXQpID8gJycgOiByZXQ7Ci0gIH0sCi0KLSAgZmluZExhc3RUb2tlbjogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxhc3RUb2tlblBvcyA9IC0xOwotCi0gICAgZm9yICh2YXIgaT0wOyBpPHRoaXMub3B0aW9ucy50b2tlbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0aGlzVG9rZW5Qb3MgPSB0aGlzLmVsZW1lbnQudmFsdWUubGFzdEluZGV4T2YodGhpcy5vcHRpb25zLnRva2Vuc1tpXSk7Ci0gICAgICBpZiAodGhpc1Rva2VuUG9zID4gbGFzdFRva2VuUG9zKQotICAgICAgICBsYXN0VG9rZW5Qb3MgPSB0aGlzVG9rZW5Qb3M7Ci0gICAgfQotICAgIHJldHVybiBsYXN0VG9rZW5Qb3M7Ci0gIH0KLX0KLQotQWpheC5BdXRvY29tcGxldGVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoQWpheC5BdXRvY29tcGxldGVyLnByb3RvdHlwZSwgQXV0b2NvbXBsZXRlci5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlLCB1cmwsIG9wdGlvbnMpIHsKLQkgIHRoaXMuYmFzZUluaXRpYWxpemUoZWxlbWVudCwgdXBkYXRlLCBvcHRpb25zKTsKLSAgICB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzICA9IHRydWU7Ci0gICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgICAgPSB0aGlzLm9uQ29tcGxldGUuYmluZCh0aGlzKTsKLSAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdFBhcmFtcyA9IHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzIHx8IG51bGw7Ci0gICAgdGhpcy51cmwgICAgICAgICAgICAgICAgICAgPSB1cmw7Ci0gIH0sCi0KLSAgZ2V0VXBkYXRlZENob2ljZXM6IGZ1bmN0aW9uKCkgewotICAgIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMub3B0aW9ucy5wYXJhbU5hbWUpICsgJz0nICsgCi0gICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy5nZXRUb2tlbigpKTsKLQotICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLmNhbGxiYWNrID8KLSAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIGVudHJ5KSA6IGVudHJ5OwotCi0gICAgaWYodGhpcy5vcHRpb25zLmRlZmF1bHRQYXJhbXMpIAotICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgKz0gJyYnICsgdGhpcy5vcHRpb25zLmRlZmF1bHRQYXJhbXM7Ci0KLSAgICBuZXcgQWpheC5SZXF1ZXN0KHRoaXMudXJsLCB0aGlzLm9wdGlvbnMpOwotICB9LAotCi0gIG9uQ29tcGxldGU6IGZ1bmN0aW9uKHJlcXVlc3QpIHsKLSAgICB0aGlzLnVwZGF0ZUNob2ljZXMocmVxdWVzdC5yZXNwb25zZVRleHQpOwotICB9Ci0KLX0pOwotCi0vLyBUaGUgbG9jYWwgYXJyYXkgYXV0b2NvbXBsZXRlci4gVXNlZCB3aGVuIHlvdSdkIHByZWZlciB0bwotLy8gaW5qZWN0IGFuIGFycmF5IG9mIGF1dG9jb21wbGV0aW9uIG9wdGlvbnMgaW50byB0aGUgcGFnZSwgcmF0aGVyCi0vLyB0aGFuIHNlbmRpbmcgb3V0IEFqYXggcXVlcmllcywgd2hpY2ggY2FuIGJlIHF1aXRlIHNsb3cgc29tZXRpbWVzLgotLy8KLS8vIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBmb3VyIHBhcmFtZXRlcnMuIFRoZSBmaXJzdCB0d28gYXJlLCBhcyB1c3VhbCwKLS8vIHRoZSBpZCBvZiB0aGUgbW9uaXRvcmVkIHRleHRib3gsIGFuZCBpZCBvZiB0aGUgYXV0b2NvbXBsZXRpb24gbWVudS4KLS8vIFRoZSB0aGlyZCBpcyB0aGUgYXJyYXkgeW91IHdhbnQgdG8gYXV0b2NvbXBsZXRlIGZyb20sIGFuZCB0aGUgZm91cnRoCi0vLyBpcyB0aGUgb3B0aW9ucyBibG9jay4KLS8vCi0vLyBFeHRyYSBsb2NhbCBhdXRvY29tcGxldGlvbiBvcHRpb25zOgotLy8gLSBjaG9pY2VzIC0gSG93IG1hbnkgYXV0b2NvbXBsZXRpb24gY2hvaWNlcyB0byBvZmZlcgotLy8KLS8vIC0gcGFydGlhbFNlYXJjaCAtIElmIGZhbHNlLCB0aGUgYXV0b2NvbXBsZXRlciB3aWxsIG1hdGNoIGVudGVyZWQKLS8vICAgICAgICAgICAgICAgICAgICB0ZXh0IG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiBzdHJpbmdzIGluIHRoZSAKLS8vICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGUgYXJyYXkuIERlZmF1bHRzIHRvIHRydWUsIHdoaWNoIHdpbGwKLS8vICAgICAgICAgICAgICAgICAgICBtYXRjaCB0ZXh0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYW55ICp3b3JkKiBpbiB0aGUKLS8vICAgICAgICAgICAgICAgICAgICBzdHJpbmdzIGluIHRoZSBhdXRvY29tcGxldGUgYXJyYXkuIElmIHlvdSB3YW50IHRvCi0vLyAgICAgICAgICAgICAgICAgICAgc2VhcmNoIGFueXdoZXJlIGluIHRoZSBzdHJpbmcsIGFkZGl0aW9uYWxseSBzZXQKLS8vICAgICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uIGZ1bGxTZWFyY2ggdG8gdHJ1ZSAoZGVmYXVsdDogb2ZmKS4KLS8vCi0vLyAtIGZ1bGxTc2VhcmNoIC0gU2VhcmNoIGFueXdoZXJlIGluIGF1dG9jb21wbGV0ZSBhcnJheSBzdHJpbmdzLgotLy8KLS8vIC0gcGFydGlhbENoYXJzIC0gSG93IG1hbnkgY2hhcmFjdGVycyB0byBlbnRlciBiZWZvcmUgdHJpZ2dlcmluZwotLy8gICAgICAgICAgICAgICAgICAgYSBwYXJ0aWFsIG1hdGNoICh1bmxpa2UgbWluQ2hhcnMsIHdoaWNoIGRlZmluZXMKLS8vICAgICAgICAgICAgICAgICAgIGhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIHJlcXVpcmVkIHRvIGRvIGFueSBtYXRjaAotLy8gICAgICAgICAgICAgICAgICAgYXQgYWxsKS4gRGVmYXVsdHMgdG8gMi4KLS8vCi0vLyAtIGlnbm9yZUNhc2UgLSBXaGV0aGVyIHRvIGlnbm9yZSBjYXNlIHdoZW4gYXV0b2NvbXBsZXRpbmcuCi0vLyAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KLS8vCi0vLyBJdCdzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSBjdXN0b20gZnVuY3Rpb24gYXMgdGhlICdzZWxlY3RvcicgCi0vLyBvcHRpb24sIGlmIHlvdSBwcmVmZXIgdG8gd3JpdGUgeW91ciBvd24gYXV0b2NvbXBsZXRpb24gbG9naWMuCi0vLyBJbiB0aGF0IGNhc2UsIHRoZSBvdGhlciBvcHRpb25zIGFib3ZlIHdpbGwgbm90IGFwcGx5IHVubGVzcwotLy8geW91IHN1cHBvcnQgdGhlbS4KLQotQXV0b2NvbXBsZXRlci5Mb2NhbCA9IENsYXNzLmNyZWF0ZSgpOwotQXV0b2NvbXBsZXRlci5Mb2NhbC5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBdXRvY29tcGxldGVyLkJhc2UoKSwgewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUsIGFycmF5LCBvcHRpb25zKSB7Ci0gICAgdGhpcy5iYXNlSW5pdGlhbGl6ZShlbGVtZW50LCB1cGRhdGUsIG9wdGlvbnMpOwotICAgIHRoaXMub3B0aW9ucy5hcnJheSA9IGFycmF5OwotICB9LAotCi0gIGdldFVwZGF0ZWRDaG9pY2VzOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnVwZGF0ZUNob2ljZXModGhpcy5vcHRpb25zLnNlbGVjdG9yKHRoaXMpKTsKLSAgfSwKLQotICBzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBjaG9pY2VzOiAxMCwKLSAgICAgIHBhcnRpYWxTZWFyY2g6IHRydWUsCi0gICAgICBwYXJ0aWFsQ2hhcnM6IDIsCi0gICAgICBpZ25vcmVDYXNlOiB0cnVlLAotICAgICAgZnVsbFNlYXJjaDogZmFsc2UsCi0gICAgICBzZWxlY3RvcjogZnVuY3Rpb24oaW5zdGFuY2UpIHsKLSAgICAgICAgdmFyIHJldCAgICAgICA9IFtdOyAvLyBCZWdpbm5pbmcgbWF0Y2hlcwotICAgICAgICB2YXIgcGFydGlhbCAgID0gW107IC8vIEluc2lkZSBtYXRjaGVzCi0gICAgICAgIHZhciBlbnRyeSAgICAgPSBpbnN0YW5jZS5nZXRUb2tlbigpOwotICAgICAgICB2YXIgY291bnQgICAgID0gMDsKLQotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluc3RhbmNlLm9wdGlvbnMuYXJyYXkubGVuZ3RoICYmICAKLSAgICAgICAgICByZXQubGVuZ3RoIDwgaW5zdGFuY2Uub3B0aW9ucy5jaG9pY2VzIDsgaSsrKSB7IAotCi0gICAgICAgICAgdmFyIGVsZW0gPSBpbnN0YW5jZS5vcHRpb25zLmFycmF5W2ldOwotICAgICAgICAgIHZhciBmb3VuZFBvcyA9IGluc3RhbmNlLm9wdGlvbnMuaWdub3JlQ2FzZSA/IAotICAgICAgICAgICAgZWxlbS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZW50cnkudG9Mb3dlckNhc2UoKSkgOiAKLSAgICAgICAgICAgIGVsZW0uaW5kZXhPZihlbnRyeSk7Ci0KLSAgICAgICAgICB3aGlsZSAoZm91bmRQb3MgIT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChmb3VuZFBvcyA9PSAwICYmIGVsZW0ubGVuZ3RoICE9IGVudHJ5Lmxlbmd0aCkgeyAKLSAgICAgICAgICAgICAgcmV0LnB1c2goIjxsaT48c3Ryb25nPiIgKyBlbGVtLnN1YnN0cigwLCBlbnRyeS5sZW5ndGgpICsgIjwvc3Ryb25nPiIgKyAKLSAgICAgICAgICAgICAgICBlbGVtLnN1YnN0cihlbnRyeS5sZW5ndGgpICsgIjwvbGk+Iik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5sZW5ndGggPj0gaW5zdGFuY2Uub3B0aW9ucy5wYXJ0aWFsQ2hhcnMgJiYgCi0gICAgICAgICAgICAgIGluc3RhbmNlLm9wdGlvbnMucGFydGlhbFNlYXJjaCAmJiBmb3VuZFBvcyAhPSAtMSkgewotICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uub3B0aW9ucy5mdWxsU2VhcmNoIHx8IC9ccy8udGVzdChlbGVtLnN1YnN0cihmb3VuZFBvcy0xLDEpKSkgewotICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaCgiPGxpPiIgKyBlbGVtLnN1YnN0cigwLCBmb3VuZFBvcykgKyAiPHN0cm9uZz4iICsKLSAgICAgICAgICAgICAgICAgIGVsZW0uc3Vic3RyKGZvdW5kUG9zLCBlbnRyeS5sZW5ndGgpICsgIjwvc3Ryb25nPiIgKyBlbGVtLnN1YnN0cigKLSAgICAgICAgICAgICAgICAgIGZvdW5kUG9zICsgZW50cnkubGVuZ3RoKSArICI8L2xpPiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvdW5kUG9zID0gaW5zdGFuY2Uub3B0aW9ucy5pZ25vcmVDYXNlID8gCi0gICAgICAgICAgICAgIGVsZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKGVudHJ5LnRvTG93ZXJDYXNlKCksIGZvdW5kUG9zICsgMSkgOiAKLSAgICAgICAgICAgICAgZWxlbS5pbmRleE9mKGVudHJ5LCBmb3VuZFBvcyArIDEpOwotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJ0aWFsLmxlbmd0aCkKLSAgICAgICAgICByZXQgPSByZXQuY29uY2F0KHBhcnRpYWwuc2xpY2UoMCwgaW5zdGFuY2Uub3B0aW9ucy5jaG9pY2VzIC0gcmV0Lmxlbmd0aCkpCi0gICAgICAgIHJldHVybiAiPHVsPiIgKyByZXQuam9pbignJykgKyAiPC91bD4iOwotICAgICAgfQotICAgIH0sIG9wdGlvbnMgfHwge30pOwotICB9Ci19KTsKLQotLy8gQUpBWCBpbi1wbGFjZSBlZGl0b3IKLS8vCi0vLyBzZWUgZG9jdW1lbnRhdGlvbiBvbiBodHRwOi8vd2lraS5zY3JpcHQuYWN1bG8udXMvc2NyaXB0YWN1bG91cy9zaG93L0FqYXguSW5QbGFjZUVkaXRvcgotCi0vLyBVc2UgdGhpcyBpZiB5b3Ugbm90aWNlIHdlaXJkIHNjcm9sbGluZyBwcm9ibGVtcyBvbiBzb21lIGJyb3dzZXJzLAotLy8gdGhlIERPTSBtaWdodCBiZSBhIGJpdCBjb25mdXNlZCB3aGVuIHRoaXMgZ2V0cyBjYWxsZWQgc28gZG8gdGhpcwotLy8gd2FpdHMgMSBtcyAod2l0aCBzZXRUaW1lb3V0KSB1bnRpbCBpdCBkb2VzIHRoZSBhY3RpdmF0aW9uCi1GaWVsZC5zY3JvbGxGcmVlQWN0aXZhdGUgPSBmdW5jdGlvbihmaWVsZCkgewotICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgIEZpZWxkLmFjdGl2YXRlKGZpZWxkKTsKLSAgfSwgMSk7Ci19Ci0KLUFqYXguSW5QbGFjZUVkaXRvciA9IENsYXNzLmNyZWF0ZSgpOwotQWpheC5JblBsYWNlRWRpdG9yLmRlZmF1bHRIaWdobGlnaHRDb2xvciA9ICIjRkZGRjk5IjsKLUFqYXguSW5QbGFjZUVkaXRvci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHVybCwgb3B0aW9ucykgewotICAgIHRoaXMudXJsID0gdXJsOwotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0KLSAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIG9rVGV4dDogIm9rIiwKLSAgICAgIGNhbmNlbFRleHQ6ICJjYW5jZWwiLAotICAgICAgc2F2aW5nVGV4dDogIlNhdmluZy4uLiIsCi0gICAgICBjbGlja1RvRWRpdFRleHQ6ICJDbGljayB0byBlZGl0IiwKLSAgICAgIG9rVGV4dDogIm9rIiwKLSAgICAgIHJvd3M6IDEsCi0gICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbih0cmFuc3BvcnQsIGVsZW1lbnQpIHsKLSAgICAgICAgbmV3IEVmZmVjdC5IaWdobGlnaHQoZWxlbWVudCwge3N0YXJ0Y29sb3I6IHRoaXMub3B0aW9ucy5oaWdobGlnaHRjb2xvcn0pOwotICAgICAgfSwKLSAgICAgIG9uRmFpbHVyZTogZnVuY3Rpb24odHJhbnNwb3J0KSB7Ci0gICAgICAgIGFsZXJ0KCJFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlcjogIiArIHRyYW5zcG9ydC5yZXNwb25zZVRleHQuc3RyaXBUYWdzKCkpOwotICAgICAgfSwKLSAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbihmb3JtKSB7Ci0gICAgICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZShmb3JtKTsKLSAgICAgIH0sCi0gICAgICBoYW5kbGVMaW5lQnJlYWtzOiB0cnVlLAotICAgICAgbG9hZGluZ1RleHQ6ICdMb2FkaW5nLi4uJywKLSAgICAgIHNhdmluZ0NsYXNzTmFtZTogJ2lucGxhY2VlZGl0b3Itc2F2aW5nJywKLSAgICAgIGxvYWRpbmdDbGFzc05hbWU6ICdpbnBsYWNlZWRpdG9yLWxvYWRpbmcnLAotICAgICAgZm9ybUNsYXNzTmFtZTogJ2lucGxhY2VlZGl0b3ItZm9ybScsCi0gICAgICBoaWdobGlnaHRjb2xvcjogQWpheC5JblBsYWNlRWRpdG9yLmRlZmF1bHRIaWdobGlnaHRDb2xvciwKLSAgICAgIGhpZ2hsaWdodGVuZGNvbG9yOiAiI0ZGRkZGRiIsCi0gICAgICBleHRlcm5hbENvbnRyb2w6CW51bGwsCi0gICAgICBhamF4T3B0aW9uczoge30KLSAgICB9LCBvcHRpb25zIHx8IHt9KTsKLQotICAgIGlmKCF0aGlzLm9wdGlvbnMuZm9ybUlkICYmIHRoaXMuZWxlbWVudC5pZCkgewotICAgICAgdGhpcy5vcHRpb25zLmZvcm1JZCA9IHRoaXMuZWxlbWVudC5pZCArICItaW5wbGFjZWVkaXRvciI7Ci0gICAgICBpZiAoJCh0aGlzLm9wdGlvbnMuZm9ybUlkKSkgewotICAgICAgICAvLyB0aGVyZSdzIGFscmVhZHkgYSBmb3JtIHdpdGggdGhhdCBuYW1lLCBkb24ndCBzcGVjaWZ5IGFuIGlkCi0gICAgICAgIHRoaXMub3B0aW9ucy5mb3JtSWQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkgewotICAgICAgdGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCA9ICQodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCk7Ci0gICAgfQotICAgIAotICAgIHRoaXMub3JpZ2luYWxCYWNrZ3JvdW5kID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJyk7Ci0gICAgaWYgKCF0aGlzLm9yaWdpbmFsQmFja2dyb3VuZCkgewotICAgICAgdGhpcy5vcmlnaW5hbEJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOwotICAgIH0KLSAgICAKLSAgICB0aGlzLmVsZW1lbnQudGl0bGUgPSB0aGlzLm9wdGlvbnMuY2xpY2tUb0VkaXRUZXh0OwotICAgIAotICAgIHRoaXMub25jbGlja0xpc3RlbmVyID0gdGhpcy5lbnRlckVkaXRNb2RlLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgdGhpcy5tb3VzZW92ZXJMaXN0ZW5lciA9IHRoaXMuZW50ZXJIb3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIHRoaXMubW91c2VvdXRMaXN0ZW5lciA9IHRoaXMubGVhdmVIb3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIEV2ZW50Lm9ic2VydmUodGhpcy5lbGVtZW50LCAnY2xpY2snLCB0aGlzLm9uY2xpY2tMaXN0ZW5lcik7Ci0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsICdtb3VzZW92ZXInLCB0aGlzLm1vdXNlb3Zlckxpc3RlbmVyKTsKLSAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgJ21vdXNlb3V0JywgdGhpcy5tb3VzZW91dExpc3RlbmVyKTsKLSAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkgewotICAgICAgRXZlbnQub2JzZXJ2ZSh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLCAnY2xpY2snLCB0aGlzLm9uY2xpY2tMaXN0ZW5lcik7Ci0gICAgICBFdmVudC5vYnNlcnZlKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wsICdtb3VzZW92ZXInLCB0aGlzLm1vdXNlb3Zlckxpc3RlbmVyKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCwgJ21vdXNlb3V0JywgdGhpcy5tb3VzZW91dExpc3RlbmVyKTsKLSAgICB9Ci0gIH0sCi0gIGVudGVyRWRpdE1vZGU6IGZ1bmN0aW9uKGV2dCkgewotICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuOwotICAgIGlmICh0aGlzLmVkaXRpbmcpIHJldHVybjsKLSAgICB0aGlzLmVkaXRpbmcgPSB0cnVlOwotICAgIHRoaXMub25FbnRlckVkaXRNb2RlKCk7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpIHsKLSAgICAgIEVsZW1lbnQuaGlkZSh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKTsKLSAgICB9Ci0gICAgRWxlbWVudC5oaWRlKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy5jcmVhdGVGb3JtKCk7Ci0gICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZm9ybSwgdGhpcy5lbGVtZW50KTsKLSAgICBGaWVsZC5zY3JvbGxGcmVlQWN0aXZhdGUodGhpcy5lZGl0RmllbGQpOwotICAgIC8vIHN0b3AgdGhlIGV2ZW50IHRvIGF2b2lkIGEgcGFnZSByZWZyZXNoIGluIFNhZmFyaQotICAgIGlmIChldnQpIHsKLSAgICAgIEV2ZW50LnN0b3AoZXZ0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotICBjcmVhdGVGb3JtOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7Ci0gICAgdGhpcy5mb3JtLmlkID0gdGhpcy5vcHRpb25zLmZvcm1JZDsKLSAgICBFbGVtZW50LmFkZENsYXNzTmFtZSh0aGlzLmZvcm0sIHRoaXMub3B0aW9ucy5mb3JtQ2xhc3NOYW1lKQotICAgIHRoaXMuZm9ybS5vbnN1Ym1pdCA9IHRoaXMub25TdWJtaXQuYmluZCh0aGlzKTsKLQotICAgIHRoaXMuY3JlYXRlRWRpdEZpZWxkKCk7Ci0KLSAgICBpZiAodGhpcy5vcHRpb25zLnRleHRhcmVhKSB7Ci0gICAgICB2YXIgYnIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpOwotICAgICAgdGhpcy5mb3JtLmFwcGVuZENoaWxkKGJyKTsKLSAgICB9Ci0KLSAgICBva0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgb2tCdXR0b24udHlwZSA9ICJzdWJtaXQiOwotICAgIG9rQnV0dG9uLnZhbHVlID0gdGhpcy5vcHRpb25zLm9rVGV4dDsKLSAgICB0aGlzLmZvcm0uYXBwZW5kQ2hpbGQob2tCdXR0b24pOwotCi0gICAgY2FuY2VsTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBjYW5jZWxMaW5rLmhyZWYgPSAiIyI7Ci0gICAgY2FuY2VsTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm9wdGlvbnMuY2FuY2VsVGV4dCkpOwotICAgIGNhbmNlbExpbmsub25jbGljayA9IHRoaXMub25jbGlja0NhbmNlbC5iaW5kKHRoaXMpOwotICAgIHRoaXMuZm9ybS5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsKLSAgfSwKLSAgaGFzSFRNTExpbmVCcmVha3M6IGZ1bmN0aW9uKHN0cmluZykgewotICAgIGlmICghdGhpcy5vcHRpb25zLmhhbmRsZUxpbmVCcmVha3MpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3RyaW5nLm1hdGNoKC88YnIvaSkgfHwgc3RyaW5nLm1hdGNoKC88cD4vaSk7Ci0gIH0sCi0gIGNvbnZlcnRIVE1MTGluZUJyZWFrczogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC88YnI+L2dpLCAiXG4iKS5yZXBsYWNlKC88YnJcLz4vZ2ksICJcbiIpLnJlcGxhY2UoLzxcL3A+L2dpLCAiXG4iKS5yZXBsYWNlKC88cD4vZ2ksICIiKTsKLSAgfSwKLSAgY3JlYXRlRWRpdEZpZWxkOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGV4dDsKLSAgICBpZih0aGlzLm9wdGlvbnMubG9hZFRleHRVUkwpIHsKLSAgICAgIHRleHQgPSB0aGlzLm9wdGlvbnMubG9hZGluZ1RleHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRleHQgPSB0aGlzLmdldFRleHQoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHRoaXMub3B0aW9ucy5yb3dzID09IDEgJiYgIXRoaXMuaGFzSFRNTExpbmVCcmVha3ModGV4dCkpIHsKLSAgICAgIHRoaXMub3B0aW9ucy50ZXh0YXJlYSA9IGZhbHNlOwotICAgICAgdmFyIHRleHRGaWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICB0ZXh0RmllbGQudHlwZSA9ICJ0ZXh0IjsKLSAgICAgIHRleHRGaWVsZC5uYW1lID0gInZhbHVlIjsKLSAgICAgIHRleHRGaWVsZC52YWx1ZSA9IHRleHQ7Ci0gICAgICB0ZXh0RmllbGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5vcHRpb25zLmhpZ2hsaWdodGNvbG9yOwotICAgICAgdmFyIHNpemUgPSB0aGlzLm9wdGlvbnMuc2l6ZSB8fCB0aGlzLm9wdGlvbnMuY29scyB8fCAwOwotICAgICAgaWYgKHNpemUgIT0gMCkgdGV4dEZpZWxkLnNpemUgPSBzaXplOwotICAgICAgdGhpcy5lZGl0RmllbGQgPSB0ZXh0RmllbGQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMub3B0aW9ucy50ZXh0YXJlYSA9IHRydWU7Ci0gICAgICB2YXIgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOwotICAgICAgdGV4dEFyZWEubmFtZSA9ICJ2YWx1ZSI7Ci0gICAgICB0ZXh0QXJlYS52YWx1ZSA9IHRoaXMuY29udmVydEhUTUxMaW5lQnJlYWtzKHRleHQpOwotICAgICAgdGV4dEFyZWEucm93cyA9IHRoaXMub3B0aW9ucy5yb3dzOwotICAgICAgdGV4dEFyZWEuY29scyA9IHRoaXMub3B0aW9ucy5jb2xzIHx8IDQwOwotICAgICAgdGhpcy5lZGl0RmllbGQgPSB0ZXh0QXJlYTsKLSAgICB9Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLmxvYWRUZXh0VVJMKSB7Ci0gICAgICB0aGlzLmxvYWRFeHRlcm5hbFRleHQoKTsKLSAgICB9Ci0gICAgdGhpcy5mb3JtLmFwcGVuZENoaWxkKHRoaXMuZWRpdEZpZWxkKTsKLSAgfSwKLSAgZ2V0VGV4dDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5pbm5lckhUTUw7Ci0gIH0sCi0gIGxvYWRFeHRlcm5hbFRleHQ6IGZ1bmN0aW9uKCkgewotICAgIEVsZW1lbnQuYWRkQ2xhc3NOYW1lKHRoaXMuZm9ybSwgdGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzc05hbWUpOwotICAgIHRoaXMuZWRpdEZpZWxkLmRpc2FibGVkID0gdHJ1ZTsKLSAgICBuZXcgQWpheC5SZXF1ZXN0KAotICAgICAgdGhpcy5vcHRpb25zLmxvYWRUZXh0VVJMLAotICAgICAgT2JqZWN0LmV4dGVuZCh7Ci0gICAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwKLSAgICAgICAgb25Db21wbGV0ZTogdGhpcy5vbkxvYWRlZEV4dGVybmFsVGV4dC5iaW5kKHRoaXMpCi0gICAgICB9LCB0aGlzLm9wdGlvbnMuYWpheE9wdGlvbnMpCi0gICAgKTsKLSAgfSwKLSAgb25Mb2FkZWRFeHRlcm5hbFRleHQ6IGZ1bmN0aW9uKHRyYW5zcG9ydCkgewotICAgIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZm9ybSwgdGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzc05hbWUpOwotICAgIHRoaXMuZWRpdEZpZWxkLmRpc2FibGVkID0gZmFsc2U7Ci0gICAgdGhpcy5lZGl0RmllbGQudmFsdWUgPSB0cmFuc3BvcnQucmVzcG9uc2VUZXh0LnN0cmlwVGFncygpOwotICB9LAotICBvbmNsaWNrQ2FuY2VsOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLm9uQ29tcGxldGUoKTsKLSAgICB0aGlzLmxlYXZlRWRpdE1vZGUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0gIG9uRmFpbHVyZTogZnVuY3Rpb24odHJhbnNwb3J0KSB7Ci0gICAgdGhpcy5vcHRpb25zLm9uRmFpbHVyZSh0cmFuc3BvcnQpOwotICAgIGlmICh0aGlzLm9sZElubmVySFRNTCkgewotICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMub2xkSW5uZXJIVE1MOwotICAgICAgdGhpcy5vbGRJbm5lckhUTUwgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0gIG9uU3VibWl0OiBmdW5jdGlvbigpIHsKLSAgICAvLyBvbkxvYWRpbmcgcmVzZXRzIHRoZXNlIHNvIHdlIG5lZWQgdG8gc2F2ZSB0aGVtIGF3YXkgZm9yIHRoZSBBamF4IGNhbGwKLSAgICB2YXIgZm9ybSA9IHRoaXMuZm9ybTsKLSAgICB2YXIgdmFsdWUgPSB0aGlzLmVkaXRGaWVsZC52YWx1ZTsKLSAgICAKLSAgICAvLyBkbyB0aGlzIGZpcnN0LCBzb21ldGltZXMgdGhlIGFqYXggY2FsbCByZXR1cm5zIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gc3dpdGNoIG9uIFNhdmluZy4uLgotICAgIC8vIHdoaWNoIG1lYW5zIHRoaXMgd2lsbCBhY3R1YWxseSBzd2l0Y2ggb24gU2F2aW5nLi4uICphZnRlciogd2UndmUgbGVmdCBlZGl0IG1vZGUgY2F1c2luZyBTYXZpbmcuLi4KLSAgICAvLyB0byBiZSBkaXNwbGF5ZWQgaW5kZWZpbml0ZWx5Ci0gICAgdGhpcy5vbkxvYWRpbmcoKTsKLSAgICAKLSAgICBuZXcgQWpheC5VcGRhdGVyKAotICAgICAgeyAKLSAgICAgICAgc3VjY2VzczogdGhpcy5lbGVtZW50LAotICAgICAgICAgLy8gZG9uJ3QgdXBkYXRlIG9uIGZhaWx1cmUgKHRoaXMgY291bGQgYmUgYW4gb3B0aW9uKQotICAgICAgICBmYWlsdXJlOiBudWxsCi0gICAgICB9LAotICAgICAgdGhpcy51cmwsCi0gICAgICBPYmplY3QuZXh0ZW5kKHsKLSAgICAgICAgcGFyYW1ldGVyczogdGhpcy5vcHRpb25zLmNhbGxiYWNrKGZvcm0sIHZhbHVlKSwKLSAgICAgICAgb25Db21wbGV0ZTogdGhpcy5vbkNvbXBsZXRlLmJpbmQodGhpcyksCi0gICAgICAgIG9uRmFpbHVyZTogdGhpcy5vbkZhaWx1cmUuYmluZCh0aGlzKQotICAgICAgfSwgdGhpcy5vcHRpb25zLmFqYXhPcHRpb25zKQotICAgICk7Ci0gICAgLy8gc3RvcCB0aGUgZXZlbnQgdG8gYXZvaWQgYSBwYWdlIHJlZnJlc2ggaW4gU2FmYXJpCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICBFdmVudC5zdG9wKGFyZ3VtZW50c1swXSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLSAgb25Mb2FkaW5nOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNhdmluZyA9IHRydWU7Ci0gICAgdGhpcy5yZW1vdmVGb3JtKCk7Ci0gICAgdGhpcy5sZWF2ZUhvdmVyKCk7Ci0gICAgdGhpcy5zaG93U2F2aW5nKCk7Ci0gIH0sCi0gIHNob3dTYXZpbmc6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMub2xkSW5uZXJIVE1MID0gdGhpcy5lbGVtZW50LmlubmVySFRNTDsKLSAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnNhdmluZ1RleHQ7Ci0gICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuc2F2aW5nQ2xhc3NOYW1lKTsKLSAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5vcmlnaW5hbEJhY2tncm91bmQ7Ci0gICAgRWxlbWVudC5zaG93KHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0gIHJlbW92ZUZvcm06IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMuZm9ybSkgewotICAgICAgaWYgKHRoaXMuZm9ybS5wYXJlbnROb2RlKSBFbGVtZW50LnJlbW92ZSh0aGlzLmZvcm0pOwotICAgICAgdGhpcy5mb3JtID0gbnVsbDsKLSAgICB9Ci0gIH0sCi0gIGVudGVySG92ZXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuOwotICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm9wdGlvbnMuaGlnaGxpZ2h0Y29sb3I7Ci0gICAgaWYgKHRoaXMuZWZmZWN0KSB7Ci0gICAgICB0aGlzLmVmZmVjdC5jYW5jZWwoKTsKLSAgICB9Ci0gICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuaG92ZXJDbGFzc05hbWUpCi0gIH0sCi0gIGxlYXZlSG92ZXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSB7Ci0gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5vbGRCYWNrZ3JvdW5kOwotICAgIH0KLSAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzTmFtZSkKLSAgICBpZiAodGhpcy5zYXZpbmcpIHJldHVybjsKLSAgICB0aGlzLmVmZmVjdCA9IG5ldyBFZmZlY3QuSGlnaGxpZ2h0KHRoaXMuZWxlbWVudCwgewotICAgICAgc3RhcnRjb2xvcjogdGhpcy5vcHRpb25zLmhpZ2hsaWdodGNvbG9yLAotICAgICAgZW5kY29sb3I6IHRoaXMub3B0aW9ucy5oaWdobGlnaHRlbmRjb2xvciwKLSAgICAgIHJlc3RvcmVjb2xvcjogdGhpcy5vcmlnaW5hbEJhY2tncm91bmQKLSAgICB9KTsKLSAgfSwKLSAgbGVhdmVFZGl0TW9kZTogZnVuY3Rpb24oKSB7Ci0gICAgRWxlbWVudC5yZW1vdmVDbGFzc05hbWUodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuc2F2aW5nQ2xhc3NOYW1lKTsKLSAgICB0aGlzLnJlbW92ZUZvcm0oKTsKLSAgICB0aGlzLmxlYXZlSG92ZXIoKTsKLSAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5vcmlnaW5hbEJhY2tncm91bmQ7Ci0gICAgRWxlbWVudC5zaG93KHRoaXMuZWxlbWVudCk7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpIHsKLSAgICAgIEVsZW1lbnQuc2hvdyh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKTsKLSAgICB9Ci0gICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7Ci0gICAgdGhpcy5zYXZpbmcgPSBmYWxzZTsKLSAgICB0aGlzLm9sZElubmVySFRNTCA9IG51bGw7Ci0gICAgdGhpcy5vbkxlYXZlRWRpdE1vZGUoKTsKLSAgfSwKLSAgb25Db21wbGV0ZTogZnVuY3Rpb24odHJhbnNwb3J0KSB7Ci0gICAgdGhpcy5sZWF2ZUVkaXRNb2RlKCk7Ci0gICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUuYmluZCh0aGlzKSh0cmFuc3BvcnQsIHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0gIG9uRW50ZXJFZGl0TW9kZTogZnVuY3Rpb24oKSB7fSwKLSAgb25MZWF2ZUVkaXRNb2RlOiBmdW5jdGlvbigpIHt9LAotICBkaXNwb3NlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5vbGRJbm5lckhUTUwpIHsKLSAgICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLm9sZElubmVySFRNTDsKLSAgICB9Ci0gICAgdGhpcy5sZWF2ZUVkaXRNb2RlKCk7Ci0gICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmVsZW1lbnQsICdjbGljaycsIHRoaXMub25jbGlja0xpc3RlbmVyKTsKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMuZWxlbWVudCwgJ21vdXNlb3ZlcicsIHRoaXMubW91c2VvdmVyTGlzdGVuZXIpOwotICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy5lbGVtZW50LCAnbW91c2VvdXQnLCB0aGlzLm1vdXNlb3V0TGlzdGVuZXIpOwotICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKSB7Ci0gICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wsICdjbGljaycsIHRoaXMub25jbGlja0xpc3RlbmVyKTsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCwgJ21vdXNlb3ZlcicsIHRoaXMubW91c2VvdmVyTGlzdGVuZXIpOwotICAgICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLCAnbW91c2VvdXQnLCB0aGlzLm1vdXNlb3V0TGlzdGVuZXIpOwotICAgIH0KLSAgfQotfTsKLQotLy8gRGVsYXllZCBvYnNlcnZlciwgbGlrZSBGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIsIAotLy8gYnV0IHdhaXRzIGZvciBkZWxheSBhZnRlciBsYXN0IGtleSBpbnB1dAotLy8gSWRlYWwgZm9yIGxpdmUtc2VhcmNoIGZpZWxkcwotCi1Gb3JtLkVsZW1lbnQuRGVsYXllZE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1Gb3JtLkVsZW1lbnQuRGVsYXllZE9ic2VydmVyLnByb3RvdHlwZSA9IHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgZGVsYXksIGNhbGxiYWNrKSB7Ci0gICAgdGhpcy5kZWxheSAgICAgPSBkZWxheSB8fCAwLjU7Ci0gICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOwotICAgIHRoaXMuY2FsbGJhY2sgID0gY2FsbGJhY2s7Ci0gICAgdGhpcy50aW1lciAgICAgPSBudWxsOwotICAgIHRoaXMubGFzdFZhbHVlID0gJEYodGhpcy5lbGVtZW50KTsgCi0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsJ2tleXVwJyx0aGlzLmRlbGF5ZWRMaXN0ZW5lci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsKLSAgfSwKLSAgZGVsYXllZExpc3RlbmVyOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKHRoaXMubGFzdFZhbHVlID09ICRGKHRoaXMuZWxlbWVudCkpIHJldHVybjsKLSAgICBpZih0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7Ci0gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5kZWxheSAqIDEwMDApOwotICAgIHRoaXMubGFzdFZhbHVlID0gJEYodGhpcy5lbGVtZW50KTsKLSAgfSwKLSAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnRpbWVyID0gbnVsbDsKLSAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgJEYodGhpcy5lbGVtZW50KSk7Ci0gIH0KLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvZHJhZ2Ryb3AuanMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9kcmFnZHJvcC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMWY3My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9kcmFnZHJvcC5qcworKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8gCi0vLyBTZWUgc2NyaXB0YWN1bG91cy5qcyBmb3IgZnVsbCBsaWNlbnNlLgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdmFyIERyb3BwYWJsZXMgPSB7Ci0gIGRyb3BzOiBbXSwKLQotICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB0aGlzLmRyb3BzID0gdGhpcy5kcm9wcy5yZWplY3QoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5lbGVtZW50PT0kKGVsZW1lbnQpIH0pOwotICB9LAotCi0gIGFkZDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBncmVlZHk6ICAgICB0cnVlLAotICAgICAgaG92ZXJjbGFzczogbnVsbCAgCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLQotICAgIC8vIGNhY2hlIGNvbnRhaW5lcnMKLSAgICBpZihvcHRpb25zLmNvbnRhaW5tZW50KSB7Ci0gICAgICBvcHRpb25zLl9jb250YWluZXJzID0gW107Ci0gICAgICB2YXIgY29udGFpbm1lbnQgPSBvcHRpb25zLmNvbnRhaW5tZW50OwotICAgICAgaWYoKHR5cGVvZiBjb250YWlubWVudCA9PSAnb2JqZWN0JykgJiYgCi0gICAgICAgIChjb250YWlubWVudC5jb25zdHJ1Y3RvciA9PSBBcnJheSkpIHsKLSAgICAgICAgY29udGFpbm1lbnQuZWFjaCggZnVuY3Rpb24oYykgeyBvcHRpb25zLl9jb250YWluZXJzLnB1c2goJChjKSkgfSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvcHRpb25zLl9jb250YWluZXJzLnB1c2goJChjb250YWlubWVudCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZihvcHRpb25zLmFjY2VwdCkgb3B0aW9ucy5hY2NlcHQgPSBbb3B0aW9ucy5hY2NlcHRdLmZsYXR0ZW4oKTsKLQotICAgIEVsZW1lbnQubWFrZVBvc2l0aW9uZWQoZWxlbWVudCk7IC8vIGZpeCBJRQotICAgIG9wdGlvbnMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLSAgICB0aGlzLmRyb3BzLnB1c2gob3B0aW9ucyk7Ci0gIH0sCi0KLSAgaXNDb250YWluZWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGRyb3ApIHsKLSAgICB2YXIgcGFyZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTsKLSAgICByZXR1cm4gZHJvcC5fY29udGFpbmVycy5kZXRlY3QoZnVuY3Rpb24oYykgeyByZXR1cm4gcGFyZW50Tm9kZSA9PSBjIH0pOwotICB9LAotCi0gIGlzQWZmZWN0ZWQ6IGZ1bmN0aW9uKHBvaW50LCBlbGVtZW50LCBkcm9wKSB7Ci0gICAgcmV0dXJuICgKLSAgICAgIChkcm9wLmVsZW1lbnQhPWVsZW1lbnQpICYmCi0gICAgICAoKCFkcm9wLl9jb250YWluZXJzKSB8fAotICAgICAgICB0aGlzLmlzQ29udGFpbmVkKGVsZW1lbnQsIGRyb3ApKSAmJgotICAgICAgKCghZHJvcC5hY2NlcHQpIHx8Ci0gICAgICAgIChFbGVtZW50LmNsYXNzTmFtZXMoZWxlbWVudCkuZGV0ZWN0KCAKLSAgICAgICAgICBmdW5jdGlvbih2KSB7IHJldHVybiBkcm9wLmFjY2VwdC5pbmNsdWRlKHYpIH0gKSApKSAmJgotICAgICAgUG9zaXRpb24ud2l0aGluKGRyb3AuZWxlbWVudCwgcG9pbnRbMF0sIHBvaW50WzFdKSApOwotICB9LAotCi0gIGRlYWN0aXZhdGU6IGZ1bmN0aW9uKGRyb3ApIHsKLSAgICBpZihkcm9wLmhvdmVyY2xhc3MpCi0gICAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZShkcm9wLmVsZW1lbnQsIGRyb3AuaG92ZXJjbGFzcyk7Ci0gICAgdGhpcy5sYXN0X2FjdGl2ZSA9IG51bGw7Ci0gIH0sCi0KLSAgYWN0aXZhdGU6IGZ1bmN0aW9uKGRyb3ApIHsKLSAgICBpZihkcm9wLmhvdmVyY2xhc3MpCi0gICAgICBFbGVtZW50LmFkZENsYXNzTmFtZShkcm9wLmVsZW1lbnQsIGRyb3AuaG92ZXJjbGFzcyk7Ci0gICAgdGhpcy5sYXN0X2FjdGl2ZSA9IGRyb3A7Ci0gIH0sCi0KLSAgc2hvdzogZnVuY3Rpb24ocG9pbnQsIGVsZW1lbnQpIHsKLSAgICBpZighdGhpcy5kcm9wcy5sZW5ndGgpIHJldHVybjsKLSAgICAKLSAgICBpZih0aGlzLmxhc3RfYWN0aXZlKSB0aGlzLmRlYWN0aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7Ci0gICAgdGhpcy5kcm9wcy5lYWNoKCBmdW5jdGlvbihkcm9wKSB7Ci0gICAgICBpZihEcm9wcGFibGVzLmlzQWZmZWN0ZWQocG9pbnQsIGVsZW1lbnQsIGRyb3ApKSB7Ci0gICAgICAgIGlmKGRyb3Aub25Ib3ZlcikKLSAgICAgICAgICAgZHJvcC5vbkhvdmVyKGVsZW1lbnQsIGRyb3AuZWxlbWVudCwgUG9zaXRpb24ub3ZlcmxhcChkcm9wLm92ZXJsYXAsIGRyb3AuZWxlbWVudCkpOwotICAgICAgICBpZihkcm9wLmdyZWVkeSkgeyAKLSAgICAgICAgICBEcm9wcGFibGVzLmFjdGl2YXRlKGRyb3ApOwotICAgICAgICAgIHRocm93ICRicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIGZpcmU6IGZ1bmN0aW9uKGV2ZW50LCBlbGVtZW50KSB7Ci0gICAgaWYoIXRoaXMubGFzdF9hY3RpdmUpIHJldHVybjsKLSAgICBQb3NpdGlvbi5wcmVwYXJlKCk7Ci0KLSAgICBpZiAodGhpcy5pc0FmZmVjdGVkKFtFdmVudC5wb2ludGVyWChldmVudCksIEV2ZW50LnBvaW50ZXJZKGV2ZW50KV0sIGVsZW1lbnQsIHRoaXMubGFzdF9hY3RpdmUpKQotICAgICAgaWYgKHRoaXMubGFzdF9hY3RpdmUub25Ecm9wKSAKLSAgICAgICAgdGhpcy5sYXN0X2FjdGl2ZS5vbkRyb3AoZWxlbWVudCwgdGhpcy5sYXN0X2FjdGl2ZS5lbGVtZW50LCBldmVudCk7Ci0gIH0sCi0KLSAgcmVzZXQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMubGFzdF9hY3RpdmUpCi0gICAgICB0aGlzLmRlYWN0aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7Ci0gIH0KLX0KLQotdmFyIERyYWdnYWJsZXMgPSB7Ci0gIGRyYWdzOiBbXSwKLSAgb2JzZXJ2ZXJzOiBbXSwKLSAgCi0gIHJlZ2lzdGVyOiBmdW5jdGlvbihkcmFnZ2FibGUpIHsKLSAgICBpZih0aGlzLmRyYWdzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICB0aGlzLmV2ZW50TW91c2VVcCAgID0gdGhpcy5lbmREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICB0aGlzLmV2ZW50TW91c2VNb3ZlID0gdGhpcy51cGRhdGVEcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICB0aGlzLmV2ZW50S2V5cHJlc3MgID0gdGhpcy5rZXlQcmVzcy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBFdmVudC5vYnNlcnZlKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMuZXZlbnRLZXlwcmVzcyk7Ci0gICAgfQotICAgIHRoaXMuZHJhZ3MucHVzaChkcmFnZ2FibGUpOwotICB9LAotICAKLSAgdW5yZWdpc3RlcjogZnVuY3Rpb24oZHJhZ2dhYmxlKSB7Ci0gICAgdGhpcy5kcmFncyA9IHRoaXMuZHJhZ3MucmVqZWN0KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ9PWRyYWdnYWJsZSB9KTsKLSAgICBpZih0aGlzLmRyYWdzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMuZXZlbnRLZXlwcmVzcyk7Ci0gICAgfQotICB9LAotICAKLSAgYWN0aXZhdGU6IGZ1bmN0aW9uKGRyYWdnYWJsZSkgewotICAgIHdpbmRvdy5mb2N1cygpOyAvLyBhbGxvd3Mga2V5cHJlc3MgZXZlbnRzIGlmIHdpbmRvdyBpc24ndCBjdXJyZW50bHkgZm9jdXNlZCwgZmFpbHMgZm9yIFNhZmFyaQotICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlID0gZHJhZ2dhYmxlOwotICB9LAotICAKLSAgZGVhY3RpdmF0ZTogZnVuY3Rpb24oZHJhZ2diYWxlKSB7Ci0gICAgdGhpcy5hY3RpdmVEcmFnZ2FibGUgPSBudWxsOwotICB9LAotICAKLSAgdXBkYXRlRHJhZzogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZighdGhpcy5hY3RpdmVEcmFnZ2FibGUpIHJldHVybjsKLSAgICB2YXIgcG9pbnRlciA9IFtFdmVudC5wb2ludGVyWChldmVudCksIEV2ZW50LnBvaW50ZXJZKGV2ZW50KV07Ci0gICAgLy8gTW96aWxsYS1iYXNlZCBicm93c2VycyBmaXJlIHN1Y2Nlc3NpdmUgbW91c2Vtb3ZlIGV2ZW50cyB3aXRoCi0gICAgLy8gdGhlIHNhbWUgY29vcmRpbmF0ZXMsIHByZXZlbnQgbmVlZGxlc3MgcmVkcmF3aW5nIChtb3ogYnVnPykKLSAgICBpZih0aGlzLl9sYXN0UG9pbnRlciAmJiAodGhpcy5fbGFzdFBvaW50ZXIuaW5zcGVjdCgpID09IHBvaW50ZXIuaW5zcGVjdCgpKSkgcmV0dXJuOwotICAgIHRoaXMuX2xhc3RQb2ludGVyID0gcG9pbnRlcjsKLSAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZS51cGRhdGVEcmFnKGV2ZW50LCBwb2ludGVyKTsKLSAgfSwKLSAgCi0gIGVuZERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYoIXRoaXMuYWN0aXZlRHJhZ2dhYmxlKSByZXR1cm47Ci0gICAgdGhpcy5fbGFzdFBvaW50ZXIgPSBudWxsOwotICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlLmVuZERyYWcoZXZlbnQpOwotICB9LAotICAKLSAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYodGhpcy5hY3RpdmVEcmFnZ2FibGUpCi0gICAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZS5rZXlQcmVzcyhldmVudCk7Ci0gIH0sCi0gIAotICBhZGRPYnNlcnZlcjogZnVuY3Rpb24ob2JzZXJ2ZXIpIHsKLSAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTsKLSAgICB0aGlzLl9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzKCk7Ci0gIH0sCi0gIAotICByZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24oZWxlbWVudCkgeyAgLy8gZWxlbWVudCBpbnN0ZWFkIG9mIG9ic2VydmVyIGZpeGVzIG1lbSBsZWFrcwotICAgIHRoaXMub2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMucmVqZWN0KCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmVsZW1lbnQ9PWVsZW1lbnQgfSk7Ci0gICAgdGhpcy5fY2FjaGVPYnNlcnZlckNhbGxiYWNrcygpOwotICB9LAotICAKLSAgbm90aWZ5OiBmdW5jdGlvbihldmVudE5hbWUsIGRyYWdnYWJsZSwgZXZlbnQpIHsgIC8vICdvblN0YXJ0JywgJ29uRW5kJywgJ29uRHJhZycKLSAgICBpZih0aGlzW2V2ZW50TmFtZSsnQ291bnQnXSA+IDApCi0gICAgICB0aGlzLm9ic2VydmVycy5lYWNoKCBmdW5jdGlvbihvKSB7Ci0gICAgICAgIGlmKG9bZXZlbnROYW1lXSkgb1tldmVudE5hbWVdKGV2ZW50TmFtZSwgZHJhZ2dhYmxlLCBldmVudCk7Ci0gICAgICB9KTsKLSAgfSwKLSAgCi0gIF9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsKLSAgICBbJ29uU3RhcnQnLCdvbkVuZCcsJ29uRHJhZyddLmVhY2goIGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgICAgRHJhZ2dhYmxlc1tldmVudE5hbWUrJ0NvdW50J10gPSBEcmFnZ2FibGVzLm9ic2VydmVycy5zZWxlY3QoCi0gICAgICAgIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG9bZXZlbnROYW1lXTsgfQotICAgICAgKS5sZW5ndGg7Ci0gICAgfSk7Ci0gIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZhciBEcmFnZ2FibGUgPSBDbGFzcy5jcmVhdGUoKTsKLURyYWdnYWJsZS5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgaGFuZGxlOiBmYWxzZSwKLSAgICAgIHN0YXJ0ZWZmZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7IAotICAgICAgICBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwge2R1cmF0aW9uOjAuMiwgZnJvbToxLjAsIHRvOjAuN30pOyAKLSAgICAgIH0sCi0gICAgICByZXZlcnRlZmZlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQsIHRvcF9vZmZzZXQsIGxlZnRfb2Zmc2V0KSB7Ci0gICAgICAgIHZhciBkdXIgPSBNYXRoLnNxcnQoTWF0aC5hYnModG9wX29mZnNldF4yKStNYXRoLmFicyhsZWZ0X29mZnNldF4yKSkqMC4wMjsKLSAgICAgICAgZWxlbWVudC5fcmV2ZXJ0ID0gbmV3IEVmZmVjdC5Nb3ZlQnkoZWxlbWVudCwgLXRvcF9vZmZzZXQsIC1sZWZ0X29mZnNldCwge2R1cmF0aW9uOmR1cn0pOwotICAgICAgfSwKLSAgICAgIGVuZGVmZmVjdDogZnVuY3Rpb24oZWxlbWVudCkgeyAKLSAgICAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHtkdXJhdGlvbjowLjIsIGZyb206MC43LCB0bzoxLjB9KTsgCi0gICAgICB9LAotICAgICAgemluZGV4OiAxMDAwLAotICAgICAgcmV2ZXJ0OiBmYWxzZSwKLSAgICAgIHNuYXA6IGZhbHNlICAgLy8gZmFsc2UsIG9yIHh5IG9yIFt4LHldIG9yIGZ1bmN0aW9uKHgseSl7IHJldHVybiBbeCx5XSB9Ci0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLQotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgCi0gICAgaWYob3B0aW9ucy5oYW5kbGUgJiYgKHR5cGVvZiBvcHRpb25zLmhhbmRsZSA9PSAnc3RyaW5nJykpCi0gICAgICB0aGlzLmhhbmRsZSA9IEVsZW1lbnQuY2hpbGRyZW5XaXRoQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgb3B0aW9ucy5oYW5kbGUpWzBdOyAgCi0gICAgaWYoIXRoaXMuaGFuZGxlKSB0aGlzLmhhbmRsZSA9ICQob3B0aW9ucy5oYW5kbGUpOwotICAgIGlmKCF0aGlzLmhhbmRsZSkgdGhpcy5oYW5kbGUgPSB0aGlzLmVsZW1lbnQ7Ci0KLSAgICBFbGVtZW50Lm1ha2VQb3NpdGlvbmVkKHRoaXMuZWxlbWVudCk7IC8vIGZpeCBJRSAgICAKLQotICAgIHRoaXMuZGVsdGEgICAgPSB0aGlzLmN1cnJlbnREZWx0YSgpOwotICAgIHRoaXMub3B0aW9ucyAgPSBvcHRpb25zOwotICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsgICAKLQotICAgIHRoaXMuZXZlbnRNb3VzZURvd24gPSB0aGlzLmluaXREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmhhbmRsZSwgIm1vdXNlZG93biIsIHRoaXMuZXZlbnRNb3VzZURvd24pOwotICAgIAotICAgIERyYWdnYWJsZXMucmVnaXN0ZXIodGhpcyk7Ci0gIH0sCi0gIAotICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMuaGFuZGxlLCAibW91c2Vkb3duIiwgdGhpcy5ldmVudE1vdXNlRG93bik7Ci0gICAgRHJhZ2dhYmxlcy51bnJlZ2lzdGVyKHRoaXMpOwotICB9LAotICAKLSAgY3VycmVudERlbHRhOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4oWwotICAgICAgcGFyc2VJbnQodGhpcy5lbGVtZW50LnN0eWxlLmxlZnQgfHwgJzAnKSwKLSAgICAgIHBhcnNlSW50KHRoaXMuZWxlbWVudC5zdHlsZS50b3AgfHwgJzAnKV0pOwotICB9LAotICAKLSAgaW5pdERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYoRXZlbnQuaXNMZWZ0Q2xpY2soZXZlbnQpKSB7ICAgIAotICAgICAgLy8gYWJvcnQgb24gZm9ybSBlbGVtZW50cywgZml4ZXMgYSBGaXJlZm94IGlzc3VlCi0gICAgICB2YXIgc3JjID0gRXZlbnQuZWxlbWVudChldmVudCk7Ci0gICAgICBpZihzcmMudGFnTmFtZSAmJiAoCi0gICAgICAgIHNyYy50YWdOYW1lPT0nSU5QVVQnIHx8Ci0gICAgICAgIHNyYy50YWdOYW1lPT0nU0VMRUNUJyB8fAotICAgICAgICBzcmMudGFnTmFtZT09J0JVVFRPTicgfHwKLSAgICAgICAgc3JjLnRhZ05hbWU9PSdURVhUQVJFQScpKSByZXR1cm47Ci0gICAgICAgIAotICAgICAgaWYodGhpcy5lbGVtZW50Ll9yZXZlcnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50Ll9yZXZlcnQuY2FuY2VsKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5fcmV2ZXJ0ID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdmFyIHBvaW50ZXIgPSBbRXZlbnQucG9pbnRlclgoZXZlbnQpLCBFdmVudC5wb2ludGVyWShldmVudCldOwotICAgICAgdmFyIHBvcyAgICAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuZWxlbWVudCk7Ci0gICAgICB0aGlzLm9mZnNldCA9IFswLDFdLm1hcCggZnVuY3Rpb24oaSkgeyByZXR1cm4gKHBvaW50ZXJbaV0gLSBwb3NbaV0pIH0pOwotICAgICAgCi0gICAgICBEcmFnZ2FibGVzLmFjdGl2YXRlKHRoaXMpOwotICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgfQotICB9LAotICAKLSAgc3RhcnREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlOwotICAgIAotICAgIGlmKHRoaXMub3B0aW9ucy56aW5kZXgpIHsKLSAgICAgIHRoaXMub3JpZ2luYWxaID0gcGFyc2VJbnQoRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ3otaW5kZXgnKSB8fCAwKTsKLSAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS56SW5kZXggPSB0aGlzLm9wdGlvbnMuemluZGV4OwotICAgIH0KLSAgICAKLSAgICBpZih0aGlzLm9wdGlvbnMuZ2hvc3RpbmcpIHsKLSAgICAgIHRoaXMuX2Nsb25lID0gdGhpcy5lbGVtZW50LmNsb25lTm9kZSh0cnVlKTsKLSAgICAgIFBvc2l0aW9uLmFic29sdXRpemUodGhpcy5lbGVtZW50KTsKLSAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLl9jbG9uZSwgdGhpcy5lbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gICAgRHJhZ2dhYmxlcy5ub3RpZnkoJ29uU3RhcnQnLCB0aGlzLCBldmVudCk7Ci0gICAgaWYodGhpcy5vcHRpb25zLnN0YXJ0ZWZmZWN0KSB0aGlzLm9wdGlvbnMuc3RhcnRlZmZlY3QodGhpcy5lbGVtZW50KTsKLSAgfSwKLSAgCi0gIHVwZGF0ZURyYWc6IGZ1bmN0aW9uKGV2ZW50LCBwb2ludGVyKSB7Ci0gICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHRoaXMuc3RhcnREcmFnKGV2ZW50KTsKLSAgICBQb3NpdGlvbi5wcmVwYXJlKCk7Ci0gICAgRHJvcHBhYmxlcy5zaG93KHBvaW50ZXIsIHRoaXMuZWxlbWVudCk7Ci0gICAgRHJhZ2dhYmxlcy5ub3RpZnkoJ29uRHJhZycsIHRoaXMsIGV2ZW50KTsKLSAgICB0aGlzLmRyYXcocG9pbnRlcik7Ci0gICAgaWYodGhpcy5vcHRpb25zLmNoYW5nZSkgdGhpcy5vcHRpb25zLmNoYW5nZSh0aGlzKTsKLSAgICAKLSAgICAvLyBmaXggQXBwbGVXZWJLaXQgcmVuZGVyaW5nCi0gICAgaWYobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignQXBwbGVXZWJLaXQnKT4wKSB3aW5kb3cuc2Nyb2xsQnkoMCwwKTsKLSAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgfSwKLSAgCi0gIGZpbmlzaERyYWc6IGZ1bmN0aW9uKGV2ZW50LCBzdWNjZXNzKSB7Ci0gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOwotCi0gICAgaWYodGhpcy5vcHRpb25zLmdob3N0aW5nKSB7Ci0gICAgICBQb3NpdGlvbi5yZWxhdGl2aXplKHRoaXMuZWxlbWVudCk7Ci0gICAgICBFbGVtZW50LnJlbW92ZSh0aGlzLl9jbG9uZSk7Ci0gICAgICB0aGlzLl9jbG9uZSA9IG51bGw7Ci0gICAgfQotCi0gICAgaWYoc3VjY2VzcykgRHJvcHBhYmxlcy5maXJlKGV2ZW50LCB0aGlzLmVsZW1lbnQpOwotICAgIERyYWdnYWJsZXMubm90aWZ5KCdvbkVuZCcsIHRoaXMsIGV2ZW50KTsKLQotICAgIHZhciByZXZlcnQgPSB0aGlzLm9wdGlvbnMucmV2ZXJ0OwotICAgIGlmKHJldmVydCAmJiB0eXBlb2YgcmV2ZXJ0ID09ICdmdW5jdGlvbicpIHJldmVydCA9IHJldmVydCh0aGlzLmVsZW1lbnQpOwotICAgIAotICAgIHZhciBkID0gdGhpcy5jdXJyZW50RGVsdGEoKTsKLSAgICBpZihyZXZlcnQgJiYgdGhpcy5vcHRpb25zLnJldmVydGVmZmVjdCkgewotICAgICAgdGhpcy5vcHRpb25zLnJldmVydGVmZmVjdCh0aGlzLmVsZW1lbnQsIAotICAgICAgICBkWzFdLXRoaXMuZGVsdGFbMV0sIGRbMF0tdGhpcy5kZWx0YVswXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuZGVsdGEgPSBkOwotICAgIH0KLQotICAgIGlmKHRoaXMub3B0aW9ucy56aW5kZXgpCi0gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gdGhpcy5vcmlnaW5hbFo7Ci0KLSAgICBpZih0aGlzLm9wdGlvbnMuZW5kZWZmZWN0KSAKLSAgICAgIHRoaXMub3B0aW9ucy5lbmRlZmZlY3QodGhpcy5lbGVtZW50KTsKLQotICAgIERyYWdnYWJsZXMuZGVhY3RpdmF0ZSh0aGlzKTsKLSAgICBEcm9wcGFibGVzLnJlc2V0KCk7Ci0gIH0sCi0gIAotICBrZXlQcmVzczogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZighZXZlbnQua2V5Q29kZT09RXZlbnQuS0VZX0VTQykgcmV0dXJuOwotICAgIHRoaXMuZmluaXNoRHJhZyhldmVudCwgZmFsc2UpOwotICAgIEV2ZW50LnN0b3AoZXZlbnQpOwotICB9LAotICAKLSAgZW5kRHJhZzogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZighdGhpcy5kcmFnZ2luZykgcmV0dXJuOwotICAgIHRoaXMuZmluaXNoRHJhZyhldmVudCwgdHJ1ZSk7Ci0gICAgRXZlbnQuc3RvcChldmVudCk7Ci0gIH0sCi0gIAotICBkcmF3OiBmdW5jdGlvbihwb2ludCkgewotICAgIHZhciBwb3MgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuZWxlbWVudCk7Ci0gICAgdmFyIGQgPSB0aGlzLmN1cnJlbnREZWx0YSgpOwotICAgIHBvc1swXSAtPSBkWzBdOyBwb3NbMV0gLT0gZFsxXTsKLSAgICAKLSAgICB2YXIgcCA9IFswLDFdLm1hcChmdW5jdGlvbihpKXsgcmV0dXJuIChwb2ludFtpXS1wb3NbaV0tdGhpcy5vZmZzZXRbaV0pIH0uYmluZCh0aGlzKSk7Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLnNuYXApIHsKLSAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMuc25hcCA9PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAgIHAgPSB0aGlzLm9wdGlvbnMuc25hcChwWzBdLHBbMV0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgIGlmKHRoaXMub3B0aW9ucy5zbmFwIGluc3RhbmNlb2YgQXJyYXkpIHsKLSAgICAgICAgcCA9IHAubWFwKCBmdW5jdGlvbih2LCBpKSB7Ci0gICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodi90aGlzLm9wdGlvbnMuc25hcFtpXSkqdGhpcy5vcHRpb25zLnNuYXBbaV0gfS5iaW5kKHRoaXMpKQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcCA9IHAubWFwKCBmdW5jdGlvbih2KSB7Ci0gICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodi90aGlzLm9wdGlvbnMuc25hcCkqdGhpcy5vcHRpb25zLnNuYXAgfS5iaW5kKHRoaXMpKQotICAgICAgfQotICAgIH19Ci0gICAgCi0gICAgdmFyIHN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlOwotICAgIGlmKCghdGhpcy5vcHRpb25zLmNvbnN0cmFpbnQpIHx8ICh0aGlzLm9wdGlvbnMuY29uc3RyYWludD09J2hvcml6b250YWwnKSkKLSAgICAgIHN0eWxlLmxlZnQgPSBwWzBdICsgInB4IjsKLSAgICBpZigoIXRoaXMub3B0aW9ucy5jb25zdHJhaW50KSB8fCAodGhpcy5vcHRpb25zLmNvbnN0cmFpbnQ9PSd2ZXJ0aWNhbCcpKQotICAgICAgc3R5bGUudG9wICA9IHBbMV0gKyAicHgiOwotICAgIGlmKHN0eWxlLnZpc2liaWxpdHk9PSJoaWRkZW4iKSBzdHlsZS52aXNpYmlsaXR5ID0gIiI7IC8vIGZpeCBnZWNrbyByZW5kZXJpbmcKLSAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdmFyIFNvcnRhYmxlT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKLVNvcnRhYmxlT2JzZXJ2ZXIucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBvYnNlcnZlcikgewotICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsKLSAgICB0aGlzLm9ic2VydmVyICA9IG9ic2VydmVyOwotICAgIHRoaXMubGFzdFZhbHVlID0gU29ydGFibGUuc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0gIAotICBvblN0YXJ0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxhc3RWYWx1ZSA9IFNvcnRhYmxlLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOwotICB9LAotICAKLSAgb25FbmQ6IGZ1bmN0aW9uKCkgewotICAgIFNvcnRhYmxlLnVubWFyaygpOwotICAgIGlmKHRoaXMubGFzdFZhbHVlICE9IFNvcnRhYmxlLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpKQotICAgICAgdGhpcy5vYnNlcnZlcih0aGlzLmVsZW1lbnQpCi0gIH0KLX0KLQotdmFyIFNvcnRhYmxlID0gewotICBzb3J0YWJsZXM6IG5ldyBBcnJheSgpLAotICAKLSAgb3B0aW9uczogZnVuY3Rpb24oZWxlbWVudCl7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgcmV0dXJuIHRoaXMuc29ydGFibGVzLmRldGVjdChmdW5jdGlvbihzKSB7IHJldHVybiBzLmVsZW1lbnQgPT0gZWxlbWVudCB9KTsKLSAgfSwKLSAgCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKGVsZW1lbnQpewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHRoaXMuc29ydGFibGVzLmZpbmRBbGwoZnVuY3Rpb24ocykgeyByZXR1cm4gcy5lbGVtZW50ID09IGVsZW1lbnQgfSkuZWFjaChmdW5jdGlvbihzKXsKLSAgICAgIERyYWdnYWJsZXMucmVtb3ZlT2JzZXJ2ZXIocy5lbGVtZW50KTsKLSAgICAgIHMuZHJvcHBhYmxlcy5lYWNoKGZ1bmN0aW9uKGQpeyBEcm9wcGFibGVzLnJlbW92ZShkKSB9KTsKLSAgICAgIHMuZHJhZ2dhYmxlcy5pbnZva2UoJ2Rlc3Ryb3knKTsKLSAgICB9KTsKLSAgICB0aGlzLnNvcnRhYmxlcyA9IHRoaXMuc29ydGFibGVzLnJlamVjdChmdW5jdGlvbihzKSB7IHJldHVybiBzLmVsZW1lbnQgPT0gZWxlbWVudCB9KTsKLSAgfSwKLSAgCi0gIGNyZWF0ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IAotICAgICAgZWxlbWVudDogICAgIGVsZW1lbnQsCi0gICAgICB0YWc6ICAgICAgICAgJ2xpJywgICAgICAgLy8gYXNzdW1lcyBsaSBjaGlsZHJlbiwgb3ZlcnJpZGUgd2l0aCB0YWc6ICd0YWduYW1lJwotICAgICAgZHJvcE9uRW1wdHk6IGZhbHNlLAotICAgICAgdHJlZTogICAgICAgIGZhbHNlLCAgICAgIC8vIGZpeG1lOiB1bmltcGxlbWVudGVkCi0gICAgICBvdmVybGFwOiAgICAgJ3ZlcnRpY2FsJywgLy8gb25lIG9mICd2ZXJ0aWNhbCcsICdob3Jpem9udGFsJwotICAgICAgY29uc3RyYWludDogICd2ZXJ0aWNhbCcsIC8vIG9uZSBvZiAndmVydGljYWwnLCAnaG9yaXpvbnRhbCcsIGZhbHNlCi0gICAgICBjb250YWlubWVudDogZWxlbWVudCwgICAgLy8gYWxzbyB0YWtlcyBhcnJheSBvZiBlbGVtZW50cyAob3IgaWQncyk7IG9yIGZhbHNlCi0gICAgICBoYW5kbGU6ICAgICAgZmFsc2UsICAgICAgLy8gb3IgYSBDU1MgY2xhc3MKLSAgICAgIG9ubHk6ICAgICAgICBmYWxzZSwKLSAgICAgIGhvdmVyY2xhc3M6ICBudWxsLAotICAgICAgZ2hvc3Rpbmc6ICAgIGZhbHNlLAotICAgICAgZm9ybWF0OiAgICAgIG51bGwsCi0gICAgICBvbkNoYW5nZTogICAgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sCi0gICAgICBvblVwZGF0ZTogICAgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24KLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotCi0gICAgLy8gY2xlYXIgYW55IG9sZCBzb3J0YWJsZSB3aXRoIHNhbWUgZWxlbWVudAotICAgIHRoaXMuZGVzdHJveShlbGVtZW50KTsKLQotICAgIC8vIGJ1aWxkIG9wdGlvbnMgZm9yIHRoZSBkcmFnZ2FibGVzCi0gICAgdmFyIG9wdGlvbnNfZm9yX2RyYWdnYWJsZSA9IHsKLSAgICAgIHJldmVydDogICAgICB0cnVlLAotICAgICAgZ2hvc3Rpbmc6ICAgIG9wdGlvbnMuZ2hvc3RpbmcsCi0gICAgICBjb25zdHJhaW50OiAgb3B0aW9ucy5jb25zdHJhaW50LAotICAgICAgaGFuZGxlOiAgICAgIG9wdGlvbnMuaGFuZGxlIH07Ci0KLSAgICBpZihvcHRpb25zLnN0YXJ0ZWZmZWN0KQotICAgICAgb3B0aW9uc19mb3JfZHJhZ2dhYmxlLnN0YXJ0ZWZmZWN0ID0gb3B0aW9ucy5zdGFydGVmZmVjdDsKLQotICAgIGlmKG9wdGlvbnMucmV2ZXJ0ZWZmZWN0KQotICAgICAgb3B0aW9uc19mb3JfZHJhZ2dhYmxlLnJldmVydGVmZmVjdCA9IG9wdGlvbnMucmV2ZXJ0ZWZmZWN0OwotICAgIGVsc2UKLSAgICAgIGlmKG9wdGlvbnMuZ2hvc3RpbmcpIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS5yZXZlcnRlZmZlY3QgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wICA9IDA7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IDA7Ci0gICAgICB9OwotCi0gICAgaWYob3B0aW9ucy5lbmRlZmZlY3QpCi0gICAgICBvcHRpb25zX2Zvcl9kcmFnZ2FibGUuZW5kZWZmZWN0ID0gb3B0aW9ucy5lbmRlZmZlY3Q7Ci0KLSAgICBpZihvcHRpb25zLnppbmRleCkKLSAgICAgIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS56aW5kZXggPSBvcHRpb25zLnppbmRleDsKLQotICAgIC8vIGJ1aWxkIG9wdGlvbnMgZm9yIHRoZSBkcm9wcGFibGVzICAKLSAgICB2YXIgb3B0aW9uc19mb3JfZHJvcHBhYmxlID0gewotICAgICAgb3ZlcmxhcDogICAgIG9wdGlvbnMub3ZlcmxhcCwKLSAgICAgIGNvbnRhaW5tZW50OiBvcHRpb25zLmNvbnRhaW5tZW50LAotICAgICAgaG92ZXJjbGFzczogIG9wdGlvbnMuaG92ZXJjbGFzcywKLSAgICAgIG9uSG92ZXI6ICAgICBTb3J0YWJsZS5vbkhvdmVyLAotICAgICAgZ3JlZWR5OiAgICAgICFvcHRpb25zLmRyb3BPbkVtcHR5Ci0gICAgfQotCi0gICAgLy8gZml4IGZvciBnZWNrbyBlbmdpbmUKLSAgICBFbGVtZW50LmNsZWFuV2hpdGVzcGFjZShlbGVtZW50KTsgCi0KLSAgICBvcHRpb25zLmRyYWdnYWJsZXMgPSBbXTsKLSAgICBvcHRpb25zLmRyb3BwYWJsZXMgPSBbXTsKLQotICAgIC8vIG1ha2UgaXQgc28KLQotICAgIC8vIGRyb3Agb24gZW1wdHkgaGFuZGxpbmcKLSAgICBpZihvcHRpb25zLmRyb3BPbkVtcHR5KSB7Ci0gICAgICBEcm9wcGFibGVzLmFkZChlbGVtZW50LAotICAgICAgICB7Y29udGFpbm1lbnQ6IG9wdGlvbnMuY29udGFpbm1lbnQsIG9uSG92ZXI6IFNvcnRhYmxlLm9uRW1wdHlIb3ZlciwgZ3JlZWR5OiBmYWxzZX0pOwotICAgICAgb3B0aW9ucy5kcm9wcGFibGVzLnB1c2goZWxlbWVudCk7Ci0gICAgfQotCi0gICAgKHRoaXMuZmluZEVsZW1lbnRzKGVsZW1lbnQsIG9wdGlvbnMpIHx8IFtdKS5lYWNoKCBmdW5jdGlvbihlKSB7Ci0gICAgICAvLyBoYW5kbGVzIGFyZSBwZXItZHJhZ2dhYmxlCi0gICAgICB2YXIgaGFuZGxlID0gb3B0aW9ucy5oYW5kbGUgPyAKLSAgICAgICAgRWxlbWVudC5jaGlsZHJlbldpdGhDbGFzc05hbWUoZSwgb3B0aW9ucy5oYW5kbGUpWzBdIDogZTsgICAgCi0gICAgICBvcHRpb25zLmRyYWdnYWJsZXMucHVzaCgKLSAgICAgICAgbmV3IERyYWdnYWJsZShlLCBPYmplY3QuZXh0ZW5kKG9wdGlvbnNfZm9yX2RyYWdnYWJsZSwgeyBoYW5kbGU6IGhhbmRsZSB9KSkpOwotICAgICAgRHJvcHBhYmxlcy5hZGQoZSwgb3B0aW9uc19mb3JfZHJvcHBhYmxlKTsKLSAgICAgIG9wdGlvbnMuZHJvcHBhYmxlcy5wdXNoKGUpOyAgICAgIAotICAgIH0pOwotCi0gICAgLy8ga2VlcCByZWZlcmVuY2UKLSAgICB0aGlzLnNvcnRhYmxlcy5wdXNoKG9wdGlvbnMpOwotCi0gICAgLy8gZm9yIG9udXBkYXRlCi0gICAgRHJhZ2dhYmxlcy5hZGRPYnNlcnZlcihuZXcgU29ydGFibGVPYnNlcnZlcihlbGVtZW50LCBvcHRpb25zLm9uVXBkYXRlKSk7Ci0KLSAgfSwKLQotICAvLyByZXR1cm4gYWxsIHN1aXRhYmxlLWZvci1zb3J0YWJsZSBlbGVtZW50cyBpbiBhIGd1YXJhbnRlZWQgb3JkZXIKLSAgZmluZEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7Ci0gICAgaWYoIWVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSByZXR1cm4gbnVsbDsKLSAgICB2YXIgZWxlbWVudHMgPSBbXTsKLSAgICAkQShlbGVtZW50LmNoaWxkTm9kZXMpLmVhY2goIGZ1bmN0aW9uKGUpIHsKLSAgICAgIGlmKGUudGFnTmFtZSAmJiBlLnRhZ05hbWUudG9VcHBlckNhc2UoKT09b3B0aW9ucy50YWcudG9VcHBlckNhc2UoKSAmJgotICAgICAgICAoIW9wdGlvbnMub25seSB8fCAoRWxlbWVudC5oYXNDbGFzc05hbWUoZSwgb3B0aW9ucy5vbmx5KSkpKQotICAgICAgICAgIGVsZW1lbnRzLnB1c2goZSk7Ci0gICAgICBpZihvcHRpb25zLnRyZWUpIHsKLSAgICAgICAgdmFyIGdyYW5kY2hpbGRyZW4gPSB0aGlzLmZpbmRFbGVtZW50cyhlLCBvcHRpb25zKTsKLSAgICAgICAgaWYoZ3JhbmRjaGlsZHJlbikgZWxlbWVudHMucHVzaChncmFuZGNoaWxkcmVuKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiAoZWxlbWVudHMubGVuZ3RoPjAgPyBlbGVtZW50cy5mbGF0dGVuKCkgOiBudWxsKTsKLSAgfSwKLQotICBvbkhvdmVyOiBmdW5jdGlvbihlbGVtZW50LCBkcm9wb24sIG92ZXJsYXApIHsKLSAgICBpZihvdmVybGFwPjAuNSkgewotICAgICAgU29ydGFibGUubWFyayhkcm9wb24sICdiZWZvcmUnKTsKLSAgICAgIGlmKGRyb3Bvbi5wcmV2aW91c1NpYmxpbmcgIT0gZWxlbWVudCkgewotICAgICAgICB2YXIgb2xkUGFyZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTsKLSAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IC8vIGZpeCBnZWNrbyByZW5kZXJpbmcKLSAgICAgICAgZHJvcG9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGRyb3Bvbik7Ci0gICAgICAgIGlmKGRyb3Bvbi5wYXJlbnROb2RlIT1vbGRQYXJlbnROb2RlKSAKLSAgICAgICAgICBTb3J0YWJsZS5vcHRpb25zKG9sZFBhcmVudE5vZGUpLm9uQ2hhbmdlKGVsZW1lbnQpOwotICAgICAgICBTb3J0YWJsZS5vcHRpb25zKGRyb3Bvbi5wYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgU29ydGFibGUubWFyayhkcm9wb24sICdhZnRlcicpOwotICAgICAgdmFyIG5leHRFbGVtZW50ID0gZHJvcG9uLm5leHRTaWJsaW5nIHx8IG51bGw7Ci0gICAgICBpZihuZXh0RWxlbWVudCAhPSBlbGVtZW50KSB7Ci0gICAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsgLy8gZml4IGdlY2tvIHJlbmRlcmluZwotICAgICAgICBkcm9wb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dEVsZW1lbnQpOwotICAgICAgICBpZihkcm9wb24ucGFyZW50Tm9kZSE9b2xkUGFyZW50Tm9kZSkgCi0gICAgICAgICAgU29ydGFibGUub3B0aW9ucyhvbGRQYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsKLSAgICAgICAgU29ydGFibGUub3B0aW9ucyhkcm9wb24ucGFyZW50Tm9kZSkub25DaGFuZ2UoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9LAotCi0gIG9uRW1wdHlIb3ZlcjogZnVuY3Rpb24oZWxlbWVudCwgZHJvcG9uKSB7Ci0gICAgaWYoZWxlbWVudC5wYXJlbnROb2RlIT1kcm9wb24pIHsKLSAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgICAgZHJvcG9uLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotICAgICAgU29ydGFibGUub3B0aW9ucyhvbGRQYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsKLSAgICAgIFNvcnRhYmxlLm9wdGlvbnMoZHJvcG9uKS5vbkNoYW5nZShlbGVtZW50KTsKLSAgICB9Ci0gIH0sCi0KLSAgdW5tYXJrOiBmdW5jdGlvbigpIHsKLSAgICBpZihTb3J0YWJsZS5fbWFya2VyKSBFbGVtZW50LmhpZGUoU29ydGFibGUuX21hcmtlcik7Ci0gIH0sCi0KLSAgbWFyazogZnVuY3Rpb24oZHJvcG9uLCBwb3NpdGlvbikgewotICAgIC8vIG1hcmsgb24gZ2hvc3Rpbmcgb25seQotICAgIHZhciBzb3J0YWJsZSA9IFNvcnRhYmxlLm9wdGlvbnMoZHJvcG9uLnBhcmVudE5vZGUpOwotICAgIGlmKHNvcnRhYmxlICYmICFzb3J0YWJsZS5naG9zdGluZykgcmV0dXJuOyAKLQotICAgIGlmKCFTb3J0YWJsZS5fbWFya2VyKSB7Ci0gICAgICBTb3J0YWJsZS5fbWFya2VyID0gJCgnZHJvcG1hcmtlcicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwotICAgICAgRWxlbWVudC5oaWRlKFNvcnRhYmxlLl9tYXJrZXIpOwotICAgICAgRWxlbWVudC5hZGRDbGFzc05hbWUoU29ydGFibGUuX21hcmtlciwgJ2Ryb3BtYXJrZXInKTsKLSAgICAgIFNvcnRhYmxlLl9tYXJrZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKS5pdGVtKDApLmFwcGVuZENoaWxkKFNvcnRhYmxlLl9tYXJrZXIpOwotICAgIH0gICAgCi0gICAgdmFyIG9mZnNldHMgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KGRyb3Bvbik7Ci0gICAgU29ydGFibGUuX21hcmtlci5zdHlsZS5sZWZ0ID0gb2Zmc2V0c1swXSArICdweCc7Ci0gICAgU29ydGFibGUuX21hcmtlci5zdHlsZS50b3AgPSBvZmZzZXRzWzFdICsgJ3B4JzsKLSAgICAKLSAgICBpZihwb3NpdGlvbj09J2FmdGVyJykKLSAgICAgIGlmKHNvcnRhYmxlLm92ZXJsYXAgPT0gJ2hvcml6b250YWwnKSAKLSAgICAgICAgU29ydGFibGUuX21hcmtlci5zdHlsZS5sZWZ0ID0gKG9mZnNldHNbMF0rZHJvcG9uLmNsaWVudFdpZHRoKSArICdweCc7Ci0gICAgICBlbHNlCi0gICAgICAgIFNvcnRhYmxlLl9tYXJrZXIuc3R5bGUudG9wID0gKG9mZnNldHNbMV0rZHJvcG9uLmNsaWVudEhlaWdodCkgKyAncHgnOwotICAgIAotICAgIEVsZW1lbnQuc2hvdyhTb3J0YWJsZS5fbWFya2VyKTsKLSAgfSwKLQotICBzZXJpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgc29ydGFibGVPcHRpb25zID0gdGhpcy5vcHRpb25zKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICB0YWc6ICBzb3J0YWJsZU9wdGlvbnMudGFnLAotICAgICAgb25seTogc29ydGFibGVPcHRpb25zLm9ubHksCi0gICAgICBuYW1lOiBlbGVtZW50LmlkLAotICAgICAgZm9ybWF0OiBzb3J0YWJsZU9wdGlvbnMuZm9ybWF0IHx8IC9eW15fXSpfKC4qKSQvCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICByZXR1cm4gJCh0aGlzLmZpbmRFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXSkubWFwKCBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICByZXR1cm4gKGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLm5hbWUpICsgIltdPSIgKyAKLSAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0uaWQubWF0Y2gob3B0aW9ucy5mb3JtYXQpID8gaXRlbS5pZC5tYXRjaChvcHRpb25zLmZvcm1hdClbMV0gOiAnJykpOwotICAgIH0pLmpvaW4oIiYiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL2VmZmVjdHMuanMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9lZmZlY3RzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQzOThjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL2VmZmVjdHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLS8vIENvbnRyaWJ1dG9yczoKLS8vICBKdXN0aW4gUGFsbWVyIChodHRwOi8vZW5jeXRlbWVkaWEuY29tLykKLS8vICBNYXJrIFBpbGdyaW0gKGh0dHA6Ly9kaXZlaW50b21hcmsub3JnLykKLS8vICBNYXJ0aW4gQmlhbGFzaW5raQotLy8gCi0vLyBTZWUgc2NyaXB0YWN1bG91cy5qcyBmb3IgZnVsbCBsaWNlbnNlLiAgCi0KLS8qIC0tLS0tLS0tLS0tLS0gZWxlbWVudCBleHQgLS0tLS0tLS0tLS0tLS0gKi8gIAotIAotLy8gY29udmVydHMgcmdiKCkgYW5kICN4eHggdG8gI3h4eHh4eCBmb3JtYXQsICAKLS8vIHJldHVybnMgc2VsZiAob3IgZmlyc3QgYXJndW1lbnQpIGlmIG5vdCBjb252ZXJ0YWJsZSAgCi1TdHJpbmcucHJvdG90eXBlLnBhcnNlQ29sb3IgPSBmdW5jdGlvbigpIHsgIAotICB2YXIgY29sb3IgPSAnIyc7ICAKLSAgaWYodGhpcy5zbGljZSgwLDQpID09ICdyZ2IoJykgeyAgCi0gICAgdmFyIGNvbHMgPSB0aGlzLnNsaWNlKDQsdGhpcy5sZW5ndGgtMSkuc3BsaXQoJywnKTsgIAotICAgIHZhciBpPTA7IGRvIHsgY29sb3IgKz0gcGFyc2VJbnQoY29sc1tpXSkudG9Db2xvclBhcnQoKSB9IHdoaWxlICgrK2k8Myk7ICAKLSAgfSBlbHNlIHsgIAotICAgIGlmKHRoaXMuc2xpY2UoMCwxKSA9PSAnIycpIHsgIAotICAgICAgaWYodGhpcy5sZW5ndGg9PTQpIGZvcih2YXIgaT0xO2k8NDtpKyspIGNvbG9yICs9ICh0aGlzLmNoYXJBdChpKSArIHRoaXMuY2hhckF0KGkpKS50b0xvd2VyQ2FzZSgpOyAgCi0gICAgICBpZih0aGlzLmxlbmd0aD09NykgY29sb3IgPSB0aGlzLnRvTG93ZXJDYXNlKCk7ICAKLSAgICB9ICAKLSAgfSAgCi0gIHJldHVybihjb2xvci5sZW5ndGg9PTcgPyBjb2xvciA6IChhcmd1bWVudHNbMF0gfHwgdGhpcykpOyAgCi19ICAKLQotRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3MgPSBmdW5jdGlvbihlbGVtZW50LCBpZ25vcmVjbGFzcykgeyAgCi0gIHZhciBjaGlsZHJlbiA9ICQoZWxlbWVudCkuY2hpbGROb2RlczsgIAotICB2YXIgdGV4dCAgICAgPSAnJzsgIAotICB2YXIgY2xhc3N0ZXN0ID0gbmV3IFJlZ0V4cCgnXihbXiBdKyApKicgKyBpZ25vcmVjbGFzcysgJyggW14gXSspKiQnLCdpJyk7ICAKLSAKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeyAgCi0gICAgaWYoY2hpbGRyZW5baV0ubm9kZVR5cGU9PTMpIHsgIAotICAgICAgdGV4dCs9Y2hpbGRyZW5baV0ubm9kZVZhbHVlOyAgCi0gICAgfSBlbHNlIHsgIAotICAgICAgaWYoKCFjaGlsZHJlbltpXS5jbGFzc05hbWUubWF0Y2goY2xhc3N0ZXN0KSkgJiYgY2hpbGRyZW5baV0uaGFzQ2hpbGROb2RlcygpKSAgCi0gICAgICAgIHRleHQgKz0gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3MoY2hpbGRyZW5baV0sIGlnbm9yZWNsYXNzKTsgIAotICAgIH0gIAotICB9ICAKLSAKLSAgcmV0dXJuIHRleHQ7Ci19Ci0KLUVsZW1lbnQuc2V0U3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgZm9yKGsgaW4gc3R5bGUpIGVsZW1lbnQuc3R5bGVbay5jYW1lbGl6ZSgpXSA9IHN0eWxlW2tdOwotfQotCi1FbGVtZW50LnNldENvbnRlbnRab29tID0gZnVuY3Rpb24oZWxlbWVudCwgcGVyY2VudCkgeyAgCi0gIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwge2ZvbnRTaXplOiAocGVyY2VudC8xMDApICsgJ2VtJ30pOyAgIAotICBpZihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdBcHBsZVdlYktpdCcpPjApIHdpbmRvdy5zY3JvbGxCeSgwLDApOyAgCi19Ci0KLUVsZW1lbnQuZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQpeyAgCi0gIHZhciBvcGFjaXR5OwotICBpZiAob3BhY2l0eSA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ29wYWNpdHknKSkgIAotICAgIHJldHVybiBwYXJzZUZsb2F0KG9wYWNpdHkpOyAgCi0gIGlmIChvcGFjaXR5ID0gKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ2ZpbHRlcicpIHx8ICcnKS5tYXRjaCgvYWxwaGFcKG9wYWNpdHk9KC4qKVwpLykpICAKLSAgICBpZihvcGFjaXR5WzFdKSByZXR1cm4gcGFyc2VGbG9hdChvcGFjaXR5WzFdKSAvIDEwMDsgIAotICByZXR1cm4gMS4wOyAgCi19Ci0KLUVsZW1lbnQuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKXsgIAotICBlbGVtZW50PSAkKGVsZW1lbnQpOyAgCi0gIGlmICh2YWx1ZSA9PSAxKXsKLSAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIHsgb3BhY2l0eTogCi0gICAgICAoL0dlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgPyAKLSAgICAgIDAuOTk5OTk5IDogbnVsbCB9KTsKLSAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgIAotICAgICAgRWxlbWVudC5zZXRTdHlsZShlbGVtZW50LCB7ZmlsdGVyOiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsJ2ZpbHRlcicpLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJyl9KTsgIAotICB9IGVsc2UgeyAgCi0gICAgaWYodmFsdWUgPCAwLjAwMDAxKSB2YWx1ZSA9IDA7ICAKLSAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIHtvcGFjaXR5OiB2YWx1ZX0pOwotICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSAgCi0gICAgIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwgCi0gICAgICAgeyBmaWx0ZXI6IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwnZmlsdGVyJykucmVwbGFjZSgvYWxwaGFcKFteXCldKlwpL2dpLCcnKSArCi0gICAgICAgICAgICAgICAgICdhbHBoYShvcGFjaXR5PScrdmFsdWUqMTAwKycpJyB9KTsgIAotICB9ICAgCi19ICAKLSAKLUVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQpeyAgCi0gIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLm9wYWNpdHkgfHwgJyc7Ci19ICAKLQotRWxlbWVudC5jaGlsZHJlbldpdGhDbGFzc05hbWUgPSBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsgIAotICByZXR1cm4gJEEoJChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKS5zZWxlY3QoCi0gICAgZnVuY3Rpb24oYykgeyByZXR1cm4gRWxlbWVudC5oYXNDbGFzc05hbWUoYywgY2xhc3NOYW1lKSB9KTsKLX0KLQotQXJyYXkucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7Ci0gIHRoaXMuZWFjaChmdW5jdGlvbihmKXsgZi5hcHBseSh0aGlzLCBhcmdzKSB9KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZhciBFZmZlY3QgPSB7Ci0gIHRhZ2lmeVRleHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB2YXIgdGFnaWZ5U3R5bGUgPSAncG9zaXRpb246cmVsYXRpdmUnOwotICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB0YWdpZnlTdHlsZSArPSAnO3pvb206MSc7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgJEEoZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKCBmdW5jdGlvbihjaGlsZCkgewotICAgICAgaWYoY2hpbGQubm9kZVR5cGU9PTMpIHsKLSAgICAgICAgY2hpbGQubm9kZVZhbHVlLnRvQXJyYXkoKS5lYWNoKCBmdW5jdGlvbihjaGFyYWN0ZXIpIHsKLSAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZSgKLSAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnc3Bhbicse3N0eWxlOiB0YWdpZnlTdHlsZX0sCi0gICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAnICcgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkgOiBjaGFyYWN0ZXIpLCAKLSAgICAgICAgICAgICAgY2hpbGQpOwotICAgICAgICB9KTsKLSAgICAgICAgRWxlbWVudC5yZW1vdmUoY2hpbGQpOwotICAgICAgfQotICAgIH0pOwotICB9LAotICBtdWx0aXBsZTogZnVuY3Rpb24oZWxlbWVudCwgZWZmZWN0KSB7Ci0gICAgdmFyIGVsZW1lbnRzOwotICAgIGlmKCgodHlwZW9mIGVsZW1lbnQgPT0gJ29iamVjdCcpIHx8IAotICAgICAgICAodHlwZW9mIGVsZW1lbnQgPT0gJ2Z1bmN0aW9uJykpICYmIAotICAgICAgIChlbGVtZW50Lmxlbmd0aCkpCi0gICAgICBlbGVtZW50cyA9IGVsZW1lbnQ7Ci0gICAgZWxzZQotICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnQpLmNoaWxkTm9kZXM7Ci0gICAgICAKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgc3BlZWQ6IDAuMSwKLSAgICAgIGRlbGF5OiAwLjAKLSAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pOwotICAgIHZhciBtYXN0ZXJEZWxheSA9IG9wdGlvbnMuZGVsYXk7Ci0KLSAgICAkQShlbGVtZW50cykuZWFjaCggZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHsKLSAgICAgIG5ldyBlZmZlY3QoZWxlbWVudCwgT2JqZWN0LmV4dGVuZChvcHRpb25zLCB7IGRlbGF5OiBpbmRleCAqIG9wdGlvbnMuc3BlZWQgKyBtYXN0ZXJEZWxheSB9KSk7Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLXZhciBFZmZlY3QyID0gRWZmZWN0OyAvLyBkZXByZWNhdGVkCi0KLS8qIC0tLS0tLS0tLS0tLS0gdHJhbnNpdGlvbnMgLS0tLS0tLS0tLS0tLSAqLwotCi1FZmZlY3QuVHJhbnNpdGlvbnMgPSB7fQotCi1FZmZlY3QuVHJhbnNpdGlvbnMubGluZWFyID0gZnVuY3Rpb24ocG9zKSB7Ci0gIHJldHVybiBwb3M7Ci19Ci1FZmZlY3QuVHJhbnNpdGlvbnMuc2lub2lkYWwgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuICgtTWF0aC5jb3MocG9zKk1hdGguUEkpLzIpICsgMC41OwotfQotRWZmZWN0LlRyYW5zaXRpb25zLnJldmVyc2UgID0gZnVuY3Rpb24ocG9zKSB7Ci0gIHJldHVybiAxLXBvczsKLX0KLUVmZmVjdC5UcmFuc2l0aW9ucy5mbGlja2VyID0gZnVuY3Rpb24ocG9zKSB7Ci0gIHJldHVybiAoKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvNCkgKyAwLjc1KSArIE1hdGgucmFuZG9tKCkvNDsKLX0KLUVmZmVjdC5UcmFuc2l0aW9ucy53b2JibGUgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuICgtTWF0aC5jb3MocG9zKk1hdGguUEkqKDkqcG9zKSkvMikgKyAwLjU7Ci19Ci1FZmZlY3QuVHJhbnNpdGlvbnMucHVsc2UgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuIChNYXRoLmZsb29yKHBvcyoxMCkgJSAyID09IDAgPyAKLSAgICAocG9zKjEwLU1hdGguZmxvb3IocG9zKjEwKSkgOiAxLShwb3MqMTAtTWF0aC5mbG9vcihwb3MqMTApKSk7Ci19Ci1FZmZlY3QuVHJhbnNpdGlvbnMubm9uZSA9IGZ1bmN0aW9uKHBvcykgewotICByZXR1cm4gMDsKLX0KLUVmZmVjdC5UcmFuc2l0aW9ucy5mdWxsID0gZnVuY3Rpb24ocG9zKSB7Ci0gIHJldHVybiAxOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tIGNvcmUgZWZmZWN0cyAtLS0tLS0tLS0tLS0tICovCi0KLUVmZmVjdC5RdWV1ZSA9IHsKLSAgZWZmZWN0czogIFtdLAotICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKLSAgICB0aGlzLmVmZmVjdHMuX2VhY2goaXRlcmF0b3IpOwotICB9LAotICBpbnRlcnZhbDogbnVsbCwKLSAgYWRkOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgCi0gICAgc3dpdGNoKGVmZmVjdC5vcHRpb25zLnF1ZXVlKSB7Ci0gICAgICBjYXNlICdmcm9udCc6Ci0gICAgICAgIC8vIG1vdmUgdW5zdGFydGVkIGVmZmVjdHMgYWZ0ZXIgdGhpcyBlZmZlY3QgIAotICAgICAgICB0aGlzLmVmZmVjdHMuZmluZEFsbChmdW5jdGlvbihlKXsgcmV0dXJuIGUuc3RhdGU9PSdpZGxlJyB9KS5lYWNoKCBmdW5jdGlvbihlKSB7Ci0gICAgICAgICAgICBlLnN0YXJ0T24gICs9IGVmZmVjdC5maW5pc2hPbjsKLSAgICAgICAgICAgIGUuZmluaXNoT24gKz0gZWZmZWN0LmZpbmlzaE9uOwotICAgICAgICAgIH0pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2VuZCc6Ci0gICAgICAgIC8vIHN0YXJ0IGVmZmVjdCBhZnRlciBsYXN0IHF1ZXVlZCBlZmZlY3QgaGFzIGZpbmlzaGVkCi0gICAgICAgIHRpbWVzdGFtcCA9IHRoaXMuZWZmZWN0cy5wbHVjaygnZmluaXNoT24nKS5tYXgoKSB8fCB0aW1lc3RhbXA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBlZmZlY3Quc3RhcnRPbiAgKz0gdGltZXN0YW1wOwotICAgIGVmZmVjdC5maW5pc2hPbiArPSB0aW1lc3RhbXA7Ci0gICAgdGhpcy5lZmZlY3RzLnB1c2goZWZmZWN0KTsKLSAgICBpZighdGhpcy5pbnRlcnZhbCkgCi0gICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy5sb29wLmJpbmQodGhpcyksIDQwKTsKLSAgfSwKLSAgcmVtb3ZlOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICB0aGlzLmVmZmVjdHMgPSB0aGlzLmVmZmVjdHMucmVqZWN0KGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGU9PWVmZmVjdCB9KTsKLSAgICBpZih0aGlzLmVmZmVjdHMubGVuZ3RoID09IDApIHsKLSAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7Ci0gICAgICB0aGlzLmludGVydmFsID0gbnVsbDsKLSAgICB9Ci0gIH0sCi0gIGxvb3A6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0aW1lUG9zID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgdGhpcy5lZmZlY3RzLmludm9rZSgnbG9vcCcsIHRpbWVQb3MpOwotICB9Ci19Ci1PYmplY3QuZXh0ZW5kKEVmZmVjdC5RdWV1ZSwgRW51bWVyYWJsZSk7Ci0KLUVmZmVjdC5CYXNlID0gZnVuY3Rpb24oKSB7fTsKLUVmZmVjdC5CYXNlLnByb3RvdHlwZSA9IHsKLSAgcG9zaXRpb246IG51bGwsCi0gIHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIHRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKLSAgICAgIGR1cmF0aW9uOiAgIDEuMCwgICAvLyBzZWNvbmRzCi0gICAgICBmcHM6ICAgICAgICAyNS4wLCAgLy8gbWF4LiAyNWZwcyBkdWUgdG8gRWZmZWN0LlF1ZXVlIGltcGxlbWVudGF0aW9uCi0gICAgICBzeW5jOiAgICAgICBmYWxzZSwgLy8gdHJ1ZSBmb3IgY29tYmluaW5nCi0gICAgICBmcm9tOiAgICAgICAwLjAsCi0gICAgICB0bzogICAgICAgICAxLjAsCi0gICAgICBkZWxheTogICAgICAwLjAsCi0gICAgICBxdWV1ZTogICAgICAncGFyYWxsZWwnCi0gICAgfSwgb3B0aW9ucyB8fCB7fSk7Ci0gIH0sCi0gIHN0YXJ0OiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMgfHwge30pOwotICAgIHRoaXMuY3VycmVudEZyYW1lID0gMDsKLSAgICB0aGlzLnN0YXRlICAgICAgICA9ICdpZGxlJzsKLSAgICB0aGlzLnN0YXJ0T24gICAgICA9IHRoaXMub3B0aW9ucy5kZWxheSoxMDAwOwotICAgIHRoaXMuZmluaXNoT24gICAgID0gdGhpcy5zdGFydE9uICsgKHRoaXMub3B0aW9ucy5kdXJhdGlvbioxMDAwKTsKLSAgICB0aGlzLmV2ZW50KCdiZWZvcmVTdGFydCcpOwotICAgIGlmKCF0aGlzLm9wdGlvbnMuc3luYykgRWZmZWN0LlF1ZXVlLmFkZCh0aGlzKTsKLSAgfSwKLSAgbG9vcDogZnVuY3Rpb24odGltZVBvcykgewotICAgIGlmKHRpbWVQb3MgPj0gdGhpcy5zdGFydE9uKSB7Ci0gICAgICBpZih0aW1lUG9zID49IHRoaXMuZmluaXNoT24pIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoMS4wKTsKLSAgICAgICAgdGhpcy5jYW5jZWwoKTsKLSAgICAgICAgdGhpcy5ldmVudCgnYmVmb3JlRmluaXNoJyk7Ci0gICAgICAgIGlmKHRoaXMuZmluaXNoKSB0aGlzLmZpbmlzaCgpOyAKLSAgICAgICAgdGhpcy5ldmVudCgnYWZ0ZXJGaW5pc2gnKTsKLSAgICAgICAgcmV0dXJuOyAgCi0gICAgICB9Ci0gICAgICB2YXIgcG9zICAgPSAodGltZVBvcyAtIHRoaXMuc3RhcnRPbikgLyAodGhpcy5maW5pc2hPbiAtIHRoaXMuc3RhcnRPbik7Ci0gICAgICB2YXIgZnJhbWUgPSBNYXRoLnJvdW5kKHBvcyAqIHRoaXMub3B0aW9ucy5mcHMgKiB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwotICAgICAgaWYoZnJhbWUgPiB0aGlzLmN1cnJlbnRGcmFtZSkgewotICAgICAgICB0aGlzLnJlbmRlcihwb3MpOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IGZyYW1lOwotICAgICAgfQotICAgIH0KLSAgfSwKLSAgcmVuZGVyOiBmdW5jdGlvbihwb3MpIHsKLSAgICBpZih0aGlzLnN0YXRlID09ICdpZGxlJykgewotICAgICAgdGhpcy5zdGF0ZSA9ICdydW5uaW5nJzsKLSAgICAgIHRoaXMuZXZlbnQoJ2JlZm9yZVNldHVwJyk7Ci0gICAgICBpZih0aGlzLnNldHVwKSB0aGlzLnNldHVwKCk7Ci0gICAgICB0aGlzLmV2ZW50KCdhZnRlclNldHVwJyk7Ci0gICAgfQotICAgIGlmKHRoaXMuc3RhdGUgPT0gJ3J1bm5pbmcnKSB7Ci0gICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNpdGlvbikgcG9zID0gdGhpcy5vcHRpb25zLnRyYW5zaXRpb24ocG9zKTsKLSAgICAgIHBvcyAqPSAodGhpcy5vcHRpb25zLnRvLXRoaXMub3B0aW9ucy5mcm9tKTsKLSAgICAgIHBvcyArPSB0aGlzLm9wdGlvbnMuZnJvbTsKLSAgICAgIHRoaXMucG9zaXRpb24gPSBwb3M7Ci0gICAgICB0aGlzLmV2ZW50KCdiZWZvcmVVcGRhdGUnKTsKLSAgICAgIGlmKHRoaXMudXBkYXRlKSB0aGlzLnVwZGF0ZShwb3MpOwotICAgICAgdGhpcy5ldmVudCgnYWZ0ZXJVcGRhdGUnKTsKLSAgICB9Ci0gIH0sCi0gIGNhbmNlbDogZnVuY3Rpb24oKSB7Ci0gICAgaWYoIXRoaXMub3B0aW9ucy5zeW5jKSBFZmZlY3QuUXVldWUucmVtb3ZlKHRoaXMpOwotICAgIHRoaXMuc3RhdGUgPSAnZmluaXNoZWQnOwotICB9LAotICBldmVudDogZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0gICAgaWYodGhpcy5vcHRpb25zW2V2ZW50TmFtZSArICdJbnRlcm5hbCddKSB0aGlzLm9wdGlvbnNbZXZlbnROYW1lICsgJ0ludGVybmFsJ10odGhpcyk7Ci0gICAgaWYodGhpcy5vcHRpb25zW2V2ZW50TmFtZV0pIHRoaXMub3B0aW9uc1tldmVudE5hbWVdKHRoaXMpOwotICB9LAotICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gJyM8RWZmZWN0OicgKyAkSCh0aGlzKS5pbnNwZWN0KCkgKyAnLG9wdGlvbnM6JyArICRIKHRoaXMub3B0aW9ucykuaW5zcGVjdCgpICsgJz4nOwotICB9Ci19Ci0KLUVmZmVjdC5QYXJhbGxlbCA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5QYXJhbGxlbC5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWZmZWN0cykgewotICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHMgfHwgW107Ci0gICAgdGhpcy5zdGFydChhcmd1bWVudHNbMV0pOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lZmZlY3RzLmludm9rZSgncmVuZGVyJywgcG9zaXRpb24pOwotICB9LAotICBmaW5pc2g6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lZmZlY3RzLmVhY2goIGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgZWZmZWN0LnJlbmRlcigxLjApOwotICAgICAgZWZmZWN0LmNhbmNlbCgpOwotICAgICAgZWZmZWN0LmV2ZW50KCdiZWZvcmVGaW5pc2gnKTsKLSAgICAgIGlmKGVmZmVjdC5maW5pc2gpIGVmZmVjdC5maW5pc2gocG9zaXRpb24pOwotICAgICAgZWZmZWN0LmV2ZW50KCdhZnRlckZpbmlzaCcpOwotICAgIH0pOwotICB9Ci19KTsKLQotRWZmZWN0Lk9wYWNpdHkgPSBDbGFzcy5jcmVhdGUoKTsKLU9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChFZmZlY3QuT3BhY2l0eS5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgLy8gbWFrZSB0aGlzIHdvcmsgb24gSUUgb24gZWxlbWVudHMgd2l0aG91dCAnbGF5b3V0JwotICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICghdGhpcy5lbGVtZW50Lmhhc0xheW91dCkpCi0gICAgICBFbGVtZW50LnNldFN0eWxlKHRoaXMuZWxlbWVudCwge3pvb206IDF9KTsKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgZnJvbTogRWxlbWVudC5nZXRPcGFjaXR5KHRoaXMuZWxlbWVudCkgfHwgMC4wLAotICAgICAgdG86ICAgMS4wCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgRWxlbWVudC5zZXRPcGFjaXR5KHRoaXMuZWxlbWVudCwgcG9zaXRpb24pOwotICB9Ci19KTsKLQotRWZmZWN0Lk1vdmVCeSA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5Nb3ZlQnkucHJvdG90eXBlLCBFZmZlY3QuQmFzZS5wcm90b3R5cGUpLCB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHRvVG9wLCB0b0xlZnQpIHsKLSAgICB0aGlzLmVsZW1lbnQgICAgICA9ICQoZWxlbWVudCk7Ci0gICAgdGhpcy50b1RvcCAgICAgICAgPSB0b1RvcDsKLSAgICB0aGlzLnRvTGVmdCAgICAgICA9IHRvTGVmdDsKLSAgICB0aGlzLnN0YXJ0KGFyZ3VtZW50c1szXSk7Ci0gIH0sCi0gIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAvLyBCdWcgaW4gT3BlcmE6IE9wZXJhIHJldHVybnMgdGhlICJyZWFsIiBwb3NpdGlvbiBvZiBhIHN0YXRpYyBlbGVtZW50IG9yCi0gICAgLy8gcmVsYXRpdmUgZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgdG9wL2xlZnQgZXhwbGljaXRseSBzZXQuCi0gICAgLy8gPT0+IEFsd2F5cyBzZXQgdG9wIGFuZCBsZWZ0IGZvciBwb3NpdGlvbiByZWxhdGl2ZSBlbGVtZW50cyBpbiB5b3VyIHN0eWxlc2hlZXRzIAotICAgIC8vICh0byAwIGlmIHlvdSBkbyBub3QgbmVlZCB0aGVtKSAKLSAgICBFbGVtZW50Lm1ha2VQb3NpdGlvbmVkKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy5vcmlnaW5hbFRvcCAgPSBwYXJzZUZsb2F0KEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCd0b3AnKSAgfHwgJzAnKTsKLSAgICB0aGlzLm9yaWdpbmFsTGVmdCA9IHBhcnNlRmxvYXQoRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ2xlZnQnKSB8fCAnMCcpOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgRWxlbWVudC5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIHsKLSAgICAgIHRvcDogIHRoaXMudG9Ub3AgICogcG9zaXRpb24gKyB0aGlzLm9yaWdpbmFsVG9wICsgJ3B4JywKLSAgICAgIGxlZnQ6IHRoaXMudG9MZWZ0ICogcG9zaXRpb24gKyB0aGlzLm9yaWdpbmFsTGVmdCArICdweCcKLSAgICB9KTsKLSAgfQotfSk7Ci0KLUVmZmVjdC5TY2FsZSA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5TY2FsZS5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgcGVyY2VudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCkKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgc2NhbGVYOiB0cnVlLAotICAgICAgc2NhbGVZOiB0cnVlLAotICAgICAgc2NhbGVDb250ZW50OiB0cnVlLAotICAgICAgc2NhbGVGcm9tQ2VudGVyOiBmYWxzZSwKLSAgICAgIHNjYWxlTW9kZTogJ2JveCcsICAgICAgICAvLyAnYm94JyBvciAnY29udGVudHMnIG9yIHt9IHdpdGggcHJvdmlkZWQgdmFsdWVzCi0gICAgICBzY2FsZUZyb206IDEwMC4wLAotICAgICAgc2NhbGVUbzogICBwZXJjZW50Ci0gICAgfSwgYXJndW1lbnRzWzJdIHx8IHt9KTsKLSAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwotICB9LAotICBzZXR1cDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yZXN0b3JlQWZ0ZXJGaW5pc2ggPSB0aGlzLm9wdGlvbnMucmVzdG9yZUFmdGVyRmluaXNoIHx8IGZhbHNlOwotICAgIHRoaXMuZWxlbWVudFBvc2l0aW9uaW5nID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ3Bvc2l0aW9uJyk7Ci0gICAgCi0gICAgdGhpcy5vcmlnaW5hbFN0eWxlID0ge307Ci0gICAgWyd0b3AnLCdsZWZ0Jywnd2lkdGgnLCdoZWlnaHQnLCdmb250U2l6ZSddLmVhY2goIGZ1bmN0aW9uKGspIHsKLSAgICAgIHRoaXMub3JpZ2luYWxTdHlsZVtrXSA9IHRoaXMuZWxlbWVudC5zdHlsZVtrXTsKLSAgICB9LmJpbmQodGhpcykpOwotICAgICAgCi0gICAgdGhpcy5vcmlnaW5hbFRvcCAgPSB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wOwotICAgIHRoaXMub3JpZ2luYWxMZWZ0ID0gdGhpcy5lbGVtZW50Lm9mZnNldExlZnQ7Ci0gICAgCi0gICAgdmFyIGZvbnRTaXplID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ2ZvbnQtc2l6ZScpIHx8ICcxMDAlJzsKLSAgICBbJ2VtJywncHgnLCclJ10uZWFjaCggZnVuY3Rpb24oZm9udFNpemVUeXBlKSB7Ci0gICAgICBpZihmb250U2l6ZS5pbmRleE9mKGZvbnRTaXplVHlwZSk+MCkgewotICAgICAgICB0aGlzLmZvbnRTaXplICAgICA9IHBhcnNlRmxvYXQoZm9udFNpemUpOwotICAgICAgICB0aGlzLmZvbnRTaXplVHlwZSA9IGZvbnRTaXplVHlwZTsKLSAgICAgIH0KLSAgICB9LmJpbmQodGhpcykpOwotICAgIAotICAgIHRoaXMuZmFjdG9yID0gKHRoaXMub3B0aW9ucy5zY2FsZVRvIC0gdGhpcy5vcHRpb25zLnNjYWxlRnJvbSkvMTAwOwotICAgIAotICAgIHRoaXMuZGltcyA9IG51bGw7Ci0gICAgaWYodGhpcy5vcHRpb25zLnNjYWxlTW9kZT09J2JveCcpCi0gICAgICB0aGlzLmRpbXMgPSBbdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCwgdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoXTsKLSAgICBpZigvXmNvbnRlbnQvLnRlc3QodGhpcy5vcHRpb25zLnNjYWxlTW9kZSkpCi0gICAgICB0aGlzLmRpbXMgPSBbdGhpcy5lbGVtZW50LnNjcm9sbEhlaWdodCwgdGhpcy5lbGVtZW50LnNjcm9sbFdpZHRoXTsKLSAgICBpZighdGhpcy5kaW1zKQotICAgICAgdGhpcy5kaW1zID0gW3RoaXMub3B0aW9ucy5zY2FsZU1vZGUub3JpZ2luYWxIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjYWxlTW9kZS5vcmlnaW5hbFdpZHRoXTsKLSAgfSwKLSAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewotICAgIHZhciBjdXJyZW50U2NhbGUgPSAodGhpcy5vcHRpb25zLnNjYWxlRnJvbS8xMDAuMCkgKyAodGhpcy5mYWN0b3IgKiBwb3NpdGlvbik7Ci0gICAgaWYodGhpcy5vcHRpb25zLnNjYWxlQ29udGVudCAmJiB0aGlzLmZvbnRTaXplKQotICAgICAgRWxlbWVudC5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIHtmb250U2l6ZTogdGhpcy5mb250U2l6ZSAqIGN1cnJlbnRTY2FsZSArIHRoaXMuZm9udFNpemVUeXBlIH0pOwotICAgIHRoaXMuc2V0RGltZW5zaW9ucyh0aGlzLmRpbXNbMF0gKiBjdXJyZW50U2NhbGUsIHRoaXMuZGltc1sxXSAqIGN1cnJlbnRTY2FsZSk7Ci0gIH0sCi0gIGZpbmlzaDogZnVuY3Rpb24ocG9zaXRpb24pIHsKLSAgICBpZiAodGhpcy5yZXN0b3JlQWZ0ZXJGaW5pc2gpIEVsZW1lbnQuc2V0U3R5bGUodGhpcy5lbGVtZW50LCB0aGlzLm9yaWdpbmFsU3R5bGUpOwotICB9LAotICBzZXREaW1lbnNpb25zOiBmdW5jdGlvbihoZWlnaHQsIHdpZHRoKSB7Ci0gICAgdmFyIGQgPSB7fTsKLSAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLndpZHRoID0gd2lkdGggKyAncHgnOwotICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZVkpIGQuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKLSAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVGcm9tQ2VudGVyKSB7Ci0gICAgICB2YXIgdG9wZCAgPSAoaGVpZ2h0IC0gdGhpcy5kaW1zWzBdKS8yOwotICAgICAgdmFyIGxlZnRkID0gKHdpZHRoICAtIHRoaXMuZGltc1sxXSkvMjsKLSAgICAgIGlmKHRoaXMuZWxlbWVudFBvc2l0aW9uaW5nID09ICdhYnNvbHV0ZScpIHsKLSAgICAgICAgaWYodGhpcy5vcHRpb25zLnNjYWxlWSkgZC50b3AgPSB0aGlzLm9yaWdpbmFsVG9wLXRvcGQgKyAncHgnOwotICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSB0aGlzLm9yaWdpbmFsTGVmdC1sZWZ0ZCArICdweCc7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVZKSBkLnRvcCA9IC10b3BkICsgJ3B4JzsKLSAgICAgICAgaWYodGhpcy5vcHRpb25zLnNjYWxlWCkgZC5sZWZ0ID0gLWxlZnRkICsgJ3B4JzsKLSAgICAgIH0KLSAgICB9Ci0gICAgRWxlbWVudC5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIGQpOwotICB9Ci19KTsKLQotRWZmZWN0LkhpZ2hsaWdodCA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5IaWdobGlnaHQucHJvdG90eXBlLCBFZmZlY3QuQmFzZS5wcm90b3R5cGUpLCB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IHN0YXJ0Y29sb3I6ICcjZmZmZjk5JyB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7Ci0gIH0sCi0gIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAvLyBQcmV2ZW50IGV4ZWN1dGluZyBvbiBlbGVtZW50cyBub3QgaW4gdGhlIGxheW91dCBmbG93Ci0gICAgaWYoRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdkaXNwbGF5Jyk9PSdub25lJykgeyB0aGlzLmNhbmNlbCgpOyByZXR1cm47IH0KLSAgICAvLyBEaXNhYmxlIGJhY2tncm91bmQgaW1hZ2UgZHVyaW5nIHRoZSBlZmZlY3QKLSAgICB0aGlzLm9sZFN0eWxlID0gewotICAgICAgYmFja2dyb3VuZEltYWdlOiBFbGVtZW50LmdldFN0eWxlKHRoaXMuZWxlbWVudCwgJ2JhY2tncm91bmQtaW1hZ2UnKSB9OwotICAgIEVsZW1lbnQuc2V0U3R5bGUodGhpcy5lbGVtZW50LCB7YmFja2dyb3VuZEltYWdlOiAnbm9uZSd9KTsKLSAgICBpZighdGhpcy5vcHRpb25zLmVuZGNvbG9yKQotICAgICAgdGhpcy5vcHRpb25zLmVuZGNvbG9yID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJykucGFyc2VDb2xvcignI2ZmZmZmZicpOwotICAgIGlmKCF0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yKQotICAgICAgdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvciA9IEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAnYmFja2dyb3VuZC1jb2xvcicpOwotICAgIC8vIGluaXQgY29sb3IgY2FsY3VsYXRpb25zCi0gICAgdGhpcy5fYmFzZSAgPSAkUigwLDIpLm1hcChmdW5jdGlvbihpKXsgcmV0dXJuIHBhcnNlSW50KHRoaXMub3B0aW9ucy5zdGFydGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNikgfS5iaW5kKHRoaXMpKTsKLSAgICB0aGlzLl9kZWx0YSA9ICRSKDAsMikubWFwKGZ1bmN0aW9uKGkpeyByZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLmVuZGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNiktdGhpcy5fYmFzZVtpXSB9LmJpbmQodGhpcykpOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgRWxlbWVudC5zZXRTdHlsZSh0aGlzLmVsZW1lbnQse2JhY2tncm91bmRDb2xvcjogJFIoMCwyKS5pbmplY3QoJyMnLGZ1bmN0aW9uKG0sdixpKXsKLSAgICAgIHJldHVybiBtKyhNYXRoLnJvdW5kKHRoaXMuX2Jhc2VbaV0rKHRoaXMuX2RlbHRhW2ldKnBvc2l0aW9uKSkudG9Db2xvclBhcnQoKSk7IH0uYmluZCh0aGlzKSkgfSk7Ci0gIH0sCi0gIGZpbmlzaDogZnVuY3Rpb24oKSB7Ci0gICAgRWxlbWVudC5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIE9iamVjdC5leHRlbmQodGhpcy5vbGRTdHlsZSwgewotICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yCi0gICAgfSkpOwotICB9Ci19KTsKLQotRWZmZWN0LlNjcm9sbFRvID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LlNjcm9sbFRvLnByb3RvdHlwZSwgRWZmZWN0LkJhc2UucHJvdG90eXBlKSwgewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB0aGlzLnN0YXJ0KGFyZ3VtZW50c1sxXSB8fCB7fSk7Ci0gIH0sCi0gIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICBQb3NpdGlvbi5wcmVwYXJlKCk7Ci0gICAgdmFyIG9mZnNldHMgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuZWxlbWVudCk7Ci0gICAgaWYodGhpcy5vcHRpb25zLm9mZnNldCkgb2Zmc2V0c1sxXSArPSB0aGlzLm9wdGlvbnMub2Zmc2V0OwotICAgIHZhciBtYXggPSB3aW5kb3cuaW5uZXJIZWlnaHQgPyAKLSAgICAgIHdpbmRvdy5oZWlnaHQgLSB3aW5kb3cuaW5uZXJIZWlnaHQgOgotICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgLSAKLSAgICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPyAKLSAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpOwotICAgIHRoaXMuc2Nyb2xsU3RhcnQgPSBQb3NpdGlvbi5kZWx0YVk7Ci0gICAgdGhpcy5kZWx0YSA9IChvZmZzZXRzWzFdID4gbWF4ID8gbWF4IDogb2Zmc2V0c1sxXSkgLSB0aGlzLnNjcm9sbFN0YXJ0OwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgUG9zaXRpb24ucHJlcGFyZSgpOwotICAgIHdpbmRvdy5zY3JvbGxUbyhQb3NpdGlvbi5kZWx0YVgsIAotICAgICAgdGhpcy5zY3JvbGxTdGFydCArIChwb3NpdGlvbip0aGlzLmRlbHRhKSk7Ci0gIH0KLX0pOwotCi0vKiAtLS0tLS0tLS0tLS0tIGNvbWJpbmF0aW9uIGVmZmVjdHMgLS0tLS0tLS0tLS0tLSAqLwotCi1FZmZlY3QuRmFkZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgdmFyIG9sZE9wYWNpdHkgPSBFbGVtZW50LmdldElubGluZU9wYWNpdHkoZWxlbWVudCk7Ci0gIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gIGZyb206IEVsZW1lbnQuZ2V0T3BhY2l0eShlbGVtZW50KSB8fCAxLjAsCi0gIHRvOiAgIDAuMCwKLSAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgeyAKLSAgICBpZihlZmZlY3Qub3B0aW9ucy50byE9MCkgcmV0dXJuOwotICAgIGhpZGUoZWZmZWN0LmVsZW1lbnQpOwotICAgIHNldFN0eWxlKGVmZmVjdC5lbGVtZW50LCB7b3BhY2l0eTogb2xkT3BhY2l0eX0pOyB9fQotICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICByZXR1cm4gbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsb3B0aW9ucyk7Ci19Ci0KLUVmZmVjdC5BcHBlYXIgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gIGZyb206IChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgPT0gJ25vbmUnID8gMC4wIDogRWxlbWVudC5nZXRPcGFjaXR5KGVsZW1lbnQpIHx8IDAuMCksCi0gIHRvOiAgIDEuMCwKLSAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICBzZXRPcGFjaXR5KGVmZmVjdC5lbGVtZW50LCBlZmZlY3Qub3B0aW9ucy5mcm9tKTsKLSAgICBzaG93KGVmZmVjdC5lbGVtZW50KTsgfX0KLSAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LG9wdGlvbnMpOwotfQotCi1FZmZlY3QuUHVmZiA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIHZhciBvbGRTdHlsZSA9IHsgb3BhY2l0eTogRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpLCBwb3NpdGlvbjogRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSB9OwotICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgKLSAgIFsgbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAyMDAsIAotICAgICAgeyBzeW5jOiB0cnVlLCBzY2FsZUZyb21DZW50ZXI6IHRydWUsIHNjYWxlQ29udGVudDogdHJ1ZSwgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlIH0pLCAKLSAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHsgc3luYzogdHJ1ZSwgdG86IDAuMCB9ICkgXSwgCi0gICAgIE9iamVjdC5leHRlbmQoeyBkdXJhdGlvbjogMS4wLCAKLSAgICAgIGJlZm9yZVNldHVwSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCwge3Bvc2l0aW9uOiAnYWJzb2x1dGUnfSk7IH19LAotICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICAgaGlkZShlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50KTsKLSAgICAgICAgIHNldFN0eWxlKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIG9sZFN0eWxlKTsgfX0KLSAgICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KQotICAgKTsKLX0KLQotRWZmZWN0LkJsaW5kVXAgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICBFbGVtZW50Lm1ha2VDbGlwcGluZyhlbGVtZW50KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMCwgCi0gICAgT2JqZWN0LmV4dGVuZCh7IHNjYWxlQ29udGVudDogZmFsc2UsIAotICAgICAgc2NhbGVYOiBmYWxzZSwgCi0gICAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgIFtoaWRlLCB1bmRvQ2xpcHBpbmddLmNhbGwoZWZmZWN0LmVsZW1lbnQpOyB9fSAKLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pCi0gICk7Ci19Ci0KLUVmZmVjdC5CbGluZERvd24gPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkSGVpZ2h0ID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnaGVpZ2h0Jyk7Ci0gIHZhciBlbGVtZW50RGltZW5zaW9ucyA9IEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVtZW50KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMTAwLCAKLSAgICBPYmplY3QuZXh0ZW5kKHsgc2NhbGVDb250ZW50OiBmYWxzZSwgCi0gICAgICBzY2FsZVg6IGZhbHNlLAotICAgICAgc2NhbGVGcm9tOiAwLAotICAgICAgc2NhbGVNb2RlOiB7b3JpZ2luYWxIZWlnaHQ6IGVsZW1lbnREaW1lbnNpb25zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZWxlbWVudERpbWVuc2lvbnMud2lkdGh9LAotICAgICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAotICAgICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICBtYWtlQ2xpcHBpbmcoZWZmZWN0LmVsZW1lbnQpOwotICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwge2hlaWdodDogJzBweCd9KTsKLSAgICAgICAgc2hvdyhlZmZlY3QuZWxlbWVudCk7IAotICAgICAgfX0sICAKLSAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgICAgdW5kb0NsaXBwaW5nKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQsIHtoZWlnaHQ6IG9sZEhlaWdodH0pOwotICAgICAgfX0KLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pCi0gICk7Ci19Ci0KLUVmZmVjdC5Td2l0Y2hPZmYgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkT3BhY2l0eSA9IEVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eShlbGVtZW50KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuQXBwZWFyKGVsZW1lbnQsIHsgCi0gICAgZHVyYXRpb246IDAuNCwKLSAgICBmcm9tOiAwLAotICAgIHRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5mbGlja2VyLAotICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgbmV3IEVmZmVjdC5TY2FsZShlZmZlY3QuZWxlbWVudCwgMSwgeyAKLSAgICAgICAgZHVyYXRpb246IDAuMywgc2NhbGVGcm9tQ2VudGVyOiB0cnVlLAotICAgICAgICBzY2FsZVg6IGZhbHNlLCBzY2FsZUNvbnRlbnQ6IGZhbHNlLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgICAgIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgICAgW21ha2VQb3NpdGlvbmVkLG1ha2VDbGlwcGluZ10uY2FsbChlZmZlY3QuZWxlbWVudCk7Ci0gICAgICAgIH19LAotICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgICAgW2hpZGUsdW5kb0NsaXBwaW5nLHVuZG9Qb3NpdGlvbmVkXS5jYWxsKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwge29wYWNpdHk6IG9sZE9wYWNpdHl9KTsKLSAgICAgICAgfX0KLSAgICAgIH0pCi0gICAgfQotICB9KTsKLX0KLQotRWZmZWN0LkRyb3BPdXQgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkU3R5bGUgPSB7Ci0gICAgdG9wOiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICd0b3AnKSwKLSAgICBsZWZ0OiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdsZWZ0JyksCi0gICAgb3BhY2l0eTogRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpIH07Ci0gIHJldHVybiBuZXcgRWZmZWN0LlBhcmFsbGVsKAotICAgIFsgbmV3IEVmZmVjdC5Nb3ZlQnkoZWxlbWVudCwgMTAwLCAwLCB7IHN5bmM6IHRydWUgfSksIAotICAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHsgc3luYzogdHJ1ZSwgdG86IDAuMCB9KSBdLAotICAgIE9iamVjdC5leHRlbmQoCi0gICAgICB7IGR1cmF0aW9uOiAwLjUsCi0gICAgICAgIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgICAgbWFrZVBvc2l0aW9uZWQoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCk7IH19LAotICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgICAgW2hpZGUsIHVuZG9Qb3NpdGlvbmVkXS5jYWxsKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQpOwotICAgICAgICAgIHNldFN0eWxlKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIG9sZFN0eWxlKTsgfX0gCi0gICAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pKTsKLX0KLQotRWZmZWN0LlNoYWtlID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9sZFN0eWxlID0gewotICAgIHRvcDogRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAndG9wJyksCi0gICAgbGVmdDogRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnbGVmdCcpIH07Ci0gIHJldHVybiBuZXcgRWZmZWN0Lk1vdmVCeShlbGVtZW50LCAwLCAyMCwgCi0gICAgeyBkdXJhdGlvbjogMC4wNSwgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gIG5ldyBFZmZlY3QuTW92ZUJ5KGVmZmVjdC5lbGVtZW50LCAwLCAtNDAsIAotICAgIHsgZHVyYXRpb246IDAuMSwgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gIG5ldyBFZmZlY3QuTW92ZUJ5KGVmZmVjdC5lbGVtZW50LCAwLCA0MCwgCi0gICAgeyBkdXJhdGlvbjogMC4xLCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgbmV3IEVmZmVjdC5Nb3ZlQnkoZWZmZWN0LmVsZW1lbnQsIDAsIC00MCwgCi0gICAgeyBkdXJhdGlvbjogMC4xLCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgbmV3IEVmZmVjdC5Nb3ZlQnkoZWZmZWN0LmVsZW1lbnQsIDAsIDQwLCAKLSAgICB7IGR1cmF0aW9uOiAwLjEsIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICBuZXcgRWZmZWN0Lk1vdmVCeShlZmZlY3QuZWxlbWVudCwgMCwgLTIwLCAKLSAgICB7IGR1cmF0aW9uOiAwLjA1LCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgIHVuZG9Qb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQsIG9sZFN0eWxlKTsKLSAgfX19KSB9fSkgfX0pIH19KSB9fSkgfX0pOwotfQotCi1FZmZlY3QuU2xpZGVEb3duID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgRWxlbWVudC5jbGVhbldoaXRlc3BhY2UoZWxlbWVudCk7Ci0gIC8vIFNsaWRlRG93biBuZWVkIHRvIGhhdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciBlbGVtZW50IHdpdGggZml4ZWQgaGVpZ2h0IQotICB2YXIgb2xkSW5uZXJCb3R0b20gPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQuZmlyc3RDaGlsZCwgJ2JvdHRvbScpOwotICB2YXIgZWxlbWVudERpbWVuc2lvbnMgPSBFbGVtZW50LmdldERpbWVuc2lvbnMoZWxlbWVudCk7Ci0gIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEwMCwgT2JqZWN0LmV4dGVuZCh7IAotICAgIHNjYWxlQ29udGVudDogZmFsc2UsIAotICAgIHNjYWxlWDogZmFsc2UsIAotICAgIHNjYWxlRnJvbTogMCwKLSAgICBzY2FsZU1vZGU6IHtvcmlnaW5hbEhlaWdodDogZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBvcmlnaW5hbFdpZHRoOiBlbGVtZW50RGltZW5zaW9ucy53aWR0aH0sCi0gICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAotICAgIGFmdGVyU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgIG1ha2VQb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgIG1ha2VQb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQpOwotICAgICAgaWYod2luZG93Lm9wZXJhKSBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwge3RvcDogJyd9KTsKLSAgICAgIG1ha2VDbGlwcGluZyhlZmZlY3QuZWxlbWVudCk7Ci0gICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwge2hlaWdodDogJzBweCd9KTsKLSAgICAgIHNob3coZWxlbWVudCk7IH19LAotICAgIGFmdGVyVXBkYXRlSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgIHNldFN0eWxlKGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQsIHtib3R0b206Ci0gICAgICAgIChlZmZlY3QuZGltc1swXSAtIGVmZmVjdC5lbGVtZW50LmNsaWVudEhlaWdodCkgKyAncHgnIH0pOyB9fSwKLSAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICB1bmRvQ2xpcHBpbmcoZWZmZWN0LmVsZW1lbnQpOyAKLSAgICAgIHVuZG9Qb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQpOwotICAgICAgdW5kb1Bvc2l0aW9uZWQoZWZmZWN0LmVsZW1lbnQpOwotICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZCwge2JvdHRvbTogb2xkSW5uZXJCb3R0b219KTsgfX0KLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pCi0gICk7Ci19Ci0gIAotRWZmZWN0LlNsaWRlVXAgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICBFbGVtZW50LmNsZWFuV2hpdGVzcGFjZShlbGVtZW50KTsKLSAgdmFyIG9sZElubmVyQm90dG9tID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LmZpcnN0Q2hpbGQsICdib3R0b20nKTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMCwgCi0gICBPYmplY3QuZXh0ZW5kKHsgc2NhbGVDb250ZW50OiBmYWxzZSwgCi0gICAgc2NhbGVYOiBmYWxzZSwgCi0gICAgc2NhbGVNb2RlOiAnYm94JywKLSAgICBzY2FsZUZyb206IDEwMCwKLSAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgYmVmb3JlU3RhcnRJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgbWFrZVBvc2l0aW9uZWQoZWZmZWN0LmVsZW1lbnQpOwotICAgICAgbWFrZVBvc2l0aW9uZWQoZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0gICAgICBpZih3aW5kb3cub3BlcmEpIHNldFN0eWxlKGVmZmVjdC5lbGVtZW50LCB7dG9wOiAnJ30pOwotICAgICAgbWFrZUNsaXBwaW5nKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgIHNob3coZWxlbWVudCk7IH19LCAgCi0gICAgYWZ0ZXJVcGRhdGVJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZCwge2JvdHRvbToKLSAgICAgICAgKGVmZmVjdC5kaW1zWzBdIC0gZWZmZWN0LmVsZW1lbnQuY2xpZW50SGVpZ2h0KSArICdweCcgfSk7IH19LAotICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgICAgW2hpZGUsIHVuZG9DbGlwcGluZ10uY2FsbChlZmZlY3QuZWxlbWVudCk7IAotICAgICAgICB1bmRvUG9zaXRpb25lZChlZmZlY3QuZWxlbWVudC5maXJzdENoaWxkKTsKLSAgICAgICAgdW5kb1Bvc2l0aW9uZWQoZWZmZWN0LmVsZW1lbnQpOwotICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudC5maXJzdENoaWxkLCB7Ym90dG9tOiBvbGRJbm5lckJvdHRvbX0pOyB9fQotICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KQotICApOwotfQotCi0vLyBCdWcgaW4gb3BlcmEgbWFrZXMgdGhlIFREIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50IGV4cGFuZCBmb3IgYSBpbnN0YW5jZSBhZnRlciBmaW5pc2ggCi1FZmZlY3QuU3F1aXNoID0gZnVuY3Rpb24oZWxlbWVudCkgewotICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCB3aW5kb3cub3BlcmEgPyAxIDogMCwgCi0gICAgeyByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICBtYWtlQ2xpcHBpbmcoZWZmZWN0LmVsZW1lbnQpOyB9fSwgIAotICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICBoaWRlKGVmZmVjdC5lbGVtZW50KTsgCi0gICAgICAgIHVuZG9DbGlwcGluZyhlZmZlY3QuZWxlbWVudCk7IH19Ci0gIH0pOwotfQotCi1FZmZlY3QuR3JvdyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgZGlyZWN0aW9uOiAnY2VudGVyJywKLSAgICBtb3ZlVHJhbnNpc3Rpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKLSAgICBzY2FsZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKLSAgICBvcGFjaXR5VHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLmZ1bGwKLSAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgdmFyIG9sZFN0eWxlID0gewotICAgIHRvcDogZWxlbWVudC5zdHlsZS50b3AsCi0gICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAotICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQsCi0gICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCi0gICAgb3BhY2l0eTogRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpIH07Ci0KLSAgdmFyIGRpbXMgPSBFbGVtZW50LmdldERpbWVuc2lvbnMoZWxlbWVudCk7ICAgIAotICB2YXIgaW5pdGlhbE1vdmVYLCBpbml0aWFsTW92ZVk7Ci0gIHZhciBtb3ZlWCwgbW92ZVk7Ci0gIAotICBzd2l0Y2ggKG9wdGlvbnMuZGlyZWN0aW9uKSB7Ci0gICAgY2FzZSAndG9wLWxlZnQnOgotICAgICAgaW5pdGlhbE1vdmVYID0gaW5pdGlhbE1vdmVZID0gbW92ZVggPSBtb3ZlWSA9IDA7IAotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndG9wLXJpZ2h0JzoKLSAgICAgIGluaXRpYWxNb3ZlWCA9IGRpbXMud2lkdGg7Ci0gICAgICBpbml0aWFsTW92ZVkgPSBtb3ZlWSA9IDA7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYm90dG9tLWxlZnQnOgotICAgICAgaW5pdGlhbE1vdmVYID0gbW92ZVggPSAwOwotICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBtb3ZlWSA9IC1kaW1zLmhlaWdodDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6Ci0gICAgICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRoOwotICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoOwotICAgICAgbW92ZVkgPSAtZGltcy5oZWlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjZW50ZXInOgotICAgICAgaW5pdGlhbE1vdmVYID0gZGltcy53aWR0aCAvIDI7Ci0gICAgICBpbml0aWFsTW92ZVkgPSBkaW1zLmhlaWdodCAvIDI7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoIC8gMjsKLSAgICAgIG1vdmVZID0gLWRpbXMuaGVpZ2h0IC8gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0gIAotICByZXR1cm4gbmV3IEVmZmVjdC5Nb3ZlQnkoZWxlbWVudCwgaW5pdGlhbE1vdmVZLCBpbml0aWFsTW92ZVgsIHsgCi0gICAgZHVyYXRpb246IDAuMDEsIAotICAgIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICBoaWRlKGVmZmVjdC5lbGVtZW50KTsKLSAgICAgIG1ha2VDbGlwcGluZyhlZmZlY3QuZWxlbWVudCk7Ci0gICAgICBtYWtlUG9zaXRpb25lZChlZmZlY3QuZWxlbWVudCk7Ci0gICAgfX0sCi0gICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICBuZXcgRWZmZWN0LlBhcmFsbGVsKAotICAgICAgICBbIG5ldyBFZmZlY3QuT3BhY2l0eShlZmZlY3QuZWxlbWVudCwgeyBzeW5jOiB0cnVlLCB0bzogMS4wLCBmcm9tOiAwLjAsIHRyYW5zaXRpb246IG9wdGlvbnMub3BhY2l0eVRyYW5zaXRpb24gfSksCi0gICAgICAgICAgbmV3IEVmZmVjdC5Nb3ZlQnkoZWZmZWN0LmVsZW1lbnQsIG1vdmVZLCBtb3ZlWCwgeyBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLm1vdmVUcmFuc2l0aW9uIH0pLAotICAgICAgICAgIG5ldyBFZmZlY3QuU2NhbGUoZWZmZWN0LmVsZW1lbnQsIDEwMCwgewotICAgICAgICAgICAgc2NhbGVNb2RlOiB7IG9yaWdpbmFsSGVpZ2h0OiBkaW1zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZGltcy53aWR0aCB9LCAKLSAgICAgICAgICAgIHN5bmM6IHRydWUsIHNjYWxlRnJvbTogd2luZG93Lm9wZXJhID8gMSA6IDAsIHRyYW5zaXRpb246IG9wdGlvbnMuc2NhbGVUcmFuc2l0aW9uLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWV9KQotICAgICAgICBdLCBPYmplY3QuZXh0ZW5kKHsKLSAgICAgICAgICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCwge2hlaWdodDogJzBweCd9KTsKLSAgICAgICAgICAgICAgIHNob3coZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCk7IH19LAotICAgICAgICAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgIFt1bmRvQ2xpcHBpbmcsIHVuZG9Qb3NpdGlvbmVkXS5jYWxsKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQpOyAKLSAgICAgICAgICAgICAgIHNldFN0eWxlKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIG9sZFN0eWxlKTsgfX0KLSAgICAgICAgICAgfSwgb3B0aW9ucykKLSAgICAgICkKLSAgICB9Ci0gIH0pOwotfQotCi1FZmZlY3QuU2hyaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICBkaXJlY3Rpb246ICdjZW50ZXInLAotICAgIG1vdmVUcmFuc2lzdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAotICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAotICAgIG9wYWNpdHlUcmFuc2l0aW9uOiBFZmZlY3QuVHJhbnNpdGlvbnMubm9uZQotICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICB2YXIgb2xkU3R5bGUgPSB7Ci0gICAgdG9wOiBlbGVtZW50LnN0eWxlLnRvcCwKLSAgICBsZWZ0OiBlbGVtZW50LnN0eWxlLmxlZnQsCi0gICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhlaWdodCwKLSAgICB3aWR0aDogZWxlbWVudC5zdHlsZS53aWR0aCwKLSAgICBvcGFjaXR5OiBFbGVtZW50LmdldElubGluZU9wYWNpdHkoZWxlbWVudCkgfTsKLQotICB2YXIgZGltcyA9IEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVtZW50KTsKLSAgdmFyIG1vdmVYLCBtb3ZlWTsKLSAgCi0gIHN3aXRjaCAob3B0aW9ucy5kaXJlY3Rpb24pIHsKLSAgICBjYXNlICd0b3AtbGVmdCc6Ci0gICAgICBtb3ZlWCA9IG1vdmVZID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3RvcC1yaWdodCc6Ci0gICAgICBtb3ZlWCA9IGRpbXMud2lkdGg7Ci0gICAgICBtb3ZlWSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdib3R0b20tbGVmdCc6Ci0gICAgICBtb3ZlWCA9IDA7Ci0gICAgICBtb3ZlWSA9IGRpbXMuaGVpZ2h0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzoKLSAgICAgIG1vdmVYID0gZGltcy53aWR0aDsKLSAgICAgIG1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjZW50ZXInOiAgCi0gICAgICBtb3ZlWCA9IGRpbXMud2lkdGggLyAyOwotICAgICAgbW92ZVkgPSBkaW1zLmhlaWdodCAvIDI7Ci0gICAgICBicmVhazsKLSAgfQotICAKLSAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoCi0gICAgWyBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwgeyBzeW5jOiB0cnVlLCB0bzogMC4wLCBmcm9tOiAxLjAsIHRyYW5zaXRpb246IG9wdGlvbnMub3BhY2l0eVRyYW5zaXRpb24gfSksCi0gICAgICBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDEgOiAwLCB7IHN5bmM6IHRydWUsIHRyYW5zaXRpb246IG9wdGlvbnMuc2NhbGVUcmFuc2l0aW9uLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWV9KSwKLSAgICAgIG5ldyBFZmZlY3QuTW92ZUJ5KGVsZW1lbnQsIG1vdmVZLCBtb3ZlWCwgeyBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLm1vdmVUcmFuc2l0aW9uIH0pCi0gICAgXSwgT2JqZWN0LmV4dGVuZCh7ICAgICAgICAgICAgCi0gICAgICAgICBiZWZvcmVTdGFydEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7Ci0gICAgICAgICAgIFttYWtlUG9zaXRpb25lZCwgbWFrZUNsaXBwaW5nXS5jYWxsKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQpIH19LAotICAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewotICAgICAgICAgICBbaGlkZSwgdW5kb0NsaXBwaW5nLCB1bmRvUG9zaXRpb25lZF0uY2FsbChlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50KTsKLSAgICAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCwgb2xkU3R5bGUpOyB9fQotICAgICAgIH0sIG9wdGlvbnMpCi0gICk7Ci19Ci0KLUVmZmVjdC5QdWxzYXRlID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9wdGlvbnMgICAgPSBhcmd1bWVudHNbMV0gfHwge307Ci0gIHZhciBvbGRPcGFjaXR5ID0gRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpOwotICB2YXIgdHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbiB8fCBFZmZlY3QuVHJhbnNpdGlvbnMuc2lub2lkYWw7Ci0gIHZhciByZXZlcnNlciAgID0gZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHRyYW5zaXRpb24oMS1FZmZlY3QuVHJhbnNpdGlvbnMucHVsc2UocG9zKSkgfTsKLSAgcmV2ZXJzZXIuYmluZCh0cmFuc2l0aW9uKTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCAKLSAgICBPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoeyAgZHVyYXRpb246IDMuMCwgZnJvbTogMCwKLSAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyBFbGVtZW50LnNldFN0eWxlKGVmZmVjdC5lbGVtZW50LCB7b3BhY2l0eTogb2xkT3BhY2l0eX0pOyB9Ci0gICAgfSwgb3B0aW9ucyksIHt0cmFuc2l0aW9uOiByZXZlcnNlcn0pKTsKLX0KLQotRWZmZWN0LkZvbGQgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkU3R5bGUgPSB7Ci0gICAgdG9wOiBlbGVtZW50LnN0eWxlLnRvcCwKLSAgICBsZWZ0OiBlbGVtZW50LnN0eWxlLmxlZnQsCi0gICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCi0gICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhlaWdodCB9OwotICBFbGVtZW50Lm1ha2VDbGlwcGluZyhlbGVtZW50KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgNSwgT2JqZWN0LmV4dGVuZCh7ICAgCi0gICAgc2NhbGVDb250ZW50OiBmYWxzZSwKLSAgICBzY2FsZVg6IGZhbHNlLAotICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMSwgeyAKLSAgICAgIHNjYWxlQ29udGVudDogZmFsc2UsIAotICAgICAgc2NhbGVZOiBmYWxzZSwKLSAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKLSAgICAgICAgW2hpZGUsIHVuZG9DbGlwcGluZ10uY2FsbChlZmZlY3QuZWxlbWVudCk7IAotICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwgb2xkU3R5bGUpOwotICAgICAgfX0gfSk7Ci0gIH19LCBhcmd1bWVudHNbMV0gfHwge30pKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL3Byb3RvdHlwZS5qcyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL3Byb3RvdHlwZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljY2QzYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9wcm90b3R5cGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg1ICswLDAgQEAKLS8qICBQcm90b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmssIHZlcnNpb24gMS40LjAKLSAqICAoYykgMjAwNSBTYW0gU3RlcGhlbnNvbiA8c2FtQGNvbmlvLm5ldD4KLSAqCi0gKiAgVEhJUyBGSUxFIElTIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVELiBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgcGxlYXNlIGRpZmYKLSAqICBhZ2FpbnN0IHRoZSBzb3VyY2UgdHJlZSwgYXZhaWxhYmxlIGZyb20gdGhlIFByb3RvdHlwZSBkYXJjcyByZXBvc2l0b3J5LgotICoKLSAqICBQcm90b3R5cGUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLgotICoKLSAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUgd2ViIHNpdGU6IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0LwotICoKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12YXIgUHJvdG90eXBlID0gewotICBWZXJzaW9uOiAnMS40LjAnLAotICBTY3JpcHRGcmFnbWVudDogJyg/OjxzY3JpcHQuKj8+KSgoXG58XHJ8LikqPykoPzo8XC9zY3JpcHQ+KScsCi0KLSAgZW1wdHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7fSwKLSAgSzogZnVuY3Rpb24oeCkge3JldHVybiB4fQotfQotCi12YXIgQ2xhc3MgPSB7Ci0gIGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgfQotICB9Ci19Ci0KLXZhciBBYnN0cmFjdCA9IG5ldyBPYmplY3QoKTsKLQotT2JqZWN0LmV4dGVuZCA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKLSAgZm9yIChwcm9wZXJ0eSBpbiBzb3VyY2UpIHsKLSAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOwotICB9Ci0gIHJldHVybiBkZXN0aW5hdGlvbjsKLX0KLQotT2JqZWN0Lmluc3BlY3QgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgdHJ5IHsKLSAgICBpZiAob2JqZWN0ID09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnOwotICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuICdudWxsJzsKLSAgICByZXR1cm4gb2JqZWN0Lmluc3BlY3QgPyBvYmplY3QuaW5zcGVjdCgpIDogb2JqZWN0LnRvU3RyaW5nKCk7Ci0gIH0gY2F0Y2ggKGUpIHsKLSAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpIHJldHVybiAnLi4uJzsKLSAgICB0aHJvdyBlOwotICB9Ci19Ci0KLUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCBvYmplY3QgPSBhcmdzLnNoaWZ0KCk7Ci0gIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7Ci0gIH0KLX0KLQotRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRBc0V2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgdmFyIF9fbWV0aG9kID0gdGhpczsKLSAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgcmV0dXJuIF9fbWV0aG9kLmNhbGwob2JqZWN0LCBldmVudCB8fCB3aW5kb3cuZXZlbnQpOwotICB9Ci19Ci0KLU9iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSwgewotICB0b0NvbG9yUGFydDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGRpZ2l0cyA9IHRoaXMudG9TdHJpbmcoMTYpOwotICAgIGlmICh0aGlzIDwgMTYpIHJldHVybiAnMCcgKyBkaWdpdHM7Ci0gICAgcmV0dXJuIGRpZ2l0czsKLSAgfSwKLQotICBzdWNjOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcyArIDE7Ci0gIH0sCi0KLSAgdGltZXM6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgJFIoMCwgdGhpcywgdHJ1ZSkuZWFjaChpdGVyYXRvcik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX0pOwotCi12YXIgVHJ5ID0gewotICB0aGVzZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldHVyblZhbHVlOwotCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBsYW1iZGEgPSBhcmd1bWVudHNbaV07Ci0gICAgICB0cnkgewotICAgICAgICByZXR1cm5WYWx1ZSA9IGxhbWJkYSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gY2F0Y2ggKGUpIHt9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHVyblZhbHVlOwotICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1QZXJpb2RpY2FsRXhlY3V0ZXIucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywgZnJlcXVlbmN5KSB7Ci0gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIHRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwotICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7Ci0KLSAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsKLSAgfSwKLQotICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsKLSAgICBzZXRJbnRlcnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEwMDApOwotICB9LAotCi0gIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZykgewotICAgICAgdHJ5IHsKLSAgICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSB0cnVlOwotICAgICAgICB0aGlzLmNhbGxiYWNrKCk7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZnVuY3Rpb24gJCgpIHsKLSAgdmFyIGVsZW1lbnRzID0gbmV3IEFycmF5KCk7Ci0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50c1tpXTsKLSAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpCi0gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7Ci0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0KLSAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpOwotICB9Ci0KLSAgcmV0dXJuIGVsZW1lbnRzOwotfQotT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLCB7Ci0gIHN0cmlwVGFnczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFwvP1tePl0rPi9naSwgJycpOwotICB9LAotCi0gIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7Ci0gIH0sCi0KLSAgZXh0cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXRjaEFsbCA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7Ci0gICAgdmFyIG1hdGNoT25lID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOwotICAgIHJldHVybiAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10pLm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsKLSAgICAgIHJldHVybiAoc2NyaXB0VGFnLm1hdGNoKG1hdGNoT25lKSB8fCBbJycsICcnXSlbMV07Ci0gICAgfSk7Ci0gIH0sCi0KLSAgZXZhbFNjcmlwdHM6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGV2YWwpOwotICB9LAotCi0gIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgewotICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICB2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMpOwotICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0KTsKLSAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKLSAgfSwKLQotICB1bmVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgewotICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICBkaXYuaW5uZXJIVE1MID0gdGhpcy5zdHJpcFRhZ3MoKTsKLSAgICByZXR1cm4gZGl2LmNoaWxkTm9kZXNbMF0gPyBkaXYuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgOiAnJzsKLSAgfSwKLQotICB0b1F1ZXJ5UGFyYW1zOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFpcnMgPSB0aGlzLm1hdGNoKC9eXD8/KC4qKSQvKVsxXS5zcGxpdCgnJicpOwotICAgIHJldHVybiBwYWlycy5pbmplY3Qoe30sIGZ1bmN0aW9uKHBhcmFtcywgcGFpclN0cmluZykgewotICAgICAgdmFyIHBhaXIgPSBwYWlyU3RyaW5nLnNwbGl0KCc9Jyk7Ci0gICAgICBwYXJhbXNbcGFpclswXV0gPSBwYWlyWzFdOwotICAgICAgcmV0dXJuIHBhcmFtczsKLSAgICB9KTsKLSAgfSwKLQotICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5zcGxpdCgnJyk7Ci0gIH0sCi0KLSAgY2FtZWxpemU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBvU3RyaW5nTGlzdCA9IHRoaXMuc3BsaXQoJy0nKTsKLSAgICBpZiAob1N0cmluZ0xpc3QubGVuZ3RoID09IDEpIHJldHVybiBvU3RyaW5nTGlzdFswXTsKLQotICAgIHZhciBjYW1lbGl6ZWRTdHJpbmcgPSB0aGlzLmluZGV4T2YoJy0nKSA9PSAwCi0gICAgICA/IG9TdHJpbmdMaXN0WzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgb1N0cmluZ0xpc3RbMF0uc3Vic3RyaW5nKDEpCi0gICAgICA6IG9TdHJpbmdMaXN0WzBdOwotCi0gICAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IG9TdHJpbmdMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICB2YXIgcyA9IG9TdHJpbmdMaXN0W2ldOwotICAgICAgY2FtZWxpemVkU3RyaW5nICs9IHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FtZWxpemVkU3RyaW5nOwotICB9LAotCi0gIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiAiJyIgKyB0aGlzLnJlcGxhY2UoJ1xcJywgJ1xcXFwnKS5yZXBsYWNlKCInIiwgJ1xcXCcnKSArICInIjsKLSAgfQotfSk7Ci0KLVN0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeSA9IFN0cmluZy5wcm90b3R5cGUudG9RdWVyeVBhcmFtczsKLQotdmFyICRicmVhayAgICA9IG5ldyBPYmplY3QoKTsKLXZhciAkY29udGludWUgPSBuZXcgT2JqZWN0KCk7Ci0KLXZhciBFbnVtZXJhYmxlID0gewotICBlYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIHZhciBpbmRleCA9IDA7Ci0gICAgdHJ5IHsKLSAgICAgIHRoaXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpdGVyYXRvcih2YWx1ZSwgaW5kZXgrKyk7Ci0gICAgICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgICAgICBpZiAoZSAhPSAkY29udGludWUpIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIGlmIChlICE9ICRicmVhaykgdGhyb3cgZTsKLSAgICB9Ci0gIH0sCi0KLSAgYWxsOiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIHZhciByZXN1bHQgPSB0cnVlOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiAhIShpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KTsKLSAgICAgIGlmICghcmVzdWx0KSB0aHJvdyAkYnJlYWs7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKLQotICBhbnk6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHJlc3VsdCA9IHRydWU7Ci0gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewotICAgICAgaWYgKHJlc3VsdCA9ICEhKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpKQotICAgICAgICB0aHJvdyAkYnJlYWs7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKLQotICBjb2xsZWN0OiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIHZhciByZXN1bHRzID0gW107Ci0gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewotICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpOwotICAgIH0pOwotICAgIHJldHVybiByZXN1bHRzOwotICB9LAotCi0gIGRldGVjdDogZnVuY3Rpb24gKGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Ci0gICAgICBpZiAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSkgewotICAgICAgICByZXN1bHQgPSB2YWx1ZTsKLSAgICAgICAgdGhyb3cgJGJyZWFrOwotICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCi0KLSAgZmluZEFsbDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKLSAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIGlmIChpdGVyYXRvcih2YWx1ZSwgaW5kZXgpKQotICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOwotICAgIH0pOwotICAgIHJldHVybiByZXN1bHRzOwotICB9LAotCi0gIGdyZXA6IGZ1bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHJlc3VsdHMgPSBbXTsKLSAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Ci0gICAgICB2YXIgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgaWYgKHN0cmluZ1ZhbHVlLm1hdGNoKHBhdHRlcm4pKQotICAgICAgICByZXN1bHRzLnB1c2goKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpKTsKLSAgICB9KQotICAgIHJldHVybiByZXN1bHRzOwotICB9LAotCi0gIGluY2x1ZGU6IGZ1bmN0aW9uKG9iamVjdCkgewotICAgIHZhciBmb3VuZCA9IGZhbHNlOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IG9iamVjdCkgewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIHRocm93ICRicmVhazsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gZm91bmQ7Ci0gIH0sCi0KLSAgaW5qZWN0OiBmdW5jdGlvbihtZW1vLCBpdGVyYXRvcikgewotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB2YWx1ZSwgaW5kZXgpOwotICAgIH0pOwotICAgIHJldHVybiBtZW1vOwotICB9LAotCi0gIGludm9rZTogZnVuY3Rpb24obWV0aG9kKSB7Ci0gICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpLnNsaWNlKDEpOwotICAgIHJldHVybiB0aGlzLmNvbGxlY3QoZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgIHJldHVybiB2YWx1ZVttZXRob2RdLmFwcGx5KHZhbHVlLCBhcmdzKTsKLSAgICB9KTsKLSAgfSwKLQotICBtYXg6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Ci0gICAgICB2YWx1ZSA9IChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KTsKLSAgICAgIGlmICh2YWx1ZSA+PSAocmVzdWx0IHx8IHZhbHVlKSkKLSAgICAgICAgcmVzdWx0ID0gdmFsdWU7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKLQotICBtaW46IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Ci0gICAgICB2YWx1ZSA9IChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KTsKLSAgICAgIGlmICh2YWx1ZSA8PSAocmVzdWx0IHx8IHZhbHVlKSkKLSAgICAgICAgcmVzdWx0ID0gdmFsdWU7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKLQotICBwYXJ0aXRpb246IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9IFtdOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgICgoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCkgPwotICAgICAgICB0cnVlcyA6IGZhbHNlcykucHVzaCh2YWx1ZSk7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIFt0cnVlcywgZmFsc2VzXTsKLSAgfSwKLQotICBwbHVjazogZnVuY3Rpb24ocHJvcGVydHkpIHsKLSAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZVtwcm9wZXJ0eV0pOwotICAgIH0pOwotICAgIHJldHVybiByZXN1bHRzOwotICB9LAotCi0gIHJlamVjdDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKLSAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIGlmICghaXRlcmF0b3IodmFsdWUsIGluZGV4KSkKLSAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKLSAgICB9KTsKLSAgICByZXR1cm4gcmVzdWx0czsKLSAgfSwKLQotICBzb3J0Qnk6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgcmV0dXJuIHRoaXMuY29sbGVjdChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIHJldHVybiB7dmFsdWU6IHZhbHVlLCBjcml0ZXJpYTogaXRlcmF0b3IodmFsdWUsIGluZGV4KX07Ci0gICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkgewotICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7Ci0gICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7Ci0gICAgfSkucGx1Y2soJ3ZhbHVlJyk7Ci0gIH0sCi0KLSAgdG9BcnJheTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuY29sbGVjdChQcm90b3R5cGUuSyk7Ci0gIH0sCi0KLSAgemlwOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaXRlcmF0b3IgPSBQcm90b3R5cGUuSywgYXJncyA9ICRBKGFyZ3VtZW50cyk7Ci0gICAgaWYgKHR5cGVvZiBhcmdzLmxhc3QoKSA9PSAnZnVuY3Rpb24nKQotICAgICAgaXRlcmF0b3IgPSBhcmdzLnBvcCgpOwotCi0gICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOwotICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKLSAgICAgIGl0ZXJhdG9yKHZhbHVlID0gY29sbGVjdGlvbnMucGx1Y2soaW5kZXgpKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9KTsKLSAgfSwKLQotICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gJyM8RW51bWVyYWJsZTonICsgdGhpcy50b0FycmF5KCkuaW5zcGVjdCgpICsgJz4nOwotICB9Ci19Ci0KLU9iamVjdC5leHRlbmQoRW51bWVyYWJsZSwgewotICBtYXA6ICAgICBFbnVtZXJhYmxlLmNvbGxlY3QsCi0gIGZpbmQ6ICAgIEVudW1lcmFibGUuZGV0ZWN0LAotICBzZWxlY3Q6ICBFbnVtZXJhYmxlLmZpbmRBbGwsCi0gIG1lbWJlcjogIEVudW1lcmFibGUuaW5jbHVkZSwKLSAgZW50cmllczogRW51bWVyYWJsZS50b0FycmF5Ci19KTsKLXZhciAkQSA9IEFycmF5LmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSkgewotICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107Ci0gIGlmIChpdGVyYWJsZS50b0FycmF5KSB7Ci0gICAgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspCi0gICAgICByZXN1bHRzLnB1c2goaXRlcmFibGVbaV0pOwotICAgIHJldHVybiByZXN1bHRzOwotICB9Ci19Ci0KLU9iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKLQotQXJyYXkucHJvdG90eXBlLl9yZXZlcnNlID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2U7Ci0KLU9iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLCB7Ci0gIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykKLSAgICAgIGl0ZXJhdG9yKHRoaXNbaV0pOwotICB9LAotCi0gIGNsZWFyOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxlbmd0aCA9IDA7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgZmlyc3Q6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzWzBdOwotICB9LAotCi0gIGxhc3Q6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV07Ci0gIH0sCi0KLSAgY29tcGFjdDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICByZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkIHx8IHZhbHVlICE9IG51bGw7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgZmxhdHRlbjogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKLSAgICAgIHJldHVybiBhcnJheS5jb25jYXQodmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkgPwotICAgICAgICB2YWx1ZS5mbGF0dGVuKCkgOiBbdmFsdWVdKTsKLSAgICB9KTsKLSAgfSwKLQotICB3aXRob3V0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdmFsdWVzID0gJEEoYXJndW1lbnRzKTsKLSAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgIHJldHVybiAhdmFsdWVzLmluY2x1ZGUodmFsdWUpOwotICAgIH0pOwotICB9LAotCi0gIGluZGV4T2Y6IGZ1bmN0aW9uKG9iamVjdCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykKLSAgICAgIGlmICh0aGlzW2ldID09IG9iamVjdCkgcmV0dXJuIGk7Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIHJldmVyc2U6IGZ1bmN0aW9uKGlubGluZSkgewotICAgIHJldHVybiAoaW5saW5lICE9PSBmYWxzZSA/IHRoaXMgOiB0aGlzLnRvQXJyYXkoKSkuX3JldmVyc2UoKTsKLSAgfSwKLQotICBzaGlmdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlc3VsdCA9IHRoaXNbMF07Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAtIDE7IGkrKykKLSAgICAgIHRoaXNbaV0gPSB0aGlzW2kgKyAxXTsKLSAgICB0aGlzLmxlbmd0aC0tOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCi0KLSAgaW5zcGVjdDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICdbJyArIHRoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10nOwotICB9Ci19KTsKLXZhciBIYXNoID0gewotICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKLSAgICBmb3IgKGtleSBpbiB0aGlzKSB7Ci0gICAgICB2YXIgdmFsdWUgPSB0aGlzW2tleV07Ci0gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIGNvbnRpbnVlOwotCi0gICAgICB2YXIgcGFpciA9IFtrZXksIHZhbHVlXTsKLSAgICAgIHBhaXIua2V5ID0ga2V5OwotICAgICAgcGFpci52YWx1ZSA9IHZhbHVlOwotICAgICAgaXRlcmF0b3IocGFpcik7Ci0gICAgfQotICB9LAotCi0gIGtleXM6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnBsdWNrKCdrZXknKTsKLSAgfSwKLQotICB2YWx1ZXM6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnBsdWNrKCd2YWx1ZScpOwotICB9LAotCi0gIG1lcmdlOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgcmV0dXJuICRIKGhhc2gpLmluamVjdCgkSCh0aGlzKSwgZnVuY3Rpb24obWVyZ2VkSGFzaCwgcGFpcikgewotICAgICAgbWVyZ2VkSGFzaFtwYWlyLmtleV0gPSBwYWlyLnZhbHVlOwotICAgICAgcmV0dXJuIG1lcmdlZEhhc2g7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHBhaXIpIHsKLSAgICAgIHJldHVybiBwYWlyLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJz0nKTsKLSAgICB9KS5qb2luKCcmJyk7Ci0gIH0sCi0KLSAgaW5zcGVjdDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICcjPEhhc2g6eycgKyB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7Ci0gICAgICByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7Ci0gICAgfSkuam9pbignLCAnKSArICd9Pic7Ci0gIH0KLX0KLQotZnVuY3Rpb24gJEgob2JqZWN0KSB7Ci0gIHZhciBoYXNoID0gT2JqZWN0LmV4dGVuZCh7fSwgb2JqZWN0IHx8IHt9KTsKLSAgT2JqZWN0LmV4dGVuZChoYXNoLCBFbnVtZXJhYmxlKTsKLSAgT2JqZWN0LmV4dGVuZChoYXNoLCBIYXNoKTsKLSAgcmV0dXJuIGhhc2g7Ci19Ci1PYmplY3RSYW5nZSA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3RSYW5nZS5wcm90b3R5cGUsIEVudW1lcmFibGUpOwotT2JqZWN0LmV4dGVuZChPYmplY3RSYW5nZS5wcm90b3R5cGUsIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7Ci0gICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgIHRoaXMuZW5kID0gZW5kOwotICAgIHRoaXMuZXhjbHVzaXZlID0gZXhjbHVzaXZlOwotICB9LAotCi0gIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhcnQ7Ci0gICAgZG8gewotICAgICAgaXRlcmF0b3IodmFsdWUpOwotICAgICAgdmFsdWUgPSB2YWx1ZS5zdWNjKCk7Ci0gICAgfSB3aGlsZSAodGhpcy5pbmNsdWRlKHZhbHVlKSk7Ci0gIH0sCi0KLSAgaW5jbHVkZTogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPCB0aGlzLnN0YXJ0KQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSkKLSAgICAgIHJldHVybiB2YWx1ZSA8IHRoaXMuZW5kOwotICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLmVuZDsKLSAgfQotfSk7Ci0KLXZhciAkUiA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgewotICByZXR1cm4gbmV3IE9iamVjdFJhbmdlKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSk7Ci19Ci0KLXZhciBBamF4ID0gewotICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBUcnkudGhlc2UoCi0gICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyl9LAotICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpfSwKLSAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKX0KLSAgICApIHx8IGZhbHNlOwotICB9LAotCi0gIGFjdGl2ZVJlcXVlc3RDb3VudDogMAotfQotCi1BamF4LlJlc3BvbmRlcnMgPSB7Ci0gIHJlc3BvbmRlcnM6IFtdLAotCi0gIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewotICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7Ci0gIH0sCi0KLSAgcmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlclRvQWRkKSB7Ci0gICAgaWYgKCF0aGlzLmluY2x1ZGUocmVzcG9uZGVyVG9BZGQpKQotICAgICAgdGhpcy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyVG9BZGQpOwotICB9LAotCi0gIHVucmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlclRvUmVtb3ZlKSB7Ci0gICAgdGhpcy5yZXNwb25kZXJzID0gdGhpcy5yZXNwb25kZXJzLndpdGhvdXQocmVzcG9uZGVyVG9SZW1vdmUpOwotICB9LAotCi0gIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFjaywgcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7Ci0gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHJlc3BvbmRlcikgewotICAgICAgaWYgKHJlc3BvbmRlcltjYWxsYmFja10gJiYgdHlwZW9mIHJlc3BvbmRlcltjYWxsYmFja10gPT0gJ2Z1bmN0aW9uJykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVzcG9uZGVyLCBbcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uXSk7Ci0gICAgICAgIH0gY2F0Y2ggKGUpIHt9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLU9iamVjdC5leHRlbmQoQWpheC5SZXNwb25kZXJzLCBFbnVtZXJhYmxlKTsKLQotQWpheC5SZXNwb25kZXJzLnJlZ2lzdGVyKHsKLSAgb25DcmVhdGU6IGZ1bmN0aW9uKCkgewotICAgIEFqYXguYWN0aXZlUmVxdWVzdENvdW50Kys7Ci0gIH0sCi0KLSAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7Ci0gICAgQWpheC5hY3RpdmVSZXF1ZXN0Q291bnQtLTsKLSAgfQotfSk7Ci0KLUFqYXguQmFzZSA9IGZ1bmN0aW9uKCkge307Ci1BamF4LkJhc2UucHJvdG90eXBlID0gewotICBzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdGhpcy5vcHRpb25zID0gewotICAgICAgbWV0aG9kOiAgICAgICAncG9zdCcsCi0gICAgICBhc3luY2hyb25vdXM6IHRydWUsCi0gICAgICBwYXJhbWV0ZXJzOiAgICcnCi0gICAgfQotICAgIE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKLSAgfSwKLQotICByZXNwb25zZUlzU3VjY2VzczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1cyA9PSB1bmRlZmluZWQKLSAgICAgICAgfHwgdGhpcy50cmFuc3BvcnQuc3RhdHVzID09IDAKLSAgICAgICAgfHwgKHRoaXMudHJhbnNwb3J0LnN0YXR1cyA+PSAyMDAgJiYgdGhpcy50cmFuc3BvcnQuc3RhdHVzIDwgMzAwKTsKLSAgfSwKLQotICByZXNwb25zZUlzRmFpbHVyZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICF0aGlzLnJlc3BvbnNlSXNTdWNjZXNzKCk7Ci0gIH0KLX0KLQotQWpheC5SZXF1ZXN0ID0gQ2xhc3MuY3JlYXRlKCk7Ci1BamF4LlJlcXVlc3QuRXZlbnRzID0KLSAgWydVbmluaXRpYWxpemVkJywgJ0xvYWRpbmcnLCAnTG9hZGVkJywgJ0ludGVyYWN0aXZlJywgJ0NvbXBsZXRlJ107Ci0KLUFqYXguUmVxdWVzdC5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBamF4LkJhc2UoKSwgewotICBpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKLSAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7Ci0gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgIHRoaXMucmVxdWVzdCh1cmwpOwotICB9LAotCi0gIHJlcXVlc3Q6IGZ1bmN0aW9uKHVybCkgewotICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgfHwgJyc7Ci0gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkgcGFyYW1ldGVycyArPSAnJl89JzsKLQotICAgIHRyeSB7Ci0gICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgIGlmICh0aGlzLm9wdGlvbnMubWV0aG9kID09ICdnZXQnICYmIHBhcmFtZXRlcnMubGVuZ3RoID4gMCkKLSAgICAgICAgdGhpcy51cmwgKz0gKHRoaXMudXJsLm1hdGNoKC9cPy8pID8gJyYnIDogJz8nKSArIHBhcmFtZXRlcnM7Ci0KLSAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25DcmVhdGUnLCB0aGlzLCB0aGlzLnRyYW5zcG9ydCk7Ci0KLSAgICAgIHRoaXMudHJhbnNwb3J0Lm9wZW4odGhpcy5vcHRpb25zLm1ldGhvZCwgdGhpcy51cmwsCi0gICAgICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpOwotCi0gICAgICBpZiAodGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cykgewotICAgICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTsKLSAgICAgICAgc2V0VGltZW91dCgoZnVuY3Rpb24oKSB7dGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKDEpfSkuYmluZCh0aGlzKSwgMTApOwotICAgICAgfQotCi0gICAgICB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7Ci0KLSAgICAgIHZhciBib2R5ID0gdGhpcy5vcHRpb25zLnBvc3RCb2R5ID8gdGhpcy5vcHRpb25zLnBvc3RCb2R5IDogcGFyYW1ldGVyczsKLSAgICAgIHRoaXMudHJhbnNwb3J0LnNlbmQodGhpcy5vcHRpb25zLm1ldGhvZCA9PSAncG9zdCcgPyBib2R5IDogbnVsbCk7Ci0KLSAgICB9IGNhdGNoIChlKSB7Ci0gICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfSwKLQotICBzZXRSZXF1ZXN0SGVhZGVyczogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlcXVlc3RIZWFkZXJzID0KLSAgICAgIFsnWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcsCi0gICAgICAgJ1gtUHJvdG90eXBlLVZlcnNpb24nLCBQcm90b3R5cGUuVmVyc2lvbl07Ci0KLSAgICBpZiAodGhpcy5vcHRpb25zLm1ldGhvZCA9PSAncG9zdCcpIHsKLSAgICAgIHJlcXVlc3RIZWFkZXJzLnB1c2goJ0NvbnRlbnQtdHlwZScsCi0gICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTsKLQotICAgICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3IgTW96aWxsYSBicm93c2VycyB0byB3b3JrIGFyb3VuZAotICAgICAgICogYSBidWcgd2hlcmUgWE1MSHR0cFJlcWV1ZXN0IHNlbmRzIGFuIGluY29ycmVjdCBDb250ZW50LWxlbmd0aAotICAgICAgICogaGVhZGVyLiBTZWUgTW96aWxsYSBCdWd6aWxsYSAjMjQ2NjUxLgotICAgICAgICovCi0gICAgICBpZiAodGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSkKLSAgICAgICAgcmVxdWVzdEhlYWRlcnMucHVzaCgnQ29ubmVjdGlvbicsICdjbG9zZScpOwotICAgIH0KLQotICAgIGlmICh0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnMpCi0gICAgICByZXF1ZXN0SGVhZGVycy5wdXNoLmFwcGx5KHJlcXVlc3RIZWFkZXJzLCB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnMpOwotCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1ZXN0SGVhZGVycy5sZW5ndGg7IGkgKz0gMikKLSAgICAgIHRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIocmVxdWVzdEhlYWRlcnNbaV0sIHJlcXVlc3RIZWFkZXJzW2krMV0pOwotICB9LAotCi0gIG9uU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZTsKLSAgICBpZiAocmVhZHlTdGF0ZSAhPSAxKQotICAgICAgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpOwotICB9LAotCi0gIGhlYWRlcjogZnVuY3Rpb24obmFtZSkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7Ci0gICAgfSBjYXRjaCAoZSkge30KLSAgfSwKLQotICBldmFsSlNPTjogZnVuY3Rpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBldmFsKHRoaXMuaGVhZGVyKCdYLUpTT04nKSk7Ci0gICAgfSBjYXRjaCAoZSkge30KLSAgfSwKLQotICBldmFsUmVzcG9uc2U6IGZ1bmN0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gZXZhbCh0aGlzLnRyYW5zcG9ydC5yZXNwb25zZVRleHQpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9LAotCi0gIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsKLSAgICB2YXIgZXZlbnQgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdOwotICAgIHZhciB0cmFuc3BvcnQgPSB0aGlzLnRyYW5zcG9ydCwganNvbiA9IHRoaXMuZXZhbEpTT04oKTsKLQotICAgIGlmIChldmVudCA9PSAnQ29tcGxldGUnKSB7Ci0gICAgICB0cnkgewotICAgICAgICAodGhpcy5vcHRpb25zWydvbicgKyB0aGlzLnRyYW5zcG9ydC5zdGF0dXNdCi0gICAgICAgICB8fCB0aGlzLm9wdGlvbnNbJ29uJyArICh0aGlzLnJlc3BvbnNlSXNTdWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScpXQotICAgICAgICAgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHRyYW5zcG9ydCwganNvbik7Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgodGhpcy5oZWFkZXIoJ0NvbnRlbnQtdHlwZScpIHx8ICcnKS5tYXRjaCgvXnRleHRcL2phdmFzY3JpcHQvaSkpCi0gICAgICAgIHRoaXMuZXZhbFJlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIGV2ZW50XSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikodHJhbnNwb3J0LCBqc29uKTsKLSAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nICsgZXZlbnQsIHRoaXMsIHRyYW5zcG9ydCwganNvbik7Ci0gICAgfSBjYXRjaCAoZSkgewotICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKLSAgICB9Ci0KLSAgICAvKiBBdm9pZCBtZW1vcnkgbGVhayBpbiBNU0lFOiBjbGVhbiB1cCB0aGUgb25jb21wbGV0ZSBldmVudCBoYW5kbGVyICovCi0gICAgaWYgKGV2ZW50ID09ICdDb21wbGV0ZScpCi0gICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKLSAgfSwKLQotICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7Ci0gICAgKHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbiB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikodGhpcywgZXhjZXB0aW9uKTsKLSAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uRXhjZXB0aW9uJywgdGhpcywgZXhjZXB0aW9uKTsKLSAgfQotfSk7Ci0KLUFqYXguVXBkYXRlciA9IENsYXNzLmNyZWF0ZSgpOwotCi1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoQWpheC5VcGRhdGVyLnByb3RvdHlwZSwgQWpheC5SZXF1ZXN0LnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKLSAgICB0aGlzLmNvbnRhaW5lcnMgPSB7Ci0gICAgICBzdWNjZXNzOiBjb250YWluZXIuc3VjY2VzcyA/ICQoY29udGFpbmVyLnN1Y2Nlc3MpIDogJChjb250YWluZXIpLAotICAgICAgZmFpbHVyZTogY29udGFpbmVyLmZhaWx1cmUgPyAkKGNvbnRhaW5lci5mYWlsdXJlKSA6Ci0gICAgICAgIChjb250YWluZXIuc3VjY2VzcyA/IG51bGwgOiAkKGNvbnRhaW5lcikpCi0gICAgfQotCi0gICAgdGhpcy50cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgpOwotICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgIHZhciBvbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247Ci0gICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSAoZnVuY3Rpb24odHJhbnNwb3J0LCBvYmplY3QpIHsKLSAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpOwotICAgICAgb25Db21wbGV0ZSh0cmFuc3BvcnQsIG9iamVjdCk7Ci0gICAgfSkuYmluZCh0aGlzKTsKLQotICAgIHRoaXMucmVxdWVzdCh1cmwpOwotICB9LAotCi0gIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciByZWNlaXZlciA9IHRoaXMucmVzcG9uc2VJc1N1Y2Nlc3MoKSA/Ci0gICAgICB0aGlzLmNvbnRhaW5lcnMuc3VjY2VzcyA6IHRoaXMuY29udGFpbmVycy5mYWlsdXJlOwotICAgIHZhciByZXNwb25zZSA9IHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dDsKLQotICAgIGlmICghdGhpcy5vcHRpb25zLmV2YWxTY3JpcHRzKQotICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5zdHJpcFNjcmlwdHMoKTsKLQotICAgIGlmIChyZWNlaXZlcikgewotICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnNlcnRpb24pIHsKLSAgICAgICAgbmV3IHRoaXMub3B0aW9ucy5pbnNlcnRpb24ocmVjZWl2ZXIsIHJlc3BvbnNlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVsZW1lbnQudXBkYXRlKHJlY2VpdmVyLCByZXNwb25zZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRoaXMucmVzcG9uc2VJc1N1Y2Nlc3MoKSkgewotICAgICAgaWYgKHRoaXMub25Db21wbGV0ZSkKLSAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uQ29tcGxldGUuYmluZCh0aGlzKSwgMTApOwotICAgIH0KLSAgfQotfSk7Ci0KLUFqYXguUGVyaW9kaWNhbFVwZGF0ZXIgPSBDbGFzcy5jcmVhdGUoKTsKLUFqYXguUGVyaW9kaWNhbFVwZGF0ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKLSAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgdGhpcy5vbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGU7Ci0KLSAgICB0aGlzLmZyZXF1ZW5jeSA9ICh0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDIpOwotICAgIHRoaXMuZGVjYXkgPSAodGhpcy5vcHRpb25zLmRlY2F5IHx8IDEpOwotCi0gICAgdGhpcy51cGRhdGVyID0ge307Ci0gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0KLSAgICB0aGlzLnN0YXJ0KCk7Ci0gIH0sCi0KLSAgc3RhcnQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOwotICAgIHRoaXMub25UaW1lckV2ZW50KCk7Ci0gIH0sCi0KLSAgc3RvcDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy51cGRhdGVyLm9uQ29tcGxldGUgPSB1bmRlZmluZWQ7Ci0gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOwotICAgICh0aGlzLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgdXBkYXRlQ29tcGxldGU6IGZ1bmN0aW9uKHJlcXVlc3QpIHsKLSAgICBpZiAodGhpcy5vcHRpb25zLmRlY2F5KSB7Ci0gICAgICB0aGlzLmRlY2F5ID0gKHJlcXVlc3QucmVzcG9uc2VUZXh0ID09IHRoaXMubGFzdFRleHQgPwotICAgICAgICB0aGlzLmRlY2F5ICogdGhpcy5vcHRpb25zLmRlY2F5IDogMSk7Ci0KLSAgICAgIHRoaXMubGFzdFRleHQgPSByZXF1ZXN0LnJlc3BvbnNlVGV4dDsKLSAgICB9Ci0gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwKLSAgICAgIHRoaXMuZGVjYXkgKiB0aGlzLmZyZXF1ZW5jeSAqIDEwMDApOwotICB9LAotCi0gIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXguVXBkYXRlcih0aGlzLmNvbnRhaW5lciwgdGhpcy51cmwsIHRoaXMub3B0aW9ucyk7Ci0gIH0KLX0pOwotZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IGZ1bmN0aW9uKGNsYXNzTmFtZSwgcGFyZW50RWxlbWVudCkgewotICB2YXIgY2hpbGRyZW4gPSAoJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudC5ib2R5KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOwotICByZXR1cm4gJEEoY2hpbGRyZW4pLmluamVjdChbXSwgZnVuY3Rpb24oZWxlbWVudHMsIGNoaWxkKSB7Ci0gICAgaWYgKGNoaWxkLmNsYXNzTmFtZS5tYXRjaChuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGNsYXNzTmFtZSArICIoXFxzfCQpIikpKQotICAgICAgZWxlbWVudHMucHVzaChjaGlsZCk7Ci0gICAgcmV0dXJuIGVsZW1lbnRzOwotICB9KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWlmICghd2luZG93LkVsZW1lbnQpIHsKLSAgdmFyIEVsZW1lbnQgPSBuZXcgT2JqZWN0KCk7Ci19Ci0KLU9iamVjdC5leHRlbmQoRWxlbWVudCwgewotICB2aXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgcmV0dXJuICQoZWxlbWVudCkuc3R5bGUuZGlzcGxheSAhPSAnbm9uZSc7Ci0gIH0sCi0KLSAgdG9nZ2xlOiBmdW5jdGlvbigpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGVsZW1lbnQgPSAkKGFyZ3VtZW50c1tpXSk7Ci0gICAgICBFbGVtZW50W0VsZW1lbnQudmlzaWJsZShlbGVtZW50KSA/ICdoaWRlJyA6ICdzaG93J10oZWxlbWVudCk7Ci0gICAgfQotICB9LAotCi0gIGhpZGU6IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgZWxlbWVudCA9ICQoYXJndW1lbnRzW2ldKTsKLSAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLSAgICB9Ci0gIH0sCi0KLSAgc2hvdzogZnVuY3Rpb24oKSB7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBlbGVtZW50ID0gJChhcmd1bWVudHNbaV0pOwotICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0gICAgfQotICB9LAotCi0gIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKLSAgfSwKLQotICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKLSAgICAkKGVsZW1lbnQpLmlubmVySFRNTCA9IGh0bWwuc3RyaXBTY3JpcHRzKCk7Ci0gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtodG1sLmV2YWxTY3JpcHRzKCl9LCAxMCk7Ci0gIH0sCi0KLSAgZ2V0SGVpZ2h0OiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OwotICB9LAotCi0gIGNsYXNzTmFtZXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICByZXR1cm4gbmV3IEVsZW1lbnQuQ2xhc3NOYW1lcyhlbGVtZW50KTsKLSAgfSwKLQotICBoYXNDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewotICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOwotICAgIHJldHVybiBFbGVtZW50LmNsYXNzTmFtZXMoZWxlbWVudCkuaW5jbHVkZShjbGFzc05hbWUpOwotICB9LAotCi0gIGFkZENsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7Ci0gICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47Ci0gICAgcmV0dXJuIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KS5hZGQoY2xhc3NOYW1lKTsKLSAgfSwKLQotICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewotICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOwotICAgIHJldHVybiBFbGVtZW50LmNsYXNzTmFtZXMoZWxlbWVudCkucmVtb3ZlKGNsYXNzTmFtZSk7Ci0gIH0sCi0KLSAgLy8gcmVtb3ZlcyB3aGl0ZXNwYWNlLW9ubHkgdGV4dCBub2RlIGNoaWxkcmVuCi0gIGNsZWFuV2hpdGVzcGFjZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgbm9kZSA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpXTsKLSAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkpCi0gICAgICAgIEVsZW1lbnQucmVtb3ZlKG5vZGUpOwotICAgIH0KLSAgfSwKLQotICBlbXB0eTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHJldHVybiAkKGVsZW1lbnQpLmlubmVySFRNTC5tYXRjaCgvXlxzKiQvKTsKLSAgfSwKLQotICBzY3JvbGxUbzogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciB4ID0gZWxlbWVudC54ID8gZWxlbWVudC54IDogZWxlbWVudC5vZmZzZXRMZWZ0LAotICAgICAgICB5ID0gZWxlbWVudC55ID8gZWxlbWVudC55IDogZWxlbWVudC5vZmZzZXRUb3A7Ci0gICAgd2luZG93LnNjcm9sbFRvKHgsIHkpOwotICB9LAotCi0gIGdldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGUuY2FtZWxpemUoKV07Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHsKLSAgICAgICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIHZhbHVlID0gY3NzID8gY3NzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpIDogbnVsbDsKLSAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jdXJyZW50U3R5bGUpIHsKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZS5jYW1lbGl6ZSgpXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAod2luZG93Lm9wZXJhICYmIFsnbGVmdCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJ10uaW5jbHVkZShzdHlsZSkpCi0gICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgdmFsdWUgPSAnYXV0byc7Ci0KLSAgICByZXR1cm4gdmFsdWUgPT0gJ2F1dG8nID8gbnVsbCA6IHZhbHVlOwotICB9LAotCi0gIHNldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGZvciAobmFtZSBpbiBzdHlsZSkKLSAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZS5jYW1lbGl6ZSgpXSA9IHN0eWxlW25hbWVdOwotICB9LAotCi0gIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpICE9ICdub25lJykKLSAgICAgIHJldHVybiB7d2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHR9OwotCi0gICAgLy8gQWxsICpXaWR0aCBhbmQgKkhlaWdodCBwcm9wZXJ0aWVzIGdpdmUgMCBvbiBlbGVtZW50cyB3aXRoIGRpc3BsYXkgbm9uZSwKLSAgICAvLyBzbyBlbmFibGUgdGhlIGVsZW1lbnQgdGVtcG9yYXJpbHkKLSAgICB2YXIgZWxzID0gZWxlbWVudC5zdHlsZTsKLSAgICB2YXIgb3JpZ2luYWxWaXNpYmlsaXR5ID0gZWxzLnZpc2liaWxpdHk7Ci0gICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBlbHMucG9zaXRpb247Ci0gICAgZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKLSAgICBlbHMucG9zaXRpb24gPSAnYWJzb2x1dGUnOwotICAgIGVscy5kaXNwbGF5ID0gJyc7Ci0gICAgdmFyIG9yaWdpbmFsV2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoOwotICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OwotICAgIGVscy5kaXNwbGF5ID0gJ25vbmUnOwotICAgIGVscy5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247Ci0gICAgZWxzLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7Ci0gICAgcmV0dXJuIHt3aWR0aDogb3JpZ2luYWxXaWR0aCwgaGVpZ2h0OiBvcmlnaW5hbEhlaWdodH07Ci0gIH0sCi0KLSAgbWFrZVBvc2l0aW9uZWQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgcG9zID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKTsKLSAgICBpZiAocG9zID09ICdzdGF0aWMnIHx8ICFwb3MpIHsKLSAgICAgIGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdHJ1ZTsKLSAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwotICAgICAgLy8gT3BlcmEgcmV0dXJucyB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbmluZyBjb250ZXh0LCB3aGVuIGFuCi0gICAgICAvLyBlbGVtZW50IGlzIHBvc2l0aW9uIHJlbGF0aXZlIGJ1dCB0b3AgYW5kIGxlZnQgaGF2ZSBub3QgYmVlbiBkZWZpbmVkCi0gICAgICBpZiAod2luZG93Lm9wZXJhKSB7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gMDsKLSAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgdW5kb1Bvc2l0aW9uZWQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICBpZiAoZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQpIHsKLSAgICAgIGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdW5kZWZpbmVkOwotICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0KLSAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0KLSAgICAgICAgZWxlbWVudC5zdHlsZS5ib3R0b20gPQotICAgICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJyc7Ci0gICAgfQotICB9LAotCi0gIG1ha2VDbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGlmIChlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuOwotICAgIGVsZW1lbnQuX292ZXJmbG93ID0gZWxlbWVudC5zdHlsZS5vdmVyZmxvdzsKLSAgICBpZiAoKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwgJ3Zpc2libGUnKSAhPSAnaGlkZGVuJykKLSAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKLSAgfSwKLQotICB1bmRvQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybjsKLSAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gZWxlbWVudC5fb3ZlcmZsb3c7Ci0gICAgZWxlbWVudC5fb3ZlcmZsb3cgPSB1bmRlZmluZWQ7Ci0gIH0KLX0pOwotCi12YXIgVG9nZ2xlID0gbmV3IE9iamVjdCgpOwotVG9nZ2xlLmRpc3BsYXkgPSBFbGVtZW50LnRvZ2dsZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUFic3RyYWN0Lkluc2VydGlvbiA9IGZ1bmN0aW9uKGFkamFjZW5jeSkgewotICB0aGlzLmFkamFjZW5jeSA9IGFkamFjZW5jeTsKLX0KLQotQWJzdHJhY3QuSW5zZXJ0aW9uLnByb3RvdHlwZSA9IHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgdGhpcy5jb250ZW50ID0gY29udGVudC5zdHJpcFNjcmlwdHMoKTsKLQotICAgIGlmICh0aGlzLmFkamFjZW5jeSAmJiB0aGlzLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKSB7Ci0gICAgICB0cnkgewotICAgICAgICB0aGlzLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKHRoaXMuYWRqYWNlbmN5LCB0aGlzLmNvbnRlbnQpOwotICAgICAgfSBjYXRjaCAoZSkgewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAndGJvZHknKSB7Ci0gICAgICAgICAgdGhpcy5pbnNlcnRDb250ZW50KHRoaXMuY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwotICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVJhbmdlKSB0aGlzLmluaXRpYWxpemVSYW5nZSgpOwotICAgICAgdGhpcy5pbnNlcnRDb250ZW50KFt0aGlzLnJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0aGlzLmNvbnRlbnQpXSk7Ci0gICAgfQotCi0gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtjb250ZW50LmV2YWxTY3JpcHRzKCl9LCAxMCk7Ci0gIH0sCi0KLSAgY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgIGRpdi5pbm5lckhUTUwgPSAnPHRhYmxlPjx0Ym9keT4nICsgdGhpcy5jb250ZW50ICsgJzwvdGJvZHk+PC90YWJsZT4nOwotICAgIHJldHVybiAkQShkaXYuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpOwotICB9Ci19Ci0KLXZhciBJbnNlcnRpb24gPSBuZXcgT2JqZWN0KCk7Ci0KLUluc2VydGlvbi5CZWZvcmUgPSBDbGFzcy5jcmVhdGUoKTsKLUluc2VydGlvbi5CZWZvcmUucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVCZWdpbicpLCB7Ci0gIGluaXRpYWxpemVSYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yYW5nZS5zZXRTdGFydEJlZm9yZSh0aGlzLmVsZW1lbnQpOwotICB9LAotCi0gIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgewotICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgewotICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnQpOwotICAgIH0pLmJpbmQodGhpcykpOwotICB9Ci19KTsKLQotSW5zZXJ0aW9uLlRvcCA9IENsYXNzLmNyZWF0ZSgpOwotSW5zZXJ0aW9uLlRvcC5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2FmdGVyQmVnaW4nKSwgewotICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0cnVlKTsKLSAgfSwKLQotICBpbnNlcnRDb250ZW50OiBmdW5jdGlvbihmcmFnbWVudHMpIHsKLSAgICBmcmFnbWVudHMucmV2ZXJzZShmYWxzZSkuZWFjaCgoZnVuY3Rpb24oZnJhZ21lbnQpIHsKLSAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTsKLSAgICB9KS5iaW5kKHRoaXMpKTsKLSAgfQotfSk7Ci0KLUluc2VydGlvbi5Cb3R0b20gPSBDbGFzcy5jcmVhdGUoKTsKLUluc2VydGlvbi5Cb3R0b20ucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVFbmQnKSwgewotICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0aGlzLmVsZW1lbnQpOwotICB9LAotCi0gIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgewotICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgewotICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTsKLSAgICB9KS5iaW5kKHRoaXMpKTsKLSAgfQotfSk7Ci0KLUluc2VydGlvbi5BZnRlciA9IENsYXNzLmNyZWF0ZSgpOwotSW5zZXJ0aW9uLkFmdGVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0Lkluc2VydGlvbignYWZ0ZXJFbmQnKSwgewotICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmFuZ2Uuc2V0U3RhcnRBZnRlcih0aGlzLmVsZW1lbnQpOwotICB9LAotCi0gIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgewotICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgewotICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LAotICAgICAgICB0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmcpOwotICAgIH0pLmJpbmQodGhpcykpOwotICB9Ci19KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUVsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOwotRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSA9IHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIH0sCi0KLSAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDA7Ci0gICAgfSkuX2VhY2goaXRlcmF0b3IpOwotICB9LAotCi0gIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7Ci0gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgfSwKLQotICBhZGQ6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvQWRkKSB7Ci0gICAgaWYgKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkpIHJldHVybjsKLSAgICB0aGlzLnNldCh0aGlzLnRvQXJyYXkoKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7Ci0gIH0sCi0KLSAgcmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkgewotICAgIGlmICghdGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvUmVtb3ZlKSkgcmV0dXJuOwotICAgIHRoaXMuc2V0KHRoaXMuc2VsZWN0KGZ1bmN0aW9uKGNsYXNzTmFtZSkgewotICAgICAgcmV0dXJuIGNsYXNzTmFtZSAhPSBjbGFzc05hbWVUb1JlbW92ZTsKLSAgICB9KS5qb2luKCcgJykpOwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuam9pbignICcpOwotICB9Ci19Ci0KLU9iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7Ci12YXIgRmllbGQgPSB7Ci0gIGNsZWFyOiBmdW5jdGlvbigpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICQoYXJndW1lbnRzW2ldKS52YWx1ZSA9ICcnOwotICB9LAotCi0gIGZvY3VzOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgJChlbGVtZW50KS5mb2N1cygpOwotICB9LAotCi0gIHByZXNlbnQ6IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgaWYgKCQoYXJndW1lbnRzW2ldKS52YWx1ZSA9PSAnJykgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9LAotCi0gIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgICQoZWxlbWVudCkuc2VsZWN0KCk7Ci0gIH0sCi0KLSAgYWN0aXZhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICBlbGVtZW50LmZvY3VzKCk7Ci0gICAgaWYgKGVsZW1lbnQuc2VsZWN0KQotICAgICAgZWxlbWVudC5zZWxlY3QoKTsKLSAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdmFyIEZvcm0gPSB7Ci0gIHNlcmlhbGl6ZTogZnVuY3Rpb24oZm9ybSkgewotICAgIHZhciBlbGVtZW50cyA9IEZvcm0uZ2V0RWxlbWVudHMoJChmb3JtKSk7Ci0gICAgdmFyIHF1ZXJ5Q29tcG9uZW50cyA9IG5ldyBBcnJheSgpOwotCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIHF1ZXJ5Q29tcG9uZW50ID0gRm9ybS5FbGVtZW50LnNlcmlhbGl6ZShlbGVtZW50c1tpXSk7Ci0gICAgICBpZiAocXVlcnlDb21wb25lbnQpCi0gICAgICAgIHF1ZXJ5Q29tcG9uZW50cy5wdXNoKHF1ZXJ5Q29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcXVlcnlDb21wb25lbnRzLmpvaW4oJyYnKTsKLSAgfSwKLQotICBnZXRFbGVtZW50czogZnVuY3Rpb24oZm9ybSkgewotICAgIGZvcm0gPSAkKGZvcm0pOwotICAgIHZhciBlbGVtZW50cyA9IG5ldyBBcnJheSgpOwotCi0gICAgZm9yICh0YWdOYW1lIGluIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycykgewotICAgICAgdmFyIHRhZ0VsZW1lbnRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKLSAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGFnRWxlbWVudHMubGVuZ3RoOyBqKyspCi0gICAgICAgIGVsZW1lbnRzLnB1c2godGFnRWxlbWVudHNbal0pOwotICAgIH0KLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0sCi0KLSAgZ2V0SW5wdXRzOiBmdW5jdGlvbihmb3JtLCB0eXBlTmFtZSwgbmFtZSkgewotICAgIGZvcm0gPSAkKGZvcm0pOwotICAgIHZhciBpbnB1dHMgPSBmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOwotCi0gICAgaWYgKCF0eXBlTmFtZSAmJiAhbmFtZSkKLSAgICAgIHJldHVybiBpbnB1dHM7Ci0KLSAgICB2YXIgbWF0Y2hpbmdJbnB1dHMgPSBuZXcgQXJyYXkoKTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldOwotICAgICAgaWYgKCh0eXBlTmFtZSAmJiBpbnB1dC50eXBlICE9IHR5cGVOYW1lKSB8fAotICAgICAgICAgIChuYW1lICYmIGlucHV0Lm5hbWUgIT0gbmFtZSkpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgbWF0Y2hpbmdJbnB1dHMucHVzaChpbnB1dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoaW5nSW5wdXRzOwotICB9LAotCi0gIGRpc2FibGU6IGZ1bmN0aW9uKGZvcm0pIHsKLSAgICB2YXIgZWxlbWVudHMgPSBGb3JtLmdldEVsZW1lbnRzKGZvcm0pOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICBlbGVtZW50LmJsdXIoKTsKLSAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSAndHJ1ZSc7Ci0gICAgfQotICB9LAotCi0gIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgewotICAgIHZhciBlbGVtZW50cyA9IEZvcm0uZ2V0RWxlbWVudHMoZm9ybSk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSAnJzsKLSAgICB9Ci0gIH0sCi0KLSAgZmluZEZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgewotICAgIHJldHVybiBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmZpbmQoZnVuY3Rpb24oZWxlbWVudCkgewotICAgICAgcmV0dXJuIGVsZW1lbnQudHlwZSAhPSAnaGlkZGVuJyAmJiAhZWxlbWVudC5kaXNhYmxlZCAmJgotICAgICAgICBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYSddLmluY2x1ZGUoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgIH0pOwotICB9LAotCi0gIGZvY3VzRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7Ci0gICAgRmllbGQuYWN0aXZhdGUoRm9ybS5maW5kRmlyc3RFbGVtZW50KGZvcm0pKTsKLSAgfSwKLQotICByZXNldDogZnVuY3Rpb24oZm9ybSkgewotICAgICQoZm9ybSkucmVzZXQoKTsKLSAgfQotfQotCi1Gb3JtLkVsZW1lbnQgPSB7Ci0gIHNlcmlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBtZXRob2QgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKLSAgICB2YXIgcGFyYW1ldGVyID0gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxlbWVudCk7Ci0KLSAgICBpZiAocGFyYW1ldGVyKSB7Ci0gICAgICB2YXIga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlclswXSk7Ci0gICAgICBpZiAoa2V5Lmxlbmd0aCA9PSAwKSByZXR1cm47Ci0KLSAgICAgIGlmIChwYXJhbWV0ZXJbMV0uY29uc3RydWN0b3IgIT0gQXJyYXkpCi0gICAgICAgIHBhcmFtZXRlclsxXSA9IFtwYXJhbWV0ZXJbMV1dOwotCi0gICAgICByZXR1cm4gcGFyYW1ldGVyWzFdLm1hcChmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICByZXR1cm4ga2V5ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKLSAgICAgIH0pLmpvaW4oJyYnKTsKLSAgICB9Ci0gIH0sCi0KLSAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgdmFyIHBhcmFtZXRlciA9IEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpOwotCi0gICAgaWYgKHBhcmFtZXRlcikKLSAgICAgIHJldHVybiBwYXJhbWV0ZXJbMV07Ci0gIH0KLX0KLQotRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzID0gewotICBpbnB1dDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKLSAgICAgIGNhc2UgJ3N1Ym1pdCc6Ci0gICAgICBjYXNlICdoaWRkZW4nOgotICAgICAgY2FzZSAncGFzc3dvcmQnOgotICAgICAgY2FzZSAndGV4dCc6Ci0gICAgICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMudGV4dGFyZWEoZWxlbWVudCk7Ci0gICAgICBjYXNlICdjaGVja2JveCc6Ci0gICAgICBjYXNlICdyYWRpbyc6Ci0gICAgICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMuaW5wdXRTZWxlY3RvcihlbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0gIGlucHV0U2VsZWN0b3I6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBpZiAoZWxlbWVudC5jaGVja2VkKQotICAgICAgcmV0dXJuIFtlbGVtZW50Lm5hbWUsIGVsZW1lbnQudmFsdWVdOwotICB9LAotCi0gIHRleHRhcmVhOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgcmV0dXJuIFtlbGVtZW50Lm5hbWUsIGVsZW1lbnQudmFsdWVdOwotICB9LAotCi0gIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbZWxlbWVudC50eXBlID09ICdzZWxlY3Qtb25lJyA/Ci0gICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7Ci0gIH0sCi0KLSAgc2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdmFyIHZhbHVlID0gJycsIG9wdCwgaW5kZXggPSBlbGVtZW50LnNlbGVjdGVkSW5kZXg7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgIG9wdCA9IGVsZW1lbnQub3B0aW9uc1tpbmRleF07Ci0gICAgICB2YWx1ZSA9IG9wdC52YWx1ZTsKLSAgICAgIGlmICghdmFsdWUgJiYgISgndmFsdWUnIGluIG9wdCkpCi0gICAgICAgIHZhbHVlID0gb3B0LnRleHQ7Ci0gICAgfQotICAgIHJldHVybiBbZWxlbWVudC5uYW1lLCB2YWx1ZV07Ci0gIH0sCi0KLSAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHZhciB2YWx1ZSA9IG5ldyBBcnJheSgpOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIG9wdCA9IGVsZW1lbnQub3B0aW9uc1tpXTsKLSAgICAgIGlmIChvcHQuc2VsZWN0ZWQpIHsKLSAgICAgICAgdmFyIG9wdFZhbHVlID0gb3B0LnZhbHVlOwotICAgICAgICBpZiAoIW9wdFZhbHVlICYmICEoJ3ZhbHVlJyBpbiBvcHQpKQotICAgICAgICAgIG9wdFZhbHVlID0gb3B0LnRleHQ7Ci0gICAgICAgIHZhbHVlLnB1c2gob3B0VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gW2VsZW1lbnQubmFtZSwgdmFsdWVdOwotICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12YXIgJEYgPSBGb3JtLkVsZW1lbnQuZ2V0VmFsdWU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1BYnN0cmFjdC5UaW1lZE9ic2VydmVyID0gZnVuY3Rpb24oKSB7fQotQWJzdHJhY3QuVGltZWRPYnNlcnZlci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIGZyZXF1ZW5jeSwgY2FsbGJhY2spIHsKLSAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKLSAgICB0aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7Ci0gICAgdGhpcy5jYWxsYmFjayAgPSBjYWxsYmFjazsKLQotICAgIHRoaXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjaygpOwotICB9LAotCi0gIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgewotICAgIHNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7Ci0gIH0sCi0KLSAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0gICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOwotICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLX0KLQotRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1Gb3JtLkVsZW1lbnQuT2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuVGltZWRPYnNlcnZlcigpLCB7Ci0gIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7Ci0gIH0KLX0pOwotCi1Gb3JtLk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1Gb3JtLk9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIoKSwgewotICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7Ci0gIH0KLX0pOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IGZ1bmN0aW9uKCkge30KLUFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykgewotICAgIHRoaXMuZWxlbWVudCAgPSAkKGVsZW1lbnQpOwotICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKLQotICAgIHRoaXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykKLSAgICAgIHRoaXMucmVnaXN0ZXJGb3JtQ2FsbGJhY2tzKCk7Ci0gICAgZWxzZQotICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0KLSAgb25FbGVtZW50RXZlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLSAgICBpZiAodGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUpIHsKLSAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7Ci0gICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfSwKLQotICByZWdpc3RlckZvcm1DYWxsYmFja3M6IGZ1bmN0aW9uKCkgewotICAgIHZhciBlbGVtZW50cyA9IEZvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKGVsZW1lbnRzW2ldKTsKLSAgfSwKLQotICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgaWYgKGVsZW1lbnQudHlwZSkgewotICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgewotICAgICAgICBjYXNlICdjaGVja2JveCc6Ci0gICAgICAgIGNhc2UgJ3JhZGlvJzoKLSAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzoKLSAgICAgICAgY2FzZSAndGV4dCc6Ci0gICAgICAgIGNhc2UgJ3RleHRhcmVhJzoKLSAgICAgICAgY2FzZSAnc2VsZWN0LW9uZSc6Ci0gICAgICAgIGNhc2UgJ3NlbGVjdC1tdWx0aXBsZSc6Ci0gICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKLUZvcm0uRWxlbWVudC5FdmVudE9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIoKSwgewotICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOwotICB9Ci19KTsKLQotRm9ybS5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7Ci1Gb3JtLkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuRXZlbnRPYnNlcnZlcigpLCB7Ci0gIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKLSAgfQotfSk7Ci1pZiAoIXdpbmRvdy5FdmVudCkgewotICB2YXIgRXZlbnQgPSBuZXcgT2JqZWN0KCk7Ci19Ci0KLU9iamVjdC5leHRlbmQoRXZlbnQsIHsKLSAgS0VZX0JBQ0tTUEFDRTogOCwKLSAgS0VZX1RBQjogICAgICAgOSwKLSAgS0VZX1JFVFVSTjogICAxMywKLSAgS0VZX0VTQzogICAgICAyNywKLSAgS0VZX0xFRlQ6ICAgICAzNywKLSAgS0VZX1VQOiAgICAgICAzOCwKLSAgS0VZX1JJR0hUOiAgICAzOSwKLSAgS0VZX0RPV046ICAgICA0MCwKLSAgS0VZX0RFTEVURTogICA0NiwKLQotICBlbGVtZW50OiBmdW5jdGlvbihldmVudCkgewotICAgIHJldHVybiBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKLSAgfSwKLQotICBpc0xlZnRDbGljazogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICByZXR1cm4gKCgoZXZlbnQud2hpY2gpICYmIChldmVudC53aGljaCA9PSAxKSkgfHwKLSAgICAgICAgICAgICgoZXZlbnQuYnV0dG9uKSAmJiAoZXZlbnQuYnV0dG9uID09IDEpKSk7Ci0gIH0sCi0KLSAgcG9pbnRlclg6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgcmV0dXJuIGV2ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsKLSAgICAgIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKTsKLSAgfSwKLQotICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICByZXR1cm4gZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkgKwotICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKTsKLSAgfSwKLQotICBzdG9wOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkgewotICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiB0YWdOYW1lLCBzdGFydGluZyBmcm9tIHRoZQotICAvLyBub2RlIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9uOyB0cmF2ZXJzZXMgdGhlIERPTSB1cHdhcmRzCi0gIGZpbmRFbGVtZW50OiBmdW5jdGlvbihldmVudCwgdGFnTmFtZSkgewotICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7Ci0gICAgd2hpbGUgKGVsZW1lbnQucGFyZW50Tm9kZSAmJiAoIWVsZW1lbnQudGFnTmFtZSB8fAotICAgICAgICAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpKSkpCi0gICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgIHJldHVybiBlbGVtZW50OwotICB9LAotCi0gIG9ic2VydmVyczogZmFsc2UsCi0KLSAgX29ic2VydmVBbmRDYWNoZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsKLSAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzKSB0aGlzLm9ic2VydmVycyA9IFtdOwotICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKLSAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goW2VsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlXSk7Ci0gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOwotICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hdHRhY2hFdmVudCkgewotICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChbZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmVdKTsKLSAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIG5hbWUsIG9ic2VydmVyKTsKLSAgICB9Ci0gIH0sCi0KLSAgdW5sb2FkQ2FjaGU6IGZ1bmN0aW9uKCkgewotICAgIGlmICghRXZlbnQub2JzZXJ2ZXJzKSByZXR1cm47Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBFdmVudC5vYnNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcuYXBwbHkodGhpcywgRXZlbnQub2JzZXJ2ZXJzW2ldKTsKLSAgICAgIEV2ZW50Lm9ic2VydmVyc1tpXVswXSA9IG51bGw7Ci0gICAgfQotICAgIEV2ZW50Lm9ic2VydmVycyA9IGZhbHNlOwotICB9LAotCi0gIG9ic2VydmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlKSB7Ci0gICAgdmFyIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHVzZUNhcHR1cmUgPSB1c2VDYXB0dXJlIHx8IGZhbHNlOwotCi0gICAgaWYgKG5hbWUgPT0gJ2tleXByZXNzJyAmJgotICAgICAgICAobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvKQotICAgICAgICB8fCBlbGVtZW50LmF0dGFjaEV2ZW50KSkKLSAgICAgIG5hbWUgPSAna2V5ZG93bic7Ci0KLSAgICB0aGlzLl9vYnNlcnZlQW5kQ2FjaGUoZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOwotICB9LAotCi0gIHN0b3BPYnNlcnZpbmc6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlKSB7Ci0gICAgdmFyIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHVzZUNhcHR1cmUgPSB1c2VDYXB0dXJlIHx8IGZhbHNlOwotCi0gICAgaWYgKG5hbWUgPT0gJ2tleXByZXNzJyAmJgotICAgICAgICAobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvKQotICAgICAgICB8fCBlbGVtZW50LmRldGFjaEV2ZW50KSkKLSAgICAgIG5hbWUgPSAna2V5ZG93bic7Ci0KLSAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7Ci0gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOwotICAgIH0gZWxzZSBpZiAoZWxlbWVudC5kZXRhY2hFdmVudCkgewotICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgbmFtZSwgb2JzZXJ2ZXIpOwotICAgIH0KLSAgfQotfSk7Ci0KLS8qIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFICovCi1FdmVudC5vYnNlcnZlKHdpbmRvdywgJ3VubG9hZCcsIEV2ZW50LnVubG9hZENhY2hlLCBmYWxzZSk7Ci12YXIgUG9zaXRpb24gPSB7Ci0gIC8vIHNldCB0byB0cnVlIGlmIG5lZWRlZCwgd2FybmluZzogZmlyZWZveCBwZXJmb3JtYW5jZSBwcm9ibGVtcwotICAvLyBOT1QgbmVlZWRlZCBmb3IgcGFnZSBzY3JvbGxpbmcsIG9ubHkgaWYgZHJhZ2dhYmxlIGNvbnRhaW5lZCBpbgotICAvLyBzY3JvbGxhYmxlIGVsZW1lbnRzCi0gIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwKLQotICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXQsIGV2ZXJ5IHRpbWUgdGhlCi0gIC8vIHBhZ2UgaXMgc2Nyb2xsZWQKLSAgcHJlcGFyZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VYT2Zmc2V0Ci0gICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQKLSAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQKLSAgICAgICAgICAgICAgICB8fCAwOwotICAgIHRoaXMuZGVsdGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldAotICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AKLSAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcAotICAgICAgICAgICAgICAgIHx8IDA7Ci0gIH0sCi0KLSAgcmVhbE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwotICAgIGRvIHsKLSAgICAgIHZhbHVlVCArPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsKLSAgICAgIHZhbHVlTCArPSBlbGVtZW50LnNjcm9sbExlZnQgfHwgMDsKLSAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7Ci0gICAgfSB3aGlsZSAoZWxlbWVudCk7Ci0gICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07Ci0gIH0sCi0KLSAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwotICAgIGRvIHsKLSAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKLSAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKLSAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKLSAgICB9IHdoaWxlIChlbGVtZW50KTsKLSAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsKLSAgfSwKLQotICBwb3NpdGlvbmVkT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7Ci0gICAgZG8gewotICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOwotICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOwotICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OwotICAgICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgcCA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7Ci0gICAgICAgIGlmIChwID09ICdyZWxhdGl2ZScgfHwgcCA9PSAnYWJzb2x1dGUnKSBicmVhazsKLSAgICAgIH0KLSAgICB9IHdoaWxlIChlbGVtZW50KTsKLSAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsKLSAgfSwKLQotICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDsKLSAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZWxlbWVudDsKLQotICAgIHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPSBkb2N1bWVudC5ib2R5KQotICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotCi0gICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7Ci0gIH0sCi0KLSAgLy8gY2FjaGVzIHgveSBjb29yZGluYXRlIHBhaXIgdG8gdXNlIHdpdGggb3ZlcmxhcAotICB3aXRoaW46IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKLSAgICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykKLSAgICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7Ci0gICAgdGhpcy54Y29tcCA9IHg7Ci0gICAgdGhpcy55Y29tcCA9IHk7Ci0gICAgdGhpcy5vZmZzZXQgPSB0aGlzLmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7Ci0KLSAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRbMV0gJiYKLSAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJgotICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFswXSAmJgotICAgICAgICAgICAgeCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOwotICB9LAotCi0gIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKLSAgICB2YXIgb2Zmc2V0Y2FjaGUgPSB0aGlzLnJlYWxPZmZzZXQoZWxlbWVudCk7Ci0KLSAgICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7Ci0gICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOwotICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOwotCi0gICAgcmV0dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmCi0gICAgICAgICAgICB0aGlzLnljb21wIDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKLSAgICAgICAgICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYKLSAgICAgICAgICAgIHRoaXMueGNvbXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKLSAgfSwKLQotICAvLyB3aXRoaW4gbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYmVmb3JlCi0gIG92ZXJsYXA6IGZ1bmN0aW9uKG1vZGUsIGVsZW1lbnQpIHsKLSAgICBpZiAoIW1vZGUpIHJldHVybiAwOwotICAgIGlmIChtb2RlID09ICd2ZXJ0aWNhbCcpCi0gICAgICByZXR1cm4gKCh0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KSAtIHRoaXMueWNvbXApIC8KLSAgICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7Ci0gICAgaWYgKG1vZGUgPT0gJ2hvcml6b250YWwnKQotICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKSAtIHRoaXMueGNvbXApIC8KLSAgICAgICAgZWxlbWVudC5vZmZzZXRXaWR0aDsKLSAgfSwKLQotICBjbG9uZTogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpIHsKLSAgICBzb3VyY2UgPSAkKHNvdXJjZSk7Ci0gICAgdGFyZ2V0ID0gJCh0YXJnZXQpOwotICAgIHRhcmdldC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7Ci0gICAgdmFyIG9mZnNldHMgPSB0aGlzLmN1bXVsYXRpdmVPZmZzZXQoc291cmNlKTsKLSAgICB0YXJnZXQuc3R5bGUudG9wICAgID0gb2Zmc2V0c1sxXSArICdweCc7Ci0gICAgdGFyZ2V0LnN0eWxlLmxlZnQgICA9IG9mZnNldHNbMF0gKyAncHgnOwotICAgIHRhcmdldC5zdHlsZS53aWR0aCAgPSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOwotICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBzb3VyY2Uub2Zmc2V0SGVpZ2h0ICsgJ3B4JzsKLSAgfSwKLQotICBwYWdlOiBmdW5jdGlvbihmb3JFbGVtZW50KSB7Ci0gICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7Ci0KLSAgICB2YXIgZWxlbWVudCA9IGZvckVsZW1lbnQ7Ci0gICAgZG8gewotICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOwotICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOwotCi0gICAgICAvLyBTYWZhcmkgZml4Ci0gICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQ9PWRvY3VtZW50LmJvZHkpCi0gICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsJ3Bvc2l0aW9uJyk9PSdhYnNvbHV0ZScpIGJyZWFrOwotCi0gICAgfSB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50KTsKLQotICAgIGVsZW1lbnQgPSBmb3JFbGVtZW50OwotICAgIGRvIHsKLSAgICAgIHZhbHVlVCAtPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsKLSAgICAgIHZhbHVlTCAtPSBlbGVtZW50LnNjcm9sbExlZnQgfHwgMDsKLSAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKTsKLQotICAgIHJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOwotICB9LAotCi0gIGNsb25lOiBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCkgewotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBzZXRMZWZ0OiAgICB0cnVlLAotICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKLSAgICAgIHNldFdpZHRoOiAgIHRydWUsCi0gICAgICBzZXRIZWlnaHQ6ICB0cnVlLAotICAgICAgb2Zmc2V0VG9wOiAgMCwKLSAgICAgIG9mZnNldExlZnQ6IDAKLSAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pCi0KLSAgICAvLyBmaW5kIHBhZ2UgcG9zaXRpb24gb2Ygc291cmNlCi0gICAgc291cmNlID0gJChzb3VyY2UpOwotICAgIHZhciBwID0gUG9zaXRpb24ucGFnZShzb3VyY2UpOwotCi0gICAgLy8gZmluZCBjb29yZGluYXRlIHN5c3RlbSB0byB1c2UKLSAgICB0YXJnZXQgPSAkKHRhcmdldCk7Ci0gICAgdmFyIGRlbHRhID0gWzAsIDBdOwotICAgIHZhciBwYXJlbnQgPSBudWxsOwotICAgIC8vIGRlbHRhIFswLDBdIHdpbGwgZG8gZmluZSB3aXRoIHBvc2l0aW9uOiBmaXhlZCBlbGVtZW50cywKLSAgICAvLyBwb3NpdGlvbjphYnNvbHV0ZSBuZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCi0gICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUodGFyZ2V0LCdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHsKLSAgICAgIHBhcmVudCA9IFBvc2l0aW9uLm9mZnNldFBhcmVudCh0YXJnZXQpOwotICAgICAgZGVsdGEgPSBQb3NpdGlvbi5wYWdlKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLy8gY29ycmVjdCBieSBib2R5IG9mZnNldHMgKGZpeGVzIFNhZmFyaSkKLSAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJvZHkpIHsKLSAgICAgIGRlbHRhWzBdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0TGVmdDsKLSAgICAgIGRlbHRhWzFdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0VG9wOwotICAgIH0KLQotICAgIC8vIHNldCBwb3NpdGlvbgotICAgIGlmKG9wdGlvbnMuc2V0TGVmdCkgICB0YXJnZXQuc3R5bGUubGVmdCAgPSAocFswXSAtIGRlbHRhWzBdICsgb3B0aW9ucy5vZmZzZXRMZWZ0KSArICdweCc7Ci0gICAgaWYob3B0aW9ucy5zZXRUb3ApICAgIHRhcmdldC5zdHlsZS50b3AgICA9IChwWzFdIC0gZGVsdGFbMV0gKyBvcHRpb25zLm9mZnNldFRvcCkgKyAncHgnOwotICAgIGlmKG9wdGlvbnMuc2V0V2lkdGgpICB0YXJnZXQuc3R5bGUud2lkdGggPSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOwotICAgIGlmKG9wdGlvbnMuc2V0SGVpZ2h0KSB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gc291cmNlLm9mZnNldEhlaWdodCArICdweCc7Ci0gIH0sCi0KLSAgYWJzb2x1dGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGlmIChlbGVtZW50LnN0eWxlLnBvc2l0aW9uID09ICdhYnNvbHV0ZScpIHJldHVybjsKLSAgICBQb3NpdGlvbi5wcmVwYXJlKCk7Ci0KLSAgICB2YXIgb2Zmc2V0cyA9IFBvc2l0aW9uLnBvc2l0aW9uZWRPZmZzZXQoZWxlbWVudCk7Ci0gICAgdmFyIHRvcCAgICAgPSBvZmZzZXRzWzFdOwotICAgIHZhciBsZWZ0ICAgID0gb2Zmc2V0c1swXTsKLSAgICB2YXIgd2lkdGggICA9IGVsZW1lbnQuY2xpZW50V2lkdGg7Ci0gICAgdmFyIGhlaWdodCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKLQotICAgIGVsZW1lbnQuX29yaWdpbmFsTGVmdCAgID0gbGVmdCAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0ICB8fCAwKTsKLSAgICBlbGVtZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wIHx8IDApOwotICAgIGVsZW1lbnQuX29yaWdpbmFsV2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0aDsKLSAgICBlbGVtZW50Ll9vcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0OwotCi0gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7Ci0gICAgZWxlbWVudC5zdHlsZS50b3AgICAgPSB0b3AgKyAncHgnOzsKLSAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOzsKLSAgICBlbGVtZW50LnN0eWxlLndpZHRoICA9IHdpZHRoICsgJ3B4Jzs7Ci0gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOzsKLSAgfSwKLQotICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgaWYgKGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPT0gJ3JlbGF0aXZlJykgcmV0dXJuOwotICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKLQotICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwotICAgIHZhciB0b3AgID0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVudC5fb3JpZ2luYWxUb3AgfHwgMCk7Ci0gICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7Ci0KLSAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7Ci0gICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsKLSAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0OwotICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5fb3JpZ2luYWxXaWR0aDsKLSAgfQotfQotCi0vLyBTYWZhcmkgcmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBpcyBhYnNvbHV0ZWx5Ci0vLyBwb3NpdGlvbmVkLiAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlZGVmaW5lIFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQgZm9yCi0vLyBLSFRNTC9XZWJLaXQgb25seS4KLWlmICgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewotICBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0ID0gZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwotICAgIGRvIHsKLSAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKLSAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKLSAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5KQotICAgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSBicmVhazsKLQotICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OwotICAgIH0gd2hpbGUgKGVsZW1lbnQpOwotCi0gICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9yaWNvLmpzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvcmljby5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiNmZiNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9yaWNvLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjY5MSArMCwwIEBACi0vKioKLSAgKgotICAqICBDb3B5cmlnaHQgMjAwNSBTYWJyZSBBaXJsaW5lIFNvbHV0aW9ucwotICAqCi0gICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcwotICAqICBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAqCi0gICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgKgotICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotICAqICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAotICAqICBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAgKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAqKi8KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tIHJpY28uanMKLXZhciBSaWNvID0gewotICBWZXJzaW9uOiAnMS4xLWJldGEyJwotfQotCi1SaWNvLkFycmF5RXh0ZW5zaW9ucyA9IG5ldyBBcnJheSgpOwotCi1pZiAoT2JqZWN0LnByb3RvdHlwZS5leHRlbmQpIHsKLSAgIC8vIGluIHByb3RvdHlwZS5qcy4uLgotICAgUmljby5BcnJheUV4dGVuc2lvbnNbIFJpY28uQXJyYXlFeHRlbnNpb25zLmxlbmd0aCBdID0gT2JqZWN0LnByb3RvdHlwZS5leHRlbmQ7Ci19Ci0KLWlmIChBcnJheS5wcm90b3R5cGUucHVzaCkgewotICAgLy8gaW4gcHJvdG90eXBlLmpzLi4uCi0gICBSaWNvLkFycmF5RXh0ZW5zaW9uc1sgUmljby5BcnJheUV4dGVuc2lvbnMubGVuZ3RoIF0gPSBBcnJheS5wcm90b3R5cGUucHVzaDsKLX0KLQotaWYgKCFBcnJheS5wcm90b3R5cGUucmVtb3ZlKSB7Ci0gICBBcnJheS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oZHgpIHsKLSAgICAgIGlmKCBpc05hTihkeCkgfHwgZHggPiB0aGlzLmxlbmd0aCApCi0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IoIHZhciBpPTAsbj0wOyBpPHRoaXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgaWYoIGkgIT0gZHggKQotICAgICAgICAgICAgdGhpc1tuKytdPXRoaXNbaV07Ci0gICAgICB0aGlzLmxlbmd0aC09MTsKLSAgIH07Ci0gIFJpY28uQXJyYXlFeHRlbnNpb25zWyBSaWNvLkFycmF5RXh0ZW5zaW9ucy5sZW5ndGggXSA9IEFycmF5LnByb3RvdHlwZS5yZW1vdmU7Ci19Ci0KLWlmICghQXJyYXkucHJvdG90eXBlLnJlbW92ZUl0ZW0pIHsKLSAgIEFycmF5LnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24oaXRlbSkgewotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IHRoaXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgIGlmICggdGhpc1tpXSA9PSBpdGVtICkgewotICAgICAgICAgICAgdGhpcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgIH07Ci0gIFJpY28uQXJyYXlFeHRlbnNpb25zWyBSaWNvLkFycmF5RXh0ZW5zaW9ucy5sZW5ndGggXSA9IEFycmF5LnByb3RvdHlwZS5yZW1vdmVJdGVtOwotfQotCi1pZiAoIUFycmF5LnByb3RvdHlwZS5pbmRpY2VzKSB7Ci0gICBBcnJheS5wcm90b3R5cGUuaW5kaWNlcyA9IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGluZGV4QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgIGZvciAoIGluZGV4IGluIHRoaXMgKSB7Ci0gICAgICAgICB2YXIgaWdub3JlVGhpcyA9IGZhbHNlOwotICAgICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IFJpY28uQXJyYXlFeHRlbnNpb25zLmxlbmd0aCA7IGkrKyApIHsKLSAgICAgICAgICAgIGlmICggdGhpc1tpbmRleF0gPT0gUmljby5BcnJheUV4dGVuc2lvbnNbaV0gKSB7Ci0gICAgICAgICAgICAgICBpZ25vcmVUaGlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKCAhaWdub3JlVGhpcyApCi0gICAgICAgICAgICBpbmRleEFycmF5WyBpbmRleEFycmF5Lmxlbmd0aCBdID0gaW5kZXg7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW5kZXhBcnJheTsKLSAgIH0KLSAgUmljby5BcnJheUV4dGVuc2lvbnNbIFJpY28uQXJyYXlFeHRlbnNpb25zLmxlbmd0aCBdID0gQXJyYXkucHJvdG90eXBlLmluZGljZXM7Ci19Ci0KLS8vIENyZWF0ZSB0aGUgbG9hZFhNTCBtZXRob2QgYW5kIHhtbCBnZXR0ZXIgZm9yIE1vemlsbGEKLWlmICggd2luZG93LkRPTVBhcnNlciAmJgotCSAgd2luZG93LlhNTFNlcmlhbGl6ZXIgJiYKLQkgIHdpbmRvdy5Ob2RlICYmIE5vZGUucHJvdG90eXBlICYmIE5vZGUucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18gKSB7Ci0KLSAgIGlmICghRG9jdW1lbnQucHJvdG90eXBlLmxvYWRYTUwpIHsKLSAgICAgIERvY3VtZW50LnByb3RvdHlwZS5sb2FkWE1MID0gZnVuY3Rpb24gKHMpIHsKLSAgICAgICAgIHZhciBkb2MyID0gKG5ldyBET01QYXJzZXIoKSkucGFyc2VGcm9tU3RyaW5nKHMsICJ0ZXh0L3htbCIpOwotICAgICAgICAgd2hpbGUgKHRoaXMuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmxhc3RDaGlsZCk7Ci0KLSAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jMi5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuaW1wb3J0Tm9kZShkb2MyLmNoaWxkTm9kZXNbaV0sIHRydWUpKTsKLSAgICAgICAgIH0KLSAgICAgIH07Ci0JfQotCi0JRG9jdW1lbnQucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oICJ4bWwiLAotCSAgIGZ1bmN0aW9uICgpIHsKLQkJICAgcmV0dXJuIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzKTsKLQkgICB9Ci0JICk7Ci19Ci0KLWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdBbmRDbGFzc05hbWUgPSBmdW5jdGlvbih0YWdOYW1lLCBjbGFzc05hbWUpIHsKLSAgaWYgKCB0YWdOYW1lID09IG51bGwgKQotICAgICB0YWdOYW1lID0gJyonOwotCi0gIHZhciBjaGlsZHJlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpIHx8IGRvY3VtZW50LmFsbDsKLSAgdmFyIGVsZW1lbnRzID0gbmV3IEFycmF5KCk7Ci0KLSAgaWYgKCBjbGFzc05hbWUgPT0gbnVsbCApCi0gICAgcmV0dXJuIGNoaWxkcmVuOwotCi0gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICB2YXIgY2xhc3NOYW1lcyA9IGNoaWxkLmNsYXNzTmFtZS5zcGxpdCgnICcpOwotICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgaWYgKGNsYXNzTmFtZXNbal0gPT0gY2xhc3NOYW1lKSB7Ci0gICAgICAgIGVsZW1lbnRzLnB1c2goY2hpbGQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZWxlbWVudHM7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvQWNjb3JkaW9uLmpzCi0KLVJpY28uQWNjb3JkaW9uID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLVJpY28uQWNjb3JkaW9uLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBvcHRpb25zKSB7Ci0gICAgICB0aGlzLmNvbnRhaW5lciAgICAgICAgICAgID0gJChjb250YWluZXIpOwotICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIgICAgICA9IG51bGw7Ci0gICAgICB0aGlzLmFjY29yZGlvblRhYnMgICAgICAgID0gbmV3IEFycmF5KCk7Ci0gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICB0aGlzLl9hdHRhY2hCZWhhdmlvcnMoKTsKLQotICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCAnICsgdGhpcy5vcHRpb25zLmJvcmRlckNvbG9yOwotCi0gICAgICAvLyBzZXQgdGhlIGluaXRpYWwgdmlzdWFsIHN0YXRlLi4uCi0gICAgICBmb3IgKCB2YXIgaT0xIDsgaSA8IHRoaXMuYWNjb3JkaW9uVGFicy5sZW5ndGggOyBpKysgKQotICAgICAgewotICAgICAgICAgdGhpcy5hY2NvcmRpb25UYWJzW2ldLmNvbGxhcHNlKCk7Ci0gICAgICAgICB0aGlzLmFjY29yZGlvblRhYnNbaV0uY29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgICAgfQotICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIgPSB0aGlzLmFjY29yZGlvblRhYnNbMF07Ci0gICAgICB0aGlzLmxhc3RFeHBhbmRlZFRhYi5jb250ZW50LnN0eWxlLmhlaWdodCA9IHRoaXMub3B0aW9ucy5wYW5lbEhlaWdodCArICJweCI7Ci0gICAgICB0aGlzLmxhc3RFeHBhbmRlZFRhYi5zaG93RXhwYW5kZWQoKTsKLSAgICAgIHRoaXMubGFzdEV4cGFuZGVkVGFiLnRpdGxlQmFyLnN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLm9wdGlvbnMuZXhwYW5kZWRGb250V2VpZ2h0OwotICAgfSwKLQotICAgc2V0T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucykgewotICAgICAgdGhpcy5vcHRpb25zID0gewotICAgICAgICAgZXhwYW5kZWRCZyAgICAgICAgICA6ICcjNjM2OTljJywKLSAgICAgICAgIGhvdmVyQmcgICAgICAgICAgICAgOiAnIzYzNjk5YycsCi0gICAgICAgICBjb2xsYXBzZWRCZyAgICAgICAgIDogJyM2Yjc5YTUnLAotICAgICAgICAgZXhwYW5kZWRUZXh0Q29sb3IgICA6ICcjZmZmZmZmJywKLSAgICAgICAgIGV4cGFuZGVkRm9udFdlaWdodCAgOiAnYm9sZCcsCi0gICAgICAgICBob3ZlclRleHRDb2xvciAgICAgIDogJyNmZmZmZmYnLAotICAgICAgICAgY29sbGFwc2VkVGV4dENvbG9yICA6ICcjY2VkN2VmJywKLSAgICAgICAgIGNvbGxhcHNlZEZvbnRXZWlnaHQgOiAnbm9ybWFsJywKLSAgICAgICAgIGhvdmVyVGV4dENvbG9yICAgICAgOiAnI2ZmZmZmZicsCi0gICAgICAgICBib3JkZXJDb2xvciAgICAgICAgIDogJyMxZjY2OWInLAotICAgICAgICAgcGFuZWxIZWlnaHQgICAgICAgICA6IDIwMCwKLSAgICAgICAgIG9uSGlkZVRhYiAgICAgICAgICAgOiBudWxsLAotICAgICAgICAgb25TaG93VGFiICAgICAgICAgICA6IG51bGwKLSAgICAgIH0uZXh0ZW5kKG9wdGlvbnMgfHwge30pOwotICAgfSwKLQotICAgc2hvd1RhYkJ5SW5kZXg6IGZ1bmN0aW9uKCBhbkluZGV4LCBhbmltYXRlICkgewotICAgICAgdmFyIGRvQW5pbWF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPT0gMSA/IHRydWUgOiBhbmltYXRlOwotICAgICAgdGhpcy5zaG93VGFiKCB0aGlzLmFjY29yZGlvblRhYnNbYW5JbmRleF0sIGRvQW5pbWF0ZSApOwotICAgfSwKLQotICAgc2hvd1RhYjogZnVuY3Rpb24oIGFjY29yZGlvblRhYiwgYW5pbWF0ZSApIHsKLQotICAgICAgdmFyIGRvQW5pbWF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPT0gMSA/IHRydWUgOiBhbmltYXRlOwotCi0gICAgICBpZiAoIHRoaXMub3B0aW9ucy5vbkhpZGVUYWIgKQotICAgICAgICAgdGhpcy5vcHRpb25zLm9uSGlkZVRhYih0aGlzLmxhc3RFeHBhbmRlZFRhYik7Ci0KLSAgICAgIHRoaXMubGFzdEV4cGFuZGVkVGFiLnNob3dDb2xsYXBzZWQoKTsgCi0gICAgICB2YXIgYWNjb3JkaW9uID0gdGhpczsKLSAgICAgIHZhciBsYXN0RXhwYW5kZWRUYWIgPSB0aGlzLmxhc3RFeHBhbmRlZFRhYjsKLQotICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIuY29udGVudC5zdHlsZS5oZWlnaHQgPSAodGhpcy5vcHRpb25zLnBhbmVsSGVpZ2h0IC0gMSkgKyAncHgnOwotICAgICAgYWNjb3JkaW9uVGFiLmNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICcnOwotCi0gICAgICBhY2NvcmRpb25UYWIudGl0bGVCYXIuc3R5bGUuZm9udFdlaWdodCA9IHRoaXMub3B0aW9ucy5leHBhbmRlZEZvbnRXZWlnaHQ7Ci0KLSAgICAgIGlmICggZG9BbmltYXRlICkgewotICAgICAgICAgbmV3IEVmZmVjdC5BY2NvcmRpb25TaXplKCB0aGlzLmxhc3RFeHBhbmRlZFRhYi5jb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpb25UYWIuY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhbmVsSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvbXBsZXRlOiBmdW5jdGlvbigpIHthY2NvcmRpb24uc2hvd1RhYkRvbmUobGFzdEV4cGFuZGVkVGFiKX0gfSApOwotICAgICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIgPSBhY2NvcmRpb25UYWI7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHRoaXMubGFzdEV4cGFuZGVkVGFiLmNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gIjFweCI7Ci0gICAgICAgICBhY2NvcmRpb25UYWIuY29udGVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLm9wdGlvbnMucGFuZWxIZWlnaHQgKyAicHgiOwotICAgICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIgPSBhY2NvcmRpb25UYWI7Ci0gICAgICAgICB0aGlzLnNob3dUYWJEb25lKGxhc3RFeHBhbmRlZFRhYik7Ci0gICAgICB9Ci0gICB9LAotCi0gICBzaG93VGFiRG9uZTogZnVuY3Rpb24oY29sbGFwc2VkVGFiKSB7Ci0gICAgICBjb2xsYXBzZWRUYWIuY29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgICAgdGhpcy5sYXN0RXhwYW5kZWRUYWIuc2hvd0V4cGFuZGVkKCk7Ci0gICAgICBpZiAoIHRoaXMub3B0aW9ucy5vblNob3dUYWIgKQotICAgICAgICAgdGhpcy5vcHRpb25zLm9uU2hvd1RhYih0aGlzLmxhc3RFeHBhbmRlZFRhYik7Ci0gICB9LAotCi0gICBfYXR0YWNoQmVoYXZpb3JzOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBwYW5lbHMgPSB0aGlzLl9nZXREaXJlY3RDaGlsZHJlbkJ5VGFnKHRoaXMuY29udGFpbmVyLCAnRElWJyk7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgcGFuZWxzLmxlbmd0aCA7IGkrKyApIHsKLQotICAgICAgICAgdmFyIHRhYkNoaWxkcmVuID0gdGhpcy5fZ2V0RGlyZWN0Q2hpbGRyZW5CeVRhZyhwYW5lbHNbaV0sJ0RJVicpOwotICAgICAgICAgaWYgKCB0YWJDaGlsZHJlbi5sZW5ndGggIT0gMiApCi0gICAgICAgICAgICBjb250aW51ZTsgLy8gdW5leHBlY3RlZAotCi0gICAgICAgICB2YXIgdGFiVGl0bGVCYXIgICA9IHRhYkNoaWxkcmVuWzBdOwotICAgICAgICAgdmFyIHRhYkNvbnRlbnRCb3ggPSB0YWJDaGlsZHJlblsxXTsKLSAgICAgICAgIHRoaXMuYWNjb3JkaW9uVGFicy5wdXNoKCBuZXcgUmljby5BY2NvcmRpb24uVGFiKHRoaXMsdGFiVGl0bGVCYXIsdGFiQ29udGVudEJveCkgKTsKLSAgICAgIH0KLSAgIH0sCi0KLSAgIF9nZXREaXJlY3RDaGlsZHJlbkJ5VGFnOiBmdW5jdGlvbihlLCB0YWdOYW1lKSB7Ci0gICAgICB2YXIga2lkcyA9IG5ldyBBcnJheSgpOwotICAgICAgdmFyIGFsbEtpZHMgPSBlLmNoaWxkTm9kZXM7Ci0gICAgICBmb3IoIHZhciBpID0gMCA7IGkgPCBhbGxLaWRzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICBpZiAoIGFsbEtpZHNbaV0gJiYgYWxsS2lkc1tpXS50YWdOYW1lICYmIGFsbEtpZHNbaV0udGFnTmFtZSA9PSB0YWdOYW1lICkKLSAgICAgICAgICAgIGtpZHMucHVzaChhbGxLaWRzW2ldKTsKLSAgICAgIHJldHVybiBraWRzOwotICAgfQotCi19OwotCi1SaWNvLkFjY29yZGlvbi5UYWIgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5BY2NvcmRpb24uVGFiLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYWNjb3JkaW9uLCB0aXRsZUJhciwgY29udGVudCkgewotICAgICAgdGhpcy5hY2NvcmRpb24gPSBhY2NvcmRpb247Ci0gICAgICB0aGlzLnRpdGxlQmFyICA9IHRpdGxlQmFyOwotICAgICAgdGhpcy5jb250ZW50ICAgPSBjb250ZW50OwotICAgICAgdGhpcy5fYXR0YWNoQmVoYXZpb3JzKCk7Ci0gICB9LAotCi0gICBjb2xsYXBzZTogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnNob3dDb2xsYXBzZWQoKTsKLSAgICAgIHRoaXMuY29udGVudC5zdHlsZS5oZWlnaHQgPSAiMXB4IjsKLSAgIH0sCi0KLSAgIHNob3dDb2xsYXBzZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlOwotICAgICAgdGhpcy50aXRsZUJhci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmFjY29yZGlvbi5vcHRpb25zLmNvbGxhcHNlZEJnOwotICAgICAgdGhpcy50aXRsZUJhci5zdHlsZS5jb2xvciAgICAgICAgICAgPSB0aGlzLmFjY29yZGlvbi5vcHRpb25zLmNvbGxhcHNlZFRleHRDb2xvcjsKLSAgICAgIHRoaXMudGl0bGVCYXIuc3R5bGUuZm9udFdlaWdodCAgICAgID0gdGhpcy5hY2NvcmRpb24ub3B0aW9ucy5jb2xsYXBzZWRGb250V2VpZ2h0OwotICAgICAgdGhpcy5jb250ZW50LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7Ci0gICB9LAotCi0gICBzaG93RXhwYW5kZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5leHBhbmRlZCA9IHRydWU7Ci0gICAgICB0aGlzLnRpdGxlQmFyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYWNjb3JkaW9uLm9wdGlvbnMuZXhwYW5kZWRCZzsKLSAgICAgIHRoaXMudGl0bGVCYXIuc3R5bGUuY29sb3IgICAgICAgICAgID0gdGhpcy5hY2NvcmRpb24ub3B0aW9ucy5leHBhbmRlZFRleHRDb2xvcjsKLSAgICAgIHRoaXMuY29udGVudC5zdHlsZS5vdmVyZmxvdyAgICAgICAgID0gInZpc2libGUiOwotICAgfSwKLQotICAgdGl0bGVCYXJDbGlja2VkOiBmdW5jdGlvbihlKSB7Ci0gICAgICBpZiAoIHRoaXMuYWNjb3JkaW9uLmxhc3RFeHBhbmRlZFRhYiA9PSB0aGlzICkKLSAgICAgICAgIHJldHVybjsKLSAgICAgIHRoaXMuYWNjb3JkaW9uLnNob3dUYWIodGhpcyk7Ci0gICB9LAotCi0gICBob3ZlcjogZnVuY3Rpb24oZSkgewotCQl0aGlzLnRpdGxlQmFyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYWNjb3JkaW9uLm9wdGlvbnMuaG92ZXJCZzsKLQkJdGhpcy50aXRsZUJhci5zdHlsZS5jb2xvciAgICAgICAgICAgPSB0aGlzLmFjY29yZGlvbi5vcHRpb25zLmhvdmVyVGV4dENvbG9yOwotICAgfSwKLQotICAgdW5ob3ZlcjogZnVuY3Rpb24oZSkgewotICAgICAgaWYgKCB0aGlzLmV4cGFuZGVkICkgewotICAgICAgICAgdGhpcy50aXRsZUJhci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmFjY29yZGlvbi5vcHRpb25zLmV4cGFuZGVkQmc7Ci0gICAgICAgICB0aGlzLnRpdGxlQmFyLnN0eWxlLmNvbG9yICAgICAgICAgICA9IHRoaXMuYWNjb3JkaW9uLm9wdGlvbnMuZXhwYW5kZWRUZXh0Q29sb3I7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHRoaXMudGl0bGVCYXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5hY2NvcmRpb24ub3B0aW9ucy5jb2xsYXBzZWRCZzsKLSAgICAgICAgIHRoaXMudGl0bGVCYXIuc3R5bGUuY29sb3IgICAgICAgICAgID0gdGhpcy5hY2NvcmRpb24ub3B0aW9ucy5jb2xsYXBzZWRUZXh0Q29sb3I7Ci0gICAgICB9Ci0gICB9LAotCi0gICBfYXR0YWNoQmVoYXZpb3JzOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuY29udGVudC5zdHlsZS5ib3JkZXIgPSAiMXB4IHNvbGlkICIgKyB0aGlzLmFjY29yZGlvbi5vcHRpb25zLmJvcmRlckNvbG9yOwotICAgICAgdGhpcy5jb250ZW50LnN0eWxlLmJvcmRlclRvcFdpZHRoICAgID0gIjBweCI7Ci0gICAgICB0aGlzLmNvbnRlbnQuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGggPSAiMHB4IjsKLSAgICAgIHRoaXMuY29udGVudC5zdHlsZS5tYXJnaW4gICAgICAgICAgICA9ICIwcHgiOwotCi0gICAgICB0aGlzLnRpdGxlQmFyLm9uY2xpY2sgICAgID0gdGhpcy50aXRsZUJhckNsaWNrZWQuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKTsKLSAgICAgIHRoaXMudGl0bGVCYXIub25tb3VzZW92ZXIgPSB0aGlzLmhvdmVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICB0aGlzLnRpdGxlQmFyLm9ubW91c2VvdXQgID0gdGhpcy51bmhvdmVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICB9Ci0KLX07Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvQWpheEVuZ2luZS5qcwotCi1SaWNvLkFqYXhFbmdpbmUgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5BamF4RW5naW5lLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmFqYXhFbGVtZW50cyA9IG5ldyBBcnJheSgpOwotICAgICAgdGhpcy5hamF4T2JqZWN0cyAgPSBuZXcgQXJyYXkoKTsKLSAgICAgIHRoaXMucmVxdWVzdFVSTFMgID0gbmV3IEFycmF5KCk7Ci0gICB9LAotCi0gICByZWdpc3RlckFqYXhFbGVtZW50OiBmdW5jdGlvbiggYW5JZCwgYW5FbGVtZW50ICkgewotICAgICAgaWYgKCBhcmd1bWVudHMubGVuZ3RoID09IDEgKQotICAgICAgICAgYW5FbGVtZW50ID0gJChhbklkKTsKLSAgICAgIHRoaXMuYWpheEVsZW1lbnRzW2FuSWRdID0gYW5FbGVtZW50OwotICAgfSwKLQotICAgcmVnaXN0ZXJBamF4T2JqZWN0OiBmdW5jdGlvbiggYW5JZCwgYW5PYmplY3QgKSB7Ci0gICAgICB0aGlzLmFqYXhPYmplY3RzW2FuSWRdID0gYW5PYmplY3Q7Ci0gICB9LAotCi0gICByZWdpc3RlclJlcXVlc3Q6IGZ1bmN0aW9uIChyZXF1ZXN0TG9naWNhbE5hbWUsIHJlcXVlc3RVUkwpIHsKLSAgICAgIHRoaXMucmVxdWVzdFVSTFNbcmVxdWVzdExvZ2ljYWxOYW1lXSA9IHJlcXVlc3RVUkw7Ci0gICB9LAotCi0gICBzZW5kUmVxdWVzdDogZnVuY3Rpb24ocmVxdWVzdE5hbWUpIHsKLSAgICAgIHZhciByZXF1ZXN0VVJMID0gdGhpcy5yZXF1ZXN0VVJMU1tyZXF1ZXN0TmFtZV07Ci0gICAgICBpZiAoIHJlcXVlc3RVUkwgPT0gbnVsbCApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciBxdWVyeVN0cmluZyA9ICIiOwotICAgICAgCi0gICAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgewotICAgICAgCSBpZih0eXBlb2YoYXJndW1lbnRzWzFdKSA9PSAib2JqZWN0IiAmJiBhcmd1bWVudHNbMV0ubGVuZ3RoICE9IHVuZGVmaW5lZCkgewotCSAgICAgIAkgcXVlcnlTdHJpbmcgPSB0aGlzLl9jcmVhdGVRdWVyeVN0cmluZyhhcmd1bWVudHNbMV0sIDApOwotICAgICAgCSB9Ci0gICAgICAJIGVsc2UgewotCSAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY3JlYXRlUXVlcnlTdHJpbmcoYXJndW1lbnRzLCAxKTsKLQkgICAgIH0gICAgICAgICAKLSAgICAgICB9Ci0gICAgICAgICAgICAgCi0gICAgICBuZXcgQWpheC5SZXF1ZXN0KHJlcXVlc3RVUkwsIHRoaXMuX3JlcXVlc3RPcHRpb25zKHF1ZXJ5U3RyaW5nKSk7Ci0gICB9LAotCi0gICBzZW5kUmVxdWVzdFdpdGhEYXRhOiBmdW5jdGlvbihyZXF1ZXN0TmFtZSwgeG1sRG9jdW1lbnQpIHsKLSAgICAgIHZhciByZXF1ZXN0VVJMID0gdGhpcy5yZXF1ZXN0VVJMU1tyZXF1ZXN0TmFtZV07Ci0gICAgICBpZiAoIHJlcXVlc3RVUkwgPT0gbnVsbCApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciBxdWVyeVN0cmluZyA9ICIiOwotICAgICAgaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMiApIHsKLSAgICAgIAkgaWYodHlwZW9mKGFyZ3VtZW50c1syXSkgPT0gIm9iamVjdCIgJiYgYXJndW1lbnRzWzJdLmxlbmd0aCAhPSB1bmRlZmluZWQpIHsKLQkgICAgICAJIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY3JlYXRlUXVlcnlTdHJpbmcoYXJndW1lbnRzWzJdLCAwKTsKLSAgICAgIAkgfQotICAgICAgCSBlbHNlIHsKLQkgICAgICAgICBxdWVyeVN0cmluZyA9IHRoaXMuX2NyZWF0ZVF1ZXJ5U3RyaW5nKGFyZ3VtZW50cywgMik7Ci0JICAgICB9ICAgICAgICAgCi0gICAgICAgfSAgICAgICAgICAgICAKLQotICAgICAgbmV3IEFqYXguUmVxdWVzdChyZXF1ZXN0VVJMICsgIj8iICsgcXVlcnlTdHJpbmcsIHRoaXMuX3JlcXVlc3RPcHRpb25zKG51bGwseG1sRG9jdW1lbnQpKTsKLSAgIH0sCi0KLSAgIHNlbmRSZXF1ZXN0QW5kVXBkYXRlOiBmdW5jdGlvbihyZXF1ZXN0TmFtZSxjb250YWluZXIsb3B0aW9ucykgewotICAgICAgdmFyIHJlcXVlc3RVUkwgPSB0aGlzLnJlcXVlc3RVUkxTW3JlcXVlc3ROYW1lXTsKLSAgICAgIGlmICggcmVxdWVzdFVSTCA9PSBudWxsICkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gIiI7Ci0gICAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAzICkgewotICAgICAgCSBpZih0eXBlb2YoYXJndW1lbnRzWzNdKSA9PSAib2JqZWN0IiAmJiBhcmd1bWVudHNbM10ubGVuZ3RoICE9IHVuZGVmaW5lZCkgewotCSAgICAgIAkgcXVlcnlTdHJpbmcgPSB0aGlzLl9jcmVhdGVRdWVyeVN0cmluZyhhcmd1bWVudHNbM10sIDApOwotICAgICAgCSB9Ci0gICAgICAJIGVsc2UgewotCSAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY3JlYXRlUXVlcnlTdHJpbmcoYXJndW1lbnRzLCAzKTsKLQkgICAgIH0gICAgICAgICAKLSAgICAgICB9ICAKLSAgICAgICAgICAgICAKLSAgICAgIHZhciB1cGRhdGVyT3B0aW9ucyA9IHRoaXMuX3JlcXVlc3RPcHRpb25zKHF1ZXJ5U3RyaW5nKTsKLSAgICAgIHVwZGF0ZXJPcHRpb25zLm9uQ29tcGxldGUgPSBudWxsOwotICAgICAgdXBkYXRlck9wdGlvbnMuZXh0ZW5kKG9wdGlvbnMpOwotCi0gICAgICBuZXcgQWpheC5VcGRhdGVyKGNvbnRhaW5lciwgcmVxdWVzdFVSTCwgdXBkYXRlck9wdGlvbnMpOwotICAgfSwKLQotICAgc2VuZFJlcXVlc3RXaXRoRGF0YUFuZFVwZGF0ZTogZnVuY3Rpb24ocmVxdWVzdE5hbWUseG1sRG9jdW1lbnQsY29udGFpbmVyLG9wdGlvbnMpIHsKLSAgICAgIHZhciByZXF1ZXN0VVJMID0gdGhpcy5yZXF1ZXN0VVJMU1tyZXF1ZXN0TmFtZV07Ci0gICAgICBpZiAoIHJlcXVlc3RVUkwgPT0gbnVsbCApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciBxdWVyeVN0cmluZyA9ICIiOwotICAgICAgaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gNCApIHsKLSAgICAgIAkgaWYodHlwZW9mKGFyZ3VtZW50c1s0XSkgPT0gIm9iamVjdCIgJiYgYXJndW1lbnRzWzRdLmxlbmd0aCAhPSB1bmRlZmluZWQpIHsKLQkgICAgICAJIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY3JlYXRlUXVlcnlTdHJpbmcoYXJndW1lbnRzWzRdLCAwKTsKLSAgICAgIAkgfQotICAgICAgCSBlbHNlIHsKLQkgICAgICAgICBxdWVyeVN0cmluZyA9IHRoaXMuX2NyZWF0ZVF1ZXJ5U3RyaW5nKGFyZ3VtZW50cywgNCk7Ci0JICAgICB9ICAgICAgICAgCi0gICAgICAgfQotCi0KLSAgICAgIHZhciB1cGRhdGVyT3B0aW9ucyA9IHRoaXMuX3JlcXVlc3RPcHRpb25zKHF1ZXJ5U3RyaW5nLHhtbERvY3VtZW50KTsKLSAgICAgIHVwZGF0ZXJPcHRpb25zLm9uQ29tcGxldGUgPSBudWxsOwotICAgICAgdXBkYXRlck9wdGlvbnMuZXh0ZW5kKG9wdGlvbnMpOwotCi0gICAgICBuZXcgQWpheC5VcGRhdGVyKGNvbnRhaW5lciwgcmVxdWVzdFVSTCArICI/IiArIHF1ZXJ5U3RyaW5nLCB1cGRhdGVyT3B0aW9ucyk7Ci0gICB9LAotCi0gICAvLyBQcml2YXRlIC0tIG5vdCBwYXJ0IG9mIGludGVuZGVkIGVuZ2luZSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgX3JlcXVlc3RPcHRpb25zOiBmdW5jdGlvbihxdWVyeVN0cmluZyx4bWxEb2MpIHsKLSAgICAgIHZhciBzZWxmID0gdGhpczsKLQotICAgICAgdmFyIHJlcXVlc3RIZWFkZXJzID0gWydYLVJpY28tVmVyc2lvbicsIFJpY28uVmVyc2lvbiBdOwotICAgICAgdmFyIHNlbmRNZXRob2QgPSAicG9zdCIKLSAgICAgIGlmICggYXJndW1lbnRzWzFdICkKLSAgICAgICAgIHJlcXVlc3RIZWFkZXJzLnB1c2goICdDb250ZW50LXR5cGUnLCAndGV4dC94bWwnICk7Ci0gICAgICBlbHNlCi0gICAgICAgICBzZW5kTWV0aG9kID0gImdldCI7Ci0KLSAgICAgIHJldHVybiB7IHJlcXVlc3RIZWFkZXJzOiByZXF1ZXN0SGVhZGVycywKLSAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgICBxdWVyeVN0cmluZywKLSAgICAgICAgICAgICAgIHBvc3RCb2R5OiAgICAgICBhcmd1bWVudHNbMV0gPyB4bWxEb2MgOiBudWxsLAotICAgICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgIHNlbmRNZXRob2QsCi0gICAgICAgICAgICAgICBvbkNvbXBsZXRlOiAgICAgc2VsZi5fb25SZXF1ZXN0Q29tcGxldGUuYmluZChzZWxmKSB9OwotICAgfSwKLQotICAgX2NyZWF0ZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbiggdGhlQXJncywgb2Zmc2V0ICkgewotICAgCSAgdmFyIHNlbGYgPSB0aGlzOwotICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gIiIKLSAgICAgIGZvciAoIHZhciBpID0gb2Zmc2V0IDsgaSA8IHRoZUFyZ3MubGVuZ3RoIDsgaSsrICkgewotICAgICAgICAgIGlmICggaSAhPSBvZmZzZXQgKQotICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gIiYiOwotCi0gICAgICAgICAgdmFyIGFuQXJnID0gdGhlQXJnc1tpXTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmICggYW5BcmcubmFtZSAhPSB1bmRlZmluZWQgJiYgYW5BcmcudmFsdWUgIT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gYW5BcmcubmFtZSArICAiPSIgKyBlc2NhcGUoYW5BcmcudmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICB2YXIgZVBvcyAgPSBhbkFyZy5pbmRleE9mKCc9Jyk7Ci0gICAgICAgICAgICAgdmFyIGFyZ05hbWUgID0gYW5Bcmcuc3Vic3RyaW5nKCAwLCBlUG9zICk7Ci0gICAgICAgICAgICAgdmFyIGFyZ1ZhbHVlID0gYW5Bcmcuc3Vic3RyaW5nKCBlUG9zICsgMSApOwotICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGFyZ05hbWUgKyAiPSIgKyBlc2NhcGUoYXJnVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nOwotICAgfSwKLSAgIF9vblJlcXVlc3RDb21wbGV0ZSA6IGZ1bmN0aW9uKHJlcXVlc3QpIHsKLQotICAgICAgLy8hIVRPRE86IGVycm9yIGhhbmRsaW5nIGluZnJhc3RydWN0dXJlPz8gCi0gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgIT0gMjAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2VYTUwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFqYXgtcmVzcG9uc2UiKTsKLSAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCAhPSAxKQotICAgICAgICAgcmV0dXJuOwotICAgICAgdGhpcy5fcHJvY2Vzc0FqYXhSZXNwb25zZSggcmVzcG9uc2VbMF0uY2hpbGROb2RlcyApOwotICAgfSwKLQotICAgX3Byb2Nlc3NBamF4UmVzcG9uc2U6IGZ1bmN0aW9uKCB4bWxSZXNwb25zZUVsZW1lbnRzICkgewotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IHhtbFJlc3BvbnNlRWxlbWVudHMubGVuZ3RoIDsgaSsrICkgewotICAgICAgICAgdmFyIHJlc3BvbnNlRWxlbWVudCA9IHhtbFJlc3BvbnNlRWxlbWVudHNbaV07Ci0KLSAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyBub2RlcyBvZiB0eXBlIGVsZW1lbnQuLi4uLgotICAgICAgICAgaWYgKCByZXNwb25zZUVsZW1lbnQubm9kZVR5cGUgIT0gMSApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICAgICAgIHZhciByZXNwb25zZUlkICAgPSByZXNwb25zZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCi0gICAgICAgICBpZiAoIHJlc3BvbnNlVHlwZSA9PSAib2JqZWN0IiApCi0gICAgICAgICAgICB0aGlzLl9wcm9jZXNzQWpheE9iamVjdFVwZGF0ZSggdGhpcy5hamF4T2JqZWN0c1sgcmVzcG9uc2VJZCBdLCByZXNwb25zZUVsZW1lbnQgKTsKLSAgICAgICAgIGVsc2UgaWYgKCByZXNwb25zZVR5cGUgPT0gImVsZW1lbnQiICkKLSAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NBamF4RWxlbWVudFVwZGF0ZSggdGhpcy5hamF4RWxlbWVudHNbIHJlc3BvbnNlSWQgXSwgcmVzcG9uc2VFbGVtZW50ICk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBhbGVydCgndW5yZWNvZ25pemVkIEFqYXhSZXNwb25zZSB0eXBlIDogJyArIHJlc3BvbnNlVHlwZSApOwotICAgICAgfQotICAgfSwKLQotICAgX3Byb2Nlc3NBamF4T2JqZWN0VXBkYXRlOiBmdW5jdGlvbiggYWpheE9iamVjdCwgcmVzcG9uc2VFbGVtZW50ICkgewotICAgICAgYWpheE9iamVjdC5hamF4VXBkYXRlKCByZXNwb25zZUVsZW1lbnQgKTsKLSAgIH0sCi0KLSAgIF9wcm9jZXNzQWpheEVsZW1lbnRVcGRhdGU6IGZ1bmN0aW9uKCBhamF4RWxlbWVudCwgcmVzcG9uc2VFbGVtZW50ICkgewotICAgICAgYWpheEVsZW1lbnQuaW5uZXJIVE1MID0gUmljb1V0aWwuZ2V0Q29udGVudEFzU3RyaW5nKHJlc3BvbnNlRWxlbWVudCk7Ci0gICB9Ci0KLX0KLQotdmFyIGFqYXhFbmdpbmUgPSBuZXcgUmljby5BamF4RW5naW5lKCk7Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvQ29sb3IuanMKLVJpY28uQ29sb3IgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5Db2xvci5wcm90b3R5cGUgPSB7Ci0KLSAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHJlZCwgZ3JlZW4sIGJsdWUpIHsKLSAgICAgIHRoaXMucmdiID0geyByOiByZWQsIGcgOiBncmVlbiwgYiA6IGJsdWUgfTsKLSAgIH0sCi0KLSAgIHNldFJlZDogZnVuY3Rpb24ocikgewotICAgICAgdGhpcy5yZ2IuciA9IHI7Ci0gICB9LAotCi0gICBzZXRHcmVlbjogZnVuY3Rpb24oZykgewotICAgICAgdGhpcy5yZ2IuZyA9IGc7Ci0gICB9LAotCi0gICBzZXRCbHVlOiBmdW5jdGlvbihiKSB7Ci0gICAgICB0aGlzLnJnYi5iID0gYjsKLSAgIH0sCi0KLSAgIHNldEh1ZTogZnVuY3Rpb24oaCkgewotCi0gICAgICAvLyBnZXQgYW4gSFNCIG1vZGVsLCBhbmQgc2V0IHRoZSBuZXcgaHVlLi4uCi0gICAgICB2YXIgaHNiID0gdGhpcy5hc0hTQigpOwotICAgICAgaHNiLmggPSBoOwotCi0gICAgICAvLyBjb252ZXJ0IGJhY2sgdG8gUkdCLi4uCi0gICAgICB0aGlzLnJnYiA9IFJpY28uQ29sb3IuSFNCdG9SR0IoaHNiLmgsIGhzYi5zLCBoc2IuYik7Ci0gICB9LAotCi0gICBzZXRTYXR1cmF0aW9uOiBmdW5jdGlvbihzKSB7Ci0gICAgICAvLyBnZXQgYW4gSFNCIG1vZGVsLCBhbmQgc2V0IHRoZSBuZXcgaHVlLi4uCi0gICAgICB2YXIgaHNiID0gdGhpcy5hc0hTQigpOwotICAgICAgaHNiLnMgPSBzOwotCi0gICAgICAvLyBjb252ZXJ0IGJhY2sgdG8gUkdCIGFuZCBzZXQgdmFsdWVzLi4uCi0gICAgICB0aGlzLnJnYiA9IFJpY28uQ29sb3IuSFNCdG9SR0IoaHNiLmgsIGhzYi5zLCBoc2IuYik7Ci0gICB9LAotCi0gICBzZXRCcmlnaHRuZXNzOiBmdW5jdGlvbihiKSB7Ci0gICAgICAvLyBnZXQgYW4gSFNCIG1vZGVsLCBhbmQgc2V0IHRoZSBuZXcgaHVlLi4uCi0gICAgICB2YXIgaHNiID0gdGhpcy5hc0hTQigpOwotICAgICAgaHNiLmIgPSBiOwotCi0gICAgICAvLyBjb252ZXJ0IGJhY2sgdG8gUkdCIGFuZCBzZXQgdmFsdWVzLi4uCi0gICAgICB0aGlzLnJnYiA9IFJpY28uQ29sb3IuSFNCdG9SR0IoIGhzYi5oLCBoc2IucywgaHNiLmIgKTsKLSAgIH0sCi0KLSAgIGRhcmtlbjogZnVuY3Rpb24ocGVyY2VudCkgewotICAgICAgdmFyIGhzYiAgPSB0aGlzLmFzSFNCKCk7Ci0gICAgICB0aGlzLnJnYiA9IFJpY28uQ29sb3IuSFNCdG9SR0IoaHNiLmgsIGhzYi5zLCBNYXRoLm1heChoc2IuYiAtIHBlcmNlbnQsMCkpOwotICAgfSwKLQotICAgYnJpZ2h0ZW46IGZ1bmN0aW9uKHBlcmNlbnQpIHsKLSAgICAgIHZhciBoc2IgID0gdGhpcy5hc0hTQigpOwotICAgICAgdGhpcy5yZ2IgPSBSaWNvLkNvbG9yLkhTQnRvUkdCKGhzYi5oLCBoc2IucywgTWF0aC5taW4oaHNiLmIgKyBwZXJjZW50LDEpKTsKLSAgIH0sCi0KLSAgIGJsZW5kOiBmdW5jdGlvbihvdGhlcikgewotICAgICAgdGhpcy5yZ2IuciA9IE1hdGguZmxvb3IoKHRoaXMucmdiLnIgKyBvdGhlci5yZ2IucikvMik7Ci0gICAgICB0aGlzLnJnYi5nID0gTWF0aC5mbG9vcigodGhpcy5yZ2IuZyArIG90aGVyLnJnYi5nKS8yKTsKLSAgICAgIHRoaXMucmdiLmIgPSBNYXRoLmZsb29yKCh0aGlzLnJnYi5iICsgb3RoZXIucmdiLmIpLzIpOwotICAgfSwKLQotICAgaXNCcmlnaHQ6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGhzYiA9IHRoaXMuYXNIU0IoKTsKLSAgICAgIHJldHVybiB0aGlzLmFzSFNCKCkuYiA+IDAuNTsKLSAgIH0sCi0KLSAgIGlzRGFyazogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gISB0aGlzLmlzQnJpZ2h0KCk7Ci0gICB9LAotCi0gICBhc1JHQjogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gInJnYigiICsgdGhpcy5yZ2IuciArICIsIiArIHRoaXMucmdiLmcgKyAiLCIgKyB0aGlzLnJnYi5iICsgIikiOwotICAgfSwKLQotICAgYXNIZXg6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuICIjIiArIHRoaXMucmdiLnIudG9Db2xvclBhcnQoKSArIHRoaXMucmdiLmcudG9Db2xvclBhcnQoKSArIHRoaXMucmdiLmIudG9Db2xvclBhcnQoKTsKLSAgIH0sCi0KLSAgIGFzSFNCOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBSaWNvLkNvbG9yLlJHQnRvSFNCKHRoaXMucmdiLnIsIHRoaXMucmdiLmcsIHRoaXMucmdiLmIpOwotICAgfSwKLQotICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuYXNIZXgoKTsKLSAgIH0KLQotfTsKLQotUmljby5Db2xvci5jcmVhdGVGcm9tSGV4ID0gZnVuY3Rpb24oaGV4Q29kZSkgewotCi0gICBpZiAoIGhleENvZGUuaW5kZXhPZignIycpID09IDAgKQotICAgICAgaGV4Q29kZSA9IGhleENvZGUuc3Vic3RyaW5nKDEpOwotICAgdmFyIHJlZCAgID0gaGV4Q29kZS5zdWJzdHJpbmcoMCwyKTsKLSAgIHZhciBncmVlbiA9IGhleENvZGUuc3Vic3RyaW5nKDIsNCk7Ci0gICB2YXIgYmx1ZSAgPSBoZXhDb2RlLnN1YnN0cmluZyg0LDYpOwotICAgcmV0dXJuIG5ldyBSaWNvLkNvbG9yKCBwYXJzZUludChyZWQsMTYpLCBwYXJzZUludChncmVlbiwxNiksIHBhcnNlSW50KGJsdWUsMTYpICk7Ci19Ci0KLS8qKgotICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgY29sb3IgZnJvbSB0aGUgYmFja2dyb3VuZCBvZgotICogYW4gSFRNTCBlbGVtZW50LgotICovCi1SaWNvLkNvbG9yLmNyZWF0ZUNvbG9yRnJvbUJhY2tncm91bmQgPSBmdW5jdGlvbihlbGVtKSB7Ci0KLSAgIHZhciBhY3R1YWxDb2xvciA9IFJpY29VdGlsLmdldEVsZW1lbnRzQ29tcHV0ZWRTdHlsZSgkKGVsZW0pLCAiYmFja2dyb3VuZENvbG9yIiwgImJhY2tncm91bmQtY29sb3IiKTsKLQotICAgaWYgKCBhY3R1YWxDb2xvciA9PSAidHJhbnNwYXJlbnQiICYmIGVsZW0ucGFyZW50ICkKLSAgICAgIHJldHVybiBSaWNvLkNvbG9yLmNyZWF0ZUNvbG9yRnJvbUJhY2tncm91bmQoZWxlbS5wYXJlbnQpOwotCi0gICBpZiAoIGFjdHVhbENvbG9yID09IG51bGwgKQotICAgICAgcmV0dXJuIG5ldyBSaWNvLkNvbG9yKDI1NSwyNTUsMjU1KTsKLQotICAgaWYgKCBhY3R1YWxDb2xvci5pbmRleE9mKCJyZ2IoIikgPT0gMCApIHsKLSAgICAgIHZhciBjb2xvcnMgPSBhY3R1YWxDb2xvci5zdWJzdHJpbmcoNCwgYWN0dWFsQ29sb3IubGVuZ3RoIC0gMSApOwotICAgICAgdmFyIGNvbG9yQXJyYXkgPSBjb2xvcnMuc3BsaXQoIiwiKTsKLSAgICAgIHJldHVybiBuZXcgUmljby5Db2xvciggcGFyc2VJbnQoIGNvbG9yQXJyYXlbMF0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCggY29sb3JBcnJheVsxXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KCBjb2xvckFycmF5WzJdICkgICk7Ci0KLSAgIH0KLSAgIGVsc2UgaWYgKCBhY3R1YWxDb2xvci5pbmRleE9mKCIjIikgPT0gMCApIHsKLSAgICAgIHZhciByZWRQYXJ0ICAgPSBwYXJzZUludChhY3R1YWxDb2xvci5zdWJzdHJpbmcoMSwzKSwgMTYpOwotICAgICAgdmFyIGdyZWVuUGFydCA9IHBhcnNlSW50KGFjdHVhbENvbG9yLnN1YnN0cmluZygzLDUpLCAxNik7Ci0gICAgICB2YXIgYmx1ZVBhcnQgID0gcGFyc2VJbnQoYWN0dWFsQ29sb3Iuc3Vic3RyaW5nKDUpLCAxNik7Ci0gICAgICByZXR1cm4gbmV3IFJpY28uQ29sb3IoIHJlZFBhcnQsIGdyZWVuUGFydCwgYmx1ZVBhcnQgKTsKLSAgIH0KLSAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgUmljby5Db2xvcigyNTUsMjU1LDI1NSk7Ci19Ci0KLVJpY28uQ29sb3IuSFNCdG9SR0IgPSBmdW5jdGlvbihodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpIHsKLQotICAgdmFyIHJlZCAgID0gMDsKLQl2YXIgZ3JlZW4gPSAwOwotCXZhciBibHVlICA9IDA7Ci0KLSAgIGlmIChzYXR1cmF0aW9uID09IDApIHsKLSAgICAgIHJlZCA9IHBhcnNlSW50KGJyaWdodG5lc3MgKiAyNTUuMCArIDAuNSk7Ci0JICAgZ3JlZW4gPSByZWQ7Ci0JICAgYmx1ZSA9IHJlZDsKLQl9Ci0JZWxzZSB7Ci0gICAgICB2YXIgaCA9IChodWUgLSBNYXRoLmZsb29yKGh1ZSkpICogNi4wOwotICAgICAgdmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTsKLSAgICAgIHZhciBwID0gYnJpZ2h0bmVzcyAqICgxLjAgLSBzYXR1cmF0aW9uKTsKLSAgICAgIHZhciBxID0gYnJpZ2h0bmVzcyAqICgxLjAgLSBzYXR1cmF0aW9uICogZik7Ci0gICAgICB2YXIgdCA9IGJyaWdodG5lc3MgKiAoMS4wIC0gKHNhdHVyYXRpb24gKiAoMS4wIC0gZikpKTsKLQotICAgICAgc3dpdGNoIChwYXJzZUludChoKSkgewotICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmVkICAgPSAoYnJpZ2h0bmVzcyAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGdyZWVuID0gKHQgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBibHVlICA9IChwICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZWQgICA9IChxICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgZ3JlZW4gPSAoYnJpZ2h0bmVzcyAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJsdWUgID0gKHAgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJlZCAgID0gKHAgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBncmVlbiA9IChicmlnaHRuZXNzICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgYmx1ZSAgPSAodCAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmVkICAgPSAocCAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGdyZWVuID0gKHEgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBibHVlICA9IChicmlnaHRuZXNzICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZWQgICA9ICh0ICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgZ3JlZW4gPSAocCAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJsdWUgID0gKGJyaWdodG5lc3MgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICByZWQgICA9IChicmlnaHRuZXNzICogMjU1LjAgKyAwLjUpOwotICAgICAgICAgICAgZ3JlZW4gPSAocCAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJsdWUgID0gKHEgKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgcmV0dXJuIHsgciA6IHBhcnNlSW50KHJlZCksIGcgOiBwYXJzZUludChncmVlbikgLCBiIDogcGFyc2VJbnQoYmx1ZSkgfTsKLX0KLQotUmljby5Db2xvci5SR0J0b0hTQiA9IGZ1bmN0aW9uKHIsIGcsIGIpIHsKLQotICAgdmFyIGh1ZTsKLSAgIHZhciBzYXR1cmF0b247Ci0gICB2YXIgYnJpZ2h0bmVzczsKLQotICAgdmFyIGNtYXggPSAociA+IGcpID8gciA6IGc7Ci0gICBpZiAoYiA+IGNtYXgpCi0gICAgICBjbWF4ID0gYjsKLQotICAgdmFyIGNtaW4gPSAociA8IGcpID8gciA6IGc7Ci0gICBpZiAoYiA8IGNtaW4pCi0gICAgICBjbWluID0gYjsKLQotICAgYnJpZ2h0bmVzcyA9IGNtYXggLyAyNTUuMDsKLSAgIGlmIChjbWF4ICE9IDApCi0gICAgICBzYXR1cmF0aW9uID0gKGNtYXggLSBjbWluKS9jbWF4OwotICAgZWxzZQotICAgICAgc2F0dXJhdGlvbiA9IDA7Ci0KLSAgIGlmIChzYXR1cmF0aW9uID09IDApCi0gICAgICBodWUgPSAwOwotICAgZWxzZSB7Ci0gICAgICB2YXIgcmVkYyAgID0gKGNtYXggLSByKS8oY21heCAtIGNtaW4pOwotICAgIAl2YXIgZ3JlZW5jID0gKGNtYXggLSBnKS8oY21heCAtIGNtaW4pOwotICAgIAl2YXIgYmx1ZWMgID0gKGNtYXggLSBiKS8oY21heCAtIGNtaW4pOwotCi0gICAgCWlmIChyID09IGNtYXgpCi0gICAgCSAgIGh1ZSA9IGJsdWVjIC0gZ3JlZW5jOwotICAgIAllbHNlIGlmIChnID09IGNtYXgpCi0gICAgCSAgIGh1ZSA9IDIuMCArIHJlZGMgLSBibHVlYzsKLSAgICAgIGVsc2UKLSAgICAJICAgaHVlID0gNC4wICsgZ3JlZW5jIC0gcmVkYzsKLQotICAgIAlodWUgPSBodWUgLyA2LjA7Ci0gICAgCWlmIChodWUgPCAwKQotICAgIAkgICBodWUgPSBodWUgKyAxLjA7Ci0gICB9Ci0KLSAgIHJldHVybiB7IGggOiBodWUsIHMgOiBzYXR1cmF0aW9uLCBiIDogYnJpZ2h0bmVzcyB9OwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmljb0Nvcm5lci5qcwotCi1SaWNvLkNvcm5lciA9IHsKLQotICAgcm91bmQ6IGZ1bmN0aW9uKGUsIG9wdGlvbnMpIHsKLSAgICAgIHZhciBlID0gJChlKTsKLSAgICAgIHRoaXMuX3NldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgIHZhciBjb2xvciA9IHRoaXMub3B0aW9ucy5jb2xvcjsKLSAgICAgIGlmICggdGhpcy5vcHRpb25zLmNvbG9yID09ICJmcm9tRWxlbWVudCIgKQotICAgICAgICAgY29sb3IgPSB0aGlzLl9iYWNrZ3JvdW5kKGUpOwotCi0gICAgICB2YXIgYmdDb2xvciA9IHRoaXMub3B0aW9ucy5iZ0NvbG9yOwotICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuYmdDb2xvciA9PSAiZnJvbVBhcmVudCIgKQotICAgICAgICAgYmdDb2xvciA9IHRoaXMuX2JhY2tncm91bmQoZS5vZmZzZXRQYXJlbnQpOwotCi0gICAgICB0aGlzLl9yb3VuZENvcm5lcnNJbXBsKGUsIGNvbG9yLCBiZ0NvbG9yKTsKLSAgIH0sCi0KLSAgIF9yb3VuZENvcm5lcnNJbXBsOiBmdW5jdGlvbihlLCBjb2xvciwgYmdDb2xvcikgewotICAgICAgaWYodGhpcy5vcHRpb25zLmJvcmRlcikKLSAgICAgICAgIHRoaXMuX3JlbmRlckJvcmRlcihlLGJnQ29sb3IpOwotICAgICAgaWYodGhpcy5faXNUb3BSb3VuZGVkKCkpCi0gICAgICAgICB0aGlzLl9yb3VuZFRvcENvcm5lcnMoZSxjb2xvcixiZ0NvbG9yKTsKLSAgICAgIGlmKHRoaXMuX2lzQm90dG9tUm91bmRlZCgpKQotICAgICAgICAgdGhpcy5fcm91bmRCb3R0b21Db3JuZXJzKGUsY29sb3IsYmdDb2xvcik7Ci0gICB9LAotCi0gICBfcmVuZGVyQm9yZGVyOiBmdW5jdGlvbihlbCxiZ0NvbG9yKSB7Ci0gICAgICB2YXIgYm9yZGVyVmFsdWUgPSAiMXB4IHNvbGlkICIgKyB0aGlzLl9ib3JkZXJDb2xvcihiZ0NvbG9yKTsKLSAgICAgIHZhciBib3JkZXJMID0gImJvcmRlci1sZWZ0OiAiICArIGJvcmRlclZhbHVlOwotICAgICAgdmFyIGJvcmRlclIgPSAiYm9yZGVyLXJpZ2h0OiAiICsgYm9yZGVyVmFsdWU7Ci0gICAgICB2YXIgc3R5bGUgICA9ICJzdHlsZT0nIiArIGJvcmRlckwgKyAiOyIgKyBib3JkZXJSICsgICInIjsKLSAgICAgIGVsLmlubmVySFRNTCA9ICI8ZGl2ICIgKyBzdHlsZSArICI+IiArIGVsLmlubmVySFRNTCArICI8L2Rpdj4iCi0gICB9LAotCi0gICBfcm91bmRUb3BDb3JuZXJzOiBmdW5jdGlvbihlbCwgY29sb3IsIGJnQ29sb3IpIHsKLSAgICAgIHZhciBjb3JuZXIgPSB0aGlzLl9jcmVhdGVDb3JuZXIoYmdDb2xvcik7Ci0gICAgICBmb3IodmFyIGk9MCA7IGkgPCB0aGlzLm9wdGlvbnMubnVtU2xpY2VzIDsgaSsrICkKLSAgICAgICAgIGNvcm5lci5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVDb3JuZXJTbGljZShjb2xvcixiZ0NvbG9yLGksInRvcCIpKTsKLSAgICAgIGVsLnN0eWxlLnBhZGRpbmdUb3AgPSAwOwotICAgICAgZWwuaW5zZXJ0QmVmb3JlKGNvcm5lcixlbC5maXJzdENoaWxkKTsKLSAgIH0sCi0KLSAgIF9yb3VuZEJvdHRvbUNvcm5lcnM6IGZ1bmN0aW9uKGVsLCBjb2xvciwgYmdDb2xvcikgewotICAgICAgdmFyIGNvcm5lciA9IHRoaXMuX2NyZWF0ZUNvcm5lcihiZ0NvbG9yKTsKLSAgICAgIGZvcih2YXIgaT0odGhpcy5vcHRpb25zLm51bVNsaWNlcy0xKSA7IGkgPj0gMCA7IGktLSApCi0gICAgICAgICBjb3JuZXIuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlQ29ybmVyU2xpY2UoY29sb3IsYmdDb2xvcixpLCJib3R0b20iKSk7Ci0gICAgICBlbC5zdHlsZS5wYWRkaW5nQm90dG9tID0gMDsKLSAgICAgIGVsLmFwcGVuZENoaWxkKGNvcm5lcik7Ci0gICB9LAotCi0gICBfY3JlYXRlQ29ybmVyOiBmdW5jdGlvbihiZ0NvbG9yKSB7Ci0gICAgICB2YXIgY29ybmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgICBjb3JuZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKHRoaXMuX2lzVHJhbnNwYXJlbnQoKSA/ICJ0cmFuc3BhcmVudCIgOiBiZ0NvbG9yKTsKLSAgICAgIHJldHVybiBjb3JuZXI7Ci0gICB9LAotCi0gICBfY3JlYXRlQ29ybmVyU2xpY2U6IGZ1bmN0aW9uKGNvbG9yLGJnQ29sb3IsIG4sIHBvc2l0aW9uKSB7Ci0gICAgICB2YXIgc2xpY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ci0KLSAgICAgIHZhciBpblN0eWxlID0gc2xpY2Uuc3R5bGU7Ci0gICAgICBpblN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotICAgICAgaW5TdHlsZS5kaXNwbGF5ICA9ICJibG9jayI7Ci0gICAgICBpblN0eWxlLmhlaWdodCAgID0gIjFweCI7Ci0gICAgICBpblN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7Ci0gICAgICBpblN0eWxlLmZvbnRTaXplID0gIjFweCI7Ci0KLSAgICAgIHZhciBib3JkZXJDb2xvciA9IHRoaXMuX2JvcmRlckNvbG9yKGNvbG9yLGJnQ29sb3IpOwotICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuYm9yZGVyICYmIG4gPT0gMCApIHsKLSAgICAgICAgIGluU3R5bGUuYm9yZGVyVG9wU3R5bGUgICAgPSAic29saWQiOwotICAgICAgICAgaW5TdHlsZS5ib3JkZXJUb3BXaWR0aCAgICA9ICIxcHgiOwotICAgICAgICAgaW5TdHlsZS5ib3JkZXJMZWZ0V2lkdGggICA9ICIwcHgiOwotICAgICAgICAgaW5TdHlsZS5ib3JkZXJSaWdodFdpZHRoICA9ICIwcHgiOwotICAgICAgICAgaW5TdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9ICIwcHgiOwotICAgICAgICAgaW5TdHlsZS5oZWlnaHQgICAgICAgICAgICA9ICIwcHgiOyAvLyBhc3N1bWVzIGNzcyBjb21wbGlhbnQgYm94IG1vZGVsCi0gICAgICAgICBpblN0eWxlLmJvcmRlckNvbG9yICAgICAgID0gYm9yZGVyQ29sb3I7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGJvcmRlckNvbG9yKSB7Ci0gICAgICAgICBpblN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7Ci0gICAgICAgICBpblN0eWxlLmJvcmRlclN0eWxlID0gInNvbGlkIjsKLSAgICAgICAgIGluU3R5bGUuYm9yZGVyV2lkdGggPSAiMHB4IDFweCI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIXRoaXMub3B0aW9ucy5jb21wYWN0ICYmIChuID09ICh0aGlzLm9wdGlvbnMubnVtU2xpY2VzLTEpKSApCi0gICAgICAgICBpblN0eWxlLmhlaWdodCA9ICIycHgiOwotCi0gICAgICB0aGlzLl9zZXRNYXJnaW4oc2xpY2UsIG4sIHBvc2l0aW9uKTsKLSAgICAgIHRoaXMuX3NldEJvcmRlcihzbGljZSwgbiwgcG9zaXRpb24pOwotCi0gICAgICByZXR1cm4gc2xpY2U7Ci0gICB9LAotCi0gICBfc2V0T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucykgewotICAgICAgdGhpcy5vcHRpb25zID0gewotICAgICAgICAgY29ybmVycyA6ICJhbGwiLAotICAgICAgICAgY29sb3IgICA6ICJmcm9tRWxlbWVudCIsCi0gICAgICAgICBiZ0NvbG9yIDogImZyb21QYXJlbnQiLAotICAgICAgICAgYmxlbmQgICA6IHRydWUsCi0gICAgICAgICBib3JkZXIgIDogZmFsc2UsCi0gICAgICAgICBjb21wYWN0IDogZmFsc2UKLSAgICAgIH0uZXh0ZW5kKG9wdGlvbnMgfHwge30pOwotCi0gICAgICB0aGlzLm9wdGlvbnMubnVtU2xpY2VzID0gdGhpcy5vcHRpb25zLmNvbXBhY3QgPyAyIDogNDsKLSAgICAgIGlmICggdGhpcy5faXNUcmFuc3BhcmVudCgpICkKLSAgICAgICAgIHRoaXMub3B0aW9ucy5ibGVuZCA9IGZhbHNlOwotICAgfSwKLQotICAgX3doaWNoU2lkZVRvcDogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoIHRoaXMuX2hhc1N0cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywgImFsbCIsICJ0b3AiKSApCi0gICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgIGlmICggdGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigidGwiKSA+PSAwICYmIHRoaXMub3B0aW9ucy5jb3JuZXJzLmluZGV4T2YoInRyIikgPj0gMCApCi0gICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29ybmVycy5pbmRleE9mKCJ0bCIpID49IDApCi0gICAgICAgICByZXR1cm4gImxlZnQiOwotICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigidHIiKSA+PSAwKQotICAgICAgICAgIHJldHVybiAicmlnaHQiOwotICAgICAgcmV0dXJuICIiOwotICAgfSwKLQotICAgX3doaWNoU2lkZUJvdHRvbTogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoIHRoaXMuX2hhc1N0cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywgImFsbCIsICJib3R0b20iKSApCi0gICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgIGlmICggdGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigiYmwiKT49MCAmJiB0aGlzLm9wdGlvbnMuY29ybmVycy5pbmRleE9mKCJiciIpPj0wICkKLSAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgaWYodGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigiYmwiKSA+PTApCi0gICAgICAgICByZXR1cm4gImxlZnQiOwotICAgICAgZWxzZSBpZih0aGlzLm9wdGlvbnMuY29ybmVycy5pbmRleE9mKCJiciIpPj0wKQotICAgICAgICAgcmV0dXJuICJyaWdodCI7Ci0gICAgICByZXR1cm4gIiI7Ci0gICB9LAotCi0gICBfYm9yZGVyQ29sb3IgOiBmdW5jdGlvbihjb2xvcixiZ0NvbG9yKSB7Ci0gICAgICBpZiAoIGNvbG9yID09ICJ0cmFuc3BhcmVudCIgKQotICAgICAgICAgcmV0dXJuIGJnQ29sb3I7Ci0gICAgICBlbHNlIGlmICggdGhpcy5vcHRpb25zLmJvcmRlciApCi0gICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmJvcmRlcjsKLSAgICAgIGVsc2UgaWYgKCB0aGlzLm9wdGlvbnMuYmxlbmQgKQotICAgICAgICAgcmV0dXJuIHRoaXMuX2JsZW5kKCBiZ0NvbG9yLCBjb2xvciApOwotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuICIiOwotICAgfSwKLQotCi0gICBfc2V0TWFyZ2luOiBmdW5jdGlvbihlbCwgbiwgY29ybmVycykgewotICAgICAgdmFyIG1hcmdpblNpemUgPSB0aGlzLl9tYXJnaW5TaXplKG4pOwotICAgICAgdmFyIHdoaWNoU2lkZSA9IGNvcm5lcnMgPT0gInRvcCIgPyB0aGlzLl93aGljaFNpZGVUb3AoKSA6IHRoaXMuX3doaWNoU2lkZUJvdHRvbSgpOwotCi0gICAgICBpZiAoIHdoaWNoU2lkZSA9PSAibGVmdCIgKSB7Ci0gICAgICAgICBlbC5zdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luU2l6ZSArICJweCI7IGVsLnN0eWxlLm1hcmdpblJpZ2h0ID0gIjBweCI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggd2hpY2hTaWRlID09ICJyaWdodCIgKSB7Ci0gICAgICAgICBlbC5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpblNpemUgKyAicHgiOyBlbC5zdHlsZS5tYXJnaW5MZWZ0ICA9ICIwcHgiOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBlbC5zdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luU2l6ZSArICJweCI7IGVsLnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luU2l6ZSArICJweCI7Ci0gICAgICB9Ci0gICB9LAotCi0gICBfc2V0Qm9yZGVyOiBmdW5jdGlvbihlbCxuLGNvcm5lcnMpIHsKLSAgICAgIHZhciBib3JkZXJTaXplID0gdGhpcy5fYm9yZGVyU2l6ZShuKTsKLSAgICAgIHZhciB3aGljaFNpZGUgPSBjb3JuZXJzID09ICJ0b3AiID8gdGhpcy5fd2hpY2hTaWRlVG9wKCkgOiB0aGlzLl93aGljaFNpZGVCb3R0b20oKTsKLQotICAgICAgaWYgKCB3aGljaFNpZGUgPT0gImxlZnQiICkgewotICAgICAgICAgZWwuc3R5bGUuYm9yZGVyTGVmdFdpZHRoID0gYm9yZGVyU2l6ZSArICJweCI7IGVsLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSAiMHB4IjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB3aGljaFNpZGUgPT0gInJpZ2h0IiApIHsKLSAgICAgICAgIGVsLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSBib3JkZXJTaXplICsgInB4IjsgZWwuc3R5bGUuYm9yZGVyTGVmdFdpZHRoICA9ICIwcHgiOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBlbC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSBib3JkZXJTaXplICsgInB4IjsgZWwuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IGJvcmRlclNpemUgKyAicHgiOwotICAgICAgfQotICAgfSwKLQotICAgX21hcmdpblNpemU6IGZ1bmN0aW9uKG4pIHsKLSAgICAgIGlmICggdGhpcy5faXNUcmFuc3BhcmVudCgpICkKLSAgICAgICAgIHJldHVybiAwOwotCi0gICAgICB2YXIgbWFyZ2luU2l6ZXMgICAgICAgICAgPSBbIDUsIDMsIDIsIDEgXTsKLSAgICAgIHZhciBibGVuZGVkTWFyZ2luU2l6ZXMgICA9IFsgMywgMiwgMSwgMCBdOwotICAgICAgdmFyIGNvbXBhY3RNYXJnaW5TaXplcyAgID0gWyAyLCAxIF07Ci0gICAgICB2YXIgc21CbGVuZGVkTWFyZ2luU2l6ZXMgPSBbIDEsIDAgXTsKLQotICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuY29tcGFjdCAmJiB0aGlzLm9wdGlvbnMuYmxlbmQgKQotICAgICAgICAgcmV0dXJuIHNtQmxlbmRlZE1hcmdpblNpemVzW25dOwotICAgICAgZWxzZSBpZiAoIHRoaXMub3B0aW9ucy5jb21wYWN0ICkKLSAgICAgICAgIHJldHVybiBjb21wYWN0TWFyZ2luU2l6ZXNbbl07Ci0gICAgICBlbHNlIGlmICggdGhpcy5vcHRpb25zLmJsZW5kICkKLSAgICAgICAgIHJldHVybiBibGVuZGVkTWFyZ2luU2l6ZXNbbl07Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gbWFyZ2luU2l6ZXNbbl07Ci0gICB9LAotCi0gICBfYm9yZGVyU2l6ZTogZnVuY3Rpb24obikgewotICAgICAgdmFyIHRyYW5zcGFyZW50Qm9yZGVyU2l6ZXMgPSBbIDUsIDMsIDIsIDEgXTsKLSAgICAgIHZhciBibGVuZGVkQm9yZGVyU2l6ZXMgICAgID0gWyAyLCAxLCAxLCAxIF07Ci0gICAgICB2YXIgY29tcGFjdEJvcmRlclNpemVzICAgICA9IFsgMSwgMCBdOwotICAgICAgdmFyIGFjdHVhbEJvcmRlclNpemVzICAgICAgPSBbIDAsIDIsIDAsIDAgXTsKLQotICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuY29tcGFjdCAmJiAodGhpcy5vcHRpb25zLmJsZW5kIHx8IHRoaXMuX2lzVHJhbnNwYXJlbnQoKSkgKQotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmICggdGhpcy5vcHRpb25zLmNvbXBhY3QgKQotICAgICAgICAgcmV0dXJuIGNvbXBhY3RCb3JkZXJTaXplc1tuXTsKLSAgICAgIGVsc2UgaWYgKCB0aGlzLm9wdGlvbnMuYmxlbmQgKQotICAgICAgICAgcmV0dXJuIGJsZW5kZWRCb3JkZXJTaXplc1tuXTsKLSAgICAgIGVsc2UgaWYgKCB0aGlzLm9wdGlvbnMuYm9yZGVyICkKLSAgICAgICAgIHJldHVybiBhY3R1YWxCb3JkZXJTaXplc1tuXTsKLSAgICAgIGVsc2UgaWYgKCB0aGlzLl9pc1RyYW5zcGFyZW50KCkgKQotICAgICAgICAgcmV0dXJuIHRyYW5zcGFyZW50Qm9yZGVyU2l6ZXNbbl07Ci0gICAgICByZXR1cm4gMDsKLSAgIH0sCi0KLSAgIF9oYXNTdHJpbmc6IGZ1bmN0aW9uKHN0cikgeyBmb3IodmFyIGk9MSA7IGk8YXJndW1lbnRzLmxlbmd0aCA7IGkrKykgaWYgKHN0ci5pbmRleE9mKGFyZ3VtZW50c1tpXSkgPj0gMCkgcmV0dXJuIHRydWU7IHJldHVybiBmYWxzZTsgfSwKLSAgIF9ibGVuZDogZnVuY3Rpb24oYzEsIGMyKSB7IHZhciBjYzEgPSBSaWNvLkNvbG9yLmNyZWF0ZUZyb21IZXgoYzEpOyBjYzEuYmxlbmQoUmljby5Db2xvci5jcmVhdGVGcm9tSGV4KGMyKSk7IHJldHVybiBjYzE7IH0sCi0gICBfYmFja2dyb3VuZDogZnVuY3Rpb24oZWwpIHsgdHJ5IHsgcmV0dXJuIFJpY28uQ29sb3IuY3JlYXRlQ29sb3JGcm9tQmFja2dyb3VuZChlbCkuYXNIZXgoKTsgfSBjYXRjaChlcnIpIHsgcmV0dXJuICIjZmZmZmZmIjsgfSB9LAotICAgX2lzVHJhbnNwYXJlbnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yID09ICJ0cmFuc3BhcmVudCI7IH0sCi0gICBfaXNUb3BSb3VuZGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2hhc1N0cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywgImFsbCIsICJ0b3AiLCAidGwiLCAidHIiKTsgfSwKLSAgIF9pc0JvdHRvbVJvdW5kZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5faGFzU3RyaW5nKHRoaXMub3B0aW9ucy5jb3JuZXJzLCAiYWxsIiwgImJvdHRvbSIsICJibCIsICJiciIpOyB9LAotICAgX2hhc1NpbmdsZVRleHRDaGlsZDogZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGVsLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgZWwuY2hpbGROb2Rlc1swXS5ub2RlVHlwZSA9PSAzOyB9Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvRHJhZ0FuZERyb3AuanMKLVJpY28uRHJhZ0FuZERyb3AgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5EcmFnQW5kRHJvcC5wcm90b3R5cGUgPSB7Ci0KLSAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5kcm9wWm9uZXMgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXkoKTsKLSAgICAgIHRoaXMuZHJhZ2dhYmxlcyAgICAgICAgICAgICAgID0gbmV3IEFycmF5KCk7Ci0gICAgICB0aGlzLmN1cnJlbnREcmFnT2JqZWN0cyAgICAgICA9IG5ldyBBcnJheSgpOwotICAgICAgdGhpcy5kcmFnRWxlbWVudCAgICAgICAgICAgICAgPSBudWxsOwotICAgICAgdGhpcy5sYXN0U2VsZWN0ZWREcmFnZ2FibGUgICAgPSBudWxsOwotICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdFZpc2libGUgPSBmYWxzZTsKLSAgICAgIHRoaXMuaW50ZXJlc3RlZEluTW90aW9uRXZlbnRzID0gZmFsc2U7Ci0gICB9LAotCi0gICByZWdpc3RlckRyb3Bab25lOiBmdW5jdGlvbihhRHJvcFpvbmUpIHsKLSAgICAgIHRoaXMuZHJvcFpvbmVzWyB0aGlzLmRyb3Bab25lcy5sZW5ndGggXSA9IGFEcm9wWm9uZTsKLSAgIH0sCi0KLSAgIGRlcmVnaXN0ZXJEcm9wWm9uZTogZnVuY3Rpb24oYURyb3Bab25lKSB7Ci0gICAgICB2YXIgbmV3RHJvcFpvbmVzID0gbmV3IEFycmF5KCk7Ci0gICAgICB2YXIgaiA9IDA7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgdGhpcy5kcm9wWm9uZXMubGVuZ3RoIDsgaSsrICkgewotICAgICAgICAgaWYgKCB0aGlzLmRyb3Bab25lc1tpXSAhPSBhRHJvcFpvbmUgKQotICAgICAgICAgICAgbmV3RHJvcFpvbmVzW2orK10gPSB0aGlzLmRyb3Bab25lc1tpXTsKLSAgICAgIH0KLQotICAgICAgdGhpcy5kcm9wWm9uZXMgPSBuZXdEcm9wWm9uZXM7Ci0gICB9LAotCi0gICBjbGVhckRyb3Bab25lczogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmRyb3Bab25lcyA9IG5ldyBBcnJheSgpOwotICAgfSwKLQotICAgcmVnaXN0ZXJEcmFnZ2FibGU6IGZ1bmN0aW9uKCBhRHJhZ2dhYmxlICkgewotICAgICAgdGhpcy5kcmFnZ2FibGVzWyB0aGlzLmRyYWdnYWJsZXMubGVuZ3RoIF0gPSBhRHJhZ2dhYmxlOwotICAgICAgdGhpcy5fYWRkTW91c2VEb3duSGFuZGxlciggYURyYWdnYWJsZSApOwotICAgfSwKLQotICAgY2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IHRoaXMuY3VycmVudERyYWdPYmplY3RzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICB0aGlzLmN1cnJlbnREcmFnT2JqZWN0c1tpXS5kZXNlbGVjdCgpOwotICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdHMgPSBuZXcgQXJyYXkoKTsKLSAgICAgIHRoaXMubGFzdFNlbGVjdGVkRHJhZ2dhYmxlID0gbnVsbDsKLSAgIH0sCi0KLSAgIGhhc1NlbGVjdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5jdXJyZW50RHJhZ09iamVjdHMubGVuZ3RoID4gMDsKLSAgIH0sCi0KLSAgIHNldFN0YXJ0RHJhZ0Zyb21FbGVtZW50OiBmdW5jdGlvbiggZSwgbW91c2VEb3duRWxlbWVudCApIHsKLSAgICAgIHRoaXMub3JpZ1BvcyA9IFJpY29VdGlsLnRvRG9jdW1lbnRQb3NpdGlvbihtb3VzZURvd25FbGVtZW50KTsKLSAgICAgIHRoaXMuc3RhcnR4ID0gZS5zY3JlZW5YIC0gdGhpcy5vcmlnUG9zLngKLSAgICAgIHRoaXMuc3RhcnR5ID0gZS5zY3JlZW5ZIC0gdGhpcy5vcmlnUG9zLnkKLSAgICAgIC8vdGhpcy5zdGFydENvbXBvbmVudFggPSBlLmxheWVyWCA/IGUubGF5ZXJYIDogZS5vZmZzZXRYOwotICAgICAgLy90aGlzLnN0YXJ0Q29tcG9uZW50WSA9IGUubGF5ZXJZID8gZS5sYXllclkgOiBlLm9mZnNldFk7Ci0gICAgICAvL3RoaXMuYWRqdXN0ZWRGb3JEcmFnZ2FibGVTaXplID0gZmFsc2U7Ci0KLSAgICAgIHRoaXMuaW50ZXJlc3RlZEluTW90aW9uRXZlbnRzID0gdGhpcy5oYXNTZWxlY3Rpb24oKTsKLSAgICAgIHRoaXMuX3Rlcm1pbmF0ZUV2ZW50KGUpOwotICAgfSwKLQotICAgdXBkYXRlU2VsZWN0aW9uOiBmdW5jdGlvbiggZHJhZ2dhYmxlLCBleHRlbmRTZWxlY3Rpb24gKSB7Ci0gICAgICBpZiAoICEgZXh0ZW5kU2VsZWN0aW9uICkKLSAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKLQotICAgICAgaWYgKCBkcmFnZ2FibGUuaXNTZWxlY3RlZCgpICkgewotICAgICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdHMucmVtb3ZlSXRlbShkcmFnZ2FibGUpOwotICAgICAgICAgZHJhZ2dhYmxlLmRlc2VsZWN0KCk7Ci0gICAgICAgICBpZiAoIGRyYWdnYWJsZSA9PSB0aGlzLmxhc3RTZWxlY3RlZERyYWdnYWJsZSApCi0gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZERyYWdnYWJsZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHRoaXMuY3VycmVudERyYWdPYmplY3RzWyB0aGlzLmN1cnJlbnREcmFnT2JqZWN0cy5sZW5ndGggXSA9IGRyYWdnYWJsZTsKLSAgICAgICAgIGRyYWdnYWJsZS5zZWxlY3QoKTsKLSAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkRHJhZ2dhYmxlID0gZHJhZ2dhYmxlOwotICAgICAgfQotICAgfSwKLQotICAgX21vdXNlRG93bkhhbmRsZXI6IGZ1bmN0aW9uKGUpIHsKLSAgICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCA9PSAwICkKLSAgICAgICAgIGUgPSBldmVudDsKLQotICAgICAgLy8gaWYgbm90IGJ1dHRvbiAxIGlnbm9yZSBpdC4uLgotICAgICAgdmFyIG5zRXZlbnQgPSBlLndoaWNoICE9IHVuZGVmaW5lZDsKLSAgICAgIGlmICggKG5zRXZlbnQgJiYgZS53aGljaCAhPSAxKSB8fCAoIW5zRXZlbnQgJiYgZS5idXR0b24gIT0gMSkpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciBldmVudFRhcmdldCAgICAgID0gZS50YXJnZXQgPyBlLnRhcmdldCA6IGUuc3JjRWxlbWVudDsKLSAgICAgIHZhciBkcmFnZ2FibGVPYmplY3QgID0gZXZlbnRUYXJnZXQuZHJhZ2dhYmxlOwotCi0gICAgICB2YXIgY2FuZGlkYXRlID0gZXZlbnRUYXJnZXQ7Ci0gICAgICB3aGlsZSAoZHJhZ2dhYmxlT2JqZWN0ID09IG51bGwgJiYgY2FuZGlkYXRlLnBhcmVudE5vZGUpIHsKLSAgICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5wYXJlbnROb2RlOwotICAgICAgICAgZHJhZ2dhYmxlT2JqZWN0ID0gY2FuZGlkYXRlLmRyYWdnYWJsZTsKLSAgICAgIH0KLSAgIAotICAgICAgaWYgKCBkcmFnZ2FibGVPYmplY3QgPT0gbnVsbCApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKCBkcmFnZ2FibGVPYmplY3QsIGUuY3RybEtleSApOwotCi0gICAgICAvLyBjbGVhciB0aGUgZHJvcCB6b25lcyBwb3N0aW9uIGNhY2hlLi4uCi0gICAgICBpZiAoIHRoaXMuaGFzU2VsZWN0aW9uKCkgKQotICAgICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IHRoaXMuZHJvcFpvbmVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICAgICB0aGlzLmRyb3Bab25lc1tpXS5jbGVhclBvc2l0aW9uQ2FjaGUoKTsKLQotICAgICAgdGhpcy5zZXRTdGFydERyYWdGcm9tRWxlbWVudCggZSwgZHJhZ2dhYmxlT2JqZWN0LmdldE1vdXNlRG93bkhUTUxFbGVtZW50KCkgKTsKLSAgIH0sCi0KLQotICAgX21vdXNlTW92ZUhhbmRsZXI6IGZ1bmN0aW9uKGUpIHsKLSAgICAgIHZhciBuc0V2ZW50ID0gZS53aGljaCAhPSB1bmRlZmluZWQ7Ci0gICAgICBpZiAoICF0aGlzLmludGVyZXN0ZWRJbk1vdGlvbkV2ZW50cyApIHsKLSAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZUV2ZW50KGUpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoICEgdGhpcy5oYXNTZWxlY3Rpb24oKSApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGlmICggISB0aGlzLmN1cnJlbnREcmFnT2JqZWN0VmlzaWJsZSApCi0gICAgICAgICB0aGlzLl9zdGFydERyYWcoZSk7Ci0KLSAgICAgIGlmICggIXRoaXMuYWN0aXZhdGVkRHJvcFpvbmVzICkKLSAgICAgICAgIHRoaXMuX2FjdGl2YXRlUmVnaXN0ZXJlZERyb3Bab25lcygpOwotCi0gICAgICAvL2lmICggIXRoaXMuYWRqdXN0ZWRGb3JEcmFnZ2FibGVTaXplICkKLSAgICAgIC8vICAgdGhpcy5fYWRqdXN0Rm9yRHJhZ2dhYmxlU2l6ZShlKTsKLQotICAgICAgdGhpcy5fdXBkYXRlRHJhZ2dhYmxlTG9jYXRpb24oZSk7Ci0gICAgICB0aGlzLl91cGRhdGVEcm9wWm9uZXNIb3ZlcihlKTsKLQotICAgICAgdGhpcy5fdGVybWluYXRlRXZlbnQoZSk7Ci0gICB9LAotCi0gICBfbWFrZURyYWdnYWJsZU9iamVjdFZpc2libGU6IGZ1bmN0aW9uKGUpCi0gICB7Ci0gICAgICBpZiAoICF0aGlzLmhhc1NlbGVjdGlvbigpICkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgdmFyIGRyYWdFbGVtZW50OwotICAgICAgaWYgKCB0aGlzLmN1cnJlbnREcmFnT2JqZWN0cy5sZW5ndGggPiAxICkKLSAgICAgICAgIGRyYWdFbGVtZW50ID0gdGhpcy5jdXJyZW50RHJhZ09iamVjdHNbMF0uZ2V0TXVsdGlPYmplY3REcmFnR1VJKHRoaXMuY3VycmVudERyYWdPYmplY3RzKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIGRyYWdFbGVtZW50ID0gdGhpcy5jdXJyZW50RHJhZ09iamVjdHNbMF0uZ2V0U2luZ2xlT2JqZWN0RHJhZ0dVSSgpOwotCi0gICAgICAvLyBnbyBhaGVhZCBhbmQgYWJzb2x1dGUgcG9zaXRpb24gaXQuLi4KLSAgICAgIGlmICggUmljb1V0aWwuZ2V0RWxlbWVudHNDb21wdXRlZFN0eWxlKGRyYWdFbGVtZW50LCAicG9zaXRpb24iKSAgIT0gImFic29sdXRlIiApCi0gICAgICAgICBkcmFnRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7Ci0KLSAgICAgIC8vIG5lZWQgdG8gcGFyZW50IGhpbSBpbnRvIHRoZSBkb2N1bWVudC4uLgotICAgICAgaWYgKCBkcmFnRWxlbWVudC5wYXJlbnROb2RlID09IG51bGwgfHwgZHJhZ0VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSAxMSApCi0gICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRyYWdFbGVtZW50KTsKLQotICAgICAgdGhpcy5kcmFnRWxlbWVudCA9IGRyYWdFbGVtZW50OwotICAgICAgdGhpcy5fdXBkYXRlRHJhZ2dhYmxlTG9jYXRpb24oZSk7Ci0KLSAgICAgIHRoaXMuY3VycmVudERyYWdPYmplY3RWaXNpYmxlID0gdHJ1ZTsKLSAgIH0sCi0KLSAgIC8qKgotICAgX2FkanVzdEZvckRyYWdnYWJsZVNpemU6IGZ1bmN0aW9uKGUpIHsKLSAgICAgIHZhciBkcmFnRWxlbWVudFdpZHRoICA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0V2lkdGg7Ci0gICAgICB2YXIgZHJhZ0VsZW1lbnRIZWlnaHQgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldEhlaWdodDsKLSAgICAgIGlmICggdGhpcy5zdGFydENvbXBvbmVudFggPiBkcmFnRWxlbWVudFdpZHRoICkKLSAgICAgICAgIHRoaXMuc3RhcnR4IC09IHRoaXMuc3RhcnRDb21wb25lbnRYIC0gZHJhZ0VsZW1lbnRXaWR0aCArIDI7Ci0gICAgICBpZiAoIGUub2Zmc2V0WSApIHsKLSAgICAgICAgIGlmICggdGhpcy5zdGFydENvbXBvbmVudFkgPiBkcmFnRWxlbWVudEhlaWdodCApCi0gICAgICAgICAgICB0aGlzLnN0YXJ0eSAtPSB0aGlzLnN0YXJ0Q29tcG9uZW50WSAtIGRyYWdFbGVtZW50SGVpZ2h0ICsgMjsKLSAgICAgIH0KLSAgICAgIHRoaXMuYWRqdXN0ZWRGb3JEcmFnZ2FibGVTaXplID0gdHJ1ZTsKLSAgIH0sCi0gICAqKi8KLQotICAgX3VwZGF0ZURyYWdnYWJsZUxvY2F0aW9uOiBmdW5jdGlvbihlKSB7Ci0gICAgICB2YXIgZHJhZ09iamVjdFN0eWxlID0gdGhpcy5kcmFnRWxlbWVudC5zdHlsZTsKLSAgICAgIGRyYWdPYmplY3RTdHlsZS5sZWZ0ID0gKGUuc2NyZWVuWCAtIHRoaXMuc3RhcnR4KSArICJweCIKLSAgICAgIGRyYWdPYmplY3RTdHlsZS50b3AgID0gKGUuc2NyZWVuWSAtIHRoaXMuc3RhcnR5KSArICJweCI7Ci0gICB9LAotCi0gICBfdXBkYXRlRHJvcFpvbmVzSG92ZXI6IGZ1bmN0aW9uKGUpIHsKLSAgICAgIHZhciBuID0gdGhpcy5kcm9wWm9uZXMubGVuZ3RoOwotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IG4gOyBpKysgKSB7Ci0gICAgICAgICBpZiAoICEgdGhpcy5fbW91c2VQb2ludEluRHJvcFpvbmUoIGUsIHRoaXMuZHJvcFpvbmVzW2ldICkgKQotICAgICAgICAgICAgdGhpcy5kcm9wWm9uZXNbaV0uaGlkZUhvdmVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCBuIDsgaSsrICkgewotICAgICAgICAgaWYgKCB0aGlzLl9tb3VzZVBvaW50SW5Ecm9wWm9uZSggZSwgdGhpcy5kcm9wWm9uZXNbaV0gKSApIHsKLSAgICAgICAgICAgIGlmICggdGhpcy5kcm9wWm9uZXNbaV0uY2FuQWNjZXB0KHRoaXMuY3VycmVudERyYWdPYmplY3RzKSApCi0gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lc1tpXS5zaG93SG92ZXIoKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0sCi0KLSAgIF9zdGFydERyYWc6IGZ1bmN0aW9uKGUpIHsKLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCB0aGlzLmN1cnJlbnREcmFnT2JqZWN0cy5sZW5ndGggOyBpKysgKQotICAgICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdHNbaV0uc3RhcnREcmFnKCk7Ci0KLSAgICAgIHRoaXMuX21ha2VEcmFnZ2FibGVPYmplY3RWaXNpYmxlKGUpOwotICAgfSwKLQotICAgX21vdXNlVXBIYW5kbGVyOiBmdW5jdGlvbihlKSB7Ci0gICAgICBpZiAoICEgdGhpcy5oYXNTZWxlY3Rpb24oKSApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIHZhciBuc0V2ZW50ID0gZS53aGljaCAhPSB1bmRlZmluZWQ7Ci0gICAgICBpZiAoIChuc0V2ZW50ICYmIGUud2hpY2ggIT0gMSkgfHwgKCFuc0V2ZW50ICYmIGUuYnV0dG9uICE9IDEpKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICB0aGlzLmludGVyZXN0ZWRJbk1vdGlvbkV2ZW50cyA9IGZhbHNlOwotCi0gICAgICBpZiAoIHRoaXMuZHJhZ0VsZW1lbnQgPT0gbnVsbCApIHsKLSAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZUV2ZW50KGUpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIHRoaXMuX3BsYWNlRHJhZ2dhYmxlSW5Ecm9wWm9uZShlKSApCi0gICAgICAgICB0aGlzLl9jb21wbGV0ZURyb3BPcGVyYXRpb24oZSk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZUV2ZW50KGUpOwotICAgICAgICAgbmV3IEVmZmVjdC5Qb3NpdGlvbiggdGhpcy5kcmFnRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3JpZ1Bvcy54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnUG9zLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29tcGxldGUgOiB0aGlzLl9kb0NhbmNlbERyYWdQcm9jZXNzaW5nLmJpbmQodGhpcykgfSApOwotICAgICAgfQotICAgfSwKLQotICAgX2NvbXBsZXRlRHJvcE9wZXJhdGlvbjogZnVuY3Rpb24oZSkgewotICAgICAgaWYgKCB0aGlzLmRyYWdFbGVtZW50ICE9IHRoaXMuY3VycmVudERyYWdPYmplY3RzWzBdLmdldE1vdXNlRG93bkhUTUxFbGVtZW50KCkgKSB7Ci0gICAgICAgICBpZiAoIHRoaXMuZHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAhPSBudWxsICkKLSAgICAgICAgICAgIHRoaXMuZHJhZ0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRyYWdFbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgdGhpcy5fZGVhY3RpdmF0ZVJlZ2lzdGVyZWREcm9wWm9uZXMoKTsKLSAgICAgIHRoaXMuX2VuZERyYWcoKTsKLSAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgIHRoaXMuZHJhZ0VsZW1lbnQgPSBudWxsOwotICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdFZpc2libGUgPSBmYWxzZTsKLSAgICAgIHRoaXMuX3Rlcm1pbmF0ZUV2ZW50KGUpOwotICAgfSwKLQotICAgX2RvQ2FuY2VsRHJhZ1Byb2Nlc3Npbmc6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5fY2FuY2VsRHJhZygpOwotCi0gICAgICBpZiAoIHRoaXMuZHJhZ0VsZW1lbnQgIT0gdGhpcy5jdXJyZW50RHJhZ09iamVjdHNbMF0uZ2V0TW91c2VEb3duSFRNTEVsZW1lbnQoKSApIHsKLSAgICAgICAgIGlmICggdGhpcy5kcmFnRWxlbWVudC5wYXJlbnROb2RlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICB0aGlzLmRyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kcmFnRWxlbWVudCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuX2RlYWN0aXZhdGVSZWdpc3RlcmVkRHJvcFpvbmVzKCk7Ci0gICAgICB0aGlzLmRyYWdFbGVtZW50ID0gbnVsbDsKLSAgICAgIHRoaXMuY3VycmVudERyYWdPYmplY3RWaXNpYmxlID0gZmFsc2U7Ci0gICB9LAotCi0gICBfcGxhY2VEcmFnZ2FibGVJbkRyb3Bab25lOiBmdW5jdGlvbihlKSB7Ci0gICAgICB2YXIgZm91bmREcm9wWm9uZSA9IGZhbHNlOwotICAgICAgdmFyIG4gPSB0aGlzLmRyb3Bab25lcy5sZW5ndGg7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgbiA7IGkrKyApIHsKLSAgICAgICAgIGlmICggdGhpcy5fbW91c2VQb2ludEluRHJvcFpvbmUoIGUsIHRoaXMuZHJvcFpvbmVzW2ldICkgKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMuZHJvcFpvbmVzW2ldLmNhbkFjY2VwdCh0aGlzLmN1cnJlbnREcmFnT2JqZWN0cykgKSB7Ci0gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lc1tpXS5oaWRlSG92ZXIoKTsKLSAgICAgICAgICAgICAgIHRoaXMuZHJvcFpvbmVzW2ldLmFjY2VwdCh0aGlzLmN1cnJlbnREcmFnT2JqZWN0cyk7Ci0gICAgICAgICAgICAgICBmb3VuZERyb3Bab25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gZm91bmREcm9wWm9uZTsKLSAgIH0sCi0KLSAgIF9jYW5jZWxEcmFnOiBmdW5jdGlvbigpIHsKLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCB0aGlzLmN1cnJlbnREcmFnT2JqZWN0cy5sZW5ndGggOyBpKysgKQotICAgICAgICAgdGhpcy5jdXJyZW50RHJhZ09iamVjdHNbaV0uY2FuY2VsRHJhZygpOwotICAgfSwKLQotICAgX2VuZERyYWc6IGZ1bmN0aW9uKCkgewotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IHRoaXMuY3VycmVudERyYWdPYmplY3RzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICB0aGlzLmN1cnJlbnREcmFnT2JqZWN0c1tpXS5lbmREcmFnKCk7Ci0gICB9LAotCi0gICBfbW91c2VQb2ludEluRHJvcFpvbmU6IGZ1bmN0aW9uKCBlLCBkcm9wWm9uZSApIHsKLQotICAgICAgdmFyIGFic29sdXRlUmVjdCA9IGRyb3Bab25lLmdldEFic29sdXRlUmVjdCgpOwotCi0gICAgICByZXR1cm4gZS5jbGllbnRYICA+IGFic29sdXRlUmVjdC5sZWZ0ICAmJgotICAgICAgICAgICAgIGUuY2xpZW50WCAgPCBhYnNvbHV0ZVJlY3QucmlnaHQgJiYKLSAgICAgICAgICAgICBlLmNsaWVudFkgID4gYWJzb2x1dGVSZWN0LnRvcCAgICYmCi0gICAgICAgICAgICAgZS5jbGllbnRZICA8IGFic29sdXRlUmVjdC5ib3R0b207Ci0gICB9LAotCi0gICBfYWRkTW91c2VEb3duSGFuZGxlcjogZnVuY3Rpb24oIGFEcmFnZ2FibGUgKQotICAgewotICAgICAgdmFyIGh0bWxFbGVtZW50ID0gYURyYWdnYWJsZS5nZXRNb3VzZURvd25IVE1MRWxlbWVudCgpOwotICAgICAgaWYgKCBodG1sRWxlbWVudCAhPSBudWxsICkgewotICAgICAgICAgaHRtbEVsZW1lbnQuZHJhZ2dhYmxlID0gYURyYWdnYWJsZTsKLSAgICAgICAgIHRoaXMuX2FkZE1vdXNlRG93bkV2ZW50KCBodG1sRWxlbWVudCApOwotICAgICAgfQotICAgfSwKLQotICAgX2FjdGl2YXRlUmVnaXN0ZXJlZERyb3Bab25lczogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgbiA9IHRoaXMuZHJvcFpvbmVzLmxlbmd0aDsKLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCBuIDsgaSsrICkgewotICAgICAgICAgdmFyIGRyb3Bab25lID0gdGhpcy5kcm9wWm9uZXNbaV07Ci0gICAgICAgICBpZiAoIGRyb3Bab25lLmNhbkFjY2VwdCh0aGlzLmN1cnJlbnREcmFnT2JqZWN0cykgKQotICAgICAgICAgICAgZHJvcFpvbmUuYWN0aXZhdGUoKTsKLSAgICAgIH0KLQotICAgICAgdGhpcy5hY3RpdmF0ZWREcm9wWm9uZXMgPSB0cnVlOwotICAgfSwKLQotICAgX2RlYWN0aXZhdGVSZWdpc3RlcmVkRHJvcFpvbmVzOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBuID0gdGhpcy5kcm9wWm9uZXMubGVuZ3RoOwotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IG4gOyBpKysgKQotICAgICAgICAgdGhpcy5kcm9wWm9uZXNbaV0uZGVhY3RpdmF0ZSgpOwotICAgICAgdGhpcy5hY3RpdmF0ZWREcm9wWm9uZXMgPSBmYWxzZTsKLSAgIH0sCi0KLSAgIF9hZGRNb3VzZURvd25FdmVudDogZnVuY3Rpb24oIGh0bWxFbGVtZW50ICkgewotICAgICAgaWYgKCB0eXBlb2YgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gIT0gInVuZGVmaW5lZCIgJiYKLSAgICAgICAgIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIkhUTUwiLCAgICIxLjAiKSAmJgotICAgICAgICAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRzIiwgIjIuMCIpICYmCi0gICAgICAgICBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJDU1MiLCAgICAiMi4wIikgKSB7Ci0gICAgICAgICBodG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLl9tb3VzZURvd25IYW5kbGVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyksIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgaHRtbEVsZW1lbnQuYXR0YWNoRXZlbnQoICJvbm1vdXNlZG93biIsIHRoaXMuX21vdXNlRG93bkhhbmRsZXIuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKSApOwotICAgICAgfQotICAgfSwKLQotICAgX3Rlcm1pbmF0ZUV2ZW50OiBmdW5jdGlvbihlKSB7Ci0gICAgICBpZiAoIGUuc3RvcFByb3BhZ2F0aW9uICE9IHVuZGVmaW5lZCApCi0gICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwotICAgICAgZWxzZSBpZiAoIGUuY2FuY2VsQnViYmxlICE9IHVuZGVmaW5lZCApCi0gICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0KLSAgICAgIGlmICggZS5wcmV2ZW50RGVmYXVsdCAhPSB1bmRlZmluZWQgKQotICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgZWxzZQotICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotICAgfSwKLQotICAgaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKCB0eXBlb2YgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gIT0gInVuZGVmaW5lZCIgJiYKLSAgICAgICAgIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIkhUTUwiLCAgICIxLjAiKSAmJgotICAgICAgICAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRzIiwgIjIuMCIpICYmCi0gICAgICAgICBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJDU1MiLCAgICAiMi4wIikgKSB7Ci0gICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgICB0aGlzLl9tb3VzZVVwSGFuZGxlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpLCAgZmFsc2UpOwotICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5fbW91c2VNb3ZlSGFuZGxlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCAib25tb3VzZXVwIiwgICB0aGlzLl9tb3VzZVVwSGFuZGxlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpICk7Ci0gICAgICAgICBkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ubW91c2Vtb3ZlIiwgdGhpcy5fbW91c2VNb3ZlSGFuZGxlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpICk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8vdmFyIGRuZE1nciA9IG5ldyBSaWNvLkRyYWdBbmREcm9wKCk7Ci0vL2RuZE1nci5pbml0aWFsaXplRXZlbnRIYW5kbGVycygpOwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmljb0RyYWdnYWJsZS5qcwotUmljby5EcmFnZ2FibGUgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5EcmFnZ2FibGUucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbiggdHlwZSwgaHRtbEVsZW1lbnQgKSB7Ci0gICAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlOwotICAgICAgdGhpcy5odG1sRWxlbWVudCAgID0gJChodG1sRWxlbWVudCk7Ci0gICAgICB0aGlzLnNlbGVjdGVkICAgICAgPSBmYWxzZTsKLSAgIH0sCi0KLSAgIC8qKgotICAgICogICBSZXR1cm5zIHRoZSBIVE1MIGVsZW1lbnQgdGhhdCBzaG91bGQgaGF2ZSBhIG1vdXNlIGRvd24gZXZlbnQKLSAgICAqICAgYWRkZWQgdG8gaXQgaW4gb3JkZXIgdG8gaW5pdGlhdGUgYSBkcmFnIG9wZXJhdGlvbgotICAgICoKLSAgICAqKi8KLSAgIGdldE1vdXNlRG93bkhUTUxFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmh0bWxFbGVtZW50OwotICAgfSwKLQotICAgc2VsZWN0OiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0cnVlOwotCi0gICAgICBpZiAoIHRoaXMuc2hvd2luZ1NlbGVjdGVkICkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgdmFyIGh0bWxFbGVtZW50ID0gdGhpcy5nZXRNb3VzZURvd25IVE1MRWxlbWVudCgpOwotCi0gICAgICB2YXIgY29sb3IgPSBSaWNvLkNvbG9yLmNyZWF0ZUNvbG9yRnJvbUJhY2tncm91bmQoaHRtbEVsZW1lbnQpOwotICAgICAgY29sb3IuaXNCcmlnaHQoKSA/IGNvbG9yLmRhcmtlbigwLjAzMykgOiBjb2xvci5icmlnaHRlbigwLjAzMyk7Ci0KLSAgICAgIHRoaXMuc2F2ZUJhY2tncm91bmQgPSBSaWNvVXRpbC5nZXRFbGVtZW50c0NvbXB1dGVkU3R5bGUoaHRtbEVsZW1lbnQsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYmFja2dyb3VuZC1jb2xvciIpOwotICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3IuYXNIZXgoKTsKLSAgICAgIHRoaXMuc2hvd2luZ1NlbGVjdGVkID0gdHJ1ZTsKLSAgIH0sCi0KLSAgIGRlc2VsZWN0OiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgIGlmICggIXRoaXMuc2hvd2luZ1NlbGVjdGVkICkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgdmFyIGh0bWxFbGVtZW50ID0gdGhpcy5nZXRNb3VzZURvd25IVE1MRWxlbWVudCgpOwotCi0gICAgICBodG1sRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNhdmVCYWNrZ3JvdW5kOwotICAgICAgdGhpcy5zaG93aW5nU2VsZWN0ZWQgPSBmYWxzZTsKLSAgIH0sCi0KLSAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7Ci0gICB9LAotCi0gICBzdGFydERyYWc6IGZ1bmN0aW9uKCkgewotICAgfSwKLQotICAgY2FuY2VsRHJhZzogZnVuY3Rpb24oKSB7Ci0gICB9LAotCi0gICBlbmREcmFnOiBmdW5jdGlvbigpIHsKLSAgIH0sCi0KLSAgIGdldFNpbmdsZU9iamVjdERyYWdHVUk6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuaHRtbEVsZW1lbnQ7Ci0gICB9LAotCi0gICBnZXRNdWx0aU9iamVjdERyYWdHVUk6IGZ1bmN0aW9uKCBkcmFnZ2FibGVzICkgewotICAgICAgcmV0dXJuIHRoaXMuaHRtbEVsZW1lbnQ7Ci0gICB9LAotCi0gICBnZXREcm9wcGVkR1VJOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmh0bWxFbGVtZW50OwotICAgfSwKLQotICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI6IiArIHRoaXMuaHRtbEVsZW1lbnQgKyAiOiI7Ci0gICB9Ci0KLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tIHJpY29Ecm9wem9uZS5qcwotUmljby5Ecm9wem9uZSA9IENsYXNzLmNyZWF0ZSgpOwotCi1SaWNvLkRyb3B6b25lLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oIGh0bWxFbGVtZW50ICkgewotICAgICAgdGhpcy5odG1sRWxlbWVudCAgPSAkKGh0bWxFbGVtZW50KTsKLSAgICAgIHRoaXMuYWJzb2x1dGVSZWN0ID0gbnVsbDsKLSAgIH0sCi0KLSAgIGdldEhUTUxFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmh0bWxFbGVtZW50OwotICAgfSwKLQotICAgY2xlYXJQb3NpdGlvbkNhY2hlOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuYWJzb2x1dGVSZWN0ID0gbnVsbDsKLSAgIH0sCi0KLSAgIGdldEFic29sdXRlUmVjdDogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoIHRoaXMuYWJzb2x1dGVSZWN0ID09IG51bGwgKSB7Ci0gICAgICAgICB2YXIgaHRtbEVsZW1lbnQgPSB0aGlzLmdldEhUTUxFbGVtZW50KCk7Ci0gICAgICAgICB2YXIgcG9zID0gUmljb1V0aWwudG9WaWV3cG9ydFBvc2l0aW9uKGh0bWxFbGVtZW50KTsKLQotICAgICAgICAgdGhpcy5hYnNvbHV0ZVJlY3QgPSB7Ci0gICAgICAgICAgICB0b3A6ICAgIHBvcy55LAotICAgICAgICAgICAgbGVmdDogICBwb3MueCwKLSAgICAgICAgICAgIGJvdHRvbTogcG9zLnkgKyBodG1sRWxlbWVudC5vZmZzZXRIZWlnaHQsCi0gICAgICAgICAgICByaWdodDogIHBvcy54ICsgaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGgKLSAgICAgICAgIH07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpcy5hYnNvbHV0ZVJlY3Q7Ci0gICB9LAotCi0gICBhY3RpdmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgaHRtbEVsZW1lbnQgPSB0aGlzLmdldEhUTUxFbGVtZW50KCk7Ci0gICAgICBpZiAoaHRtbEVsZW1lbnQgPT0gbnVsbCAgfHwgdGhpcy5zaG93aW5nQWN0aXZlKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICB0aGlzLnNob3dpbmdBY3RpdmUgPSB0cnVlOwotICAgICAgdGhpcy5zYXZlQmFja2dyb3VuZENvbG9yID0gaHRtbEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yOwotCi0gICAgICB2YXIgZmFsbGJhY2tDb2xvciA9ICIjZmZlYTg0IjsKLSAgICAgIHZhciBjdXJyZW50Q29sb3IgPSBSaWNvLkNvbG9yLmNyZWF0ZUNvbG9yRnJvbUJhY2tncm91bmQoaHRtbEVsZW1lbnQpOwotICAgICAgaWYgKCBjdXJyZW50Q29sb3IgPT0gbnVsbCApCi0gICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBmYWxsYmFja0NvbG9yOwotICAgICAgZWxzZSB7Ci0gICAgICAgICBjdXJyZW50Q29sb3IuaXNCcmlnaHQoKSA/IGN1cnJlbnRDb2xvci5kYXJrZW4oMC4yKSA6IGN1cnJlbnRDb2xvci5icmlnaHRlbigwLjIpOwotICAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY3VycmVudENvbG9yLmFzSGV4KCk7Ci0gICAgICB9Ci0gICB9LAotCi0gICBkZWFjdGl2YXRlOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBodG1sRWxlbWVudCA9IHRoaXMuZ2V0SFRNTEVsZW1lbnQoKTsKLSAgICAgIGlmIChodG1sRWxlbWVudCA9PSBudWxsIHx8ICF0aGlzLnNob3dpbmdBY3RpdmUpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2F2ZUJhY2tncm91bmRDb2xvcjsKLSAgICAgIHRoaXMuc2hvd2luZ0FjdGl2ZSA9IGZhbHNlOwotICAgICAgdGhpcy5zYXZlQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLSAgIH0sCi0KLSAgIHNob3dIb3ZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgaHRtbEVsZW1lbnQgPSB0aGlzLmdldEhUTUxFbGVtZW50KCk7Ci0gICAgICBpZiAoIGh0bWxFbGVtZW50ID09IG51bGwgfHwgdGhpcy5zaG93aW5nSG92ZXIgKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICB0aGlzLnNhdmVCb3JkZXJXaWR0aCA9IGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoOwotICAgICAgdGhpcy5zYXZlQm9yZGVyU3R5bGUgPSBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJTdHlsZTsKLSAgICAgIHRoaXMuc2F2ZUJvcmRlckNvbG9yID0gaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3I7Ci0KLSAgICAgIHRoaXMuc2hvd2luZ0hvdmVyID0gdHJ1ZTsKLSAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gIjFweCI7Ci0gICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJTdHlsZSA9ICJzb2xpZCI7Ci0gICAgICAvL2h0bWxFbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gIiNmZjk5MDAiOwotICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAiI2ZmZmYwMCI7Ci0gICB9LAotCi0gICBoaWRlSG92ZXI6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGh0bWxFbGVtZW50ID0gdGhpcy5nZXRIVE1MRWxlbWVudCgpOwotICAgICAgaWYgKCBodG1sRWxlbWVudCA9PSBudWxsIHx8ICF0aGlzLnNob3dpbmdIb3ZlciApCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gdGhpcy5zYXZlQm9yZGVyV2lkdGg7Ci0gICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJTdHlsZSA9IHRoaXMuc2F2ZUJvcmRlclN0eWxlOwotICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnNhdmVCb3JkZXJDb2xvcjsKLSAgICAgIHRoaXMuc2hvd2luZ0hvdmVyID0gZmFsc2U7Ci0gICB9LAotCi0gICBjYW5BY2NlcHQ6IGZ1bmN0aW9uKGRyYWdnYWJsZU9iamVjdHMpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgfSwKLQotICAgYWNjZXB0OiBmdW5jdGlvbihkcmFnZ2FibGVPYmplY3RzKSB7Ci0gICAgICB2YXIgaHRtbEVsZW1lbnQgPSB0aGlzLmdldEhUTUxFbGVtZW50KCk7Ci0gICAgICBpZiAoIGh0bWxFbGVtZW50ID09IG51bGwgKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICBuID0gZHJhZ2dhYmxlT2JqZWN0cy5sZW5ndGg7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgbiA7IGkrKyApCi0gICAgICB7Ci0gICAgICAgICB2YXIgdGhlR1VJID0gZHJhZ2dhYmxlT2JqZWN0c1tpXS5nZXREcm9wcGVkR1VJKCk7Ci0gICAgICAgICBpZiAoIFJpY29VdGlsLmdldEVsZW1lbnRzQ29tcHV0ZWRTdHlsZSggdGhlR1VJLCAicG9zaXRpb24iICkgPT0gImFic29sdXRlIiApCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0aGVHVUkuc3R5bGUucG9zaXRpb24gPSAic3RhdGljIjsKLSAgICAgICAgICAgIHRoZUdVSS5zdHlsZS50b3AgPSAiIjsKLSAgICAgICAgICAgIHRoZUdVSS5zdHlsZS50b3AgPSAiIjsKLSAgICAgICAgIH0KLSAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoZUdVSSk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvRWZmZWN0cy5qcwotCi0vKioKLSAgKiAgVXNlIHRoZSBFZmZlY3QgbmFtZXNwYWNlIGZvciBlZmZlY3RzLiAgSWYgdXNpbmcgc2NyaXB0YWN1bG91cyBlZmZlY3RzCi0gICogIHRoaXMgd2lsbCBhbHJlYWR5IGJlIGRlZmluZWQsIG90aGVyd2lzZSB3ZSdsbCBqdXN0IGNyZWF0ZSBhbiBlbXB0eQotICAqICBvYmplY3QgZm9yIGl0Li4uCi0gKiovCi1pZiAoIHdpbmRvdy5FZmZlY3QgPT0gdW5kZWZpbmVkICkKLSAgIEVmZmVjdCA9IHt9OwotCi1FZmZlY3QuU2l6ZUFuZFBvc2l0aW9uID0gQ2xhc3MuY3JlYXRlKCk7Ci1FZmZlY3QuU2l6ZUFuZFBvc2l0aW9uLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgeCwgeSwgdywgaCwgZHVyYXRpb24sIHN0ZXBzLCBvcHRpb25zKSB7Ci0gICAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgICAgdGhpcy54ID0geDsKLSAgICAgIHRoaXMueSA9IHk7Ci0gICAgICB0aGlzLncgPSB3OwotICAgICAgdGhpcy5oID0gaDsKLSAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgIHRoaXMuc3RlcHMgICAgPSBzdGVwczsKLSAgICAgIHRoaXMub3B0aW9ucyAgPSBhcmd1bWVudHNbN10gfHwge307Ci0KLSAgICAgIHRoaXMuc2l6ZUFuZFBvc2l0aW9uKCk7Ci0gICB9LAotCi0gICBzaXplQW5kUG9zaXRpb246IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICBpZih0aGlzLm9wdGlvbnMuY29tcGxldGUpIHRoaXMub3B0aW9ucy5jb21wbGV0ZSh0aGlzKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHRoaXMudGltZXIpCi0gICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7Ci0KLSAgICAgIHZhciBzdGVwRHVyYXRpb24gPSBNYXRoLnJvdW5kKHRoaXMuZHVyYXRpb24vdGhpcy5zdGVwcykgOwotCi0gICAgICAvLyBHZXQgb3JpZ2luYWwgdmFsdWVzOiB4LHkgPSB0b3AgbGVmdCBjb3JuZXI7ICB3LGggPSB3aWR0aCBoZWlnaHQKLSAgICAgIHZhciBjdXJyZW50WCA9IHRoaXMuZWxlbWVudC5vZmZzZXRMZWZ0OwotICAgICAgdmFyIGN1cnJlbnRZID0gdGhpcy5lbGVtZW50Lm9mZnNldFRvcDsKLSAgICAgIHZhciBjdXJyZW50VyA9IHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDsKLSAgICAgIHZhciBjdXJyZW50SCA9IHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7Ci0KLSAgICAgIC8vIElmIHZhbHVlcyBub3Qgc2V0LCBvciB6ZXJvLCB3ZSBkbyBub3QgbW9kaWZ5IHRoZW0sIGFuZCB0YWtlIG9yaWdpbmFsIGFzIGZpbmFsIGFzIHdlbGwKLSAgICAgIHRoaXMueCA9ICh0aGlzLngpID8gdGhpcy54IDogY3VycmVudFg7Ci0gICAgICB0aGlzLnkgPSAodGhpcy55KSA/IHRoaXMueSA6IGN1cnJlbnRZOwotICAgICAgdGhpcy53ID0gKHRoaXMudykgPyB0aGlzLncgOiBjdXJyZW50VzsKLSAgICAgIHRoaXMuaCA9ICh0aGlzLmgpID8gdGhpcy5oIDogY3VycmVudEg7Ci0KLSAgICAgIC8vIGhvdyBtdWNoIGRvIHdlIG5lZWQgdG8gbW9kaWZ5IG91ciB2YWx1ZXMgZm9yIGVhY2ggc3RlcD8KLSAgICAgIHZhciBkaWZYID0gdGhpcy5zdGVwcyA+ICAwID8gKHRoaXMueCAtIGN1cnJlbnRYKS90aGlzLnN0ZXBzIDogMDsKLSAgICAgIHZhciBkaWZZID0gdGhpcy5zdGVwcyA+ICAwID8gKHRoaXMueSAtIGN1cnJlbnRZKS90aGlzLnN0ZXBzIDogMDsKLSAgICAgIHZhciBkaWZXID0gdGhpcy5zdGVwcyA+ICAwID8gKHRoaXMudyAtIGN1cnJlbnRXKS90aGlzLnN0ZXBzIDogMDsKLSAgICAgIHZhciBkaWZIID0gdGhpcy5zdGVwcyA+ICAwID8gKHRoaXMuaCAtIGN1cnJlbnRIKS90aGlzLnN0ZXBzIDogMDsKLQotICAgICAgdGhpcy5tb3ZlQnkoZGlmWCwgZGlmWSk7Ci0gICAgICB0aGlzLnJlc2l6ZUJ5KGRpZlcsIGRpZkgpOwotCi0gICAgICB0aGlzLmR1cmF0aW9uIC09IHN0ZXBEdXJhdGlvbjsKLSAgICAgIHRoaXMuc3RlcHMtLTsKLQotICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5zaXplQW5kUG9zaXRpb24uYmluZCh0aGlzKSwgc3RlcER1cmF0aW9uKTsKLSAgIH0sCi0KLSAgIGlzRmluaXNoZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc3RlcHMgPD0gMDsKLSAgIH0sCi0KLSAgIG1vdmVCeTogZnVuY3Rpb24oIGRpZlgsIGRpZlkgKSB7Ci0gICAgICB2YXIgY3VycmVudExlZnQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdDsKLSAgICAgIHZhciBjdXJyZW50VG9wICA9IHRoaXMuZWxlbWVudC5vZmZzZXRUb3A7Ci0gICAgICB2YXIgaW50RGlmWCAgICAgPSBwYXJzZUludChkaWZYKTsKLSAgICAgIHZhciBpbnREaWZZICAgICA9IHBhcnNlSW50KGRpZlkpOwotCi0gICAgICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7Ci0gICAgICBpZiAoIGludERpZlggIT0gMCApCi0gICAgICAgICBzdHlsZS5sZWZ0ID0gKGN1cnJlbnRMZWZ0ICsgaW50RGlmWCkgKyAicHgiOwotICAgICAgaWYgKCBpbnREaWZZICE9IDAgKQotICAgICAgICAgc3R5bGUudG9wICA9IChjdXJyZW50VG9wICsgaW50RGlmWSkgKyAicHgiOwotICAgfSwKLQotICAgcmVzaXplQnk6IGZ1bmN0aW9uKCBkaWZXLCBkaWZIICkgewotICAgICAgdmFyIGN1cnJlbnRXaWR0aCAgPSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGg7Ci0gICAgICB2YXIgY3VycmVudEhlaWdodCA9IHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7Ci0gICAgICB2YXIgaW50RGlmVyAgICAgICA9IHBhcnNlSW50KGRpZlcpOwotICAgICAgdmFyIGludERpZkggICAgICAgPSBwYXJzZUludChkaWZIKTsKLQotICAgICAgdmFyIHN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlOwotICAgICAgaWYgKCBpbnREaWZXICE9IDAgKQotICAgICAgICAgc3R5bGUud2lkdGggICA9IChjdXJyZW50V2lkdGggICsgaW50RGlmVykgKyAicHgiOwotICAgICAgaWYgKCBpbnREaWZIICE9IDAgKQotICAgICAgICAgc3R5bGUuaGVpZ2h0ICA9IChjdXJyZW50SGVpZ2h0ICsgaW50RGlmSCkgKyAicHgiOwotICAgfQotfQotCi1FZmZlY3QuU2l6ZSA9IENsYXNzLmNyZWF0ZSgpOwotRWZmZWN0LlNpemUucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB3LCBoLCBkdXJhdGlvbiwgc3RlcHMsIG9wdGlvbnMpIHsKLSAgICAgIG5ldyBFZmZlY3QuU2l6ZUFuZFBvc2l0aW9uKGVsZW1lbnQsIG51bGwsIG51bGwsIHcsIGgsIGR1cmF0aW9uLCBzdGVwcywgb3B0aW9ucyk7Ci0gIH0KLX0KLQotRWZmZWN0LlBvc2l0aW9uID0gQ2xhc3MuY3JlYXRlKCk7Ci1FZmZlY3QuUG9zaXRpb24ucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5LCBkdXJhdGlvbiwgc3RlcHMsIG9wdGlvbnMpIHsKLSAgICAgIG5ldyBFZmZlY3QuU2l6ZUFuZFBvc2l0aW9uKGVsZW1lbnQsIHgsIHksIG51bGwsIG51bGwsIGR1cmF0aW9uLCBzdGVwcywgb3B0aW9ucyk7Ci0gIH0KLX0KLQotRWZmZWN0LlJvdW5kID0gQ2xhc3MuY3JlYXRlKCk7Ci1FZmZlY3QuUm91bmQucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbih0YWdOYW1lLCBjbGFzc05hbWUsIG9wdGlvbnMpIHsKLSAgICAgIHZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdBbmRDbGFzc05hbWUodGFnTmFtZSxjbGFzc05hbWUpOwotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IGVsZW1lbnRzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICBSaWNvLkNvcm5lci5yb3VuZCggZWxlbWVudHNbaV0sIG9wdGlvbnMgKTsKLSAgIH0KLX07Ci0KLUVmZmVjdC5GYWRlVG8gPSBDbGFzcy5jcmVhdGUoKTsKLUVmZmVjdC5GYWRlVG8ucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbiggZWxlbWVudCwgb3BhY2l0eSwgZHVyYXRpb24sIHN0ZXBzLCBvcHRpb25zKSB7Ci0gICAgICB0aGlzLmVsZW1lbnQgID0gJChlbGVtZW50KTsKLSAgICAgIHRoaXMub3BhY2l0eSAgPSBvcGFjaXR5OwotICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgdGhpcy5zdGVwcyAgICA9IHN0ZXBzOwotICAgICAgdGhpcy5vcHRpb25zICA9IGFyZ3VtZW50c1s0XSB8fCB7fTsKLSAgICAgIHRoaXMuZmFkZVRvKCk7Ci0gICB9LAotCi0gICBmYWRlVG86IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICBpZih0aGlzLm9wdGlvbnMuY29tcGxldGUpIHRoaXMub3B0aW9ucy5jb21wbGV0ZSh0aGlzKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHRoaXMudGltZXIpCi0gICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7Ci0KLSAgICAgIHZhciBzdGVwRHVyYXRpb24gPSBNYXRoLnJvdW5kKHRoaXMuZHVyYXRpb24vdGhpcy5zdGVwcykgOwotICAgICAgdmFyIGN1cnJlbnRPcGFjaXR5ID0gdGhpcy5nZXRFbGVtZW50T3BhY2l0eSgpOwotICAgICAgdmFyIGRlbHRhID0gdGhpcy5zdGVwcyA+IDAgPyAodGhpcy5vcGFjaXR5IC0gY3VycmVudE9wYWNpdHkpL3RoaXMuc3RlcHMgOiAwOwotCi0gICAgICB0aGlzLmNoYW5nZU9wYWNpdHlCeShkZWx0YSk7Ci0gICAgICB0aGlzLmR1cmF0aW9uIC09IHN0ZXBEdXJhdGlvbjsKLSAgICAgIHRoaXMuc3RlcHMtLTsKLQotICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5mYWRlVG8uYmluZCh0aGlzKSwgc3RlcER1cmF0aW9uKTsKLSAgIH0sCi0KLSAgIGNoYW5nZU9wYWNpdHlCeTogZnVuY3Rpb24odikgewotICAgICAgdmFyIGN1cnJlbnRPcGFjaXR5ID0gdGhpcy5nZXRFbGVtZW50T3BhY2l0eSgpOwotICAgICAgdmFyIG5ld09wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJyZW50T3BhY2l0eSt2LCAxKSk7Ci0gICAgICB0aGlzLmVsZW1lbnQucmljb09wYWNpdHkgPSBuZXdPcGFjaXR5OwotCi0gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZmlsdGVyID0gImFscGhhKG9wYWNpdHk6IitNYXRoLnJvdW5kKG5ld09wYWNpdHkqMTAwKSsiKSI7Ci0gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHk7IC8qLy8qLzsKLSAgIH0sCi0KLSAgIGlzRmluaXNoZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc3RlcHMgPD0gMDsKLSAgIH0sCi0KLSAgIGdldEVsZW1lbnRPcGFjaXR5OiBmdW5jdGlvbigpIHsKLSAgICAgIGlmICggdGhpcy5lbGVtZW50LnJpY29PcGFjaXR5ID09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgIHZhciBvcGFjaXR5OwotICAgICAgICAgaWYgKCB0aGlzLmVsZW1lbnQuY3VycmVudFN0eWxlICkgewotICAgICAgICAgICAgb3BhY2l0eSA9IHRoaXMuZWxlbWVudC5jdXJyZW50U3R5bGUub3BhY2l0eTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKCBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICE9IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZTsKLSAgICAgICAgICAgIG9wYWNpdHkgPSBjb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnb3BhY2l0eScpOwotICAgICAgICAgfQotCi0gICAgICAgICB0aGlzLmVsZW1lbnQucmljb09wYWNpdHkgPSBvcGFjaXR5ICE9IHVuZGVmaW5lZCA/IG9wYWNpdHkgOiAxLjA7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuZWxlbWVudC5yaWNvT3BhY2l0eSk7Ci0gICB9Ci19Ci0KLUVmZmVjdC5BY2NvcmRpb25TaXplID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLUVmZmVjdC5BY2NvcmRpb25TaXplLnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZTEsIGUyLCBzdGFydCwgZW5kLCBkdXJhdGlvbiwgc3RlcHMsIG9wdGlvbnMpIHsKLSAgICAgIHRoaXMuZTEgICAgICAgPSAkKGUxKTsKLSAgICAgIHRoaXMuZTIgICAgICAgPSAkKGUyKTsKLSAgICAgIHRoaXMuc3RhcnQgICAgPSBzdGFydDsKLSAgICAgIHRoaXMuZW5kICAgICAgPSBlbmQ7Ci0gICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgICB0aGlzLnN0ZXBzICAgID0gc3RlcHM7Ci0gICAgICB0aGlzLm9wdGlvbnMgID0gYXJndW1lbnRzWzZdIHx8IHt9OwotCi0gICAgICB0aGlzLmFjY29yZGlvblNpemUoKTsKLSAgIH0sCi0KLSAgIGFjY29yZGlvblNpemU6IGZ1bmN0aW9uKCkgewotCi0gICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgIC8vIGp1c3QgaW4gY2FzZSB0aGVyZSBhcmUgcm91bmQgZXJyb3JzIG9yIHN1Y2guLi4KLSAgICAgICAgIHRoaXMuZTEuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zdGFydCArICJweCI7Ci0gICAgICAgICB0aGlzLmUyLnN0eWxlLmhlaWdodCA9IHRoaXMuZW5kICsgInB4IjsKLQotICAgICAgICAgaWYodGhpcy5vcHRpb25zLmNvbXBsZXRlKQotICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbXBsZXRlKHRoaXMpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAodGhpcy50aW1lcikKLSAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKLQotICAgICAgdmFyIHN0ZXBEdXJhdGlvbiA9IE1hdGgucm91bmQodGhpcy5kdXJhdGlvbi90aGlzLnN0ZXBzKSA7Ci0KLSAgICAgIHZhciBkaWZmID0gdGhpcy5zdGVwcyA+IDAgPyAocGFyc2VJbnQodGhpcy5lMS5vZmZzZXRIZWlnaHQpIC0gdGhpcy5zdGFydCkvdGhpcy5zdGVwcyA6IDA7Ci0gICAgICB0aGlzLnJlc2l6ZUJ5KGRpZmYpOwotCi0gICAgICB0aGlzLmR1cmF0aW9uIC09IHN0ZXBEdXJhdGlvbjsKLSAgICAgIHRoaXMuc3RlcHMtLTsKLQotICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5hY2NvcmRpb25TaXplLmJpbmQodGhpcyksIHN0ZXBEdXJhdGlvbik7Ci0gICB9LAotCi0gICBpc0ZpbmlzaGVkOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLnN0ZXBzIDw9IDA7Ci0gICB9LAotCi0gICByZXNpemVCeTogZnVuY3Rpb24oZGlmZikgewotICAgICAgdmFyIGgxSGVpZ2h0ID0gdGhpcy5lMS5vZmZzZXRIZWlnaHQ7Ci0gICAgICB2YXIgaDJIZWlnaHQgPSB0aGlzLmUyLm9mZnNldEhlaWdodDsKLSAgICAgIHZhciBpbnREaWZmID0gcGFyc2VJbnQoZGlmZik7Ci0gICAgICBpZiAoIGRpZmYgIT0gMCApIHsKLSAgICAgICAgIHRoaXMuZTEuc3R5bGUuaGVpZ2h0ID0gKGgxSGVpZ2h0IC0gaW50RGlmZikgKyAicHgiOwotICAgICAgICAgdGhpcy5lMi5zdHlsZS5oZWlnaHQgPSAoaDJIZWlnaHQgKyBpbnREaWZmKSArICJweCI7Ci0gICAgICB9Ci0gICB9Ci0KLX07Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvTGl2ZUdyaWQuanMKLQotLy8gUmljby5MaXZlR3JpZE1ldGFEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJpY28uTGl2ZUdyaWRNZXRhRGF0YSA9IENsYXNzLmNyZWF0ZSgpOwotCi1SaWNvLkxpdmVHcmlkTWV0YURhdGEucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbiggcGFnZVNpemUsIHRvdGFsUm93cywgY29sdW1uQ291bnQsIG9wdGlvbnMgKSB7Ci0gICAgICB0aGlzLnBhZ2VTaXplICA9IHBhZ2VTaXplOwotICAgICAgdGhpcy50b3RhbFJvd3MgPSB0b3RhbFJvd3M7Ci0gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICB0aGlzLnNjcm9sbEFycm93SGVpZ2h0ID0gMTY7Ci0gICAgICB0aGlzLmNvbHVtbkNvdW50ID0gY29sdW1uQ291bnQ7Ci0gICB9LAotCi0gICBzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgICB0aGlzLm9wdGlvbnMgPSB7Ci0gICAgICAgICBsYXJnZUJ1ZmZlclNpemUgICAgOiA3LjAsICAgLy8gNyBwYWdlcwotICAgICAgICAgbmVhckxpbWl0RmFjdG9yICAgIDogMC4yICAgIC8vIDIwJSBvZiBidWZmZXIKLSAgICAgIH0uZXh0ZW5kKG9wdGlvbnMgfHwge30pOwotICAgfSwKLQotICAgZ2V0UGFnZVNpemU6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMucGFnZVNpemU7Ci0gICB9LAotCi0gICBnZXRUb3RhbFJvd3M6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMudG90YWxSb3dzOwotICAgfSwKLQotICAgc2V0VG90YWxSb3dzOiBmdW5jdGlvbihuKSB7Ci0gICAgICB0aGlzLnRvdGFsUm93cyA9IG47Ci0gICB9LAotCi0gICBnZXRMYXJnZUJ1ZmZlclNpemU6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMub3B0aW9ucy5sYXJnZUJ1ZmZlclNpemUgKiB0aGlzLnBhZ2VTaXplKTsKLSAgIH0sCi0KLSAgIGdldExpbWl0VG9sZXJhbmNlOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldExhcmdlQnVmZmVyU2l6ZSgpICogdGhpcy5vcHRpb25zLm5lYXJMaW1pdEZhY3Rvcik7Ci0gICB9Ci19OwotCi0vLyBSaWNvLkxpdmVHcmlkU2Nyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmljby5MaXZlR3JpZFNjcm9sbGVyID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLVJpY28uTGl2ZUdyaWRTY3JvbGxlci5wcm90b3R5cGUgPSB7Ci0KLSAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxpdmVHcmlkLCB2aWV3UG9ydCkgewotICAgICAgdGhpcy5pc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIm1zaWUiKSA+PSAwOwotICAgICAgdGhpcy5saXZlR3JpZCA9IGxpdmVHcmlkOwotICAgICAgdGhpcy5tZXRhRGF0YSA9IGxpdmVHcmlkLm1ldGFEYXRhOwotICAgICAgdGhpcy5jcmVhdGVTY3JvbGxCYXIoKTsKLSAgICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IG51bGw7Ci0gICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSAwOwotICAgICAgdGhpcy52aWV3UG9ydCA9IHZpZXdQb3J0OwotICAgICAgdGhpcy5yb3dzID0gbmV3IEFycmF5KCk7Ci0gICB9LAotCi0gICBpc1VuUGx1Z2dlZDogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckRpdi5vbnNjcm9sbCA9PSBudWxsOwotICAgfSwKLQotICAgcGx1Z2luOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2Nyb2xsZXJEaXYub25zY3JvbGwgPSB0aGlzLmhhbmRsZVNjcm9sbC5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgfSwKLQotICAgdW5wbHVnOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2Nyb2xsZXJEaXYub25zY3JvbGwgPSBudWxsOwotICAgfSwKLQotICAgc2l6ZUlFSGVhZGVySGFjazogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoICF0aGlzLmlzSUUgKSByZXR1cm47Ci0gICAgICB2YXIgaGVhZGVyVGFibGUgPSAkKHRoaXMubGl2ZUdyaWQudGFibGVJZCArICJfaGVhZGVyIik7Ci0gICAgICBpZiAoIGhlYWRlclRhYmxlICkKLSAgICAgICAgIGhlYWRlclRhYmxlLnJvd3NbMF0uY2VsbHNbMF0uc3R5bGUud2lkdGggPQotICAgICAgICAgICAgKGhlYWRlclRhYmxlLnJvd3NbMF0uY2VsbHNbMF0ub2Zmc2V0V2lkdGggKyAxKSArICJweCI7Ci0gICB9LAotCi0gICBjcmVhdGVTY3JvbGxCYXI6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHZpc2libGVIZWlnaHQgPSB0aGlzLmxpdmVHcmlkLnZpZXdQb3J0LnZpc2libGVIZWlnaHQoKTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgb3V0ZXIgZGl2Li4uCi0gICAgICB0aGlzLnNjcm9sbGVyRGl2ICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgdmFyIHNjcm9sbGVyU3R5bGUgPSB0aGlzLnNjcm9sbGVyRGl2LnN0eWxlOwotICAgICAgc2Nyb2xsZXJTdHlsZS5ib3JkZXJSaWdodCA9ICIxcHggc29saWQgI2FiYWJhYiI7IC8vIGhhcmQgY29kZWQgY29sb3IhISEKLSAgICAgIHNjcm9sbGVyU3R5bGUucG9zaXRpb24gICAgPSAicmVsYXRpdmUiOwotICAgICAgc2Nyb2xsZXJTdHlsZS5sZWZ0ICAgICAgICA9IHRoaXMuaXNJRSA/ICItNnB4IiA6ICItM3B4IjsKLSAgICAgIHNjcm9sbGVyU3R5bGUud2lkdGggICAgICAgPSAiMTlweCI7Ci0gICAgICBzY3JvbGxlclN0eWxlLmhlaWdodCAgICAgID0gdmlzaWJsZUhlaWdodCArICJweCI7Ci0gICAgICBzY3JvbGxlclN0eWxlLm92ZXJmbG93ICAgID0gImF1dG8iOwotCi0gICAgICAvLyBjcmVhdGUgdGhlIGlubmVyIGRpdi4uLgotICAgICAgdGhpcy5oZWlnaHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgIHRoaXMuaGVpZ2h0RGl2LnN0eWxlLndpZHRoICA9ICIxcHgiOwotCi0gICAgICB0aGlzLmhlaWdodERpdi5zdHlsZS5oZWlnaHQgPSBwYXJzZUludCh2aXNpYmxlSGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGEuZ2V0VG90YWxSb3dzKCkvdGhpcy5tZXRhRGF0YS5nZXRQYWdlU2l6ZSgpKSArICJweCIgOwotICAgICAgdGhpcy5zY3JvbGxlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmhlaWdodERpdik7Ci0gICAgICB0aGlzLnNjcm9sbGVyRGl2Lm9uc2Nyb2xsID0gdGhpcy5oYW5kbGVTY3JvbGwuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQotICAgICB2YXIgdGFibGUgPSB0aGlzLmxpdmVHcmlkLnRhYmxlOwotICAgICB0YWJsZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCB0aGlzLnNjcm9sbGVyRGl2LCB0YWJsZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nICk7Ci0gICB9LAotCi0gICB1cGRhdGVTaXplOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciB0YWJsZSA9IHRoaXMubGl2ZUdyaWQudGFibGU7Ci0gICAgICB2YXIgdmlzaWJsZUhlaWdodCA9IHRoaXMudmlld1BvcnQudmlzaWJsZUhlaWdodCgpOwotICAgICAgdGhpcy5oZWlnaHREaXYuc3R5bGUuaGVpZ2h0ID0gcGFyc2VJbnQodmlzaWJsZUhlaWdodCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YS5nZXRUb3RhbFJvd3MoKS90aGlzLm1ldGFEYXRhLmdldFBhZ2VTaXplKCkpICsgInB4IjsKLSAgIH0sCi0KLSAgIHJvd1RvUGl4ZWw6IGZ1bmN0aW9uKHJvd09mZnNldCkgewotICAgICAgcmV0dXJuIChyb3dPZmZzZXQgLyB0aGlzLm1ldGFEYXRhLmdldFRvdGFsUm93cygpKSAqIHRoaXMuaGVpZ2h0RGl2Lm9mZnNldEhlaWdodAotICAgfSwKLSAgIAotICAgbW92ZVNjcm9sbDogZnVuY3Rpb24ocm93T2Zmc2V0KSB7Ci0gICAgICB0aGlzLnNjcm9sbGVyRGl2LnNjcm9sbFRvcCA9IHRoaXMucm93VG9QaXhlbChyb3dPZmZzZXQpOwotICAgICAgaWYgKCB0aGlzLm1ldGFEYXRhLm9wdGlvbnMub25zY3JvbGwgKQotICAgICAgICAgdGhpcy5tZXRhRGF0YS5vcHRpb25zLm9uc2Nyb2xsKCB0aGlzLmxpdmVHcmlkLCByb3dPZmZzZXQgKTsgICAgCi0gICB9LAotCi0gICBoYW5kbGVTY3JvbGw6IGZ1bmN0aW9uKCkgewotICAgICBpZiAoIHRoaXMuc2Nyb2xsVGltZW91dCApCi0gICAgICAgICBjbGVhclRpbWVvdXQoIHRoaXMuc2Nyb2xsVGltZW91dCApOwotCi0gICAgICB2YXIgY29udGVudE9mZnNldCA9IHBhcnNlSW50KHRoaXMuc2Nyb2xsZXJEaXYuc2Nyb2xsVG9wIC8gdGhpcy52aWV3UG9ydC5yb3dIZWlnaHQpOwotICAgICAgdGhpcy5saXZlR3JpZC5yZXF1ZXN0Q29udGVudFJlZnJlc2goY29udGVudE9mZnNldCk7Ci0gICAgICB0aGlzLnZpZXdQb3J0LnNjcm9sbFRvKHRoaXMuc2Nyb2xsZXJEaXYuc2Nyb2xsVG9wKTsKLSAgICAgIAotICAgICAgaWYgKCB0aGlzLm1ldGFEYXRhLm9wdGlvbnMub25zY3JvbGwgKQotICAgICAgICAgdGhpcy5tZXRhRGF0YS5vcHRpb25zLm9uc2Nyb2xsKCB0aGlzLmxpdmVHcmlkLCBjb250ZW50T2Zmc2V0ICk7Ci0KLSAgICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoIHRoaXMuc2Nyb2xsSWRsZS5iaW5kKHRoaXMpLCAxMjAwICk7Ci0gICB9LAotCi0gICBzY3JvbGxJZGxlOiBmdW5jdGlvbigpIHsKLSAgICAgIGlmICggdGhpcy5tZXRhRGF0YS5vcHRpb25zLm9uc2Nyb2xsaWRsZSApCi0gICAgICAgICB0aGlzLm1ldGFEYXRhLm9wdGlvbnMub25zY3JvbGxpZGxlKCk7Ci0gICB9Ci19OwotCi0vLyBSaWNvLkxpdmVHcmlkQnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJpY28uTGl2ZUdyaWRCdWZmZXIgPSBDbGFzcy5jcmVhdGUoKTsKLQotUmljby5MaXZlR3JpZEJ1ZmZlci5wcm90b3R5cGUgPSB7Ci0KLSAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG1ldGFEYXRhLCB2aWV3UG9ydCkgewotICAgICAgdGhpcy5zdGFydFBvcyA9IDA7Ci0gICAgICB0aGlzLnNpemUgICAgID0gMDsKLSAgICAgIHRoaXMubWV0YURhdGEgPSBtZXRhRGF0YTsKLSAgICAgIHRoaXMucm93cyAgICAgPSBuZXcgQXJyYXkoKTsKLSAgICAgIHRoaXMudXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgdGhpcy52aWV3UG9ydCA9IHZpZXdQb3J0OwotICAgICAgdGhpcy5tYXhCdWZmZXJTaXplID0gbWV0YURhdGEuZ2V0TGFyZ2VCdWZmZXJTaXplKCkgKiAyOwotICAgICAgdGhpcy5tYXhGZXRjaFNpemUgPSBtZXRhRGF0YS5nZXRMYXJnZUJ1ZmZlclNpemUoKTsKLSAgICAgIHRoaXMubGFzdE9mZnNldCA9IDA7Ci0gICB9LAotCi0gICBnZXRCbGFua1JvdzogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoIXRoaXMuYmxhbmtSb3cgKSB7Ci0gICAgICAgICB0aGlzLmJsYW5rUm93ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5tZXRhRGF0YS5jb2x1bW5Db3VudCA7IGkrKyApIAotICAgICAgICAgICAgdGhpcy5ibGFua1Jvd1tpXSA9ICImbmJzcDsiOwotICAgICB9Ci0gICAgIHJldHVybiB0aGlzLmJsYW5rUm93OwotICAgfSwKLSAgIAotICAgbG9hZFJvd3M6IGZ1bmN0aW9uKGFqYXhSZXNwb25zZSkgewotICAgICAgdmFyIHJvd3NFbGVtZW50ID0gYWpheFJlc3BvbnNlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdyb3dzJylbMF07Ci0gICAgICB0aGlzLnVwZGF0ZVVJID0gcm93c0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ1cGRhdGVfdWkiKSA9PSAidHJ1ZSIKLSAgICAgIHZhciBuZXdSb3dzID0gbmV3IEFycmF5KCkKLSAgICAgIHZhciB0cnMgPSByb3dzRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKTsKLSAgICAgIGZvciAoIHZhciBpPTAgOyBpIDwgdHJzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgdmFyIHJvdyA9IG5ld1Jvd3NbaV0gPSBuZXcgQXJyYXkoKTsgCi0gICAgICAgICB2YXIgY2VsbHMgPSB0cnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICAgICBmb3IgKCB2YXIgaj0wOyBqIDwgY2VsbHMubGVuZ3RoIDsgaisrICkgewotICAgICAgICAgICAgdmFyIGNlbGwgPSBjZWxsc1tqXTsKLSAgICAgICAgICAgIHZhciBjb252ZXJ0U3BhY2VzID0gY2VsbC5nZXRBdHRyaWJ1dGUoImNvbnZlcnRfc3BhY2VzIikgPT0gInRydWUiOwotICAgICAgICAgICAgdmFyIGNlbGxDb250ZW50ID0gUmljb1V0aWwuZ2V0Q29udGVudEFzU3RyaW5nKGNlbGwpOwotICAgICAgICAgICAgcm93W2pdID0gY29udmVydFNwYWNlcyA/IHRoaXMuY29udmVydFNwYWNlcyhjZWxsQ29udGVudCkgOiBjZWxsQ29udGVudDsKLSAgICAgICAgICAgIGlmICghcm93W2pdKSAKLSAgICAgICAgICAgICAgIHJvd1tqXSA9ICcmbmJzcDsnOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5ld1Jvd3M7Ci0gICB9LAotICAgICAgCi0gICB1cGRhdGU6IGZ1bmN0aW9uKGFqYXhSZXNwb25zZSwgc3RhcnQpIHsKLSAgICAgdmFyIG5ld1Jvd3MgPSB0aGlzLmxvYWRSb3dzKGFqYXhSZXNwb25zZSk7Ci0gICAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PSAwKSB7IC8vIGluaXRpYWwgbG9hZAotICAgICAgICAgdGhpcy5yb3dzID0gbmV3Um93czsKLSAgICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMucm93cy5sZW5ndGg7Ci0gICAgICAgICB0aGlzLnN0YXJ0UG9zID0gc3RhcnQ7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoc3RhcnQgPiB0aGlzLnN0YXJ0UG9zKSB7IC8vYXBwZW5kaW5nCi0gICAgICAgICBpZiAodGhpcy5zdGFydFBvcyArIHRoaXMucm93cy5sZW5ndGggPCBzdGFydCkgewotICAgICAgICAgICAgdGhpcy5yb3dzID0gIG5ld1Jvd3M7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0UG9zID0gc3RhcnQ7Ly8KLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRoaXMucm93cyA9IHRoaXMucm93cy5jb25jYXQoIG5ld1Jvd3Muc2xpY2UoMCwgbmV3Um93cy5sZW5ndGgpKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID4gdGhpcy5tYXhCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICB2YXIgZnVsbFNpemUgPSB0aGlzLnJvd3MubGVuZ3RoOwotICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLnNsaWNlKHRoaXMucm93cy5sZW5ndGggLSB0aGlzLm1heEJ1ZmZlclNpemUsIHRoaXMucm93cy5sZW5ndGgpCi0gICAgICAgICAgICAgICB0aGlzLnN0YXJ0UG9zID0gdGhpcy5zdGFydFBvcyArICAoZnVsbFNpemUgLSB0aGlzLnJvd3MubGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7IC8vcHJlcGVuZGluZwotICAgICAgICAgaWYgKHN0YXJ0ICsgbmV3Um93cy5sZW5ndGggPCB0aGlzLnN0YXJ0UG9zKSB7Ci0gICAgICAgICAgICB0aGlzLnJvd3MgPSAgbmV3Um93czsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnJvd3MgPSBuZXdSb3dzLnNsaWNlKDAsIHRoaXMuc3RhcnRQb3MpLmNvbmNhdCh0aGlzLnJvd3MpOwotICAgICAgICAgICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiB0aGlzLm1heEJ1ZmZlclNpemUpIAotICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLnNsaWNlKDAsIHRoaXMubWF4QnVmZmVyU2l6ZSkKLSAgICAgICAgIH0KLSAgICAgICAgIHRoaXMuc3RhcnRQb3MgPSAgc3RhcnQ7Ci0gICAgICB9Ci0gICAgICB0aGlzLnNpemUgPSB0aGlzLnJvd3MubGVuZ3RoOwotICAgfSwKLSAgIAotICAgY2xlYXI6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yb3dzID0gbmV3IEFycmF5KCk7Ci0gICAgICB0aGlzLnN0YXJ0UG9zID0gMDsKLSAgICAgIHRoaXMuc2l6ZSA9IDA7Ci0gICB9LAotCi0gICBpc092ZXJsYXBwaW5nOiBmdW5jdGlvbihzdGFydCwgc2l6ZSkgewotICAgICAgcmV0dXJuICgoc3RhcnQgPCB0aGlzLmVuZFBvcygpKSAmJiAodGhpcy5zdGFydFBvcyA8IHN0YXJ0ICsgc2l6ZSkpIHx8ICh0aGlzLmVuZFBvcygpID09IDApCi0gICB9LAotCi0gICBpc0luUmFuZ2U6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgICByZXR1cm4gKHBvc2l0aW9uID49IHRoaXMuc3RhcnRQb3MpICYmIChwb3NpdGlvbiArIHRoaXMubWV0YURhdGEuZ2V0UGFnZVNpemUoKSA8PSB0aGlzLmVuZFBvcygpKTsgCi0gICAgICAgICAgICAgLy8mJiB0aGlzLnNpemUoKSAgIT0gMDsKLSAgIH0sCi0KLSAgIGlzTmVhcmluZ1RvcExpbWl0OiBmdW5jdGlvbihwb3NpdGlvbikgewotICAgICAgcmV0dXJuIHBvc2l0aW9uIC0gdGhpcy5zdGFydFBvcyA8IHRoaXMubWV0YURhdGEuZ2V0TGltaXRUb2xlcmFuY2UoKTsKLSAgIH0sCi0KLSAgIGVuZFBvczogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5zdGFydFBvcyArIHRoaXMucm93cy5sZW5ndGg7Ci0gICB9LAotICAgCi0gICBpc05lYXJpbmdCb3R0b21MaW1pdDogZnVuY3Rpb24ocG9zaXRpb24pIHsKLSAgICAgIHJldHVybiB0aGlzLmVuZFBvcygpIC0gKHBvc2l0aW9uICsgdGhpcy5tZXRhRGF0YS5nZXRQYWdlU2l6ZSgpKSA8IHRoaXMubWV0YURhdGEuZ2V0TGltaXRUb2xlcmFuY2UoKTsKLSAgIH0sCi0KLSAgIGlzQXRUb3A6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc3RhcnRQb3MgPT0gMDsKLSAgIH0sCi0KLSAgIGlzQXRCb3R0b206IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuZW5kUG9zKCkgPT0gdGhpcy5tZXRhRGF0YS5nZXRUb3RhbFJvd3MoKTsKLSAgIH0sCi0KLSAgIGlzTmVhcmluZ0xpbWl0OiBmdW5jdGlvbihwb3NpdGlvbikgewotICAgICAgcmV0dXJuICggIXRoaXMuaXNBdFRvcCgpICAgICYmIHRoaXMuaXNOZWFyaW5nVG9wTGltaXQocG9zaXRpb24pKSB8fAotICAgICAgICAgICAgICggIXRoaXMuaXNBdEJvdHRvbSgpICYmIHRoaXMuaXNOZWFyaW5nQm90dG9tTGltaXQocG9zaXRpb24pICkKLSAgIH0sCi0KLSAgIGdldEZldGNoU2l6ZTogZnVuY3Rpb24ob2Zmc2V0KSB7Ci0gICAgICB2YXIgYWRqdXN0ZWRPZmZzZXQgPSB0aGlzLmdldEZldGNoT2Zmc2V0KG9mZnNldCk7Ci0gICAgICB2YXIgYWRqdXN0ZWRTaXplID0gMDsKLSAgICAgIGlmIChhZGp1c3RlZE9mZnNldCA+PSB0aGlzLnN0YXJ0UG9zKSB7IC8vYXBlbmRpbmcKLSAgICAgICAgIHZhciBlbmRGZXRjaE9mZnNldCA9IHRoaXMubWF4RmV0Y2hTaXplICArIGFkanVzdGVkT2Zmc2V0OwotICAgICAgICAgaWYgKGVuZEZldGNoT2Zmc2V0ID4gdGhpcy5tZXRhRGF0YS50b3RhbFJvd3MpCi0gICAgICAgICAgICBlbmRGZXRjaE9mZnNldCA9IHRoaXMubWV0YURhdGEudG90YWxSb3dzOwotICAgICAgICAgYWRqdXN0ZWRTaXplID0gZW5kRmV0Y2hPZmZzZXQgLSBhZGp1c3RlZE9mZnNldDsgICAKLSAgICAgIH0gZWxzZSB7Ly9wcmVwZW5kaW5nCi0gICAgICAgICB2YXIgYWRqdXN0ZWRTaXplID0gdGhpcy5zdGFydFBvcyAtIGFkanVzdGVkT2Zmc2V0OwotICAgICAgICAgaWYgKGFkanVzdGVkU2l6ZSA+IHRoaXMubWF4RmV0Y2hTaXplKQotICAgICAgICAgICAgYWRqdXN0ZWRTaXplID0gdGhpcy5tYXhGZXRjaFNpemU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYWRqdXN0ZWRTaXplOwotICAgfSwgCi0KLSAgIGdldEZldGNoT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHsKLSAgICAgIHZhciBhZGp1c3RlZE9mZnNldCA9IG9mZnNldDsKLSAgICAgIGlmIChvZmZzZXQgPiB0aGlzLnN0YXJ0UG9zKSAgLy9hcGVuZGluZwotICAgICAgICAgYWRqdXN0ZWRPZmZzZXQgPSAob2Zmc2V0ID4gdGhpcy5lbmRQb3MoKSkgPyBvZmZzZXQgOiAgdGhpcy5lbmRQb3MoKTsgCi0gICAgICBlbHNlIHsgLy9wcmVwZW5kaW5nCi0gICAgICAgICBpZiAob2Zmc2V0ICsgdGhpcy5tYXhGZXRjaFNpemUgPj0gdGhpcy5zdGFydFBvcykgewotICAgICAgICAgICAgdmFyIGFkanVzdGVkT2Zmc2V0ID0gdGhpcy5zdGFydFBvcyAtIHRoaXMubWF4RmV0Y2hTaXplOwotICAgICAgICAgICAgaWYgKGFkanVzdGVkT2Zmc2V0IDwgMCkKLSAgICAgICAgICAgICAgIGFkanVzdGVkT2Zmc2V0ID0gMDsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMubGFzdE9mZnNldCA9IGFkanVzdGVkT2Zmc2V0OwotICAgICAgcmV0dXJuIGFkanVzdGVkT2Zmc2V0OwotICAgfSwKLQotICAgZ2V0Um93czogZnVuY3Rpb24oc3RhcnQsIGNvdW50KSB7Ci0gICAgICB2YXIgYmVnUG9zID0gc3RhcnQgLSB0aGlzLnN0YXJ0UG9zCi0gICAgICB2YXIgZW5kUG9zID0gYmVnUG9zICsgY291bnQKLQotICAgICAgLy8gZXI/IG5lZWQgbW9yZSBkYXRhLi4uCi0gICAgICBpZiAoIGVuZFBvcyA+IHRoaXMuc2l6ZSApCi0gICAgICAgICBlbmRQb3MgPSB0aGlzLnNpemUKLQotICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkoKQotICAgICAgdmFyIGluZGV4ID0gMDsKLSAgICAgIGZvciAoIHZhciBpPWJlZ1BvcyA7IGkgPCBlbmRQb3M7IGkrKyApIHsKLSAgICAgICAgIHJlc3VsdHNbaW5kZXgrK10gPSB0aGlzLnJvd3NbaV0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHRzCi0gICB9LAotCi0gICBjb252ZXJ0U3BhY2VzOiBmdW5jdGlvbihzKSB7Ci0gICAgICByZXR1cm4gcy5zcGxpdCgiICIpLmpvaW4oIiZuYnNwOyIpOwotICAgfQotCi19OwotCi0KLS8vUmljby5HcmlkVmlld1BvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVJpY28uR3JpZFZpZXdQb3J0ID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLVJpY28uR3JpZFZpZXdQb3J0LnByb3RvdHlwZSA9IHsKLQotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odGFibGUsIHJvd0hlaWdodCwgdmlzaWJsZVJvd3MsIGJ1ZmZlciwgbGl2ZUdyaWQpIHsKLSAgICAgIHRoaXMubGFzdERpc3BsYXllZFN0YXJ0UG9zID0gMDsKLSAgICAgIHRoaXMuZGl2ID0gdGFibGUucGFyZW50Tm9kZTsKLSAgICAgIHRoaXMudGFibGUgPSB0YWJsZQotICAgICAgdGhpcy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7Ci0gICAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIHZpc2libGVSb3dzOwotICAgICAgdGhpcy5kaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKLSAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgICAgdGhpcy5saXZlR3JpZCA9IGxpdmVHcmlkOwotICAgICAgdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzICsgMTsKLSAgICAgIHRoaXMubGFzdFBpeGVsT2Zmc2V0ID0gMDsKLSAgICAgIHRoaXMuc3RhcnRQb3MgPSAwOwotICAgfSwKLQotICAgcG9wdWxhdGVSb3c6IGZ1bmN0aW9uKGh0bWxSb3csIHJvdykgewotICAgICAgZm9yICh2YXIgaj0wOyBqIDwgcm93Lmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICBodG1sUm93LmNlbGxzW2pdLmlubmVySFRNTCA9IHJvd1tqXQotICAgICAgfQotICAgfSwKLSAgIAotICAgYnVmZmVyQ2hhbmdlZDogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJlZnJlc2hDb250ZW50cyggcGFyc2VJbnQodGhpcy5sYXN0UGl4ZWxPZmZzZXQgLyB0aGlzLnJvd0hlaWdodCkpOwotICAgfSwKLSAgIAotICAgY2xlYXJSb3dzOiBmdW5jdGlvbigpIHsKLSAgICAgIGlmICghdGhpcy5pc0JsYW5rKSB7Ci0gICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCB0aGlzLnZpc2libGVSb3dzOyBpKyspCi0gICAgICAgICAgICB0aGlzLnBvcHVsYXRlUm93KHRoaXMudGFibGUucm93c1tpXSwgdGhpcy5idWZmZXIuZ2V0QmxhbmtSb3coKSk7Ci0gICAgICAgICB0aGlzLmlzQmxhbmsgPSB0cnVlOwotICAgICAgfQotICAgfSwKLSAgIAotICAgY2xlYXJDb250ZW50czogZnVuY3Rpb24oKSB7ICAgCi0gICAgICB0aGlzLmNsZWFyUm93cygpOwotICAgICAgdGhpcy5zY3JvbGxUbygwKTsKLSAgICAgIHRoaXMuc3RhcnRQb3MgPSAwOwotICAgICAgdGhpcy5sYXN0U3RhcnRQb3MgPSAtMTsgICAKLSAgIH0sCi0gICAKLSAgIHJlZnJlc2hDb250ZW50czogZnVuY3Rpb24oc3RhcnRQb3MpIHsKLSAgICAgIGlmIChzdGFydFBvcyA9PSB0aGlzLmxhc3RSb3dQb3MgJiYgIXRoaXMuaXNQYXJ0aWFsQmxhbmsgJiYgIXRoaXMuaXNCbGFuaykgewotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKChzdGFydFBvcyArIHRoaXMudmlzaWJsZVJvd3MgPCB0aGlzLmJ1ZmZlci5zdGFydFBvcykgIAotICAgICAgICAgIHx8ICh0aGlzLmJ1ZmZlci5zdGFydFBvcyArIHRoaXMuYnVmZmVyLnNpemUgPCBzdGFydFBvcykgCi0gICAgICAgICAgfHwgKHRoaXMuYnVmZmVyLnNpemUgPT0gMCkpIHsKLSAgICAgICAgIHRoaXMuY2xlYXJSb3dzKCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0aGlzLmlzQmxhbmsgPSBmYWxzZTsKLSAgICAgIHZhciB2aWV3UHJlY2VkZXNCdWZmZXIgPSB0aGlzLmJ1ZmZlci5zdGFydFBvcyA+IHN0YXJ0UG9zCi0gICAgICB2YXIgY29udGVudFN0YXJ0UG9zID0gdmlld1ByZWNlZGVzQnVmZmVyID8gdGhpcy5idWZmZXIuc3RhcnRQb3M6IHN0YXJ0UG9zOwotICAgCi0gICAgICB2YXIgY29udGVudEVuZFBvcyA9ICh0aGlzLmJ1ZmZlci5zdGFydFBvcyArIHRoaXMuYnVmZmVyLnNpemUgPCBzdGFydFBvcyArIHRoaXMudmlzaWJsZVJvd3MpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmJ1ZmZlci5zdGFydFBvcyArIHRoaXMuYnVmZmVyLnNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhcnRQb3MgKyB0aGlzLnZpc2libGVSb3dzOyAgICAgICAKLSAgICAgIHZhciByb3dTaXplID0gY29udGVudEVuZFBvcyAtIGNvbnRlbnRTdGFydFBvczsKLSAgICAgIHZhciByb3dzID0gdGhpcy5idWZmZXIuZ2V0Um93cyhjb250ZW50U3RhcnRQb3MsIHJvd1NpemUgKTsgCi0gICAgICB2YXIgYmxhbmtTaXplID0gdGhpcy52aXNpYmxlUm93cyAtIHJvd1NpemU7Ci0gICAgICB2YXIgYmxhbmtPZmZzZXQgPSB2aWV3UHJlY2VkZXNCdWZmZXIgPyAwOiByb3dTaXplOwotICAgICAgdmFyIGNvbnRlbnRPZmZzZXQgPSB2aWV3UHJlY2VkZXNCdWZmZXIgPyBibGFua1NpemU6IDA7Ci0KLSAgICAgIGZvciAodmFyIGk9MDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsvL2luaXRpYWxpemUgd2hhdCB3ZSBoYXZlCi0gICAgICAgIHRoaXMucG9wdWxhdGVSb3codGhpcy50YWJsZS5yb3dzW2kgKyBjb250ZW50T2Zmc2V0XSwgcm93c1tpXSk7Ci0gICAgICB9ICAgICAgIAotICAgICAgZm9yICh2YXIgaT0wOyBpIDwgYmxhbmtTaXplOyBpKyspIHsvLyBibGFuayBvdXQgdGhlIHJlc3QgCi0gICAgICAgIHRoaXMucG9wdWxhdGVSb3codGhpcy50YWJsZS5yb3dzW2kgKyBibGFua09mZnNldF0sIHRoaXMuYnVmZmVyLmdldEJsYW5rUm93KCkpOwotICAgICAgfQotICAgICAgdGhpcy5pc1BhcnRpYWxCbGFuayA9IGJsYW5rU2l6ZSA+IDA7Ci0gICAgICB0aGlzLmxhc3RSb3dQb3MgPSBzdGFydFBvczsgICAKLSAgIH0sCi0KLSAgIHNjcm9sbFRvOiBmdW5jdGlvbihwaXhlbE9mZnNldCkgeyAgICAgIAotICAgICAgaWYgKHRoaXMubGFzdFBpeGVsT2Zmc2V0ID09IHBpeGVsT2Zmc2V0KQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICB0aGlzLnJlZnJlc2hDb250ZW50cyhwYXJzZUludChwaXhlbE9mZnNldCAvIHRoaXMucm93SGVpZ2h0KSkKLSAgICAgIHRoaXMuZGl2LnNjcm9sbFRvcCA9IHBpeGVsT2Zmc2V0ICUgdGhpcy5yb3dIZWlnaHQgICAgICAgIAotICAgICAgCi0gICAgICB0aGlzLmxhc3RQaXhlbE9mZnNldCA9IHBpeGVsT2Zmc2V0OwotICAgfSwKLSAgIAotICAgdmlzaWJsZUhlaWdodDogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5kaXYuc3R5bGUuaGVpZ2h0KTsKLSAgIH0KLSAgIAotfTsKLQotCi1SaWNvLkxpdmVHcmlkUmVxdWVzdCA9IENsYXNzLmNyZWF0ZSgpOwotUmljby5MaXZlR3JpZFJlcXVlc3QucHJvdG90eXBlID0gewotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oIHJlcXVlc3RPZmZzZXQsIG9wdGlvbnMgKSB7Ci0gICAgICB0aGlzLnJlcXVlc3RPZmZzZXQgPSByZXF1ZXN0T2Zmc2V0OwotICAgfQotfTsKLQotLy8gUmljby5MaXZlR3JpZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SaWNvLkxpdmVHcmlkID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLVJpY28uTGl2ZUdyaWQucHJvdG90eXBlID0gewotCi0gICBpbml0aWFsaXplOiBmdW5jdGlvbiggdGFibGVJZCwgdmlzaWJsZVJvd3MsIHRvdGFsUm93cywgdXJsLCBvcHRpb25zICkgewotICAgICAgaWYgKCBvcHRpb25zID09IG51bGwgKQotICAgICAgICAgb3B0aW9ucyA9IHt9OwotCi0gICAgICB0aGlzLnRhYmxlSWQgICAgID0gdGFibGVJZDsgCi0gICAgICB0aGlzLnRhYmxlICAgICAgID0gJCh0YWJsZUlkKTsKLSAgICAgIHZhciBjb2x1bW5Db3VudCAgPSB0aGlzLnRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoCi0gICAgICB0aGlzLm1ldGFEYXRhICAgID0gbmV3IFJpY28uTGl2ZUdyaWRNZXRhRGF0YSh2aXNpYmxlUm93cywgdG90YWxSb3dzLCBjb2x1bW5Db3VudCwgb3B0aW9ucyk7Ci0gICAgICB0aGlzLmJ1ZmZlciAgICAgID0gbmV3IFJpY28uTGl2ZUdyaWRCdWZmZXIodGhpcy5tZXRhRGF0YSk7Ci0KLSAgICAgIHZhciByb3dDb3VudCA9IHRoaXMudGFibGUucm93cy5sZW5ndGg7Ci0gICAgICB0aGlzLnZpZXdQb3J0ID0gIG5ldyBSaWNvLkdyaWRWaWV3UG9ydCh0aGlzLnRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZS5vZmZzZXRIZWlnaHQvcm93Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVSb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciwgdGhpcyk7Ci0gICAgICB0aGlzLnNjcm9sbGVyICAgID0gbmV3IFJpY28uTGl2ZUdyaWRTY3JvbGxlcih0aGlzLHRoaXMudmlld1BvcnQpOwotICAgICAgCi0gICAgICB0aGlzLmFkZGl0aW9uYWxQYXJtcyAgICAgICA9IG9wdGlvbnMucmVxdWVzdFBhcmFtZXRlcnMgfHwgW107Ci0gICAgICAKLSAgICAgIG9wdGlvbnMuc29ydEhhbmRsZXIgPSB0aGlzLnNvcnRIYW5kbGVyLmJpbmQodGhpcyk7Ci0KLSAgICAgIGlmICggJCh0YWJsZUlkICsgJ19oZWFkZXInKSApCi0gICAgICAgICB0aGlzLnNvcnQgPSBuZXcgUmljby5MaXZlR3JpZFNvcnQodGFibGVJZCArICdfaGVhZGVyJywgb3B0aW9ucykKLQotICAgICAgdGhpcy5wcm9jZXNzaW5nUmVxdWVzdCA9IG51bGw7Ci0gICAgICB0aGlzLnVucHJvY2Vzc2VkUmVxdWVzdCA9IG51bGw7Ci0KLSAgICAgIHRoaXMuaW5pdEFqYXgodXJsKTsKLSAgICAgIGlmICggb3B0aW9ucy5wcmVmZXRjaEJ1ZmZlciB8fCBvcHRpb25zLnByZWZldGNoT2Zmc2V0ID4gMCkgewotICAgICAgICAgdmFyIG9mZnNldCA9IDA7Ci0gICAgICAgICBpZiAob3B0aW9ucy5vZmZzZXQgKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBvcHRpb25zLm9mZnNldDsgICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIubW92ZVNjcm9sbChvZmZzZXQpOwotICAgICAgICAgICAgdGhpcy52aWV3UG9ydC5zY3JvbGxUbyh0aGlzLnNjcm9sbGVyLnJvd1RvUGl4ZWwob2Zmc2V0KSk7ICAgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgICBpZiAob3B0aW9ucy5zb3J0Q29sKSB7Ci0gICAgICAgICAgICAgdGhpcy5zb3J0Q29sID0gb3B0aW9ucy5zb3J0Q29sOwotICAgICAgICAgICAgIHRoaXMuc29ydERpciA9IG9wdGlvbnMuc29ydERpcjsKLSAgICAgICAgIH0KLSAgICAgICAgIHRoaXMucmVxdWVzdENvbnRlbnRSZWZyZXNoKG9mZnNldCk7Ci0gICAgICB9Ci0gICB9LAotCi0gICByZXNldENvbnRlbnRzOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2Nyb2xsZXIubW92ZVNjcm9sbCgwKTsKLSAgICAgIHRoaXMuYnVmZmVyLmNsZWFyKCk7Ci0gICAgICB0aGlzLnZpZXdQb3J0LmNsZWFyQ29udGVudHMoKTsKLSAgIH0sCi0gICAKLSAgIHNvcnRIYW5kbGVyOiBmdW5jdGlvbihjb2x1bW4pIHsKLSAgICAgIHRoaXMuc29ydENvbCA9IGNvbHVtbi5uYW1lOwotICAgICAgdGhpcy5zb3J0RGlyID0gY29sdW1uLmN1cnJlbnRTb3J0OwotCi0gICAgICB0aGlzLnJlc2V0Q29udGVudHMoKTsKLSAgICAgIHRoaXMucmVxdWVzdENvbnRlbnRSZWZyZXNoKDApIAotICAgfSwKLSAgIAotICAgc2V0UmVxdWVzdFBhcmFtczogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmFkZGl0aW9uYWxQYXJtcyA9IFtdOwotICAgICAgZm9yICggdmFyIGk9MCA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgIHRoaXMuYWRkaXRpb25hbFBhcm1zW2ldID0gYXJndW1lbnRzW2ldOwotICAgfSwKLQotICAgc2V0VG90YWxSb3dzOiBmdW5jdGlvbiggbmV3VG90YWxSb3dzICkgewotICAgICAgdGhpcy5yZXNldENvbnRlbnRzKCk7Ci0gICAgICB0aGlzLm1ldGFEYXRhLnNldFRvdGFsUm93cyhuZXdUb3RhbFJvd3MpOwotICAgICAgdGhpcy5zY3JvbGxlci51cGRhdGVTaXplKCk7Ci0gICB9LAotCi0gICBpbml0QWpheDogZnVuY3Rpb24odXJsKSB7Ci0gICAgICBhamF4RW5naW5lLnJlZ2lzdGVyUmVxdWVzdCggdGhpcy50YWJsZUlkICsgJ19yZXF1ZXN0JywgdXJsICk7Ci0gICAgICBhamF4RW5naW5lLnJlZ2lzdGVyQWpheE9iamVjdCggdGhpcy50YWJsZUlkICsgJ191cGRhdGVyJywgdGhpcyApOwotICAgfSwKLQotICAgaW52b2tlQWpheDogZnVuY3Rpb24oKSB7Ci0gICB9LAotCi0gICBoYW5kbGVUaW1lZE91dDogZnVuY3Rpb24oKSB7Ci0gICAgICAvL3NlcnZlciBkaWQgbm90IHJlc3BvbmQgaW4gNCBzZWNvbmRzLi4uIGFzc3VtZSB0aGF0IHRoZXJlIGNvdWxkIGhhdmUgYmVlbgotICAgICAgLy9hbiBlcnJvciBvciBzb21ldGhpbmcsIGFuZCBhbGxvdyByZXF1ZXN0cyB0byBiZSBwcm9jZXNzZWQgYWdhaW4uLi4KLSAgICAgIHRoaXMucHJvY2Vzc2luZ1JlcXVlc3QgPSBudWxsOwotICAgICAgdGhpcy5wcm9jZXNzUXVldWVkUmVxdWVzdCgpOwotICAgfSwKLQotICAgZmV0Y2hCdWZmZXI6IGZ1bmN0aW9uKG9mZnNldCkgewotICAgICAgaWYgKCB0aGlzLmJ1ZmZlci5pc0luUmFuZ2Uob2Zmc2V0KSAmJgotICAgICAgICAgIXRoaXMuYnVmZmVyLmlzTmVhcmluZ0xpbWl0KG9mZnNldCkpIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICh0aGlzLnByb2Nlc3NpbmdSZXF1ZXN0KSB7Ci0gICAgICAgICAgdGhpcy51bnByb2Nlc3NlZFJlcXVlc3QgPSBuZXcgUmljby5MaXZlR3JpZFJlcXVlc3Qob2Zmc2V0KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHZhciBidWZmZXJTdGFydFBvcyA9IHRoaXMuYnVmZmVyLmdldEZldGNoT2Zmc2V0KG9mZnNldCk7Ci0gICAgICB0aGlzLnByb2Nlc3NpbmdSZXF1ZXN0ID0gbmV3IFJpY28uTGl2ZUdyaWRSZXF1ZXN0KG9mZnNldCk7Ci0gICAgICB0aGlzLnByb2Nlc3NpbmdSZXF1ZXN0LmJ1ZmZlck9mZnNldCA9IGJ1ZmZlclN0YXJ0UG9zOyAgIAotICAgICAgdmFyIGZldGNoU2l6ZSA9IHRoaXMuYnVmZmVyLmdldEZldGNoU2l6ZShvZmZzZXQpOwotICAgICAgdmFyIHBhcnRpYWxMb2FkZWQgPSBmYWxzZTsKLSAgICAgIHZhciBjYWxsUGFybXMgPSBbXTsgCi0gICAgICBjYWxsUGFybXMucHVzaCh0aGlzLnRhYmxlSWQgKyAnX3JlcXVlc3QnKTsKLSAgICAgIGNhbGxQYXJtcy5wdXNoKCdpZD0nICAgICAgICArIHRoaXMudGFibGVJZCk7Ci0gICAgICBjYWxsUGFybXMucHVzaCgncGFnZV9zaXplPScgKyBmZXRjaFNpemUpOwotICAgICAgY2FsbFBhcm1zLnB1c2goJ29mZnNldD0nICAgICsgYnVmZmVyU3RhcnRQb3MpOwotICAgICAgaWYgKCB0aGlzLnNvcnRDb2wpIHsKLSAgICAgICAgIGNhbGxQYXJtcy5wdXNoKCdzb3J0X2NvbD0nICAgICsgdGhpcy5zb3J0Q29sKTsKLSAgICAgICAgIGNhbGxQYXJtcy5wdXNoKCdzb3J0X2Rpcj0nICAgICsgdGhpcy5zb3J0RGlyKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZm9yKCB2YXIgaT0wIDsgaSA8IHRoaXMuYWRkaXRpb25hbFBhcm1zLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICBjYWxsUGFybXMucHVzaCh0aGlzLmFkZGl0aW9uYWxQYXJtc1tpXSk7Ci0gICAgICBhamF4RW5naW5lLnNlbmRSZXF1ZXN0LmFwcGx5KCBhamF4RW5naW5lLCBjYWxsUGFybXMgKTsKLSAgICAgICAgCi0gICAgICB0aGlzLnRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dCggdGhpcy5oYW5kbGVUaW1lZE91dC5iaW5kKHRoaXMpLCAyMDAwMCApOyAvL3RvZG86IG1ha2UgYXMgb3B0aW9uCi0gICB9LAotCi0gICByZXF1ZXN0Q29udGVudFJlZnJlc2g6IGZ1bmN0aW9uKGNvbnRlbnRPZmZzZXQpIHsKLSAgICAgIHRoaXMuZmV0Y2hCdWZmZXIoY29udGVudE9mZnNldCk7Ci0gICB9LAotCi0gICBhamF4VXBkYXRlOiBmdW5jdGlvbihhamF4UmVzcG9uc2UpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICBjbGVhclRpbWVvdXQoIHRoaXMudGltZW91dEhhbmRsZXIgKTsKLSAgICAgICAgIHRoaXMuYnVmZmVyLnVwZGF0ZShhamF4UmVzcG9uc2UsdGhpcy5wcm9jZXNzaW5nUmVxdWVzdC5idWZmZXJPZmZzZXQpOwotICAgICAgICAgdGhpcy52aWV3UG9ydC5idWZmZXJDaGFuZ2VkKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChlcnIpIHt9Ci0gICAgICBmaW5hbGx5IHt0aGlzLnByb2Nlc3NpbmdSZXF1ZXN0ID0gbnVsbDsgfQotICAgICAgdGhpcy5wcm9jZXNzUXVldWVkUmVxdWVzdCgpOwotICAgfSwKLQotICAgcHJvY2Vzc1F1ZXVlZFJlcXVlc3Q6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMudW5wcm9jZXNzZWRSZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgIHRoaXMucmVxdWVzdENvbnRlbnRSZWZyZXNoKHRoaXMudW5wcm9jZXNzZWRSZXF1ZXN0LnJlcXVlc3RPZmZzZXQpOwotICAgICAgICAgdGhpcy51bnByb2Nlc3NlZFJlcXVlc3QgPSBudWxsCi0gICAgICB9ICAKLSAgIH0KLSAKLX07Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLSByaWNvTGl2ZUdyaWRTb3J0LmpzCi1SaWNvLkxpdmVHcmlkU29ydCA9IENsYXNzLmNyZWF0ZSgpOwotCi1SaWNvLkxpdmVHcmlkU29ydC5wcm90b3R5cGUgPSB7Ci0KLSAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGhlYWRlclRhYmxlSWQsIG9wdGlvbnMpIHsKLSAgICAgIHRoaXMuaGVhZGVyVGFibGVJZCA9IGhlYWRlclRhYmxlSWQ7Ci0gICAgICB0aGlzLmhlYWRlclRhYmxlICAgPSAkKGhlYWRlclRhYmxlSWQpOwotICAgICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgdGhpcy5hcHBseVNvcnRCZWhhdmlvcigpOwotCi0gICAgICBpZiAoIHRoaXMub3B0aW9ucy5zb3J0Q29sICkgewotICAgICAgICAgdGhpcy5zZXRTb3J0VUkoIHRoaXMub3B0aW9ucy5zb3J0Q29sLCB0aGlzLm9wdGlvbnMuc29ydERpciApOwotICAgICAgfQotICAgfSwKLQotICAgc2V0U29ydFVJOiBmdW5jdGlvbiggY29sdW1uTmFtZSwgc29ydERpcmVjdGlvbiApIHsKLSAgICAgIHZhciBjb2xzID0gdGhpcy5vcHRpb25zLmNvbHVtbnM7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgY29scy5sZW5ndGggOyBpKysgKSB7Ci0gICAgICAgICBpZiAoIGNvbHNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lICkgewotICAgICAgICAgICAgdGhpcy5zZXRDb2x1bW5Tb3J0KGksIHNvcnREaXJlY3Rpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9LAotCi0gICBzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgICB0aGlzLm9wdGlvbnMgPSB7Ci0gICAgICAgICBzb3J0QXNjZW5kSW1nOiAgICAnaW1hZ2VzL3NvcnRfYXNjLmdpZicsCi0gICAgICAgICBzb3J0RGVzY2VuZEltZzogICAnaW1hZ2VzL3NvcnRfZGVzYy5naWYnLAotICAgICAgICAgaW1hZ2VXaWR0aDogICAgICAgOSwKLSAgICAgICAgIGltYWdlSGVpZ2h0OiAgICAgIDUsCi0gICAgICAgICBhamF4U29ydFVSTFBhcm1zOiBbXQotICAgICAgfS5leHRlbmQob3B0aW9ucyk7Ci0KLSAgICAgIC8vIHByZWxvYWQgdGhlIGltYWdlcy4uLgotICAgICAgbmV3IEltYWdlKCkuc3JjID0gdGhpcy5vcHRpb25zLnNvcnRBc2NlbmRJbWc7Ci0gICAgICBuZXcgSW1hZ2UoKS5zcmMgPSB0aGlzLm9wdGlvbnMuc29ydERlc2NlbmRJbWc7Ci0KLSAgICAgIHRoaXMuc29ydCA9IG9wdGlvbnMuc29ydEhhbmRsZXI7Ci0gICAgICBpZiAoICF0aGlzLm9wdGlvbnMuY29sdW1ucyApCi0gICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMuaW50cm9zcGVjdEZvckNvbHVtbkluZm8oKTsKLSAgICAgIGVsc2UgewotICAgICAgICAgLy8gYWxsb3cgY2xpZW50IHRvIHBhc3MgeyBjb2x1bW5zOiBbIFsiYSIsIHRydWVdLCBbImIiLCBmYWxzZV0gXSB9Ci0gICAgICAgICAvLyBhbmQgY29udmVydCB0byBhbiBhcnJheSBvZiBSaWNvLlRhYmxlQ29sdW1uIG9ianMuLi4KLSAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zID0gdGhpcy5jb252ZXJ0VG9UYWJsZUNvbHVtbnModGhpcy5vcHRpb25zLmNvbHVtbnMpOwotICAgICAgfQotICAgfSwKLQotICAgYXBwbHlTb3J0QmVoYXZpb3I6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGhlYWRlclJvdyAgID0gdGhpcy5oZWFkZXJUYWJsZS5yb3dzWzBdOwotICAgICAgdmFyIGhlYWRlckNlbGxzID0gaGVhZGVyUm93LmNlbGxzOwotICAgICAgZm9yICggdmFyIGkgPSAwIDsgaSA8IGhlYWRlckNlbGxzLmxlbmd0aCA7IGkrKyApIHsKLSAgICAgICAgIHRoaXMuYWRkU29ydEJlaGF2aW9yVG9Db2x1bW4oIGksIGhlYWRlckNlbGxzW2ldICk7Ci0gICAgICB9Ci0gICB9LAotCi0gICBhZGRTb3J0QmVoYXZpb3JUb0NvbHVtbjogZnVuY3Rpb24oIG4sIGNlbGwgKSB7Ci0gICAgICBpZiAoIHRoaXMub3B0aW9ucy5jb2x1bW5zW25dLmlzU29ydGFibGUoKSApIHsKLSAgICAgICAgIGNlbGwuaWQgICAgICAgICAgICA9IHRoaXMuaGVhZGVyVGFibGVJZCArICdfJyArIG47Ci0gICAgICAgICBjZWxsLnN0eWxlLmN1cnNvciAgPSAncG9pbnRlcic7Ci0gICAgICAgICBjZWxsLm9uY2xpY2sgICAgICAgPSB0aGlzLmhlYWRlckNlbGxDbGlja2VkLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICBjZWxsLmlubmVySFRNTCAgICAgPSBjZWxsLmlubmVySFRNTCArICc8c3BhbiBpZD0iJyArIHRoaXMuaGVhZGVyVGFibGVJZCArICdfaW1nXycgKyBuICsgJyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnJm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPic7Ci0gICAgICB9Ci0gICB9LAotCi0gICAvLyBldmVudCBoYW5kbGVyLi4uLgotICAgaGVhZGVyQ2VsbENsaWNrZWQ6IGZ1bmN0aW9uKGV2dCkgewotICAgICAgdmFyIGV2ZW50VGFyZ2V0ID0gZXZ0LnRhcmdldCA/IGV2dC50YXJnZXQgOiBldnQuc3JjRWxlbWVudDsKLSAgICAgIHZhciBjZWxsSWQgPSBldmVudFRhcmdldC5pZDsKLSAgICAgIHZhciBjb2x1bW5OdW1iZXIgPSBwYXJzZUludChjZWxsSWQuc3Vic3RyaW5nKCBjZWxsSWQubGFzdEluZGV4T2YoJ18nKSArIDEgKSk7Ci0gICAgICB2YXIgc29ydGVkQ29sdW1uSW5kZXggPSB0aGlzLmdldFNvcnRlZENvbHVtbkluZGV4KCk7Ci0gICAgICBpZiAoIHNvcnRlZENvbHVtbkluZGV4ICE9IC0xICkgewotICAgICAgICAgaWYgKCBzb3J0ZWRDb2x1bW5JbmRleCAhPSBjb2x1bW5OdW1iZXIgKSB7Ci0gICAgICAgICAgICB0aGlzLnJlbW92ZUNvbHVtblNvcnQoc29ydGVkQ29sdW1uSW5kZXgpOwotICAgICAgICAgICAgdGhpcy5zZXRDb2x1bW5Tb3J0KGNvbHVtbk51bWJlciwgUmljby5UYWJsZUNvbHVtbi5TT1JUX0FTQyk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbHVtblNvcnQoc29ydGVkQ29sdW1uSW5kZXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgdGhpcy5zZXRDb2x1bW5Tb3J0KGNvbHVtbk51bWJlciwgUmljby5UYWJsZUNvbHVtbi5TT1JUX0FTQyk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydEhhbmRsZXIpIHsKLSAgICAgICAgIHRoaXMub3B0aW9ucy5zb3J0SGFuZGxlcih0aGlzLm9wdGlvbnMuY29sdW1uc1tjb2x1bW5OdW1iZXJdKTsKLSAgICAgIH0KLSAgIH0sCi0KLSAgIHJlbW92ZUNvbHVtblNvcnQ6IGZ1bmN0aW9uKG4pIHsKLSAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zW25dLnNldFVuc29ydGVkKCk7Ci0gICAgICB0aGlzLnNldFNvcnRJbWFnZShuKTsKLSAgIH0sCi0KLSAgIHNldENvbHVtblNvcnQ6IGZ1bmN0aW9uKG4sIGRpcmVjdGlvbikgewotICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbnNbbl0uc2V0U29ydGVkKGRpcmVjdGlvbik7Ci0gICAgICB0aGlzLnNldFNvcnRJbWFnZShuKTsKLSAgIH0sCi0KLSAgIHRvZ2dsZUNvbHVtblNvcnQ6IGZ1bmN0aW9uKG4pIHsKLSAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zW25dLnRvZ2dsZVNvcnQoKTsKLSAgICAgIHRoaXMuc2V0U29ydEltYWdlKG4pOwotICAgfSwKLQotICAgc2V0U29ydEltYWdlOiBmdW5jdGlvbihuKSB7Ci0gICAgICB2YXIgc29ydERpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5jb2x1bW5zW25dLmdldFNvcnREaXJlY3Rpb24oKTsKLQotICAgICAgdmFyIHNvcnRJbWFnZVNwYW4gPSAkKCB0aGlzLmhlYWRlclRhYmxlSWQgKyAnX2ltZ18nICsgbiApOwotICAgICAgaWYgKCBzb3J0RGlyZWN0aW9uID09IFJpY28uVGFibGVDb2x1bW4uVU5TT1JURUQgKQotICAgICAgICAgc29ydEltYWdlU3Bhbi5pbm5lckhUTUwgPSAnJm5ic3A7Jm5ic3A7JzsKLSAgICAgIGVsc2UgaWYgKCBzb3J0RGlyZWN0aW9uID09IFJpY28uVGFibGVDb2x1bW4uU09SVF9BU0MgKQotICAgICAgICAgc29ydEltYWdlU3Bhbi5pbm5lckhUTUwgPSAnJm5ic3A7Jm5ic3A7PGltZyB3aWR0aD0iJyAgKyB0aGlzLm9wdGlvbnMuaW1hZ2VXaWR0aCAgICArICciICcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0PSInKyB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQgICArICciICcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjPSInICAgKyB0aGlzLm9wdGlvbnMuc29ydEFzY2VuZEltZyArICciLz4nOwotICAgICAgZWxzZSBpZiAoIHNvcnREaXJlY3Rpb24gPT0gUmljby5UYWJsZUNvbHVtbi5TT1JUX0RFU0MgKQotICAgICAgICAgc29ydEltYWdlU3Bhbi5pbm5lckhUTUwgPSAnJm5ic3A7Jm5ic3A7PGltZyB3aWR0aD0iJyAgKyB0aGlzLm9wdGlvbnMuaW1hZ2VXaWR0aCAgICArICciICcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0PSInKyB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQgICArICciICcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjPSInICAgKyB0aGlzLm9wdGlvbnMuc29ydERlc2NlbmRJbWcgKyAnIi8+JzsKLSAgIH0sCi0KLSAgIGdldFNvcnRlZENvbHVtbkluZGV4OiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBjb2xzID0gdGhpcy5vcHRpb25zLmNvbHVtbnM7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgY29scy5sZW5ndGggOyBpKysgKSB7Ci0gICAgICAgICBpZiAoIGNvbHNbaV0uaXNTb3J0ZWQoKSApCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIC0xOwotICAgfSwKLQotICAgaW50cm9zcGVjdEZvckNvbHVtbkluZm86IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGNvbHVtbnMgPSBuZXcgQXJyYXkoKTsKLSAgICAgIHZhciBoZWFkZXJSb3cgICA9IHRoaXMuaGVhZGVyVGFibGUucm93c1swXTsKLSAgICAgIHZhciBoZWFkZXJDZWxscyA9IGhlYWRlclJvdy5jZWxsczsKLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCBoZWFkZXJDZWxscy5sZW5ndGggOyBpKysgKQotICAgICAgICAgY29sdW1ucy5wdXNoKCBuZXcgUmljby5UYWJsZUNvbHVtbiggdGhpcy5kZXJpdmVDb2x1bW5OYW1lRnJvbUNlbGwoaGVhZGVyQ2VsbHNbaV0saSksIHRydWUgKSApOwotICAgICAgcmV0dXJuIGNvbHVtbnM7Ci0gICB9LAotCi0gICBjb252ZXJ0VG9UYWJsZUNvbHVtbnM6IGZ1bmN0aW9uKGNvbHMpIHsKLSAgICAgIHZhciBjb2x1bW5zID0gbmV3IEFycmF5KCk7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgY29scy5sZW5ndGggOyBpKysgKQotICAgICAgICAgY29sdW1ucy5wdXNoKCBuZXcgUmljby5UYWJsZUNvbHVtbiggY29sc1tpXVswXSwgY29sc1tpXVsxXSApICk7Ci0gICB9LAotCi0gICBkZXJpdmVDb2x1bW5OYW1lRnJvbUNlbGw6IGZ1bmN0aW9uKGNlbGwsY29sdW1uTnVtYmVyKSB7Ci0gICAgICB2YXIgY2VsbENvbnRlbnQgPSBjZWxsLmlubmVyVGV4dCAhPSB1bmRlZmluZWQgPyBjZWxsLmlubmVyVGV4dCA6IGNlbGwudGV4dENvbnRlbnQ7Ci0gICAgICByZXR1cm4gY2VsbENvbnRlbnQgPyBjZWxsQ29udGVudC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykuam9pbignXycpIDogImNvbF8iICsgY29sdW1uTnVtYmVyOwotICAgfQotfTsKLQotUmljby5UYWJsZUNvbHVtbiA9IENsYXNzLmNyZWF0ZSgpOwotCi1SaWNvLlRhYmxlQ29sdW1uLlVOU09SVEVEICA9IDA7Ci1SaWNvLlRhYmxlQ29sdW1uLlNPUlRfQVNDICA9ICJBU0MiOwotUmljby5UYWJsZUNvbHVtbi5TT1JUX0RFU0MgPSAiREVTQyI7Ci0KLVJpY28uVGFibGVDb2x1bW4ucHJvdG90eXBlID0gewotICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24obmFtZSwgc29ydGFibGUpIHsKLSAgICAgIHRoaXMubmFtZSAgICAgICAgPSBuYW1lOwotICAgICAgdGhpcy5zb3J0YWJsZSAgICA9IHNvcnRhYmxlOwotICAgICAgdGhpcy5jdXJyZW50U29ydCA9IFJpY28uVGFibGVDb2x1bW4uVU5TT1JURUQ7Ci0gICB9LAotCi0gICBpc1NvcnRhYmxlOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLnNvcnRhYmxlOwotICAgfSwKLQotICAgaXNTb3J0ZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnQgIT0gUmljby5UYWJsZUNvbHVtbi5VTlNPUlRFRDsKLSAgIH0sCi0KLSAgIGdldFNvcnREaXJlY3Rpb246IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnQ7Ci0gICB9LAotCi0gICB0b2dnbGVTb3J0OiBmdW5jdGlvbigpIHsKLSAgICAgIGlmICggdGhpcy5jdXJyZW50U29ydCA9PSBSaWNvLlRhYmxlQ29sdW1uLlVOU09SVEVEIHx8IHRoaXMuY3VycmVudFNvcnQgPT0gUmljby5UYWJsZUNvbHVtbi5TT1JUX0RFU0MgKQotICAgICAgICAgdGhpcy5jdXJyZW50U29ydCA9IFJpY28uVGFibGVDb2x1bW4uU09SVF9BU0M7Ci0gICAgICBlbHNlIGlmICggdGhpcy5jdXJyZW50U29ydCA9PSBSaWNvLlRhYmxlQ29sdW1uLlNPUlRfQVNDICkKLSAgICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSBSaWNvLlRhYmxlQ29sdW1uLlNPUlRfREVTQzsKLSAgIH0sCi0KLSAgIHNldFVuc29ydGVkOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKLSAgICAgIHRoaXMuc2V0U29ydGVkKFJpY28uVGFibGVDb2x1bW4uVU5TT1JURUQpOwotICAgfSwKLQotICAgc2V0U29ydGVkOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKLSAgICAgIC8vIGRpcmVjdGlvbiBtdXN0IGJ5IG9uZSBvZiBSaWNvLlRhYmxlQ29sdW1uLlVOU09SVEVELCAuU09SVF9BU0MsIG9yIC5TRVRfREVTQy4uLgotICAgICAgdGhpcy5jdXJyZW50U29ydCA9IGRpcmVjdGlvbjsKLSAgIH0KLQotfTsKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tIHJpY29VdGlsLmpzCi0KLXZhciBSaWNvVXRpbCA9IHsKLQotICAgZ2V0RWxlbWVudHNDb21wdXRlZFN0eWxlOiBmdW5jdGlvbiAoIGh0bWxFbGVtZW50LCBjc3NQcm9wZXJ0eSwgbW96aWxsYUVxdWl2YWxlbnRDU1MpIHsKLSAgICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCA9PSAyICkKLSAgICAgICAgIG1vemlsbGFFcXVpdmFsZW50Q1NTID0gY3NzUHJvcGVydHk7Ci0KLSAgICAgIHZhciBlbCA9ICQoaHRtbEVsZW1lbnQpOwotICAgICAgaWYgKCBlbC5jdXJyZW50U3R5bGUgKQotICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZVtjc3NQcm9wZXJ0eV07Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShtb3ppbGxhRXF1aXZhbGVudENTUyk7Ci0gICB9LAotCi0gICBjcmVhdGVYbWxEb2N1bWVudCA6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKGRvY3VtZW50LmltcGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KSB7Ci0gICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsKLQotICAgICAgICAgaWYgKGRvYy5yZWFkeVN0YXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIGRvYy5yZWFkeVN0YXRlID0gMTsKLSAgICAgICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPSA0OwotICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkb2Mub25yZWFkeXN0YXRlY2hhbmdlID09ICJmdW5jdGlvbiIpCi0gICAgICAgICAgICAgICAgICBkb2Mub25yZWFkeXN0YXRlY2hhbmdlKCk7Ci0gICAgICAgICAgICB9LCBmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHJldHVybiBkb2M7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkKLSAgICAgICAgICByZXR1cm4gVHJ5LnRoZXNlKAotICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTVNYTUwyLkRvbURvY3VtZW50JykgICB9LAotICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LkRvbURvY3VtZW50Jyl9LAotICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTVNYTUwuRG9tRG9jdW1lbnQnKSAgICB9LAotICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTVNYTUwzLkRvbURvY3VtZW50JykgICB9Ci0gICAgICAgICAgKSB8fCBmYWxzZTsKLQotICAgICAgcmV0dXJuIG51bGw7Ci0gICB9LAotCi0gICBnZXRDb250ZW50QXNTdHJpbmc6IGZ1bmN0aW9uKCBwYXJlbnROb2RlICkgewotICAgICAgcmV0dXJuIHBhcmVudE5vZGUueG1sICE9IHVuZGVmaW5lZCA/IAotICAgICAgICAgdGhpcy5fZ2V0Q29udGVudEFzU3RyaW5nSUUocGFyZW50Tm9kZSkgOgotICAgICAgICAgdGhpcy5fZ2V0Q29udGVudEFzU3RyaW5nTW96aWxsYShwYXJlbnROb2RlKTsKLSAgIH0sCi0KLSAgIF9nZXRDb250ZW50QXNTdHJpbmdJRTogZnVuY3Rpb24ocGFyZW50Tm9kZSkgewotICAgICAgdmFyIGNvbnRlbnRTdHIgPSAiIjsKLSAgICAgIGZvciAoIHZhciBpID0gMCA7IGkgPCBwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIDsgaSsrICkKLSAgICAgICAgIGNvbnRlbnRTdHIgKz0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldLnhtbDsKLSAgICAgIHJldHVybiBjb250ZW50U3RyOwotICAgfSwKLQotICAgX2dldENvbnRlbnRBc1N0cmluZ01vemlsbGE6IGZ1bmN0aW9uKHBhcmVudE5vZGUpIHsKLSAgICAgIHZhciB4bWxTZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTsKLSAgICAgIHZhciBjb250ZW50U3RyID0gIiI7Ci0gICAgICBmb3IgKCB2YXIgaSA9IDAgOyBpIDwgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA7IGkrKyApCi0gICAgICAgICBjb250ZW50U3RyICs9IHhtbFNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcocGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldKTsKLSAgICAgIHJldHVybiBjb250ZW50U3RyOwotICAgfSwKLQotICAgdG9WaWV3cG9ydFBvc2l0aW9uOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgICByZXR1cm4gdGhpcy5fdG9BYnNvbHV0ZShlbGVtZW50LHRydWUpOwotICAgfSwKLQotICAgdG9Eb2N1bWVudFBvc2l0aW9uOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgICByZXR1cm4gdGhpcy5fdG9BYnNvbHV0ZShlbGVtZW50LGZhbHNlKTsKLSAgIH0sCi0KLSAgIC8qKgotICAgICogIENvbXB1dGUgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIGluIHRlcm1zIG9mIHRoZSB3aW5kb3cgdmlld3BvcnQKLSAgICAqICBzbyB0aGF0IGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIChkbmQpCi0gICAgKiAgVGhpcyBpcyBhZGRpdGlvbnMgb2YgYWxsIHRoZSBvZmZzZXRUb3Asb2Zmc2V0TGVmdCB2YWx1ZXMgdXAgdGhlCi0gICAgKiAgb2Zmc2V0UGFyZW50IGhpZXJhcmNoeSwgLi4udGFraW5nIGludG8gYWNjb3VudCBhbnkgc2Nyb2xsVG9wLAotICAgICogIHNjcm9sbExlZnQgdmFsdWVzIGFsb25nIHRoZSB3YXkuLi4KLSAgICAqCi0gICAgKiBJRSBoYXMgYSBidWcgcmVwb3J0aW5nIGEgY29ycmVjdCBvZmZzZXRMZWZ0IG9mIGVsZW1lbnRzIHdpdGhpbiBhCi0gICAgKiBhIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBwYXJlbnQhISEKLSAgICAqKi8KLSAgIF90b0Fic29sdXRlOiBmdW5jdGlvbihlbGVtZW50LGFjY291bnRGb3JEb2NTY3JvbGwpIHsKLQotICAgICAgaWYgKCBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigibXNpZSIpID09IC0xICkKLSAgICAgICAgIHJldHVybiB0aGlzLl90b0Fic29sdXRlTW96aWxsYShlbGVtZW50LGFjY291bnRGb3JEb2NTY3JvbGwpOwotCi0gICAgICB2YXIgeCA9IDA7Ci0gICAgICB2YXIgeSA9IDA7Ci0gICAgICB2YXIgcGFyZW50ID0gZWxlbWVudDsKLSAgICAgIHdoaWxlICggcGFyZW50ICkgewotCi0gICAgICAgICB2YXIgYm9yZGVyWE9mZnNldCA9IDA7Ci0gICAgICAgICB2YXIgYm9yZGVyWU9mZnNldCA9IDA7Ci0gICAgICAgICBpZiAoIHBhcmVudCAhPSBlbGVtZW50ICkgewotICAgICAgICAgICAgdmFyIGJvcmRlclhPZmZzZXQgPSBwYXJzZUludCh0aGlzLmdldEVsZW1lbnRzQ29tcHV0ZWRTdHlsZShwYXJlbnQsICJib3JkZXJMZWZ0V2lkdGgiICkpOwotICAgICAgICAgICAgdmFyIGJvcmRlcllPZmZzZXQgPSBwYXJzZUludCh0aGlzLmdldEVsZW1lbnRzQ29tcHV0ZWRTdHlsZShwYXJlbnQsICJib3JkZXJUb3BXaWR0aCIgKSk7Ci0gICAgICAgICAgICBib3JkZXJYT2Zmc2V0ID0gaXNOYU4oYm9yZGVyWE9mZnNldCkgPyAwIDogYm9yZGVyWE9mZnNldDsKLSAgICAgICAgICAgIGJvcmRlcllPZmZzZXQgPSBpc05hTihib3JkZXJZT2Zmc2V0KSA/IDAgOiBib3JkZXJZT2Zmc2V0OwotICAgICAgICAgfQotCi0gICAgICAgICB4ICs9IHBhcmVudC5vZmZzZXRMZWZ0IC0gcGFyZW50LnNjcm9sbExlZnQgKyBib3JkZXJYT2Zmc2V0OwotICAgICAgICAgeSArPSBwYXJlbnQub2Zmc2V0VG9wIC0gcGFyZW50LnNjcm9sbFRvcCArIGJvcmRlcllPZmZzZXQ7Ci0gICAgICAgICBwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50OwotICAgICAgfQotCi0gICAgICBpZiAoIGFjY291bnRGb3JEb2NTY3JvbGwgKSB7Ci0gICAgICAgICB4IC09IHRoaXMuZG9jU2Nyb2xsTGVmdCgpOwotICAgICAgICAgeSAtPSB0aGlzLmRvY1Njcm9sbFRvcCgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4geyB4OngsIHk6eSB9OwotICAgfSwKLQotICAgLyoqCi0gICAgKiAgTW96aWxsYSBkaWQgbm90IHJlcG9ydCBhbGwgb2YgdGhlIHBhcmVudHMgdXAgdGhlIGhpZXJhcmNoeSB2aWEgdGhlCi0gICAgKiAgb2Zmc2V0UGFyZW50IHByb3BlcnR5IHRoYXQgSUUgZGlkLiAgU28gZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUKLSAgICAqICBvZmZzZXRzIHdlIHVzZSB0aGUgb2Zmc2V0UGFyZW50IHByb3BlcnR5LCBidXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZgotICAgICogIHRoZSBzY3JvbGxUb3Avc2Nyb2xsTGVmdCBhZGp1c3RtZW50cyB3ZSBuYXZpZ2F0ZSB1cCB2aWEgdGhlIHBhcmVudE5vZGUKLSAgICAqICBwcm9wZXJ0eSBpbnN0ZWFkIHNvIGFzIHRvIGdldCB0aGUgc2Nyb2xsIG9mZnNldHMuLi4KLSAgICAqCi0gICAgKiovCi0gICBfdG9BYnNvbHV0ZU1vemlsbGE6IGZ1bmN0aW9uKGVsZW1lbnQsYWNjb3VudEZvckRvY1Njcm9sbCkgewotICAgICAgdmFyIHggPSAwOwotICAgICAgdmFyIHkgPSAwOwotICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQ7Ci0gICAgICB3aGlsZSAoIHBhcmVudCApIHsKLSAgICAgICAgIHggKz0gcGFyZW50Lm9mZnNldExlZnQ7Ci0gICAgICAgICB5ICs9IHBhcmVudC5vZmZzZXRUb3A7Ci0gICAgICAgICBwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50OwotICAgICAgfQotCi0gICAgICBwYXJlbnQgPSBlbGVtZW50OwotICAgICAgd2hpbGUgKCBwYXJlbnQgJiYKLSAgICAgICAgICAgICAgcGFyZW50ICE9IGRvY3VtZW50LmJvZHkgJiYKLSAgICAgICAgICAgICAgcGFyZW50ICE9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApIHsKLSAgICAgICAgIGlmICggcGFyZW50LnNjcm9sbExlZnQgICkKLSAgICAgICAgICAgIHggLT0gcGFyZW50LnNjcm9sbExlZnQ7Ci0gICAgICAgICBpZiAoIHBhcmVudC5zY3JvbGxUb3AgKQotICAgICAgICAgICAgeSAtPSBwYXJlbnQuc2Nyb2xsVG9wOwotICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYWNjb3VudEZvckRvY1Njcm9sbCApIHsKLSAgICAgICAgIHggLT0gdGhpcy5kb2NTY3JvbGxMZWZ0KCk7Ci0gICAgICAgICB5IC09IHRoaXMuZG9jU2Nyb2xsVG9wKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB7IHg6eCwgeTp5IH07Ci0gICB9LAotCi0gICBkb2NTY3JvbGxMZWZ0OiBmdW5jdGlvbigpIHsKLSAgICAgIGlmICggd2luZG93LnBhZ2VYT2Zmc2V0ICkKLSAgICAgICAgIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQ7Ci0gICAgICBlbHNlIGlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0ICkKLSAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKLSAgICAgIGVsc2UgaWYgKCBkb2N1bWVudC5ib2R5ICkKLSAgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gMDsKLSAgIH0sCi0KLSAgIGRvY1Njcm9sbFRvcDogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoIHdpbmRvdy5wYWdlWU9mZnNldCApCi0gICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VZT2Zmc2V0OwotICAgICAgZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICkKLSAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwotICAgICAgZWxzZSBpZiAoIGRvY3VtZW50LmJvZHkgKQotICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOwotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLX07CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9zY3JpcHRhY3Vsb3VzLmpzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvc2NyaXB0YWN1bG91cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYTJlZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9zY3JpcHRhY3Vsb3VzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLS8vIAotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLS8vICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLS8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLS8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotLy8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0vLyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLyAKLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCi0vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLXZhciBTY3JpcHRhY3Vsb3VzID0gewotICBWZXJzaW9uOiAnMS41LjAnLAotICByZXF1aXJlOiBmdW5jdGlvbihsaWJyYXJ5TmFtZSkgewotICAgIC8vIGluc2VydGluZyB2aWEgRE9NIGZhaWxzIGluIFNhZmFyaSAyLjAsIHNvIGJydXRlIGZvcmNlIGFwcHJvYWNoCi0gICAgZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicrbGlicmFyeU5hbWUrJyI+PC9zY3JpcHQ+Jyk7Ci0gIH0sCi0gIGxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKCh0eXBlb2YgUHJvdG90eXBlPT0ndW5kZWZpbmVkJykgfHwKLSAgICAgIHBhcnNlRmxvYXQoUHJvdG90eXBlLlZlcnNpb24uc3BsaXQoIi4iKVswXSArICIuIiArCi0gICAgICAgICAgICAgICAgIFByb3RvdHlwZS5WZXJzaW9uLnNwbGl0KCIuIilbMV0pIDwgMS40KQotICAgICAgdGhyb3coInNjcmlwdC5hY3Vsby51cyByZXF1aXJlcyB0aGUgUHJvdG90eXBlIEphdmFTY3JpcHQgZnJhbWV3b3JrID49IDEuNC4wIik7Ci0gICAgdmFyIHNjcmlwdFRhZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Ci0gICAgZm9yKHZhciBpPTA7aTxzY3JpcHRUYWdzLmxlbmd0aDtpKyspIHsKLSAgICAgIGlmKHNjcmlwdFRhZ3NbaV0uc3JjICYmIHNjcmlwdFRhZ3NbaV0uc3JjLm1hdGNoKC9zY3JpcHRhY3Vsb3VzXC5qcyhcPy4qKT8kLykpIHsKLSAgICAgICAgdmFyIHBhdGggPSBzY3JpcHRUYWdzW2ldLnNyYy5yZXBsYWNlKC9zY3JpcHRhY3Vsb3VzXC5qcyhcPy4qKT8kLywnJyk7Ci0gICAgICAgIHRoaXMucmVxdWlyZShwYXRoICsgJ2J1aWxkZXIuanMnKTsKLSAgICAgICAgdGhpcy5yZXF1aXJlKHBhdGggKyAnZWZmZWN0cy5qcycpOwotICAgICAgICB0aGlzLnJlcXVpcmUocGF0aCArICdkcmFnZHJvcC5qcycpOwotICAgICAgICB0aGlzLnJlcXVpcmUocGF0aCArICdjb250cm9scy5qcycpOwotICAgICAgICB0aGlzLnJlcXVpcmUocGF0aCArICdzbGlkZXIuanMnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLVNjcmlwdGFjdWxvdXMubG9hZCgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL3NsaWRlci5qcyBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2FyL2pzL3NsaWRlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkMGJjYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy9zbGlkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDA1IE1hcnR5IEhhdWdodCwgVGhvbWFzIEZ1Y2hzIAotLy8KLS8vIFNlZSBodHRwOi8vc2NyaXB0LmFjdWxvLnVzIGZvciBtb3JlIGluZm8KLS8vIAotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLS8vICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLS8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLS8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotLy8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0vLyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLyAKLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCi0vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLWlmKCFDb250cm9sKSB2YXIgQ29udHJvbCA9IHt9OwotQ29udHJvbC5TbGlkZXIgPSBDbGFzcy5jcmVhdGUoKTsKLQotLy8gb3B0aW9uczoKLS8vICBheGlzOiAndmVydGljYWwnLCBvciAnaG9yaXpvbnRhbCcgKGRlZmF1bHQpCi0vLwotLy8gY2FsbGJhY2tzOgotLy8gIG9uQ2hhbmdlKHZhbHVlKQotLy8gIG9uU2xpZGUodmFsdWUpCi1Db250cm9sLlNsaWRlci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGhhbmRsZSwgdHJhY2ssIG9wdGlvbnMpIHsKLSAgICB2YXIgc2xpZGVyID0gdGhpczsKLSAgICAKLSAgICBpZihoYW5kbGUgaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgdGhpcy5oYW5kbGVzID0gaGFuZGxlLmNvbGxlY3QoIGZ1bmN0aW9uKGUpIHsgcmV0dXJuICQoZSkgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuaGFuZGxlcyA9IFskKGhhbmRsZSldOwotICAgIH0KLSAgICAKLSAgICB0aGlzLnRyYWNrICAgPSAkKHRyYWNrKTsKLSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gICAgdGhpcy5heGlzICAgICAgPSB0aGlzLm9wdGlvbnMuYXhpcyB8fCAnaG9yaXpvbnRhbCc7Ci0gICAgdGhpcy5pbmNyZW1lbnQgPSB0aGlzLm9wdGlvbnMuaW5jcmVtZW50IHx8IDE7Ci0gICAgdGhpcy5zdGVwICAgICAgPSBwYXJzZUludCh0aGlzLm9wdGlvbnMuc3RlcCB8fCAnMScpOwotICAgIHRoaXMucmFuZ2UgICAgID0gdGhpcy5vcHRpb25zLnJhbmdlIHx8ICRSKDAsMSk7Ci0gICAgCi0gICAgdGhpcy52YWx1ZSAgICAgPSAwOyAvLyBhc3N1cmUgYmFja3dhcmRzIGNvbXBhdAotICAgIHRoaXMudmFsdWVzICAgID0gdGhpcy5oYW5kbGVzLm1hcCggZnVuY3Rpb24oKSB7IHJldHVybiAwIH0pOwotICAgIHRoaXMuc3BhbnMgICAgID0gdGhpcy5vcHRpb25zLnNwYW5zID8gdGhpcy5vcHRpb25zLnNwYW5zLm1hcChmdW5jdGlvbihzKXsgcmV0dXJuICQocykgfSkgOiBmYWxzZTsKLSAgICB0aGlzLm9wdGlvbnMuc3RhcnRTcGFuID0gJCh0aGlzLm9wdGlvbnMuc3RhcnRTcGFuIHx8IG51bGwpOwotICAgIHRoaXMub3B0aW9ucy5lbmRTcGFuICAgPSAkKHRoaXMub3B0aW9ucy5lbmRTcGFuIHx8IG51bGwpOwotCi0gICAgdGhpcy5yZXN0cmljdGVkID0gdGhpcy5vcHRpb25zLnJlc3RyaWN0ZWQgfHwgZmFsc2U7Ci0KLSAgICB0aGlzLm1heGltdW0gICA9IHRoaXMub3B0aW9ucy5tYXhpbXVtIHx8IHRoaXMucmFuZ2UuZW5kOwotICAgIHRoaXMubWluaW11bSAgID0gdGhpcy5vcHRpb25zLm1pbmltdW0gfHwgdGhpcy5yYW5nZS5zdGFydDsKLQotICAgIC8vIFdpbGwgYmUgdXNlZCB0byBhbGlnbiB0aGUgaGFuZGxlIG9udG8gdGhlIHRyYWNrLCBpZiBuZWNlc3NhcnkKLSAgICB0aGlzLmFsaWduWCA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy5hbGlnblggfHwgJzAnKTsKLSAgICB0aGlzLmFsaWduWSA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy5hbGlnblkgfHwgJzAnKTsKLSAgICAKLSAgICB0aGlzLnRyYWNrTGVuZ3RoID0gdGhpcy5tYXhpbXVtT2Zmc2V0KCkgLSB0aGlzLm1pbmltdW1PZmZzZXQoKTsKLSAgICB0aGlzLmhhbmRsZUxlbmd0aCA9IHRoaXMuaXNWZXJ0aWNhbCgpID8gdGhpcy5oYW5kbGVzWzBdLm9mZnNldEhlaWdodCA6IHRoaXMuaGFuZGxlc1swXS5vZmZzZXRXaWR0aDsKLQotICAgIHRoaXMuYWN0aXZlICAgPSBmYWxzZTsKLSAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7Ci0gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwotCi0gICAgaWYodGhpcy5vcHRpb25zLmRpc2FibGVkKSB0aGlzLnNldERpc2FibGVkKCk7Ci0KLSAgICAvLyBBbGxvd2VkIHZhbHVlcyBhcnJheQotICAgIHRoaXMuYWxsb3dlZFZhbHVlcyA9IHRoaXMub3B0aW9ucy52YWx1ZXMgPyB0aGlzLm9wdGlvbnMudmFsdWVzLnNvcnRCeShQcm90b3R5cGUuSykgOiBmYWxzZTsKLSAgICBpZih0aGlzLmFsbG93ZWRWYWx1ZXMpIHsKLSAgICAgIHRoaXMubWluaW11bSA9IHRoaXMuYWxsb3dlZFZhbHVlcy5taW4oKTsKLSAgICAgIHRoaXMubWF4aW11bSA9IHRoaXMuYWxsb3dlZFZhbHVlcy5tYXgoKTsKLSAgICB9Ci0KLSAgICB0aGlzLmV2ZW50TW91c2VEb3duID0gdGhpcy5zdGFydERyYWcuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB0aGlzLmV2ZW50TW91c2VVcCAgID0gdGhpcy5lbmREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgdGhpcy5ldmVudE1vdXNlTW92ZSA9IHRoaXMudXBkYXRlLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGhhbmRsZXMgaW4gcmV2ZXJzZSAobWFrZSBzdXJlIGZpcnN0IGhhbmRsZSBpcyBhY3RpdmUpCi0gICAgdGhpcy5oYW5kbGVzLmVhY2goIGZ1bmN0aW9uKGgsaSkgewotICAgICAgaSA9IHNsaWRlci5oYW5kbGVzLmxlbmd0aC0xLWk7Ci0gICAgICBzbGlkZXIuc2V0VmFsdWUocGFyc2VGbG9hdCgKLSAgICAgICAgKHNsaWRlci5vcHRpb25zLnNsaWRlclZhbHVlIGluc3RhbmNlb2YgQXJyYXkgPyAKLSAgICAgICAgICBzbGlkZXIub3B0aW9ucy5zbGlkZXJWYWx1ZVtpXSA6IHNsaWRlci5vcHRpb25zLnNsaWRlclZhbHVlKSB8fCAKLSAgICAgICAgIHNsaWRlci5yYW5nZS5zdGFydCksIGkpOwotICAgICAgRWxlbWVudC5tYWtlUG9zaXRpb25lZChoKTsgLy8gZml4IElFCi0gICAgICBFdmVudC5vYnNlcnZlKGgsICJtb3VzZWRvd24iLCBzbGlkZXIuZXZlbnRNb3VzZURvd24pOwotICAgIH0pOwotICAgIAotICAgIEV2ZW50Lm9ic2VydmUodGhpcy50cmFjaywgIm1vdXNlZG93biIsIHRoaXMuZXZlbnRNb3VzZURvd24pOwotICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJtb3VzZXVwIiwgdGhpcy5ldmVudE1vdXNlVXApOwotICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICAKLSAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKLSAgfSwKLSAgZGlzcG9zZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNsaWRlciA9IHRoaXM7ICAgIAotICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy50cmFjaywgIm1vdXNlZG93biIsIHRoaXMuZXZlbnRNb3VzZURvd24pOwotICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJtb3VzZXVwIiwgdGhpcy5ldmVudE1vdXNlVXApOwotICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICB0aGlzLmhhbmRsZXMuZWFjaCggZnVuY3Rpb24oaCkgewotICAgICAgRXZlbnQuc3RvcE9ic2VydmluZyhoLCAibW91c2Vkb3duIiwgc2xpZGVyLmV2ZW50TW91c2VEb3duKTsKLSAgICB9KTsKLSAgfSwKLSAgc2V0RGlzYWJsZWQ6IGZ1bmN0aW9uKCl7Ci0gICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7Ci0gIH0sCi0gIHNldEVuYWJsZWQ6IGZ1bmN0aW9uKCl7Ci0gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwotICB9LCAgCi0gIGdldE5lYXJlc3RWYWx1ZTogZnVuY3Rpb24odmFsdWUpewotICAgIGlmKHRoaXMuYWxsb3dlZFZhbHVlcyl7Ci0gICAgICBpZih2YWx1ZSA+PSB0aGlzLmFsbG93ZWRWYWx1ZXMubWF4KCkpIHJldHVybih0aGlzLmFsbG93ZWRWYWx1ZXMubWF4KCkpOwotICAgICAgaWYodmFsdWUgPD0gdGhpcy5hbGxvd2VkVmFsdWVzLm1pbigpKSByZXR1cm4odGhpcy5hbGxvd2VkVmFsdWVzLm1pbigpKTsKLSAgICAgIAotICAgICAgdmFyIG9mZnNldCA9IE1hdGguYWJzKHRoaXMuYWxsb3dlZFZhbHVlc1swXSAtIHZhbHVlKTsKLSAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuYWxsb3dlZFZhbHVlc1swXTsKLSAgICAgIHRoaXMuYWxsb3dlZFZhbHVlcy5lYWNoKCBmdW5jdGlvbih2KSB7Ci0gICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gTWF0aC5hYnModiAtIHZhbHVlKTsKLSAgICAgICAgaWYoY3VycmVudE9mZnNldCA8PSBvZmZzZXQpewotICAgICAgICAgIG5ld1ZhbHVlID0gdjsKLSAgICAgICAgICBvZmZzZXQgPSBjdXJyZW50T2Zmc2V0OwotICAgICAgICB9IAotICAgICAgfSk7Ci0gICAgICByZXR1cm4gbmV3VmFsdWU7Ci0gICAgfQotICAgIGlmKHZhbHVlID4gdGhpcy5yYW5nZS5lbmQpIHJldHVybiB0aGlzLnJhbmdlLmVuZDsKLSAgICBpZih2YWx1ZSA8IHRoaXMucmFuZ2Uuc3RhcnQpIHJldHVybiB0aGlzLnJhbmdlLnN0YXJ0OwotICAgIHJldHVybiB2YWx1ZTsKLSAgfSwKLSAgc2V0VmFsdWU6IGZ1bmN0aW9uKHNsaWRlclZhbHVlLCBoYW5kbGVJZHgpewotICAgIGlmKCF0aGlzLmFjdGl2ZSkgewotICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgICAgPSB0aGlzLmhhbmRsZXNbaGFuZGxlSWR4XTsKLSAgICAgIHRoaXMuYWN0aXZlSGFuZGxlSWR4ID0gaGFuZGxlSWR4OwotICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTsKLSAgICB9Ci0gICAgaGFuZGxlSWR4ID0gaGFuZGxlSWR4IHx8IHRoaXMuYWN0aXZlSGFuZGxlSWR4IHx8IDA7Ci0gICAgaWYodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLnJlc3RyaWN0ZWQpIHsKLSAgICAgIGlmKChoYW5kbGVJZHg+MCkgJiYgKHNsaWRlclZhbHVlPHRoaXMudmFsdWVzW2hhbmRsZUlkeC0xXSkpCi0gICAgICAgIHNsaWRlclZhbHVlID0gdGhpcy52YWx1ZXNbaGFuZGxlSWR4LTFdOwotICAgICAgaWYoKGhhbmRsZUlkeCA8ICh0aGlzLmhhbmRsZXMubGVuZ3RoLTEpKSAmJiAoc2xpZGVyVmFsdWU+dGhpcy52YWx1ZXNbaGFuZGxlSWR4KzFdKSkKLSAgICAgICAgc2xpZGVyVmFsdWUgPSB0aGlzLnZhbHVlc1toYW5kbGVJZHgrMV07Ci0gICAgfQotICAgIHNsaWRlclZhbHVlID0gdGhpcy5nZXROZWFyZXN0VmFsdWUoc2xpZGVyVmFsdWUpOwotICAgIHRoaXMudmFsdWVzW2hhbmRsZUlkeF0gPSBzbGlkZXJWYWx1ZTsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZXNbMF07IC8vIGFzc3VyZSBiYWNrd2FyZHMgY29tcGF0Ci0gICAgCi0gICAgdGhpcy5oYW5kbGVzW2hhbmRsZUlkeF0uc3R5bGVbdGhpcy5pc1ZlcnRpY2FsKCkgPyAndG9wJyA6ICdsZWZ0J10gPSAKLSAgICAgIHRoaXMudHJhbnNsYXRlVG9QeChzbGlkZXJWYWx1ZSk7Ci0gICAgCi0gICAgdGhpcy5kcmF3U3BhbnMoKTsKLSAgICBpZighdGhpcy5kcmFnZ2luZyB8fCAhdGhpcy5ldmVudCkgdGhpcy51cGRhdGVGaW5pc2hlZCgpOwotICB9LAotICBzZXRWYWx1ZUJ5OiBmdW5jdGlvbihkZWx0YSwgaGFuZGxlSWR4KSB7Ci0gICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlc1toYW5kbGVJZHggfHwgdGhpcy5hY3RpdmVIYW5kbGVJZHggfHwgMF0gKyBkZWx0YSwgCi0gICAgICBoYW5kbGVJZHggfHwgdGhpcy5hY3RpdmVIYW5kbGVJZHggfHwgMCk7Ci0gIH0sCi0gIHRyYW5zbGF0ZVRvUHg6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgcmV0dXJuIE1hdGgucm91bmQoCi0gICAgICAoKHRoaXMudHJhY2tMZW5ndGgtdGhpcy5oYW5kbGVMZW5ndGgpLyh0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0KSkgKiAKLSAgICAgICh2YWx1ZSAtIHRoaXMucmFuZ2Uuc3RhcnQpKSArICJweCI7Ci0gIH0sCi0gIHRyYW5zbGF0ZVRvVmFsdWU6IGZ1bmN0aW9uKG9mZnNldCkgewotICAgIHJldHVybiAoKG9mZnNldC8odGhpcy50cmFja0xlbmd0aC10aGlzLmhhbmRsZUxlbmd0aCkgKiAKLSAgICAgICh0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0KSkgKyB0aGlzLnJhbmdlLnN0YXJ0KTsKLSAgfSwKLSAgZ2V0UmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKSB7Ci0gICAgdmFyIHYgPSB0aGlzLnZhbHVlcy5zb3J0QnkoUHJvdG90eXBlLkspOyAKLSAgICByYW5nZSA9IHJhbmdlIHx8IDA7Ci0gICAgcmV0dXJuICRSKHZbcmFuZ2VdLHZbcmFuZ2UrMV0pOwotICB9LAotICBtaW5pbXVtT2Zmc2V0OiBmdW5jdGlvbigpewotICAgIHJldHVybih0aGlzLmlzVmVydGljYWwoKSA/IHRoaXMuYWxpZ25ZIDogdGhpcy5hbGlnblgpOwotICB9LAotICBtYXhpbXVtT2Zmc2V0OiBmdW5jdGlvbigpewotICAgIHJldHVybih0aGlzLmlzVmVydGljYWwoKSA/Ci0gICAgICB0aGlzLnRyYWNrLm9mZnNldEhlaWdodCAtIHRoaXMuYWxpZ25ZIDogdGhpcy50cmFjay5vZmZzZXRXaWR0aCAtIHRoaXMuYWxpZ25YKTsKLSAgfSwgIAotICBpc1ZlcnRpY2FsOiAgZnVuY3Rpb24oKXsKLSAgICByZXR1cm4gKHRoaXMuYXhpcyA9PSAndmVydGljYWwnKTsKLSAgfSwKLSAgZHJhd1NwYW5zOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgc2xpZGVyID0gdGhpczsKLSAgICBpZih0aGlzLnNwYW5zKQotICAgICAgJFIoMCwgdGhpcy5zcGFucy5sZW5ndGgtMSkuZWFjaChmdW5jdGlvbihyKSB7IHNsaWRlci5zZXRTcGFuKHNsaWRlci5zcGFuc1tyXSwgc2xpZGVyLmdldFJhbmdlKHIpKSB9KTsKLSAgICBpZih0aGlzLm9wdGlvbnMuc3RhcnRTcGFuKQotICAgICAgdGhpcy5zZXRTcGFuKHRoaXMub3B0aW9ucy5zdGFydFNwYW4sCi0gICAgICAgICRSKDAsIHRoaXMudmFsdWVzLmxlbmd0aD4xID8gdGhpcy5nZXRSYW5nZSgwKS5taW4oKSA6IHRoaXMudmFsdWUgKSk7Ci0gICAgaWYodGhpcy5vcHRpb25zLmVuZFNwYW4pCi0gICAgICB0aGlzLnNldFNwYW4odGhpcy5vcHRpb25zLmVuZFNwYW4sIAotICAgICAgICAkUih0aGlzLnZhbHVlcy5sZW5ndGg+MSA/IHRoaXMuZ2V0UmFuZ2UodGhpcy5zcGFucy5sZW5ndGgtMSkubWF4KCkgOiB0aGlzLnZhbHVlLCB0aGlzLm1heGltdW0pKTsKLSAgfSwKLSAgc2V0U3BhbjogZnVuY3Rpb24oc3BhbiwgcmFuZ2UpIHsKLSAgICBpZih0aGlzLmlzVmVydGljYWwoKSkgewotICAgICAgc3Bhbi5zdHlsZS50b3AgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2Uuc3RhcnQpOwotICAgICAgc3Bhbi5zdHlsZS5oZWlnaHQgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcGFuLnN0eWxlLmxlZnQgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2Uuc3RhcnQpOwotICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMudHJhbnNsYXRlVG9QeChyYW5nZS5lbmQgLSByYW5nZS5zdGFydCk7Ci0gICAgfQotICB9LAotICB1cGRhdGVTdHlsZXM6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuaGFuZGxlcy5lYWNoKCBmdW5jdGlvbihoKXsgRWxlbWVudC5yZW1vdmVDbGFzc05hbWUoaCwgJ3NlbGVjdGVkJykgfSk7Ci0gICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5hY3RpdmVIYW5kbGUsICdzZWxlY3RlZCcpOwotICB9LAotICBzdGFydERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYoRXZlbnQuaXNMZWZ0Q2xpY2soZXZlbnQpKSB7Ci0gICAgICBpZighdGhpcy5kaXNhYmxlZCl7Ci0gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHZhciBoYW5kbGUgPSBFdmVudC5lbGVtZW50KGV2ZW50KTsKLSAgICAgICAgdmFyIHBvaW50ZXIgID0gW0V2ZW50LnBvaW50ZXJYKGV2ZW50KSwgRXZlbnQucG9pbnRlclkoZXZlbnQpXTsKLSAgICAgICAgaWYoaGFuZGxlPT10aGlzLnRyYWNrKSB7Ci0gICAgICAgICAgdmFyIG9mZnNldHMgID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCh0aGlzLnRyYWNrKTsgCi0gICAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy50cmFuc2xhdGVUb1ZhbHVlKCAKLSAgICAgICAgICAgKHRoaXMuaXNWZXJ0aWNhbCgpID8gcG9pbnRlclsxXS1vZmZzZXRzWzFdIDogcG9pbnRlclswXS1vZmZzZXRzWzBdKS0odGhpcy5oYW5kbGVMZW5ndGgvMikKLSAgICAgICAgICApKTsKLSAgICAgICAgICB2YXIgb2Zmc2V0cyAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuYWN0aXZlSGFuZGxlKTsKLSAgICAgICAgICB0aGlzLm9mZnNldFggPSAocG9pbnRlclswXSAtIG9mZnNldHNbMF0pOwotICAgICAgICAgIHRoaXMub2Zmc2V0WSA9IChwb2ludGVyWzFdIC0gb2Zmc2V0c1sxXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gZmluZCB0aGUgaGFuZGxlIChwcmV2ZW50cyBpc3N1ZXMgd2l0aCBTYWZhcmkpCi0gICAgICAgICAgd2hpbGUoKHRoaXMuaGFuZGxlcy5pbmRleE9mKGhhbmRsZSkgPT0gLTEpICYmIGhhbmRsZS5wYXJlbnROb2RlKSAKLSAgICAgICAgICAgIGhhbmRsZSA9IGhhbmRsZS5wYXJlbnROb2RlOwotICAgICAgICAKLSAgICAgICAgICB0aGlzLmFjdGl2ZUhhbmRsZSAgICA9IGhhbmRsZTsKLSAgICAgICAgICB0aGlzLmFjdGl2ZUhhbmRsZUlkeCA9IHRoaXMuaGFuZGxlcy5pbmRleE9mKHRoaXMuYWN0aXZlSGFuZGxlKTsKLSAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpOwotICAgICAgICAKLSAgICAgICAgICB2YXIgb2Zmc2V0cyAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuYWN0aXZlSGFuZGxlKTsKLSAgICAgICAgICB0aGlzLm9mZnNldFggPSAocG9pbnRlclswXSAtIG9mZnNldHNbMF0pOwotICAgICAgICAgIHRoaXMub2Zmc2V0WSA9IChwb2ludGVyWzFdIC0gb2Zmc2V0c1sxXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOwotICAgIH0KLSAgfSwKLSAgdXBkYXRlOiBmdW5jdGlvbihldmVudCkgewotICAgaWYodGhpcy5hY3RpdmUpIHsKLSAgICAgIGlmKCF0aGlzLmRyYWdnaW5nKSB0aGlzLmRyYWdnaW5nID0gdHJ1ZTsKLSAgICAgIHRoaXMuZHJhdyhldmVudCk7Ci0gICAgICAvLyBmaXggQXBwbGVXZWJLaXQgcmVuZGVyaW5nCi0gICAgICBpZihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdBcHBsZVdlYktpdCcpPjApIHdpbmRvdy5zY3JvbGxCeSgwLDApOwotICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICB9Ci0gIH0sCi0gIGRyYXc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIHBvaW50ZXIgPSBbRXZlbnQucG9pbnRlclgoZXZlbnQpLCBFdmVudC5wb2ludGVyWShldmVudCldOwotICAgIHZhciBvZmZzZXRzID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCh0aGlzLnRyYWNrKTsKLSAgICBwb2ludGVyWzBdIC09IHRoaXMub2Zmc2V0WCArIG9mZnNldHNbMF07Ci0gICAgcG9pbnRlclsxXSAtPSB0aGlzLm9mZnNldFkgKyBvZmZzZXRzWzFdOwotICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB0aGlzLnNldFZhbHVlKHRoaXMudHJhbnNsYXRlVG9WYWx1ZSggdGhpcy5pc1ZlcnRpY2FsKCkgPyBwb2ludGVyWzFdIDogcG9pbnRlclswXSApKTsKLSAgICBpZih0aGlzLmluaXRpYWxpemVkICYmIHRoaXMub3B0aW9ucy5vblNsaWRlKQotICAgICAgdGhpcy5vcHRpb25zLm9uU2xpZGUodGhpcy52YWx1ZXMubGVuZ3RoPjEgPyB0aGlzLnZhbHVlcyA6IHRoaXMudmFsdWUsIHRoaXMpOwotICB9LAotICBlbmREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKHRoaXMuYWN0aXZlICYmIHRoaXMuZHJhZ2dpbmcpIHsKLSAgICAgIHRoaXMuZmluaXNoRHJhZyhldmVudCwgdHJ1ZSk7Ci0gICAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgICB9Ci0gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKLSAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7Ci0gIH0sICAKLSAgZmluaXNoRHJhZzogZnVuY3Rpb24oZXZlbnQsIHN1Y2Nlc3MpIHsKLSAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwotICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKLSAgICB0aGlzLnVwZGF0ZUZpbmlzaGVkKCk7Ci0gIH0sCi0gIHVwZGF0ZUZpbmlzaGVkOiBmdW5jdGlvbigpIHsKLSAgICBpZih0aGlzLmluaXRpYWxpemVkICYmIHRoaXMub3B0aW9ucy5vbkNoYW5nZSkgCi0gICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2UodGhpcy52YWx1ZXMubGVuZ3RoPjEgPyB0aGlzLnZhbHVlcyA6IHRoaXMudmFsdWUsIHRoaXMpOwotICAgIHRoaXMuZXZlbnQgPSBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93YXIvanMvdW5pdHRlc3QuanMgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy91bml0dGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5NDFhZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dhci9qcy91bml0dGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8gICAgICAgICAgIChjKSAyMDA1IEpvbiBUaXJzZW4gKGh0dHA6Ly93d3cudGlyc2VuLmNvbSkKLS8vICAgICAgICAgICAoYykgMjAwNSBNaWNoYWVsIFNjaHVlcmlnIChodHRwOi8vd3d3LnNjaHVlcmlnLmRlL21pY2hhZWwvKQotLy8KLS8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZvciBmdWxsIGxpY2Vuc2UuCi0KLS8vIGV4cGVyaW1lbnRhbCwgRmlyZWZveC1vbmx5Ci1FdmVudC5zaW11bGF0ZU1vdXNlID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lKSB7Ci0gIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgcG9pbnRlclg6IDAsCi0gICAgcG9pbnRlclk6IDAsCi0gICAgYnV0dG9uczogMAotICB9LCBhcmd1bWVudHNbMl0gfHwge30pOwotICB2YXIgb0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7Ci0gIG9FdmVudC5pbml0TW91c2VFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRvY3VtZW50LmRlZmF1bHRWaWV3LCAKLSAgICBvcHRpb25zLmJ1dHRvbnMsIG9wdGlvbnMucG9pbnRlclgsIG9wdGlvbnMucG9pbnRlclksIG9wdGlvbnMucG9pbnRlclgsIG9wdGlvbnMucG9pbnRlclksIAotICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCAkKGVsZW1lbnQpKTsKLSAgCi0gIGlmKHRoaXMubWFyaykgRWxlbWVudC5yZW1vdmUodGhpcy5tYXJrKTsKLSAgdGhpcy5tYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gIHRoaXMubWFyay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKLSAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1hcmspOwotICB0aGlzLm1hcmsuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwotICB0aGlzLm1hcmsuc3R5bGUudG9wID0gb3B0aW9ucy5wb2ludGVyWSArICJweCI7Ci0gIHRoaXMubWFyay5zdHlsZS5sZWZ0ID0gb3B0aW9ucy5wb2ludGVyWCArICJweCI7Ci0gIHRoaXMubWFyay5zdHlsZS53aWR0aCA9ICI1cHgiOwotICB0aGlzLm1hcmsuc3R5bGUuaGVpZ2h0ID0gIjVweDsiOwotICB0aGlzLm1hcmsuc3R5bGUuYm9yZGVyVG9wID0gIjFweCBzb2xpZCByZWQ7IgotICB0aGlzLm1hcmsuc3R5bGUuYm9yZGVyTGVmdCA9ICIxcHggc29saWQgcmVkOyIKLSAgCi0gIGlmKHRoaXMuc3RlcCkKLSAgICBhbGVydCgnWycrbmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKSsnXSAnK2V2ZW50TmFtZSsnLycrVGVzdC5Vbml0Lmluc3BlY3Qob3B0aW9ucykpOwotICAKLSAgJChlbGVtZW50KS5kaXNwYXRjaEV2ZW50KG9FdmVudCk7Ci19OwotCi0vLyBOb3RlOiBEdWUgdG8gYSBmaXggaW4gRmlyZWZveCAxLjAuNS82IHRoYXQgcHJvYmFibHkgZml4ZWQgInRvbyBtdWNoIiwgdGhpcyBkb2Vzbid0IHdvcmsgaW4gMS4wLjYgb3IgRFAyLgotLy8gWW91IG5lZWQgdG8gZG93bmdyYWRlIHRvIDEuMC40IGZvciBub3cgdG8gZ2V0IHRoaXMgd29ya2luZwotLy8gU2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI4OTk0MCBmb3IgdGhlIGZpeCB0aGF0IGZpeGVkIHRvbyBtdWNoCi1FdmVudC5zaW11bGF0ZUtleSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSkgewotICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgIGN0cmxLZXk6IGZhbHNlLAotICAgIGFsdEtleTogZmFsc2UsCi0gICAgc2hpZnRLZXk6IGZhbHNlLAotICAgIG1ldGFLZXk6IGZhbHNlLAotICAgIGtleUNvZGU6IDAsCi0gICAgY2hhckNvZGU6IDAKLSAgfSwgYXJndW1lbnRzWzJdIHx8IHt9KTsKLQotICB2YXIgb0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIktleUV2ZW50cyIpOwotICBvRXZlbnQuaW5pdEtleUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAKLSAgICBvcHRpb25zLmN0cmxLZXksIG9wdGlvbnMuYWx0S2V5LCBvcHRpb25zLnNoaWZ0S2V5LCBvcHRpb25zLm1ldGFLZXksCi0gICAgb3B0aW9ucy5rZXlDb2RlLCBvcHRpb25zLmNoYXJDb2RlICk7Ci0gICQoZWxlbWVudCkuZGlzcGF0Y2hFdmVudChvRXZlbnQpOwotfTsKLQotRXZlbnQuc2ltdWxhdGVLZXlzID0gZnVuY3Rpb24oZWxlbWVudCwgY29tbWFuZCkgewotICBmb3IodmFyIGk9MDsgaTxjb21tYW5kLmxlbmd0aDsgaSsrKSB7Ci0gICAgRXZlbnQuc2ltdWxhdGVLZXkoZWxlbWVudCwna2V5cHJlc3MnLHtjaGFyQ29kZTpjb21tYW5kLmNoYXJDb2RlQXQoaSl9KTsKLSAgfQotfTsKLQotdmFyIFRlc3QgPSB7fQotVGVzdC5Vbml0ID0ge307Ci0KLS8vIHNlY3VyaXR5IGV4Y2VwdGlvbiB3b3JrYXJvdW5kCi1UZXN0LlVuaXQuaW5zcGVjdCA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgaW5mbyA9IFtdOwotCi0gIGlmKHR5cGVvZiBvYmo9PSJzdHJpbmciIHx8IAotICAgICB0eXBlb2Ygb2JqPT0ibnVtYmVyIikgewotICAgIHJldHVybiBvYmo7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yKHByb3BlcnR5IGluIG9iaikKLSAgICAgIGlmKHR5cGVvZiBvYmpbcHJvcGVydHldIT0iZnVuY3Rpb24iKQotICAgICAgICBpbmZvLnB1c2gocHJvcGVydHkgKyAnID0+ICcgKyAKLSAgICAgICAgICAodHlwZW9mIG9ialtwcm9wZXJ0eV0gPT0gInN0cmluZyIgPwotICAgICAgICAgICAgJyInICsgb2JqW3Byb3BlcnR5XSArICciJyA6Ci0gICAgICAgICAgICBvYmpbcHJvcGVydHldKSk7Ci0gIH0KLQotICByZXR1cm4gKCInIiArIG9iaiArICInICMiICsgdHlwZW9mIG9iaiArIAotICAgICI6IHsiICsgaW5mby5qb2luKCIsICIpICsgIn0iKTsKLX0KLQotVGVzdC5Vbml0LkxvZ2dlciA9IENsYXNzLmNyZWF0ZSgpOwotVGVzdC5Vbml0LkxvZ2dlci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxvZykgewotICAgIHRoaXMubG9nID0gJChsb2cpOwotICAgIGlmICh0aGlzLmxvZykgewotICAgICAgdGhpcy5fY3JlYXRlTG9nVGFibGUoKTsKLSAgICB9Ci0gIH0sCi0gIHN0YXJ0OiBmdW5jdGlvbih0ZXN0TmFtZSkgewotICAgIGlmICghdGhpcy5sb2cpIHJldHVybjsKLSAgICB0aGlzLnRlc3ROYW1lID0gdGVzdE5hbWU7Ci0gICAgdGhpcy5sYXN0TG9nTGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7Ci0gICAgdGhpcy5zdGF0dXNDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0aGlzLm5hbWVDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0aGlzLm5hbWVDZWxsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRlc3ROYW1lKSk7Ci0gICAgdGhpcy5tZXNzYWdlQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7Ci0gICAgdGhpcy5sYXN0TG9nTGluZS5hcHBlbmRDaGlsZCh0aGlzLnN0YXR1c0NlbGwpOwotICAgIHRoaXMubGFzdExvZ0xpbmUuYXBwZW5kQ2hpbGQodGhpcy5uYW1lQ2VsbCk7Ci0gICAgdGhpcy5sYXN0TG9nTGluZS5hcHBlbmRDaGlsZCh0aGlzLm1lc3NhZ2VDZWxsKTsKLSAgICB0aGlzLmxvZ2xpbmVzLmFwcGVuZENoaWxkKHRoaXMubGFzdExvZ0xpbmUpOwotICB9LAotICBmaW5pc2g6IGZ1bmN0aW9uKHN0YXR1cywgc3VtbWFyeSkgewotICAgIGlmICghdGhpcy5sb2cpIHJldHVybjsKLSAgICB0aGlzLmxhc3RMb2dMaW5lLmNsYXNzTmFtZSA9IHN0YXR1czsKLSAgICB0aGlzLnN0YXR1c0NlbGwuaW5uZXJIVE1MID0gc3RhdHVzOwotICAgIHRoaXMubWVzc2FnZUNlbGwuaW5uZXJIVE1MID0gdGhpcy5fdG9IVE1MKHN1bW1hcnkpOwotICB9LAotICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgaWYgKCF0aGlzLmxvZykgcmV0dXJuOwotICAgIHRoaXMubWVzc2FnZUNlbGwuaW5uZXJIVE1MID0gdGhpcy5fdG9IVE1MKG1lc3NhZ2UpOwotICB9LAotICBzdW1tYXJ5OiBmdW5jdGlvbihzdW1tYXJ5KSB7Ci0gICAgaWYgKCF0aGlzLmxvZykgcmV0dXJuOwotICAgIHRoaXMubG9nc3VtbWFyeS5pbm5lckhUTUwgPSB0aGlzLl90b0hUTUwoc3VtbWFyeSk7Ci0gIH0sCi0gIF9jcmVhdGVMb2dUYWJsZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sb2cuaW5uZXJIVE1MID0KLSAgICAnPGRpdiBpZD0ibG9nc3VtbWFyeSI+PC9kaXY+JyArCi0gICAgJzx0YWJsZSBpZD0ibG9ndGFibGUiPicgKwotICAgICc8dGhlYWQ+PHRyPjx0aD5TdGF0dXM8L3RoPjx0aD5UZXN0PC90aD48dGg+TWVzc2FnZTwvdGg+PC90cj48L3RoZWFkPicgKwotICAgICc8dGJvZHkgaWQ9ImxvZ2xpbmVzIj48L3Rib2R5PicgKwotICAgICc8L3RhYmxlPic7Ci0gICAgdGhpcy5sb2dzdW1tYXJ5ID0gJCgnbG9nc3VtbWFyeScpCi0gICAgdGhpcy5sb2dsaW5lcyA9ICQoJ2xvZ2xpbmVzJyk7Ci0gIH0sCi0gIF90b0hUTUw6IGZ1bmN0aW9uKHR4dCkgewotICAgIHJldHVybiB0eHQuZXNjYXBlSFRNTCgpLnJlcGxhY2UoL1xuL2csIjxici8+Iik7Ci0gIH0KLX0KLQotVGVzdC5Vbml0LlJ1bm5lciA9IENsYXNzLmNyZWF0ZSgpOwotVGVzdC5Vbml0LlJ1bm5lci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKHRlc3RjYXNlcykgewotICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgdGVzdExvZzogJ3Rlc3Rsb2cnCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICB0aGlzLm9wdGlvbnMucmVzdWx0c1VSTCA9IHRoaXMucGFyc2VSZXN1bHRzVVJMUXVlcnlQYXJhbWV0ZXIoKTsKLSAgICBpZiAodGhpcy5vcHRpb25zLnRlc3RMb2cpIHsKLSAgICAgIHRoaXMub3B0aW9ucy50ZXN0TG9nID0gJCh0aGlzLm9wdGlvbnMudGVzdExvZykgfHwgbnVsbDsKLSAgICB9Ci0gICAgaWYodGhpcy5vcHRpb25zLnRlc3RzKSB7Ci0gICAgICB0aGlzLnRlc3RzID0gW107Ci0gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmKC9edGVzdC8udGVzdCh0aGlzLm9wdGlvbnMudGVzdHNbaV0pKSB7Ci0gICAgICAgICAgdGhpcy50ZXN0cy5wdXNoKG5ldyBUZXN0LlVuaXQuVGVzdGNhc2UodGhpcy5vcHRpb25zLnRlc3RzW2ldLCB0ZXN0Y2FzZXNbdGhpcy5vcHRpb25zLnRlc3RzW2ldXSwgdGVzdGNhc2VzWyJzZXR1cCJdLCB0ZXN0Y2FzZXNbInRlYXJkb3duIl0pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodGhpcy5vcHRpb25zLnRlc3QpIHsKLSAgICAgICAgdGhpcy50ZXN0cyA9IFtuZXcgVGVzdC5Vbml0LlRlc3RjYXNlKHRoaXMub3B0aW9ucy50ZXN0LCB0ZXN0Y2FzZXNbdGhpcy5vcHRpb25zLnRlc3RdLCB0ZXN0Y2FzZXNbInNldHVwIl0sIHRlc3RjYXNlc1sidGVhcmRvd24iXSldOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy50ZXN0cyA9IFtdOwotICAgICAgICBmb3IodmFyIHRlc3RjYXNlIGluIHRlc3RjYXNlcykgewotICAgICAgICAgIGlmKC9edGVzdC8udGVzdCh0ZXN0Y2FzZSkpIHsKLSAgICAgICAgICAgIHRoaXMudGVzdHMucHVzaChuZXcgVGVzdC5Vbml0LlRlc3RjYXNlKHRlc3RjYXNlLCB0ZXN0Y2FzZXNbdGVzdGNhc2VdLCB0ZXN0Y2FzZXNbInNldHVwIl0sIHRlc3RjYXNlc1sidGVhcmRvd24iXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB0aGlzLmN1cnJlbnRUZXN0ID0gMDsKLSAgICB0aGlzLmxvZ2dlciA9IG5ldyBUZXN0LlVuaXQuTG9nZ2VyKHRoaXMub3B0aW9ucy50ZXN0TG9nKTsKLSAgICBzZXRUaW1lb3V0KHRoaXMucnVuVGVzdHMuYmluZCh0aGlzKSwgMTAwMCk7Ci0gIH0sCi0gIHBhcnNlUmVzdWx0c1VSTFF1ZXJ5UGFyYW1ldGVyOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5wYXJzZVF1ZXJ5KClbInJlc3VsdHNVUkwiXTsKLSAgfSwKLSAgLy8gUmV0dXJuczoKLSAgLy8gICJFUlJPUiIgaWYgdGhlcmUgd2FzIGFuIGVycm9yLAotICAvLyAgIkZBSUxVUkUiIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUsIG9yCi0gIC8vICAiU1VDQ0VTUyIgaWYgdGhlcmUgd2FzIG5laXRoZXIKLSAgZ2V0UmVzdWx0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaGFzRmFpbHVyZSA9IGZhbHNlOwotICAgIGZvcih2YXIgaT0wO2k8dGhpcy50ZXN0cy5sZW5ndGg7aSsrKSB7Ci0gICAgICBpZiAodGhpcy50ZXN0c1tpXS5lcnJvcnMgPiAwKSB7Ci0gICAgICAgIHJldHVybiAiRVJST1IiOwotICAgICAgfQotICAgICAgaWYgKHRoaXMudGVzdHNbaV0uZmFpbHVyZXMgPiAwKSB7Ci0gICAgICAgIGhhc0ZhaWx1cmUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGFzRmFpbHVyZSkgewotICAgICAgcmV0dXJuICJGQUlMVVJFIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJTVUNDRVNTIjsKLSAgICB9Ci0gIH0sCi0gIHBvc3RSZXN1bHRzOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5vcHRpb25zLnJlc3VsdHNVUkwpIHsKLSAgICAgIG5ldyBBamF4LlJlcXVlc3QodGhpcy5vcHRpb25zLnJlc3VsdHNVUkwsIAotICAgICAgICB7IG1ldGhvZDogJ2dldCcsIHBhcmFtZXRlcnM6ICdyZXN1bHQ9JyArIHRoaXMuZ2V0UmVzdWx0KCksIGFzeW5jaHJvbm91czogZmFsc2UgfSk7Ci0gICAgfQotICB9LAotICBydW5UZXN0czogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRlc3QgPSB0aGlzLnRlc3RzW3RoaXMuY3VycmVudFRlc3RdOwotICAgIGlmICghdGVzdCkgewotICAgICAgLy8gZmluaXNoZWQhCi0gICAgICB0aGlzLnBvc3RSZXN1bHRzKCk7Ci0gICAgICB0aGlzLmxvZ2dlci5zdW1tYXJ5KHRoaXMuc3VtbWFyeSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoIXRlc3QuaXNXYWl0aW5nKSB7Ci0gICAgICB0aGlzLmxvZ2dlci5zdGFydCh0ZXN0Lm5hbWUpOwotICAgIH0KLSAgICB0ZXN0LnJ1bigpOwotICAgIGlmKHRlc3QuaXNXYWl0aW5nKSB7Ci0gICAgICB0aGlzLmxvZ2dlci5tZXNzYWdlKCJXYWl0aW5nIGZvciAiICsgdGVzdC50aW1lVG9XYWl0ICsgIm1zIik7Ci0gICAgICBzZXRUaW1lb3V0KHRoaXMucnVuVGVzdHMuYmluZCh0aGlzKSwgdGVzdC50aW1lVG9XYWl0IHx8IDEwMDApOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmxvZ2dlci5maW5pc2godGVzdC5zdGF0dXMoKSwgdGVzdC5zdW1tYXJ5KCkpOwotICAgICAgdGhpcy5jdXJyZW50VGVzdCsrOwotICAgICAgLy8gdGFpbCByZWN1cnNpdmUsIGhvcGVmdWxseSB0aGUgYnJvd3NlciB3aWxsIHNraXAgdGhlIHN0YWNrZnJhbWUKLSAgICAgIHRoaXMucnVuVGVzdHMoKTsKLSAgICB9Ci0gIH0sCi0gIHN1bW1hcnk6IGZ1bmN0aW9uKCkgewotICAgIHZhciBhc3NlcnRpb25zID0gMDsKLSAgICB2YXIgZmFpbHVyZXMgPSAwOwotICAgIHZhciBlcnJvcnMgPSAwOwotICAgIHZhciBtZXNzYWdlcyA9IFtdOwotICAgIGZvcih2YXIgaT0wO2k8dGhpcy50ZXN0cy5sZW5ndGg7aSsrKSB7Ci0gICAgICBhc3NlcnRpb25zICs9ICAgdGhpcy50ZXN0c1tpXS5hc3NlcnRpb25zOwotICAgICAgZmFpbHVyZXMgICArPSAgIHRoaXMudGVzdHNbaV0uZmFpbHVyZXM7Ci0gICAgICBlcnJvcnMgICAgICs9ICAgdGhpcy50ZXN0c1tpXS5lcnJvcnM7Ci0gICAgfQotICAgIHJldHVybiAoCi0gICAgICB0aGlzLnRlc3RzLmxlbmd0aCArICIgdGVzdHMsICIgKyAKLSAgICAgIGFzc2VydGlvbnMgKyAiIGFzc2VydGlvbnMsICIgKyAKLSAgICAgIGZhaWx1cmVzICAgKyAiIGZhaWx1cmVzLCAiICsKLSAgICAgIGVycm9ycyAgICAgKyAiIGVycm9ycyIpOwotICB9Ci19Ci0KLVRlc3QuVW5pdC5Bc3NlcnRpb25zID0gQ2xhc3MuY3JlYXRlKCk7Ci1UZXN0LlVuaXQuQXNzZXJ0aW9ucy5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuYXNzZXJ0aW9ucyA9IDA7Ci0gICAgdGhpcy5mYWlsdXJlcyAgID0gMDsKLSAgICB0aGlzLmVycm9ycyAgICAgPSAwOwotICAgIHRoaXMubWVzc2FnZXMgICA9IFtdOwotICB9LAotICBzdW1tYXJ5OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gKAotICAgICAgdGhpcy5hc3NlcnRpb25zICsgIiBhc3NlcnRpb25zLCAiICsgCi0gICAgICB0aGlzLmZhaWx1cmVzICAgKyAiIGZhaWx1cmVzLCAiICsKLSAgICAgIHRoaXMuZXJyb3JzICAgICArICIgZXJyb3JzIiArICJcbiIgKwotICAgICAgdGhpcy5tZXNzYWdlcy5qb2luKCJcbiIpKTsKLSAgfSwKLSAgcGFzczogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5hc3NlcnRpb25zKys7Ci0gIH0sCi0gIGZhaWw6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICB0aGlzLmZhaWx1cmVzKys7Ci0gICAgdGhpcy5tZXNzYWdlcy5wdXNoKCJGYWlsdXJlOiAiICsgbWVzc2FnZSk7Ci0gIH0sCi0gIGVycm9yOiBmdW5jdGlvbihlcnJvcikgewotICAgIHRoaXMuZXJyb3JzKys7Ci0gICAgdGhpcy5tZXNzYWdlcy5wdXNoKGVycm9yLm5hbWUgKyAiOiAiKyBlcnJvci5tZXNzYWdlICsgIigiICsgVGVzdC5Vbml0Lmluc3BlY3QoZXJyb3IpICsiKSIpOwotICB9LAotICBzdGF0dXM6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmZhaWx1cmVzID4gMCkgcmV0dXJuICdmYWlsZWQnOwotICAgIGlmICh0aGlzLmVycm9ycyA+IDApIHJldHVybiAnZXJyb3InOwotICAgIHJldHVybiAncGFzc2VkJzsKLSAgfSwKLSAgYXNzZXJ0OiBmdW5jdGlvbihleHByZXNzaW9uKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydDogZ290ICInICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwcmVzc2lvbikgKyAnIic7Ci0gICAgdHJ5IHsgZXhwcmVzc2lvbiA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0RXF1YWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAiYXNzZXJ0RXF1YWwiOwotICAgIHRyeSB7IChleHBlY3RlZCA9PSBhY3R1YWwpID8gdGhpcy5wYXNzKCkgOgotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBleHBlY3RlZCAiJyArIFRlc3QuVW5pdC5pbnNwZWN0KGV4cGVjdGVkKSArIAotICAgICAgICAnIiwgYWN0dWFsICInICsgVGVzdC5Vbml0Lmluc3BlY3QoYWN0dWFsKSArICciJyk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0Tm90RXF1YWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAiYXNzZXJ0Tm90RXF1YWwiOwotICAgIHRyeSB7IChleHBlY3RlZCAhPSBhY3R1YWwpID8gdGhpcy5wYXNzKCkgOiAKLSAgICAgIHRoaXMuZmFpbChtZXNzYWdlICsgJzogZ290ICInICsgVGVzdC5Vbml0Lmluc3BlY3QoYWN0dWFsKSArICciJyk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0TnVsbDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydE51bGwnCi0gICAgdHJ5IHsgKG9iaj09bnVsbCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBnb3QgIicgKyBUZXN0LlVuaXQuaW5zcGVjdChvYmopICsgJyInKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRIaWRkZW46IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1sxXSB8fCAnYXNzZXJ0SGlkZGVuJzsKLSAgICB0aGlzLmFzc2VydEVxdWFsKCJub25lIiwgZWxlbWVudC5zdHlsZS5kaXNwbGF5LCBtZXNzYWdlKTsKLSAgfSwKLSAgYXNzZXJ0Tm90TnVsbDogZnVuY3Rpb24ob2JqZWN0KSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydE5vdE51bGwnOwotICAgIHRoaXMuYXNzZXJ0KG9iamVjdCAhPSBudWxsLCBtZXNzYWdlKTsKLSAgfSwKLSAgYXNzZXJ0SW5zdGFuY2VPZjogZnVuY3Rpb24oZXhwZWN0ZWQsIGFjdHVhbCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICdhc3NlcnRJbnN0YW5jZU9mJzsKLSAgICB0cnkgeyAKLSAgICAgIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAiOiBvYmplY3Qgd2FzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZSIpOyB9Ci0gICAgY2F0Y2goZSkgeyB0aGlzLmVycm9yKGUpOyB9IAotICB9LAotICBhc3NlcnROb3RJbnN0YW5jZU9mOiBmdW5jdGlvbihleHBlY3RlZCwgYWN0dWFsKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgJ2Fzc2VydE5vdEluc3RhbmNlT2YnOwotICAgIHRyeSB7IAotICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAiOiBvYmplY3Qgd2FzIGFuIGluc3RhbmNlIG9mIHRoZSBub3QgZXhwZWN0ZWQgdHlwZSIpOyB9Ci0gICAgY2F0Y2goZSkgeyB0aGlzLmVycm9yKGUpOyB9IAotICB9LAotICBfaXNWaXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgaWYoIWVsZW1lbnQucGFyZW50Tm9kZSkgcmV0dXJuIHRydWU7Ci0gICAgdGhpcy5hc3NlcnROb3ROdWxsKGVsZW1lbnQpOwotICAgIGlmKGVsZW1lbnQuc3R5bGUgJiYgRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpID09ICdub25lJykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlKGVsZW1lbnQucGFyZW50Tm9kZSk7Ci0gIH0sCi0gIGFzc2VydE5vdFZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB0aGlzLmFzc2VydCghdGhpcy5faXNWaXNpYmxlKGVsZW1lbnQpLCBUZXN0LlVuaXQuaW5zcGVjdChlbGVtZW50KSArICIgd2FzIG5vdCBoaWRkZW4gYW5kIGRpZG4ndCBoYXZlIGEgaGlkZGVuIHBhcmVudCBlaXRoZXIuICIgKyAoIiIgfHwgYXJndW1lbnRzWzFdKSk7Ci0gIH0sCi0gIGFzc2VydFZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB0aGlzLmFzc2VydCh0aGlzLl9pc1Zpc2libGUoZWxlbWVudCksIFRlc3QuVW5pdC5pbnNwZWN0KGVsZW1lbnQpICsgIiB3YXMgbm90IHZpc2libGUuICIgKyAoIiIgfHwgYXJndW1lbnRzWzFdKSk7Ci0gIH0KLX0KLQotVGVzdC5Vbml0LlRlc3RjYXNlID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoVGVzdC5Vbml0LlRlc3RjYXNlLnByb3RvdHlwZSwgVGVzdC5Vbml0LkFzc2VydGlvbnMucHJvdG90eXBlKSwgewotICBpbml0aWFsaXplOiBmdW5jdGlvbihuYW1lLCB0ZXN0LCBzZXR1cCwgdGVhcmRvd24pIHsKLSAgICBUZXN0LlVuaXQuQXNzZXJ0aW9ucy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5iaW5kKHRoaXMpKCk7Ci0gICAgdGhpcy5uYW1lICAgICAgICAgICA9IG5hbWU7Ci0gICAgdGhpcy50ZXN0ICAgICAgICAgICA9IHRlc3QgfHwgZnVuY3Rpb24oKSB7fTsKLSAgICB0aGlzLnNldHVwICAgICAgICAgID0gc2V0dXAgfHwgZnVuY3Rpb24oKSB7fTsKLSAgICB0aGlzLnRlYXJkb3duICAgICAgID0gdGVhcmRvd24gfHwgZnVuY3Rpb24oKSB7fTsKLSAgICB0aGlzLmlzV2FpdGluZyAgICAgID0gZmFsc2U7Ci0gICAgdGhpcy50aW1lVG9XYWl0ICAgICA9IDEwMDA7Ci0gIH0sCi0gIHdhaXQ6IGZ1bmN0aW9uKHRpbWUsIG5leHRQYXJ0KSB7Ci0gICAgdGhpcy5pc1dhaXRpbmcgPSB0cnVlOwotICAgIHRoaXMudGVzdCA9IG5leHRQYXJ0OwotICAgIHRoaXMudGltZVRvV2FpdCA9IHRpbWU7Ci0gIH0sCi0gIHJ1bjogZnVuY3Rpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmICghdGhpcy5pc1dhaXRpbmcpIHRoaXMuc2V0dXAuYmluZCh0aGlzKSgpOwotICAgICAgICB0aGlzLmlzV2FpdGluZyA9IGZhbHNlOwotICAgICAgICB0aGlzLnRlc3QuYmluZCh0aGlzKSgpOwotICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYoIXRoaXMuaXNXYWl0aW5nKSB7Ci0gICAgICAgICAgdGhpcy50ZWFyZG93bi5iaW5kKHRoaXMpKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goZSkgeyB0aGlzLmVycm9yKGUpOyB9Ci0gIH0KLX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL0N1cnJlbmN5RWRpdG9yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvYmluZGluZy9DdXJyZW5jeUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE3ZjlkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL0N1cnJlbmN5RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlFZGl0b3JTdXBwb3J0OwotaW1wb3J0IGphdmEudXRpbC5DdXJyZW5jeTsKLQotLyoqCi0gKiBBIFByb3BlcnR5IGVkaXRvciBmb3IgY29udmVydGluZyBpbnN0YW5jZXMgb2YgamF2YS51dGlsLkN1cnJlbmN5Ci0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE0LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBDdXJyZW5jeUVkaXRvciBleHRlbmRzIFByb3BlcnR5RWRpdG9yU3VwcG9ydCB7Ci0gICAgcHVibGljIHZvaWQgc2V0QXNUZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayh0ZXh0KSkgewotICAgICAgICAgICAgc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKEN1cnJlbmN5LmdldEluc3RhbmNlKHRleHQpKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbmQganVzdCBzZXQgdG8gbnVsbAotICAgICAgICAgICAgc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzVGV4dCgpIHsKLSAgICAgICAgQ3VycmVuY3kgYyA9IChDdXJyZW5jeSlnZXRWYWx1ZSgpOwotICAgICAgICBpZihjID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjLmdldEN1cnJlbmN5Q29kZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL2JpbmRpbmcvR3JhaWxzRGF0YUJpbmRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL2JpbmRpbmcvR3JhaWxzRGF0YUJpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYxNjgzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL0dyYWlsc0RhdGFCaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLk11dGFibGVQcm9wZXJ0eVZhbHVlczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLlByb3BlcnR5VmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5wcm9wZXJ0eWVkaXRvcnMuQ3VzdG9tRGF0ZUVkaXRvcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLnByb3BlcnR5ZWRpdG9ycy5Mb2NhbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5TZXJ2bGV0UmVxdWVzdERhdGFCaW5kZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlclByb3BlcnR5VmFsdWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5zdXBwb3J0LkJ5dGVBcnJheU11bHRpcGFydEZpbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIubXVsdGlwYXJ0LnN1cHBvcnQuU3RyaW5nTXVsdGlwYXJ0RmlsZUVkaXRvcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuUmVxdWVzdENvbnRleHRVdGlsczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIGRhdGEgYmluZGVyIHRoYXQgaGFuZGxlcyBiaW5kaW5nIGRhdGVzIHRoYXQgYXJlIHNwZWNpZmllZCB3aXRoIGEgInN0cnVjdCItbGlrZSBzeW50YXggaW4gcmVxdWVzdCBwYXJhbWV0ZXJzLgotICogRm9yIGV4YW1wbGUgZm9yIGEgc2V0IG9mIGZpZWxkcyBkZWZpbmVkIGFzOgotICoKLSAqIDxjb2RlPgotICAgICAqIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im15RGF0ZV95ZWFyIiB2YWx1ZT0iMjAwNSIgLz4KLSAgICAgKiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJteURhdGVfbW9udGgiIHZhbHVlPSI2IiAvPgotICAgICAqIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im15RGF0ZV9kYXkiIHZhbHVlPSIxMiIgLz4KLSAgICAgKiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJteURhdGVfaG91ciIgdmFsdWU9IjEzIiAvPgotICAgICAqIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im15RGF0ZV9taW51dGUiIHZhbHVlPSI0NSIgLz4KLSAqIDwvY29kZT4KLSAqCi0gKiBUaGlzIHdvdWxkIHNldCB0aGUgcHJvcGVydHkgIm15RGF0ZSIgb2YgdHlwZSBqYXZhLnV0aWwuRGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA1LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNEYXRhQmluZGVyIGV4dGVuZHMgU2VydmxldFJlcXVlc3REYXRhQmluZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coR3JhaWxzRGF0YUJpbmRlci5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEdyYWlsc0RhdGFCaW5kZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0ICAgICB0YXJnZXQgb2JqZWN0IHRvIGJpbmQgb250bwotICAgICAqIEBwYXJhbSBvYmplY3ROYW1lIG9iamVjdE5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzRGF0YUJpbmRlcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgb2JqZWN0TmFtZSkgewotICAgICAgICBzdXBlcih0YXJnZXQsIG9iamVjdE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciBjcmVhdGluZyBhIEdyYWlsc0RhdGFCaW5kZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZQotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHJldHVybiBBIEdyYWlsc0RhdGFCaW5kZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEdyYWlsc0RhdGFCaW5kZXIgY3JlYXRlQmluZGVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBvYmplY3ROYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBHcmFpbHNEYXRhQmluZGVyIGJpbmRlciA9IGNyZWF0ZUJpbmRlcih0YXJnZXQsb2JqZWN0TmFtZSk7Ci0gICAgICAgIGJpbmRlci5yZWdpc3RlckN1c3RvbUVkaXRvciggRGF0ZS5jbGFzcywgbmV3IEN1c3RvbURhdGVFZGl0b3IoRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoIERhdGVGb3JtYXQuU0hPUlQsIFJlcXVlc3RDb250ZXh0VXRpbHMuZ2V0TG9jYWxlKHJlcXVlc3QpICksdHJ1ZSkgKTsKLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBHcmFpbHNEYXRhQmluZGVyIGluc3RhbmNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICogQHBhcmFtIG9iamVjdE5hbWUKLSAgICAgKiBAcmV0dXJuIEEgR3JhaWxzRGF0YUJpbmRlciBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JhaWxzRGF0YUJpbmRlciBjcmVhdGVCaW5kZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG9iamVjdE5hbWUpIHsKLSAgICAgICAgR3JhaWxzRGF0YUJpbmRlciBiaW5kZXIgPSBuZXcgR3JhaWxzRGF0YUJpbmRlcih0YXJnZXQsb2JqZWN0TmFtZSk7Ci0gICAgICAgIGJpbmRlci5yZWdpc3RlckN1c3RvbUVkaXRvciggYnl0ZVtdLmNsYXNzLCBuZXcgQnl0ZUFycmF5TXVsdGlwYXJ0RmlsZUVkaXRvcigpKTsKLSAgICAgICAgYmluZGVyLnJlZ2lzdGVyQ3VzdG9tRWRpdG9yKCBTdHJpbmcuY2xhc3MsIG5ldyBTdHJpbmdNdWx0aXBhcnRGaWxlRWRpdG9yKCkpOwotICAgICAgICBiaW5kZXIucmVnaXN0ZXJDdXN0b21FZGl0b3IoIEN1cnJlbmN5LmNsYXNzLCBuZXcgQ3VycmVuY3lFZGl0b3IoKSk7Ci0gICAgICAgIGJpbmRlci5yZWdpc3RlckN1c3RvbUVkaXRvciggTG9jYWxlLmNsYXNzLCBuZXcgTG9jYWxlRWRpdG9yKCkpOwotICAgICAgICBiaW5kZXIucmVnaXN0ZXJDdXN0b21FZGl0b3IoIFRpbWVab25lLmNsYXNzLCBuZXcgVGltZVpvbmVFZGl0b3IoKSk7Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIE11dGFibGVQcm9wZXJ0eVZhbHVlcyBtcHZzID0gbmV3IFNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyUHJvcGVydHlWYWx1ZXMocmVxdWVzdCk7Ci0gICAgICAgIGNoZWNrTXVsdGlwYXJ0RmlsZXMocmVxdWVzdCwgbXB2cyk7Ci0KLSAgICAgICAgY2hlY2tTdHJ1Y3R1cmVkRGF0ZURlZmluaXRpb25zKHJlcXVlc3QsbXB2cyk7Ci0gICAgICAgIHN1cGVyLmRvQmluZChtcHZzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTdHJ1Y3R1cmVkRGF0ZURlZmluaXRpb25zKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIE11dGFibGVQcm9wZXJ0eVZhbHVlcyBtcHZzKSB7Ci0KLSAgICAgICAgUHJvcGVydHlWYWx1ZVtdIHB2cyA9IG1wdnMuZ2V0UHJvcGVydHlWYWx1ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5VmFsdWUgcHYgPSBwdnNbaV07Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHB2LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gc3VwZXIuZ2V0QmVhbldyYXBwZXIoKS5nZXRQcm9wZXJ0eVR5cGUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYSBkYXRlIGNoZWNrIHRoYXQgaXQgaGFzbid0IGdvdCBzdHJ1Y3R1cmVkIHBhcmFtZXRlcnMgaW4gdGhlIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgZGF0ZSBmb3JtYXQKLSAgICAgICAgICAgICAgICBpZih0eXBlID09IERhdGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZWFyID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihwcm9wZXJ0eU5hbWUgKyAiX3llYXIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9udGggPSBJbnRlZ2VyLnBhcnNlSW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHByb3BlcnR5TmFtZSArICJfbW9udGgiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF5ID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihwcm9wZXJ0eU5hbWUgKyAiX2RheSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VyID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihwcm9wZXJ0eU5hbWUgKyAiX2hvdXIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWludXRlID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihwcm9wZXJ0eU5hbWUgKyAiX21pbnV0ZSIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcih5ZWFyLG1vbnRoIC0gMSxkYXksaG91cixtaW51dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXB2cy5zZXRQcm9wZXJ0eVZhbHVlQXQobmV3IFByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLGMuZ2V0VGltZSgpKSxpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIlVuYWJsZSB0byBwYXJzZSBzdHJ1Y3R1cmVkIGRhdGUgZnJvbSByZXF1ZXN0IGZvciBkYXRlIFsiK3Byb3BlcnR5TmFtZSsiXSIsbmZlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbiBpcGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL1RpbWVab25lRWRpdG9yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvYmluZGluZy9UaW1lWm9uZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY3NWIyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL1RpbWVab25lRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5DdXJyZW5jeTsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUVkaXRvclN1cHBvcnQ7Ci0KLS8qKgotICogQSBQcm9wZXJ0eSBlZGl0b3IgZm9yIGNvbnZlcnRpbmcgaW5zdGFuY2VzIG9mIGphdmEudXRpbC5UaW1lWm9uZQotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDIwLUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lWm9uZUVkaXRvciAgZXh0ZW5kcyBQcm9wZXJ0eUVkaXRvclN1cHBvcnQgIHsKLSAgICBwdWJsaWMgdm9pZCBzZXRBc1RleHQoU3RyaW5nIHRleHQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKHRleHQpKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0VmFsdWUoVGltZVpvbmUuZ2V0VGltZVpvbmUodGV4dCkpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlIGFuZCBqdXN0IHNldCB0byBudWxsCi0gICAgICAgICAgICBzZXRWYWx1ZShudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNUZXh0KCkgewotICAgICAgICBUaW1lWm9uZSB0eiA9IChUaW1lWm9uZSlnZXRWYWx1ZSgpOwotICAgICAgICBpZih0eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHouZ2V0SUQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9lcnJvcnMvR3JhaWxzRXhjZXB0aW9uUmVzb2x2ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9lcnJvcnMvR3JhaWxzRXhjZXB0aW9uUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMjU0NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvZXJyb3JzL0dyYWlsc0V4Y2VwdGlvblJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuZXJyb3JzOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5TZXJ2bGV0Q29udGV4dEF3YXJlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTW9kZWxBbmRWaWV3OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuaGFuZGxlci5TaW1wbGVNYXBwaW5nRXhjZXB0aW9uUmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLS8qKgotICogIEV4Y2VwdGlvbiByZXNvbHZlciB0aGF0IHdyYXBzIGFueSBydW50aW1lIGV4Y2VwdGlvbnMgd2l0aCBhIEdyYWlsc1dyYXBwZWRFeGNlcHRpb24gaW5zdGFuY2UKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMjIgRGVjLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNFeGNlcHRpb25SZXNvbHZlciAgZXh0ZW5kcyBTaW1wbGVNYXBwaW5nRXhjZXB0aW9uUmVzb2x2ZXIgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dEF3YXJlIHsKLSAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuaGFuZGxlci5TaW1wbGVNYXBwaW5nRXhjZXB0aW9uUmVzb2x2ZXIjcmVzb2x2ZUV4Y2VwdGlvbihqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkV4Y2VwdGlvbikKLSAgICAgICovCi0gICAgcHVibGljIE1vZGVsQW5kVmlldyByZXNvbHZlRXhjZXB0aW9uKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBPYmplY3QgaGFuZGxlciwgRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIE1vZGVsQW5kVmlldyBtdiA9IHN1cGVyLnJlc29sdmVFeGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGhhbmRsZXIsIGV4KTsKLSAgICAgICAgR3JhaWxzV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZ3dyZXggPSBuZXcgR3JhaWxzV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oc2VydmxldENvbnRleHQsZXgpOwotICAgICAgICBtdi5hZGRPYmplY3QoImV4Y2VwdGlvbiIsZ3dyZXgpOwotICAgICAgICByZXR1cm4gbXY7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0Q29udGV4dChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgewotICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL2Vycm9ycy9HcmFpbHNXcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL2Vycm9ycy9HcmFpbHNXcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQ2Njc5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9lcnJvcnMvR3JhaWxzV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuZXJyb3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5HcmFpbHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogIEFuIGV4Y2VwdGlvbiB0aGF0IHdyYXBzIGEgR3JhaWxzIFJ1bnRpbWVFeGNlcHRpb24gYW5kIGF0dGVtcHRzIHRvIGV4dHJhY3QgbW9yZSByZWxldmVudCBkaWFnbm9zdGljIG1lc3NhZ2VzIGZyb20gdGhlIHN0YWNrIHRyYWNlCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDIyIERlYywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBHcmFpbHNFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQQVJTRV9ERVRBSUxTX1NURVAxID0gUGF0dGVybi5jb21waWxlKCJcXCgoXFx3KylcXC5ncm9vdnk6KFxcZCspXFwpIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQQVJTRV9ERVRBSUxTX1NURVAyID0gUGF0dGVybi5jb21waWxlKCJhdFxcc3sxfShcXHcrKVxcJF9jbG9zdXJlXFxkK1xcLmRvQ2FsbFxcKFxcMTooXFxkKylcXCkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJFRklYID0gIi9XRUItSU5GL2dyYWlscy1hcHAvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HICA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdyYWlsc1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmNsYXNzKTsKLSAgICBwcml2YXRlIFRocm93YWJsZSB0OwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9ICJVbmtub3duIjsKLSAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gLSAxOwotICAgIHByaXZhdGUgU3RyaW5nIHN0YWNrVHJhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjb2RlU25pcHBldCA9IG5ldyBTdHJpbmdbMF07Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dAotICAgICAqIEBwYXJhbSB0Ci0gICAgICovCi0gICAgcHVibGljIEdyYWlsc1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBUaHJvd2FibGUgdCkgewotICAgICAgICBzdXBlcih0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgICAgIHRoaXMudCA9IHQ7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ICA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotICAgICAgICB0aGlzLnQucHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgdGhpcy5zdGFja1RyYWNlID0gc3cudG9TdHJpbmcoKTsKLQotICAgICAgICBNYXRjaGVyIG0xID0gUEFSU0VfREVUQUlMU19TVEVQMS5tYXRjaGVyKHN0YWNrVHJhY2UpOwotICAgICAgICBNYXRjaGVyIG0yID0gUEFSU0VfREVUQUlMU19TVEVQMi5tYXRjaGVyKHN0YWNrVHJhY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYobTEuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBtMS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBJbnRlZ2VyLnBhcnNlSW50KG0xLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYobTIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBtMi5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBJbnRlZ2VyLnBhcnNlSW50KG0yLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleCkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLQotICAgICAgICBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZihnZXRMaW5lTnVtYmVyKCkgPiAtMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5ncm9vdnkiOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmxQcmVmaXggPSBVUkxfUFJFRklYOwotICAgICAgICAgICAgICAgIGlmKEdyYWlsc0NsYXNzVXRpbHMuaXNDb250cm9sbGVyQ2xhc3MoY2xhc3NOYW1lKSB8fCBHcmFpbHNDbGFzc1V0aWxzLmlzUGFnZUZsb3dDbGFzcyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVybFByZWZpeCArPSAiL2NvbnRyb2xsZXJzLyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoR3JhaWxzQ2xhc3NVdGlscy5pc1RhZ0xpYkNsYXNzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsUHJlZml4ICs9ICIvdGFnbGliLyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoR3JhaWxzQ2xhc3NVdGlscy5pc1NlcnZpY2UoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgIHVybFByZWZpeCArPSAiL3NlcnZpY2VzLyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSh1cmxQcmVmaXggKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluICkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudExpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoY3VycmVudExpbmUgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudExpbmVOdW1iZXIgPSByZWFkZXIuZ2V0TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudExpbmVOdW1iZXIgPT0gdGhpcy5saW5lTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjdXJyZW50TGluZU51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6ICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjdXJyZW50TGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjdXJyZW50TGluZU51bWJlciA9PSB0aGlzLmxpbmVOdW1iZXIgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjdXJyZW50TGluZU51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6ICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjdXJyZW50TGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZVNuaXBwZXQgPSBidWYudG9TdHJpbmcoKS5zcGxpdCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy53YXJuKCJbR3JhaWxzV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb25dIEkvTyBlcnJvciByZWFkaW5nIGxpbmUgZGlhZ25vc3RpY3M6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZihyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29kZVNuaXBwZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvZGVTbmlwcGV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGluZU51bWJlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhY2tUcmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YWNrVHJhY2VUZXh0KCkgewotICAgICAgICByZXR1cm4gc3RhY2tUcmFjZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiNnZXRNZXNzYWdlKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gdC5nZXRNZXNzYWdlKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQWJzdHJhY3REeW5hbWljQ29udHJvbGxlck1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNDb250cm9sbGVyTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjViNzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNDb250cm9sbGVyTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3M7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5BYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgZHluYW1pYyBjb250cm9sbGVyIG1ldGhvZHMgdG8gaW1wbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNCwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REeW5hbWljQ29udHJvbGxlck1ldGhvZCBleHRlbmRzCi0gICAgICAgIEFic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24gewotCi0gICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotCi0gICAgcHVibGljIEFic3RyYWN0RHluYW1pY0NvbnRyb2xsZXJNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgc3VwZXIobWV0aG9kTmFtZSk7Ci0gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY0NvbnRyb2xsZXJQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9BYnN0cmFjdER5bmFtaWNDb250cm9sbGVyUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4YWEyNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0Fic3RyYWN0RHluYW1pY0NvbnRyb2xsZXJQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkFic3RyYWN0RHluYW1pY1Byb3BlcnR5OwotLyoqCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgZHluYW1pYyBjb250cm9sbGVyIHByb3BlcnRpZXMgdG8gaW1wbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNCwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REeW5hbWljQ29udHJvbGxlclByb3BlcnR5Ci0JZXh0ZW5kcyBBYnN0cmFjdER5bmFtaWNQcm9wZXJ0eQotCXsKLQotCXByb3RlY3RlZCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLQlwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLQotCXB1YmxpYyBBYnN0cmFjdER5bmFtaWNDb250cm9sbGVyUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSxIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotCQlzdXBlcihwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXQoT2JqZWN0IG9iamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQmluZER5bmFtaWNNZXRob2QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQmluZER5bmFtaWNNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzMWEyOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0JpbmREeW5hbWljTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLm1ldGFjbGFzczsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLmJpbmRpbmcuR3JhaWxzRGF0YUJpbmRlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLk11dGFibGVQcm9wZXJ0eVZhbHVlczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLlByb3BlcnR5VmFsdWVzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZHluYW1pYyBtZXRob2QgcHJlc2VudCBpbiBjb250cm9sbGVycyBhbGxvd2luZyBkYXRhIGJpbmRpbmcgZnJvbSBhIG1hcCB0byBhIHRhcmdldCBpbnN0YW5jZS4gRXhhbXBsZToKLSAqCi0gKiA8Y29kZT4KLSAqICAgICAgICAgZGVmIGEgPSBuZXcgQWNjb3VudCgpCi0gKiAgICAgICAgIGJpbmREYXRhKCBhLCB0aGlzLnBhcmFtcyApCi0gKiA8L2NvZGU+Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTAtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEJpbmREeW5hbWljTWV0aG9kIGV4dGVuZHMgQWJzdHJhY3REeW5hbWljQ29udHJvbGxlck1ldGhvZCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1NJR05BVFVSRSA9ICJiaW5kRGF0YSI7Ci0KLSAgICBwdWJsaWMgQmluZER5bmFtaWNNZXRob2QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgc3VwZXIoTUVUSE9EX1NJR05BVFVSRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0KLQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSwgdGFyZ2V0LmdldENsYXNzKCksIGFyZ3VtZW50cyk7Ci0gICAgICAgIGlmKGFyZ3VtZW50c1swXSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgW3RhcmdldF0gaXMgcmVxdWlyZWQgYnkgbWV0aG9kIFtiaW5kXSBvbiBjbGFzcyBbIit0YXJnZXQuZ2V0Q2xhc3MoKSsiXSIpOwotCi0gICAgICAgIE9iamVjdCB0YXJnZXRPYmplY3QgPSBhcmd1bWVudHNbMF07Ci0gICAgICAgIE9iamVjdCBiaW5kUGFyYW1zID0gYXJndW1lbnRzWzFdOwotCi0gICAgICAgIEdyYWlsc0RhdGFCaW5kZXIgZGF0YUJpbmRlcjsKLSAgICAgICAgaWYoYmluZFBhcmFtcyBpbnN0YW5jZW9mIEdyYWlsc1BhcmFtZXRlck1hcCkgewotICAgICAgICAgICAgR3JhaWxzUGFyYW1ldGVyTWFwIHBhcmFtZXRlck1hcCA9IChHcmFpbHNQYXJhbWV0ZXJNYXApYmluZFBhcmFtczsKLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gcGFyYW1ldGVyTWFwLmdldFJlcXVlc3QoKTsKLSAgICAgICAgICAgIGRhdGFCaW5kZXIgPSBHcmFpbHNEYXRhQmluZGVyLmNyZWF0ZUJpbmRlcih0YXJnZXRPYmplY3QsIHRhcmdldE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSxyZXF1ZXN0KTsgCi0gICAgICAgICAgICBkYXRhQmluZGVyLmJpbmQocmVxdWVzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihiaW5kUGFyYW1zIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBkYXRhQmluZGVyID0gR3JhaWxzRGF0YUJpbmRlci5jcmVhdGVCaW5kZXIodGFyZ2V0T2JqZWN0LCB0YXJnZXRPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkscmVxdWVzdCk7Ci0gICAgICAgICAgICBkYXRhQmluZGVyLmJpbmQoKEh0dHBTZXJ2bGV0UmVxdWVzdClhcmd1bWVudHNbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoYmluZFBhcmFtcyBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgZGF0YUJpbmRlciA9IG5ldyBHcmFpbHNEYXRhQmluZGVyKHRhcmdldE9iamVjdCwgdGFyZ2V0T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzIHB2ID0gbmV3IE11dGFibGVQcm9wZXJ0eVZhbHVlcygoTWFwKWJpbmRQYXJhbXMpOwotICAgICAgICAgICAgZGF0YUJpbmRlci5iaW5kKHB2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFCaW5kZXIgPSBHcmFpbHNEYXRhQmluZGVyLmNyZWF0ZUJpbmRlcih0YXJnZXRPYmplY3QsIHRhcmdldE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSxyZXF1ZXN0KTsKLSAgICAgICAgICAgIGRhdGFCaW5kZXIuYmluZChyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0T2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQ2hhaW5EeW5hbWljTWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0NoYWluRHluYW1pY01ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjhiMTE2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQ2hhaW5EeW5hbWljTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzU2NhZmZvbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuRmxhc2hTY29wZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzQ29udHJvbGxlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuZXhjZXB0aW9ucy5Db250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgImNoYWluIiBDb250cm9sbGVyIG1ldGhvZCBmb3IgYWN0aW9uIGNoYWluaW5nCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgQ2hhaW5EeW5hbWljTWV0aG9kIGV4dGVuZHMgQWJzdHJhY3REeW5hbWljQ29udHJvbGxlck1ldGhvZCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ2hhaW5EeW5hbWljTWV0aG9kLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAiY2hhaW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0NPTlRST0xMRVIgPSAiY29udHJvbGxlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfQUNUSU9OID0gImFjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1BBUkFNUyA9ICJwYXJhbXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0VSUk9SUyA9ICJlcnJvcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEFSR1VNRU5UX01PREVMID0gIm1vZGVsIjsKLQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NIQUlOX01PREVMID0gImNoYWluTW9kZWwiOwotCi0gICAgcHJpdmF0ZSBHcmFpbHNDb250cm9sbGVySGVscGVyIGhlbHBlcjsKLQotICAgIHB1YmxpYyBDaGFpbkR5bmFtaWNNZXRob2QoR3JhaWxzQ29udHJvbGxlckhlbHBlciBoZWxwZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIHN1cGVyKE1FVEhPRF9TSUdOQVRVUkUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgaWYoaGVscGVyID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBhcmd1bWVudCAnaGVscGVyJyBjYW5ub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cykgewotICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID09IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihNRVRIT0RfU0lHTkFUVVJFLHRhcmdldC5nZXRDbGFzcygpLGFyZ3VtZW50cyk7Ci0KLSAgICAgICAgT2JqZWN0IGFjdGlvblJlZjsKLSAgICAgICAgU3RyaW5nIGNvbnRyb2xsZXJOYW1lOwotICAgICAgICBPYmplY3QgaWQ7Ci0gICAgICAgIE1hcCBwYXJhbXM7Ci0gICAgICAgIE1hcCBtb2RlbDsKLSAgICAgICAgRXJyb3JzIGVycm9yczsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IGNvbnRyb2xsZXIgPSAoR3Jvb3Z5T2JqZWN0KXRhcmdldDsKLQotICAgICAgICBpZihhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIE1hcCBhcmdNYXAgPSAoTWFwKWFyZ3VtZW50c1swXTsKLSAgICAgICAgICAgIGFjdGlvblJlZiA9IGFyZ01hcC5nZXQoQVJHVU1FTlRfQUNUSU9OKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJOYW1lID0gKFN0cmluZylhcmdNYXAuZ2V0KEFSR1VNRU5UX0NPTlRST0xMRVIpOwotICAgICAgICAgICAgaWQgPSAgYXJnTWFwLmdldChBUkdVTUVOVF9JRCk7Ci0gICAgICAgICAgICBwYXJhbXMgPSAoTWFwKWFyZ01hcC5nZXQoQVJHVU1FTlRfUEFSQU1TKTsKLSAgICAgICAgICAgIG1vZGVsID0gKE1hcClhcmdNYXAuZ2V0KEFSR1VNRU5UX01PREVMKTsKLSAgICAgICAgICAgIGVycm9ycyA9IChFcnJvcnMpYXJnTWFwLmdldChBUkdVTUVOVF9FUlJPUlMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSx0YXJnZXQuZ2V0Q2xhc3MoKSxhcmd1bWVudHMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBsYWNlIHRoZSBjaGFpbiBtb2RlbCBpbiBmbGFzaCBzY29wZQotICAgICAgICBHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMgYXR0cnMgPSBoZWxwZXIuZ2V0R3JhaWxzQXR0cmlidXRlcygpOwotICAgICAgICBGbGFzaFNjb3BlIGZzID0gYXR0cnMuZ2V0Rmxhc2hTY29wZShyZXF1ZXN0KTsKLSAgICAgICAgaWYoZnMuY29udGFpbnNLZXkoUFJPUEVSVFlfQ0hBSU5fTU9ERUwpKSB7Ci0gICAgICAgICAgICBNYXAgY2hhaW5Nb2RlbCA9IChNYXApZnMuZ2V0KFBST1BFUlRZX0NIQUlOX01PREVMKTsKLSAgICAgICAgICAgIGlmKGNoYWluTW9kZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYWluTW9kZWwucHV0QWxsKG1vZGVsKTsKLSAgICAgICAgICAgICAgICBtb2RlbCA9IGNoYWluTW9kZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmcy5wdXQoUFJPUEVSVFlfQ0hBSU5fTU9ERUwsIG1vZGVsKTsKLQotICAgICAgICAvLyBpZiB0aGVyZSBhcmUgZXJyb3JzIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBlcnJvcnMKLSAgICAgICAgRXJyb3JzIGNvbnRyb2xsZXJFcnJvcnMgPSAoRXJyb3JzKWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoIENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5FUlJPUlNfUFJPUEVSVFkgKTsKLSAgICAgICAgaWYoY29udHJvbGxlckVycm9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyRXJyb3JzLmFkZEFsbEVycm9ycyhlcnJvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29udHJvbGxlci5zZXRQcm9wZXJ0eSggQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkVSUk9SU19QUk9QRVJUWSwgZXJyb3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBhY3Rpb25OYW1lID0gbnVsbDsKLSAgICAgICAgaWYoYWN0aW9uUmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgIGFjdGlvbk5hbWUgPSAoU3RyaW5nKWFjdGlvblJlZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGFjdGlvblJlZiBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLSAgICAgICAgICAgIENsb3N1cmUgYyA9IChDbG9zdXJlKWFjdGlvblJlZjsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wID0gR3JhaWxzQ2xhc3NVdGlscy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JGb3JWYWx1ZSh0YXJnZXQsYyk7Ci0gICAgICAgICAgICBpZihwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb25OYW1lID0gcHJvcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBHcmFpbHNTY2FmZm9sZGVyIHNjYWZmb2xkZXIgPSBoZWxwZXIuZ2V0U2NhZmZvbGRlckZvckNvbnRyb2xsZXIodGFyZ2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZihzY2FmZm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbk5hbWUgPSBzY2FmZm9sZGVyLmdldEFjdGlvbk5hbWUoYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoYWN0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYWN0dWFsVXJpID0gbmV3IFN0cmluZ0J1ZmZlcihhdHRycy5nZXRBcHBsaWNhdGlvblVyaShyZXF1ZXN0KSk7Ci0gICAgICAgICAgICBpZihjb250cm9sbGVyTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsVXJpLmFwcGVuZCgnLycpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb250cm9sbGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxVcmkuYXBwZW5kKGF0dHJzLmdldENvbnRyb2xsZXJVcmkocmVxdWVzdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWN0dWFsVXJpLmFwcGVuZCgnLycpCi0gICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGFjdGlvbk5hbWUpOwotICAgICAgICAgICAgaWYoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdHVhbFVyaS5hcHBlbmQoJy8nKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxVcmkuYXBwZW5kKCc/Jyk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyYW1zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmkuYXBwZW5kKG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJz0nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBhcmFtcy5nZXQobmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBpZihpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFVyaS5hcHBlbmQoJyYnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRHluYW1pYyBtZXRob2QgW2NoYWluXSByZWRpcmVjdGluZyByZXF1ZXN0IHRvIFsiK2FjdHVhbFVyaSsiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRSZWRpcmVjdChyZXNwb25zZS5lbmNvZGVSZWRpcmVjdFVSTChhY3R1YWxVcmkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciByZWRpcmVjdGluZyByZXF1ZXN0IGZvciB1cmwgWyIrYWN0dWFsVXJpKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJBY3Rpb24gbm90IGZvdW5kIGluIHJlZGlyZWN0IGZvciBuYW1lIFsiK2FjdGlvbk5hbWUrIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9Db250cm9sbGVyRHluYW1pY01ldGhvZHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTE0NjAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9Db250cm9sbGVyRHluYW1pY01ldGhvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3M7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb250cm9sbGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5BYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkdlbmVyaWNEeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3MuR3Jvb3Z5RHluYW1pY01ldGhvZHNJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZy5HcmFpbHNTY2FmZm9sZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuRmxhc2hTY29wZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzQ29udHJvbGxlckhlbHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTW9kZWxBbmRWaWV3OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLS8qKgotICogQWRkcyBkeW5hbWljIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgZm9yIEdyYWlscyBDb250cm9sbGVycwotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjQsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcyBleHRlbmRzCi0JR3Jvb3Z5RHluYW1pY01ldGhvZHNJbnRlcmNlcHRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1BST1BFUlRZID0gInJlcXVlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ09OVEVYVCA9ICJzZXJ2bGV0Q29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBU0hfU0NPUEVfUFJPUEVSVFkgPSAiZmxhc2giOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQUlMU19BVFRSSUJVVEVTID0gImdyYWlsc0F0dHJpYnV0ZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQUlMU19BUFBMSUNBVElPTiA9ICJncmFpbHNBcHBsaWNhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfUFJPUEVSVFkgPSAicmVzcG9uc2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkRFUl9WSUVXX1BST1BFUlRZID0gInJlbmRlclZpZXciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SU19QUk9QRVJUWSA9ICJlcnJvcnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBU19FUlJPUlNfTUVUSE9EID0gImhhc0Vycm9ycyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfQU5EX1ZJRVdfUFJPUEVSVFkgPSAibW9kZWxBbmRWaWV3IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVJJX1BST1BFUlRZID0gImFjdGlvblVyaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTExFUl9VUklfUFJPUEVSVFkgPSAiY29udHJvbGxlclVyaSI7Ci0KLQotICAgIHByb3RlY3RlZCBHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzOwotCXByb3RlY3RlZCBHcmFpbHNTY2FmZm9sZGVyIHNjYWZmb2xkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHNjYWZmb2xkaW5nOwotCi0KLQotICAgIHB1YmxpYyBDb250cm9sbGVyRHluYW1pY01ldGhvZHMoIEdyb292eU9iamVjdCBjb250cm9sbGVyLEdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgaGVscGVyLEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotCi0gICAgICAgIHRoaXMuY29udHJvbGxlckNsYXNzID0gaGVscGVyLmdldENvbnRyb2xsZXJDbGFzc0J5TmFtZShjb250cm9sbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhZGQgZHluYW1pYyBwcm9wZXJ0aWVzCi0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5KHJlcXVlc3QscmVzcG9uc2UpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KG5ldyBHZXRTZXNzaW9uRHluYW1pY1Byb3BlcnR5KHJlcXVlc3QscmVzcG9uc2UpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KG5ldyBHZW5lcmljRHluYW1pY1Byb3BlcnR5KFJFUVVFU1RfUFJPUEVSVFksIEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyxuZXcgR3JhaWxzSHR0cFNlcnZsZXRSZXF1ZXN0KCByZXF1ZXN0LGNvbnRyb2xsZXIpLHRydWUpICk7Ci0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eShSRVNQT05TRV9QUk9QRVJUWSwgSHR0cFNlcnZsZXRSZXNwb25zZS5jbGFzcyxyZXNwb25zZSx0cnVlKSApOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkobmV3IEdlbmVyaWNEeW5hbWljUHJvcGVydHkoU0VSVkxFVF9DT05URVhULCBTZXJ2bGV0Q29udGV4dC5jbGFzcyxoZWxwZXIuZ2V0U2VydmxldENvbnRleHQoKSx0cnVlKSApOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkobmV3IEdlbmVyaWNEeW5hbWljUHJvcGVydHkoRkxBU0hfU0NPUEVfUFJPUEVSVFksIEZsYXNoU2NvcGUuY2xhc3MsaGVscGVyLmdldEdyYWlsc0F0dHJpYnV0ZXMoKS5nZXRGbGFzaFNjb3BlKHJlcXVlc3QpLGZhbHNlKSApOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkobmV3IEdlbmVyaWNEeW5hbWljUHJvcGVydHkoRVJST1JTX1BST1BFUlRZLCBFcnJvcnMuY2xhc3MsIG51bGwsIGZhbHNlKSk7Ci0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eShNT0RFTF9BTkRfVklFV19QUk9QRVJUWSwgTW9kZWxBbmRWaWV3LmNsYXNzLG51bGwsZmFsc2UpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KG5ldyBHZW5lcmljRHluYW1pY1Byb3BlcnR5KEdSQUlMU19BVFRSSUJVVEVTLCBHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuY2xhc3MsaGVscGVyLmdldEdyYWlsc0F0dHJpYnV0ZXMoKSx0cnVlKSk7Ci0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eShHUkFJTFNfQVBQTElDQVRJT04sIEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzLGhlbHBlci5nZXRHcmFpbHNBdHRyaWJ1dGVzKCkuZ2V0R3JhaWxzQXBwbGljYXRpb24oKSx0cnVlKSk7ICAgICAgICAKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KG5ldyBHZW5lcmljRHluYW1pY1Byb3BlcnR5KEFDVElPTl9VUklfUFJPUEVSVFksU3RyaW5nLmNsYXNzLG51bGwsZmFsc2UpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KG5ldyBHZW5lcmljRHluYW1pY1Byb3BlcnR5KENPTlRST0xMRVJfVVJJX1BST1BFUlRZLFN0cmluZy5jbGFzcyxudWxsLGZhbHNlKSk7Ci0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eShSRU5ERVJfVklFV19QUk9QRVJUWSxCb29sZWFuLmNsYXNzLCBCb29sZWFuLlRSVUUsZmFsc2UpKTsKLQotICAgICAgICAvLyBhZGQgZHluYW1pYyBtZXRob2RzCi0gICAgICAgIGFkZER5bmFtaWNNZXRob2RJbnZvY2F0aW9uKCBuZXcgUmVkaXJlY3REeW5hbWljTWV0aG9kKGhlbHBlcixyZXF1ZXN0LHJlc3BvbnNlKSApOwotICAgICAgICBhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbiggbmV3IENoYWluRHluYW1pY01ldGhvZChoZWxwZXIsIHJlcXVlc3QsIHJlc3BvbnNlICkgKTsKLSAgICAgICAgYWRkRHluYW1pY01ldGhvZEludm9jYXRpb24oIG5ldyBSZW5kZXJEeW5hbWljTWV0aG9kKGhlbHBlcixyZXF1ZXN0LHJlc3BvbnNlKSk7Ci0gICAgICAgIGFkZER5bmFtaWNNZXRob2RJbnZvY2F0aW9uKCBuZXcgQmluZER5bmFtaWNNZXRob2QocmVxdWVzdCxyZXNwb25zZSkpOwotCi0gICAgICAgIC8vIHRoZSBoYXNFcnJvcnMoKSBkeW5hbWljIG1ldGhvZCB0aGF0IGNoZWNrcyBvZiB0aGVyZSBhcmUgYW55IGVycm9ycyBpbiB0aGUgY29udHJvbGxlcgotICAgICAgICBhZGREeW5hbWljTWV0aG9kSW52b2NhdGlvbiggbmV3IEFic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24oSEFTX0VSUk9SU19NRVRIT0QpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3VtZW50cykgewotICAgICAgICAgICAgICAgIEdyb292eU9iamVjdCBjb250cm9sbGVyID0gKEdyb292eU9iamVjdCl0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgRXJyb3JzIGVycm9ycyA9IChFcnJvcnMpY29udHJvbGxlci5nZXRQcm9wZXJ0eShFUlJPUlNfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZXJyb3JzLmhhc0Vycm9ycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5zY2FmZm9sZGluZyA9IHRoaXMuY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKTsKLQotICAgICAgICAvLyBpZiB0aGUgY29udHJvbGxlciBpcyBzY2FmZm9sZGluZyBnZXQgdGhlIHNjYWZmb2xkZXIsIHRoZW4gbG9vcCB0aHJvdWdoIGFsbCB0aGUKLSAgICAgICAgLy8gc3VwcG9ydCBhY3Rpb25zIGJ5IHRoZSBzY2FmZm9sZGVyIGFuZCByZWdpc3RlciBkeW5hbWljIHByb3BlcnRpZXMgZm9yIHRob3NlIHRoYXQgZG9uJ3QgZXhpc3QKLSAgICAgICAgaWYodGhpcy5zY2FmZm9sZGluZykgewotICAgICAgICAgICAgdGhpcy5zY2FmZm9sZGVyID0gaGVscGVyLmdldFNjYWZmb2xkZXJGb3JDb250cm9sbGVyKGNvbnRyb2xsZXJDbGFzcy5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgICAgIGlmKHRoaXMuc2NhZmZvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2NhZmZvbGRlciBpcyBudWxsIHdoZW4gY29udHJvbGxlciBzY2FmZm9sZCBwcm9wZXJ0eSBpcyBzZXQgdG8gJ3RydWUnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBzY2FmZm9sZEFjdGlvbnMgPSB0aGlzLnNjYWZmb2xkZXIuZ2V0U3VwcG9ydGVkQWN0aW9uTmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NhZmZvbGRBY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5nZXRQcm9wZXJ0eShzY2FmZm9sZEFjdGlvbnNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShuZXcgR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eSgJc2NhZmZvbGRBY3Rpb25zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zdXJlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FmZm9sZGVyLmdldEFjdGlvbihjb250cm9sbGVyLHNjYWZmb2xkQWN0aW9uc1tpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0dldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVlNzM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLS8qKgotICogQSBkeW5hbWljIHByb3BlcnR5IHRoYXQgYWRkcyBhICJwYXJhbXMiIG1hcCB0byBhIGNvbnRyb2xsZXIgZm9yIGFjY2Vzc2luZyByZXF1ZXN0IGFuZCBjb250cm9sbGVyIHBhcmFtZXRlcnMKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI0LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZXRQYXJhbXNEeW5hbWljUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdER5bmFtaWNDb250cm9sbGVyUHJvcGVydHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicGFyYW1zIjsKLQlwcml2YXRlIEdyYWlsc1BhcmFtZXRlck1hcCBwYXJhbXNNYXA7Ci0JCi0JcHVibGljIEdldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotCQlzdXBlcihQUk9QRVJUWV9OQU1FLHJlcXVlc3QsIHJlc3BvbnNlKTsKLQkJdGhpcy5wYXJhbXNNYXAgPSBuZXcgR3JhaWxzUGFyYW1ldGVyTWFwKHJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBhcmFtc01hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBQUk9QRVJUWV9OQU1FICsgIicgb2YgY2xhc3MgJyIrb2JqZWN0LmdldENsYXNzKCkrIicgaXMgcmVhZC1vbmx5ISIgKTsgCi0JfQkKLQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIE9iamVjdCBwYXJhbVZhbHVlKSB7Ci0JCXRoaXMucGFyYW1zTWFwLnB1dCggcGFyYW1OYW1lLHBhcmFtVmFsdWUgKTsKLQl9CQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtcyhNYXAgcGFyYW1zKSB7Ci0JCXRoaXMucGFyYW1zTWFwLnB1dEFsbChwYXJhbXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvR2V0U2Vzc2lvbkR5bmFtaWNQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9HZXRTZXNzaW9uRHluYW1pY1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZWFkMjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9HZXRTZXNzaW9uRHluYW1pY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEEgZHluYW1pYyBwcm9wZXJ0eSB0aGF0IGFkZHMgYSAic2Vzc2lvbiIgbWFwIHRvIGEgY29udHJvbGxlciBmb3IgYWNjZXNzaW5nIHRoZSBIdHRwIFNlc3Npb24KLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI0LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZXRTZXNzaW9uRHluYW1pY1Byb3BlcnR5IGV4dGVuZHMgQWJzdHJhY3REeW5hbWljQ29udHJvbGxlclByb3BlcnR5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAic2Vzc2lvbiI7Ci0JcHJpdmF0ZSBIdHRwU2Vzc2lvbk1hcCBzZXNzaW9uTWFwOwotCi0JcHVibGljIEdldFNlc3Npb25EeW5hbWljUHJvcGVydHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLQkJc3VwZXIoUFJPUEVSVFlfTkFNRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotCQl0aGlzLnNlc3Npb25NYXAgPSBuZXcgSHR0cFNlc3Npb25NYXAoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLnNlc3Npb25NYXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KE9iamVjdCBvYmplY3QsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlByb3BlcnR5ICciICsgUFJPUEVSVFlfTkFNRSArICInIG9mIGNsYXNzICciK29iamVjdC5nZXRDbGFzcygpKyInIGlzIHJlYWQtb25seSEiICk7Ci0JfQotCQotCS8qKgotCSAqIFdyYXBzIHRoZSBIdHRwU2Vzc29pbiBpbiBhIG1hcAotCSAqIAotCSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotCSAqIEBzaW5jZSBPY3QgMjQsIDIwMDUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEh0dHBTZXNzaW9uTWFwIGltcGxlbWVudHMgTWFwIHsKLQkJCQkKLQkJSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JCQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlpZihzZXNzaW9uID09IG51bGwpCi0JCQkJcmV0dXJuIDA7CQkJCi0JCQkvLyBjb3VudCBhcyB0aGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHNpemUgZnJvbSB0aGUgc2Vzc2lvbiBkaXJlY3RseQotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvcihFbnVtZXJhdGlvbiBlID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO2UuaGFzTW9yZUVsZW1lbnRzKCk7Y291bnQrKykge30KLQkJCXJldHVybiBjb3VudDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgICAgICBpZihzZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOwotICAgICAgICAgICByZXR1cm4gIWUuaGFzTW9yZUVsZW1lbnRzKCk7Ci0gICAgICAgfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQkJCWlmKCEoa2V5IGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgJ3Nlc3Npb24nIHByb3BlcnR5IGtleSAnIitrZXkrIicgbXVzdCBiZSBhIHN0cmluZyB2YWx1ZSIpOwotCQkJCi0JCQlpZihzZXNzaW9uID09IG51bGwgfHwgc2Vzc2lvbi5pc05ldygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJT2JqZWN0IGF0dHIgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgoU3RyaW5nKWtleSk7Ci0JCQlpZihhdHRyID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJCWlmKHNlc3Npb24gPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWZvcihFbnVtZXJhdGlvbiBlID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO2UuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGN1cnJlbnRLZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJCQlPYmplY3QgY3VycmVudCA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKGN1cnJlbnRLZXkpOwotCQkJCWlmKGN1cnJlbnQuZXF1YWxzKHZhbHVlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JCQlpZighKGtleSBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICdzZXNzaW9uJyBwcm9wZXJ0eSBrZXkgJyIra2V5KyInIG11c3QgYmUgYSBzdHJpbmcgdmFsdWUiKTsKLQkJCQotCi0gICAgICAgICAgIGlmKHNlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICAgICBpZihzZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotCQkJcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKChTdHJpbmcpa2V5KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJaWYoIShrZXkgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAnc2Vzc2lvbicgcHJvcGVydHkga2V5ICciK2tleSsiJyBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlIik7Ci0JCQkKLQkJCWlmKHNlc3Npb24gPT0gbnVsbCkKLQkJCQlzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7Ci0JCQkKLQkJCXNlc3Npb24uc2V0QXR0cmlidXRlKChTdHJpbmcpa2V5LCB2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCQlpZighKGtleSBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICdzZXNzaW9uJyBwcm9wZXJ0eSBrZXkgJyIra2V5KyInIG11c3QgYmUgYSBzdHJpbmcgdmFsdWUiKTsKLQotCQkJaWYoc2Vzc2lvbiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlPYmplY3QgdmFsdWUgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgoU3RyaW5nKWtleSk7Ci0JCQlpZih2YWx1ZSAhPSBudWxsKQotCQkJCXNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKChTdHJpbmcpa2V5KTsKLQkJCQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBzZXNzaW9uTWFwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZXNzaW9uTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBjdXJyZW50S2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJcHV0KGN1cnJlbnRLZXksc2Vzc2lvbk1hcC5nZXQoY3VycmVudEtleSkpOwkJCQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQlpZihzZXNzaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlmb3IoRW51bWVyYXRpb24gZSA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTtlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBjdXJyZW50ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0JCQkJc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoY3VycmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU2V0IGtleVNldCgpIHsKLQkJCWlmKHNlc3Npb24gPT0gbnVsbCB8fCBzZXNzaW9uLmlzTmV3KCkpCi0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQotCQkJU2V0IGtleVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IoRW51bWVyYXRpb24gZSA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTtlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBjdXJyZW50ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0JCQkJa2V5U2V0LmFkZChjdXJyZW50KTsKLQkJCX0JCQkKLQkJCXJldHVybiBrZXlTZXQ7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAndmFsdWVzKCknIGlzIG5vdCBzdXBwb3J0IGJ5IHNlc3Npb24gTWFwLiIgKTsKLQkJfQotCi0JCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAnZW50cnlTZXQoKScgaXMgbm90IHN1cHBvcnQgYnkgc2Vzc2lvbiBNYXAuIiApOwotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0dyYWlsc1BhcmFtZXRlck1hcC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9HcmFpbHNQYXJhbWV0ZXJNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhZWVkZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0dyYWlsc1BhcmFtZXRlck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLm1ldGFjbGFzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0vKioKLSAqIEEgcGFyYW1ldGVyIG1hcCBjbGFzcyB0aGF0IGFsbG93cyBtaXhpbmcgb2YgcmVxdWVzdCBwYXJhbWV0ZXJzIGFuZCBjb250cm9sbGVyIHBhcmFtZXRlcnMuIElmIGEgY29udHJvbGxlcgotICogcGFyYW1ldGVyIGlzIHNldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSByZXF1ZXN0IHBhcmFtZXRlciB0aGUgY29udHJvbGxlciBwYXJhbWV0ZXIgdmFsdWUgaXMgcmV0cmlldmVkLgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjQsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1BhcmFtZXRlck1hcCBpbXBsZW1lbnRzIE1hcCB7Ci0KLQlwcml2YXRlIE1hcCBwYXJhbWV0ZXJNYXA7Ci0JcHJpdmF0ZSBNYXAgY29udHJvbGxlclBhcmFtc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLQkJCi0JcHVibGljIEdyYWlsc1BhcmFtZXRlck1hcChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRoaXMucGFyYW1ldGVyTWFwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlcXVlc3QuCi0JICovCi0JcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJNYXAuc2l6ZSgpICsgY29udHJvbGxlclBhcmFtc01hcC5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsJCQkKLQkJcmV0dXJuIChwYXJhbWV0ZXJNYXAuaXNFbXB0eSgpICYmIGNvbnRyb2xsZXJQYXJhbXNNYXAuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiAocGFyYW1ldGVyTWFwLmNvbnRhaW5zS2V5KGtleSkgfHwgY29udHJvbGxlclBhcmFtc01hcC5jb250YWluc0tleShrZXkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHBhcmFtZXRlck1hcC5jb250YWluc1ZhbHVlKHZhbHVlKSB8fCBjb250cm9sbGVyUGFyYW1zTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JCWlmKCEoa2V5IGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIga2V5ICciK2tleSsiJyBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlIik7Ci0JCQotCQlpZihjb250cm9sbGVyUGFyYW1zTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCXJldHVybiBjb250cm9sbGVyUGFyYW1zTWFwLmdldChrZXkpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nW10gdmFsdWVBcnJheSA9IChTdHJpbmdbXSlwYXJhbWV0ZXJNYXAuZ2V0KGtleSk7Ci0JCQlpZih2YWx1ZUFycmF5ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCWlmKHZhbHVlQXJyYXkubGVuZ3RoID09IDEpIHsKLQkJCQlyZXR1cm4gdmFsdWVBcnJheVswXTsKLQkJCX0KLQkKLQkJCXJldHVybiBwYXJhbWV0ZXJNYXAuZ2V0KGtleSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYoIShrZXkgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGtleSAnIitrZXkrIicgbXVzdCBiZSBhIHN0cmluZyB2YWx1ZSIpOwotCQkKLQkJY29udHJvbGxlclBhcmFtc01hcC5wdXQoa2V5LHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJaWYoIShrZXkgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIGtleSAnIitrZXkrIicgbXVzdCBiZSBhIHN0cmluZyB2YWx1ZSIpOwotCi0JCXJldHVybiBjb250cm9sbGVyUGFyYW1zTWFwLnJlbW92ZShrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7Ci0JCWNvbnRyb2xsZXJQYXJhbXNNYXAucHV0QWxsKG1hcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWNvbnRyb2xsZXJQYXJhbXNNYXAuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGtleVNldCgpIHsKLQkJU2V0IGtleXMgPSBuZXcgSGFzaFNldChjb250cm9sbGVyUGFyYW1zTWFwLmtleVNldCgpKTsKLQkJa2V5cy5hZGRBbGwoIHBhcmFtZXRlck1hcC5rZXlTZXQoKSApOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0JCVNldCB2YWx1ZXMgPSBuZXcgSGFzaFNldChwYXJhbWV0ZXJNYXAudmFsdWVzKCkpOwotCQl2YWx1ZXMuYWRkQWxsKCBjb250cm9sbGVyUGFyYW1zTWFwLnZhbHVlcygpICk7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIFNldCBlbnRyeVNldCgpIHsKLQkJU2V0IGVudHJpZXMgPSBuZXcgSGFzaFNldChwYXJhbWV0ZXJNYXAuZW50cnlTZXQoKSk7Ci0JCWVudHJpZXMuYWRkQWxsKCBjb250cm9sbGVyUGFyYW1zTWFwLmVudHJ5U2V0KCkgKTsKLQkJcmV0dXJuIGVudHJpZXM7Ci0JfQkJCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvUmVkaXJlY3REeW5hbWljTWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL1JlZGlyZWN0RHluYW1pY01ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWFhMTkzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvUmVkaXJlY3REeW5hbWljTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0NsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzU2NhZmZvbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLkdyYWlsc0NvbnRyb2xsZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnMuQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEltcGxlbWVudHMgdGhlICJyZWRpcmVjdCIgQ29udHJvbGxlciBtZXRob2QgZm9yIGFjdGlvbiByZWRpcmVjdGlvbgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBPY3QgMjcsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFJlZGlyZWN0RHluYW1pY01ldGhvZCBleHRlbmRzIEFic3RyYWN0RHluYW1pY0NvbnRyb2xsZXJNZXRob2QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1NJR05BVFVSRSA9ICJyZWRpcmVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfVVJJID0gInVyaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfQ09OVFJPTExFUiA9ICJjb250cm9sbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9BQ1RJT04gPSAiYWN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfUEFSQU1TID0gInBhcmFtcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfRVJST1JTID0gImVycm9ycyI7Ci0KLSAgICBwcml2YXRlIEdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgaGVscGVyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWRpcmVjdER5bmFtaWNNZXRob2QuY2xhc3MpOwotCi0gICAgcHVibGljIFJlZGlyZWN0RHluYW1pY01ldGhvZChHcmFpbHNDb250cm9sbGVySGVscGVyIGhlbHBlciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgc3VwZXIoTUVUSE9EX1NJR05BVFVSRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICBpZihoZWxwZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGFyZ3VtZW50ICdoZWxwZXInIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKE1FVEhPRF9TSUdOQVRVUkUsdGFyZ2V0LmdldENsYXNzKCksYXJndW1lbnRzKTsKLQotICAgICAgICBPYmplY3QgYWN0aW9uUmVmID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNvbnRyb2xsZXJOYW1lID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IGlkID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHVyaSA9IG51bGw7Ci0gICAgICAgIE1hcCBwYXJhbXM7Ci0gICAgICAgIEVycm9ycyBlcnJvcnM7Ci0gICAgICAgIEdyb292eU9iamVjdCBjb250cm9sbGVyID0gKEdyb292eU9iamVjdCl0YXJnZXQ7Ci0KLSAgICAgICAgaWYoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICBNYXAgYXJnTWFwID0gKE1hcClhcmd1bWVudHNbMF07Ci0gICAgICAgICAgICBpZihhcmdNYXAuY29udGFpbnNLZXkoQVJHVU1FTlRfVVJJKSkgewotICAgICAgICAgICAgICAgICB1cmkgPSBhcmdNYXAuZ2V0KEFSR1VNRU5UX1VSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhY3Rpb25SZWYgPSBhcmdNYXAuZ2V0KEFSR1VNRU5UX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlck5hbWUgPSAoU3RyaW5nKWFyZ01hcC5nZXQoQVJHVU1FTlRfQ09OVFJPTExFUik7Ci0gICAgICAgICAgICAgICAgaWQgPSAgYXJnTWFwLmdldChBUkdVTUVOVF9JRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbXMgPSAoTWFwKWFyZ01hcC5nZXQoQVJHVU1FTlRfUEFSQU1TKTsKLSAgICAgICAgICAgIGVycm9ycyA9IChFcnJvcnMpYXJnTWFwLmdldChBUkdVTUVOVF9FUlJPUlMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSx0YXJnZXQuZ2V0Q2xhc3MoKSxhcmd1bWVudHMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBlcnJvcnMgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGVycm9ycwotICAgICAgICBFcnJvcnMgY29udHJvbGxlckVycm9ycyA9IChFcnJvcnMpY29udHJvbGxlci5nZXRQcm9wZXJ0eSggQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkVSUk9SU19QUk9QRVJUWSApOwotICAgICAgICBpZihjb250cm9sbGVyRXJyb3JzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJFcnJvcnMuYWRkQWxsRXJyb3JzKGVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLnNldFByb3BlcnR5KCBDb250cm9sbGVyRHluYW1pY01ldGhvZHMuRVJST1JTX1BST1BFUlRZLCBlcnJvcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBpZihhY3Rpb25SZWYgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgYWN0aW9uTmFtZSA9IChTdHJpbmcpYWN0aW9uUmVmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoYWN0aW9uUmVmIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAgICAgICAgICAgQ2xvc3VyZSBjID0gKENsb3N1cmUpYWN0aW9uUmVmOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3AgPSBHcmFpbHNDbGFzc1V0aWxzLmdldFByb3BlcnR5RGVzY3JpcHRvckZvclZhbHVlKHRhcmdldCxjKTsKLSAgICAgICAgICAgIGlmKHByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdGlvbk5hbWUgPSBwcm9wLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEdyYWlsc1NjYWZmb2xkZXIgc2NhZmZvbGRlciA9IGhlbHBlci5nZXRTY2FmZm9sZGVyRm9yQ29udHJvbGxlcih0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmKHNjYWZmb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uTmFtZSA9IHNjYWZmb2xkZXIuZ2V0QWN0aW9uTmFtZShjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGFjdHVhbFVyaSA9IG51bGw7Ci0KLSAgICAgICAgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIGF0dHJzID0gaGVscGVyLmdldEdyYWlsc0F0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZih1cmkgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0dWFsVXJpID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZihhY3Rpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYWN0dWFsVXJpQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihhdHRycy5nZXRBcHBsaWNhdGlvblVyaShyZXF1ZXN0KSk7Ci0gICAgICAgICAgICAgICAgaWYoY29udHJvbGxlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKCcvJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb250cm9sbGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKGF0dHJzLmdldENvbnRyb2xsZXJVcmkocmVxdWVzdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKCcvJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGFjdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIGlmKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsVXJpQnVmLmFwcGVuZCgnLycpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKCc/Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmFtcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCc9JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocGFyYW1zLmdldChuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxVcmlCdWYuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWN0dWFsVXJpID0gYWN0dWFsVXJpQnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbigiQWN0aW9uIG5vdCBmb3VuZCBpbiByZWRpcmVjdCBmb3IgbmFtZSBbIithY3Rpb25OYW1lKyJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIkR5bmFtaWMgbWV0aG9kIFtyZWRpcmVjdF0gZm9yd2FyZGluZyByZXF1ZXN0IHRvIFsiK2FjdHVhbFVyaSArIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QocmVzcG9uc2UuZW5jb2RlUmVkaXJlY3RVUkwoYWN0dWFsVXJpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciByZWRpcmVjdGluZyByZXF1ZXN0IGZvciB1cmwgWyIrYWN0dWFsVXJpICsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL21ldGFjbGFzcy9SZW5kZXJEeW5hbWljTWV0aG9kLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL1JlbmRlckR5bmFtaWNNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyN2ZhZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL1JlbmRlckR5bmFtaWNNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3M7Ci0KLWltcG9ydCBncmFpbHMudXRpbC5PcGVuUmljb0J1aWxkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKLWltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKLWltcG9ydCBncm9vdnkueG1sLlN0cmVhbWluZ01hcmt1cEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJlYW5NYXA7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb250cm9sbGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzLkdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLkdyYWlsc0NvbnRyb2xsZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnMuQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lk1vZGVsQW5kVmlldzsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbGxvd3MgcmVuZGVyaW5nIG9mIHRleHQsIHZpZXdzLCBhbmQgdGVtcGxhdGVzIHRvIHRoZSByZXNwb25zZQotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAyNywgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgUmVuZGVyRHluYW1pY01ldGhvZCBleHRlbmRzIEFic3RyYWN0RHluYW1pY0NvbnRyb2xsZXJNZXRob2QgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TSUdOQVRVUkUgPSAicmVuZGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9URVhUID0gInRleHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfRU5DT0RJTkcgPSAiZW5jb2RpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1ZJRVcgPSAidmlldyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfTU9ERUwgPSAibW9kZWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1RFTVBMQVRFID0gInRlbXBsYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9CRUFOID0gImJlYW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0NPTExFQ1RJT04gPSAiY29sbGVjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfQlVJTERFUiA9ICJidWlsZGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BUkdVTUVOVCA9ICJpdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfVFlQRV9SSUNPID0gInJpY28iOwotCi0gICAgcHJpdmF0ZSBHcmFpbHNDb250cm9sbGVySGVscGVyIGhlbHBlcjsKLSAgICBwcm90ZWN0ZWQgR3JhaWxzSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLQotCi0gICAgcHVibGljIFJlbmRlckR5bmFtaWNNZXRob2QoR3JhaWxzQ29udHJvbGxlckhlbHBlciBoZWxwZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIHN1cGVyKE1FVEhPRF9TSUdOQVRVUkUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UgPSBuZXcgR3JhaWxzSHR0cFNlcnZsZXRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKE1FVEhPRF9TSUdOQVRVUkUsdGFyZ2V0LmdldENsYXNzKCksYXJndW1lbnRzKTsKLQotICAgICAgICBib29sZWFuIHJlbmRlclZpZXcgPSB0cnVlOwotICAgICAgICBHcm9vdnlPYmplY3QgY29udHJvbGxlciA9IChHcm9vdnlPYmplY3QpdGFyZ2V0OwotICAgICAgICBpZihhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUoKFN0cmluZylhcmd1bWVudHNbMF0pOwotICAgICAgICAgICAgICAgIHJlbmRlclZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLSAgICAgICAgICAgIFN0cmVhbWluZ01hcmt1cEJ1aWxkZXIgYiA9IG5ldyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyKCk7Ci0gICAgICAgICAgICBXcml0YWJsZSBtYXJrdXAgPSAoV3JpdGFibGUpYi5iaW5kKGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYXJrdXAud3JpdGVUbyhyZXNwb25zZS5nZXRXcml0ZXIoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24oIkkvTyBlcnJvciBleGVjdXRpbmcgcmVuZGVyIG1ldGhvZCBmb3IgYXJndW1lbnRzIFsiK2FyZ3VtZW50c1swXSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuZGVyVmlldyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICBNYXAgYXJnTWFwID0gKE1hcClhcmd1bWVudHNbMF07Ci0gICAgICAgICAgIFByaW50V3JpdGVyIG91dDsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGlmKGFyZ01hcC5jb250YWluc0tleShBUkdVTUVOVF9DT05URU5UX1RZUEUpICYmIGFyZ01hcC5jb250YWluc0tleShBUkdVTUVOVF9FTkNPRElORykpIHsKLSAgICAgICAgICAgICAgICAgICBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKFN0cmluZylhcmdNYXAuZ2V0KEFSR1VNRU5UX0NPTlRFTlRfVFlQRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpYXJnTWFwLmdldChBUkdVTUVOVF9FTkNPRElORykpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSBpZihhcmdNYXAuY29udGFpbnNLZXkoQVJHVU1FTlRfQ09OVEVOVF9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigoU3RyaW5nKWFyZ01hcC5nZXQoQVJHVU1FTlRfQ09OVEVOVF9UWVBFKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbigiSS9PIGNyZWF0aW5nIHdyaXRlIGluIG1ldGhvZCBbcmVuZGVyXSBvbiBjbGFzcyBbIit0YXJnZXQuZ2V0Q2xhc3MoKSsiXTogIiArIGlvZS5nZXRNZXNzYWdlKCksaW9lKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAgICAgICAgICAgICAgIGlmKEJVSUxERVJfVFlQRV9SSUNPLmVxdWFscyhhcmdNYXAuZ2V0KEFSR1VNRU5UX0JVSUxERVIpKSkgewotICAgICAgICAgICAgICAgICAgICBPcGVuUmljb0J1aWxkZXIgb3JiOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JiID0gbmV3IE9wZW5SaWNvQnVpbGRlcihyZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJJL08gZXJyb3IgZXhlY3V0aW5nIHJlbmRlciBtZXRob2QgZm9yIGFyZ3VtZW50cyBbIithcmdNYXArIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcmIuaW52b2tlTWV0aG9kKCJhamF4IiwgbmV3IE9iamVjdFtdeyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtaW5nTWFya3VwQnVpbGRlciBiID0gbmV3IFN0cmVhbWluZ01hcmt1cEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGFibGUgbWFya3VwID0gKFdyaXRhYmxlKWIuYmluZChhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmt1cC53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJJL08gZXJyb3IgZXhlY3V0aW5nIHJlbmRlciBtZXRob2QgZm9yIGFyZ3VtZW50cyBbIithcmdNYXArIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZW5kZXJWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICBvdXQud3JpdGUoKFN0cmluZylhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdKTsKLSAgICAgICAgICAgICAgIHJlbmRlclZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoYXJnTWFwLmNvbnRhaW5zS2V5KEFSR1VNRU5UX1RFWFQpKSB7Ci0gICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IChTdHJpbmcpYXJnTWFwLmdldChBUkdVTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgIG91dC53cml0ZSh0ZXh0KTsKLSAgICAgICAgICAgICAgIHJlbmRlclZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoYXJnTWFwLmNvbnRhaW5zS2V5KEFSR1VNRU5UX1ZJRVcpKSB7Ci0gICAgICAgICAgICAgICBTdHJpbmcgdmlld05hbWUgPSAoU3RyaW5nKWFyZ01hcC5nZXQoQVJHVU1FTlRfVklFVyk7Ci0gICAgICAgICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gaGVscGVyLmdldENvbnRyb2xsZXJDbGFzc0J5TmFtZSh0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgU3RyaW5nIHZpZXdVcmkgPSBjb250cm9sbGVyQ2xhc3MuZ2V0Vmlld0J5TmFtZSh2aWV3TmFtZSk7Ci0KLSAgICAgICAgICAgICAgIE1hcCBtb2RlbDsKLSAgICAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IGFyZ01hcC5nZXQoQVJHVU1FTlRfTU9ERUwpOwotICAgICAgICAgICAgICAgIGlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsID0gKE1hcCltb2RlbE9iamVjdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsID0gbmV3IEJlYW5NYXAodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQcm9wZXJ0eSggQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLk1PREVMX0FORF9WSUVXX1BST1BFUlRZLCBuZXcgTW9kZWxBbmRWaWV3KHZpZXdVcmksbW9kZWwpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKGFyZ01hcC5jb250YWluc0tleShBUkdVTUVOVF9URU1QTEFURSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gKFN0cmluZylhcmdNYXAuZ2V0KEFSR1VNRU5UX1RFTVBMQVRFKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdGVtcGxhdGUgdXJpCi0gICAgICAgICAgICAgICAgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIGF0dHJzID0gKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcyljb250cm9sbGVyLmdldFByb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5HUkFJTFNfQVRUUklCVVRFUyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBsYXRlVXJpID0gYXR0cnMuZ2V0VGVtcGxhdGVVcmkodGVtcGxhdGVOYW1lLHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIGdzcCBlbmdpbmUKLSAgICAgICAgICAgICAgICBHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lIGVuZ2luZSA9IGF0dHJzLmdldFBhZ2VzVGVtcGxhdGVFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlVXJpLGF0dHJzLmdldFNlcnZsZXRDb250ZXh0KCkscmVxdWVzdCxyZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihhcmdNYXAuY29udGFpbnNLZXkoQVJHVU1FTlRfQkVBTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcucHV0KERFRkFVTFRfQVJHVU1FTlQsIGFyZ01hcC5nZXQoQVJHVU1FTlRfQkVBTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGUgdyA9IHQubWFrZShiaW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYXJnTWFwLmNvbnRhaW5zS2V5KEFSR1VNRU5UX0NPTExFQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29sT2JqZWN0ID0gYXJnTWFwLmdldChBUkdVTUVOVF9DT0xMRUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbE9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjID0gKENvbGxlY3Rpb24pIGNvbE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnB1dChERUZBVUxUX0FSR1VNRU5ULCBvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGUgdyA9IHQubWFrZShiaW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZy5wdXQoREVGQVVMVF9BUkdVTUVOVCwgY29sT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZSB3ID0gdC5tYWtlKGJpbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYXJnTWFwLmNvbnRhaW5zS2V5KEFSR1VNRU5UX01PREVMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gYXJnTWFwLmdldChBUkdVTUVOVF9NT0RFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlIHcgPSB0Lm1ha2UoKE1hcClhcmdNYXAuZ2V0KEFSR1VNRU5UX01PREVMKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZSB3ID0gdC5tYWtlKG5ldyBCZWFuTWFwKHRhcmdldCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlIHcgPSB0Lm1ha2UobmV3IEJlYW5NYXAodGFyZ2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2V4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uKCJJL08gZXJyb3IgZXhlY3V0aW5nIHJlbmRlciBtZXRob2QgZm9yIGFyZ3VtZW50cyBbIithcmdNYXArIl06ICIgKyBpb2V4LmdldE1lc3NhZ2UoKSxpb2V4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24oIlNlcnZsZXQgZXhjZXB0aW9uIGV4ZWN1dGluZyByZW5kZXIgbWV0aG9kIGZvciBhcmd1bWVudHMgWyIrYXJnTWFwKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSx0YXJnZXQuZ2V0Q2xhc3MoKSxhcmd1bWVudHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oTUVUSE9EX1NJR05BVFVSRSx0YXJnZXQuZ2V0Q2xhc3MoKSxhcmd1bWVudHMpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIuc2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLlJFTkRFUl9WSUVXX1BST1BFUlRZLEJvb2xlYW4udmFsdWVPZihyZW5kZXJWaWV3KSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvVGFnTGliRHluYW1pY01ldGhvZHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvVGFnTGliRHluYW1pY01ldGhvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjMWEzZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL1RhZ0xpYkR5bmFtaWNNZXRob2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3M7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkubGFuZy5Qcm94eU1ldGFDbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5BYnN0cmFjdER5bmFtaWNNZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkdlbmVyaWNEeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5tZXRhY2xhc3MuR3Jvb3Z5RHluYW1pY01ldGhvZHNJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnMuR3JhaWxzVGFnRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIDxwPlJlcHJlc2VudHMgYSBjb250cm9sbGVyIGNsYXNzIGluIEdyYWlscy4KLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBKYW4gMTQsIDIwMDU2Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdMaWJEeW5hbWljTWV0aG9kcyBleHRlbmRzIEdyb292eUR5bmFtaWNNZXRob2RzSW50ZXJjZXB0b3IgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVF9QUk9QRVJUWSA9ICJvdXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV19UQUdfRVJST1JfTUVUSE9EID0gInRocm93VGFnRXJyb3IiOwotCi0gICAgcHVibGljIFRhZ0xpYkR5bmFtaWNNZXRob2RzKEdyb292eU9iamVjdCB0YWdsaWIsIEdyb292eU9iamVjdCBjb250cm9sbGVyKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHRhZ2xpYik7Ci0KLSAgICAgICAgUHJveHlNZXRhQ2xhc3MgY29udHJvbGxlck1ldGFDbGFzcyA9IChQcm94eU1ldGFDbGFzcyljb250cm9sbGVyLmdldE1ldGFDbGFzcygpOwotICAgICAgICBDb250cm9sbGVyRHluYW1pY01ldGhvZHMgY29udHJvbGxlckR5bmFtaWNNZXRob2RzID0gKENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcyljb250cm9sbGVyTWV0YUNsYXNzLmdldEludGVyY2VwdG9yKCk7Ci0KLQotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkobmV3IEdlbmVyaWNEeW5hbWljUHJvcGVydHkoT1VUX1BST1BFUlRZLCBXcml0ZXIuY2xhc3MsZmFsc2UpKTsKLQotICAgICAgICAvLyBhZGQgZHluYW1pYyBwcm9wZXJ0aWVzIChzaGFyZWQgd2l0aCBjb250cm9sbGVyKQotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkoY29udHJvbGxlckR5bmFtaWNNZXRob2RzLmdldER5bmFtaWNQcm9wZXJ0eShHZXRQYXJhbXNEeW5hbWljUHJvcGVydHkuUFJPUEVSVFlfTkFNRSkpOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkoY29udHJvbGxlckR5bmFtaWNNZXRob2RzLmdldER5bmFtaWNQcm9wZXJ0eShHZXRTZXNzaW9uRHluYW1pY1Byb3BlcnR5LlBST1BFUlRZX05BTUUpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KGNvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5nZXREeW5hbWljUHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLlJFUVVFU1RfUFJPUEVSVFkpKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KGNvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5nZXREeW5hbWljUHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLlJFU1BPTlNFX1BST1BFUlRZKSApOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkoY29udHJvbGxlckR5bmFtaWNNZXRob2RzLmdldER5bmFtaWNQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuU0VSVkxFVF9DT05URVhUKSApOwotICAgICAgICBhZGREeW5hbWljUHJvcGVydHkoY29udHJvbGxlckR5bmFtaWNNZXRob2RzLmdldER5bmFtaWNQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuR1JBSUxTX0FUVFJJQlVURVMpICk7Ci0gICAgICAgIGFkZER5bmFtaWNQcm9wZXJ0eShjb250cm9sbGVyRHluYW1pY01ldGhvZHMuZ2V0RHluYW1pY1Byb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5GTEFTSF9TQ09QRV9QUk9QRVJUWSkgKTsKLSAgICAgICAgYWRkRHluYW1pY1Byb3BlcnR5KGNvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5nZXREeW5hbWljUHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkdSQUlMU19BUFBMSUNBVElPTikpOyAgICAgICAgCi0KLSAgICAgICAgYWRkRHluYW1pY01ldGhvZEludm9jYXRpb24obmV3IEFic3RyYWN0RHluYW1pY01ldGhvZEludm9jYXRpb24oVEhST1dfVEFHX0VSUk9SX01FVEhPRCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihUSFJPV19UQUdfRVJST1JfTUVUSE9ELHRhcmdldC5nZXRDbGFzcygpLGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbihhcmd1bWVudHNbMF0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlQWN0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvQ2xvc3VyZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM3NDUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZWZsb3c7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotCi1pbXBvcnQgamF2YS5sYW5nLkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlZmxvdy5leGNlcHRpb25zLkludmFsaWRDbG9zdXJlUmV0dXJuVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuQWN0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5FdmVudDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHQ7Ci0KLS8qKgotICogPHA+V3JhcHBlciBjbGFzcyB0byBleGVjdXRlIGEgR3Jvb3Z5IGNsb3N1cmUgYXMgYSBTV0YgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMTAsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIENsb3N1cmVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24gewotCi0JcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN0YXRlSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZsb3dJZCA9IG51bGw7Ci0JCi0JcHVibGljIENsb3N1cmVBY3Rpb24oU3RyaW5nIGZsb3dJZCwgU3RyaW5nIHN0YXRlSWQsIENsb3N1cmUgY2xvc3VyZSkgewotCQlzdXBlcigpOwotCQlBc3NlcnQubm90TnVsbChmbG93SWQpOwotCQlBc3NlcnQubm90TnVsbChzdGF0ZUlkKTsKLQkJQXNzZXJ0Lm5vdE51bGwoY2xvc3VyZSk7Ci0JCXRoaXMuZmxvd0lkID0gZmxvd0lkOwotCQl0aGlzLnN0YXRlSWQgPSBzdGF0ZUlkOwotCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCX0KLQotCXB1YmxpYyBFdmVudCBleGVjdXRlKFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IHRoaXMuY2xvc3VyZS5jYWxsKHJlcXVlc3RDb250ZXh0KTsKLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludmFsaWRDbG9zdXJlUmV0dXJuVmFsdWVFeGNlcHRpb24oIk51bGwgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uIGNsb3N1cmUgb2Ygc3RhdGUgWyIgKyBzdGF0ZUlkICsgIl0gaW4gcGFnZSBmbG93IFsiICsgZmxvd0lkICsgIl0hIik7Ci0JCX0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXZlbnQpIHsKLQkJCXJldHVybiAoRXZlbnQpcmVzdWx0OwotCQl9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJcmV0dXJuIG5ldyBFdmVudChjbG9zdXJlLCAoU3RyaW5nKXJlc3VsdCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbigiUmV0dXJuIHZhbHVlIG9mIHR5cGUgWyIgKyByZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSByZXR1cm5lZCBieSBhY3Rpb24gY2xvc3VyZSBvZiBzdGF0ZSBbIiArIHN0YXRlSWQgKyAiXSBpbiBwYWdlIGZsb3cgWyIgKyBmbG93SWQgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvQ2xvc3VyZUZsb3dBdHRyaWJ1dGVNYXBwZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlRmxvd0F0dHJpYnV0ZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjY0OWViLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlRmxvd0F0dHJpYnV0ZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZWZsb3cuZXhjZXB0aW9ucy5JbnZhbGlkQ2xvc3VyZVJldHVyblZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5GbG93QXR0cmlidXRlTWFwcGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5SZXF1ZXN0Q29udGV4dDsKLQotLyoqCi0gKiA8cD5EZWxlZ2F0ZXMgc3ViZmxvdyBpbnB1dCBhbmQgb3V0cHV0IG9wZXJhdGlvbnMgdG8gY2xvc3VyZXMuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDYsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIENsb3N1cmVGbG93QXR0cmlidXRlTWFwcGVyIGltcGxlbWVudHMgRmxvd0F0dHJpYnV0ZU1hcHBlciB7Ci0KLQlTdHJpbmcgZmxvd0lkID0gbnVsbDsKLQlTdHJpbmcgc3RhdGVJZCA9IG51bGw7Ci0JQ2xvc3VyZSBzdWJmbG93SW5wdXRDbG9zdXJlID0gbnVsbDsKLQlDbG9zdXJlIHN1YmZsb3dPdXRwdXRDbG9zdXJlID0gbnVsbDsKLQkKLQlwdWJsaWMgQ2xvc3VyZUZsb3dBdHRyaWJ1dGVNYXBwZXIoU3RyaW5nIGZsb3dJZCwgU3RyaW5nIHN0YXRlSWQsIENsb3N1cmUgc3ViZmxvd0lucHV0Q2xvc3VyZSwgQ2xvc3VyZSBzdWJmbG93T3V0cHV0Q2xvc3VyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZsb3dJZCA9IGZsb3dJZDsKLQkJdGhpcy5zdGF0ZUlkID0gc3RhdGVJZDsKLQkJdGhpcy5zdWJmbG93SW5wdXRDbG9zdXJlID0gc3ViZmxvd0lucHV0Q2xvc3VyZTsKLQkJdGhpcy5zdWJmbG93T3V0cHV0Q2xvc3VyZSA9IHN1YmZsb3dPdXRwdXRDbG9zdXJlOwotCX0KLQkKLQlwdWJsaWMgTWFwIGNyZWF0ZVN1YmZsb3dJbnB1dChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICh0aGlzLnN1YmZsb3dJbnB1dENsb3N1cmUgIT0gbnVsbCkgewotCQkJT2JqZWN0IHJldHVyblZhbHVlID0gdGhpcy5zdWJmbG93SW5wdXRDbG9zdXJlLmNhbGwoY29udGV4dCk7Ci0JCQlpZiAocmV0dXJuVmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSGFzaE1hcCgpOwotCQkJfSBlbHNlIGlmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCXJldHVybiAoTWFwKXJldHVyblZhbHVlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbigiUmV0dXJuIHZhbHVlIG9mIHR5cGUgWyIgKyByZXR1cm5WYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIG9mIHN1YmZsb3cgaW5wdXQgY2xvc3VyZSBmb3IgZmxvdyBhdHRyaWJ1dGUgbWFwcGVyIG9mIHN0YXRlIFsiICsgdGhpcy5zdGF0ZUlkICsgIl0gb2YgcGFnZSBmbG93IFsiICsgdGhpcy5mbG93SWQgKyAiXSBpcyBub3Qgc3VwcG9ydGVkISIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFwU3ViZmxvd091dHB1dChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICh0aGlzLnN1YmZsb3dPdXRwdXRDbG9zdXJlICE9IG51bGwpIHsKLQkJCU9iamVjdCByZXR1cm5WYWx1ZSA9IHRoaXMuc3ViZmxvd091dHB1dENsb3N1cmUuY2FsbChjb250ZXh0KTsKLQkJCWlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCWNvbnRleHQuZ2V0Rmxvd0V4ZWN1dGlvbkNvbnRleHQoKS5nZXRBY3RpdmVTZXNzaW9uKCkuZ2V0UGFyZW50KCkuZ2V0U2NvcGUoKS5zZXRBdHRyaWJ1dGVzKChNYXApcmV0dXJuVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbigiUmV0dXJuIHZhbHVlIG9mIHR5cGUgWyIgKyByZXR1cm5WYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIG9mIHN1YmZsb3cgb3V0cHV0IGNsb3N1cmUgZm9yIGZsb3cgYXR0cmlidXRlIG1hcHBlciBvZiBzdGF0ZSBbIiArIHRoaXMuc3RhdGVJZCArICJdIG9mIHBhZ2UgZmxvdyBbIiArIHRoaXMuZmxvd0lkICsgIl0gaXMgbm90IHN1cHBvcnRlZCEiKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlVmFsaWRhdG9yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvQ2xvc3VyZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYyNTA0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9DbG9zdXJlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZWZsb3c7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5FcnJvcnM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotLyoqCi0gKiA8cD5EZWxlZ2F0ZSB0aGF0IHR1cm5zIGEgY2xvc3VyZSBpbnRvIGEgU3ByaW5nIHZhbGlkYXRvci4KLSAqIAotICogPHA+VGhlIGNsb3N1cmUgbmVlZHMgdG8gYWNjZXB0IHR3byBwYXJhbWV0ZXJzOiB0YXJnZXQgYW5kIGFuZCB7QGxpbmsgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yc30gaW5zdGFuY2UuCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgQXVnIDYsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIENsb3N1cmVWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCQotCXB1YmxpYyBDbG9zdXJlVmFsaWRhdG9yKENsb3N1cmUgY2xvc3VyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzIGFyZzApIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IHRhcmdldCwgRXJyb3JzIGVycm9ycykgewotCQl0aGlzLmNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W10geyB0YXJnZXQsIGVycm9ycyB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9HcmFpbHNGbG93QnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L0dyYWlsc0Zsb3dCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODFhMjQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L0dyYWlsc0Zsb3dCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93OwotCi1pbXBvcnQgZ3JhaWxzLnBhZ2VmbG93LkZsb3c7Ci1pbXBvcnQgZ3JhaWxzLnBhZ2VmbG93LlN0YXRlOwotaW1wb3J0IGdyYWlscy5wYWdlZmxvdy5UcmFuc2l0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc1BhZ2VGbG93Q2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmFjdGlvbi5HcmFpbHNGb3JtQWN0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhblV0aWxzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHRBd2FyZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5BY3Rpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkFubm90YXRlZEFjdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRmxvd0F0dHJpYnV0ZU1hcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuY29uZmlnLkFic3RyYWN0Rmxvd0J1aWxkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LmNvbmZpZy5GbG93QnVpbGRlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgOSwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzRmxvd0J1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdEZsb3dCdWlsZGVyIGltcGxlbWVudHMgQXBwbGljYXRpb25Db250ZXh0QXdhcmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT1cgPSAiZmxvdyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRCA9ICJtZXRob2QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX0FORF9WQUxJREFURSA9ICJiaW5kQW5kVmFsaWRhdGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1IgPSAidmFsaWRhdG9yIjsKLQkKLQlwcml2YXRlIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgR3JhaWxzUGFnZUZsb3dDbGFzcyBwYWdlRmxvd0NsYXNzID0gbnVsbDsKLQkKLQlwdWJsaWMgR3JhaWxzRmxvd0J1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFnZUZsb3dDbGFzcyhHcmFpbHNQYWdlRmxvd0NsYXNzIHBhZ2VGbG93Q2xhc3MpIHsKLQkJdGhpcy5wYWdlRmxvd0NsYXNzID0gcGFnZUZsb3dDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25Db250ZXh0KEFwcGxpY2F0aW9uQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQmVhbnNFeGNlcHRpb24gewotCQl0aGlzLmFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBmbG93SWQoKSB7Ci0JCXJldHVybiB0aGlzLnBhZ2VGbG93Q2xhc3MuZ2V0Rmxvd0lkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGRTdGF0ZXMoKSB0aHJvd3MgRmxvd0J1aWxkZXJFeGNlcHRpb24gewotCQlHcm9vdnlPYmplY3QgcGFnZUZsb3cgPSAoR3Jvb3Z5T2JqZWN0KXRoaXMuYXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4ocGFnZUZsb3dDbGFzcy5nZXRGdWxsTmFtZSgpKTsKLQkJQXNzZXJ0Lm5vdE51bGwocGFnZUZsb3cpOwotCQlGbG93IGZsb3cgPSAoRmxvdylwYWdlRmxvdy5nZXRQcm9wZXJ0eShGTE9XKTsKLQkJQXNzZXJ0Lm5vdE51bGwoZmxvdyk7Ci0JCVN0cmluZyBmaXJzdFN0YXRlID0gbnVsbDsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZsb3cuZ2V0U3RhdGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdGF0ZSBzdGF0ZSA9IChTdGF0ZSlpdGVyLm5leHQoKTsKLQkJCQotCQkJaWYgKGZpcnN0U3RhdGUgPT0gbnVsbCkgewotCQkJCWZpcnN0U3RhdGUgPSBzdGF0ZS5nZXRJZCgpOwotCQkJfQotCQkJCi0JCQlpZiAoc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKSB7Ci0JCQkJQW5ub3RhdGVkQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JCQkJCi0JCQkJaWYgKHN0YXRlLmdldEFjdGlvbigpICE9IG51bGwpIHsKLQkJCQkJYWN0aW9uID0gbmV3IEFubm90YXRlZEFjdGlvbihzdGF0ZS5nZXRBY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIGlmIChzdGF0ZS5nZXRBY3Rpb25DbGFzcygpICE9IG51bGwpIHsKLQkJCQkJQWN0aW9uIHRtcEFjdGlvbiA9IG51bGw7Ci0JCQkJCWlmIChBY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdGF0ZS5nZXRBY3Rpb25DbGFzcygpKSkgewotCQkJCQkJdG1wQWN0aW9uID0gKEFjdGlvbilCZWFuVXRpbHMuaW5zdGFudGlhdGVDbGFzcyhzdGF0ZS5nZXRBY3Rpb25DbGFzcygpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm9uZSAiICsgQWN0aW9uLmNsYXNzLmdldE5hbWUoKSArICIgYWN0aW9uIGNsYXNzZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkISIpOwotCQkJCQl9Ci0JCQkJCWlmIChzdGF0ZS5nZXRBY3Rpb25Qcm9wZXJ0aWVzKCkgIT0gbnVsbCkgewotCQkJCQkJbmV3IEJlYW5XcmFwcGVySW1wbCh0bXBBY3Rpb24pLnNldFByb3BlcnR5VmFsdWVzKHN0YXRlLmdldEFjdGlvblByb3BlcnRpZXMoKSk7Ci0JCQkJCX0KLQkJCQkJYWN0aW9uID0gbmV3IEFubm90YXRlZEFjdGlvbih0bXBBY3Rpb24pOwotCQkJCX0gZWxzZSBpZiAoc3RhdGUuZ2V0QWN0aW9uQ2xvc3VyZSgpICE9IG51bGwpIHsKLQkJCQkJYWN0aW9uID0gbmV3IEFubm90YXRlZEFjdGlvbihuZXcgQ2xvc3VyZUFjdGlvbih0aGlzLnBhZ2VGbG93Q2xhc3MuZ2V0Rmxvd0lkKCksIHN0YXRlLmdldElkKCksIHN0YXRlLmdldEFjdGlvbkNsb3N1cmUoKSkpOwotCQkJCX0gZWxzZSBpZiAoc3RhdGUuZ2V0QWN0aW9uRm9ybURldGFpbHMoKSAhPSBudWxsKSB7Ci0JCQkJCUdyYWlsc0Zvcm1BY3Rpb24gZm9ybUFjdGlvbiA9IG5ldyBHcmFpbHNGb3JtQWN0aW9uKCk7Ci0JCQkJCUJlYW5XcmFwcGVyIGJlYW5XcmFwcGVyID0gbmV3IEJlYW5XcmFwcGVySW1wbChmb3JtQWN0aW9uKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMiA9IHN0YXRlLmdldEFjdGlvbkZvcm1EZXRhaWxzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyMi5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXIyLm5leHQoKTsKLQkJCQkJCWlmIChWQUxJREFUT1IuZXF1YWxzKGVudHJ5LmdldEtleSgpKSAmJiBlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotCQkJCQkJCWJlYW5XcmFwcGVyLnNldFByb3BlcnR5VmFsdWUoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgbmV3IENsb3N1cmVWYWxpZGF0b3IoKChDbG9zdXJlKWVudHJ5LmdldFZhbHVlKCkpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJlYW5XcmFwcGVyLnNldFByb3BlcnR5VmFsdWUoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9ybUFjdGlvbi5hZnRlclByb3BlcnRpZXNTZXQoKTsKLQkJCQkJYWN0aW9uID0gbmV3IEFubm90YXRlZEFjdGlvbihmb3JtQWN0aW9uKTsKLQkJCQkJaWYgKHN0YXRlLmdldEFjdGlvbk1ldGhvZCgpICE9IG51bGwpIHsKLQkJCQkJCWFjdGlvbi5zZXRQcm9wZXJ0eShNRVRIT0QsIHN0YXRlLmdldEFjdGlvbk1ldGhvZCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFjdGlvbi5zZXRQcm9wZXJ0eShNRVRIT0QsIEJJTkRfQU5EX1ZBTElEQVRFKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQkJCQotCQkJCWFkZEFjdGlvblN0YXRlKHN0YXRlLmdldElkKCksIGFjdGlvbiwgZ2V0VHJhbnNpdGlvbnMoc3RhdGUuZ2V0VHJhbnNpdGlvbnMoKSkpOwotCQkJfSBlbHNlIGlmIChzdGF0ZS5pc1ZpZXdTdGF0ZSgpKSB7Ci0JCQkJaWYgKHN0YXRlLmdldFZpZXdOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlhZGRWaWV3U3RhdGUoc3RhdGUuZ2V0SWQoKSwgbmV3IE1vZGVsVmlld0Rlc2NyaXB0b3JDcmVhdG9yKHN0YXRlLmdldFZpZXdOYW1lKCksIHN0YXRlLmdldFZpZXdNb2RlbCgpKSwgZ2V0VHJhbnNpdGlvbnMoc3RhdGUuZ2V0VHJhbnNpdGlvbnMoKSksIG5ldyBIYXNoTWFwKCkpOwotCQkJCX0gZWxzZSBpZiAoc3RhdGUuZ2V0Vmlld0Nsb3N1cmUoKSAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmlldyBjbG9zdXJlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQhIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRGVjaXNpb24gc3RhdGVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCEiKTsKLQkJCX0gZWxzZSBpZiAoc3RhdGUuaXNTdWJmbG93U3RhdGUoKSkgewotCQkJCWlmIChzdGF0ZS5nZXRTdWJGbG93SW5wdXQoKSAhPSBudWxsIHx8IHN0YXRlLmdldFN1YkZsb3dPdXRwdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWFkZFN1YmZsb3dTdGF0ZSgKLQkJCQkJCQlzdGF0ZS5nZXRJZCgpLCAKLQkJCQkJCQlnZXRGbG93U2VydmljZUxvY2F0b3IoKS5nZXRGbG93KHN0YXRlLmdldFN1YkZsb3dJZCgpKSwgCi0JCQkJCQkJbmV3IENsb3N1cmVGbG93QXR0cmlidXRlTWFwcGVyKHRoaXMucGFnZUZsb3dDbGFzcy5nZXRGbG93SWQoKSwgc3RhdGUuZ2V0SWQoKSwgc3RhdGUuZ2V0U3ViRmxvd0lucHV0KCksIHN0YXRlLmdldFN1YkZsb3dPdXRwdXQoKSksCi0JCQkJCQkJZ2V0VHJhbnNpdGlvbnMoc3RhdGUuZ2V0VHJhbnNpdGlvbnMoKSkpOwotCQkJCX0gZWxzZSBpZiAoc3RhdGUuZ2V0QXR0cmlidXRlTWFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQlhZGRTdWJmbG93U3RhdGUoCi0JCQkJCQkJc3RhdGUuZ2V0SWQoKSwKLQkJCQkJCQlnZXRGbG93U2VydmljZUxvY2F0b3IoKS5nZXRGbG93KHN0YXRlLmdldFN1YkZsb3dJZCgpKSwKLQkJCQkJCQlzdGF0ZS5nZXRBdHRyaWJ1dGVNYXBwZXIoKSwKLQkJCQkJCQlnZXRUcmFuc2l0aW9ucyhzdGF0ZS5nZXRUcmFuc2l0aW9ucygpKSk7Ci0JCQkJfSBlbHNlIGlmIChzdGF0ZS5nZXRBdHRyaWJ1dGVNYXBwZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJRmxvd0F0dHJpYnV0ZU1hcHBlciBmbG93QXR0cmlidXRlTWFwcGVyID0gKEZsb3dBdHRyaWJ1dGVNYXBwZXIpQmVhblV0aWxzLmluc3RhbnRpYXRlQ2xhc3Moc3RhdGUuZ2V0QXR0cmlidXRlTWFwcGVyQ2xhc3MoKSk7Ci0JCQkJCWlmIChzdGF0ZS5nZXRBdHRyaWJ1dGVNYXBwZXJQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgewotCQkJCQkJbmV3IEJlYW5XcmFwcGVySW1wbChmbG93QXR0cmlidXRlTWFwcGVyKS5zZXRQcm9wZXJ0eVZhbHVlcyhzdGF0ZS5nZXRBdHRyaWJ1dGVNYXBwZXJQcm9wZXJ0aWVzKCkpOwotCQkJCQl9Ci0JCQkJCWFkZFN1YmZsb3dTdGF0ZSgKLQkJCQkJCQlzdGF0ZS5nZXRJZCgpLAotCQkJCQkJCWdldEZsb3dTZXJ2aWNlTG9jYXRvcigpLmdldEZsb3coc3RhdGUuZ2V0U3ViRmxvd0lkKCkpLAotCQkJCQkJCWZsb3dBdHRyaWJ1dGVNYXBwZXIsCi0JCQkJCQkJZ2V0VHJhbnNpdGlvbnMoc3RhdGUuZ2V0VHJhbnNpdGlvbnMoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZFN1YmZsb3dTdGF0ZShzdGF0ZS5nZXRJZCgpLCBnZXRGbG93U2VydmljZUxvY2F0b3IoKS5nZXRGbG93KHN0YXRlLmdldFN1YkZsb3dJZCgpKSwgZ2V0VHJhbnNpdGlvbnMoc3RhdGUuZ2V0VHJhbnNpdGlvbnMoKSkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3RhdGUuaXNFbmRTdGF0ZSgpKSB7Ci0JCQkJaWYgKHN0YXRlLmdldFZpZXdOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlhZGRFbmRTdGF0ZShzdGF0ZS5nZXRJZCgpLCBuZXcgTW9kZWxWaWV3RGVzY3JpcHRvckNyZWF0b3Ioc3RhdGUuZ2V0Vmlld05hbWUoKSwgc3RhdGUuZ2V0Vmlld01vZGVsKCkpLCBuZXcgSGFzaE1hcCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRFbmRTdGF0ZShzdGF0ZS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JCWlmIChmaXJzdFN0YXRlICE9IG51bGwpIHsKLQkJCWdldEZsb3coKS5zZXRTdGFydFN0YXRlKGZpcnN0U3RhdGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuVHJhbnNpdGlvbltdIGdldFRyYW5zaXRpb25zKExpc3QgdHJhbnNpdGlvbnMpIHsKLQkJb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlRyYW5zaXRpb25bXSB0cmFuc2l0aW9uQXJyYXkgPSBuZXcgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlRyYW5zaXRpb25bdHJhbnNpdGlvbnMuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gdHJhbnNpdGlvbnMuaXRlcmF0b3IoKTsgaXRlcjIuaGFzTmV4dCgpOyBpKyspIHsKLQkJCVRyYW5zaXRpb24gdHJhbnNpdGlvbiA9IChUcmFuc2l0aW9uKWl0ZXIyLm5leHQoKTsKLQkJCXRyYW5zaXRpb25BcnJheVtpXSA9IG9uKHRyYW5zaXRpb24uZ2V0TmFtZSgpLCB0cmFuc2l0aW9uLmdldFRhcmdldFN0YXRlSWQoKSk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zaXRpb25BcnJheTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvTW9kZWxWaWV3RGVzY3JpcHRvckNyZWF0b3IuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9Nb2RlbFZpZXdEZXNjcmlwdG9yQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjZlYmYzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9Nb2RlbFZpZXdEZXNjcmlwdG9yQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlZpZXdEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5WaWV3RGVzY3JpcHRvckNyZWF0b3I7Ci0KLS8qKgotICogPHA+QWxsIGNsb3N1cmVzIGluIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggYSB2aWV3Ci0gKiBzdGF0ZSB3aWxsIGJlIGV4ZWN1dGVkIGV2ZXJ5dGltZSBhIChAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuVmlld0Rlc2NyaXB0b3J9Ci0gKiBpcyBjcmVhdGVkLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAxMCwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxWaWV3RGVzY3JpcHRvckNyZWF0b3IgaW1wbGVtZW50cyBWaWV3RGVzY3JpcHRvckNyZWF0b3IgewotCi0JcHJpdmF0ZSBNYXAgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZpZXdOYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgTW9kZWxWaWV3RGVzY3JpcHRvckNyZWF0b3IoTWFwIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxWaWV3RGVzY3JpcHRvckNyZWF0b3IoU3RyaW5nIHZpZXdOYW1lLCBNYXAgbW9kZWwpIHsKLQkJdGhpcyhtb2RlbCk7Ci0JCUFzc2VydC5ub3ROdWxsKHZpZXdOYW1lKTsKLQkJdGhpcy52aWV3TmFtZSA9IHZpZXdOYW1lOwotCX0KLQkKLQlwdWJsaWMgVmlld0Rlc2NyaXB0b3IgY3JlYXRlVmlld0Rlc2NyaXB0b3IoUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKLQkJTWFwIHRtcE1vZGVsID0gbmV3IEhhc2hNYXAocmVxdWVzdENvbnRleHQuZ2V0TW9kZWwoKSk7Ci0JCWlmICh0aGlzLm1vZGVsICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubW9kZWwuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXIubmV4dCgpOwotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwgJiYgZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKLQkJCQkJdG1wTW9kZWwucHV0KGVudHJ5LmdldEtleSgpLCAoKENsb3N1cmUpZW50cnkuZ2V0VmFsdWUoKSkuY2FsbChuZXcgT2JqZWN0W10geyByZXF1ZXN0Q29udGV4dCB9KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdG1wTW9kZWwucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBWaWV3RGVzY3JpcHRvcih2aWV3TmFtZSwgdG1wTW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2FjdGlvbi9HcmFpbHNGb3JtQWN0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvYWN0aW9uL0dyYWlsc0Zvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmQxZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvYWN0aW9uL0dyYWlsc0Zvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlZmxvdy5hY3Rpb247Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuYWN0aW9uLkZvcm1BY3Rpb247Ci0KLS8qKgotICogPHA+QWRkcyBzb21lIGNvbnZlbmllbmNlIHByb3BlcnR5IHNldHRlcnMgdG8ge0BsaW5rIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5hY3Rpb24uRm9ybUFjdGlvbn0uCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDExLCAyMDA1Ci0gKiBAc2VlIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5hY3Rpb24uRm9ybUFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzRm9ybUFjdGlvbiBleHRlbmRzIEZvcm1BY3Rpb24gewotCi0JcHVibGljIEdyYWlsc0Zvcm1BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Q29udmVuY2llbmNlIHByb3BlcnR5IGZvciB7QGxpbmsgRm9ybUFjdGlvbiNzZXRGb3JtT2JqZWN0Q2xhc3MoamF2YS5sYW5nLkNsYXNzKX0uCi0JICogCi0JICogQHBhcmFtIGNsYXp6IHRoZSBmb3JtIG9iamVjdCBjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCXNldEZvcm1PYmplY3RDbGFzcyhjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNvbnZlbmllbmNlIHByb3BlcnR5IGZvciB7QGxpbmsgRm9ybUFjdGlvbiNzZXRGb3JtT2JqZWN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGhlIGZvcm0gb2JqZWN0IG5hbWUgaW4gdGhlIHNjb3BlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRGb3JtT2JqZWN0TmFtZShuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q29udmVuaWVuY2UgcHJvcGVydHkgZm9yIHtAbGluayBGb3JtQWN0aW9uI3NldEZvcm1PYmplY3RTY29wZUFzU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpfS4KLQkgKiAKLQkgKiBAcGFyYW0gc2NvcGUgdGhlIGZvcm0gb2JqZWN0IHNjb3BlICg8Y29kZT5yZXF1ZXN0PC9jb2RlPiBvciA8Y29kZT5zY29wZTwvY29kZT4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXNldEZvcm1PYmplY3RTY29wZUFzU3RyaW5nKHNjb3BlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9HcmFpbHNQYWdlRmxvd0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2V4Y2VwdGlvbnMvR3JhaWxzUGFnZUZsb3dFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzMDA1Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9HcmFpbHNQYWdlRmxvd0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zLkdyYWlsc0V4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD5BYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcGFnZSBmbG93cy4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMTAsIDIwMDUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYWlsc1BhZ2VGbG93RXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBHcmFpbHNQYWdlRmxvd0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzUGFnZUZsb3dFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc1BhZ2VGbG93RXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzUGFnZUZsb3dFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9JbnZhbGlkQ2xvc3VyZVJldHVyblZhbHVlRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9JbnZhbGlkQ2xvc3VyZVJldHVyblZhbHVlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGFkZjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2V4Y2VwdGlvbnMvSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci0KLS8qKgotICogPHA+VGhyb3duIHRoZSBhIGNsb3N1cmUgcmV0dXJucyBhIG51bGwgdmFsdWUgb3Igbm90IGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRXZlbnR9Ci0gKiBvciB7QGxpbmsgU3RyaW5nfS4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMTAsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRDbG9zdXJlUmV0dXJuVmFsdWVFeGNlcHRpb24gZXh0ZW5kcyBHcmFpbHNQYWdlRmxvd0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgSW52YWxpZENsb3N1cmVSZXR1cm5WYWx1ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIEludmFsaWRDbG9zdXJlUmV0dXJuVmFsdWVFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9Ob1ZpZXdEZWZpbmVkRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvZXhjZXB0aW9ucy9Ob1ZpZXdEZWZpbmVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmJlYzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2V4Y2VwdGlvbnMvTm9WaWV3RGVmaW5lZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+VGhyb3duIHdoZW4gbm8gdmlldyBpcyBjb25maWd1cmVkIGZvciBhIHN0YXRlIHdoZW4gb25lIGlzIGV4cGVjdGVkLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEF1ZyA2LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1ZpZXdEZWZpbmVkRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzUGFnZUZsb3dFeGNlcHRpb24gewotCi0JcHVibGljIE5vVmlld0RlZmluZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5vVmlld0RlZmluZWRFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIE5vVmlld0RlZmluZWRFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBOb1ZpZXdEZWZpbmVkRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2V4ZWN1dGlvbi9zZXJ2bGV0L0dyYWlsc1NlcnZsZXRGbG93RXhlY3V0aW9uTWFuYWdlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L2V4ZWN1dGlvbi9zZXJ2bGV0L0dyYWlsc1NlcnZsZXRGbG93RXhlY3V0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGI1OTRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9leGVjdXRpb24vc2VydmxldC9HcmFpbHNTZXJ2bGV0Rmxvd0V4ZWN1dGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZWZsb3cuZXhlY3V0aW9uLnNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VmbG93LmV4Y2VwdGlvbnMuTm9WaWV3RGVmaW5lZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRXZlbnQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkZsb3c7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkZsb3dFeGVjdXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5GbG93U2Vzc2lvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LlN0YXRlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5WaWV3RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuYWNjZXNzLkZsb3dMb2NhdG9yOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5leGVjdXRpb24uRW50ZXJTdGF0ZVZldG9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LmV4ZWN1dGlvbi5GbG93RXhlY3V0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LmV4ZWN1dGlvbi5zZXJ2bGV0LlNlcnZsZXRFdmVudDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuZXhlY3V0aW9uLnNlcnZsZXQuU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyOwotCi0vKioKLSAqIDxwPlRoaXMgc3BlY2lhbGlzYXRpb24gb2Yge0BsaW5rIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViZmxvdy5leGVjdXRpb24uc2VydmxldC5TZXJ2bGV0Rmxvd0V4ZWN1dGlvbk1hbmFnZXJ9Ci0gKiBzdG9yZXMgYW5kIHJldHJpZXZlcyB0aGUgZmxvdyBleGVjdXRpb24gaWQgZnJvbSBhIGNvb2tpZSBpZiBubyBmbG93IGV4ZWN1dGlvbiBpZCBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlLgotICogCi0gKiA8cD5Vc2VycyBtdXN0IHVzZSB0aGUgcmVndWxhciBTcHJpbmcgV2ViIEZsb3cgbWVjaGFuaXNtIG9mIHBhc3NpbmcgdGhlIGZsb3cgZXhlY3V0aW9uIGlkIGFzIGEgcGFyYW1ldGVyIGlmCi0gKiBtb3JlIHRoYW4gb25lIHBhZ2UgZmxvdyBpcyBjb25maWd1cmVkIGZvciBhIGdpdmVuIFVSSS4KLSAqIAotICogPHA+VGhlIDxjb2RlPl9yZXNldDwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVzZXQgdGhlIGZsb3cgZXhlY3V0aW9uIGlkIGNvb2tpZSB2YWx1ZS4KLSAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBkdXJpbmcgZGV2ZWxvcG1lbnQgd2hlbiB0aGUgYXBwbGljYXRpb24gc2VydmVyIG1heSBiZSByZXN0YXJ0ZWQgb2Z0ZW4uIFRoZSBmbG93IGV4ZWN1dGlvbiBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZSBpZCBzdG9yZWQgaW4gdGhlIGNvb2tpZSBtYXkgYmUgbG9zdCBhZnRlciBhIHJlc3RhcnQuIE5vcm1hbGx5IHRoZSBicm93c2VyIG5lZWRzIHRvIGJlIGNsb3NlZCB0byByZW1vdmUgdGhlIGNvb2tpZQotICogdmFsdWUuIFRoZSA8Y29kZT5fcmVzZXQ8L2NvZGU+IHBhcmFtZXRlciBkb2VzIHRoaXMgZm9yIHlvdS4gUmVtb3ZlIHRoZSBwYXJhbWV0ZXIgZnJvbSB0aGUgVVJMIHRvIGNvbnRpbnVlIHdvcmtpbmcKLSAqIHdpdGggZmxvdyAobm90IHJlbW92aW5nIGl0IHdpbGwgcmVzZXQgdGhlIGNvb2tpZSB2YWx1ZSBvbiBlYWNoIHJlcXVlc3QpLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAxOSwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyIGV4dGVuZHMKLQkJU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT1dfRVhFQ1VUSU9OX0lEX0NPT0tJRV9OQU1FID0gR3JhaWxzU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICIkRmxvd0V4ZWN1dGlvbklkQ29va2llIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVRfUEFSQU1FVEVSID0gIl9yZXNldCI7Ci0JCi0JcHVibGljIEdyYWlsc1NlcnZsZXRGbG93RXhlY3V0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyKEZsb3cgZmxvdykgewotCQlzdXBlcihmbG93KTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzU2VydmxldEZsb3dFeGVjdXRpb25NYW5hZ2VyKEZsb3dMb2NhdG9yIGZsb3dMb2NhdG9yKSB7Ci0JCXN1cGVyKGZsb3dMb2NhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXZlbnQgY3JlYXRlRXZlbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVFdmVudChyZXF1ZXN0LCByZXNwb25zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Rmxvd0V4ZWN1dGlvbklkKEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIFNlcnZsZXRFdmVudCkgewkJCQotCQkJU3RyaW5nIGZsb3dFeGVjdXRpb25JZCA9IHN1cGVyLmdldEZsb3dFeGVjdXRpb25JZChldmVudCk7Ci0JCQlpZiAoU3RyaW5nVXRpbHMuaXNCbGFuayhmbG93RXhlY3V0aW9uSWQpKSB7Ci0JCQkJU3RyaW5nIHJlc2V0VmFsdWUgPSAoU3RyaW5nKWV2ZW50LmdldFBhcmFtZXRlcihSRVNFVF9QQVJBTUVURVIpOwotCQkJCWlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHJlc2V0VmFsdWUpICYmIFRSVUUuZXF1YWxzKHJlc2V0VmFsdWUpKSB7Ci0JCQkJCSgoU2VydmxldEV2ZW50KWV2ZW50KS5nZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKFJFU0VUX1BBUkFNRVRFUiwgVFJVRSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlDb29raWVbXSBjb29raWVzID0gKChTZXJ2bGV0RXZlbnQpZXZlbnQpLmdldFJlcXVlc3QoKS5nZXRDb29raWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGNvb2tpZXMgIT0gbnVsbCAmJiBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoRkxPV19FWEVDVVRJT05fSURfQ09PS0lFX05BTUUuZXF1YWxzKGNvb2tpZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsoY29va2llc1tpXS5nZXRWYWx1ZSgpKSkgewotCQkJCQkJCXJldHVybiBjb29raWVzW2ldLmdldFZhbHVlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmxvd0V4ZWN1dGlvbklkOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEZsb3dFeGVjdXRpb25JZChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFZpZXdEZXNjcmlwdG9yIGhhbmRsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLQkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBib29sZWFuW10gY3JlYXRlZCA9IG5ldyBib29sZWFuWzFdOwotCQlmaW5hbCBib29sZWFuW10gc2Vzc2lvbkVuZGVkID0gbmV3IGJvb2xlYW5bMV07Ci0JCWZpbmFsIFN0YXRlW10gc3RhdGVFbnRlcmVkID0gbmV3IFN0YXRlWzFdOwotCQljcmVhdGVkWzBdID0gZmFsc2U7Ci0JCXNlc3Npb25FbmRlZFswXSA9IGZhbHNlOwotCQlWaWV3RGVzY3JpcHRvciB2aWV3RGVzY3JpcHRvciA9IHN1cGVyLmhhbmRsZShyZXF1ZXN0LCByZXNwb25zZSwgbmV3IEZsb3dFeGVjdXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZWQoRmxvd0V4ZWN1dGlvbkNvbnRleHQgY29udGV4dCkgewotCQkJCWNyZWF0ZWRbMF0gPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgcmVzdW1lZChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCwgRmxvd1Nlc3Npb24gZW5kZWRTZXNzaW9uKSB7Ci0JCQkJc2Vzc2lvbkVuZGVkWzBdID0gZW5kZWRTZXNzaW9uLmdldFBhcmVudCgpID09IG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUVudGVyZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCwgU3RhdGUgcHJldmlvdXNTdGF0ZSwgU3RhdGUgc3RhdGUpIHsKLQkJCQlzdGF0ZUVudGVyZWRbMF0gPSBzdGF0ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGV2ZW50U2lnbmFsZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgcmVxdWVzdFByb2Nlc3NlZChSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsb2FkZWQoRmxvd0V4ZWN1dGlvbkNvbnRleHQgY29udGV4dCwgU2VyaWFsaXphYmxlIGlkKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwYXVzZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlZChGbG93RXhlY3V0aW9uQ29udGV4dCBjb250ZXh0LCBTZXJpYWxpemFibGUgaWQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RTdWJtaXR0ZWQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgc2F2ZWQoRmxvd0V4ZWN1dGlvbkNvbnRleHQgY29udGV4dCwgU2VyaWFsaXphYmxlIGlkKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRpbmcoUmVxdWVzdENvbnRleHQgY29udGV4dCwgU3RhdGUgc3RhcnRTdGF0ZSwgTWFwIGlucHV0KSB0aHJvd3MgRW50ZXJTdGF0ZVZldG9FeGNlcHRpb24gewotCQkJfQotCQkJcHVibGljIHZvaWQgc3RhdGVFbnRlcmluZyhSZXF1ZXN0Q29udGV4dCBjb250ZXh0LCBTdGF0ZSBuZXh0U3RhdGUpIHRocm93cyBFbnRlclN0YXRlVmV0b0V4Y2VwdGlvbiB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKHZpZXdEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1ZpZXdEZWZpbmVkRXhjZXB0aW9uKCJObyB2aWV3IGRlZmluZWQgZm9yIHN0YXRlIFsiICsgc3RhdGVFbnRlcmVkWzBdLmdldElkKCkgKyAiXSEiKTsKLQkJfQotCQkKLQkJQ29va2llIGZsb3dFeGVjdXRpb25JZENvb2tpZSA9IG51bGw7Ci0JCWlmIChzZXNzaW9uRW5kZWRbMF0gfHwgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKFJFU0VUX1BBUkFNRVRFUikgIT0gbnVsbCAmJiByZXF1ZXN0LmdldEF0dHJpYnV0ZShSRVNFVF9QQVJBTUVURVIpLmVxdWFscyhUUlVFKSkpIHsKLQkJCWZsb3dFeGVjdXRpb25JZENvb2tpZSA9IG5ldyBDb29raWUoRkxPV19FWEVDVVRJT05fSURfQ09PS0lFX05BTUUsICIiKTsKLQkJfSBlbHNlIGlmIChjcmVhdGVkWzBdKSB7Ci0JCQlmbG93RXhlY3V0aW9uSWRDb29raWUgPSBuZXcgQ29va2llKEZMT1dfRVhFQ1VUSU9OX0lEX0NPT0tJRV9OQU1FLCAoU3RyaW5nKXZpZXdEZXNjcmlwdG9yLmdldEF0dHJpYnV0ZShGTE9XX0VYRUNVVElPTl9JRF9BVFRSSUJVVEUpKTsKLQkJfQotCQlpZiAoZmxvd0V4ZWN1dGlvbklkQ29va2llICE9IG51bGwpIHsKLQkJCXJlc3BvbnNlLmFkZENvb2tpZShmbG93RXhlY3V0aW9uSWRDb29raWUpOwotCQl9Ci0KLQkJcmV0dXJuIHZpZXdEZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9HU1BSZXNvbnNlV3JpdGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR1NQUmVzb25zZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjM1NzEyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9HU1BSZXNvbnNlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogTk9URTogQmFzZWQgb24gd29yayBkb25lIGJ5IG9uIHRoZSBHU1Agc3RhbmRhbG9uZSBwcm9qZWN0IChodHRwczovL2dzcC5kZXYuamF2YS5uZXQvKQotICoKLSAqIEEgYnVmZmVyZWQgd3JpdGVyIHRoYXQgd29uJ3QgY29tbWl0IHRoZSByZXNwb25zZSB1bnRpbCB0aGUgYnVmZmVyIGhhcyByZWFjaGVkIHRoZSBoaWdoCi0gKiB3YXRlciBtYXJrLCBvciB1bnRpbCBmbHVzaCgpIG9yIGNsb3NlKCkgaXMgY2FsbGVkLgotICoKLSAqIEBhdXRob3IgVHJveSBIZW5pbmdlcgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICogRGF0ZTogSmFuIDEwLCAyMDA0Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR1NQUmVzb25zZVdyaXRlciBleHRlbmRzIFByaW50V3JpdGVyIHsKLQlwcml2YXRlIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLQlwcml2YXRlIENoYXJBcnJheVdyaXRlciBvdXQwID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwotCXByaXZhdGUgV3JpdGVyIG91dDE7Ci0JcHJpdmF0ZSBpbnQgbWF4OwotCXByaXZhdGUgYm9vbGVhbiB0cm91YmxlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yLiAgVXNlIGdldEluc3RhbmNlKCkgaW5zdGVhZC4KLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAcGFyYW0gb3V0Ci0JICogQHBhcmFtIG1heAotCSAqLwotCXByaXZhdGUgR1NQUmVzb25zZVdyaXRlcihTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIENoYXJBcnJheVdyaXRlciBvdXQsIGludCBtYXgpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotCQl0aGlzLm91dDAgPSBvdXQ7Ci0JCXRoaXMubWF4ID0gbWF4OwotCX0gLy8gR1NQUmVzb25zZVdyaXRlcgotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4gIFVzZSBnZXRJbnN0YW5jZSgpIGluc3RlYWQuCi0JICogQHBhcmFtIHdyaXRlciBUaGUgdGFyZ2V0IHdyaXRlciB0byB3cml0ZSB0bwotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gbWF4Ci0JICovCi0JcHJpdmF0ZSBHU1BSZXNvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIENoYXJBcnJheVdyaXRlciBvdXQsIGludCBtYXgpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5vdXQwID0gb3V0OwotICAgICAgICB0aGlzLm91dDEgPSB3cml0ZXI7Ci0gICAgICAgIHRoaXMubWF4ID0gbWF4OwotCX0KLQotICAgIC8qKgotCSAqIE1ha2Ugc3VyZSBzdHJlYW1zIGdldCBjbG9zZWQgZXZlbnR1YWxseS4KLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWNsb3NlKCk7Ci0JCXN1cGVyLmZpbmFsaXplKCk7Ci0JfSAvLyBmaW5hbGl6ZSgpCi0KLQkvKioKLQkgKiBGbHVzaCB0aGUgc3RyZWFtIGlmIGl0J3Mgbm90IGNsb3NlZCBhbmQgY2hlY2sgaXRzIGVycm9yIHN0YXRlLgotCSAqIEVycm9ycyBhcmUgY3VtdWxhdGl2ZTsgb25jZSB0aGUgc3RyZWFtIGVuY291bnRlcnMgYW4gZXJyb3IsIHRoaXMKLQkgKiByb3V0aW5lIHdpbGwgcmV0dXJuIHRydWUgb24gYWxsIHN1Y2Nlc3NpdmUgY2FsbHMuCi0JICoKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByaW50IHN0cmVhbSBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IsIGVpdGhlciBvbiB0aGUKLQkgKiB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gb3IgZHVyaW5nIGEgZm9ybWF0IGNvbnZlcnNpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tFcnJvcigpIHsKLQkJaWYgKHN1cGVyLmNoZWNrRXJyb3IoKSkgcmV0dXJuIHRydWU7Ci0JCXJldHVybiB0cm91YmxlOwotCX0gLy8gY2hlY2tFcnJvcigpCi0KLQkvKioKLQkgKiBDbG9zZSB0aGUgc3RyZWFtLgotCSAqIEBzZWUgI2NoZWNrRXJyb3IoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZiAoIXJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKLQkJCXJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgob3V0MC5zaXplKCkpOwotCQl9Ci0JCWZsdXNoKCk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfSAvLyBjbG9zZSgpCi0KLQkvKioKLQkgKiBGbHVzaCB0aGUgc3RyZWFtLgotCSAqIEBzZWUgI2NoZWNrRXJyb3IoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmbHVzaCgpIHsKLQkJaWYgKHRyb3VibGUpIHJldHVybjsKLQkJc3VwZXIuZmx1c2goKTsKLQkJaWYgKG91dDEgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvdXQxID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdHJvdWJsZSA9IHRydWU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlvdXQxLndyaXRlKG91dDAudG9DaGFyQXJyYXkoKSk7Ci0JCQlvdXQwLnJlc2V0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRyb3VibGUgPSB0cnVlOwotCQl9Ci0JfSAvLyBmbHVzaCgpCi0KLQkvKioKLQkgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIHRoZSB3cml0ZXIuCi0JICogQHBhcmFtIHJlc3BvbnNlCi0JICogQHBhcmFtIG1heAotCSAqIEByZXR1cm4gIEEgR1NQUmVzb25zZVdyaXRlciBpbnN0YW5jZQotCSAqLwotCXN0YXRpYyBHU1BSZXNvbnNlV3JpdGVyIGdldEluc3RhbmNlKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgaW50IG1heCkgewotCQlyZXR1cm4gbmV3IEdTUFJlc29uc2VXcml0ZXIocmVzcG9uc2UsIG5ldyBDaGFyQXJyYXlXcml0ZXIobWF4KSwgbWF4KTsKLQl9IC8vIGdldEluc3RhbmNlKCkKLQotCS8qKgotCSAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgdGhlIHdyaXRlci4KLQkgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgd3JpdGVyIHRvIHdyaXRlIHRvbwotCSAqIEBwYXJhbSBtYXgKLQkgKiBAcmV0dXJuICBBIEdTUFJlc29uc2VXcml0ZXIgaW5zdGFuY2UKLQkgKi8KLQlzdGF0aWMgR1NQUmVzb25zZVdyaXRlciBnZXRJbnN0YW5jZShXcml0ZXIgdGFyZ2V0LCBpbnQgbWF4KSB7Ci0JCXJldHVybiBuZXcgR1NQUmVzb25zZVdyaXRlcih0YXJnZXQsIG5ldyBDaGFyQXJyYXlXcml0ZXIobWF4KSwgbWF4KTsKLQl9IC8vIGdldEluc3RhbmNlKCkKLQotICAgIC8qKgotCSAqIFByaW50IGFuIG9iamVjdC4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgdGhlIDxjb2RlPntAbGluawotCSAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihPYmplY3QpfTwvY29kZT4gbWV0aG9kIGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcwotCSAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCi0JICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPgotCSAqIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSAgICAgIG9iaiAgIFRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGJlIHByaW50ZWQKLQkgKiBAc2VlICAgICAgICBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkgb2JqID0gIiI7Ci0JCXdyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOwotCX0KLQotCS8qKgotCSAqIFByaW50IGEgc3RyaW5nLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHN0cmluZwotCSAqIDxjb2RlPiIiPC9jb2RlPiBpcyBwcmludGVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RyaW5nJ3MgY2hhcmFjdGVycyBhcmUKLQkgKiBjb252ZXJ0ZWQgaW50byBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKLQkgKiBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKLQkgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gICAgICBzICAgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgcHJpbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpIHMgPSAiIjsKLQkJd3JpdGUocyk7Ci0JfSAvLyBwcmludCgpCi0KLQkvKioKLQkgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0JICogQHBhcmFtIGMgaW50IHNwZWNpZnlpbmcgYSBjaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgewotCQlpZiAodHJvdWJsZSkgcmV0dXJuOwotCQlzdXBlci53cml0ZShjKTsKLQkJaWYgKG91dDAuc2l6ZSgpID49IG1heCkgewotCQkJZmx1c2goKTsKLQkJfQotCX0gLy8gd3JpdGUoKQotCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCi0JICogQHBhcmFtIGJ1ZiBBcnJheSBvZiBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIG9mZiBPZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCB3cml0aW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSwgaW50IG9mZiwgaW50IGxlbikgewotCQlpZiAodHJvdWJsZSB8fCBidWYgPT0gbnVsbCB8fCBsZW4gPT0gMCkgcmV0dXJuOwotCQlzdXBlci53cml0ZShidWYsIG9mZiwgbGVuKTsKLQkJaWYgKG91dDAuc2l6ZSgpID49IG1heCkgewotCQkJZmx1c2goKTsKLQkJfQotCX0gLy8gd3JpdGUoKQotCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgc3RyaW5nLgotCSAqIEBwYXJhbSBzIEEgU3RyaW5nCi0JICogQHBhcmFtIG9mZiBPZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCB3cml0aW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKLQkJaWYgKHRyb3VibGUgfHwgcyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCQlzdXBlci53cml0ZShzLCBvZmYsIGxlbik7Ci0JCWlmIChvdXQwLnNpemUoKSA+PSBtYXgpIHsKLQkJCWZsdXNoKCk7Ci0JCX0KLQl9IC8vIHdyaXRlKCkKLQotfSAvLyBHU1BSZXNvbnNlV3JpdGVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR1NQV3JpdGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR1NQV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTU0ODQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL0dTUFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi0vKioKLSAqIEEgUHJpbnRXcml0ZXIgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBHU1AgcGFnZXMgdGhhdCBhbGxvd3MgcHJpbnRpbmcgdG8gdGhlIHRhcmdldCBvdXRwdXQgc3RyZWFtIGFuZAotICogbWFpbnRhaW5zIGEgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGR1cmluZyB1c2FnZS4KLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMy1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR1NQV3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotICAgIHByaXZhdGUgaW50IGxpbmVOdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElORV9CUkVBSyA9IFBhdHRlcm4uY29tcGlsZSgiXFxyXFxufFxcbnxcXHIiKTsKLQotICAgIHB1YmxpYyBHU1BXcml0ZXIoV3JpdGVyIG91dCkgewotICAgICAgICBzdXBlcihvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgc3VwZXIud3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgIE1hdGNoZXIgbSA9IExJTkVfQlJFQUsubWF0Y2hlcihzKTsKLSAgICAgICAgd2hpbGUobS5maW5kKCkpIHsKLSAgICAgICAgICAgIGxpbmVOdW1iZXIrKzsKLSAgICAgICAgfQotICAgICAgICBzdXBlci53cml0ZShzLCBvZmYsIGxlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHsKLSAgICAgICAgaWYoYyA9PSAnXG4nIHx8IGM9PSdccicpCi0gICAgICAgICAgICBsaW5lTnVtYmVyKys7Ci0gICAgICAgIHN1cGVyLndyaXRlKGMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG5Ub1Jlc3BvbnNlKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmKHMgPT0gbnVsbCkgcyA9ICInJyI7Ci0gICAgICAgIHN1cGVyLnByaW50KCJvdXQucHJpbnQoIik7Ci0gICAgICAgIHN1cGVyLnByaW50KHMpOwotICAgICAgICBzdXBlci5wcmludCgiKSIpOwotICAgICAgICB0aGlzLnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuVG9CdWZmZXIoU3RyaW5nIHMsIGludCBpbmRleCkgewotICAgICAgICBpZihzID09IG51bGwpIHMgPSAiJyciOwotICAgICAgICBzdXBlci5wcmludCgiYnVmIitpbmRleCsiIDw8ICIpOwotICAgICAgICBzdXBlci5wcmludChzKTsKLSAgICAgICAgdGhpcy5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHsKLSAgICAgICAgdGhpcy5saW5lTnVtYmVyKys7Ci0gICAgICAgIHN1cGVyLnByaW50bG4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRMaW5lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR3Jvb3Z5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE0YjgzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNUYWdMaWJDbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLlRhZ0xpYkR5bmFtaWNNZXRob2RzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkRlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuZXhjZXB0aW9ucy5HcmFpbHNUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIE5PVEU6IEJhc2VkIG9uIHdvcmsgZG9uZSBieSBvbiB0aGUgR1NQIHN0YW5kYWxvbmUgcHJvamVjdCAoaHR0cHM6Ly9nc3AuZGV2LmphdmEubmV0LykKLSAqCi0gKiBCYXNlIGNsYXNzIGZvciBhIEdyb292eVBhZ2UgKGF0IHRoZSBtb21lbnQgdGhlcmUgaXMgbm90aGluZyBpbiBoZXJlIGJ1dCBjb3VsZCBiZSB1c2VmdWwgZm9yIHByb3ZpZGluZyB1dGlsaXR5IG1ldGhvZHMKLSAqIGV0Yy4KLSAqCi0gKiBAYXV0aG9yIFRyb3kgSGVuaW5nZXIKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICoKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyb292eVBhZ2UgZXh0ZW5kcyBTY3JpcHQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhHcm9vdnlQYWdlLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAicmVxdWVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9DT05URVhUID0gImFwcGxpY2F0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJyZXNwb25zZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUID0gIm91dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFUyA9ICJhdHRyaWJ1dGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URVhUID0gImFwcGxpY2F0aW9uQ29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTiA9ICJzZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAicGFyYW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFTSCA9ICJmbGFzaCI7Ci0gICAgcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLSAgICBwcml2YXRlIEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcyBncmFpbHNBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNYXAgdGFnTGlicyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGZyb20gSFRNTCB0byBVbmljb2RlIHRleHQuICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIG1hbnkgb2YgdGhlIGVuY29kZWQgSFRNTAotICAgICAqIGNoYXJhY3RlcnMgdG8gbm9ybWFsIFVuaWNvZGUgdGV4dC4gIEV4YW1wbGU6ICZhbXA7bHQmc2VtaTsgdG8gJmx0Oy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tSHRtbChTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgICAgIGludCBpeHo7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgKGl4eiA9IHRleHQubGVuZ3RoKCkpID09IDApIHJldHVybiB0ZXh0OwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihpeHopOwotICAgICAgICBTdHJpbmcgcmVwID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaXggPSAwOyBpeCA8IGl4ejsgaXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaXgpOwotICAgICAgICAgICAgaWYgKGMgPT0gJyYnKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3ViID0gdGV4dC5zdWJzdHJpbmcoaXggKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdWIuc3RhcnRzV2l0aCgibHQ7IikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjID0gJzwnOwotICAgICAgICAgICAgICAgICAgICBpeCArPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHN1Yi5zdGFydHNXaXRoKCJndDsiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSAnPic7Ci0gICAgICAgICAgICAgICAgICAgIGl4ICs9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoc3ViLnN0YXJ0c1dpdGgoImFtcDsiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSAnJic7Ci0gICAgICAgICAgICAgICAgICAgIGl4ICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoc3ViLnN0YXJ0c1dpdGgoIm5ic3A7IikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjID0gJyAnOwotICAgICAgICAgICAgICAgICAgICBpeCArPSA1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHN1Yi5zdGFydHNXaXRoKCJzZW1pOyIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9ICc7JzsKLSAgICAgICAgICAgICAgICAgICAgaXggKz0gNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIChzdWIuc3RhcnRzV2l0aCgiIyIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjMiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGl5ID0gaXggKyAxOyBpeSA8IGl4ejsgaXkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjMSA9IHRleHQuY2hhckF0KGl5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMSA+PSAnMCcgJiYgYzEgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gKGNoYXIpKGMyICogMTAgKyBjMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYzEgPT0gJzsnKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeCA9IGl5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVwICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChyZXApOwotICAgICAgICAgICAgICAgIHJlcCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGJ1Zi5hcHBlbmQoYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0gLy8gZnJvbUh0bWwoKQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgLy8gaW4gR1NQIHdlIGFzc3VtZSBpZiBhIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QgdGhhdAotICAgICAgICAvLyBpdCBpcyBudWxsIHJhdGhlciB0aGFuIHRocm93IGFuIGVycm9yIHRoaXMgd29ya3MgbmljZWx5Ci0gICAgICAgIC8vIHdpdGggdGhlIEdyb292eSBUcnV0aAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZSkgewotICAgICAgICAgICAgICBpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJObyBwcm9wZXJ0eSBbIitwcm9wZXJ0eSsiXSBmb3VuZCBpbiBHU1AgcmV0dXJuaW5nIG51bGwiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGludm9rZXMgYSBkeW5hbWljIHRhZwotICAgICAqCi0gICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZwotICAgICAqIEBwYXJhbSBhdHRycyBUaGUgdGFncyBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIGJvZHkgIFRoZSBib2R5IG9mIHRoZSB0YWcgYXMgYSBjbG9zdXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlVGFnKFN0cmluZyB0YWdOYW1lLCBNYXAgYXR0cnMsIENsb3N1cmUgYm9keSkgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgV3JpdGVyIG91dCA9IChXcml0ZXIpYmluZGluZy5nZXRWYXJpYWJsZShHcm9vdnlQYWdlLk9VVCk7Ci0KLSAgICAgICAgaWYodGhpcy5hcHBsaWNhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgaW5pdFBhZ2VTdGF0ZSgpOwotCi0gICAgICAgIEdyb292eU9iamVjdCB0YWdMaWIgPSBnZXRUYWdMaWIodGFnTmFtZSk7Ci0KLSAgICAgICAgaWYodGFnTGliICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhZ0xpYi5zZXRQcm9wZXJ0eSggIFRhZ0xpYkR5bmFtaWNNZXRob2RzLk9VVF9QUk9QRVJUWSwgb3V0ICk7Ci0gICAgICAgICAgICBPYmplY3QgdGFnTGliUHJvcDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFnTGliUHJvcCA9IHRhZ0xpYi5nZXRQcm9wZXJ0eSh0YWdOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJUYWcgWyIrdGFnTmFtZSsiXSBkb2VzIG5vdCBleGlzdCBpbiB0YWcgbGlicmFyeSBbIit0YWdMaWIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHRhZ0xpYlByb3AgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgICAgICAgICAgQ2xvc3VyZSB0YWcgPSAoQ2xvc3VyZSl0YWdMaWJQcm9wOwotICAgICAgICAgICAgICAgIGlmKHRhZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZy5jYWxsKCBuZXcgT2JqZWN0W117IGF0dHJzIH0pOwotICAgICAgICAgICAgICAgICAgICBpZihib2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuY2FsbCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHRhZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZy5jYWxsKCBuZXcgT2JqZWN0W10geyBhdHRycywgYm9keSB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJUYWcgWyIrdGFnTmFtZSsiXSBkb2VzIG5vdCBleGlzdCBpbiB0YWcgbGlicmFyeSBbIit0YWdMaWIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIit0YWdOYW1lKyJdIGRvZXMgbm90IGV4aXN0LiBObyB0YWcgbGlicmFyeSBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UGFnZVN0YXRlKCkgewotICAgICAgICBpZih0aGlzLmFwcGxpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSAoU2VydmxldENvbnRleHQpZ2V0QmluZGluZygpLmdldFZhcmlhYmxlKFNFUlZMRVRfQ09OVEVYVCk7Ci0gICAgICAgICAgICB0aGlzLmdyYWlsc0F0dHJpYnV0ZXMgPSBuZXcgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcyhjb250ZXh0KTsKLSAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBncmFpbHNBdHRyaWJ1dGVzLmdldEdyYWlsc0FwcGxpY2F0aW9uKCk7Ci0gICAgICAgICAgICB0aGlzLmFwcENvbnRleHQgPSBncmFpbHNBdHRyaWJ1dGVzLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHcm9vdnlPYmplY3QgZ2V0VGFnTGliKFN0cmluZyB0YWdOYW1lKSB7Ci0gICAgICAgIGlmKHRoaXMuYXBwbGljYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRQYWdlU3RhdGUoKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZygpOwotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpYmluZGluZy5nZXRWYXJpYWJsZShHcm9vdnlQYWdlLlJFUVVFU1QpOwotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpYmluZGluZy5nZXRWYXJpYWJsZShHcm9vdnlQYWdlLlJFU1BPTlNFKTsKLQotICAgICAgICBHcmFpbHNUYWdMaWJDbGFzcyB0YWdMaWJDbGFzcyA9IGFwcGxpY2F0aW9uLmdldFRhZ0xpYkNsYXNzRm9yVGFnKHRhZ05hbWUpOwotICAgICAgICBpZih0YWdMaWJDbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICBHcm9vdnlPYmplY3QgdGFnTGliOwotICAgICAgICBpZih0YWdMaWJzLmNvbnRhaW5zS2V5KHRhZ0xpYkNsYXNzLmdldEZ1bGxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgdGFnTGliID0gKEdyb292eU9iamVjdCl0YWdMaWJzLmdldCh0YWdMaWJDbGFzcy5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRhZ0xpYiA9IChHcm9vdnlPYmplY3QpYXBwQ29udGV4dC5nZXRCZWFuKHRhZ0xpYkNsYXNzLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBuZXcgVGFnTGliRHluYW1pY01ldGhvZHModGFnTGliLGdyYWlsc0F0dHJpYnV0ZXMuZ2V0Q29udHJvbGxlcihyZXF1ZXN0KSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJFcnJvciBpbnN0YW50aWF0aW5nIHRhZ2xpYiBbIit0YWdMaWJDbGFzcy5nZXRGdWxsTmFtZSgpKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWdMaWJzLnB1dCh0YWdMaWJDbGFzcy5nZXRGdWxsTmFtZSgpLHRhZ0xpYik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhZ0xpYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgaW52b2tpbmcgb2YgdGFnbGlicyBhcyBtZXRob2QgY2FsbHMgd2l0aCBzaW1wbGUgYm9kaWVzLiBUaGUgYm9kaWVzIHNob3VsZCBvbmx5IGNvbnRhaW4gdGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZE5hbWUgb2YgdGhlIHRhZyB0byBjYWxsIG9yIHRoZSBtZXRob2ROYW1lIG9mIGEgbWV0aG9kIG9uIEdyb292UGFnZQotICAgICAqIEBwYXJhbSBhcmdzIFRoZSBBcmd1bWVudHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJncykgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0gICAgICAgICAgaWYoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgTE9HLmRlYnVnKCJObyBtZXRob2QgWyIrbWV0aG9kTmFtZSsiXSBmb3VuZCBpbnZva2luZyBhcyB0YWciKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXAgYXR0cnMgPSBudWxsOwotICAgICAgICAgICAgT2JqZWN0IGJvZHkgPSBudWxsOwotICAgICAgICAgICAgLy8gcmV0cmlldmUgdGFnIGxpYiBhbmQgd3JpdGVyIGZyb20gYmluZGluZwotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZygpOwotICAgICAgICAgICAgZmluYWwgV3JpdGVyIG91dCA9IChXcml0ZXIpYmluZGluZy5nZXRWYXJpYWJsZShHcm9vdnlQYWdlLk9VVCk7Ci0gICAgICAgICAgICBHcm9vdnlPYmplY3QgdGFnTGliID0gZ2V0VGFnTGliKG1ldGhvZE5hbWUpOwotCi0gICAgICAgICAgICAvLyBnZXQgYXR0cmlidXRlcyBhbmQgYm9keSBjbG9zdXJlCi0gICAgICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJnQXJyYXkgPSAoT2JqZWN0W10pYXJnczsKLSAgICAgICAgICAgICAgICBpZihhcmdBcnJheS5sZW5ndGggPiAwICYmIGFyZ0FycmF5WzBdIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgICAgICAgICBhdHRycyA9IChNYXApYXJnQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgaWYoYXJnQXJyYXkubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJnQXJyYXlbMV07Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKGFyZ3MgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICBhdHRycyA9IChNYXApYXJnczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW4gYSBkaXJlY3QgaW52b2NhdGlvbiB0aGUgYm9keSBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBzdHJpbmcKLSAgICAgICAgICAgIC8vIGludm9rZSB0aGUgYm9keSBjbG9zdXJlIGFuZCBjcmVhdGUgYSBuZXcgY2xvc3VyZSB0aGF0IG91dHB1dHMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByZXNwb25zZSB3cml0ZXIgb24gZWFjaCBib2R5IGludm9rYXRpb24KLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBib2R5MSA9IGJvZHk7Ci0gICAgICAgICAgICBDbG9zdXJlIGFjdHVhbEJvZHkgPSBuZXcgQ2xvc3VyZSh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChuZXcgT2JqZWN0W10ge29ian0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gYXJncykgewotICAgICAgICAgICAgICAgICAgICBpZihib2R5MSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYm9keVJlc3BvbnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm9keTEgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVJlc3BvbnNlID0gKChDbG9zdXJlKWJvZHkxKS5jYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5UmVzcG9uc2UgPSBib2R5MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm9keVJlc3BvbnNlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJvZHlSZXNwb25zZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIkkvTyBlcnJvciBpbnZva2luZyB0YWcgbGlicmFyeSBjbG9zdXJlIFsiK21ldGhvZE5hbWUrIl0gYXMgbWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGlmKHRhZ0xpYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFnTGliLnNldFByb3BlcnR5KCAgVGFnTGliRHluYW1pY01ldGhvZHMuT1VUX1BST1BFUlRZLCBvdXQgKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdGFnTGliUHJvcDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0YWdMaWJQcm9wID0gdGFnTGliLmdldFByb3BlcnR5KG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZih0YWdMaWJQcm9wIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSB0YWcgPSAoQ2xvc3VyZSl0YWdMaWJQcm9wOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFnLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuY2FsbCggbmV3IE9iamVjdFtdeyBhdHRycyB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY3R1YWxCb2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQm9keS5jYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFnLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuY2FsbCggbmV3IE9iamVjdFtdIHsgYXR0cnMsIGFjdHVhbEJvZHkgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK21ldGhvZE5hbWUrIl0gZG9lcyBub3QgZXhpc3QgaW4gdGFnIGxpYnJhcnkgWyIrdGFnTGliLmdldENsYXNzKCkuZ2V0TmFtZSgpKyJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGFyZ3MgaW5zdGFuY2VvZiBPYmplY3RbXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsR3Jvb3Z5UGFnZS5jbGFzcywgKE9iamVjdFtdKWFyZ3MpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2ROYW1lLEdyb292eVBhZ2UuY2xhc3MsIG5ldyBPYmplY3RbXXsgYXJncyB9KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsR3Jvb3Z5UGFnZS5jbGFzcywgbmV3IE9iamVjdFtdeyBhcmdzIH0pOwotICAgICAgICB9Ci0gICAgfQotfSAvLyBHcm9vdnlQYWdlCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlc1NlcnZsZXQuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYWRhMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvR3Jvb3Z5UGFnZXNTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKLWltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBOT1RFOiBCYXNlZCBvbiB3b3JrIGRvbmUgYnkgb24gdGhlIEdTUCBzdGFuZGFsb25lIHByb2plY3QgKGh0dHBzOi8vZ3NwLmRldi5qYXZhLm5ldC8pCi0gKgotICogTWFpbiBzZXJ2bGV0IGNsYXNzLiAgRXhhbXBsZSB1c2FnZSBpbiB3ZWIueG1sOgotICogCTxzZXJ2bGV0PgotICogICAgICAgPHNlcnZsZXQtbmFtZT5Hcm9vdnlQYWdlc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAqICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlcy5Hcm9vdnlQYWdlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gKgkJPGluaXQtcGFyYW0+Ci0gKgkJCTxwYXJhbS1uYW1lPnNob3dTb3VyY2U8L3BhcmFtLW5hbWU+Ci0gKgkJCTxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KLSAqCQkJPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgQWxsb3dzIGRldmVsb3BlcnMgdG8gdmlldyB0aGUgaW50ZXJtZWRpYWRlIHNvdXJjZSBjb2RlLCB3aGVuIHRoZXkgcGFzcwotICoJCQkJYSBzaG93U291cmNlIGFyZ3VtZW50IGluIHRoZSBVUkwgKGVnIC9lZGl0L2xpc3Q/c2hvd1NvdXJjZT10cnVlLgotICogICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqCQk8L2luaXQtcGFyYW0+Ci0gKiAgICA8L3NlcnZsZXQ+Ci0gKgotICogQGF1dGhvciBUcm95IEhlbmluZ2VyCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb292eVBhZ2VzU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IC8qaW1wbGVtZW50cyBHcm9vdnlPYmplY3QqLyB7Ci0gICAgT2JqZWN0IHg7Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93U291cmNlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgcGFnZUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIHBhcmVudDsKLSAgICBwcml2YXRlIEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUgZW5naW5lOwotICAgIHByaXZhdGUgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIGdyYWlsc0F0dHJpYnV0ZXM7Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHNlcnZsZXQgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsgcmV0dXJuIGNvbnRleHQ7IH0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBzZXJ2bGV0LCBzZXQgaXQncyBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBjb25maWcgc2VydmxldCBzZXR0aW5ncwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBzZXJ2bGV0IGNvbnRleHQKLSAgICAgICAgY29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LmxvZygiR1NQIHNlcnZsZXQgaW5pdGlhbGl6ZWQiKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSB1c2UgdGhlIGNvcnJlY3QgY2xhc3Nsb2FkZXIgc28gdGhhdCB3ZSBjYW4gZmluZAotICAgICAgICAvLyBjbGFzc2VzIGluIGFuIGFwcGxpY2F0aW9uIHNlcnZlci4KLSAgICAgICAgcGFyZW50ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSBwYXJlbnQgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgc2hvd1NvdXJjZSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJzaG93U291cmNlIikgIT0gbnVsbDsKLSAgICAgICAgdGhpcy5ncmFpbHNBdHRyaWJ1dGVzID0gbmV3IERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMoY29udGV4dCk7Ci0gICAgfSAvLyBpbml0KCkKLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBIVFRQIEdFVCByZXF1ZXN0cy4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZG9QYWdlKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICB9IC8vIGRvR2V0KCkKLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBIVFRQIFBPU1QgcmVxdWVzdHMuCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBkb1BhZ2UocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgIH0gLy8gZG9Qb3N0KCkKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgcGFnZSBhbmQgcHJvZHVjZSBvdXRwdXQuCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9QYWdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLmVuZ2luZSA9IGdyYWlsc0F0dHJpYnV0ZXMuZ2V0UGFnZXNUZW1wbGF0ZUVuZ2luZSgpOwotICAgICAgICB0aGlzLmVuZ2luZS5zZXRTaG93U291cmNlKHRoaXMuc2hvd1NvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFnZUlkID0gZW5naW5lLmdldFBhZ2VJZChyZXF1ZXN0KTsKLSAgICAgICAgVVJMIHBhZ2VVcmwgPSBlbmdpbmUuZ2V0UGFnZVVybChjb250ZXh0LHBhZ2VJZCk7Ci0gICAgICAgIGlmIChwYWdlVXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQubG9nKCJHcm9vdnlQYWdlc1NlcnZsZXQ6ICBcIiIgKyBwYWdlVXJsICsgIlwiIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKDQwNCwgIlwiIiArIHBhZ2VVcmwgKyAiXCIgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVGVtcGxhdGUgdCA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShjb250ZXh0LHJlcXVlc3QscmVzcG9uc2UpOwotICAgICAgICBXcml0YWJsZSB3ID0gdC5tYWtlKCk7Ci0gICAgICAgIFdyaXRlciBvdXQgPSBHU1BSZXNvbnNlV3JpdGVyLmdldEluc3RhbmNlKHJlc3BvbnNlLCA4MTkyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHcud3JpdGVUbyhvdXQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0gLy8gZG9QYWdlKCkKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL0dyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Hcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBhMmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL0dyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKLWltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNvbnRyb2xsZXJEeW5hbWljTWV0aG9kczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkdldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkdldFNlc3Npb25EeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lIGJhc2VkIG9uIChidXQgbm90IGV4dGVuZGluZykgdGhlIGV4aXN0aW5nIFRlbXBsYXRlRW5naW5lIGltcGxlbWVudGF0aW9ucwotICogd2l0aGluIEdyb292eS4gSXQgYWxsb3dzIEdTUCBwYWdlcyB0byBiZSByZS11c2VkIGluIGRpZmZlcmVudCBjb250ZXh0IHVzaW5nIGNvZGUgbGlrZSB0aGUgYmVsb3c6Ci0gKgotICogPGNvZGU+Ci0gKiAgICAgIFRlbXBsYXRlIHQgPSBuZXcgR3Jvb3Z5UGFnZXNUZW1wbGF0ZUVuZ2luZSgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVRlbXBsYXRlKGNvbnRleHQscmVxdWVzdCxyZXNwb25zZSk7Ci0gKiAgICAgIHQubWFrZSgpCi0gKiAgICAgICAud3JpdGVUbyhvdXQpOwotICogPC9jb2RlPgotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDEyLUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgcGFnZUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgcGFyZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93U291cmNlOwotICAgIHByaXZhdGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2hvd1NvdXJjZShib29sZWFuIHNob3dTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5zaG93U291cmNlID0gc2hvd1NvdXJjZTsKLSAgICB9Ci0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFnZU1ldGEgewotICAgICAgICBwcml2YXRlIENsYXNzIHNlcnZsZXRTY3JpcHRDbGFzczsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsKLSAgICAgICAgcHJpdmF0ZSBNYXAgZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBncm9vdnlTb3VyY2U7Ci0gICAgfSAvLyBQYWdlTWV0YQotCi0KLSAgICBwdWJsaWMgR3Jvb3Z5UGFnZXNUZW1wbGF0ZUVuZ2luZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEByZXR1cm4gIFRoZSBjcmVhdGVkIHRlbXBsYXRlIG9yIG51bGwgaWYgdGhlIHBhZ2Ugd2FzIG5vdCBmb3VuZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoU2VydmxldENvbnRleHQgY29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgcGFyZW50ID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgIFN0cmluZyB1cmkgPSBnZXRQYWdlSWQocmVxdWVzdCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZSh1cmksY29udGV4dCxyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZm9yIHRoZSBzcGVjaWZpZWQgdXJpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgdGVtcGxhdGUgb3IgbnVsbCBpZiB0aGUgcGFnZSB3YXMgbm90IGZvdW5kIGZvciB0aGUgc3BlY2lmaWVkIHVyaQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgIHB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZShTdHJpbmcgdXJpLCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHBhZ2VVcmwgPSBnZXRQYWdlVXJsKGNvbnRleHQsdXJpKTsKLSAgICAgICAgaWYgKHBhZ2VVcmwgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5sb2coIkdyb292eVBhZ2VzU2VydmxldDogIFwiIiArIHBhZ2VVcmwgKyAiXCIgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHNwaWxsR3Jvb3Z5ID0gc2hvd1NvdXJjZSAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcigic2hvd1NvdXJjZSIpICE9IG51bGw7Ci0KLSAgICAgICAgUGFnZU1ldGEgcGFnZU1ldGEgPSBnZXRQYWdlKHVyaSwgY29udGV4dCxwYWdlVXJsLCBzcGlsbEdyb292eSk7Ci0gICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5UGFnZXNUZW1wbGF0ZShjb250ZXh0LHJlcXVlc3QscmVzcG9uc2UscGFnZU1ldGEsc3BpbGxHcm9vdnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGFnZSBpZGVudGlmaWVyLgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHJldHVybiBUaGUgcGFnZSBpZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZUlkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgR3Jvb3Z5IHNjcmlwdCAoaW50ZXJuIHRoZSBuYW1lIHNvIHRoYXQgd2UgY2FuCi0gICAgICAgIC8vIGxvY2sgb24gaXQpCi0gICAgICAgIGludCBjb250ZXh0TGVuZ3RoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpLmxlbmd0aCgpOwotICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuc3Vic3RyaW5nKGNvbnRleHRMZW5ndGgpLmludGVybigpOwotICAgIH0gLy8gZ2V0UGFnZUlkKCkKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGFnZSBVUkwgZnJvbSB0aGUgcmVxdWVzdCBwYXRoLgotICAgICAqIEBwYXJhbSBwYWdlSWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVVJMIGdldFBhZ2VVcmwoU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIHBhZ2VJZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlIGV4aXN0cyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0gICAgICAgIGlmKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIkxvYWRpbmcgR1NQIGZvciB1cmwgWyIrcGFnZUlkKyJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2UocGFnZUlkKTsKLSAgICB9IC8vIGdldFBhZ2VVcmwoKQotCi0gICAgLyoqCi0gICAgICogTG9va3VwIHBhZ2UgY2xhc3Mgb3IgbG9hZCBuZXcgb25lIGlmIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIHBhZ2VVcmwKLSAgICAgKiBAcGFyYW0gc3BpbGxHcm9vdnkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBhZ2VNZXRhIGdldFBhZ2UoU3RyaW5nIHVyaSwgU2VydmxldENvbnRleHQgY29udGV4dCxVUkwgcGFnZVVybCwgYm9vbGVhbiBzcGlsbEdyb292eSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiAgewotICAgICAgICAgICAgLy8gTG9jayBvbiB0aGUgdXJpIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNvbXBpbGUgb2NjdXJzIGZvciBhbnkgc2NyaXB0Ci0gICAgICAgIHN5bmNocm9uaXplZCAodXJpKSB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBVUkxDb25uZWN0aW9uCi0gICAgICAgICAgICBVUkxDb25uZWN0aW9uIGdyb292eVNjcmlwdENvbm4gPSBwYWdlVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gVVJMIGxhc3QgbW9kaWZpZWQKLSAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gZ3Jvb3Z5U2NyaXB0Q29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgY2FjaGUgZm9yIHRoZSBzY3JpcHQKLSAgICAgICAgICAgIFBhZ2VNZXRhIHBhZ2VNZXRhID0gKFBhZ2VNZXRhKXBhZ2VDYWNoZS5nZXQodXJpKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFnZU1ldGEgaXNuJ3QgbnVsbCBjaGVjayBhbGwgdGhlIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgYm9vbGVhbiBkZXBlbmRlbmN5T3V0T2ZEYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocGFnZU1ldGEgIT0gbnVsbCAmJiAhc3BpbGxHcm9vdnkpIHsKLSAgICAgICAgICAgICAgICBpc1BhZ2VOZXcocGFnZU1ldGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2VNZXRhID09IG51bGwgfHwgcGFnZU1ldGEubGFzdE1vZGlmaWVkIDwgbGFzdE1vZGlmaWVkIHx8IGRlcGVuZGVuY3lPdXRPZkRhdGUgfHwgc3BpbGxHcm9vdnkpIHsKLSAgICAgICAgICAgICAgICBwYWdlTWV0YSA9IG5ld1BhZ2UodXJpLCBjb250ZXh0LGdyb292eVNjcmlwdENvbm4sIGxhc3RNb2RpZmllZCwgc3BpbGxHcm9vdnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhZ2VNZXRhOwotICAgICAgICB9Ci0gICAgfSAvLyBnZXRQYWdlKCkKLQotICAgLyoqCi0gICAgICogTG9hZCBhbmQgY29tcGlsZSBuZXcgcGFnZS4KLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGdyb292eVNjcmlwdENvbm4KLSAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkCi0gICAgICogQHBhcmFtIHNwaWxsR3Jvb3Z5Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhZ2VNZXRhIG5ld1BhZ2UoU3RyaW5nIHVyaSwgU2VydmxldENvbnRleHQgY29udGV4dCxVUkxDb25uZWN0aW9uIGdyb292eVNjcmlwdENvbm4sIGxvbmcgbGFzdE1vZGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNwaWxsR3Jvb3Z5KSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBQYXJzZSBwYXJzZSA9IG5ldyBQYXJzZSh1cmksIGdyb292eVNjcmlwdENvbm4uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gcGFyc2UucGFyc2UoKTsKLQotICAgICAgICAvLyBNYWtlIGEgbmV3IHBhZ2VNZXRhCi0gICAgICAgIFBhZ2VNZXRhIHBhZ2VNZXRhID0gbmV3IFBhZ2VNZXRhKCk7Ci0KLSAgICAgICAgICAgIC8vIGp1c3QgcmV0dXJuIGdyb292eSBhbmQgZG9uJ3QgY29tcGlsZSBpZiBhc2tlZAotICAgICAgICBpZiAoc3BpbGxHcm9vdnkpIHsKLSAgICAgICAgICAgIHBhZ2VNZXRhLmdyb292eVNvdXJjZSA9IGluOwotICAgICAgICAgICAgcmV0dXJuIHBhZ2VNZXRhOwotICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDb21waWxlIHRoZSBzY3JpcHQgaW50byBhbiBvYmplY3QKLQotICAgICAgICBMb2FkZXIgbG9hZGVyID0gbmV3IExvYWRlcihjbGFzc0xvYWRlciwgY29udGV4dCwgdXJpLCBwYWdlTWV0YS5kZXBlbmRlbmNpZXMpOwotICAgICAgICBDbGFzcyBzY3JpcHRDbGFzczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcmlwdENsYXNzID0KLSAgICAgICAgICAgICAgICBsb2FkZXIucGFyc2VDbGFzcyhpbiwgdXJpLnN1YnN0cmluZygxKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2Ugc2NyaXB0OiAiICsgdXJpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBwYWdlTWV0YS5zZXJ2bGV0U2NyaXB0Q2xhc3MgPSBzY3JpcHRDbGFzczsKLSAgICAgICAgcGFnZU1ldGEubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotICAgICAgICBwYWdlQ2FjaGUucHV0KHVyaSwgcGFnZU1ldGEpOwotICAgICAgICByZXR1cm4gcGFnZU1ldGE7Ci0gICAgfSAvLyBuZXdQYWdlKCkKLQotICAgIC8qKgotICAgICAqIElzIHBhZ2UgbmV3IG9yIGNoYW5nZWQ/Ci0gICAgICogQHBhcmFtIHBhZ2VNZXRhIHBhZ2UgZGF0YQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21waWxlIG5lZWRlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhZ2VOZXcoUGFnZU1ldGEgcGFnZU1ldGEpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFnZU1ldGEuZGVwZW5kZW5jaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsYzsKLSAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB1cmxjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdXJsYy5zZXREb0lucHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB1cmxjLnNldERvT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBsb25nIGRlcGVuZGVudExhc3RNb2RpZmllZCA9IHVybGMuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVudExhc3RNb2RpZmllZCA+ICgoTG9uZylwYWdlTWV0YS5kZXBlbmRlbmNpZXMuZ2V0KHVybCkpLmxvbmdWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzUGFnZU5ldygpCi0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICAgICAqIEBzaW5jZSAxMi1KYW4tMjAwNgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3Jvb3Z5UGFnZXNUZW1wbGF0ZSBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKLSAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgICAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG93U291cmNlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgUGFnZU1ldGEgcGFnZU1ldGE7Ci0KLQotICAgICAgICBwdWJsaWMgR3Jvb3Z5UGFnZXNUZW1wbGF0ZShTZXJ2bGV0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU1ldGEgcGFnZU1ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd1NvdXJjZSkgewotICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgICAgIHRoaXMuc2hvd1NvdXJjZSA9IHNob3dTb3VyY2U7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VNZXRhID0gcGFnZU1ldGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgV3JpdGFibGUgbWFrZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5UGFnZVRlbXBsYXRlV3JpdGFibGUoY29udGV4dCxyZXF1ZXN0LHJlc3BvbnNlLHBhZ2VNZXRhLHNob3dTb3VyY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdyaXRhYmxlIG1ha2UoTWFwIGJpbmRpbmcpIHsKLSAgICAgICAgICAgIEdyb292eVBhZ2VUZW1wbGF0ZVdyaXRhYmxlIGdwdHcgPSBuZXcgR3Jvb3Z5UGFnZVRlbXBsYXRlV3JpdGFibGUoY29udGV4dCxyZXF1ZXN0LHJlc3BvbnNlLHBhZ2VNZXRhLHNob3dTb3VyY2UpOwotICAgICAgICAgICAgZ3B0dy5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgICAgcmV0dXJuIGdwdHc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICAgICAqIEBzaW5jZSAxMi1KYW4tMjAwNgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3Jvb3Z5UGFnZVRlbXBsYXRlV3JpdGFibGUgaW1wbGVtZW50cyBXcml0YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICAgICAgcHJpdmF0ZSBQYWdlTWV0YSBwYWdlTWV0YTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3dTb3VyY2U7Ci0gICAgICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBNYXAgYWRkaXRpb25hbEJpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHB1YmxpYyBHcm9vdnlQYWdlVGVtcGxhdGVXcml0YWJsZShTZXJ2bGV0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU1ldGEgcGFnZU1ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3dTb3VyY2UpIHsKLSAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VNZXRhID0gcGFnZU1ldGE7Ci0gICAgICAgICAgICB0aGlzLnNob3dTb3VyY2UgPSBzaG93U291cmNlOwotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoTWFwIGJpbmRpbmcpIHsKLSAgICAgICAgICAgIGlmKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxCaW5kaW5nID0gYmluZGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHNob3dTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGl0IHRvIFRFWFQKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOyAvLyBtdXN0IGNvbWUgYmVmb3JlIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpCi0gICAgICAgICAgICAgICAgc2VuZChwYWdlTWV0YS5ncm9vdnlTb3VyY2UsIG91dCk7Ci0gICAgICAgICAgICAgICAgcGFnZU1ldGEuZ3Jvb3Z5U291cmNlID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IGl0IHRvIEhUTUwgYnkgZGVmYXVsdAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsgLy8gbXVzdCBjb21lIGJlZm9yZSByZXNwb25zZS5nZXRXcml0ZXIoKQotICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEJpbmRpbmcocmVxdWVzdCwgcmVzcG9uc2UsIG91dCk7Ci0gICAgICAgICAgICAgICAgU2NyaXB0IHBhZ2UgPSBJbnZva2VySGVscGVyLmNyZWF0ZVNjcmlwdChwYWdlTWV0YS5zZXJ2bGV0U2NyaXB0Q2xhc3MsIGJpbmRpbmcpOwotICAgICAgICAgICAgICAgIHBhZ2UucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvcHkgYWxsIG9mIGlucHV0IHRvIG91dHB1dC4KLSAgICAgICAgICogQHBhcmFtIGluCi0gICAgICAgICAqIEBwYXJhbSBvdXQKLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmQoSW5wdXRTdHJlYW0gaW4sIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcls4MTkyXTsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWFkID0gcmVhZGVyLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWQgPD0gMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvLyBzZW5kKCkKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZXBhcmUgQmluZGluZ3MgYmVmb3JlIGluc3RhbnRpYXRpbmcgcGFnZS4KLSAgICAgICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlCi0gICAgICAgICAqIEBwYXJhbSBvdXQKLSAgICAgICAgICogQHJldHVybiB0aGUgQmluZGluZ3MKLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIEJpbmRpbmcgZ2V0QmluZGluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgV3JpdGVyIG91dCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBzY3JpcHQgY29udGV4dAotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgR3Jvb3Z5T2JqZWN0IGNvbnRyb2xsZXIgPSAoR3Jvb3Z5T2JqZWN0KXJlcXVlc3QuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5DT05UUk9MTEVSKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoR3Jvb3Z5UGFnZS5SRVFVRVNULCBjb250cm9sbGVyLmdldFByb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5SRVFVRVNUX1BST1BFUlRZKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuUkVTUE9OU0UsIGNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLlJFU1BPTlNFX1BST1BFUlRZKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuRkxBU0gsIGNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkZMQVNIX1NDT1BFX1BST1BFUlRZKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuU0VSVkxFVF9DT05URVhULCBjb250ZXh0KTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0ID0gKEFwcGxpY2F0aW9uQ29udGV4dCljb250ZXh0LmdldEF0dHJpYnV0ZShHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuQVBQTElDQVRJT05fQ09OVEVYVCwgYXBwQ29udGV4dCk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyYWlsc0FwcGxpY2F0aW9uLkFQUExJQ0FUSU9OX0lELCBhcHBDb250ZXh0LmdldEJlYW4oR3JhaWxzQXBwbGljYXRpb24uQVBQTElDQVRJT05fSUQpKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLkNPTlRST0xMRVIsIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZShHcm9vdnlQYWdlLlNFU1NJT04sIGNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoR2V0U2Vzc2lvbkR5bmFtaWNQcm9wZXJ0eS5QUk9QRVJUWV9OQU1FKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuUEFSQU1TLCBjb250cm9sbGVyLmdldFByb3BlcnR5KEdldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eS5QUk9QRVJUWV9OQU1FKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKEdyb292eVBhZ2UuT1VULCBvdXQpOwotCi0KLSAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggcmVxdWVzdCBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmluZGluZyBhcyB0aGUgbW9kZWwKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gYXR0cmlidXRlRW51bSA9ICByZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7IGF0dHJpYnV0ZUVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGF0dHJpYnV0ZUVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldFZhcmlhYmxlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgga2V5LCByZXF1ZXN0LmdldEF0dHJpYnV0ZShrZXkpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWRkaXRpb25hbEJpbmRpbmcua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoa2V5LCBhZGRpdGlvbmFsQmluZGluZy5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICAgICAgfSAvLyBnZXRCaW5kaW5nKCkKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Mb2FkZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Mb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YzVjNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotLyoqCi0gKiBOT1RFOiBCYXNlZCBvbiB3b3JrIGRvbmUgYnkgb24gdGhlIEdTUCBzdGFuZGFsb25lIHByb2plY3QgKGh0dHBzOi8vZ3NwLmRldi5qYXZhLm5ldC8pCi0gKgotICogQ2xhc3MgbG9hZGVyIHRoYXQga25vd3MgYWJvdXQgbG9hZGluZyBmcm9tIGEgc2VydmxldCBjb250ZXh0IGFuZCBhYm91dCBjbGFzcyBkZXBlbmRhbmNpZXMuCi0gKgotICogQGF1dGhvciBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTAsIDIwMDQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkZXIgZXh0ZW5kcyBHcm9vdnlDbGFzc0xvYWRlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0UGF0aDsKLSAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNYXAgZGVwZW5kZW5jaWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHNlcnZsZXRQYXRoCi0gICAgICogQHBhcmFtIGRlcGVuZGVuY2llcwotICAgICAqLwotICAgIHB1YmxpYyBMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcgc2VydmxldFBhdGgsIE1hcCBkZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHNlcnZsZXRQYXRoOwotICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llczsKLSAgICB9IC8vIExvYWRlcigpCi0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmdyb292eSI7Ci0gICAgICAgIFVSTCBkZXBlbmRlbnRTY3JpcHQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXBlbmRlbnRTY3JpcHQgPSBjb250ZXh0LmdldFJlc291cmNlKCIvV0VCLUlORi9ncm9vdnkvIiArIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmIChkZXBlbmRlbnRTY3JpcHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gc2VydmxldFBhdGguc3Vic3RyaW5nKDAsIHNlcnZsZXRQYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKLSAgICAgICAgICAgICAgICBkZXBlbmRlbnRTY3JpcHQgPSBjb250ZXh0LmdldFJlc291cmNlKGN1cnJlbnQgKyBmaWxlbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUgKyAiOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlcGVuZGVudFNjcmlwdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgIiArIGNsYXNzTmFtZSArICIgaW4gd2ViYXBwIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBVUkxDb25uZWN0aW9uIGRlcGVuZGVudFNjcmlwdENvbm47Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlcGVuZGVudFNjcmlwdENvbm4gPSBkZXBlbmRlbnRTY3JpcHQub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHV0KGRlcGVuZGVudFNjcmlwdCwgbmV3IExvbmcoZGVwZW5kZW50U2NyaXB0Q29ubi5nZXRMYXN0TW9kaWZpZWQoKSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgIiArIGNsYXNzTmFtZSArICI6ICIgKyBlMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUNsYXNzKGRlcGVuZGVudFNjcmlwdENvbm4uZ2V0SW5wdXRTdHJlYW0oKSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL1BhcnNlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvUGFyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjYjI4Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvUGFyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuKjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnMuR3JhaWxzVGFnRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIE5PVEU6IEJhc2VkIG9uIHdvcmsgZG9uZSBieSBvbiB0aGUgR1NQIHN0YW5kYWxvbmUgcHJvamVjdCAoaHR0cHM6Ly9nc3AuZGV2LmphdmEubmV0LykKLSAqCi0gKiBQYXJzaW5nIGltcGxlbWVudGF0aW9uIGZvciBHU1AgZmlsZXMKLSAqCi0gKiBAYXV0aG9yIFRyb3kgSGVuaW5nZXIKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogCi0gKiBEYXRlOiBKYW4gMTAsIDIwMDQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZSBpbXBsZW1lbnRzIFRva2VucyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUGFyc2UuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQQVJBX0JSRUFLID0gUGF0dGVybi5jb21waWxlKCIvcD5cXHMqPHBbXj5dKj4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElORV9CUkVBSyA9IFBhdHRlcm4uY29tcGlsZSgiXFxyXFxufFxcbnxcXHIiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJPV19CUkVBSyA9IFBhdHRlcm4uY29tcGlsZSgiKCgvdGQ+XFxzKjwvdHI+XFxzKjwpP3RyW14+XSo+XFxzKjwpP3RkW14+XSo+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBBUlNFX1RBR19GSVJTVF9QQVNTID0gUGF0dGVybi5jb21waWxlKCIoXFxzKihcXFMrKVxccyo9XFxzKltcIl0oW15cIl0qKVtcIl1bXFxzfD5dezF9KXsxfSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEFSU0VfVEFHX1NFQ09ORF9QQVNTID0gUGF0dGVybi5jb21waWxlKCIoXFxzKihcXFMrKVxccyo9XFxzKlsnXShbXiddKilbJ11bXFxzfD5dezF9KXsxfSIpOwotCi0gICAgcHJpdmF0ZSBTY2FuIHNjYW47Ci0gICAgLy9wcml2YXRlIFN0cmluZ0J1ZmZlciBidWY7Ci0gICAgcHJpdmF0ZSBTdHJpbmdXcml0ZXIgc3c7Ci0gICAgcHJpdmF0ZSBHU1BXcml0ZXIgb3V0OwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmluYWxQYXNzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgdGFnSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgZHluYW1pY1RhZ0luZGV4OwotICAgIHByaXZhdGUgTWFwIHRhZ0NvbnRleHQ7Ci0gICAgcHJpdmF0ZSBMaXN0IHRhZ01ldGFTdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIEdyYWlsc1RhZ1JlZ2lzdHJ5IHRhZ1JlZ2lzdHJ5ID0gR3JhaWxzVGFnUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gYnVmZmVyV2hpdGVTcGFjZSA7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB3aGl0ZVNwYWNlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHByaXZhdGUgaW50W10gbGluZU51bWJlcnMgPSBuZXcgaW50WzEwMDBdOwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRPdXRwdXRMaW5lOwotCi0gICAgY2xhc3MgVGFnTWV0YSAgewotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgT2JqZWN0IGluc3RhbmNlOwotICAgICAgICBib29sZWFuIGlzRHluYW1pYzsKLSAgICAgICAgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJzZShTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNjYW4gPSBuZXcgU2NhbihyZWFkU3RyZWFtKGluKSk7Ci0gICAgICAgIG1ha2VOYW1lKG5hbWUpOwotICAgIH0gLy8gUGFyc2UoKQotCi0gICAgcHVibGljIGludFtdIGdldExpbmVOdW1iZXJNYXRyaXgoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXJzOwotICAgIH0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gcGFyc2UoKSB7Ci0KLSAgICAgICAgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIG91dCA9IG5ldyBHU1BXcml0ZXIoc3cpOwotICAgICAgICBwYWdlKCk7Ci0gICAgICAgIGZpbmFsUGFzcyA9IHRydWU7Ci0gICAgICAgIHNjYW4ucmVzZXQoKTsKLSAgICAgICAgcGFnZSgpOwotLy8JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKGJ1Zik7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN3LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dCA9IG51bGw7Ci0gICAgICAgIHNjYW4gPSBudWxsOwotICAgICAgICByZXR1cm4gaW47Ci0gICAgfSAvLyBwYXJzZSgpCi0KLSAgICBwcml2YXRlIHZvaWQgZGVjbGFyZShib29sZWFuIGdzcCkgewotICAgICAgICBpZiAoZmluYWxQYXNzKSByZXR1cm47Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgTE9HLmRlYnVnKCJwYXJzZTogZGVjbGFyZSIpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICB3cml0ZShzY2FuLmdldFRva2VuKCkudHJpbSgpLCBnc3ApOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgIH0gLy8gZGVjbGFyZSgpCi0KLSAgICBwcml2YXRlIHZvaWQgZGlyZWN0KCkgewotICAgICAgICBpZiAoZmluYWxQYXNzKSByZXR1cm47Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgTE9HLmRlYnVnKCJwYXJzZTogZGlyZWN0Iik7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gc2Nhbi5nZXRUb2tlbigpOwotICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7Ci0vLwkJTE9HLmRlYnVnKCJkaXJlY3QoIiArIHRleHQgKyAnKScpOwotICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCJwYWdlICIpKSBkaXJlY3RQYWdlKHRleHQpOwotICAgIH0gLy8gZGlyZWN0KCkKLQotICAgIHByaXZhdGUgdm9pZCBkaXJlY3RQYWdlKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyg1KS50cmltKCk7Ci0vLwkJTE9HLmRlYnVnKCJkaXJlY3RQYWdlKCIgKyB0ZXh0ICsgJyknKTsKLSAgICAgICAgUGF0dGVybiBwYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIihcXHcrKVxccyo9XFxzKlwiKFteXCJdKilcIiIpOwotICAgICAgICBNYXRjaGVyIG1hdCA9IHBhdC5tYXRjaGVyKHRleHQpOwotICAgICAgICBmb3IgKGludCBpeCA9IDA7OykgewotICAgICAgICAgICAgaWYgKCFtYXQuZmluZChpeCkpIHJldHVybjsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWF0Lmdyb3VwKDEpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbWF0Lmdyb3VwKDIpOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJpbXBvcnQiKSkgcGFnZUltcG9ydCh2YWx1ZSk7Ci0gICAgICAgICAgICBpeCA9IG1hdC5lbmQoKTsKLSAgICAgICAgfQotICAgIH0gLy8gZGlyZWN0UGFnZSgpCi0KLSAgICBwcml2YXRlIHZvaWQgZXhwcigpIHsKLSAgICAgICAgaWYgKCFmaW5hbFBhc3MpIHJldHVybjsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSBMT0cuZGVidWcoInBhcnNlOiBleHByIik7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBzY2FuLmdldFRva2VuKCkudHJpbSgpOwotICAgICAgICBvdXQucHJpbnRsblRvUmVzcG9uc2UoR3Jvb3Z5UGFnZS5mcm9tSHRtbCh0ZXh0KSk7Ci0gICAgfSAvLyBleHByKCkKLQotICAgIHByaXZhdGUgdm9pZCBodG1sKCkgewotICAgICAgICBpZiAoIWZpbmFsUGFzcykgcmV0dXJuOwotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIExPRy5kZWJ1ZygicGFyc2U6IGh0bWwiKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHNjYW4uZ2V0VG9rZW4oKSk7Ci0gICAgICAgIHdoaWxlICh0ZXh0Lmxlbmd0aCgpID4gODApIHsKLSAgICAgICAgICAgIGludCBlbmQgPSA4MDsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCBlbmQgYSBsaW5lIHdpdGggYSAnXCcKLSAgICAgICAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChlbmQgLSAxKSA9PSAnXFwnKSBlbmQtLTsKLSAgICAgICAgICAgIHByaW50KHRleHQuc3ViU2VxdWVuY2UoMCwgZW5kKSk7Ci0gICAgICAgICAgICB0ZXh0LmRlbGV0ZSgwLCBlbmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcHJpbnQodGV4dCk7Ci0gICAgICAgIH0KLSAgICB9IC8vIGh0bWwoKQotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VOYW1lKFN0cmluZyB1cmkpIHsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGludCBzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICBpZiAoc2xhc2ggPiAtMSkgewotICAgICAgICAgICAgbmFtZSA9IHVyaS5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKLSAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMCwodXJpLmxlbmd0aCgpIC0gMSkgLSBuYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIHdoaWxlKHVyaS5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygwLHVyaS5sZW5ndGgoKSAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgaWYoc2xhc2ggPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gdXJpLnN1YnN0cmluZyhzbGFzaCArIDEpICsgJ18nICsgbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG5hbWUgPSB1cmk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGZvciAoaW50IGl4ID0gMCwgaXh6ID0gbmFtZS5sZW5ndGgoKTsgaXggPCBpeHo7IGl4KyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IG5hbWUuY2hhckF0KGl4KTsKLSAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IChjID4gJzknICYmIGMgPCAnQCcpIHx8IChjID4gJ1onICYmIGMgPCAnXycpIHx8IChjID4gJ18nICYmIGMgPCAnYScpIHx8IGMgPiAneicpIGMgPSAnXyc7Ci0gICAgICAgICAgICBlbHNlIGlmIChpeCA9PSAwICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKSBjID0gJ18nOwotICAgICAgICAgICAgYnVmLmFwcGVuZChjKTsKLSAgICAgICAgfQotICAgICAgICBjbGFzc05hbWUgPSBidWYudG9TdHJpbmcoKTsKLSAgICB9IC8vIG1ha2VOYW1lKCkKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2goQ2hhclNlcXVlbmNlIHBhdCwgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCkgewotICAgICAgICBpbnQgaXggPSBzdGFydCwgaXh6ID0gdGV4dC5sZW5ndGgoKSwgaXh5ID0gc3RhcnQgKyBwYXQubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChpeHogPiBpeHkpIGl4eiA9IGl4eTsKLSAgICAgICAgaWYgKHBhdC5sZW5ndGgoKSA+IGl4eiAtIHN0YXJ0KSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoOyBpeCA8IGl4ejsgaXgrKykgewotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0ZXh0LmNoYXJBdChpeCkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShwYXQuY2hhckF0KGl4IC0gc3RhcnQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIG1hdGNoKCkKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBtYXRjaChQYXR0ZXJuIHBhdCwgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCkgewotICAgICAgICBNYXRjaGVyIG1hdCA9IHBhdC5tYXRjaGVyKHRleHQpOwotICAgICAgICBpZiAobWF0LmZpbmQoc3RhcnQpICYmIG1hdC5zdGFydCgpID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbWF0LmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gLy8gbWF0Y2goKQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhZ2UoKSB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgTE9HLmRlYnVnKCJwYXJzZTogcGFnZSIpOwotICAgICAgICBpZiAoZmluYWxQYXNzKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgb3V0LnByaW50KCJjbGFzcyAiKTsKLSAgICAgICAgICAgIG91dC5wcmludChjbGFzc05hbWUpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIiBleHRlbmRzIEdyb292eVBhZ2UgeyIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBPYmplY3QgcnVuKCkgeyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4oImltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXMuR3Jvb3Z5UGFnZSIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oImltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLioiKTsKLSAgICAgICAgfQotICAgICAgICBsb29wOiBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBzY2FuLm5leHRUb2tlbigpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRU9GOiBicmVhayBsb29wOwotICAgICAgICAgICAgICAgIGNhc2UgSFRNTDogaHRtbCgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpFWFBSOiBleHByKCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSlNDUklQVDogc2NyaXB0KGZhbHNlKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKRElSRUNUOiBkaXJlY3QoKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKREVDTEFSOiBkZWNsYXJlKGZhbHNlKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBHRVhQUjogZXhwcigpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdTQ1JJUFQ6IHNjcmlwdCh0cnVlKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBHRElSRUNUOiBkaXJlY3QoKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBHREVDTEFSOiBkZWNsYXJlKHRydWUpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdTVEFSVF9UQUc6IHN0YXJ0VGFnKCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgR0VORF9UQUc6IGVuZFRhZygpOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmluYWxQYXNzKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgIH0gLy8gcGFnZSgpCi0KLSAgICBwcml2YXRlIHZvaWQgZW5kVGFnKCkgewotICAgICAgICBpZiAoIWZpbmFsUGFzcykgcmV0dXJuOwotCi0gICAgICAgU3RyaW5nIHRhZ05hbWUgPSBzY2FuLmdldFRva2VuKCkudHJpbSgpOwotICAgICAgIGlmKHRhZ01ldGFTdGFjay5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiRm91bmQgY2xvc2luZyBHcmFpbHMgdGFnIHdpdGggbm8gb3BlbmluZyBbIit0YWdOYW1lKyJdIik7Ci0KLSAgICAgICBUYWdNZXRhIHRtID0gKFRhZ01ldGEpdGFnTWV0YVN0YWNrLnJlbW92ZSh0aGlzLnRhZ01ldGFTdGFjay5zaXplKCkgLSAxKTsKLSAgICAgICBTdHJpbmcgbGFzdEluU3RhY2sgPSB0bS5uYW1lOwotCi0gICAgICAgLy8gaWYgdGhlIHRhZyBuYW1lIGlzIGJsYW5rIHRoZW4gaXQgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBzdGFydCB0YWcgaWUgPHRhZyAvPgotICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsodGFnTmFtZSkpCi0gICAgICAgICAgICAgICB0YWdOYW1lID0gbGFzdEluU3RhY2s7Ci0KLSAgICAgICBpZighbGFzdEluU3RhY2suZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIkdyYWlscyB0YWcgWyIrdGFnTmFtZSsiXSB3YXMgbm90IGNsb3NlZCIpOwotICAgICAgIH0KLQotICAgICAgIGlmKHRhZ1JlZ2lzdHJ5LmlzU3ludGF4VGFnKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgIGlmKHRtLmluc3RhbmNlIGluc3RhbmNlb2YgR3Jvb3Z5U3ludGF4VGFnKSB7Ci0gICAgICAgICAgICAgICBHcm9vdnlTeW50YXhUYWcgdGFnID0gKEdyb292eVN5bnRheFRhZyl0bS5pbnN0YW5jZTsKLSAgICAgICAgICAgICAgIGlmKHRhZy5pc0J1ZmZlcldoaXRlU3BhY2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyV2hpdGVTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICAgICB0YWcuZG9FbmRUYWcoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiR3JhaWxzIHRhZyBbIit0YWdOYW1lKyJdIHdhcyBub3QgY2xvc2VkIik7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBpZih0bS5oYXNBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICAgICBvdXQucHJpbnRsbigiaW52b2tlVGFnKCciK3RhZ05hbWUrIicsYXR0cnMiK3RhZ0luZGV4KyIsYm9keSIrdGFnSW5kZXgrIikiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICBvdXQucHJpbnRsbigiaW52b2tlVGFnKCciK3RhZ05hbWUrIicsWzpdLGJvZHkiK3RhZ0luZGV4KyIpIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGR5bmFtaWNUYWdJbmRleC0tOwotICAgICAgIH0KLSAgICAgICB0YWdJbmRleC0tOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydFRhZygpIHsKLSAgICAgICAgaWYgKCFmaW5hbFBhc3MpIHJldHVybjsKLSAgICAgICAgdGFnSW5kZXgrKzsKLQotICAgICAgICBTdHJpbmcgdGV4dCA9IHNjYW4uZ2V0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgIFN0cmluZyB0YWdOYW1lOwotICAgICAgICBNYXAgYXR0cnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZih0ZXh0LmluZGV4T2YoJyAnKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICBpbnQgaSA9IHRleHQuaW5kZXhPZignICcpOwotICAgICAgICAgICAgICAgdGFnTmFtZSA9IHRleHQuc3Vic3RyaW5nKDAsaSk7Ci0gICAgICAgICAgICAgICBTdHJpbmcgYXR0clRva2VucyA9IHRleHQuc3Vic3RyaW5nKGksdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICBhdHRyVG9rZW5zICs9ICc+JzsgLy8gY2xvc2luZyBicmFja2V0IG1hcmtlcgotCi0gICAgICAgICAgICAgICAvLyBkbyBmaXJzdCBwYXNzIHBhcnNlIHdoaWNoIHJldHJpZXZlcyBkb3VibGUgcXVvdGVkIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBQQVJTRV9UQUdfRklSU1RfUEFTUy5tYXRjaGVyKGF0dHJUb2tlbnMpOwotICAgICAgICAgICAgICAgIHBvcHVsYXRlQXR0cmlidXRlc0Zyb21NYXRjaGVyKG0sYXR0cnMpOwotCi0gICAgICAgICAgICAgICAvLyBkbyBzZWNvbmQgcGFzcyBwYXJzZSB3aGljaCByZXRyaWV2ZXMgc2luZ2xlIHF1b3RlZCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICBtID0gUEFSU0VfVEFHX1NFQ09ORF9QQVNTLm1hdGNoZXIoYXR0clRva2Vucyk7Ci0gICAgICAgICAgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXNGcm9tTWF0Y2hlcihtLGF0dHJzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRhZ05hbWUgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgICAgIFRhZ01ldGEgdG0gPSBuZXcgVGFnTWV0YSgpOwotICAgICAgICB0bS5uYW1lID0gdGFnTmFtZTsKLSAgICAgICAgdG0uaGFzQXR0cmlidXRlcyA9ICFhdHRycy5pc0VtcHR5KCk7Ci0gICAgICAgIHRhZ01ldGFTdGFjay5hZGQodG0pOwotCi0gICAgICAgIGlmICh0YWdSZWdpc3RyeS5pc1N5bnRheFRhZyh0YWdOYW1lKSkgewotICAgICAgICAgICAgaWYodGhpcy50YWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhZ0NvbnRleHQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIHRoaXMudGFnQ29udGV4dC5wdXQoR3Jvb3Z5UGFnZS5PVVQsb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEdyb292eVN5bnRheFRhZyB0YWcgPSAoR3Jvb3Z5U3ludGF4VGFnKXRhZ1JlZ2lzdHJ5Lm5ld1RhZyh0YWdOYW1lKTsKLSAgICAgICAgICAgIHRhZy5pbml0KHRhZ0NvbnRleHQpOwotICAgICAgICAgICAgdGFnLnNldEF0dHJpYnV0ZXMoYXR0cnMpOwotICAgICAgICAgICAgaWYoIXRhZy5oYXNQcmVjZWRpbmdDb250ZW50KCkgJiYgIWJ1ZmZlcldoaXRlU3BhY2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJUYWcgWyIrdGFnLmdldE5hbWUoKSsiXSBjYW5ub3QgaGF2ZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGRpcmVjdGx5IHByZWNlZGluZyBpdC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXRhZy5oYXNQcmVjZWRpbmdDb250ZW50KCkgJiYgYnVmZmVyV2hpdGVTcGFjZSkgewotICAgICAgICAgICAgICAgIHdoaXRlU3BhY2VCdWZmZXIuZGVsZXRlKDAsd2hpdGVTcGFjZUJ1ZmZlci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyV2hpdGVTcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZih3aGl0ZVNwYWNlQnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsblRvUmVzcG9uc2Uod2hpdGVTcGFjZUJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpdGVTcGFjZUJ1ZmZlci5kZWxldGUoMCx3aGl0ZVNwYWNlQnVmZmVyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyV2hpdGVTcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKLSAgICAgICAgICAgIHRtLmluc3RhbmNlID0gdGFnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZHluYW1pY1RhZ0luZGV4Kys7Ci0gICAgICAgICAgICBpZihhdHRycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KCJhdHRycyIrdGFnSW5kZXgrIiA9IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoJzonKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGF0dHJzLmdldChuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCcsJyk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCddJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oImJvZHkiK3RhZ0luZGV4KyIgPSB7IiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQXR0cmlidXRlc0Zyb21NYXRjaGVyKE1hdGNoZXIgbSwgTWFwIGF0dHJzKSB7Ci0gICAgICAgIHdoaWxlKG0uZmluZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsID0gbS5ncm91cCgzKTsKLSAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7Ci0gICAgICAgICAgICBuYW1lID0gJ1wiJyArIG5hbWUgKyAnXCInOwotICAgICAgICAgICAgaWYodmFsLnN0YXJ0c1dpdGgoIiR7IikgJiYgdmFsLmVuZHNXaXRoKCJ9IikpIHsKLSAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDIsdmFsLmxlbmd0aCgpIC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXZhbC5zdGFydHNXaXRoKCJbIikgJiYgIXZhbC5lbmRzV2l0aCgiXSIpKSB7Ci0gICAgICAgICAgICAgICAgdmFsID0gJ1wiJyArIHZhbCArICdcIic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRycy5wdXQobmFtZSx2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhZ2VJbXBvcnQoU3RyaW5nIHZhbHVlKSB7Ci0vLwkJTE9HLmRlYnVnKCJwYWdlSW1wb3J0KCIgKyB2YWx1ZSArICcpJyk7Ci0gICAgICAgIFN0cmluZ1tdIGltcG9ydHMgPSBQYXR0ZXJuLmNvbXBpbGUoIjsiKS5zcGxpdCh2YWx1ZS5zdWJTZXF1ZW5jZSgwLCB2YWx1ZS5sZW5ndGgoKSkpOwotICAgICAgICBmb3IgKGludCBpeCA9IDA7IGl4IDwgaW1wb3J0cy5sZW5ndGg7IGl4KyspIHsKLSAgICAgICAgICAgIG91dC5wcmludCgiaW1wb3J0ICIpOwotICAgICAgICAgICAgb3V0LnByaW50KGltcG9ydHNbaXhdKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLSAgICB9IC8vIHBhZ2VJbXBvcnQoKQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50KENoYXJTZXF1ZW5jZSB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmKFBhdHRlcm4uY29tcGlsZSgiXFxTIikubWF0Y2hlcih0ZXh0KS5maW5kKCkpCi0gICAgICAgICAgICBidWZmZXJXaGl0ZVNwYWNlID0gZmFsc2U7Ci0KLSAgICAgICAgTWF0Y2hlciBtID0gTElORV9CUkVBSy5tYXRjaGVyKHRleHQpOwotICAgICAgICB3aGlsZShtLmZpbmQoKSkgewotICAgICAgICAgICAgaW5jcmVtZW50TGluZU51bWJlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmLmFwcGVuZCgnXCcnKTsKLSAgICAgICAgZm9yIChpbnQgaXggPSAwLCBpeHogPSB0ZXh0Lmxlbmd0aCgpOyBpeCA8IGl4ejsgaXgrKykgewotICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaXgpOwotICAgICAgICAgICAgU3RyaW5nIHJlcCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSByZXAgPSAiXFxuIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykgcmVwID0gIlxcciI7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09ICdcdCcpIHJlcCA9ICJcXHQiOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXCcnKSByZXAgPSAiXFwnIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xcJykgcmVwID0gIlxcXFwiOwotICAgICAgICAgICAgaWYgKHJlcCAhPSBudWxsKSBidWYuYXBwZW5kKHJlcCk7Ci0gICAgICAgICAgICBlbHNlIGJ1Zi5hcHBlbmQoYyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZCgnXCcnKTsKLSAgICAgICAgaWYoIWJ1ZmZlcldoaXRlU3BhY2UpIHsKLSAgICAgICAgICAgb3V0LnByaW50bG5Ub1Jlc3BvbnNlKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHdoaXRlU3BhY2VCdWZmZXIuYXBwZW5kKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHdoaXRlU3BhY2VCdWZmZXIuZGVsZXRlKDAsd2hpdGVTcGFjZUJ1ZmZlci5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgIH0gLy8gcHJpbnQoKQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVhZCA9IGluLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCByZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0gLy8gcmVhZFN0cmVhbSgpCi0KLSAgICBwcml2YXRlIHZvaWQgc2NyaXB0KGJvb2xlYW4gZ3NwKSB7Ci0gICAgICAgIGlmICghZmluYWxQYXNzKSByZXR1cm47Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgTE9HLmRlYnVnKCJwYXJzZTogc2NyaXB0Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIHdyaXRlKHNjYW4uZ2V0VG9rZW4oKS50cmltKCksIGdzcCk7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfSAvLyBzY3JpcHQoKQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKENoYXJTZXF1ZW5jZSB0ZXh0LCBib29sZWFuIGdzcCkgewotICAgICAgICBpZiAoIWdzcCkgewotICAgICAgICAgICAgb3V0LnByaW50KHRleHQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGl4ID0gMCwgaXh6ID0gdGV4dC5sZW5ndGgoKTsgaXggPCBpeHo7IGl4KyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHRleHQuY2hhckF0KGl4KTsKLSAgICAgICAgICAgIFN0cmluZyByZXAgPSBudWxsOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGl4Kys7IGl4IDwgaXh6OyBpeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGl4KSkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpeC0tOwotICAgICAgICAgICAgICAgICAgICByZXAgPSAiICI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2goIiZzZW1pOyIsIHRleHQsIGl4KSkgewotICAgICAgICAgICAgICAgICAgICByZXAgPSAiOyI7Ci0gICAgICAgICAgICAgICAgICAgIGl4ICs9IDU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCgiJmFtcDsiLCB0ZXh0LCBpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwID0gIiYiOwotICAgICAgICAgICAgICAgICAgICBpeCArPSA0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2goIiZsdDsiLCB0ZXh0LCBpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwID0gIjwiOwotICAgICAgICAgICAgICAgICAgICBpeCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2goIiZndDsiLCB0ZXh0LCBpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwID0gIj4iOwotICAgICAgICAgICAgICAgICAgICBpeCArPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2goIjxicj4iLCB0ZXh0LCBpeCkgfHwgbWF0Y2goIjxocj4iLCB0ZXh0LCBpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwID0gIlxuIjsKLSAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICBpeCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBtYXRjaChQQVJBX0JSRUFLLCB0ZXh0LCBpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPD0gMCkgZW5kID0gbWF0Y2goUk9XX0JSRUFLLCB0ZXh0LCBpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXAgPSAiXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXggPSBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVwICE9IG51bGwpIG91dC5wcmludChyZXApOwotICAgICAgICAgICAgZWxzZSBvdXQucHJpbnQoYyk7Ci0gICAgICAgIH0KLSAgICB9IC8vIHdyaXRlKCkKLQotICAgIHByaXZhdGUgdm9pZCBpbmNyZW1lbnRMaW5lTnVtYmVyKCkgewotICAgICAgICBpZihjdXJyZW50T3V0cHV0TGluZSA+PSBsaW5lTnVtYmVycy5sZW5ndGgpIHsKLSAgICAgICAgICAgIGxpbmVOdW1iZXJzID0gKGludFtdKXJlc2l6ZUFycmF5KGxpbmVOdW1iZXJzLCBsaW5lTnVtYmVycy5sZW5ndGggKiAyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxpbmVOdW1iZXJzW2N1cnJlbnRPdXRwdXRMaW5lKytdID0gb3V0LmdldEN1cnJlbnRMaW5lTnVtYmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCByZXNpemVBcnJheSAoT2JqZWN0IG9sZEFycmF5LCBpbnQgbmV3U2l6ZSkgewotICAgICAgIGludCBvbGRTaXplID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0TGVuZ3RoKG9sZEFycmF5KTsKLSAgICAgICBDbGFzcyBlbGVtZW50VHlwZSA9IG9sZEFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgIE9iamVjdCBuZXdBcnJheSA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKAotICAgICAgICAgICAgIGVsZW1lbnRUeXBlLG5ld1NpemUpOwotICAgICAgIGludCBwcmVzZXJ2ZUxlbmd0aCA9IE1hdGgubWluKG9sZFNpemUsbmV3U2l6ZSk7Ci0gICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoID4gMCkKLSAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5IChvbGRBcnJheSwwLG5ld0FycmF5LDAscHJlc2VydmVMZW5ndGgpOwotICAgICAgIHJldHVybiBuZXdBcnJheTsKLSAgIH0KLX0gLy8gUGFyc2UKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9SZXZlcnNlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvUmV2ZXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU0Y2Y4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9SZXZlcnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlczsKLS8qKgotICogTk9URTogQmFzZWQgb24gd29yayBkb25lIGJ5IG9uIHRoZSBHU1Agc3RhbmRhbG9uZSBwcm9qZWN0IChodHRwczovL2dzcC5kZXYuamF2YS5uZXQvKQotICoKLSAqIFV0aWxpdHkgY2xhc3MgdG8gcmV2ZXJzZSBhIGNoYXIgc2VxdWVuY2UuCi0gKgotICogQGF1dGhvciBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTAsIDIwMDQKLSAqCi0gKi8KLWNsYXNzIFJldmVyc2UgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UgewotCXByaXZhdGUgQ2hhclNlcXVlbmNlIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQsIGVuZCwgYW5jaG9yOwotCi0JUmV2ZXJzZShDaGFyU2VxdWVuY2UgdGV4dCkgewotCQl0aGlzKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOwotCX0KLQotCVJldmVyc2UoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMuZW5kID0gZW5kOwotCQlhbmNob3IgPSBlbmQgLSAxOwotCX0KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0ZXh0LmNoYXJBdChhbmNob3IgLSBpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0JCXJldHVybiBlbmQgLSBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlyZXR1cm4gbmV3IFJldmVyc2UodGV4dCwgYW5jaG9yIC0gZW5kLCBhbmNob3IgLSBzdGFydCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaW50IGxlbiA9IGxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCQlmb3IgKGludCBpeCA9IGFuY2hvcjsgaXggPj0gc3RhcnQ7IGl4LS0pIHsKLQkJCWJ1Zi5hcHBlbmQodGV4dC5jaGFyQXQoaXgpKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfSAvLyBSZXZlcnNlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvU2Nhbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZDA2NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzOwotCi0vKioKLSAqIE5PVEU6IEJhc2VkIG9uIHdvcmsgZG9uZSBieSBvbiB0aGUgR1NQIHN0YW5kYWxvbmUgcHJvamVjdCAoaHR0cHM6Ly9nc3AuZGV2LmphdmEubmV0LykKLSAqCi0gKiBMZXhlciBmb3IgR3Jvb3Z5UGFnZXNTZXJ2bGV0LgotICoKLSAqIEBhdXRob3IgVHJveSBIZW5pbmdlcgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKgotICogRGF0ZTogSmFuIDEwLCAyMDA0Ci0gKgotICovCi1jbGFzcyBTY2FuIGltcGxlbWVudHMgVG9rZW5zIHsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IGVuZDEsIGJlZ2luMSwgZW5kMiwgYmVnaW4yLCBzdGF0ZSA9IEhUTUwsIGxlbiwgbGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIHN0cjEsIHN0cjI7Ci0KLQlTY2FuKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmlwIHN0cmlwID0gbmV3IFN0cmlwKHRleHQpOwotCQlzdHJpcC5zdHJpcCgwKTsKLQkJdGhpcy50ZXh0ID0gc3RyaXAudG9TdHJpbmcoKTsKLQkJbGVuID0gdGhpcy50ZXh0Lmxlbmd0aCgpOwotCX0gLy8gU2NhbigpCi0KLQlwcml2YXRlIGludCBmb3VuZChpbnQgbmV3U3RhdGUsIGludCBza2lwKSB7Ci0JCWJlZ2luMiA9IGJlZ2luMTsKLQkJZW5kMiA9IC0tZW5kMTsKLQkJYmVnaW4xID0gZW5kMSArPSBza2lwOwotCQlpbnQgbGFzdFN0YXRlID0gc3RhdGU7Ci0JCXN0YXRlID0gbmV3U3RhdGU7Ci0JCXJldHVybiBsYXN0U3RhdGU7Ci0JfSAvLyBmb3VuZCgpCi0KLQlTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhiZWdpbjIsIGVuZDIpOwotCX0gLy8gZ2V0VG9rZW4oKQotCi0JaW50IG5leHRUb2tlbigpIHsKLQkJZm9yICg7OykgewotCQkJaW50IGxlZnQgPSBsZW4gLSBlbmQxOwotCQkJaWYgKGxlZnQgPT0gMCkgewotCQkJCWVuZDErKzsgLy8gaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgbGFzdCBsZXR0ZXIKLQkJCQlyZXR1cm4gZm91bmQoRU9GLCAwKTsKLQkJCX0KLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGVuZDErKyk7Ci0JCQljaGFyIGMxID0gbGVmdCA+IDEgPyB0ZXh0LmNoYXJBdChlbmQxKSA6IDA7Ci0JCQljaGFyIGMyID0gbGVmdCA+IDIgPyB0ZXh0LmNoYXJBdChlbmQxICsgMSkgOiAwOwotICAgICAgICAgICAgY2hhciBjMyA9IGxlZnQgPiAzID8gdGV4dC5jaGFyQXQoZW5kMSArIDIpIDogMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNoYXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGMxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjMik7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhcnRUYWcgPSBjaGFycy50b1N0cmluZygpOwotCi0gICAgICAgICAgICBTdHJpbmcgZW5kVGFnID0gICAgY2hhcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYzMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgaWYgKHN0cjEpIHsKLQkJCQlpZiAoYyA9PSAnXFwnKSBlbmQxKys7Ci0JCQkJZWxzZSBpZiAoYyA9PSAnXCcnKSBzdHIxID0gZmFsc2U7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKHN0cjIpIHsKLQkJCQlpZiAoYyA9PSAnXFwnKSBlbmQxKys7Ci0JCQkJZWxzZSBpZiAoYyA9PSAnIicpIHN0cjIgPSBmYWxzZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobGV2ZWwgPiAwICYmIChjID09ICcpJyB8fCBjID09ICd9JyB8fCBjID09ICddJykpIHsKLQkJCQlsZXZlbC0tOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJY2FzZSBIVE1MOgotCQkJCQlpZiAoYyA9PSAnPCcgJiYgbGVmdCA+IDMpIHsKLQkJCQkJCWlmIChjMSA9PSAnJScpIHsKLQkJCQkJCQlpZiAoYzIgPT0gJz0nKSB7Ci0JCQkJCQkJCXJldHVybiBmb3VuZChKRVhQUiwgMyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChjMiA9PSAnQCcpIHsKLQkJCQkJCQkJcmV0dXJuIGZvdW5kKEpESVJFQ1QsIDMpOwotCQkJCQkJCX0gZWxzZSBpZiAoYzIgPT0gJyEnKSB7Ci0JCQkJCQkJCXJldHVybiBmb3VuZChKREVDTEFSLCAzKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGMyID09ICctJyAmJiBsZWZ0ID4gMyAmJiB0ZXh0LmNoYXJBdChlbmQxICsgMikgPT0gJy0nKSB7Ci0JCQkJCQkJCWlmIChza2lwSkNvbW1lbnQoKSkgY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBmb3VuZChKU0NSSVBULCAyKTsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoc3RhcnRUYWcuZXF1YWxzKCI8ZzoiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZChHU1RBUlRfVEFHLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihlbmRUYWcuZXF1YWxzKCI8L2c6IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQoR0VORF9UQUcsNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJCcgJiYgYzEgPT0gJ3snKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoR0VYUFIsIDIpOwotCQkJCQl9IGVsc2UgaWYgKGMgPT0gJyUnICYmIGMxID09ICd7JykgewotCQkJCQkJaWYgKGMyID09ICctJyAmJiBsZWZ0ID4gMyAmJiB0ZXh0LmNoYXJBdChlbmQxICsgMikgPT0gJy0nKSB7Ci0JCQkJCQkJaWYgKHNraXBHQ29tbWVudCgpKSBjb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmb3VuZChHU0NSSVBULCAyKTsKLQkJCQkJfSBlbHNlIGlmIChjID09ICchJyAmJiBjMSA9PSAneycpIHsKLQkJCQkJCXJldHVybiBmb3VuZChHREVDTEFSLCAyKTsKLQkJCQkJfSBlbHNlIGlmIChjID09ICdAJyAmJiBjMSA9PSAneycpIHsKLQkJCQkJCXJldHVybiBmb3VuZChHRElSRUNULCAyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEpFWFBSOgotCQkJCWNhc2UgSlNDUklQVDoKLQkJCQljYXNlIEpESVJFQ1Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBKREVDTEFSOgotCQkJCQlpZiAoYyA9PSAnJScgJiYgYzEgPT0gJz4nKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoSFRNTCwgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBHU1RBUlRfVEFHOgotICAgICAgICAgICAgICAgICAgICBpZihjID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kKEhUTUwsMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjID09ICcvJyAmJiBjMSA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kKEdFTkRfVEFHLDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgR0VORF9UQUc6Ci0gICAgICAgICAgICAgICAgICAgIGlmKGMgPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQoSFRNTCwxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdFWFBSOgotCQkJCWNhc2UgR0RJUkVDVDoKLQkJCQkJaWYgKGMgPT0gJ30nICYmICFzdHIxICYmICFzdHIyICYmIGxldmVsID09IDApIHsKLQkJCQkJCXJldHVybiBmb3VuZChIVE1MLCAxKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEdTQ1JJUFQ6Ci0JCQkJCWlmIChjID09ICd9JyAmJiBjMSA9PSAnJScgJiYgIXN0cjEgJiYgIXN0cjIgJiYgbGV2ZWwgPT0gMCkgewotCQkJCQkJcmV0dXJuIGZvdW5kKEhUTUwsIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgR0RFQ0xBUjoKLQkJCQkJaWYgKGMgPT0gJ30nICYmIChjMSA9PSAnIScgfHwgYzEgPT0gJyUnKSAmJiAhc3RyMSAmJiAhc3RyMiAmJiBsZXZlbCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoSFRNTCwgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IC8vIG5leHRUb2tlbigpCi0KLQlwcml2YXRlIGJvb2xlYW4gc2tpcENvbW1lbnQoY2hhciBjMywgY2hhciBjNCkgewotCQlpbnQgaXggPSBlbmQxICsgMzsKLQkJZm9yIChpbnQgaXh6ID0gbGVuIC0gNDsgOyBpeCsrKSB7Ci0JCQlpZiAoaXggPj0gaXh6KSByZXR1cm4gZmFsc2U7Ci0JCQlpZiAodGV4dC5jaGFyQXQoaXgpID09ICctJyAmJiB0ZXh0LmNoYXJBdChpeCArIDEpID09ICctJyAmJiB0ZXh0LmNoYXJBdChpeCArIDIpID09IGMzCi0JCQkgICAgICAgICYmIHRleHQuY2hhckF0KGl4ICsgMykgPT0gYzQpIGJyZWFrOwotCQl9Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCAtLWVuZDEpICsgdGV4dC5zdWJzdHJpbmcoaXggKyA0KTsKLQkJbGVuID0gdGV4dC5sZW5ndGgoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfSAvLyBza2lwQ29tbWVudCgpCi0KLQlwcml2YXRlIGJvb2xlYW4gc2tpcEdDb21tZW50KCkgewotCQlyZXR1cm4gc2tpcENvbW1lbnQoJ30nLCAnJScpOwotCX0gLy8gc2tpcEdDb21tZW50KCkKLQotCXByaXZhdGUgYm9vbGVhbiBza2lwSkNvbW1lbnQoKSB7Ci0JCXJldHVybiBza2lwQ29tbWVudCgnJScsICc+Jyk7Ci0JfSAvLyBza2lwSkNvbW1lbnQoKQotCi0Jdm9pZCByZXNldCgpIHsKLQkJZW5kMT0gYmVnaW4xID0gZW5kMiA9IGJlZ2luMiA9IGxldmVsID0gMDsKLQkJc3RhdGUgPSBIVE1MOwotCX0gLy8gcmVzZXQoKQotCi19IC8vIFNjYW4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VzL1N0cmlwLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvU3RyaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMDA5ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvU3RyaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogTk9URTogQmFzZWQgb24gd29yayBkb25lIGJ5IG9uIHRoZSBHU1Agc3RhbmRhbG9uZSBwcm9qZWN0IChodHRwczovL2dzcC5kZXYuamF2YS5uZXQvKQotICoKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc3RyaXAgSFRNTCBmcm9tIGFyb3VuZCB0YWdzIHRoYXQgc3BlY2lmeSBpdC4KLSAqCi0gKiBAYXV0aG9yIFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICoKLSAqLwotY2xhc3MgU3RyaXAgewotCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gc3RyaXBUYWcgPSBQYXR0ZXJuLmNvbXBpbGUoIlxcXihbYS16QS1aXSspJVxceyhbXn1dfFxcfVteJV0pKlxcfSUiKTsKLQlwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIGFueVRhZyA9IFBhdHRlcm4uY29tcGlsZSgiKChcXF5bYS16QS1aXSk/JVxceyhbXn1dfFxcfVteJV0pKlxcfSV8WyRAXVxce1tefV0qXFx9KSIpOwotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgdGV4dDsKLQotCVN0cmlwKENoYXJTZXF1ZW5jZSB0ZXh0KSB7Ci0JCXRoaXMudGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC50b1N0cmluZygpKTsKLQl9IC8vIFNjYW4oKQotCi0Jdm9pZCBzdHJpcChpbnQgaW5kZXgpIHsKLQkJTWF0Y2hlciBtYXRjaCA9IHN0cmlwVGFnLm1hdGNoZXIodGV4dCk7Ci0JCWlmIChtYXRjaC5maW5kKGluZGV4KSkgewotCQkJc3RyaXAobWF0Y2guZW5kKCkpOwotCQkJU3RyaW5nIHRhZyA9IG1hdGNoLmdyb3VwKDEpOwotCQkJaW50IHN0YXJ0ID0gbWF0Y2guc3RhcnQoKSArIDEgKyB0YWcubGVuZ3RoKCk7IC8vIGJlZ2luIGFmdGVyICdedGFnJzsgYXQgdGhlICcleycKLQkJCWludCBlbmQgPSBtYXRjaC5lbmQoKTsKLQkJCVBhdHRlcm4gcGF0QWZ0ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIjwvIiArIHRhZyArICIoPnxbXj5hLXpBLVpdW14+XSo+KVxccyoiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCQkJTWF0Y2hlciBtYXRjaEFmdGVyID0gcGF0QWZ0ZXIubWF0Y2hlcih0ZXh0KTsKLQkJCWlmIChtYXRjaEFmdGVyLmZpbmQoZW5kKSkgewotCQkJCWludCBlbmQyID0gbWF0Y2hBZnRlci5lbmQoKTsKLQkJCQlNYXRjaGVyIG1hdGNoQW55ID0gYW55VGFnLm1hdGNoZXIodGV4dC5zdWJTZXF1ZW5jZSgwLCBlbmQyKSk7Ci0JCQkJaWYgKG1hdGNoQW55LmZpbmQoZW5kKSkgZW5kMiA9IG1hdGNoQW55LnN0YXJ0KCk7Ci0JCQkJUGF0dGVybiBuZXh0VGFnUGF0ID0gUGF0dGVybi5jb21waWxlKCI8IiArIHRhZyArICIoXFxzfD4pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQkJCQlNYXRjaGVyIG1hdGNoTmV4dCA9IG5leHRUYWdQYXQubWF0Y2hlcih0ZXh0LnN1YlNlcXVlbmNlKDAsIGVuZDIpKTsKLQkJCQlpZiAobWF0Y2hOZXh0LmZpbmQoZW5kKSkgZW5kMiA9IG1hdGNoTmV4dC5zdGFydCgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmlwcGluZyAiICsgdGV4dC5zdWJTZXF1ZW5jZShlbmQsIGVuZDIpKTsKLQkJCQl0ZXh0LmRlbGV0ZShlbmQsIGVuZDIpOwotCQkJfQotCQkJUGF0dGVybiBwYXRCZWZvcmUgPSBQYXR0ZXJuLmNvbXBpbGUobmV3IFJldmVyc2UoIipzXFw8IiArIHRhZykudG9TdHJpbmcoKSwKLQkJCQkJUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQkJCU1hdGNoZXIgbWF0Y2hCZWZvcmUgPSBwYXRCZWZvcmUubWF0Y2hlcihuZXcgUmV2ZXJzZSh0ZXh0LCAwLCBzdGFydCkpOwotCQkJaWYgKG1hdGNoQmVmb3JlLmZpbmQoKSkgewotCQkJCWludCBzdGFydDIgPSBzdGFydCAtIG1hdGNoQmVmb3JlLmVuZCgpOwotCQkJCU1hdGNoZXIgbWF0Y2hBbnkgPSBhbnlUYWcubWF0Y2hlcih0ZXh0LnN1YlNlcXVlbmNlKDAsIHN0YXJ0KSk7Ci0JCQkJaWYgKG1hdGNoQW55LmZpbmQoc3RhcnQyKSkgc3RhcnQyID0gbWF0Y2hBbnkuZW5kKCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaXBwaW5nICIgKyB0ZXh0LnN1YlNlcXVlbmNlKHN0YXJ0Miwgc3RhcnQpKTsKLQkJCQl0ZXh0LmRlbGV0ZShzdGFydDIsIHN0YXJ0KTsKLQkJCX0KLQkJfQotCX0gLy8gc3RyaXAoKQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gU3RyaXAKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Ub2tlbnMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlcy9Ub2tlbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmM2UwMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZXMvVG9rZW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlczsKLQotLyoqCi0gKiBOT1RFOiBCYXNlZCBvbiB3b3JrIGRvbmUgYnkgb24gdGhlIEdTUCBzdGFuZGFsb25lIHByb2plY3QgKGh0dHBzOi8vZ3NwLmRldi5qYXZhLm5ldC8pCi0gKgotICogSW50ZXJmYWNlIGRlZmluaW5nIGFuIGVudW1lcmF0aW9uIG9mIHRva2VucyBmb3IgdGhlIGRpZmZlcmVudCBzY3JpcHRsZXQgdHlwZXMKLSAqCi0gKiBAYXV0aG9yIFRyb3kgSGVuaW5nZXIKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICoKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICoKLSAqLwotaW50ZXJmYWNlIFRva2VucyB7Ci0Jc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQlzdGF0aWMgZmluYWwgaW50IEhUTUwgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgSkVYUFIgPSAxOyAgIC8vIDwlPSAuLi4gJT4KLQlzdGF0aWMgZmluYWwgaW50IEpTQ1JJUFQgPSAyOyAvLyA8JSAuLi4uICU+Ci0Jc3RhdGljIGZpbmFsIGludCBKRElSRUNUID0gMzsgLy8gPCVAIC4uLiAlPgotCXN0YXRpYyBmaW5hbCBpbnQgSkRFQ0xBUiA9IDQ7IC8vIDwlISAuLi4gJT4KLQlzdGF0aWMgZmluYWwgaW50IEdFWFBSID0gMTE7ICAgLy8gJHsgLi4uIH0KLQlzdGF0aWMgZmluYWwgaW50IEdTQ1JJUFQgPSAxMjsgLy8gJXsgLi4uIH0lCi0Jc3RhdGljIGZpbmFsIGludCBHRElSRUNUID0gMTM7IC8vIEB7IC4uLiB9Ci0Jc3RhdGljIGZpbmFsIGludCBHREVDTEFSID0gMTQ7IC8vICF7IC4uLiB9IQotICAgIHN0YXRpYyBmaW5hbCBpbnQgR1NUQVJUX1RBRyA9IDE1OyAvLyA8Z3I6Li4+Ci0gICAgc3RhdGljIGZpbmFsIGludCBHRU5EX1RBRyA9IDE2OyAvLyA8L2dyOi4uPgotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM3NGU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0RlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQ7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi51dGlsLlVybFBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlcy5Hcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3MuQ29udHJvbGxlckR5bmFtaWNNZXRob2RzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE3LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIGltcGxlbWVudHMgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIHsKLQotICAgIHByaXZhdGUgVXJsUGF0aEhlbHBlciB1cmxIZWxwZXIgPSBuZXcgVXJsUGF0aEhlbHBlcigpOwotICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChBcHBsaWNhdGlvbkNvbnRleHQpdGhpcy5jb250ZXh0LmdldEF0dHJpYnV0ZShBUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3Jvb3Z5T2JqZWN0IGdldENvbnRyb2xsZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXR1cm4gKEdyb292eU9iamVjdClyZXF1ZXN0LmdldEF0dHJpYnV0ZShDT05UUk9MTEVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xsZXJVcmkoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBHcm9vdnlPYmplY3QgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIocmVxdWVzdCk7Ci0gICAgICAgIGlmKGNvbnRyb2xsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkNPTlRST0xMRVJfVVJJX1BST1BFUlRZKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblVyaShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVybEhlbHBlci5nZXRDb250ZXh0UGF0aCgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxhc2hTY29wZSBnZXRGbGFzaFNjb3BlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCkgewotICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9ICgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpLmdldFNlc3Npb24odHJ1ZSk7Ci0gICAgICAgICAgICBGbGFzaFNjb3BlIGZzID0gKEZsYXNoU2NvcGUpc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoRkxBU0hfU0NPUEUpOwotICAgICAgICAgICAgaWYoZnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZzID0gbmV3IEdyYWlsc0ZsYXNoU2NvcGUoKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShGTEFTSF9TQ09QRSxmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZnM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZVVyaShTdHJpbmcgdGVtcGxhdGVOYW1lLCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIi9XRUItSU5GL2dyYWlscy1hcHAvdmlld3MiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldENvbnRyb2xsZXJVcmkocmVxdWVzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi9fIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0ZW1wbGF0ZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi5nc3AiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbGxlckFjdGlvblVyaShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIEdyb292eU9iamVjdCBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcihyZXF1ZXN0KTsKLQotICAgICAgICByZXR1cm4gKFN0cmluZyljb250cm9sbGVyLmdldFByb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5BQ1RJT05fVVJJX1BST1BFUlRZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXJyb3JzIGdldEVycm9ycyhTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIHJldHVybiAoRXJyb3JzKXJlcXVlc3QuZ2V0QXR0cmlidXRlKEVSUk9SUyk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUgZ2V0UGFnZXNUZW1wbGF0ZUVuZ2luZSgpIHsKLSAgICAgICBHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lIGVuZ2luZSA9IChHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lKXRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGUoR1NQX1RFTVBMQVRFX0VOR0lORSk7Ci0gICAgICAgaWYoZW5naW5lID09IG51bGwpIHsKLSAgICAgICAgICAgZW5naW5lID0gbmV3IEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUoKTsKLSAgICAgICAgICAgZW5naW5lLnNldENsYXNzTG9hZGVyKGdldEdyYWlsc0FwcGxpY2F0aW9uKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgIHRoaXMuY29udGV4dC5zZXRBdHRyaWJ1dGUoR1NQX1RFTVBMQVRFX0VOR0lORSxlbmdpbmUpOwotICAgICAgIH0KLSAgICAgICByZXR1cm4gZW5naW5lOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNBcHBsaWNhdGlvbiBnZXRHcmFpbHNBcHBsaWNhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChHcmFpbHNBcHBsaWNhdGlvbilnZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJlYW4oR3JhaWxzQXBwbGljYXRpb24uQVBQTElDQVRJT05fSUQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0ZsYXNoU2NvcGUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0ZsYXNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjNzIzMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9GbGFzaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgZmxhc2ggc2NvcGUgYW5kIGFsbG93cyBhIGZsYXNoIHNjb3BlIG1hcCB0byBiZSBzZXQgdG8gdGhlIG5leHQKLSAqIHN0YXRlLiBGbGFzaCBzY29wZSBlc3NlbnRpYWxseSBhbGxvd3MgdmFyaWFibGVzIHRvIGJlIG1haW50YWluZWQgZm9yIHRoZSBuZXh0IHN0YXRlIGFuZCB0aGUgbmV4dAotICogc3RhdGUgb25seSwgd2hhdCB0aGlzIG1lYW5zIGlzIGlmIG9iamVjdHMgYXJlIHN0b3JlZCBpbnNpZGUgRmxhc2hTY29wZSBvbiB0aGUgZmlyc3QgY2FsbCB0bwotICogIm5leHQoKSIgdGhleSB3aWxsIGJlIHN0aWxsIHRoZXJlLCBidXQgb24gdGhlIHN1YnNlcXVlbnQgY2FsbCB0aGV5IHdpbGwgYmUgY2xlYXJlZCB1bmxlc3MgdGhleQotICogaGF2ZSBiZWVuIHNldCBhZ2FpbiBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvICJuZXh0KCkiCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDctRmViLTIwMDYKLSAqLwotcHVibGljIGludGVyZmFjZSBGbGFzaFNjb3BlIGV4dGVuZHMgTWFwIHsKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmbGFzaCBzY29wZSB0byB0aGUgbmV4dCBzdGF0ZSB1cG9uIGEgbmV3IHJlcXVlc3QKLSAgICAgKi8KLSAgICB2b2lkIG5leHQoKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0dyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjZlY2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0OwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLkVycm9yczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlcy5Hcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBkZWZpbmluZyB0aGUgbmFtZXMgb2YgYW5kIG1ldGhvZHMgdG8gcmV0cmlldmUgR3JhaWxzIHNwZWNpZmljIHJlcXVlc3QgYW5kIHNlcnZsZXQgYXR0cmlidXRlcwotICoKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE3LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIHsKLQotICAgIFN0cmluZyBHU1BfVEVNUExBVEVfRU5HSU5FID0gIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLkdTUF9URU1QTEFURV9FTkdJTkUiOwotICAgIFN0cmluZyBBUFBMSUNBVElPTl9DT05URVhUID0gIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLkFQUExJQ0FUSU9OX0NPTlRFWFQiOwotICAgIFN0cmluZyBGTEFTSF9TQ09QRSA9ICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5GTEFTSF9TQ09QRSI7Ci0gICAgU3RyaW5nIENPTlRST0xMRVIgPSAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuQ09OVFJPTExFUiI7Ci0gICAgU3RyaW5nIEVSUk9SUyA9ICAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuRVJST1JTIjsKLSAgICBTdHJpbmcgSURfUEFSQU0gPSAiaWQiOwotICAgIFN0cmluZyBQQVJFTlRfQVBQTElDQVRJT05fQ09OVEVYVCA9ICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5QQVJFTlRfQVBQTElDQVRJT05fQ09OVEVYVCI7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGZvciBzZXJ2bGV0Ci0gICAgICovCi0gICAgQXBwbGljYXRpb25Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciBmb3IgdGhlIHJlcXVlc3QKLSAgICAgKi8KLSAgICBHcm9vdnlPYmplY3QgZ2V0Q29udHJvbGxlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIFRoZSB1cmkgb2YgdGhlIGNvbnRyb2xsZXIgd2l0aGluIHRoZSByZXF1ZXN0Ci0gICAgICovCi0gICAgU3RyaW5nIGdldENvbnRyb2xsZXJVcmkoU2VydmxldFJlcXVlc3QgcmVxdWVzdCk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHJldHVybiBUaGUgdXJpIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgc2VydmVyIHJvb3QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QXBwbGljYXRpb25VcmkoU2VydmxldFJlcXVlc3QgcmVxdWVzdCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHNlcnZsZXQgY29udGV4dCBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gVGhlIHNlcnZsZXQgY29udGV4dCBpbnN0YW5jZQotICAgICAqLwotICAgIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGZsYXNoIHNjb3BlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEByZXR1cm4gVGhlIEZsYXNoU2NvcGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBGbGFzaFNjb3BlIGdldEZsYXNoU2NvcGUoU2VydmxldFJlcXVlc3QgcmVxdWVzdCk7Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIFRoZSB1cmkgb2YgYSBuYW1lZCB0ZW1wbGF0ZSBmb3IgdGhlIGN1cnJlbnQgY29udHJvbGxlcgotICAgICAqLwotICAgIFN0cmluZyBnZXRUZW1wbGF0ZVVyaShTdHJpbmcgdGVtcGxhdGVOYW1lLCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIFRoZSB1cmkgb2YgdGhlIGFjdGlvbiBjYWxsZWQgd2l0aGluIHRoZSBjb250cm9sbGVyCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbnRyb2xsZXJBY3Rpb25VcmkoU2VydmxldFJlcXVlc3QgcmVxdWVzdCk7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHJldHVybiBUaGUgZXJyb3JzIGluc3RhbmNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJlcXVlc3QKLSAgICAgKi8KLSAgICBFcnJvcnMgZ2V0RXJyb3JzKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHJpZXZlcyB0aGUgc2hhcmVkIEdTUCB0ZW1wbGF0ZSBlbmdpbmUKLSAgICAgKi8KLSAgICBHcm9vdnlQYWdlc1RlbXBsYXRlRW5naW5lIGdldFBhZ2VzVGVtcGxhdGVFbmdpbmUoKTsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiBSZXRyaWV2ZXMgdGhlIGdyYWlscyBhcHBsaWNhdGlvbiBpbnN0YW5jZQotICAgICAqLwotICAgIEdyYWlsc0FwcGxpY2F0aW9uIGdldEdyYWlsc0FwcGxpY2F0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNEaXNwYXRjaGVyU2VydmxldC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRGlzcGF0Y2hlclNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwMjg3NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNEaXNwYXRjaGVyU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQ7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQm9vdHN0cmFwQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb25maWdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLnNwcmluZy5TcHJpbmdDb25maWc7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5GbHVzaE1vZGU7Ci1pbXBvcnQgb3JnLmhpYmVybmF0ZS5TZXNzaW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuU2Vzc2lvbkZhY3RvcnlVdGlsczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLlNlc3Npb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5zdXBwb3J0LlRyYW5zYWN0aW9uU3luY2hyb25pemF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db25maWd1cmFibGVXZWJBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5zdXBwb3J0LlhtbFdlYkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LkRpc3BhdGNoZXJTZXJ2bGV0OwotaW1wb3J0IG9yZy5zcHJpbmdtb2R1bGVzLmJlYW5zLmZhY3RvcnkuZHJpdmVycy54bWwuWG1sV2ViQXBwbGljYXRpb25Db250ZXh0RHJpdmVyOwotCi0vKioKLSAqIDxwPlNlcnZsZXQgdGhhdCBoYW5kbGVzIGluY29taW5nIHJlcXVlc3RzIGZvciBHcmFpbHMuCi0gKiA8cC8+Ci0gKiA8cD5UaGlzIHNlcnZsZXQgbG9hZHMgdGhlIFNwcmluZyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBHcmFpbHMgYXBwbGljYXRpb24KLSAqIGluIHRoZSBwYXJlbnQgYXBwbGljYXRpb24gY29udGV4dC4KLSAqCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNEaXNwYXRjaGVyU2VydmxldCBleHRlbmRzIERpc3BhdGNoZXJTZXJ2bGV0IHsKLQotICAgIHB1YmxpYyBHcmFpbHNEaXNwYXRjaGVyU2VydmxldCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0RGV0ZWN0QWxsSGFuZGxlck1hcHBpbmdzKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgV2ViQXBwbGljYXRpb25Db250ZXh0IGNyZWF0ZVdlYkFwcGxpY2F0aW9uQ29udGV4dChXZWJBcHBsaWNhdGlvbkNvbnRleHQgcGFyZW50KSB0aHJvd3MgQmVhbnNFeGNlcHRpb24gewotICAgICAgICAvLyB1c2UgY29uZmlnIGZpbGUgbG9jYXRpb25zIGlmIGF2YWlsYWJsZQotICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuUEFSRU5UX0FQUExJQ0FUSU9OX0NPTlRFWFQscGFyZW50KTsKLSAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IGdyYWlsc0NvbnRleHQgPSAoQXBwbGljYXRpb25Db250ZXh0KWdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgICAgIFdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJDb250ZXh0OwotCi0gICAgICAgIGlmKGdyYWlsc0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgWG1sV2ViQXBwbGljYXRpb25Db250ZXh0IHhtbENvbnRleHQgPSBuZXcgWG1sV2ViQXBwbGljYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICB4bWxDb250ZXh0LnNldFBhcmVudChncmFpbHNDb250ZXh0KTsKLSAgICAgICAgICAgIHdlYkNvbnRleHQgPSB4bWxDb250ZXh0OwotICAgICAgICAgICAgYXBwbGljYXRpb24gPSAoR3JhaWxzQXBwbGljYXRpb24pIHdlYkNvbnRleHQuZ2V0QmVhbihHcmFpbHNBcHBsaWNhdGlvbi5BUFBMSUNBVElPTl9JRCwgR3JhaWxzQXBwbGljYXRpb24uY2xhc3MpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbnMgPSBudWxsOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZ2V0Q29udGV4dENvbmZpZ0xvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbnMgPSBTdHJpbmdVdGlscy50b2tlbml6ZVRvU3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0Q29uZmlnTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYWJsZVdlYkFwcGxpY2F0aW9uQ29udGV4dC5DT05GSUdfTE9DQVRJT05fREVMSU1JVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIFNwcmluZ0NvbmZpZyBmb3IgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiA9IChHcmFpbHNBcHBsaWNhdGlvbikgcGFyZW50LmdldEJlYW4oR3JhaWxzQXBwbGljYXRpb24uQVBQTElDQVRJT05fSUQsIEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIFNwcmluZ0NvbmZpZyBzcHJpbmdDb25maWcgPSBuZXcgU3ByaW5nQ29uZmlnKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgICAgIC8vIHJldHVybiBhIGNvbnRleHQgdGhhdCBvYmV5cyBncmFpbHMnIHNldHRpbmdzCi0gICAgICAgICAgICB3ZWJDb250ZXh0ID0gbmV3IFhtbFdlYkFwcGxpY2F0aW9uQ29udGV4dERyaXZlcigpLmdldFdlYkFwcGxpY2F0aW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uZmlnLmdldEJlYW5SZWZlcmVuY2VzKCksCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9ucyk7Ci0gICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuQVBQTElDQVRJT05fQ09OVEVYVCx3ZWJDb250ZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25maWd1cmUgc2NhZmZvbGRlcnMKLSAgICAgICAgR3JhaWxzQ29uZmlnVXRpbHMuY29uZmlndXJlU2NhZmZvbGRlcnMoYXBwbGljYXRpb24sIHdlYkNvbnRleHQpOwotCi0gICAgICAgIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5ID0gKFNlc3Npb25GYWN0b3J5KXdlYkNvbnRleHQuZ2V0QmVhbigic2Vzc2lvbkZhY3RvcnkiKTsKLQotICAgICAgICBpZihzZXNzaW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBwYXJ0aWNpcGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgLy8gc2luZ2xlIHNlc3Npb24gbW9kZQotICAgICAgICAgICAgaWYgKFRyYW5zYWN0aW9uU3luY2hyb25pemF0aW9uTWFuYWdlci5oYXNSZXNvdXJjZShzZXNzaW9uRmFjdG9yeSkpIHsKLSAgICAgICAgICAgICAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZSBTZXNzaW9uOiBqdXN0IHNldCB0aGUgcGFydGljaXBhdGUgZmxhZy4KLSAgICAgICAgICAgICAgICBwYXJ0aWNpcGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIk9wZW5pbmcgc2luZ2xlIEhpYmVybmF0ZSBzZXNzaW9uIGluIEdyYWlsc0Rpc3BhdGNoZXJTZXJ2bGV0Iik7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbiA9IFNlc3Npb25GYWN0b3J5VXRpbHMuZ2V0U2Vzc2lvbihzZXNzaW9uRmFjdG9yeSx0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEZsdXNoTW9kZShGbHVzaE1vZGUuQVVUTyk7Ci0gICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25TeW5jaHJvbml6YXRpb25NYW5hZ2VyLmJpbmRSZXNvdXJjZShzZXNzaW9uRmFjdG9yeSwgbmV3IFNlc3Npb25Ib2xkZXIoc2Vzc2lvbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaW5pdCB0aGUgR3JhaWxzIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEdyYWlsc0Jvb3RzdHJhcENsYXNzW10gYm9vdHN0cmFwcyA9ICBhcHBsaWNhdGlvbi5nZXRHcmFpbHNCb290c3RyYXBDbGFzc2VzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib290c3RyYXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcHNbaV0uY2FsbEluaXQoICBnZXRTZXJ2bGV0Q29udGV4dCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcnRpY2lwYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBzZXNzaW9uIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25TeW5jaHJvbml6YXRpb25NYW5hZ2VyLnVuYmluZFJlc291cmNlKHNlc3Npb25GYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDbG9zaW5nIHNpbmdsZSBIaWJlcm5hdGUgc2Vzc2lvbiBpbiBHcmFpbHNEaXNwYXRjaGVyU2VydmxldCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkZhY3RvcnlVdGlscy5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uLCBzZXNzaW9uRmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb24gY2xvc2luZyBIaWJlcm5hdGUgU2Vzc2lvbiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdlYkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkNvbnRleHQgPSBnZXRXZWJBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoR3JhaWxzQXBwbGljYXRpb24pIHdlYkNvbnRleHQuZ2V0QmVhbihHcmFpbHNBcHBsaWNhdGlvbi5BUFBMSUNBVElPTl9JRCwgR3JhaWxzQXBwbGljYXRpb24uY2xhc3MpOwotCi0gICAgICAgIEdyYWlsc0Jvb3RzdHJhcENsYXNzW10gYm9vdHN0cmFwcyA9ICBhcHBsaWNhdGlvbi5nZXRHcmFpbHNCb290c3RyYXBDbGFzc2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm9vdHN0cmFwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYm9vdHN0cmFwc1tpXS5jYWxsRGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhbGwgc3VwZXIKLSAgICAgICAgc3VwZXIuZGVzdHJveSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRmxhc2hTY29wZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRmxhc2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM3NjYwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0dyYWlsc0ZsYXNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBHcmFpbHMgaW1wbGVtZW50YXRpb24gb2YgRmxhc2ggc2NvcGUgKEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuRmxhc2hTY29wZSkKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwNy1GZWItMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzRmxhc2hTY29wZSBpbXBsZW1lbnRzIEZsYXNoU2NvcGUgewotICAgIHByaXZhdGUgSGFzaE1hcCBjdXJyZW50ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIEhhc2hNYXAgbmV4dCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBjdXJyZW50LmNsZWFyKCk7Ci0gICAgICAgIGN1cnJlbnQgPSAoSGFzaE1hcCluZXh0LmNsb25lKCk7Ci0gICAgICAgIG5leHQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LnNpemUoKSArIG5leHQuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBjdXJyZW50LmNsZWFyKCk7Ci0gICAgICAgIG5leHQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gKGN1cnJlbnQuY29udGFpbnNLZXkoa2V5KSB8fCBuZXh0LmNvbnRhaW5zS2V5KGtleSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoY3VycmVudC5jb250YWluc1ZhbHVlKHZhbHVlKSB8fCBuZXh0LmNvbnRhaW5zVmFsdWUodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYy5hZGRBbGwoY3VycmVudC52YWx1ZXMoKSk7Ci0gICAgICAgIGMuYWRkQWxsKG5leHQudmFsdWVzKCkpOwotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIHB1dChrZXksdC5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBTZXQga2V5U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAga2V5U2V0LmFkZEFsbChjdXJyZW50LmVudHJ5U2V0KCkpOwotICAgICAgICBrZXlTZXQuYWRkQWxsKG5leHQuZW50cnlTZXQoKSk7Ci0gICAgICAgIHJldHVybiBrZXlTZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIFNldCBrZXlTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBrZXlTZXQuYWRkQWxsKGN1cnJlbnQua2V5U2V0KCkpOwotICAgICAgICBrZXlTZXQuYWRkQWxsKG5leHQua2V5U2V0KCkpOwotICAgICAgICByZXR1cm4ga2V5U2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYobmV4dC5jb250YWluc0tleShrZXkpKQotICAgICAgICAgICAgcmV0dXJuIG5leHQuZ2V0KGtleSk7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYoY3VycmVudC5jb250YWluc0tleShrZXkpKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVtb3ZlKGtleSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBuZXh0LnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZihjdXJyZW50LmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5leHQucHV0KGtleSx2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNIdHRwU2VydmxldFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0MTA3Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNIdHRwU2VydmxldFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkdldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiA8cD5XcmFwcGVyIGZvciBIdHRwU2VydmxldFJlcXVlc3QgaW5zdGFuY2UgdGhhdCBhbHNvIGltcGxlbWVudHMKLSAqIGphdmEudXRpbC5NYXAgdG8gZGVsZWdhdGUgdG8gcmVxdWVzdCBhdHRyaWJ1dGVzCi0gKgotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QKLSAqIEBzZWUgamF2YS51dGlsLk1hcAotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIE1hcCB7Ci0KLSAgICBNYXAgY29udHJvbGxlclBhcmFtcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQotICAgIHB1YmxpYyBHcmFpbHNIdHRwU2VydmxldFJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IGRlbGVnYXRlKSB7Ci0gICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzSHR0cFNlcnZsZXRSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBHcm9vdnlPYmplY3QgY29udHJvbGxlcikgewotICAgICAgICBzdXBlcihyZXF1ZXN0KTsKLSAgICAgICAgY29udHJvbGxlclBhcmFtcyA9IChNYXApY29udHJvbGxlci5nZXRQcm9wZXJ0eShHZXRQYXJhbXNEeW5hbWljUHJvcGVydHkuUFJPUEVSVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyI2dldFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1OYW1lKSB7Ci0gICAgICAgIGlmKGNvbnRyb2xsZXJQYXJhbXMuY29udGFpbnNLZXkocGFyYW1OYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyUGFyYW1zLmdldChwYXJhbU5hbWUpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIGphdmEudXRpbC5NYXAuc2l6ZSgpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgWyIrZ2V0Q2xhc3MoKSsiXSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlTmFtZXMoKS5oYXNNb3JlRWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmKGtleSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKChTdHJpbmcpa2V5KSAhPSBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgd2hpbGUgKGdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGVOYW1lcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9ICAoU3RyaW5nKWdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGVOYW1lcygpLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZihnZXRBdHRyaWJ1dGUocykuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZihrZXkgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZSgoU3RyaW5nKWtleSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZihrZXkgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKChTdHJpbmcpa2V5LHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYoa2V5IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBPYmplY3QgdiA9IGdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUoKFN0cmluZylrZXkpIDsKLSAgICAgICAgICAgIGdldFJlcXVlc3QoKS5yZW1vdmVBdHRyaWJ1dGUoKFN0cmluZylrZXkpOwotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCBhcmcwKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBTZXJ2bGV0UmVxdWVzdCByID0gZ2V0UmVxdWVzdCgpOwotICAgICAgICB3aGlsZSAoci5nZXRBdHRyaWJ1dGVOYW1lcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9ICAoU3RyaW5nKXIuZ2V0QXR0cmlidXRlTmFtZXMoKS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgZ2V0UmVxdWVzdCgpLnJlbW92ZUF0dHJpYnV0ZShzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU2VydmxldFJlcXVlc3QgciA9IGdldFJlcXVlc3QoKTsKLSAgICAgICAgd2hpbGUgKHIuZ2V0QXR0cmlidXRlTmFtZXMoKS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAgKFN0cmluZylyLmdldEF0dHJpYnV0ZU5hbWVzKCkubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHNldC5hZGQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTZXJ2bGV0UmVxdWVzdCByID0gZ2V0UmVxdWVzdCgpOwotICAgICAgICB3aGlsZSAoci5nZXRBdHRyaWJ1dGVOYW1lcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9ICAoU3RyaW5nKXIuZ2V0QXR0cmlidXRlTmFtZXMoKS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdmFsdWVzLmFkZChyLmdldEF0dHJpYnV0ZShzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBqYXZhLnV0aWwuTWFwLmVudHJ5U2V0KCkgaXMgbm90IHN1cHBvcnRlZCBieSBbIitnZXRDbGFzcygpKyJdIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9HcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2EzZjQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogPHA+V3JhcHBlciBjbGFzcyBmb3IgSHR0cFNlcnZsZXRSZXNwb25zZSB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZSBjb250ZW50IHR5cGUgd2hpbGUgZ2V0dGluZyB0aGUgd3JpdGVyLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCA1LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7Ci0KLQlwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZGVsZWdhdGUgPSBudWxsOwotCQotCXB1YmxpYyBHcmFpbHNIdHRwU2VydmxldFJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7Ci0JCXRoaXMuZGVsZWdhdGUuYWRkQ29va2llKGNvb2tpZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIGhlYWRlck5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuY29udGFpbnNIZWFkZXIoaGVhZGVyTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBlbmNvZGVVUkwoU3RyaW5nIHVybCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5lbmNvZGVVUkwodXJsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZW5jb2RlVVJMKHVybCk7Ci0JfQotCi0gICAgLyoqIEBkZXByZWNhdGVkICovCi0JcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5lbmNvZGVVcmwodXJsKTsKLQl9Ci0KLSAgICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZW5jb2RlUmVkaXJlY3RVcmwodXJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IGVycm9yLCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZW5kRXJyb3IoZXJyb3IsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgZXJyb3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuc2VuZEVycm9yKGVycm9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZW5kUmVkaXJlY3QodXJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBoZWFkZXJOYW1lLCBsb25nIHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUuc2V0RGF0ZUhlYWRlcihoZWFkZXJOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgaGVhZGVyTmFtZSwgbG9uZyB2YWx1ZSkgewotCQl0aGlzLmRlbGVnYXRlLmFkZERhdGVIZWFkZXIoaGVhZGVyTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgaGVhZGVyTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUuc2V0SGVhZGVyKGhlYWRlck5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmRlbGVnYXRlLmFkZEhlYWRlcihoZWFkZXJOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50SGVhZGVyKFN0cmluZyBoZWFkZXJOYW1lLCBpbnQgdmFsdWUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRJbnRIZWFkZXIoaGVhZGVyTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgaGVhZGVyTmFtZSwgaW50IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUuYWRkSW50SGVhZGVyKGhlYWRlck5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgewotCQl0aGlzLmRlbGVnYXRlLnNldFN0YXR1cyhzdGF0dXMpOwotCX0KLQotICAgIC8qKiBAZGVwcmVjYXRlZCAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLmRlbGVnYXRlLnNldFN0YXR1cyhzdGF0dXMsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldENoYXJhY3RlckVuY29kaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Q29udGVudFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRPdXRwdXRTdHJlYW0oKSA7Ci0JfQotCi0JcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIGNoYXJhY3RlckVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlICsgIjtjaGFyc2V0PSIgKyBjaGFyYWN0ZXJFbmNvZGluZyk7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE91dHB1dFN0cmVhbSgpOwotCX0KLQkKLQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0V3JpdGVyKCk7Ci0JfQotCi0JcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcihTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBjaGFyYWN0ZXJFbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSArICI7Y2hhcnNldD0iICsgY2hhcmFjdGVyRW5jb2RpbmcpOwotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRXcml0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKFN0cmluZyBjb250ZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFdyaXRlcigpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyYWN0ZXJFbmNvZGluZykgewotCQl0aGlzLmRlbGVnYXRlLnNldENoYXJhY3RlckVuY29kaW5nKGNoYXJhY3RlckVuY29kaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBjb250ZW50TGVuZ3RoKSB7Ci0JCXRoaXMuZGVsZWdhdGUuc2V0Q29udGVudExlbmd0aChjb250ZW50TGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgYnVmZmVyU2l6ZSkgewotCQl0aGlzLmRlbGVnYXRlLnNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRCdWZmZXJTaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmZsdXNoQnVmZmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7Ci0JCXRoaXMuZGVsZWdhdGUucmVzZXRCdWZmZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuaXNDb21taXR0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0JCXRoaXMuZGVsZWdhdGUuc2V0TG9jYWxlKGxvY2FsZSk7Ci0JfQotCi0JcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldExvY2FsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvZmlsdGVyL0dyYWlsc1JlbG9hZFNlcnZsZXRGaWx0ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L2ZpbHRlci9HcmFpbHNSZWxvYWRTZXJ2bGV0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGY1YmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvZmlsdGVyL0dyYWlsc1JlbG9hZFNlcnZsZXRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LmZpbHRlcjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLio7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuR3JhaWxzUmVzb3VyY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuU3ByaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzVXJsSGFuZGxlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLlNpbXBsZUdyYWlsc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5hb3AudGFyZ2V0LkhvdFN3YXBwYWJsZVRhcmdldFNvdXJjZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5SZXNvdXJjZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5maWx0ZXIuT25jZVBlclJlcXVlc3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLnhtbC5YbWxBcHBsaWNhdGlvbkNvbnRleHREcml2ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQSBzZXJ2bGV0IGZpbHRlciB0aGF0IGNvcGllcyByZXNvdXJjZXMgZnJvbSB0aGUgc291cmNlIG9uIGNvbnRlbnQgY2hhbmdlIGFuZCBtYW5hZ2VzIHJlbG9hZGluZyBpZiBuZWNlc3NhcnkKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSBKYW4gMTAsIDIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1JlbG9hZFNlcnZsZXRGaWx0ZXIgZXh0ZW5kcyBPbmNlUGVyUmVxdWVzdEZpbHRlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhHcmFpbHNSZWxvYWRTZXJ2bGV0RmlsdGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VDb3BpZXIgY29weVNjcmlwdDsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OwotICAgIHByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpc2VkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBNYXAgcmVzb3VyY2VNZXRhcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLSAgICBwcml2YXRlIEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yIHRlbXBsYXRlR2VuZXJhdG9yOwotCi0gICAgY2xhc3MgUmVzb3VyY2VNZXRhIHsKLSAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICBVUkwgdXJsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRmlsdGVySW50ZXJuYWwoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbikgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgIGNvbnRleHQgPSAoQXBwbGljYXRpb25Db250ZXh0KWdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5BUFBMSUNBVElPTl9DT05URVhUKTsKLQotICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoaHR0cFNlcnZsZXRSZXF1ZXN0LGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGFwcGxpY2F0aW9uID0gKEdyYWlsc0FwcGxpY2F0aW9uKWNvbnRleHQuZ2V0QmVhbihHcmFpbHNBcHBsaWNhdGlvbi5BUFBMSUNBVElPTl9JRCk7Ci0gICAgICBpZihhcHBsaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoaHR0cFNlcnZsZXRSZXF1ZXN0LGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYoY29weVNjcmlwdCA9PSBudWxsKSB7Ci0gICAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3M7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgZ3Jvb3Z5Q2xhc3MgPSBnY2wucGFyc2VDbGFzcyhnY2wuZ2V0UmVzb3VyY2UoIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L2ZpbHRlci9HcmFpbHNSZXNvdXJjZUNvcGllci5ncm9vdnkiKS5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgICBjb3B5U2NyaXB0ID0gKFJlc291cmNlQ29waWVyKWdyb292eUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgIGdyb292eUNsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoZ2NsLmdldFJlc291cmNlKCJvcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9EZWZhdWx0R3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IuZ3Jvb3Z5Iikub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgdGVtcGxhdGVHZW5lcmF0b3IgPSAoR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IpZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgdGVtcGxhdGVHZW5lcmF0b3Iuc2V0T3ZlcndyaXRlKHRydWUpOwotICAgICAgICAgICAgICAvLyBwZXJmb3JtIGluaXRpYWwgZ2VuZXJhdGlvbiBvZiB2aWV3cwotICAgICAgICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3NbXSBjb250cm9sbGVycyA9IGFwcGxpY2F0aW9uLmdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBjb250cm9sbGVyID0gY29udHJvbGxlcnNbaV07Ci0gICAgICAgICAgICAgICAgICBpZihjb250cm9sbGVyLmlzU2NhZmZvbGRpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGNvbnRyb2xsZXIuZ2V0U2NhZmZvbGRlZENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzOwotICAgICAgICAgICAgICAgICAgICBpZihjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbkNsYXNzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluQ2xhc3MgPSBhcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcyhjb250cm9sbGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZG9tYWluQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbmV3IHZpZXdzCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUdlbmVyYXRvci5nZW5lcmF0ZVZpZXdzKGRvbWFpbkNsYXNzLGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi9XRUItSU5GIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIHVzZXIgZGVmaW5lZCB2aWV3cwotICAgICAgICAgICAgY29weVNjcmlwdC5jb3B5Vmlld3ModHJ1ZSk7Ci0gICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIExPRy5lcnJvcigiSWxsZWdhbCBhY2Nlc3MgY3JlYXRpbmcgcmVzb3VyY2UgY29waWVyLiBTYXZlL3JlbG9hZCBkaXNhYmxlZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJvciBpbnN0YW50aWF0aW5nIHJlc291cmNlIGNvcGllci4gU2F2ZS9yZWxvYWQgZGlzYWJsZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJvciBjb21waWxpbmcgcmVzb3VyY2UgY29waWVyLiBTYXZlL3JlbG9hZCBkaXNhYmxlZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJvciBsb2FkaW5nIHJlc291cmNlIGNvcGllci4gU2F2ZS9yZWxvYWQgZGlzYWJsZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGNvcHlTY3JpcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29weVNjcmlwdC5jb3B5R3JhaWxzQXBwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcmFpbHNSZXNvdXJjZUhvbGRlciByZXNvdXJjZUhvbGRlciA9IChHcmFpbHNSZXNvdXJjZUhvbGRlciljb250ZXh0LmdldEJlYW4oR3JhaWxzUmVzb3VyY2VIb2xkZXIuQVBQTElDQVRJT05fQ09OVEVYVF9JRCk7Ci0gICAgICAgIFJlc291cmNlW10gcmVzb3VyY2VzID0gcmVzb3VyY2VIb2xkZXIuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgaWYoIWluaXRpYWxpc2VkKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZXNvdXJjZUhvbGRlci5nZXRDbGFzc05hbWUocmVzb3VyY2VzW2ldKTsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gcmVzb3VyY2UuZ2V0VVJMKCk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYy5zZXREb0lucHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjLnNldERvT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0KLSAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGEgcm0gPSBuZXcgUmVzb3VyY2VNZXRhKCk7Ci0gICAgICAgICAgICAgICAgcm0uY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICAgICAgICAgIHJtLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgICAgICAgICAgICAgICBybS51cmwgPSB1cmw7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRhcy5wdXQoY2xhc3NOYW1lLCBybSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluaXRpYWxpc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcmVzb3VyY2VIb2xkZXIuZ2V0Q2xhc3NOYW1lKHJlc291cmNlc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBDbGFzcyBsb2FkZWRDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc05ldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIC8vIGlmIGl0cyBub3QgaW4gdGhlIHJlc291cmNlIG1ldGFzIGl0cyBuZXcuLiBzbyBsb2FkIGl0Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIXJlc291cmNlTWV0YXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIHJlc291cmNlIG1ldGFzCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gcmVzb3VyY2UuZ2V0VVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0RG9JbnB1dChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLnNldERvT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMYXN0TW9kaWZpZWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRhIHJtID0gbmV3IFJlc291cmNlTWV0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm0uY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgcm0ubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcm0udXJsID0gdXJsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRhcy5wdXQoY2xhc3NOYW1lLCBybSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBhcHBsaWNhdGlvbi5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChHcmFpbHNSZXNvdXJjZUxvYWRlcilnY2wuZ2V0UmVzb3VyY2VMb2FkZXIoKSkuc2V0UmVzb3VyY2VzKHJlc291cmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRDbGFzcyA9IGdjbC5sb2FkQ2xhc3MoY2xhc3NOYW1lLHRydWUsZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGFzIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjaGVjayB0aGUgbGFzdCBtb2RpZmllZCBkYXRlCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRhIHJtID0gKFJlc291cmNlTWV0YSlyZXNvdXJjZU1ldGFzLmdldChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IHJlc291cmNlLmdldFVSTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYmVlbiBtb2RpZmllZCByZWxvYWQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJtLmxhc3RNb2RpZmllZCA8IGMuZ2V0TGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRDbGFzcyA9IGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKGNsYXNzTmFtZSx0cnVlLGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBybS5sYXN0TW9kaWZpZWQgPSBjLmdldExhc3RNb2RpZmllZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiVW5hYmxlZCB0byByZWxvYWQgY2xhc3MgWyIrY2xhc3NOYW1lKyJdLCBjbGFzcyBub3QgZm91bmQ6ICIgKyBjbmZleC5nZXRNZXNzYWdlKCksY25mZXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsb2FkZWQgY2xhc3MgaXMgbm90IG51bGwgdGhlbiB3ZSBoYXZlIGEgY2hhbmdlCi0gICAgICAgICAgICAgICAgaWYobG9hZGVkQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzbyBlc3RhYmxpc2ggdGhlIHR5cGUgYW5kIHRha2UgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZihHcmFpbHNDbGFzc1V0aWxzLmlzQ29udHJvbGxlckNsYXNzKGxvYWRlZENsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvbnRyb2xsZXJDbGFzcyhsb2FkZWRDbGFzcyxpc05ldyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihHcmFpbHNDbGFzc1V0aWxzLmlzRG9tYWluQ2xhc3MobG9hZGVkQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkRG9tYWluQ2xhc3MobG9hZGVkQ2xhc3MsaXNOZXcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoR3JhaWxzQ2xhc3NVdGlscy5pc1NlcnZpY2UobG9hZGVkQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkU2VydmljZUNsYXNzKGxvYWRlZENsYXNzLGlzTmV3KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKEdyYWlsc0NsYXNzVXRpbHMuaXNUYWdMaWJDbGFzcyhsb2FkZWRDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYWdMaWJDbGFzcyhsb2FkZWRDbGFzcywgaXNOZXcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoaHR0cFNlcnZsZXRSZXF1ZXN0LGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkU2VydmljZUNsYXNzKENsYXNzIGxvYWRlZENsYXNzLCBib29sZWFuIGlzTmV3KSB7Ci0KLSAgICAgICAgR3JhaWxzU2VydmljZUNsYXNzIHNlcnZpY2VDbGFzcyA9IGFwcGxpY2F0aW9uLmFkZFNlcnZpY2VDbGFzcyhsb2FkZWRDbGFzcyk7Ci0gICAgICAgIGlmKHNlcnZpY2VDbGFzcy5pc1RyYW5zYWN0aW9uYWwoKSkgewotICAgICAgICAgICAgTE9HLndhcm4oIkNhbm5vdCByZWxvYWQgY2xhc3MgWyIrbG9hZGVkQ2xhc3MrIl0gcmVsb2FkaW5nIG9mIHRyYW5zYWN0aW9uYWwgc2VydmljZSBjbGFzc2VzIGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUuIFNldCBjbGFzcyB0byBub24tdHJhbnNhY3Rpb25hbCBmaXJzdC4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlbG9hZCB3aG9sZSBjb250ZXh0Ci0gICAgICAgICAgICByZWxvYWRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIC8qIGlmKHNlcnZpY2VDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgaXRzIGEgbmV3IHRhZ2xpYiwgcmVsb2FkIGFwcCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgaWYoaXNOZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsb2FkQXBwbGljYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBzd2FwIHRhcmdldCBzb3VyY2UgaW4gYXBwIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlIHRhcmdldFNvdXJjZSA9IChIb3RTd2FwcGFibGVUYXJnZXRTb3VyY2UpY29udGV4dC5nZXRCZWFuKHNlcnZpY2VDbGFzcy5nZXRGdWxsTmFtZSgpICsgIlRhcmdldFNvdXJjZSIpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXRTb3VyY2Uuc3dhcChzZXJ2aWNlQ2xhc3MubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFRhZ0xpYkNsYXNzKENsYXNzIGxvYWRlZENsYXNzLCBib29sZWFuIGlzTmV3KSB7Ci0gICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIHRhZ0xpYkNsYXNzID0gYXBwbGljYXRpb24uYWRkVGFnTGliQ2xhc3MobG9hZGVkQ2xhc3MpOwotICAgICAgICBpZih0YWdMaWJDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiBpdHMgYSBuZXcgdGFnbGliLCByZWxvYWQgYXBwIGNvbnRleHQKLSAgICAgICAgICAgIGlmKGlzTmV3KSB7Ci0gICAgICAgICAgICAgICAgcmVsb2FkQXBwbGljYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzd2FwIHRhcmdldCBzb3VyY2UgaW4gYXBwIGNvbnRleHQKLSAgICAgICAgICAgICAgICBIb3RTd2FwcGFibGVUYXJnZXRTb3VyY2UgdGFyZ2V0U291cmNlID0gKEhvdFN3YXBwYWJsZVRhcmdldFNvdXJjZSljb250ZXh0LmdldEJlYW4odGFnTGliQ2xhc3MuZ2V0RnVsbE5hbWUoKSArICJUYXJnZXRTb3VyY2UiKTsKLSAgICAgICAgICAgICAgICB0YXJnZXRTb3VyY2Uuc3dhcCh0YWdMaWJDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZERvbWFpbkNsYXNzKENsYXNzIGxvYWRlZENsYXNzLCBib29sZWFuIGlzTmV3KSB7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gYXBwbGljYXRpb24uYWRkRG9tYWluQ2xhc3MobG9hZGVkQ2xhc3MpOwotCi0gICAgICAgIHJlbG9hZEFwcGxpY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gYXBwbGljYXRpb24uZ2V0U2NhZmZvbGRpbmdDb250cm9sbGVyKGRvbWFpbkNsYXNzKTsKLSAgICAgICAgaWYoY29udHJvbGxlckNsYXNzICE9IG51bGwgJiYgY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKSkgewotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbmV3IHZpZXdzCi0gICAgICAgICAgICB0ZW1wbGF0ZUdlbmVyYXRvci5nZW5lcmF0ZVZpZXdzKGRvbWFpbkNsYXNzLGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi9XRUItSU5GIikpOwotICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggdXNlciBkZWZpbmVkIHZpZXdzCi0gICAgICAgICAgICBjb3B5U2NyaXB0LmNvcHlWaWV3cyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkQ29udHJvbGxlckNsYXNzKENsYXNzIGxvYWRlZENsYXNzLCBib29sZWFuIGlzTmV3KSB7Ci0gICAgICAgIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBjb250cm9sbGVyQ2xhc3MgPSBhcHBsaWNhdGlvbi5hZGRDb250cm9sbGVyQ2xhc3MobG9hZGVkQ2xhc3MpOwotICAgICAgICBpZihjb250cm9sbGVyQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgIC8vIGlmIGl0cyBhIG5ldyBjb250cm9sbGVyIHJlLWdlbmVyYXRlIHdlYi54bWwsIHJlbG9hZCBhcHAgY29udGV4dAotICAgICAgICAgICAgaWYoaXNOZXcpIHsKLSAgICAgICAgICAgICAgICByZWxvYWRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiTmV3IGNvbnRyb2xsZXIgYWRkZWQsIHJlLWdlbmVyYXRpbmcgd2ViLnhtbCIpOwotICAgICAgICAgICAgICAgIGNvcHlTY3JpcHQuZ2VuZXJhdGVXZWJYbWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlZ2VuZXJhdGUgY29udHJvbGxlciB1cmxNYXAKLSAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIG1hcHBpbmdzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2F0aW9uLmdldENvbnRyb2xsZXJzKCkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgR3JhaWxzQ29udHJvbGxlckNsYXNzIHNpbXBsZUNvbnRyb2xsZXIgPSBhcHBsaWNhdGlvbi5nZXRDb250cm9sbGVycygpW2ldOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHNpbXBsZUNvbnRyb2xsZXIuZ2V0VVJJcygpLmxlbmd0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighbWFwcGluZ3MuY29udGFpbnNLZXkoc2ltcGxlQ29udHJvbGxlci5nZXRVUklzKClbeF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dChzaW1wbGVDb250cm9sbGVyLmdldFVSSXMoKVt4XSwgU2ltcGxlR3JhaWxzQ29udHJvbGxlci5BUFBMSUNBVElPTl9DT05URVhUX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2F0aW9uLmdldFBhZ2VGbG93cygpLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyYWlsc1BhZ2VGbG93Q2xhc3MgcGFnZUZsb3cgPSBhcHBsaWNhdGlvbi5nZXRQYWdlRmxvd3MoKVtpXTsKLSAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3MucHV0KHBhZ2VGbG93LmdldFVyaSgpLCBwYWdlRmxvdy5nZXRGdWxsTmFtZSgpICsgIkNvbnRyb2xsZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBIb3RTd2FwcGFibGVUYXJnZXRTb3VyY2UgdXJsTWFwcGluZ3NUYXJnZXRTb3VyY2UgPSAoSG90U3dhcHBhYmxlVGFyZ2V0U291cmNlKWNvbnRleHQuZ2V0QmVhbihHcmFpbHNVcmxIYW5kbGVyTWFwcGluZy5BUFBMSUNBVElPTl9DT05URVhUX1RBUkdFVF9TT1VSQ0UpOwotCi0gICAgICAgICAgICAgICAgR3JhaWxzVXJsSGFuZGxlck1hcHBpbmcgdXJsTWFwcGluZ3MgPSBuZXcgR3JhaWxzVXJsSGFuZGxlck1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB1cmxNYXBwaW5ncy5zZXRBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgdXJsTWFwcGluZ3Muc2V0TWFwcGluZ3MobWFwcGluZ3MpOwotICAgICAgICAgICAgICAgIHVybE1hcHBpbmdzLmluaXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAgICAgICAgIHVybE1hcHBpbmdzVGFyZ2V0U291cmNlLnN3YXAodXJsTWFwcGluZ3MpOwotCi0KLSAgICAgICAgICAgICAgICAvLyBzd2FwIHRhcmdldCBzb3VyY2UgaW4gYXBwIGNvbnRleHQKLSAgICAgICAgICAgICAgICBIb3RTd2FwcGFibGVUYXJnZXRTb3VyY2UgY29udHJvbGxlclRhcmdldFNvdXJjZSA9IChIb3RTd2FwcGFibGVUYXJnZXRTb3VyY2UpY29udGV4dC5nZXRCZWFuKGNvbnRyb2xsZXJDbGFzcy5nZXRGdWxsTmFtZSgpICsgIlRhcmdldFNvdXJjZSIpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJUYXJnZXRTb3VyY2Uuc3dhcChjb250cm9sbGVyQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbG9hZEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgV2ViQXBwbGljYXRpb25Db250ZXh0IHBhcmVudCA9IChXZWJBcHBsaWNhdGlvbkNvbnRleHQpZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLlBBUkVOVF9BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgLy8gY29uc3RydWN0IHRoZSBTcHJpbmdDb25maWcgZm9yIHRoZSBjb250YWluZXIgbWFuYWdlZCBhcHBsaWNhdGlvbgotICAgICAgICBpZih0aGlzLmFwcGxpY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gKEdyYWlsc0FwcGxpY2F0aW9uKSBwYXJlbnQuZ2V0QmVhbihHcmFpbHNBcHBsaWNhdGlvbi5BUFBMSUNBVElPTl9JRCwgR3JhaWxzQXBwbGljYXRpb24uY2xhc3MpOwotCi0gICAgICAgIFNwcmluZ0NvbmZpZyBzcHJpbmdDb25maWcgPSBuZXcgU3ByaW5nQ29uZmlnKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgLy8gcmV0dXJuIGEgY29udGV4dCB0aGF0IG9iZXlzIGdyYWlscycgc2V0dGluZ3MKLQotICAgICAgICBjb250ZXh0ID0gbmV3IFhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcigpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uZmlnLmdldEJlYW5SZWZlcmVuY2VzKCksCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuQVBQTElDQVRJT05fQ09OVEVYVCwgY29udGV4dCApOwotCi0gICAgICAgIC8vIHJlLWNvbmZpZ3VyZSBzY2FmZm9sZGVycwotICAgICAgICBHcmFpbHNDb25maWdVdGlscy5jb25maWd1cmVTY2FmZm9sZGVycyhhcHBsaWNhdGlvbixjb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9maWx0ZXIvR3JhaWxzUmVzb3VyY2VDb3BpZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvZmlsdGVyL0dyYWlsc1Jlc291cmNlQ29waWVyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2OWI3OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9maWx0ZXIvR3JhaWxzUmVzb3VyY2VDb3BpZXIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5maWx0ZXI7Ci1jbGFzcyBHcmFpbHNSZXNvdXJjZUNvcGllciBpbXBsZW1lbnRzIFJlc291cmNlQ29waWVyIHsKLQotICAgIEBQcm9wZXJ0eSBTdHJpbmcgYmFzZWRpciA9ICIuIgotICAgIEBQcm9wZXJ0eSBTdHJpbmcgZGVzdGRpciA9ICIuL3RtcC93YXIiCi0KLSAgICBkZWYgYW50ID0gbmV3IEFudEJ1aWxkZXIoKQotCi0gICAgcHVibGljIHZvaWQgY29weUdyYWlsc0FwcCgpIHsKLSAgICAgICAgaWYobmV3IEZpbGUoIiR7YmFzZWRpcn0vZ3JhaWxzLWFwcCIpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBhbnQuY29weSh0b2RpcjoiJHtkZXN0ZGlyfS9XRUItSU5GL2dyYWlscy1hcHAiLGZhaWxvbmVycm9yOmZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgZmlsZXNldChkaXI6IiR7YmFzZWRpcn0vZ3JhaWxzLWFwcCIsaW5jbHVkZXM6IioqIikKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFudC5jb3B5KHRvZGlyOiIke2Rlc3RkaXJ9L1dFQi1JTkYvY2xhc3NlcyIsZmFpbG9uZXJyb3I6ZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBmaWxlc2V0KGRpcjoiJHtiYXNlZGlyfS9ncmFpbHMtYXBwL2kxOG4iLGluY2x1ZGVzOiIqKiIpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5Vmlld3MoYm9vbGVhbiBzaG91bGRPdmVyd3JpdGUpIHsKLSAgICAgICAgaWYobmV3IEZpbGUoIiR7YmFzZWRpcn0vZ3JhaWxzLWFwcC92aWV3cyIpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBhbnQuY29weSh0b2RpcjoiJHtkZXN0ZGlyfS9XRUItSU5GL2dyYWlscy1hcHAvdmlld3MiLGZhaWxvbmVycm9yOmZhbHNlLG92ZXJ3cml0ZTpzaG91bGRPdmVyd3JpdGUpIHsKLSAgICAgICAgICAgICAgICBmaWxlc2V0KGRpcjoiJHtiYXNlZGlyfS9ncmFpbHMtYXBwL3ZpZXdzIixpbmNsdWRlczoiKioiKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXZWJYbWwoKSB7Ci0gICAgICAgIGRlZiBjb250cm9sbGVyc0hvbWUgPSBuZXcgRmlsZSgiJHtiYXNlZGlyfS9ncmFpbHMtYXBwL2NvbnRyb2xsZXJzIikKLSAgICAgICAgaWYoY29udHJvbGxlcnNIb21lLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBwcmludGxuICJiYXNlIGRpcmVjdG9yeSBleGlzdHMgcmUtY3JlYXRpbmcgd2ViLnhtbCIKLSAgICAgICAgICAgIGRlZiBjb250cm9sbGVycyA9IFtdCi0gICAgICAgICAgICBkZWYgZmxvd3MgPSBbXQotICAgICAgICAgICAgY29udHJvbGxlcnNIb21lLmVhY2hGaWxlUmVjdXJzZSB7Ci0gICAgICAgICAgICAgICAgZGVmIG1hdGNoID0gaXQubmFtZSA9fiAiKFxcdyspKENvbnRyb2xsZXIuZ3Jvb3Z5XCQpIgotICAgICAgICAgICAgICAgIGlmKG1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBjb250cm9sbGVyTmFtZSA9IG1hdGNoWzBdWzFdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOYW1lID0gY29udHJvbGxlck5hbWVbMF0udG9Mb3dlckNhc2UoKSArIGNvbnRyb2xsZXJOYW1lWzEuLi0xXQotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVycyA8PCBjb250cm9sbGVyTmFtZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXRjaCA9IGl0Lm5hbWUgPX4gIihcXHcrKShQYWdlRmxvdy5ncm9vdnlcJCkiCi0gICAgICAgICAgICAgICAgaWYobWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmIGZsb3dOYW1lID0gbWF0Y2hbMF1bMV0KLSAgICAgICAgICAgICAgICAgICAgZmxvd05hbWUgPSBmbG93TmFtZVswXS50b0xvd2VyQ2FzZSgpICsgZmxvd05hbWVbMS4uLTFdCi0gICAgICAgICAgICAgICAgICAgIGZsb3dzIDw8IGZsb3dOYW1lCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmIGJpbmRpbmcgPSBbICJjb250cm9sbGVycyIgOiBjb250cm9sbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd3MiIDogZmxvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2VkaXIiIDogIiR7YmFzZWRpcn0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXN0ZGlyIiA6ICIke2Jhc2VkaXJ9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV2IiA6IHRydWUgICAgIF0KLSAgICAgICAgICAgIGRlZiBlbmdpbmUgPSBuZXcgZ3Jvb3Z5LnRleHQuU2ltcGxlVGVtcGxhdGVFbmdpbmUoKQotICAgICAgICAgICAgZGVmIHRlbXBsYXRlID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKCBuZXcgRmlsZSgiJHtiYXNlZGlyfS93ZWItYXBwL1dFQi1JTkYvd2ViLnRlbXBsYXRlLnhtbCIgICkudGV4dCApLm1ha2UoYmluZGluZykKLQotICAgICAgICAgICAgbmV3IEZpbGUoIiR7ZGVzdGRpcn0vV0VCLUlORi93ZWIueG1sIiApLndyaXRlKCB0ZW1wbGF0ZS50b1N0cmluZygpICkKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9maWx0ZXIvUmVzb3VyY2VDb3BpZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L2ZpbHRlci9SZXNvdXJjZUNvcGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU1NzJmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L2ZpbHRlci9SZXNvdXJjZUNvcGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5maWx0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTctRmViLTIwMDYKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUNvcGllciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIHdob2xlIGdyYWlscy1hcHAgcmVwbGFjaW5nIGFueSBjaGFuZ2VzCi0gICAgICovCi0gICAgdm9pZCBjb3B5R3JhaWxzQXBwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgb25seSB0aGUgdmlld3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBzaG91bGRPdmVyd3JpdGUgV2hldGhlciB0aGUgdmlld3Mgc2hvdWxkIGJlIG92ZXJ3cml0dGVuCi0gICAgICovCi0gICAgdm9pZCBjb3B5Vmlld3MoYm9vbGVhbiBzaG91bGRPdmVyd3JpdGUpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGJhc2VkaXIgdG8gY29weSBmcm9tIChkZWZhdWx0cyB0byAiLiIpCi0gICAgICogQHBhcmFtIGJhc2VkaXIKLSAgICAgKi8KLSAgICB2b2lkIHNldEJhc2VkaXIoU3RyaW5nIGJhc2VkaXIpOwotCi0gICAgLyoqCi0gICAgICogKiBUaGUgZGVzdGRpciB0byBjb3B5IGRlc3RkaXIgKGRlZmF1bHRzIHRvICIuL3RtcC93YXIiKQotICAgICAqIEBwYXJhbSBkZXN0ZGlyCi0gICAgICovCi0gICAgdm9pZCBzZXREZXN0ZGlyKFN0cmluZyBkZXN0ZGlyKTsKLQotICAgIC8qKgotICAgICAqIFJlLWdlbmVyYXRlcyB0aGUgd2ViLnhtbCBmaWxlCi0gICAgICovCi0gICAgdm9pZCBnZW5lcmF0ZVdlYlhtbCgpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL0dyYWlsc0NvbnRyb2xsZXJIZWxwZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9HcmFpbHNDb250cm9sbGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGM1MzcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL0dyYWlsc0NvbnRyb2xsZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12YzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQ29udHJvbGxlckNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nLkdyYWlsc1NjYWZmb2xkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTW9kZWxBbmRWaWV3OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBoZWxwZXIgY2xhc3MgdGhhdCBwcm9jZXNzZXMgR3JhaWxzIGNvbnRyb2xsZXIgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyAKLSAqIAotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgT2N0IDI3LCAyMDA1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhaWxzQ29udHJvbGxlckhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2bGV0IGNvbnRleHQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAvKioKLQkgKiBSZXRyaWV2ZXMgYSBjb250cm9sbGVyIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiAgVGhlIGNvbnRyb2xsZXIgY2xhc3Mgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ2V0Q29udHJvbGxlckNsYXNzQnlOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgR3JhaWxzQ29udHJvbGxlckNsYXNzIGJ5IFVSSQotCSAqIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSB0byBsb29rdXAKLQkgKiBAcmV0dXJuIEEgR3JhaWxzQ29udHJvbGxlckNsYXNzIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ2V0Q29udHJvbGxlckNsYXNzQnlVUkkoU3RyaW5nIHVyaSk7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250cm9sbGVyIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIEdyYWlsc0NvbnRyb2xsZXJDbGFzcwotCSAqIEBwYXJhbSBjb250cm9sbGVyQ2xhc3MgVGhlIEdyYWlsc0NvbnRyb2xsZXJDbGFzcwotCSAqIEByZXR1cm4gQSBuZXcgY29udHJvbGxlciBpbnN0YW5jZQotCSAqLwkKLQlwdWJsaWMgYWJzdHJhY3QgR3Jvb3Z5T2JqZWN0IGdldENvbnRyb2xsZXJJbnN0YW5jZSgKLQkJCUdyYWlsc0NvbnRyb2xsZXJDbGFzcyBjb250cm9sbGVyQ2xhc3MpOwotCQotCS8qKgotCSAqIFJldHJlaXZlcyB0aGUgc2NhZmZvbGRlciBmb3IgdGhlIHNwZWNpZmllZCBjb250cm9sbGVyCi0JICogQHBhcmFtIGNvbnRyb2xsZXJOYW1lIFRoZSBjb250cm9sbGVyIG5hbWUKLQkgKiBAcmV0dXJuIFRoZSBzY2FmZm9sZGVyIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgR3JhaWxzU2NhZmZvbGRlciBnZXRTY2FmZm9sZGVyRm9yQ29udHJvbGxlcihTdHJpbmcgY29udHJvbGxlck5hbWUpOwotCS8qKgotCSAqIEhhbmRsZXMgYSBHcmFpbHMgVVJJCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHByb2Nlc3NzCi0JICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgaW5zdGFuY2UKLQkgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGluc3RhbmNlCi0JICogQHJldHVybiBBIE1vZGVsQW5kVmlldyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNb2RlbEFuZFZpZXcgaGFuZGxlVVJJKFN0cmluZyB1cmksCi0JCQlIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSk7Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgQ29udHJvbGxlciBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uIEFuIGFjdGlvbiBDbG9zdXJlIGluc3RhbmNlCi0JICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgb2JqZWN0Ci0JICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIGFjdGlvbiByZXNwb25zZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaGFuZGxlQWN0aW9uKEdyb292eU9iamVjdCBjb250cm9sbGVyLENsb3N1cmUgYWN0aW9uLEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKTsKLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgQ29udHJvbGxlciBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uIEFuIGFjdGlvbiBDbG9zdXJlIGluc3RhbmNlCi0JICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgb2JqZWN0Ci0JICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZQotCSAqIEBwYXJhbSBwYXJhbXMgQSBNYXAgb2YgY29udHJvbGxlciBwYXJhbWV0ZXJzCi0JICogCi0JICogQHJldHVybiBUaGUgYWN0aW9uIHJlc3BvbnNlCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBoYW5kbGVBY3Rpb24oR3Jvb3Z5T2JqZWN0IGNvbnRyb2xsZXIsQ2xvc3VyZSBhY3Rpb24sSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIE1hcCBwYXJhbXMpOwotCQotCS8qKgotCSAqIFByb2Nlc3NlcyBhbiBhY3Rpb24gcmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UKLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWUgVGhlIHJlc3BvbnNlIGZyb20gdGhlIGNsb3N1cmUKLQkgKiBAcGFyYW0gY2xvc3VyZVByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgY2xvc3VyZQotCSAqIEBwYXJhbSB2aWV3TmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlldwotCSAqIAotCSAqIEByZXR1cm4gQSBNb2RlbEFuZFZpZXcgb2JqZWN0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IE1vZGVsQW5kVmlldyBoYW5kbGVBY3Rpb25SZXNwb25zZSgKLQkJCUdyb292eU9iamVjdCBjb250cm9sbGVyLCBPYmplY3QgcmV0dXJuVmFsdWUsCi0JCQlTdHJpbmcgY2xvc3VyZVByb3BlcnR5TmFtZSwgU3RyaW5nIHZpZXdOYW1lKTsKLQotCS8qKgotCSAqIEhhbmRsZXMgYSBHcmFpbHMgVVJJCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHByb2Nlc3NzCi0JICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgaW5zdGFuY2UKLQkgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGluc3RhbmNlCi0JICogQHBhcmFtIHBhcmFtcyBBIG1hcCBvZiBjb250cm9sbGVyIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuIEEgTW9kZWxBbmRWaWV3IGluc3RhbmNlCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1vZGVsQW5kVmlldyBoYW5kbGVVUkkoU3RyaW5nIHVyaSwKLQkJCUh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBNYXAgcGFyYW1zKTsKLQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdyYWlscyByZXF1ZXN0IGF0dHJpYnV0ZXMgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMgZ2V0R3JhaWxzQXR0cmlidXRlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9HcmFpbHNVcmxIYW5kbGVyTWFwcGluZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL0dyYWlsc1VybEhhbmRsZXJNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDdkMTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL0dyYWlsc1VybEhhbmRsZXJNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12YzsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuaGFuZGxlci5TaW1wbGVVcmxIYW5kbGVyTWFwcGluZzsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi51dGlsLlVybFBhdGhIZWxwZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi0vKioKLSAqIDxwPkNsYXNzIHRoYXQgaGFuZGxlcyBVUkwgbWFwcGluZyBmb3IgR3JhaWxzCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIERlYyAxNSwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzVXJsSGFuZGxlck1hcHBpbmcgZXh0ZW5kcyBTaW1wbGVVcmxIYW5kbGVyTWFwcGluZyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URVhUX0lEID0gImhhbmRsZXJNYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URVhUX1RBUkdFVF9TT1VSQ0UgPSAiaGFuZGxlck1hcHBpbmdUYXJnZXRTb3VyY2UiOwotCi0gICAgcHJpdmF0ZSBVcmxQYXRoSGVscGVyIHVybFBhdGhIZWxwZXIgPSBuZXcgVXJsUGF0aEhlbHBlcigpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuaGFuZGxlci5BYnN0cmFjdFVybEhhbmRsZXJNYXBwaW5nI2dldEhhbmRsZXJJbnRlcm5hbChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0SGFuZGxlckludGVybmFsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFwcFBhdGggPSB1cmxQYXRoSGVscGVyLmdldFBhdGhXaXRoaW5BcHBsaWNhdGlvbihyZXF1ZXN0KTsKLQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlsb2dnZXIuZGVidWcoIkxvb2tpbmcgdXAgaGFuZGxlciBmb3IgWyIgKyBhcHBQYXRoICsgIl0iKTsKLQkJfQotCQlyZXR1cm4gbG9va3VwSGFuZGxlcihhcHBQYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvU2ltcGxlR3JhaWxzQ29udHJvbGxlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL1NpbXBsZUdyYWlsc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMzdjYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvU2ltcGxlR3JhaWxzQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuU2VydmxldENvbnRleHRBd2FyZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lk1vZGVsQW5kVmlldzsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lm12Yy5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnV0aWwuVXJsUGF0aEhlbHBlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotLyoqCi0gKiA8cD5CYXNlIGNsYXNzIGZvciBHcmFpbHMgY29udHJvbGxlcnMuCi0gKgotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlR3JhaWxzQ29udHJvbGxlciBpbXBsZW1lbnRzIENvbnRyb2xsZXIsIFNlcnZsZXRDb250ZXh0QXdhcmUgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVYVF9JRCA9ICJzaW1wbGVHcmFpbHNDb250cm9sbGVyIjsKLSAgICAKLSAgICBwcml2YXRlIFVybFBhdGhIZWxwZXIgdXJsUGF0aEhlbHBlciA9IG5ldyBVcmxQYXRoSGVscGVyKCk7Ci0gICAgcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICBwcml2YXRlIEdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgaGVscGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpbXBsZUdyYWlsc0NvbnRyb2xsZXIuY2xhc3MpOwotCi0KLSAgICBwdWJsaWMgU2ltcGxlR3JhaWxzQ29udHJvbGxlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdyYWlsc0FwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCB3cmFwcyByZWd1bGFyIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9iamVjdHMgaW50byBHcmFpbHMgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cy4KLSAgICAgKgotICAgICAqIDxwPkl0IGNhbiBoYW5kbGUgbWFwcyBhcyBtb2RlbCB0eXBlcyBuZXh0IHRvIE1vZGVsQW5kVmlldyBpbnN0YW5jZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBIVFRQIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgSFRUUCByZXNwb25zZQotICAgICAqIEByZXR1cm4gdGhlIG1vZGVsCi0gICAgICovCi0gICAgcHVibGljIE1vZGVsQW5kVmlldyBoYW5kbGVSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3RlcCAxOiBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgVVJJIG9mIHRoZSByZXF1ZXN0LgotICAgICAgICBTdHJpbmcgdXJpID0gdGhpcy51cmxQYXRoSGVscGVyLmdldFBhdGhXaXRoaW5BcHBsaWNhdGlvbihyZXF1ZXN0KTsKLSAgICAgICAgaWYoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiW1NpbXBsZUdyYWlsc0NvbnRyb2xsZXJdIFByb2Nlc3NpbmcgcmVxdWVzdCBmb3IgdXJpIFsiK3VyaSsiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSAoQXBwbGljYXRpb25Db250ZXh0KXRoaXMuc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlcih0aGlzLmFwcGxpY2F0aW9uLGNvbnRleHQsdGhpcy5zZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIE1vZGVsQW5kVmlldyBtdiA9IGhlbHBlci5oYW5kbGVVUkkodXJpLHJlcXVlc3QscmVzcG9uc2UpOwotCi0gICAgICAgIGlmKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBpZihtdiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJbU2ltcGxlR3JhaWxzQ29udHJvbGxlcl0gRm9yd2FyZGluZyB0byB2aWV3IFsiK212LmdldFZpZXdOYW1lKCkrIl0gd2l0aCBtb2RlbCBbIittdi5nZXRNb2RlbCgpKyJdIik7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0Q29udGV4dChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgewotICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2bGV0Q29udGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL1NpbXBsZUdyYWlsc0NvbnRyb2xsZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiODM2Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuUHJveHlNZXRhQ2xhc3M7Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkJlYW5NYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5Db21wb3NpdGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuV29yZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb250cm9sbGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMubWV0YWNsYXNzLkdlbmVyaWNEeW5hbWljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuR3JhaWxzU2NhZmZvbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNoYWluRHluYW1pY01ldGhvZDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNvbnRyb2xsZXJEeW5hbWljTWV0aG9kczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkdldFBhcmFtc0R5bmFtaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5EZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkZsYXNoU2NvcGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zLkNvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnMuTm9DbG9zdXJlUHJvcGVydHlGb3JVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnMuTm9WaWV3TmFtZURlZmluZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnMuVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lk1vZGVsQW5kVmlldzsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlciBpbXBsZW1lbnRzIEdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUZGT0xERVIgPSAiU2NhZmZvbGRlciI7Ci0KLSAgICBwcml2YXRlIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICBwcml2YXRlIE1hcCBjaGFpbk1vZGVsID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIHByaXZhdGUgQ29udHJvbGxlckR5bmFtaWNNZXRob2RzIGludGVyY2VwdG9yOwotICAgIHByaXZhdGUgR3JhaWxzU2NhZmZvbGRlciBzY2FmZm9sZGVyOwotICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXMgZ3JhaWxzQXR0cmlidXRlczsKLSAgICBwcml2YXRlIFBhdHRlcm4gdXJpUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiLyhcXHcrKS8/KFxcdyopLz8oXFx3KikvPyguKikiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BBVENIX0FDVElPTl9QQVJBTUVURVIgPSAiX2FjdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BBUkFNRVRFUiA9ICJpZCI7Ci0KLSAgICBwdWJsaWMgU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlcihHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLSAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7Ci0gICAgICAgIHRoaXMuZ3JhaWxzQXR0cmlidXRlcyA9IG5ldyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzKHRoaXMuc2VydmxldENvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2VydmxldENvbnRleHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5HcmFpbHNDb250cm9sbGVySGVscGVyI2dldENvbnRyb2xsZXJDbGFzc0J5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgR3JhaWxzQ29udHJvbGxlckNsYXNzIGdldENvbnRyb2xsZXJDbGFzc0J5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvbi5nZXRDb250cm9sbGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNTY2FmZm9sZGVyIGdldFNjYWZmb2xkZXJGb3JDb250cm9sbGVyKFN0cmluZyBjb250cm9sbGVyTmFtZSkgewotICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gZ2V0Q29udHJvbGxlckNsYXNzQnlOYW1lKGNvbnRyb2xsZXJOYW1lKTsKLSAgICAgICAgcmV0dXJuIChHcmFpbHNTY2FmZm9sZGVyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKCBjb250cm9sbGVyQ2xhc3MuZ2V0RnVsbE5hbWUoKSArIFNDQUZGT0xERVIgKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLkdyYWlsc0NvbnRyb2xsZXJIZWxwZXIjZ2V0Q29udHJvbGxlckNsYXNzQnlVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBnZXRDb250cm9sbGVyQ2xhc3NCeVVSSShTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFwcGxpY2F0aW9uLmdldENvbnRyb2xsZXJCeVVSSSh1cmkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzQ29udHJvbGxlckhlbHBlciNnZXRDb250cm9sbGVySW5zdGFuY2Uob3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb250cm9sbGVyQ2xhc3MpCi0gICAgICAqLwotICAgIHB1YmxpYyBHcm9vdnlPYmplY3QgZ2V0Q29udHJvbGxlckluc3RhbmNlKEdyYWlsc0NvbnRyb2xsZXJDbGFzcyBjb250cm9sbGVyQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIChHcm9vdnlPYmplY3QpdGhpcy5hcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihjb250cm9sbGVyQ2xhc3MuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5HcmFpbHNDb250cm9sbGVySGVscGVyI2hhbmRsZVVSSShqYXZhLmxhbmcuU3RyaW5nLCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkKLSAgICAgICovCi0gICAgcHVibGljIE1vZGVsQW5kVmlldyBoYW5kbGVVUkkoU3RyaW5nIHVyaSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZVVSSSh1cmkscmVxdWVzdCxyZXNwb25zZSxDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBJZiBpbiBQcm94eSdzIGFyZSB1c2VkIGluIHRoZSBHcm9vdnkgY29udGV4dCwgdW5wcm94eSAoaXMgdGhhdCBhIHdvcmQ/KSB0aGVtIGJ5IHNldHRpbmcKLSAgICAgKiB0aGUgYWRhcHRlZSBhcyB0aGUgdmFsdWUgaW4gdGhlIG1hcCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gbm9uLWdyb292eSB2aWV3IHRlY2hub2xvZ2llcwotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBhcyBhIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcm94aWVzRnJvbU1vZGVsT2JqZWN0cyhNYXAgbW9kZWwpIHsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGtleUl0ZXIgPSBtb2RlbC5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50ID0ga2V5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBtb2RlbC5nZXQoY3VycmVudCk7Ci0gICAgICAgICAgICBpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFByb3h5KSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwucHV0KCBjdXJyZW50LCAoKFByb3h5KW1vZGVsT2JqZWN0KS5nZXRBZGFwdGVlKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzQ29udHJvbGxlckhlbHBlciNoYW5kbGVVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UsIGphdmEudXRpbC5NYXApCi0gICAgICAqLwotICAgIHB1YmxpYyBNb2RlbEFuZFZpZXcgaGFuZGxlVVJJKFN0cmluZyB1cmksIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBNYXAgcGFyYW1zKSB7Ci0gICAgICAgIGlmKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBVUkkgWyIgKyB1cmkgKyAiXSBjYW5ub3QgYmUgbnVsbCEiKTsKLQotICAgICAgICAvLyBzdGVwIDE6IHByb2Nlc3MgdGhlIHVyaQotICAgICAgICBpZiAodXJpLmluZGV4T2YoIj8iKSA+IC0xKSB7Ci0gICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5pbmRleE9mKCI/IikpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHVyaS5pbmRleE9mKCdcXCcpID4gLTEpIHsKLSAgICAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCJcXFxcIiwgIi8iKTsKLSAgICAgICAgfQotICAgICAgICBpZighdXJpLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgICAgIHVyaSA9ICcvJyArIHVyaTsKLSAgICAgICAgaWYodXJpLmVuZHNXaXRoKCIvIikpCi0gICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsdXJpLmxlbmd0aCgpIC0gMSk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNvbnRyb2xsZXJOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBNYXAgZXh0cmFQYXJhbXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIE1hdGNoZXIgbSA9IHVyaVBhdHRlcm4ubWF0Y2hlcih1cmkpOwotICAgICAgICBpZihtLmZpbmQoKSkgewotICAgICAgICAgICAgY29udHJvbGxlck5hbWUgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgYWN0aW9uTmFtZSA9ICBtLmdyb3VwKDIpOwotICAgICAgICAgICAgdXJpID0gJy8nICsgY29udHJvbGxlck5hbWUgKyAnLycgKyBhY3Rpb25OYW1lOwotICAgICAgICAgICAgaWQgPSBtLmdyb3VwKDMpOwotICAgICAgICAgICAgU3RyaW5nIGV4dHJhUGFyYW1zU3RyaW5nID0gbS5ncm91cCg0KTsKLSAgICAgICAgICAgIGlmKGV4dHJhUGFyYW1zU3RyaW5nICE9IG51bGwgJiYgZXh0cmFQYXJhbXNTdHJpbmcuaW5kZXhPZignLycpID4gLSAxKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gZXh0cmFQYXJhbXNTdHJpbmcuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgICAgICBleHRyYVBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZihpID09IDAgfHwgKChpICUgMikgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpICsgMSkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFQYXJhbXMucHV0KHRva2VuLCB0b2tlbnNbaSArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIHRoZSBhY3Rpb24gbmFtZSBpcyBibGFuayBjaGVjayBpdHMgaW5jbHVkZWQgYXMgZGlzcGF0Y2ggcGFyYW1ldGVyCi0gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsoYWN0aW9uTmFtZSkgJiYgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoRElTUEFUQ0hfQUNUSU9OX1BBUkFNRVRFUikgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aW9uTmFtZSA9IEdyYWlsc0NsYXNzVXRpbHMuZ2V0UHJvcGVydHlOYW1lUmVwcmVzZW50YXRpb24ocmVxdWVzdC5nZXRQYXJhbWV0ZXIoRElTUEFUQ0hfQUNUSU9OX1BBUkFNRVRFUikpOwotICAgICAgICAgICAgdXJpID0gJy8nICsgY29udHJvbGxlck5hbWUgKyAnLycgKyBhY3Rpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIHRoZSBpZCBpcyBibGFuayBjaGVjayBpZiBpdHMgYSByZXF1ZXN0IHBhcmFtZXRlcgotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGlkKSAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcihJRF9QQVJBTUVURVIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoSURfUEFSQU1FVEVSKTsKLSAgICAgICAgfQotICAgICAgICBpZihMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJQcm9jZXNzaW5nIHJlcXVlc3QgZm9yIGNvbnRyb2xsZXIgWyIrY29udHJvbGxlck5hbWUrIl0sIGFjdGlvbiBbIithY3Rpb25OYW1lKyJdLCBhbmQgaWQgWyIraWQrIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKCJFeHRyYSBwYXJhbXMgZnJvbSB1cmkgWyIrZXh0cmFQYXJhbXMrIl0gIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3RlcCAyOiBsb29rdXAgdGhlIGNvbnRyb2xsZXIgaW4gdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICBHcmFpbHNDb250cm9sbGVyQ2xhc3MgY29udHJvbGxlckNsYXNzID0gZ2V0Q29udHJvbGxlckNsYXNzQnlVUkkodXJpKTsKLQotICAgICAgICAvLyBwYXJzZSB0aGUgdXJpIGluIGl0cyBpbmRpdmlkdWFsIHRva2VucwotICAgICAgICBjb250cm9sbGVyTmFtZSA9IFdvcmRVdGlscy51bmNhcGl0YWxpemUoY29udHJvbGxlckNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb24oIk5vIGNvbnRyb2xsZXIgZm91bmQgZm9yIFVSSSBbIiArIHVyaSArICJdISIpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBTdGVwIDM6IGxvYWQgY29udHJvbGxlciBmcm9tIGFwcGxpY2F0aW9uIGNvbnRleHQuCi0gICAgICAgIEdyb292eU9iamVjdCBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlckluc3RhbmNlKGNvbnRyb2xsZXJDbGFzcyk7Ci0KLSAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5DT05UUk9MTEVSLCBjb250cm9sbGVyICk7Ci0KLSAgICAgICAgLy8gU3RlcCAzYTogQ29uZmlndXJlIGEgcHJveHkgaW50ZXJjZXB0b3IgZm9yIGNvbnRyb2xsZXIgZHluYW1pYyBtZXRob2RzIGZvciB0aGlzIHJlcXVlc3QKLSAgICAgICAgaWYodGhpcy5pbnRlcmNlcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0gbmV3IENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcyhjb250cm9sbGVyLHRoaXMscmVxdWVzdCxyZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIGR5bmFtaWMgY29udHJvbGxlciBtZXRob2RzIGZvciBjb250cm9sbGVyIFsiK2NvbnRyb2xsZXIuZ2V0Q2xhc3MoKSsiXTogIiArIGllLmdldE1lc3NhZ2UoKSwgaWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFN0ZXAgM2I6IGlmIHNjYWZmb2xkaW5nIHJldHJpZXZlIHNjYWZmb2xkZXIKLSAgICAgICAgaWYoY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKSkgIHsKLSAgICAgICAgICAgIHRoaXMuc2NhZmZvbGRlciA9IChHcmFpbHNTY2FmZm9sZGVyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKCBjb250cm9sbGVyQ2xhc3MuZ2V0RnVsbE5hbWUoKSArIFNDQUZGT0xERVIgKTsKLSAgICAgICAgICAgIGlmKHRoaXMuc2NhZmZvbGRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNjYWZmb2xkaW5nIHNldCB0byB0cnVlIGZvciBjb250cm9sbGVyIFsiK2NvbnRyb2xsZXJDbGFzcy5nZXRGdWxsTmFtZSgpKyJdIGJ1dCBubyBzY2FmZm9sZGVyIGF2YWlsYWJsZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgNDogZ2V0IGNsb3N1cmUgcHJvcGVydHkgbmFtZSBmb3IgVVJJLgotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGFjdGlvbk5hbWUpKQotICAgICAgICAgICAgYWN0aW9uTmFtZSA9IGNvbnRyb2xsZXJDbGFzcy5nZXRDbG9zdXJlUHJvcGVydHlOYW1lKHVyaSk7Ci0KLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsoYWN0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgIC8vIFN0ZXAgNGE6IENoZWNrIGlmIHNjYWZmb2xkaW5nCi0gICAgICAgICAgICBpZiggY29udHJvbGxlckNsYXNzLmlzU2NhZmZvbGRpbmcoKSAmJiAhc2NhZmZvbGRlci5zdXBwb3J0c0FjdGlvbihhY3Rpb25OYW1lKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9DbG9zdXJlUHJvcGVydHlGb3JVUklFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGNsb3N1cmUgcHJvcGVydHkgZm9yIFVSSSBbIiArIHVyaSArICJdIGZvciBjb250cm9sbGVyIFsiICsgY29udHJvbGxlckNsYXNzLmdldEZ1bGxOYW1lKCkgKyAiXSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgNGE6IFNldCBkeW5hbWljIHByb3BlcnRpZXMgb24gY29udHJvbGxlcgotCi0gICAgICAgIGNvbnRyb2xsZXIuc2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkNPTlRST0xMRVJfVVJJX1BST1BFUlRZLCAnLycgKyBjb250cm9sbGVyTmFtZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIuc2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLkFDVElPTl9VUklfUFJPUEVSVFksICcvJyArIGNvbnRyb2xsZXJOYW1lICsgJy8nICsgYWN0aW9uTmFtZSk7Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgYWRkaXRpb25hbCBwYXJhbXMgZnJvbSB1cmwKLSAgICAgICAgTWFwIGNvbnRyb2xsZXJQYXJhbXMgPSAoTWFwKWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5LlBST1BFUlRZX05BTUUpOwotICAgICAgICBpZighU3RyaW5nVXRpbHMuaXNCbGFuayhpZCkpIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJQYXJhbXMucHV0KEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5JRF9QQVJBTSwgaWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFleHRyYVBhcmFtcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4dHJhUGFyYW1zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlclBhcmFtcy5wdXQobmFtZSxleHRyYVBhcmFtcy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBmbGFzaCBzY29wZSBpbnN0YW5jZSB0byBpdHMgbmV4dCBzdGF0ZSBhbmQgc2V0IG9uIGNvbnRyb2xsZXIKLSAgICAgICAgRmxhc2hTY29wZSBmcyA9IHRoaXMuZ3JhaWxzQXR0cmlidXRlcy5nZXRGbGFzaFNjb3BlKHJlcXVlc3QpOwotICAgICAgICBmcy5uZXh0KCk7Ci0KLSAgICAgICAgY29udHJvbGxlci5zZXRQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuRkxBU0hfU0NPUEVfUFJPUEVSVFksZnMpOwotCi0gICAgICAgIC8vIFN0ZXAgNTogZ2V0IHRoZSB2aWV3IG5hbWUgZm9yIHRoaXMgVVJJLgotICAgICAgICBTdHJpbmcgdmlld05hbWUgPSBjb250cm9sbGVyQ2xhc3MuZ2V0Vmlld0J5VVJJKHVyaSk7Ci0KLSAgICAgICAgLy8gU3RlcCA2OiBnZXQgY2xvc3VyZSBmcm9tIGNsb3N1cmUgcHJvcGVydHkKLSAgICAgICAgQ2xvc3VyZSBhY3Rpb24gPSAoQ2xvc3VyZSljb250cm9sbGVyLmdldFByb3BlcnR5KGFjdGlvbk5hbWUpOwotCi0gICAgICAgIGlmKGFjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2NhZmZvbGRlciBzdXBwb3J0cyBhY3Rpb24gWyIrYWN0aW9uTmFtZSArIl0gZm9yIGNvbnRyb2xsZXIgWyIrY29udHJvbGxlckNsYXNzLmdldEZ1bGxOYW1lKCkrIl0gYnV0IGdldEFjdGlvbiByZXR1cm5lZCBudWxsISIpOwotCi0KLSAgICAgICAgLy8gU3RlcCA3OiBwcm9jZXNzIHRoZSBhY3Rpb24KLSAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gaGFuZGxlQWN0aW9uKCBjb250cm9sbGVyLGFjdGlvbixyZXF1ZXN0LHJlc3BvbnNlLHBhcmFtcyApOwotCi0KLSAgICAgICAgLy8gU3RlcCA4OiBkZXRlcm1pbmUgcmV0dXJuIHZhbHVlIHR5cGUgYW5kIGhhbmRsZSBhY2NvcmRpbmdseQotICAgICAgICByZXR1cm4gaGFuZGxlQWN0aW9uUmVzcG9uc2UoY29udHJvbGxlcixyZXR1cm5WYWx1ZSxhY3Rpb25OYW1lLHZpZXdOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzIGdldEdyYWlsc0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdyYWlsc0F0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBoYW5kbGVBY3Rpb24oR3Jvb3Z5T2JqZWN0IGNvbnRyb2xsZXIsQ2xvc3VyZSBhY3Rpb24sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVBY3Rpb24oY29udHJvbGxlcixhY3Rpb24scmVxdWVzdCxyZXNwb25zZSxDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaGFuZGxlQWN0aW9uKEdyb292eU9iamVjdCBjb250cm9sbGVyLENsb3N1cmUgYWN0aW9uLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgTWFwIHBhcmFtcykgewotICAgICAgICAgICAgaWYoaW50ZXJjZXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFByb3h5TWV0YUNsYXNzIHBtYyA9IChQcm94eU1ldGFDbGFzcyljb250cm9sbGVyLmdldE1ldGFDbGFzcygpOwotICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0gKENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcylwbWMuZ2V0SW50ZXJjZXB0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHBhcmFtcyBhZGQgdGhlbSB0byB0aGUgcGFyYW1zIGR5bmFtaWMgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKHBhcmFtcyAhPSBudWxsICYmICFwYXJhbXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5IHBhcmFtc1Byb3AgPSAoR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5KWludGVyY2VwdG9yLmdldER5bmFtaWNQcm9wZXJ0eSggR2V0UGFyYW1zRHluYW1pY1Byb3BlcnR5LlBST1BFUlRZX05BTUUgKTsKLSAgICAgICAgICAgICAgICBwYXJhbXNQcm9wLmFkZFBhcmFtcyggcGFyYW1zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayB0aGUgY2hhaW4gbW9kZWwgaXMgbm90IGVtcHR5IGFuZCBhZGQgaXQKLSAgICAgICAgICAgIGlmKCF0aGlzLmNoYWluTW9kZWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSAiY2hhaW5Nb2RlbCIgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBHZW5lcmljRHluYW1pY1Byb3BlcnR5IGNoYWluUHJvcGVydHkgPSAoR2VuZXJpY0R5bmFtaWNQcm9wZXJ0eSlpbnRlcmNlcHRvci5nZXREeW5hbWljUHJvcGVydHkoQ2hhaW5EeW5hbWljTWV0aG9kLlBST1BFUlRZX0NIQUlOX01PREVMKTsKLSAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0IGNyZWF0ZSBpdAotICAgICAgICAgICAgICAgIGlmKGNoYWluUHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvci5hZGREeW5hbWljUHJvcGVydHkoIG5ldyBHZW5lcmljRHluYW1pY1Byb3BlcnR5KCBDaGFpbkR5bmFtaWNNZXRob2QuUFJPUEVSVFlfQ0hBSU5fTU9ERUwsTWFwLmNsYXNzLHRoaXMuY2hhaW5Nb2RlbCxmYWxzZSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgYWRkIHRvIGl0Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBjaGFpblByb3BlcnR5TW9kZWwgPSAoTWFwKWNoYWluUHJvcGVydHkuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBjaGFpblByb3BlcnR5TW9kZWwucHV0QWxsKCB0aGlzLmNoYWluTW9kZWwgKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFpbk1vZGVsID0gY2hhaW5Qcm9wZXJ0eU1vZGVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgLy8gU3RlcCA3OiBkZXRlcm1pbmUgYXJndW1lbnQgY291bnQgYW5kIGV4ZWN1dGUuCi0gICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IGFjdGlvbi5jYWxsKCk7Ci0KLSAgICAgICAgLy8gU3RlcCA4OiBhZGQgYW55IGVycm9ycyB0byB0aGUgcmVxdWVzdAotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSggR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzLkVSUk9SUywgY29udHJvbGxlci5nZXRQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuRVJST1JTX1BST1BFUlRZKSApOwotCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLkdyYWlsc0NvbnRyb2xsZXJIZWxwZXIjaGFuZGxlQWN0aW9uUmVzcG9uc2Uob3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNDb250cm9sbGVyQ2xhc3MsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBNb2RlbEFuZFZpZXcgaGFuZGxlQWN0aW9uUmVzcG9uc2UoIEdyb292eU9iamVjdCBjb250cm9sbGVyLE9iamVjdCByZXR1cm5WYWx1ZSxTdHJpbmcgY2xvc3VyZVByb3BlcnR5TmFtZSwgU3RyaW5nIHZpZXdOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gdmlld05hbWVCbGFuayA9ICh2aWV3TmFtZSA9PSBudWxsIHx8IHZpZXdOYW1lLmxlbmd0aCgpID09IDApOwotICAgICAgICAvLyByZXNldCB0aGUgbWV0YWNsYXNzCi0gICAgICAgIE1vZGVsQW5kVmlldyBleHBsaWNpdHlNb2RlbEFuZFZpZXcgPSAoTW9kZWxBbmRWaWV3KWNvbnRyb2xsZXIuZ2V0UHJvcGVydHkoQ29udHJvbGxlckR5bmFtaWNNZXRob2RzLk1PREVMX0FORF9WSUVXX1BST1BFUlRZKTsKLSAgICAgICAgQm9vbGVhbiByZW5kZXJWaWV3ID0gKEJvb2xlYW4pY29udHJvbGxlci5nZXRQcm9wZXJ0eShDb250cm9sbGVyRHluYW1pY01ldGhvZHMuUkVOREVSX1ZJRVdfUFJPUEVSVFkpOwotICAgICAgICBGbGFzaFNjb3BlIGZzID0gdGhpcy5ncmFpbHNBdHRyaWJ1dGVzLmdldEZsYXNoU2NvcGUoKEh0dHBTZXJ2bGV0UmVxdWVzdCljb250cm9sbGVyLmdldFByb3BlcnR5KENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcy5SRVFVRVNUX1BST1BFUlRZKSk7Ci0gICAgICAgIGlmKGZzLmNvbnRhaW5zS2V5KENoYWluRHluYW1pY01ldGhvZC5QUk9QRVJUWV9DSEFJTl9NT0RFTCkpIHsKLSAgICAgICAgICAgIHRoaXMuY2hhaW5Nb2RlbCA9IChNYXApZnMuZ2V0KENoYWluRHluYW1pY01ldGhvZC5QUk9QRVJUWV9DSEFJTl9NT0RFTCk7Ci0gICAgICAgICAgICBpZih0aGlzLmNoYWluTW9kZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aGlzLmNoYWluTW9kZWwgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKHJlbmRlclZpZXcgPT0gbnVsbCkgcmVuZGVyVmlldyA9IEJvb2xlYW4uVFJVRTsKLQotICAgICAgICBpZighcmVuZGVyVmlldy5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihleHBsaWNpdHlNb2RlbEFuZFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4cGxpY2l0eU1vZGVsQW5kVmlldzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmlld05hbWVCbGFuaykgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBNYXAgbW9kZWw7Ci0gICAgICAgICAgICAgICAgaWYoIXRoaXMuY2hhaW5Nb2RlbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBuZXcgQ29tcG9zaXRlTWFwKHRoaXMuY2hhaW5Nb2RlbCwgbmV3IEJlYW5NYXAoY29udHJvbGxlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBuZXcgQmVhbk1hcChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsQW5kVmlldyh2aWV3TmFtZSwgbW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgYW55IFByb3h5IHdyYXBwZXJzIGFuZCBzZXQgdGhlIGFkYXB0ZWUgYXMgdGhlIHZhbHVlCi0gICAgICAgICAgICBNYXAgcmV0dXJuTW9kZWwgPSAoTWFwKXJldHVyblZhbHVlOwotICAgICAgICAgICAgcmVtb3ZlUHJveGllc0Zyb21Nb2RlbE9iamVjdHMocmV0dXJuTW9kZWwpOwotICAgICAgICAgICAgaWYoIXRoaXMuY2hhaW5Nb2RlbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5Nb2RlbC5wdXRBbGwodGhpcy5jaGFpbk1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxBbmRWaWV3KHZpZXdOYW1lLCByZXR1cm5Nb2RlbCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE1vZGVsQW5kVmlldykgewotICAgICAgICAgICAgTW9kZWxBbmRWaWV3IG1vZGVsQW5kVmlldyA9IChNb2RlbEFuZFZpZXcpcmV0dXJuVmFsdWU7Ci0KLSAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgUHJveHkgd3JhcHBlcnMgYW5kIHNldCB0aGUgYWRhcHRlZSBhcyB0aGUgdmFsdWUKLSAgICAgICAgICAgIE1hcCBtb2RlbE1hcCA9IG1vZGVsQW5kVmlldy5nZXRNb2RlbCgpOwotICAgICAgICAgICAgcmVtb3ZlUHJveGllc0Zyb21Nb2RlbE9iamVjdHMobW9kZWxNYXApOwotCi0gICAgICAgICAgICBpZighdGhpcy5jaGFpbk1vZGVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsQW5kVmlldy5hZGRBbGxPYmplY3RzKHRoaXMuY2hhaW5Nb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbEFuZFZpZXcuZ2V0VmlldygpID09IG51bGwgJiYgbW9kZWxBbmRWaWV3LmdldFZpZXdOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh2aWV3TmFtZUJsYW5rKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1ZpZXdOYW1lRGVmaW5lZEV4Y2VwdGlvbigiTW9kZWxBbmRWaWV3IGluc3RhbmNlIHJldHVybmVkIGJ5IGFuZCBubyB2aWV3IG5hbWUgZGVmaW5lZCBieSBub3IgZm9yIGNsb3N1cmUgb24gcHJvcGVydHkgWyIgKyBjbG9zdXJlUHJvcGVydHlOYW1lICsgIl0gaW4gY29udHJvbGxlciBbIiArIGNvbnRyb2xsZXIuZ2V0Q2xhc3MoKSArICJdISIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsQW5kVmlldy5zZXRWaWV3TmFtZSh2aWV3TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1vZGVsQW5kVmlldzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE1hcCBtb2RlbDsKLSAgICAgICAgICAgIGlmKCF0aGlzLmNoYWluTW9kZWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwgPSBuZXcgQ29tcG9zaXRlTWFwKHRoaXMuY2hhaW5Nb2RlbCwgbmV3IEJlYW5NYXAoY29udHJvbGxlcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwgPSBuZXcgQmVhbk1hcChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxBbmRWaWV3KHZpZXdOYW1lLCBtb2RlbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL0NvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL0NvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3OWU0OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9Db250cm9sbGVyRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc01WQ0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIENvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbGxlckV4ZWN1dGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIENvbnRyb2xsZXJFeGVjdXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvR3JhaWxzTVZDRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9HcmFpbHNNVkNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YTRlMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9HcmFpbHNNVkNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZXhjZXB0aW9ucy5HcmFpbHNFeGNlcHRpb247Ci0KLS8qKgotICogPHA+VGhyb3duIHdoZW4gYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGluIHRoZSBHcmFpbHMgTVZDIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhaWxzTVZDRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBHcmFpbHNNVkNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdyYWlsc01WQ0V4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzTVZDRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgR3JhaWxzTVZDRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvSW5jb21wYXRpYmxlUGFyYW1ldGVyQ291bnRFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL0luY29tcGF0aWJsZVBhcmFtZXRlckNvdW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjBlNzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvSW5jb21wYXRpYmxlUGFyYW1ldGVyQ291bnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIGEgY2xvc3VyZSBoYXMgYW4gaW5jb21wYXRpYmxlIHBhcmFtZXRlciBjb3VudCBmb3IgYSBjb250cm9sbGVyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbXBhdGlibGVQYXJhbWV0ZXJDb3VudEV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc01WQ0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgSW5jb21wYXRpYmxlUGFyYW1ldGVyQ291bnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEluY29tcGF0aWJsZVBhcmFtZXRlckNvdW50RXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBJbmNvbXBhdGlibGVQYXJhbWV0ZXJDb3VudEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIEluY29tcGF0aWJsZVBhcmFtZXRlckNvdW50RXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvSW52YWxpZFVyaUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvSW52YWxpZFVyaUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGMyNzEzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL0ludmFsaWRVcmlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIGEgY29udHJvbGxlciBjYW5ub3QgbWFrZSBzZW5zZSBvZiB0aGUgVVJJIGl0IGhhcyB0byBoYW5kbGUuIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAzLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkVXJpRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzTVZDRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBJbnZhbGlkVXJpRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbnZhbGlkVXJpRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBJbnZhbGlkVXJpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgSW52YWxpZFVyaUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL05vQ2xvc3VyZVByb3BlcnR5Rm9yVVJJRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9Ob0Nsb3N1cmVQcm9wZXJ0eUZvclVSSUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTkzNzA0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL05vQ2xvc3VyZVByb3BlcnR5Rm9yVVJJRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuZXhjZXB0aW9uczsKLQotLyoqCi0gKiA8cD5UaHJvd24gd2hlbiBubyBjbG9zdXJlIHByb3BlcnR5IGhhcyBiZWVuIG1hcHBlZCB0byBhIGdpdmVuIFVSSS4gCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIE5vQ2xvc3VyZVByb3BlcnR5Rm9yVVJJRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzTVZDRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBOb0Nsb3N1cmVQcm9wZXJ0eUZvclVSSUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTm9DbG9zdXJlUHJvcGVydHlGb3JVUklFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIE5vQ2xvc3VyZVByb3BlcnR5Rm9yVVJJRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgTm9DbG9zdXJlUHJvcGVydHlGb3JVUklFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9Ob1ZpZXdOYW1lRGVmaW5lZEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvTm9WaWV3TmFtZURlZmluZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNDQ1ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9Ob1ZpZXdOYW1lRGVmaW5lZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLmV4Y2VwdGlvbnM7Ci0KLS8qKgotICogPHA+VGhyb3duIHdoZW4gbm8gdmlldyBuYW1lIGlzIHJldHVybmVkIGZyb20gYSBjbG9zdXJlIGluIGEgY29udHJvbGxlciBhbmQgbm8gdmlldyBuYW1lIGhhcyBiZWVuIGNvbmZpZ3VyZWQuIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1ZpZXdOYW1lRGVmaW5lZEV4Y2VwdGlvbiBleHRlbmRzIEdyYWlsc01WQ0V4Y2VwdGlvbiB7Ci0KLQlwdWJsaWMgTm9WaWV3TmFtZURlZmluZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5vVmlld05hbWVEZWZpbmVkRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBOb1ZpZXdOYW1lRGVmaW5lZEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgVGhyb3dhYmxlIGFyZzEpIHsKLQkJc3VwZXIoYXJnMCwgYXJnMSk7Ci0JfQotCi0JcHVibGljIE5vVmlld05hbWVEZWZpbmVkRXhjZXB0aW9uKFRocm93YWJsZSBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL1Vua25vd25Db250cm9sbGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Nzk1MDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2V4Y2VwdGlvbnMvVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5leGNlcHRpb25zOwotCi0vKioKLSAqIDxwPlRocm93biB3aGVuIGEgVVJJIGNhbm5vdCBiZSBtYXRjaGVkIHRvIGEgY29udHJvbGxlci4KLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgMiwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb24gZXh0ZW5kcyBHcmFpbHNNVkNFeGNlcHRpb24gewotCi0JcHVibGljIFVua25vd25Db250cm9sbGVyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBVbmtub3duQ29udHJvbGxlckV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgVW5rbm93bkNvbnRyb2xsZXJFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0JCXN1cGVyKGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBVbmtub3duQ29udHJvbGxlckV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL1Vuc3VwcG9ydGVkUmV0dXJuVmFsdWVFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9leGNlcHRpb25zL1Vuc3VwcG9ydGVkUmV0dXJuVmFsdWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2ODAzMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvZXhjZXB0aW9ucy9VbnN1cHBvcnRlZFJldHVyblZhbHVlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuZXhjZXB0aW9uczsKLQotLyoqCi0gKiA8cD5UaHJvd24gd2hlbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgY2xvc3VyZSBpcyB1bnN1cHBvcnRlZC4KLSAqIAotICogPHA+SWYgeW91IGFyZSB1c2luZyBhIGJ1aWxkZXIgaW4geW91ciBjb2RlIGFuZCB0aGlzIGV4Y2VwdGlvbgotICogaXMgdGhyb3duIHlvdSBtYXkgbmVlZCB0byByZXR1cm4gYSBudWxsIHZhbHVlIGF0IHRoZSBlbmQgb2YKLSAqIHRoZSBjbG9zdXJlIHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZFJldHVyblZhbHVlRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzTVZDRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBVbnN1cHBvcnRlZFJldHVyblZhbHVlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBVbnN1cHBvcnRlZFJldHVyblZhbHVlRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBVbnN1cHBvcnRlZFJldHVyblZhbHVlRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBUaHJvd2FibGUgYXJnMSkgewotCQlzdXBlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgVW5zdXBwb3J0ZWRSZXR1cm5WYWx1ZUV4Y2VwdGlvbihUaHJvd2FibGUgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L3ZpZXcvR3JhaWxzVmlld1Jlc29sdmVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC92aWV3L0dyYWlsc1ZpZXdSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFmYjYzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L3ZpZXcvR3JhaWxzVmlld1Jlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQudmlldzsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuVmlldzsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnZpZXcuQWJzdHJhY3RVcmxCYXNlZFZpZXc7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC52aWV3LkludGVybmFsUmVzb3VyY2VWaWV3UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBHcmFpbHMgdmlldyByZXNvbHZlciB3aGljaCBldmFsdWF0ZXMgdGhlIGV4aXN0YW5jZSBvZiBhIHZpZXcgZm9yIGRpZmZlcmVudCBleHRlbnNpb25zIGNob29zaW5nIHdoaWNoCi0gKiBvbmUgdG8gZGVsZWdhdGUgdG8uCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTEtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1ZpZXdSZXNvbHZlciBleHRlbmRzIEludGVybmFsUmVzb3VyY2VWaWV3UmVzb2x2ZXIgewotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsU3VmZml4OwotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsUHJlZml4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHU1BfU1VGRklYID0gIi5nc3AiOwotICAgIHByaXZhdGUgTWFwIHJlc29sdmVkQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgc3VwZXIuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICAgIHRoaXMubG9jYWxQcmVmaXggPSBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgc3VwZXIuc2V0U3VmZml4KHN1ZmZpeCk7Ci0gICAgICAgIHRoaXMubG9jYWxTdWZmaXggPSBzdWZmaXg7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFZpZXcgbG9hZFZpZXcoU3RyaW5nIHZpZXdOYW1lLCBMb2NhbGUgbG9jYWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQWJzdHJhY3RVcmxCYXNlZFZpZXcgdmlldyA9IGJ1aWxkVmlldyh2aWV3TmFtZSk7Ci0KLSAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgIGlmKHRoaXMucmVzb2x2ZWRDYWNoZS5jb250YWluc0tleSh2aWV3TmFtZSkpIHsKLSAgICAgICAgICAgIHZpZXcuc2V0VXJsKChTdHJpbmcpdGhpcy5yZXNvbHZlZENhY2hlLmdldCh2aWV3TmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgVVJMIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2Uodmlldy5nZXRVcmwoKSk7Ci0gICAgICAgICAgICAvLyB0cnkgR1NQIGlmIHJlcyBpcyBudWxsCi0gICAgICAgICAgICBpZihyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBnc3BWaWV3ID0gbG9jYWxQcmVmaXggKyB2aWV3TmFtZSArIEdTUF9TVUZGSVg7Ci0gICAgICAgICAgICAgICAgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZShnc3BWaWV3KTsKLSAgICAgICAgICAgICAgICBpZihyZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVybChnc3BWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZENhY2hlLnB1dCh2aWV3TmFtZSxnc3BWaWV3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVkQ2FjaGUucHV0KHZpZXdOYW1lLHZpZXcuZ2V0VXJsKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlldy5zZXRBcHBsaWNhdGlvbkNvbnRleHQoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICB2aWV3LmFmdGVyUHJvcGVydGllc1NldCgpOwotICAgICAgICByZXR1cm4gdmlldzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbFVybEZvclZpZXcoU3RyaW5nIHZpZXdOYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zaXRlbWVzaC9HcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zaXRlbWVzaC9HcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlZmNmOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2l0ZW1lc2gvR3JhaWxzTGF5b3V0RGVjb3JhdG9yTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2l0ZW1lc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkubW9kdWxlLnNpdGVtZXNoLkNvbmZpZzsKLWltcG9ydCBjb20ub3BlbnN5bXBob255Lm1vZHVsZS5zaXRlbWVzaC5EZWNvcmF0b3I7Ci1pbXBvcnQgY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2guRGVjb3JhdG9yTWFwcGVyOwotaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkubW9kdWxlLnNpdGVtZXNoLlBhZ2U7Ci1pbXBvcnQgY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2gubWFwcGVyLkFic3RyYWN0RGVjb3JhdG9yTWFwcGVyOwotaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkubW9kdWxlLnNpdGVtZXNoLm1hcHBlci5EZWZhdWx0RGVjb3JhdG9yOwotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBTaXRlTWVzaCBkZWNvcmF0b3IgbWFwcGVyIGludGVyZmFjZSBhbmQgYWxsb3dzIGdyYWlscyB2aWV3cyB0byBtYXAgdG8gZ3JhaWxzIGxheW91dHMKLSAqICAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIE9jdCAxMCwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzTGF5b3V0RGVjb3JhdG9yTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3REZWNvcmF0b3JNYXBwZXIgaW1wbGVtZW50cyBEZWNvcmF0b3JNYXBwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVDT1JBVE9SX1BBVEggPSAiL1dFQi1JTkYvZ3JhaWxzLWFwcC92aWV3cy9sYXlvdXRzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WSUVXX1RZUEUgPSAiLmpzcCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCBHcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXIuY2xhc3MgKTsKLQkKLQkKLQlwcml2YXRlIE1hcCBkZWNvcmF0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyB2b2lkIGluaXQoQ29uZmlnIGNvbmZpZywgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBEZWNvcmF0b3JNYXBwZXIgcGFyZW50KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoY29uZmlnLHByb3BlcnRpZXMscGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgRGVjb3JhdG9yIGdldERlY29yYXRvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgUGFnZSBwYWdlKSB7Ci0JCVN0cmluZyBsYXlvdXROYW1lID0gcGFnZS5nZXRQcm9wZXJ0eSgibWV0YS5sYXlvdXQiKTsKLQkJaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhsYXlvdXROYW1lKSkKLQkJCXJldHVybiBzdXBlci5nZXREZWNvcmF0b3IocmVxdWVzdCwgcGFnZSk7Ci0JCQotCQlyZXR1cm4gZ2V0TmFtZWREZWNvcmF0b3IocmVxdWVzdCwgbGF5b3V0TmFtZSk7Ci0JfQotCi0JcHVibGljIERlY29yYXRvciBnZXROYW1lZERlY29yYXRvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpIHsKLQkJCi0JCWlmKGRlY29yYXRvck1hcC5jb250YWluc0tleShuYW1lKSkgewotCQkJcmV0dXJuIChEZWNvcmF0b3IpZGVjb3JhdG9yTWFwLmdldChuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBkZWNvcmF0b3JOYW1lID0gbmFtZTsKLQkJCWlmKCFuYW1lLm1hdGNoZXMoIiguKykoXFwuKShcXHd7Mn18XFx3ezN9KSIpKSB7Ci0JCQkJbmFtZSArPSBERUZBVUxUX1ZJRVdfVFlQRTsKLQkJCX0KLQkJCVN0cmluZyBkZWNvcmF0b3JQYWdlID0gREVGQVVMVF9ERUNPUkFUT1JfUEFUSCArICcvJyArIG5hbWU7Ci0JCQkKLQkJCWlmKExPRy5pc0luZm9FbmFibGVkKCkpIAotCQkJCUxPRy5pbmZvKCJVc2luZyBkZWNvcmF0b3IgIiArIGRlY29yYXRvclBhZ2UpOwotCQkJCi0JCQlEZWNvcmF0b3IgZCA9IG5ldyBEZWZhdWx0RGVjb3JhdG9yKGRlY29yYXRvck5hbWUsZGVjb3JhdG9yUGFnZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCWRlY29yYXRvck1hcC5wdXQoZGVjb3JhdG9yTmFtZSxkKTsKLQkJCXJldHVybiBkOwotCQl9CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9HcmFpbHNUYWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3JhaWxzVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjIzNDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9HcmFpbHNUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHRvIHRhZyBpbXBsZW1lbnRhdGlvbiB0byBiZSBhYnN0cmFjdGVkIGZyb20gdGhlIEpTUCBjdXN0b20gdGFnIHNwZWMuLiBoZW5jZSBhbGxvd2luZwotICogdGhlbSB0byBiZSB1c2VkIGluIGRpcmVjdCBtZXRob2QgY2FsbHMgZXRjLgotICogCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMS1KYW4tMjAwNgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWlsc1RhZyB7Ci0KLSAgICB2b2lkIGluaXQoTWFwIHRhZ0NvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd3JpdGVyIHRoYXQgcHJvY2Vzc2VzIHRoZSB0YWcKLSAgICAgKiBAcGFyYW0gdwotICAgICAqLwotICAgIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRhZwotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYW4gYXR0cmlidXRlIG9mIHRoZSB0YWcKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgc3RhcnQgdGFnCi0gICAgICovCi0gICAgdm9pZCBkb1N0YXJ0VGFnKCk7Ci0KLSAgICAvKioKLSAgICAgKiBwcm9jZXNzIHRoZSBlbmQgdGFnCi0gICAgICovCi0gICAgdm9pZCBkb0VuZFRhZygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGFnCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyYWlsc1RhZ1JlZ2lzdHJ5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyYWlsc1RhZ1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDZlNzguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9HcmFpbHNUYWdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgcmVnaXN0cnkgZm9yIGhvbGRpbmcgYWxsIEdyYWlscyB0YWcgaW1wbGVtZW50YXRpb25zCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTEtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1RhZ1JlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBHcmFpbHNUYWdSZWdpc3RyeSBpbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCB0YWdSZWdpc3RyeSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIEdyYWlsc1RhZ1JlZ2lzdHJ5IHRhZ1JlZ2lzdHJ5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgdGFnUmVnaXN0cnkucmVnaXN0ZXJUYWcoUmVuZGVySW5wdXRUYWcuVEFHX05BTUUsIFJlbmRlcklucHV0VGFnLmNsYXNzKTsKLSAgICAgICAgdGFnUmVnaXN0cnkucmVnaXN0ZXJUYWcoR3Jvb3Z5RWFjaFRhZy5UQUdfTkFNRSwgR3Jvb3Z5RWFjaFRhZy5jbGFzcyk7Ci0gICAgICAgIHRhZ1JlZ2lzdHJ5LnJlZ2lzdGVyVGFnKEdyb292eUlmVGFnLlRBR19OQU1FLCBHcm9vdnlJZlRhZy5jbGFzcyk7Ci0gICAgICAgIHRhZ1JlZ2lzdHJ5LnJlZ2lzdGVyVGFnKEdyb292eUVsc2VUYWcuVEFHX05BTUUsIEdyb292eUVsc2VUYWcuY2xhc3MpOwotICAgICAgICB0YWdSZWdpc3RyeS5yZWdpc3RlclRhZyhHcm9vdnlFbHNlSWZUYWcuVEFHX05BTUUsIEdyb292eUVsc2VJZlRhZy5jbGFzcyk7Ci0gICAgICAgIHRhZ1JlZ2lzdHJ5LnJlZ2lzdGVyVGFnKEdyb292eUZpbmRBbGxUYWcuVEFHX05BTUUsIEdyb292eUZpbmRBbGxUYWcuY2xhc3MpOwotICAgICAgICB0YWdSZWdpc3RyeS5yZWdpc3RlclRhZyhHcm9vdnlDb2xsZWN0VGFnLlRBR19OQU1FLCBHcm9vdnlDb2xsZWN0VGFnLmNsYXNzKTsKLSAgICAgICAgdGFnUmVnaXN0cnkucmVnaXN0ZXJUYWcoR3Jvb3Z5R3JlcFRhZy5UQUdfTkFNRSwgR3Jvb3Z5R3JlcFRhZy5jbGFzcyk7Ci0gICAgICAgIHRhZ1JlZ2lzdHJ5LnJlZ2lzdGVyVGFnKEdyb292eVdoaWxlVGFnLlRBR19OQU1FLCBHcm9vdnlXaGlsZVRhZy5jbGFzcyk7Ci0gICAgICAgIHRhZ1JlZ2lzdHJ5LnJlZ2lzdGVyVGFnKEdyb292eURlZlRhZy5UQUdfTkFNRSwgR3Jvb3Z5RGVmVGFnLmNsYXNzKTsKLSAgICAgICAgdGFnUmVnaXN0cnkucmVnaXN0ZXJUYWcoR3Jvb3Z5U2V0VGFnLlRBR19OQU1FLCBHcm9vdnlTZXRUYWcuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgR3JhaWxzVGFnUmVnaXN0cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBHcmFpbHNUYWdSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEdyYWlsc1RhZ1JlZ2lzdHJ5KCk7Ci0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVGFnKFN0cmluZyB0YWdOYW1lLCBDbGFzcyB0YWcpIHsKLSAgICAgICAgdGFnUmVnaXN0cnkucHV0KHRhZ05hbWUsdGFnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB0YWdTdXBwb3J0ZWQoU3RyaW5nIHRhZ05hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRhZ1JlZ2lzdHJ5LmNvbnRhaW5zS2V5KHRhZ05hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bnRheFRhZyhTdHJpbmcgdGFnTmFtZSkgewotICAgICAgICBpZih0YWdSZWdpc3RyeS5jb250YWluc0tleSh0YWdOYW1lKSkgewotICAgICAgICAgICAgQ2xhc3MgdGFnQ2xhc3MgPSAoQ2xhc3MpdGFnUmVnaXN0cnkuZ2V0KHRhZ05hbWUpOwotICAgICAgICAgICAgcmV0dXJuIEdyb292eVN5bnRheFRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhZ0NsYXNzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEdyYWlsc1RhZyBuZXdUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLSAgICAgICAgaWYodGFnUmVnaXN0cnkuY29udGFpbnNLZXkodGFnTmFtZSkpIHsKLSAgICAgICAgICAgIENsYXNzIHRhZ0NsYXNzID0gKENsYXNzKXRhZ1JlZ2lzdHJ5LmdldCh0YWdOYW1lKTsKLQotICAgICAgICAgICAgR3JhaWxzVGFnIHRhZzsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFnID0gKEdyYWlsc1RhZyl0YWdDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiSW5zdGFudGlhdGlvbiBlcnJvciBsb2FkaW5nIHRhZyBbIit0YWdOYW1lKyJdOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiSWxsZWdhbCBhY2Nlc3MgZXJyb3IgbG9hZGluZyB0YWcgWyIrdGFnTmFtZSsiXTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0YWc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJUYWcgWyIrdGFnTmFtZSsiXSBpcyBub3QgYSBhIHZhbGlkIGdyYWlscyB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdENvbnRleHRUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLSAgICAgICAgaWYodGFnUmVnaXN0cnkuY29udGFpbnNLZXkodGFnTmFtZSkpIHsKLSAgICAgICAgICAgIENsYXNzIHRhZ0NsYXNzID0gKENsYXNzKXRhZ1JlZ2lzdHJ5LmdldCh0YWdOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0Q29udGV4dFRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhZ0NsYXNzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlDb2xsZWN0VGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUNvbGxlY3RUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmM2E5Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUNvbGxlY3RUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeGFtcGxlOgotICoKLSAqIDxjb2RlPgotICogIDxncjpjb2xsZWN0IGluPSIke3RoaW5nfSIgZXhwcj0iaXQubGVuZ3RoKCkgPT0gMyI+Ci0gKiAgICAgICAgPHA+JHtpdH08L3A+Ci0gKiAgPC9ncjpjb2xsZWN0PgotICogPC9jb2RlPgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTktSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyb292eUNvbGxlY3RUYWcgZXh0ZW5kcyBHcm9vdnlTeW50YXhUYWcgewotICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiY29sbGVjdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTiA9ICJpbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9FWFBSID0gImV4cHIiOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXJXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJlY2VkaW5nQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TdGFydFRhZygpIHsKLSAgICAgICAgU3RyaW5nIGluID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX0lOKTsKLSAgICAgICAgU3RyaW5nIGV4cHIgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChBVFRSSUJVVEVfRVhQUik7Ci0gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsoaW4pKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9JTisiXSIpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGV4cHIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9FWFBSKyJdIik7Ci0KLSAgICAgICAgb3V0LnByaW50KGluKTsKLSAgICAgICAgb3V0LnByaW50KCIuY29sbGVjdCB7Iik7Ci0gICAgICAgIGlmKGV4cHIuc3RhcnRzV2l0aCgiXCIiKSAmJiBleHByLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICBleHByID0gZXhwci5zdWJzdHJpbmcoMSxleHByLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludChleHByKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0uZWFjaCB7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9FbmRUYWcoKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gVEFHX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlEZWZUYWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5RGVmVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYTQwMzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlEZWZUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgZGVmaW5pbmcgb2YgdmFyaWFibGVzIHdpdGhpbiB0aGUgcGFnZSBjb250ZXh0Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMjMtRmViLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyb292eURlZlRhZyBleHRlbmRzIEdyb292eVN5bnRheFRhZyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZGVmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0VYUFIgPSAiZXhwciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQVIgPSAidmFyIjsKLQotICAgIHB1YmxpYyB2b2lkIGRvU3RhcnRUYWcoKSB7Ci0gICAgICAgIFN0cmluZyBleHByID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX0VYUFIpOwotICAgICAgICBTdHJpbmcgdmFyID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX1ZBUik7Ci0KLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayh2YXIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9WQVIrIl0iKTsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhleHByKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitUQUdfTkFNRSsiXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbIitBVFRSSUJVVEVfRVhQUisiXSIpOwotCi0gICAgICAgIG91dC5wcmludCgiZGVmICIpOwotICAgICAgICBvdXQucHJpbnQodmFyLnN1YnN0cmluZygxLHZhci5sZW5ndGgoKSAtMSkpOwotICAgICAgICBvdXQucHJpbnQoJz0nKTsKLSAgICAgICAgb3V0LnByaW50bG4oZXhwcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9FbmRUYWcoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUQUdfTkFNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcldoaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVjZWRpbmdDb250ZW50KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlFYWNoVGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUVhY2hUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxYThkZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUVhY2hUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxOC1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5RWFjaFRhZyBleHRlbmRzIEdyb292eVN5bnRheFRhZyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZWFjaCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTiA9ICJpbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQVIgPSAidmFyIjsKLQotICAgIHB1YmxpYyB2b2lkIGRvU3RhcnRUYWcoKSB7Ci0gICAgICAgIFN0cmluZyBpbiA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KEFUVFJJQlVURV9JTik7Ci0gICAgICAgIFN0cmluZyB2YXIgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChBVFRSSUJVVEVfVkFSKTsKLQotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGluKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitUQUdfTkFNRSsiXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbIitBVFRSSUJVVEVfSU4rIl0iKTsKLQotICAgICAgICBvdXQucHJpbnQoaW4pOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKHZhcikpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCIuZWFjaCB7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoIi5lYWNoIHsgIik7Ci0gICAgICAgICAgICBvdXQucHJpbnQodmFyLnN1YnN0cmluZygxLHZhci5sZW5ndGgoKSAtMSkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIiAtPiIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0VuZFRhZygpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUQUdfTkFNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcldoaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVjZWRpbmdDb250ZW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUVsc2VJZlRhZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlFbHNlSWZUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NWVhYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUVsc2VJZlRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnMuR3JhaWxzVGFnRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE4LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlFbHNlSWZUYWcgZXh0ZW5kcyBHcm9vdnlTeW50YXhUYWcgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImVsc2VpZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9URVNUID0gInRlc3QiOwotCi0gICAgcHVibGljIHZvaWQgZG9TdGFydFRhZygpIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChBVFRSSUJVVEVfVEVTVCk7Ci0gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsodGVzdCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgR3JhaWxzVGFnRXhjZXB0aW9uKCJUYWcgWyIrVEFHX05BTUUrIl0gbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgWyIrQVRUUklCVVRFX1RFU1QrIl0iKTsKLSAgICAgICAgb3V0LnByaW50KCJlbHNlIGlmKCIpOwotICAgICAgICBvdXQucHJpbnQodGVzdCk7Ci0gICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0VuZFRhZygpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUQUdfTkFNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcldoaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZWNlZGluZ0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUVsc2VUYWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5RWxzZVRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWIzZDQyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5RWxzZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLS8qKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTgtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyb292eUVsc2VUYWcgZXh0ZW5kcyBHcm9vdnlTeW50YXhUYWcgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImVsc2UiOwotCi0KLSAgICBwdWJsaWMgdm9pZCBkb1N0YXJ0VGFnKCkgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSB7Iik7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGRvRW5kVGFnKCkgewotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRBR19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVmZmVyV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZWNlZGluZ0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUZpbmRBbGxUYWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5RmluZEFsbFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjYwYWUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5RmluZEFsbFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnMuR3JhaWxzVGFnRXhjZXB0aW9uOwotCi0vKioKLSAqIEV4YW1wbGU6Ci0gKgotICogPGNvZGU+Ci0gKiAgPGdyOmZpbmRBbGwgaW49IiR7dGhpbmd9IiBleHByPSJpdC5sZW5ndGgoKSA9PSAzIj4KLSAqICAgICAgICA8cD4ke2l0fTwvcD4KLSAqICA8L2dyOmZpbmRBbGw+Ci0gKiA8L2NvZGU+Ci0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxOS1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5RmluZEFsbFRhZyBleHRlbmRzIEdyb292eVN5bnRheFRhZyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmluZEFsbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTiA9ICJpbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9FWFBSID0gImV4cHIiOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXJXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJlY2VkaW5nQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TdGFydFRhZygpIHsKLSAgICAgICAgU3RyaW5nIGluID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX0lOKTsKLSAgICAgICAgU3RyaW5nIGV4cHIgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChBVFRSSUJVVEVfRVhQUik7Ci0gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzQmxhbmsoaW4pKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9JTisiXSIpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGV4cHIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9FWFBSKyJdIik7Ci0KLSAgICAgICAgb3V0LnByaW50KGluKTsKLSAgICAgICAgb3V0LnByaW50KCIuZmluZEFsbCB7Iik7Ci0gICAgICAgIGlmKGV4cHIuc3RhcnRzV2l0aCgiXCIiKSAmJiBleHByLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICBleHByID0gZXhwci5zdWJzdHJpbmcoMSxleHByLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludChleHByKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0uZWFjaCB7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9FbmRUYWcoKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gVEFHX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlHcmVwVGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUdyZXBUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0NjU3Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eUdyZXBUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKgotICogRXhhbXBsZToKLSAqCi0gKiA8Y29kZT4KLSAqICA8Z3I6Z3JlcCBpbj0iJHt0aGluZ30iIGZpbHRlcj0iJHtQYXR0ZXJuLmNvbXBpbGUoJ1thLXpBLVpdJyl9Ij4KLSAqICAgICAgICA8cD4ke2l0fTwvcD4KLSAqICA8L2dyOmdyZXA+Ci0gKiA8L2NvZGU+Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTktSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyb292eUdyZXBUYWcgZXh0ZW5kcyBHcm9vdnlTeW50YXhUYWd7Ci0gICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJncmVwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lOID0gImluIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZJTFRFUiA9ICJmaWx0ZXIiOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXJXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJlY2VkaW5nQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TdGFydFRhZygpIHsKLSAgICAgICAgU3RyaW5nIGluID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX0lOKTsKLSAgICAgICAgU3RyaW5nIGZpbHRlciA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KEFUVFJJQlVURV9GSUxURVIpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGluKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitUQUdfTkFNRSsiXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbIitBVFRSSUJVVEVfSU4rIl0iKTsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhmaWx0ZXIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9GSUxURVIgKyJdIik7Ci0KLSAgICAgICAgb3V0LnByaW50KGluKTsKLSAgICAgICAgb3V0LnByaW50KCIuZ3JlcCAoIik7Ci0gICAgICAgIGlmKGZpbHRlci5zdGFydHNXaXRoKCJcIiIpICYmIGZpbHRlci5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgZmlsdGVyID0gZmlsdGVyLnN1YnN0cmluZygxLGZpbHRlci5sZW5ndGgoKS0xKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnQoZmlsdGVyKTsKLSAgICAgICAgb3V0LnByaW50bG4oIikuZWFjaCB7Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9FbmRUYWcoKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gVEFHX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlJZlRhZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlJZlRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThjOGRlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5SWZUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxOC1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5SWZUYWcgZXh0ZW5kcyBHcm9vdnlTeW50YXhUYWcgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImlmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RFU1QgPSAidGVzdCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1N0YXJ0VGFnKCkgewotICAgICAgICBTdHJpbmcgdGVzdCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KEFUVFJJQlVURV9URVNUKTsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayh0ZXN0KSkKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitUQUdfTkFNRSsiXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbIitBVFRSSUJVVEVfVEVTVCsiXSIpOwotICAgICAgICBvdXQucHJpbnQoImlmKCIpOwotICAgICAgICBvdXQucHJpbnQodGVzdCk7Ci0gICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0VuZFRhZygpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUQUdfTkFNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcldoaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZWNlZGluZ0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5U2V0VGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eVNldFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY0ODA1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvR3Jvb3Z5U2V0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuZXhjZXB0aW9ucy5HcmFpbHNUYWdFeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHNldHRpbmcgb2YgdmFyaWFibGVzIHdpdGhpbiB0aGUgcGFnZSBjb250ZXh0Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMjMtRmViLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyb292eVNldFRhZyBleHRlbmRzIEdyb292eVN5bnRheFRhZyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAic2V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0VYUFIgPSAiZXhwciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQVIgPSAidmFyIjsKLQotICAgIHB1YmxpYyB2b2lkIGRvU3RhcnRUYWcoKSB7Ci0gICAgICAgIFN0cmluZyBleHByID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX0VYUFIpOwotICAgICAgICBTdHJpbmcgdmFyID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX1ZBUik7Ci0KLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayh2YXIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9WQVIrIl0iKTsKLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhleHByKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitUQUdfTkFNRSsiXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbIitBVFRSSUJVVEVfRVhQUisiXSIpOwotCi0gICAgICAgIG91dC5wcmludCh2YXIuc3Vic3RyaW5nKDEsdmFyLmxlbmd0aCgpIC0xKSk7Ci0gICAgICAgIG91dC5wcmludCgnPScpOwotICAgICAgICBvdXQucHJpbnRsbihleHByKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0VuZFRhZygpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRBR19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVmZmVyV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZWNlZGluZ0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eVN5bnRheFRhZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlTeW50YXhUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1ZmViYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eVN5bnRheFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIucGFnZXMuR3Jvb3Z5UGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogQSB0YWcgdHlwZSB0aGF0IGdldHMgdHJhbnNsYXRlZCBkaXJlY3RseSBpbnRvIEdyb292eSBzeW50YXggYnkgdGhlIEdTUCBwYXJzZXIKLSAqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMS1KYW4tMjAwNgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3Jvb3Z5U3ludGF4VGFnIGltcGxlbWVudHMgR3JhaWxzVGFnIHsKLSAgICBwcm90ZWN0ZWQgTWFwIHRhZ0NvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIG91dDsKLSAgICBwcm90ZWN0ZWQgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXAgdGFnQ29udGV4dCkgewotICAgICAgICB0aGlzLnRhZ0NvbnRleHQgPSB0YWdDb250ZXh0OwotICAgICAgICB0aGlzLm91dCA9IChQcmludFdyaXRlcil0YWdDb250ZXh0LmdldChHcm9vdnlQYWdlLk9VVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3KSB7Ci0gICAgICAgIGlmKHcgaW5zdGFuY2VvZiBQcmludFdyaXRlcikgewotICAgICAgICAgICAgdGhpcy5vdXQgPSAoUHJpbnRXcml0ZXIpdzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgR3Jvb3Z5U3luYXggdGFnIHJlcXVpcmVzIGEgamF2YS5pby5QcmludFdyaXRlciBpbnN0YW5jZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhNYXAgYXR0cmlidXRlcykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBzZXRBdHRyaWJ1dGUoYXR0ck5hbWUsYXR0cmlidXRlcy5nZXQoYXR0ck5hbWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgICAgIGlmKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoIiR7IikgJiYgc3RyaW5nVmFsdWUuZW5kc1dpdGgoIn0iKSkgewotICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWUuc3Vic3RyaW5nKDIsc3RyaW5nVmFsdWUubGVuZ3RoKCkgLTEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KG5hbWUuc3Vic3RyaW5nKDEsbmFtZS5sZW5ndGgoKS0xKSxzdHJpbmdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIEdyb292eVN5bmF4IHRhZyByZXF1aXJlcyBvbmx5IHN0cmluZyB2YWx1ZWQgYXR0cmlidXRlcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNCdWZmZXJXaGl0ZVNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNQcmVjZWRpbmdDb250ZW50KCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eVdoaWxlVGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL0dyb292eVdoaWxlVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWUwNTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9Hcm9vdnlXaGlsZVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnMuR3JhaWxzVGFnRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDE4LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlXaGlsZVRhZyBleHRlbmRzIEdyb292eVN5bnRheFRhZyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAid2hpbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVEVTVCA9ICJ0ZXN0IjsKLQotICAgIHB1YmxpYyB2b2lkIGRvU3RhcnRUYWcoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoQVRUUklCVVRFX1RFU1QpOwotICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKHRlc3QpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK1RBR19OQU1FKyJdIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIFsiK0FUVFJJQlVURV9URVNUKyJdIik7Ci0gICAgICAgIG91dC5wcmludCgid2hpbGUoIik7Ci0gICAgICAgIG91dC5wcmludCh0ZXN0KTsKLSAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvRW5kVGFnKCkgewotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRBR19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVmZmVyV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJlY2VkaW5nQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9SZW5kZXJJbnB1dFRhZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9SZW5kZXJJbnB1dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJjZDkwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvUmVuZGVySW5wdXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYjsKLQotaW1wb3J0IGdyb292eS5sYW5nLldyaXRhYmxlOwotaW1wb3J0IGdyb292eS50ZXh0LlRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzLkdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuR3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuZXhjZXB0aW9ucy5HcmFpbHNUYWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5zRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgdGFnIHRoYXQgYXR0ZW1wdHMgdG8gcmVuZGVyIGFuIGlucHV0IGZvciBhIGJlYW4gcHJvcGVydHkgaW50byBhbiBhcHByb3ByaWF0ZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIHR5cGUuCi0gKiBJdCB1c2VzIHRoZSB0ZW1wbGF0ZXMgZGVmaW5lZCBpbiAiZ3JhaWxzLWFwcC92aWV3cy9zY2FmZm9sZGluZyIgdG8gYWNoaWV2ZSB0aGlzIGJ5IGxvb2tpbmcgdXAKLSAqIHRoZSB0ZW1wbGF0ZSBieSB0eXBlLgotICoKLSAqIEV4YW1wbGU6Ci0gKiA8Y29kZT4KLSAqICAgICAgPGdyOnJlbmRlcklucHV0IGJlYW49Im15QmVhbiIgcHJvcGVydHk9ImZpcnN0TmFtZSIgLz4KLSAqIDwvY29kZT4KLSAqIFByb2R1Y2VzIGZvciBFeGFtcGxlICh1bmxlc3MgY3VzdG9taXNlZCk6Ci0gKiA8Y29kZT4KLSAqICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZpcnN0TmFtZSIgdmFsdWU9IkJvYiIgLz4KLSAqIDwvY29kZT4KLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDEyLUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZW5kZXJJbnB1dFRhZyBleHRlbmRzIFJlcXVlc3RDb250ZXh0VGFnIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfUFJFRklYID0gIi9XRUItSU5GL2dyYWlscy1hcHAvdmlld3Mvc2NhZmZvbGRpbmcvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1NVRkZJWCA9ICIuZ3NwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJyZW5kZXJJbnB1dCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUmVuZGVySW5wdXRUYWcuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fUFJPUEVSVFkgPSAiYmVhbiI7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotICAgIHByaXZhdGUgQmVhbldyYXBwZXIgYmVhbldyYXBwZXI7Ci0gICAgcHJpdmF0ZSBNYXAgY29uc3RyYWluZWRQcm9wZXJ0aWVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotICAgIHByaXZhdGUgTWFwIGNhY2hlZFVyaXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVySW5wdXRUYWcoKSB7Ci0gICAgICAgIHN1cGVyKFRBR19OQU1FKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU3RhcnRUYWdJbnRlcm5hbCgpIHsKLQotICAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgaWYoZG9tYWluQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgIHRoaXMuY29uc3RyYWluZWRQcm9wZXJ0aWVzID0gZG9tYWluQ2xhc3MuZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICB9Ci0gICAgICAgIHRoaXMuYmVhbldyYXBwZXIgPSBuZXcgQmVhbldyYXBwZXJJbXBsKGJlYW4pOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGQgPSB0aGlzLmJlYW5XcmFwcGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eSk7Ci0gICAgICAgIH0gY2F0Y2ggKEJlYW5zRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlByb3BlcnR5IFsiK3Byb3BlcnR5KyJdIGlzIG5vdCBhIHZhbGlkIGJlYW4gcHJvcGVydHkgaW4gdGFnIFtyZW5kZXJJbnB1dF06IiArIGUuZ2V0TWVzc2FnZSgpLGUpOwotICAgICAgICB9Ci0gICAgICAgIEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUgZW5naW5lID0gKEdyb292eVBhZ2VzVGVtcGxhdGVFbmdpbmUpc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5HU1BfVEVNUExBVEVfRU5HSU5FKTsKLQotICAgICAgICBUZW1wbGF0ZSB0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBmaW5kVXJpRm9yVHlwZShwZC5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0gICAgICAgICAgICB0ID0gZW5naW5lLmNyZWF0ZVRlbXBsYXRlKHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpcmVzcG9uc2UpOwotICAgICAgICAgICAgaWYodCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlR5cGUgWyIrcGQuZ2V0UHJvcGVydHlUeXBlKCkrIl0gaXMgdW5zdXBwb3J0ZWQgYnkgdGFnIFtzY2FmZm9sZF0uIE5vIHRlbXBsYXRlIGZvdW5kLiIpOwotCi0gICAgICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBiaW5kaW5nLnB1dCgibmFtZSIsIHBkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnB1dCgidmFsdWUiLHRoaXMuYmVhbldyYXBwZXIuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkpOwotICAgICAgICAgICAgaWYodGhpcy5jb25zdHJhaW5lZFByb3BlcnRpZXMuY29udGFpbnNLZXkocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZy5wdXQoImNvbnN0cmFpbnRzIix0aGlzLmNvbnN0cmFpbmVkUHJvcGVydGllcy5nZXQocHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJpbmRpbmcucHV0KCJjb25zdHJhaW50cyIsbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXcml0YWJsZSAgdyA9IHQubWFrZShiaW5kaW5nKTsKLSAgICAgICAgICAgIHcud3JpdGVUbyhvdXQpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGVtcGxhdGUgZm9yIHR5cGUgWyIrcGQuZ2V0UHJvcGVydHlUeXBlKCkrIl0gYnkgdGFnIFtzY2FmZm9sZF06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiSS9PIGVycm9yIHdyaXRpbmcgdGFnIFsiK2dldE5hbWUoKSsiXSB0byB3cml0ZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0VuZFRhZ0ludGVybmFsKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljQXR0cmlidXRlKFN0cmluZyBhdHRyKSB7Ci0gICAgICAgIGlmKEJFQU5fUFJPUEVSVFkuZXF1YWxzKGF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLQotICAgcHVibGljIFN0cmluZyBmaW5kVXJpRm9yVHlwZShDbGFzcyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy50cmFjZSgiW0pzcFJlbmRlcklucHV0VGFnXSBBdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRlbXBsYXRlIGZvciB0eXBlIFsiK3R5cGUrIl0iKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdGVtcGxhdGVVcmk7Ci0gICAgICAgIGlmKGNhY2hlZFVyaXMuY29udGFpbnNLZXkodHlwZSkpIHsKLSAgICAgICAgICAgIHRlbXBsYXRlVXJpID0gKFN0cmluZyljYWNoZWRVcmlzLmdldCh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXBsYXRlVXJpID0gbG9jYXRlVGVtcGxhdGVVcmwodHlwZSk7Ci0gICAgICAgICAgICBjYWNoZWRVcmlzLnB1dCh0eXBlLHRlbXBsYXRlVXJpKTsKLSAgICAgICAgfQotICAgICAgIHJldHVybiB0ZW1wbGF0ZVVyaTsKLSAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0ZVRlbXBsYXRlVXJsKENsYXNzIHR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKHR5cGUgPT0gT2JqZWN0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHVyaSA9IFBBVEhfUFJFRklYICsgdHlwZS5nZXROYW1lKCkgKyBQQVRIX1NVRkZJWDsKLSAgICAgICAgVVJMIHJldHVyblVybCA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKHVyaSk7Ci0gICAgICAgIGlmKHJldHVyblVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRlVGVtcGxhdGVVcmwodHlwZS5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9SZXF1ZXN0Q29udGV4dFRhZy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9SZXF1ZXN0Q29udGV4dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGYzZWFkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvUmVxdWVzdENvbnRleHRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzLkdyb292eVBhZ2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVySW1wbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LnN1cHBvcnQuUmVxdWVzdENvbnRleHRVdGlsczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi51dGlsLlVybFBhdGhIZWxwZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDExLUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXF1ZXN0Q29udGV4dFRhZyBpbXBsZW1lbnRzIEdyYWlsc1RhZyB7Ci0gICAgcHJvdGVjdGVkIFdyaXRlciBvdXQ7Ci0gICAgcHJvdGVjdGVkIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRQYXRoOwotICAgIHByb3RlY3RlZCBVcmxQYXRoSGVscGVyIHVybFBhdGhIZWxwZXIgPSBuZXcgVXJsUGF0aEhlbHBlcigpOwotICAgIHByb3RlY3RlZCBHcmFpbHNUYWdSZWdpc3RyeSByZWdpc3RyeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdDsKLSAgICBwcm90ZWN0ZWQgQmVhbldyYXBwZXIgYmVhbjsKLSAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcm90ZWN0ZWQgV2ViQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHByb3RlY3RlZCBSZXF1ZXN0Q29udGV4dFRhZyhTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmJlYW4gPSBuZXcgQmVhbldyYXBwZXJJbXBsKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcCBjb250ZXh0KSB7Ci0gICAgICAgIGlmKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50ICdjb250ZXh0JyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB0aGlzLm91dCA9IChXcml0ZXIpY29udGV4dC5nZXQoR3Jvb3Z5UGFnZS5PVVQpOwotICAgICAgICB0aGlzLnJlcXVlc3QgPSAoU2VydmxldFJlcXVlc3QpY29udGV4dC5nZXQoR3Jvb3Z5UGFnZS5SRVFVRVNUKTsKLSAgICAgICAgdGhpcy5zZXJ2bGV0Q29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCljb250ZXh0LmdldChHcm9vdnlQYWdlLlNFUlZMRVRfQ09OVEVYVCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UgPSAoU2VydmxldFJlc3BvbnNlKWNvbnRleHQuZ2V0KEdyb292eVBhZ2UuUkVTUE9OU0UpOwotICAgICAgICB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dCA9IFJlcXVlc3RDb250ZXh0VXRpbHMuZ2V0V2ViQXBwbGljYXRpb25Db250ZXh0KHJlcXVlc3QsIHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgdGhpcy5ncmFpbHNBcHBsaWNhdGlvbiA9IChHcmFpbHNBcHBsaWNhdGlvbil0aGlzLmFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKEdyYWlsc0FwcGxpY2F0aW9uLkFQUExJQ0FUSU9OX0lEKTsKLSAgICAgICAgaWYoY29udGV4dC5nZXQoR3Jvb3Z5UGFnZS5BVFRSSUJVVEVTKSA9PSBudWxsKQotICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSAoTWFwKWNvbnRleHQuZ2V0KEdyb292eVBhZ2UuQVRUUklCVVRFUyk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHVybFBhdGhIZWxwZXIuZ2V0Q29udGV4dFBhdGgoIChIdHRwU2VydmxldFJlcXVlc3QpdGhpcy5yZXF1ZXN0ICk7Ci0gICAgICAgIHRoaXMuaW5pdCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYodGhpcy5iZWFuLmlzV3JpdGFibGVQcm9wZXJ0eShuYW1lKSkgewotICAgICAgICAgICAgdGhpcy5iZWFuLnNldFByb3BlcnR5VmFsdWUobmFtZSx2YWx1ZSk7Ci0gICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXQobmFtZSx2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JhaWxzVGFnUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyaXRlcihXcml0ZXIgdykgewotICAgICAgICB0aGlzLm91dCA9IHc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhNYXAgYXR0cmlidXRlcykgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRvU3RhcnRUYWcoKSB7Ci0gICAgICAgIGlmKCFpbml0KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGFnIG5vdCBpbml0aWFsaXNlZCBjYWxsZWQgJ2luaXQnIGZpcnN0Iik7Ci0KLSAgICAgICAgZG9TdGFydFRhZ0ludGVybmFsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TdGFydFRhZ0ludGVybmFsKCkgOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRW5kVGFnSW50ZXJuYWwoKSA7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkb0VuZFRhZygpICB7Ci0gICAgICAgIGlmKCFpbml0KQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGFnIG5vdCBpbml0aWFsaXNlZCBjYWxsZWQgJ2luaXQnIGZpcnN0Iik7Ci0KLSAgICAgICAgZG9FbmRUYWdJbnRlcm5hbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvU2NhZmZvbGRUYWcuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvU2NhZmZvbGRUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxOTc1OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL1NjYWZmb2xkVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWI7Ci0KLWltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuU2VydmxldENvbnRleHRUZW1wbGF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmcuVGVtcGxhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuV3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5JbnZhbGlkUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLlJlcXVlc3RDb250ZXh0QXdhcmVUYWc7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIudXRpbC5FeHByZXNzaW9uRXZhbHVhdGlvblV0aWxzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA2LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBTY2FmZm9sZFRhZyBleHRlbmRzIFJlcXVlc3RDb250ZXh0QXdhcmVUYWcgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVhbjsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICBwcml2YXRlIEJlYW5XcmFwcGVyIGJlYW5XcmFwcGVyOwotICAgIHByaXZhdGUgTWFwIGNvbnN0cmFpbmVkUHJvcGVydGllcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLSAgICBwcml2YXRlICBzdGF0aWMgIFRlbXBsYXRlRmFjdG9yeSB0ZW1wbGF0ZUZhY3Rvcnk7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGRvU3RhcnRUYWdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZih0ZW1wbGF0ZUZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgICAgICB0ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgU2VydmxldENvbnRleHRUZW1wbGF0ZUZhY3RvcnkocGFnZUNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSk7Ci0KLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJUYWcgW3NjYWZmb2xkXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbcHJvcGVydHldIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGJlYW4pKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiVGFnIFtzY2FmZm9sZF0gbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgW2JlYW5dIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZighRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5pc0V4cHJlc3Npb25MYW5ndWFnZShiZWFuKSkgewotICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIkF0dHJpYnV0ZSBbYmVhbl0gb2YgdGFnIFtzY2FmZm9sZF0gbXVzdCBiZSBhIEpTVEwgZXhwcmVzc2lvbiIpOwotICAgICAgICAgfQotICAgICAgICAgV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPYmplY3QgYmVhbkluc3RhbmNlID0gRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5ldmFsdWF0ZSgiYmVhbiIsdGhpcy5iZWFuLE9iamVjdC5jbGFzcyx0aGlzLnBhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICBpZihiZWFuSW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKCJCZWFuIFsiK3RoaXMuYmVhbisiXSByZWZlcmVuY2VkIGJ5IHRhZyBbc2NhZmZvbGRdIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgICAgICBHcmFpbHNBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChHcmFpbHNBcHBsaWNhdGlvbikgc3VwZXIuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRXZWJBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRCZWFuKEdyYWlsc0FwcGxpY2F0aW9uLkFQUExJQ0FUSU9OX0lEKTsKLSAgICAgICAgICAgICBpZihhcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gYXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoYmVhbkluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgaWYoZG9tYWluQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJhaW5lZFByb3BlcnRpZXMgPSBkb21haW5DbGFzcy5nZXRDb25zdHJhaW5lZFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB0aGlzLmJlYW5XcmFwcGVyID0gbmV3IEJlYW5XcmFwcGVySW1wbChiZWFuSW5zdGFuY2UpOwotCi0gICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gdGhpcy5iZWFuV3JhcHBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHkpOwotCi0gICAgICAgICAgICAgVGVtcGxhdGUgdCA9IHRlbXBsYXRlRmFjdG9yeS5maW5kVGVtcGxhdGVGb3JUeXBlKHBkLmdldFByb3BlcnR5VHlwZSgpKTsKLSAgICAgICAgICAgICBpZih0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIlR5cGUgWyIrcGQuZ2V0UHJvcGVydHlUeXBlKCkrIl0gaXMgdW5zdXBwb3J0ZWQgYnkgdGFnIFtzY2FmZm9sZF0uIE5vIHRlbXBsYXRlIGZvdW5kLiIpOwotCi0gICAgICAgICAgICAgTWFwIGJpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgIGJpbmRpbmcucHV0KCJuYW1lIiwgcGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICBiaW5kaW5nLnB1dCgidmFsdWUiLHRoaXMuYmVhbldyYXBwZXIuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkpOwotICAgICAgICAgICAgIGJpbmRpbmcucHV0KCJyZXF1ZXN0Iix0aGlzLnBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKSk7Ci0gICAgICAgICAgICAgYmluZGluZy5wdXQoInJlc3BvbnNlIix0aGlzLnBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpOwotICAgICAgICAgICAgIGJpbmRpbmcucHV0KCJhcHBsaWNhdGlvbiIsdGhpcy5wYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKLSAgICAgICAgICAgICBpZih0aGlzLmNvbnN0cmFpbmVkUHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICAgICAgYmluZGluZy5wdXQoImNvbnN0cmFpbnRzIix0aGlzLmNvbnN0cmFpbmVkUHJvcGVydGllcy5nZXQocHJvcGVydHkpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgIGJpbmRpbmcucHV0KCJjb25zdHJhaW50cyIsbnVsbCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIG91dC53cml0ZSh0Lm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24gaXBlKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiQXR0cmlidXRlIFtwcm9wZXJ0eV0gd2l0aCB2YWx1ZSBbIitwcm9wZXJ0eSsiXSBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBvZiBiZWFuIFsiK2JlYW4rIl0gaW4gdGFnIFtzY2FmZm9sZF0iLGlwZSk7Ci0gICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiSS9PIGVycm9yIHdyaXRpbmcgdGFnIFtzY2FmZm9sZF06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBTS0lQX0JPRFk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKFN0cmluZyBiZWFuKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9leGNlcHRpb25zL0dyYWlsc1RhZ0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9leGNlcHRpb25zL0dyYWlsc1RhZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQyM2UzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvZXhjZXB0aW9ucy9HcmFpbHNUYWdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5leGNlcHRpb25zLkdyYWlsc0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMS1KYW4tMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzVGFnRXhjZXB0aW9uIGV4dGVuZHMgR3JhaWxzRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgR3JhaWxzVGFnRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0gICAgICAgIHN1cGVyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNUYWdFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFRocm93YWJsZSBhcmcxKSB7Ci0gICAgICAgIHN1cGVyKGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmFpbHNUYWdFeGNlcHRpb24oVGhyb3dhYmxlIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9qc3AvSnNwSW52b2tlR3JhaWxzVGFnTGliVGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL2pzcC9Kc3BJbnZva2VHcmFpbHNUYWdMaWJUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MjFiYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL2pzcC9Kc3BJbnZva2VHcmFpbHNUYWdMaWJUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5qc3A7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc1RhZ0xpYkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5tZXRhY2xhc3MuVGFnTGliRHluYW1pY01ldGhvZHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQuRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5HcmFpbHNBcHBsaWNhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5leGNlcHRpb25zLkdyYWlsc1RhZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5XcmFwcGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbldyYXBwZXJJbXBsOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIudXRpbC5FeHByZXNzaW9uRXZhbHVhdGlvblV0aWxzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwVGFnRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWdTdXBwb3J0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi0vKioKLSAqIEEgdGFnIHRoYXQgaW52b2tlcyBhIHRhZyBkZWZpbmVkIGluIGEgdGhlIEdyYWlscyBkeW5hbWljIHRhZyBsaWJyYXJ5LiBBdXRob3JzIG9mIEdyYWlscyB0YWdzCi0gKiB3aG8gd2FudCB0aGVpciB0YWdzIHRvIHdvcmsgaW4gSlNQIHNob3VsZCBzdWItY2xhc3MgdGhpcyBjbGFzcyBhbmQgY2FsbCAic2V0TmFtZSIgdG8gc2V0Ci0gKiB0aGUgbmFtZSBvZiB0aGUgdGFnIHdpdGhpbiB0aGUgR3JhaWxzIHRhZ2xpYgotICoKLSAqIFRoaXMgdGFnIGNhbiBvZiBjb3Vyc2UgYmUgdXNlZCBzdGFuZGFsb25lIHRvIGludm9rZSBhIEdyYWlscyB0YWcgZnJvbSBKU1A6Ci0gKgotICogPGNvZGU+Ci0gKiAgIDxncjppbnZva2VUYWcgbmFtZT0ibXlUYWciIC8+Ci0gKiA8L2NvZGU+Ci0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMTYtSmFuLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEpzcEludm9rZUdyYWlsc1RhZ0xpYlRhZyBleHRlbmRzIEJvZHlUYWdTdXBwb3J0IGltcGxlbWVudHMgRHluYW1pY0F0dHJpYnV0ZXMgIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPX0FSR1VNRU5UUyA9ICJ6ZXJvQXJndW1lbnRzRmxhZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST09WWV9ERUZBVUxUX0FSR1VNRU5UID0gIml0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBBVFRSSUJVVEVfTUFQID0gUGF0dGVybi5jb21waWxlKCIoXFxzKihcXFMrKVxccyo6XFxzKihcXFMrPykoLHwkKXsxfSl7MX0iKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBpbnQgaW52b2NhdGlvbkNvdW50OwotICAgIHByaXZhdGUgTGlzdCBpbnZvY2F0aW9uQXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgaW52b2NhdGlvbkJvZHlDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgQmVhbldyYXBwZXIgYmVhbjsKLSAgICBwcm90ZWN0ZWQgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgU3RyaW5nV3JpdGVyIHN3OwotICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgb3V0OwotICAgIHByaXZhdGUgSnNwV3JpdGVyIGpzcFdyaXRlcjsKLSAgICBwcml2YXRlIEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcyBncmFpbHNBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dDs7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19MSUJTX0FUVFJJQlVURSA9ICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5UQUdfTElCUyI7Ci0KLQotICAgIHB1YmxpYyBKc3BJbnZva2VHcmFpbHNUYWdMaWJUYWcoKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IG5ldyBCZWFuV3JhcHBlckltcGwodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkcyA9IHRoaXMuYmVhbi5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICBpZiggcGQuZ2V0UHJvcGVydHlUeXBlKCkgPT0gU3RyaW5nLmNsYXNzICYmCi0gICAgICAgICAgICAgICAgIXBkLmdldE5hbWUoKS5lcXVhbHMoTkFNRV9BVFRSSUJVVEUpICYmCi0gICAgICAgICAgICAgICAgdGhpcy5iZWFuLmlzV3JpdGFibGVQcm9wZXJ0eShwZC5nZXROYW1lKCkpICYmCi0gICAgICAgICAgICAgICAgdGhpcy5iZWFuLmlzUmVhZGFibGVQcm9wZXJ0eShwZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSAoU3RyaW5nKXRoaXMuYmVhbi5nZXRQcm9wZXJ0eVZhbHVlKHBkLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyaW1tZWQgPSBwcm9wZXJ0eVZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYodHJpbW1lZC5zdGFydHNXaXRoKCJbIikgJiYgdHJpbW1lZC5lbmRzV2l0aCgiXSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmltbWVkID0gdHJpbW1lZC5zdWJzdHJpbmcoMSx0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBBVFRSSUJVVEVfTUFQLm1hdGNoZXIodHJpbW1lZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgYXR0cmlidXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKG0uZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5pc0V4cHJlc3Npb25MYW5ndWFnZShhdHRyaWJ1dGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBFeHByZXNzaW9uRXZhbHVhdGlvblV0aWxzLmV2YWx1YXRlKGF0dHJpYnV0ZU5hbWUsYXR0cmlidXRlVmFsdWUsT2JqZWN0LmNsYXNzLHN1cGVyLnBhZ2VDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNYXAucHV0KGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KHBkLmdldE5hbWUoKSwgYXR0cmlidXRlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKEV4cHJlc3Npb25FdmFsdWF0aW9uVXRpbHMuaXNFeHByZXNzaW9uTGFuZ3VhZ2UocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KHBkLmdldE5hbWUoKSwgRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5ldmFsdWF0ZShwZC5nZXROYW1lKCkscHJvcGVydHlWYWx1ZSxPYmplY3QuY2xhc3Msc3VwZXIucGFnZUNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXQocGQuZ2V0TmFtZSgpLCBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9TdGFydFRhZ0ludGVybmFsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHcm9vdnlPYmplY3QgZ2V0VGFnTGliKFN0cmluZyB0YWdOYW1lKSB7Ci0gICAgICAgIGlmKHRoaXMuYXBwbGljYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIGluaXRQYWdlU3RhdGUoKTsKLQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpdGhpcy5wYWdlQ29udGV4dC5nZXRSZXF1ZXN0KCk7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSl0aGlzLnBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCk7Ci0gICAgICAgIE1hcCB0YWdMaWJzID0gKE1hcClwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUoVEFHX0xJQlNfQVRUUklCVVRFKTsKLSAgICAgICAgaWYodGFnTGlicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YWdMaWJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZShUQUdfTElCU19BVFRSSUJVVEUsIHRhZ0xpYnMpOwotICAgICAgICB9Ci0gICAgICAgIEdyYWlsc1RhZ0xpYkNsYXNzIHRhZ0xpYkNsYXNzID0gYXBwbGljYXRpb24uZ2V0VGFnTGliQ2xhc3NGb3JUYWcodGFnTmFtZSk7Ci0gICAgICAgIEdyb292eU9iamVjdCB0YWdMaWI7Ci0gICAgICAgIGlmKHRhZ0xpYnMuY29udGFpbnNLZXkodGFnTGliQ2xhc3MuZ2V0RnVsbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICB0YWdMaWIgPSAoR3Jvb3Z5T2JqZWN0KXRhZ0xpYnMuZ2V0KHRhZ0xpYkNsYXNzLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGFnTGliID0gKEdyb292eU9iamVjdClhcHBDb250ZXh0LmdldEJlYW4odGFnTGliQ2xhc3MuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5ldyBUYWdMaWJEeW5hbWljTWV0aG9kcyh0YWdMaWIsZ3JhaWxzQXR0cmlidXRlcy5nZXRDb250cm9sbGVyKHJlcXVlc3QpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIkVycm9yIGluc3RhbnRpYXRpbmcgdGFnbGliIFsiK3RhZ0xpYkNsYXNzLmdldEZ1bGxOYW1lKCkrIl06ICIgKyBlLmdldE1lc3NhZ2UoKSxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhZ0xpYnMucHV0KHRhZ0xpYkNsYXNzLmdldEZ1bGxOYW1lKCksdGFnTGliKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFnTGliOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UGFnZVN0YXRlKCkgewotICAgICAgICBpZih0aGlzLmFwcGxpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZ3JhaWxzQXR0cmlidXRlcyA9IG5ldyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb25BdHRyaWJ1dGVzKHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGdyYWlsc0F0dHJpYnV0ZXMuZ2V0R3JhaWxzQXBwbGljYXRpb24oKTsKLSAgICAgICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGdyYWlsc0F0dHJpYnV0ZXMuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGRvU3RhcnRUYWdJbnRlcm5hbCgpIHsKLSAgICAgIEdyb292eU9iamVjdCB0YWdMaWIgPSBnZXRUYWdMaWIoZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYodGFnTGliICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLSAgICAgICAgICAgIHRhZ0xpYi5zZXRQcm9wZXJ0eSggVGFnTGliRHluYW1pY01ldGhvZHMuT1VUX1BST1BFUlRZLCBvdXQgKTsKLSAgICAgICAgICAgIE9iamVjdCB0YWdMaWJQcm9wOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0YWdMaWJQcm9wID0gdGFnTGliLmdldFByb3BlcnR5KGdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK2dldE5hbWUoKSsiXSBkb2VzIG5vdCBleGlzdCBpbiB0YWcgbGlicmFyeSBbIit0YWdMaWIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHRhZ0xpYlByb3AgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgICAgICAgICAgQ2xvc3VyZSBib2R5ID0gbmV3IENsb3N1cmUodGhpcykgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKG5ldyBPYmplY3RbXXtvfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoT2JqZWN0W10gYXJncykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwoYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXJncy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkFyZ3MuYWRkKGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkFyZ3MuYWRkKFpFUk9fQVJHVU1FTlRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGpzcC1ib2R5LWdlbiIraW52b2NhdGlvbkNvdW50KyI+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgQ2xvc3VyZSB0YWcgPSAoQ2xvc3VyZSl0YWdMaWJQcm9wOwotICAgICAgICAgICAgICAgIGlmKHRhZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhZy5jYWxsKCBuZXcgT2JqZWN0W117IGF0dHJpYnV0ZXMgfSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGJvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5jYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodGFnLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFnLmNhbGwoIG5ldyBPYmplY3RbXSB7IGF0dHJpYnV0ZXMsIGJvZHkgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYWlsc1RhZ0V4Y2VwdGlvbigiVGFnIFsiK2dldE5hbWUoKSsiXSBkb2VzIG5vdCBleGlzdCBpbiB0YWcgbGlicmFyeSBbIit0YWdMaWIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcmFpbHNUYWdFeGNlcHRpb24oIlRhZyBbIitnZXROYW1lKCkrIl0gZG9lcyBub3QgZXhpc3QuIE5vIHRhZyBsaWJyYXJ5IGZvdW5kLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShpbnZvY2F0aW9uQXJncyk7Ci0gICAgICAgIHNldEN1cnJlbnRBcmd1bWVudCgpOwotICAgICAgICByZXR1cm4gRVZBTF9CT0RZX0JVRkZFUkVEOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDdXJyZW50QXJndW1lbnQoKSB7Ci0gICAgICAgIGlmKGludm9jYXRpb25Db3VudCA+IDApIHsKLSAgICAgICAgICAgIE9iamVjdCBhcmcgPSBpbnZvY2F0aW9uQXJncy5nZXQoaW52b2NhdGlvbkNvdW50IC0gMSk7Ci0gICAgICAgICAgICBpZihhcmcuZXF1YWxzKFpFUk9fQVJHVU1FTlRTKSkgewotICAgICAgICAgICAgICAgIHBhZ2VDb250ZXh0LnNldEF0dHJpYnV0ZShHUk9PVllfREVGQVVMVF9BUkdVTUVOVCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoR1JPT1ZZX0RFRkFVTFRfQVJHVU1FTlQsIGFyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQm9keUNvbnRlbnQgYiA9IGdldEJvZHlDb250ZW50KCk7Ci0gICAgICAgIGlmKGludm9jYXRpb25Db3VudCA+IDApIHsKLSAgICAgICAgICAgIGlmKGIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGpzcFdyaXRlciA9IGIuZ2V0RW5jbG9zaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgaW52b2NhdGlvbkJvZHlDb250ZW50LmFkZChiLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBiLmNsZWFyQm9keSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW52b2NhdGlvbkNvdW50LS07Ci0gICAgICAgIHNldEN1cnJlbnRBcmd1bWVudCgpOwotICAgICAgICBpZihpbnZvY2F0aW9uQ291bnQgPD0gMCkgIHsKLSAgICAgICAgICAgIFN0cmluZyB0YWdDb250ZW50ID0gc3cudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgaW50IGkgPSAxOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGludm9jYXRpb25Cb2R5Q29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTtpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXBsYWNlRmxhZyA9ICI8anNwLWJvZHktZ2VuIitpKyI+IjsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IHRhZ0NvbnRlbnQuaW5kZXhPZihyZXBsYWNlRmxhZyk7Ci0gICAgICAgICAgICAgICAgaWYoaiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGFnQ29udGVudC5zdWJzdHJpbmcoMCxqKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYm9keSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGFnQ29udGVudC5zdWJzdHJpbmcoaiArIHJlcGxhY2VGbGFnLmxlbmd0aCgpLCB0YWdDb250ZW50Lmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhZ0NvbnRlbnQgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmRlbGV0ZSgwLCBidWYubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAganNwV3JpdGVyLndyaXRlKHRhZ0NvbnRlbnQpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIkkvTyBlcnJvciB3cml0aW5nIHRhZyBjb250ZW50cyBbIit0YWdDb250ZW50ICsiXSB0byByZXNwb25zZSBvdXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTS0lQX0JPRFk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEVWQUxfQk9EWV9CVUZGRVJFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKXZhbHVlOwotICAgICAgICAgICAgU3RyaW5nIHRyaW1tZWQgPSBzdHJpbmdWYWx1ZS50cmltKCk7Ci0gICAgICAgICAgICBpZih0cmltbWVkLnN0YXJ0c1dpdGgoIlsiKSAmJiB0cmltbWVkLmVuZHNXaXRoKCJdIikpIHsKLSAgICAgICAgICAgICAgICB0cmltbWVkID0gdHJpbW1lZC5zdWJzdHJpbmcoMSx0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gQVRUUklCVVRFX01BUC5tYXRjaGVyKHRyaW1tZWQpOwotICAgICAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIHdoaWxlKG0uZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gbS5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5pc0V4cHJlc3Npb25MYW5ndWFnZShhdHRyaWJ1dGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU1hcC5wdXQoYXR0cmlidXRlTmFtZSwgRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5ldmFsdWF0ZShhdHRyaWJ1dGVOYW1lLGF0dHJpYnV0ZVZhbHVlLE9iamVjdC5jbGFzcyxzdXBlci5wYWdlQ29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnB1dChsb2NhbE5hbWUsIGF0dHJpYnV0ZU1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihFeHByZXNzaW9uRXZhbHVhdGlvblV0aWxzLmlzRXhwcmVzc2lvbkxhbmd1YWdlKHN0cmluZ1ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnB1dChsb2NhbE5hbWUsRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5ldmFsdWF0ZShsb2NhbE5hbWUsc3RyaW5nVmFsdWUsT2JqZWN0LmNsYXNzLHRoaXMucGFnZUNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KGxvY2FsTmFtZSx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KGxvY2FsTmFtZSx2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL2pzcC9Kc3BMaW5rVGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL2pzcC9Kc3BMaW5rVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDdkYjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3NyYy93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3RhZ2xpYi9qc3AvSnNwTGlua1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5qc3A7Ci0KLS8qKgotICogQSBKU1AgZmFjYWRlIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBHcmFpbHMgdGFnbGliIGxpbmsgdGFnCi0gKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgSmFuIDMsIDIwMDYKLSAqLwotcHVibGljIGNsYXNzIEpzcExpbmtUYWcgZXh0ZW5kcyBKc3BJbnZva2VHcmFpbHNUYWdMaWJUYWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJsaW5rIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uOwotCi0gICAgcHVibGljIEpzcExpbmtUYWcoKSB7Ci0gICAgICAgIHN1cGVyLnNldE5hbWUoVEFHX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcihTdHJpbmcgY29udHJvbGxlcikgewotICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgewotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvanNwL0pzcFJlbmRlcklucHV0VGFnLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvc3JjL3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvdGFnbGliL2pzcC9Kc3BSZW5kZXJJbnB1dFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVmMDUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy9zcmMvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi90YWdsaWIvanNwL0pzcFJlbmRlcklucHV0VGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnRhZ2xpYi5qc3A7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIudGFnbGliLkdyYWlsc1RhZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuUmVuZGVySW5wdXRUYWc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnBhZ2VzLkdyb292eVBhZ2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5JbnZhbGlkUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC50YWdzLlJlcXVlc3RDb250ZXh0QXdhcmVUYWc7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIudXRpbC5FeHByZXNzaW9uRXZhbHVhdGlvblV0aWxzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFRhZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEEgSlNQIGZhY2FkZSB0aGF0IGRlbGVnYXRlcyB0byB0aGUgR3JhaWxzIFJlbmRlcklucHV0VGFnIChAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi50YWdsaWIuUmVuZGVySW5wdXRUYWcpCi0gKiAKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA2LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc3BSZW5kZXJJbnB1dFRhZyBleHRlbmRzIFJlcXVlc3RDb250ZXh0QXdhcmVUYWcgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVhbjsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHByb3RlY3RlZCBpbnQgZG9TdGFydFRhZ0ludGVybmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYoU3RyaW5nVXRpbHMuaXNCbGFuayhwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKCJUYWcgW3NjYWZmb2xkXSBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSBbcHJvcGVydHldIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZihTdHJpbmdVdGlscy5pc0JsYW5rKGJlYW4pKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbigiVGFnIFtzY2FmZm9sZF0gbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgW2JlYW5dIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZighRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5pc0V4cHJlc3Npb25MYW5ndWFnZShiZWFuKSkgewotICAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIkF0dHJpYnV0ZSBbYmVhbl0gb2YgdGFnIFtzY2FmZm9sZF0gbXVzdCBiZSBhIEpTVEwgZXhwcmVzc2lvbiIpOwotICAgICAgICAgfQotICAgICAgICAgV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPYmplY3QgYmVhbkluc3RhbmNlID0gRXhwcmVzc2lvbkV2YWx1YXRpb25VdGlscy5ldmFsdWF0ZSgiYmVhbiIsdGhpcy5iZWFuLE9iamVjdC5jbGFzcyx0aGlzLnBhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICBpZihiZWFuSW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKCJCZWFuIFsiK3RoaXMuYmVhbisiXSByZWZlcmVuY2VkIGJ5IHRhZyBbc2NhZmZvbGRdIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgICAgIEdyYWlsc1RhZ1JlZ2lzdHJ5IHRhZ1JlZ2lzdHJ5ID0gR3JhaWxzVGFnUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIE1hcCB0YWdDb250ZXh0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRhZ0NvbnRleHQucHV0KEdyb292eVBhZ2UuUkVRVUVTVCwgcGFnZUNvbnRleHQuZ2V0UmVxdWVzdCgpKTsKLSAgICAgICAgICAgIHRhZ0NvbnRleHQucHV0KEdyb292eVBhZ2UuUkVTUE9OU0UsIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpOwotICAgICAgICAgICAgdGFnQ29udGV4dC5wdXQoR3Jvb3Z5UGFnZS5TRVJWTEVUX0NPTlRFWFQsIHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgUmVuZGVySW5wdXRUYWcgdGFnID0gKFJlbmRlcklucHV0VGFnKXRhZ1JlZ2lzdHJ5Lm5ld1RhZyggUmVuZGVySW5wdXRUYWcuVEFHX05BTUUgKTsKLSAgICAgICAgICAgIHRhZy5pbml0KHRhZ0NvbnRleHQpOwotICAgICAgICAgICAgdGFnLnNldEJlYW4oYmVhbkluc3RhbmNlKTsKLSAgICAgICAgICAgIHRhZy5zZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB0YWcuZG9TdGFydFRhZygpOwotCi0gICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24gaXBlKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiQXR0cmlidXRlIFtwcm9wZXJ0eV0gd2l0aCB2YWx1ZSBbIitwcm9wZXJ0eSsiXSBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBvZiBiZWFuIFsiK2JlYW4rIl0gaW4gdGFnIFtzY2FmZm9sZF0iLGlwZSk7Ci0gICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTS0lQX0JPRFk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oU3RyaW5nIGJlYW4pIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9QYWdlRmxvd0J1aWxkZXJUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9QYWdlRmxvd0J1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWY1MmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9ncmFpbHMvcGFnZWZsb3cvUGFnZUZsb3dCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2UgZ3JhaWxzLnBhZ2VmbG93OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5sYW5nLkNsYXNzOwotaW1wb3J0IGphdmEubGFuZy5FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLk9iamVjdDsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCA5LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRmxvd0J1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBhZ2VGbG93QnVpbGRlclRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFBhZ2VGbG93QnVpbGRlclRlc3QoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NQYWdlRmxvd0J1aWxkZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JCUNsYXNzIGNsYXp6ID0gY2wucGFyc2VDbGFzcygiIiArCi0JCQkJImltcG9ydCBncmFpbHMucGFnZWZsb3cuKjtcbiIgKwotCQkJCSJcbiIgKwotCQkJCSJjbGFzcyBUZXN0Q2xhc3Mge1xuIiArCi0JCQkJIiAgQFByb3BlcnR5IEZsb3cgZmxvdyA9IG5ldyBQYWdlRmxvd0J1aWxkZXIoKS5mbG93IHtcbiIgKwotCQkJCSIgICAgb25TdWJtaXQoYWN0aW9uOltmb3JtT2JqZWN0Q2xhc3M6T2JqZWN0LmNsYXNzLGZvcm1PYmplY3ROYW1lOlwib2JqZWN0XCJdKSB7XG4iICsKLQkJCQkiICAgICAgc3VjY2VzcyhcIm15Rmlyc3RTdGF0ZVwiKVxuIiArCi0JCQkJIiAgICB9XG4iICsKLQkJCQkiICAgIG15Rmlyc3RTdGF0ZSh2aWV3OlwibXlWaWV3XCIpIHtcbiIgKwotCQkJCSIgICAgICBzdWJtaXQoXCJteU5leHRTdGF0ZVwiKVxuIiArCi0JCQkJIiAgICB9XG4iICsKLQkJCQkiICB9XG4iICsKLQkJCQkifVxuIik7Ci0JCUdyb292eU9iamVjdCBnbyA9IChHcm9vdnlPYmplY3QpY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJT2JqZWN0IGZsb3cgPSBnby5nZXRQcm9wZXJ0eSgiZmxvdyIpOwotCQlhc3NlcnROb3ROdWxsKGZsb3cpOwotCQlhc3NlcnRUcnVlKGZsb3cgaW5zdGFuY2VvZiBGbG93KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGZsb3cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvZ3JhaWxzL3BhZ2VmbG93L1N0YXRlVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvZ3JhaWxzL3BhZ2VmbG93L1N0YXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkZTA5Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL2dyYWlscy9wYWdlZmxvdy9TdGF0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAKLXBhY2thZ2UgZ3JhaWxzLnBhZ2VmbG93OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuT2JqZWN0OwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LkFjdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuRmxvd0F0dHJpYnV0ZU1hcHBlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93LmFjdGlvbi5Gb3JtQWN0aW9uOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCA5LCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0YXRlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0YXRlVGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NPbmVEaXNjcmltaW5hdG9yRmllbGQoKSB7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJ0ZXN0Iik7Ci0JCXN0YXRlLnNldFZpZXdOYW1lKCJ0ZXN0Iik7Ci0JCXN0YXRlLnZhbGlkYXRlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc1ZpZXdTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0FjdGlvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRGVjaXNpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0VuZFN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzU3ViZmxvd1N0YXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmFpbFR3b0Rpc2NyaW1pbmF0b3JGaWVsZHMoKSB7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJ0ZXN0Iik7Ci0JCXN0YXRlLnNldEFjdGlvbkNsYXNzKE9iamVjdC5jbGFzcyk7Ci0JCXN0YXRlLnNldFZpZXdOYW1lKCJ0ZXN0Iik7Ci0JCXRyeSB7Ci0JCQlzdGF0ZS52YWxpZGF0ZSgpOwotICAgICAgICAgICAgZmFpbCgidmFsaWRhdGUgc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEZhaWxXcm9uZ0FjdGlvbkNsYXNzKCkgewotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgidGVzdCIpOwotCQlzdGF0ZS5zZXRBY3Rpb25DbGFzcyhPYmplY3QuY2xhc3MpOwotCQl0cnkgewotCQkJc3RhdGUudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGZhaWwoInZhbGlkYXRlIHNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZhaWxBYnN0cmFjdEFjdGlvbkNsYXNzKCkgewotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgidGVzdCIpOwotCQlzdGF0ZS5zZXRBY3Rpb25DbGFzcyhBY3Rpb24uY2xhc3MpOwotCQl0cnkgewotCQkJc3RhdGUudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGZhaWwoInZhbGlkYXRlIHNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NHb29kQWN0aW9uQ2xhc3MxKCkgewotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgidGVzdCIpOwotCQlzdGF0ZS5zZXRBY3Rpb25DbGFzcyhGb3JtQWN0aW9uLmNsYXNzKTsKLQkJc3RhdGUudmFsaWRhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1ZpZXdTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNTdWJmbG93U3RhdGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzR29vZEFjdGlvbkNsYXNzMigpIHsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoInRlc3QiKTsKLQkJc3RhdGUuc2V0QWN0aW9uQ2xhc3MobmV3IE9iamVjdCgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZXhlY3V0ZShSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0uZ2V0Q2xhc3MoKSk7Ci0JCXN0YXRlLnZhbGlkYXRlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNWaWV3U3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc0FjdGlvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRGVjaXNpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0VuZFN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzU3ViZmxvd1N0YXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmFpbFdyb25nQXR0cmlidXRlTWFwcGVyQ2xhc3MoKSB7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJ0ZXN0Iik7Ci0JCXN0YXRlLnNldEF0dHJpYnV0ZU1hcHBlckNsYXNzKE9iamVjdC5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlzdGF0ZS52YWxpZGF0ZSgpOwotICAgICAgICAgICAgZmFpbCgidmFsaWRhdGUgc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmFpbEFic3RyYWN0QXR0cmlidXRlTWFwcGVyQ2xhc3MoKSB7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJ0ZXN0Iik7Ci0JCXN0YXRlLnNldEF0dHJpYnV0ZU1hcHBlckNsYXNzKEZsb3dBdHRyaWJ1dGVNYXBwZXIuY2xhc3MpOwotCQl0cnkgewotCQkJc3RhdGUudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGZhaWwoInZhbGlkYXRlIHNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NHb29kQXR0cmlidXRlTWFwcGVyQ2xhc3MoKSB7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJ0ZXN0Iik7Ci0JCXN0YXRlLnNldFN1YkZsb3dJZCgidGVzdCIpOwotCQlzdGF0ZS5zZXRBdHRyaWJ1dGVNYXBwZXJDbGFzcyhuZXcgRmxvd0F0dHJpYnV0ZU1hcHBlcigpIHsKLQkJCXB1YmxpYyBNYXAgY3JlYXRlU3ViZmxvd0lucHV0KFJlcXVlc3RDb250ZXh0IGFyZzApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1hcFN1YmZsb3dPdXRwdXQoUmVxdWVzdENvbnRleHQgYXJnMCkgewotCQkJfQotCQl9LmdldENsYXNzKCkpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NBY3Rpb25BdHRyaWJ1dGVzMSgpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiYWN0aW9uIiwgbmV3IEZvcm1BY3Rpb24oKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJwcm9wZXJ0aWVzIiwgbmV3IEhhc2hNYXAoKSk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteUFjdGlvbiIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NBY3Rpb25BdHRyaWJ1dGVzMigpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiYWN0aW9uIiwgRm9ybUFjdGlvbi5jbGFzcyk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJwcm9wZXJ0aWVzIiwgbnVsbCk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteUFjdGlvbiIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NBY3Rpb25BdHRyaWJ1dGVzMygpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiYWN0aW9uIiwgbmV3IENsb3N1cmUobmV3IE9iamVjdCgpKSB7fSk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJwcm9wZXJ0aWVzIiwgbnVsbCk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteUFjdGlvbiIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsQWN0aW9uQXR0cmlidXRlczEoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoImFjdGlvbiIsIG5ldyBPYmplY3QoKSk7Ci0JCXRyeSB7Ci0JCQluZXcgU3RhdGUoIm15QWN0aW9uIiwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBmYWlsKCJTdGF0ZSBjdG9yIHNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZhaWxBY3Rpb25BdHRyaWJ1dGVzMigpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiYWN0aW9uIiwgRm9ybUFjdGlvbi5jbGFzcyk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJwcm9wZXJ0aWVzIiwgbmV3IEFycmF5TGlzdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlBY3Rpb24iLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotLy8gSWRlYWxseSB0aGlzIHRlc3Qgc2hvdWxkIGZhaWwgYnV0IHRoZW4gd2Ugd291bGQgaGF2ZSB0byB2YWxpZGF0ZSBmb3IgZXZlcnkgc3RhdGUKLS8vCWlmIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBhcmUgbm90IHNldC4KLS8vCXB1YmxpYyB2b2lkIHRlc3RGYWlsUHJvcGVydGllcygpIHsKLS8vCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJYXR0cmlidXRlcy5wdXQoInByb3BlcnRpZXMiLCBuZXcgSGFzaE1hcCgpKTsKLS8vCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgibXlBY3Rpb24iLCBhdHRyaWJ1dGVzKTsKLS8vCQl0cnkgewotLy8JCQlzdGF0ZS52YWxpZGF0ZSgpOwotLy8gICAgICAgICAgICBmYWlsKCJ2YWxpZGF0ZSBzaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7Ci0vLwkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy8gZXhwZWN0ZWQKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NWaWV3QXR0cmlidXRlczEoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoInZpZXciLCAic29tZVZpZXciKTsKLQkJYXR0cmlidXRlcy5wdXQoIm1vZGVsIiwgbmV3IEhhc2hNYXAoKSk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3ICBTdGF0ZSgibXlWaWV3U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLQkJc3RhdGUudmFsaWRhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNTdWJmbG93U3RhdGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzVmlld0F0dHJpYnV0ZXMyKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJ2aWV3IiwgbmV3IENsb3N1cmUobmV3IE9iamVjdCgpKSB7fSk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJtb2RlbCIsIG51bGwpOwotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgibXlWaWV3U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLQkJc3RhdGUudmFsaWRhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNTdWJmbG93U3RhdGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsVmlld0F0dHJpYnV0ZXMxKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJ2aWV3IiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlWaWV3U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmFpbFZpZXdBdHRyaWJ1dGVzMigpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgidmlldyIsICJzb21lVmlldyIpOwotCQlhdHRyaWJ1dGVzLnB1dCgibW9kZWwiLCBuZXcgQXJyYXlMaXN0KCkpOwotCQl0cnkgewotCQkJbmV3IFN0YXRlKCJteVZpZXdTdGF0ZSIsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgZmFpbCgiU3RhdGUgY3RvciBzaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzRGVjaXNpb25BdHRyaWJ1dGVzMSgpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiZGVjaXNpb24iLCAiZXhwcmVzc2lvbiIpOwotCQlhdHRyaWJ1dGVzLnB1dCgidHJ1ZVN0YXRlIiwgInNvbWVTdGF0ZSIpOwotCQlhdHRyaWJ1dGVzLnB1dCgiZmFsc2VTdGF0ZSIsICJzb21lT3RoZXJTdGF0ZSIpOwotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgibXlEZWNpc2lvblN0YXRlIiwgYXR0cmlidXRlcyk7Ci0JCXN0YXRlLnZhbGlkYXRlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNWaWV3U3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzRGVjaXNpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0VuZFN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzU3ViZmxvd1N0YXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzRGVjaXNpb25BdHRyaWJ1dGVzMigpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiZGVjaXNpb24iLCBuZXcgQ2xvc3VyZShuZXcgT2JqZWN0KCkpIHt9KTsKLQkJYXR0cmlidXRlcy5wdXQoInRydWVTdGF0ZSIsICJzb21lU3RhdGUiKTsKLQkJYXR0cmlidXRlcy5wdXQoImZhbHNlU3RhdGUiLCAic29tZU90aGVyU3RhdGUiKTsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoIm15RGVjaXNpb25TdGF0ZSIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZhaWxEZWNpc2lvbkF0dHJpYnV0ZXMxKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJkZWNpc2lvbiIsICJleHByZXNzaW9uIik7Ci0JCWF0dHJpYnV0ZXMucHV0KCJmYWxzZVN0YXRlIiwgInNvbWVPdGhlclN0YXRlIik7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteURlY2lzaW9uU3RhdGUiLCBhdHRyaWJ1dGVzKTsKLQkJdHJ5IHsKLQkJCXN0YXRlLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJ2YWxpZGF0ZSBzaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWxEZWNpc2lvbkF0dHJpYnV0ZXMyKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJkZWNpc2lvbiIsICJleHByZXNzaW9uIik7Ci0JCWF0dHJpYnV0ZXMucHV0KCJ0cnVlU3RhdGUiLCAic29tZVN0YXRlIik7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteURlY2lzaW9uU3RhdGUiLCBhdHRyaWJ1dGVzKTsKLQkJdHJ5IHsKLQkJCXN0YXRlLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJ2YWxpZGF0ZSBzaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWxEZWNpc2lvbkF0dHJpYnV0ZXMzKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJkZWNpc2lvbiIsIG5ldyBPYmplY3QoKSk7Ci0JCXRyeSB7Ci0JCQluZXcgU3RhdGUoIm15RGVjaXNpb25TdGF0ZSIsIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgZmFpbCgiU3RhdGUgY3RvciBzaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsRGVjaXNpb25BdHRyaWJ1dGVzNCgpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgiZGVjaXNpb24iLCAiZXhwcmVzc2lvbiIpOwotCQlhdHRyaWJ1dGVzLnB1dCgidHJ1ZVN0YXRlIiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlEZWNpc2lvblN0YXRlIiwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBmYWlsKCJTdGF0ZSBjdG9yIHNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmFpbERlY2lzaW9uQXR0cmlidXRlczUoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoImRlY2lzaW9uIiwgImV4cHJlc3Npb24iKTsKLQkJYXR0cmlidXRlcy5wdXQoImZhbHNlU3RhdGUiLCBuZXcgT2JqZWN0KCkpOwotCQl0cnkgewotCQkJbmV3IFN0YXRlKCJteURlY2lzaW9uU3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzU3ViZmxvd0F0dHJpYnV0ZXMxKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJzdWJmbG93IiwgInNvbWVGbG93Iik7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteVN1YmZsb3dTdGF0ZSIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NTdWJmbG93QXR0cmlidXRlczIoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoInN1YmZsb3ciLCAic29tZUZsb3ciKTsKLQkJYXR0cmlidXRlcy5wdXQoImlucHV0IiwgbmV3IENsb3N1cmUobmV3IE9iamVjdCgpKSB7fSk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteVN1YmZsb3dTdGF0ZSIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VjY2Vzc1N1YmZsb3dBdHRyaWJ1dGVzMygpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgic3ViZmxvdyIsICJzb21lRmxvdyIpOwotCQlhdHRyaWJ1dGVzLnB1dCgib3V0cHV0IiwgbmV3IENsb3N1cmUobmV3IE9iamVjdCgpKSB7fSk7Ci0JCVN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCJteVN1YmZsb3dTdGF0ZSIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VjY2Vzc1N1YmZsb3dBdHRyaWJ1dGVzNCgpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRyaWJ1dGVzLnB1dCgic3ViZmxvdyIsICJzb21lRmxvdyIpOwotCQlhdHRyaWJ1dGVzLnB1dCgibWFwcGVyIiwgbmV3IEZsb3dBdHRyaWJ1dGVNYXBwZXIoKSB7Ci0JCQlwdWJsaWMgTWFwIGNyZWF0ZVN1YmZsb3dJbnB1dChSZXF1ZXN0Q29udGV4dCBhcmcwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtYXBTdWJmbG93T3V0cHV0KFJlcXVlc3RDb250ZXh0IGFyZzApIHsKLQkJCX0KLQkJfS5nZXRDbGFzcygpKTsKLQkJYXR0cmlidXRlcy5wdXQoInByb3BlcnRpZXMiLCBuZXcgSGFzaE1hcCgpKTsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoIm15U3ViZmxvd1N0YXRlIiwgYXR0cmlidXRlcyk7Ci0JCXN0YXRlLnZhbGlkYXRlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNWaWV3U3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzU3ViZmxvd1N0YXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzU3ViZmxvd0F0dHJpYnV0ZXM1KCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJzdWJmbG93IiwgInNvbWVGbG93Iik7Ci0JCWF0dHJpYnV0ZXMucHV0KCJtYXBwZXIiLCBuZXcgRmxvd0F0dHJpYnV0ZU1hcHBlcigpIHsKLQkJCXB1YmxpYyBNYXAgY3JlYXRlU3ViZmxvd0lucHV0KFJlcXVlc3RDb250ZXh0IGFyZzApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1hcFN1YmZsb3dPdXRwdXQoUmVxdWVzdENvbnRleHQgYXJnMCkgewotCQkJfQotCQl9KTsKLQkJYXR0cmlidXRlcy5wdXQoInByb3BlcnRpZXMiLCBudWxsKTsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoIm15U3ViZmxvd1N0YXRlIiwgYXR0cmlidXRlcyk7Ci0JCXN0YXRlLnZhbGlkYXRlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNWaWV3U3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNBY3Rpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0RlY2lzaW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzU3ViZmxvd1N0YXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsU3ViZmxvd0F0dHJpYnV0ZXMxKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJzdWJmbG93IiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlTdWJmbG93U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsU3ViZmxvd0F0dHJpYnV0ZXMyKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJzdWJmbG93IiwgImV4cHJlc3Npb24iKTsKLQkJYXR0cmlidXRlcy5wdXQoImlucHV0IiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlTdWJmbG93U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWxTdWJmbG93QXR0cmlidXRlczMoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoInN1YmZsb3ciLCAiZXhwcmVzc2lvbiIpOwotCQlhdHRyaWJ1dGVzLnB1dCgib3V0cHV0IiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlTdWJmbG93U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWxTdWJmbG93QXR0cmlidXRlczQoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoInN1YmZsb3ciLCAiZXhwcmVzc2lvbiIpOwotCQlhdHRyaWJ1dGVzLnB1dCgibWFwcGVyIiwgbmV3IE9iamVjdCgpKTsKLQkJdHJ5IHsKLQkJCW5ldyBTdGF0ZSgibXlTdWJmbG93U3RhdGUiLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGZhaWwoIlN0YXRlIGN0b3Igc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWxTdWJmbG93QXR0cmlidXRlczUoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0cmlidXRlcy5wdXQoInN1YmZsb3ciLCAiZXhwcmVzc2lvbiIpOwotCQlhdHRyaWJ1dGVzLnB1dCgibWFwcGVyIiwgT2JqZWN0LmNsYXNzKTsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoIm15U3ViZmxvd1N0YXRlIiwgYXR0cmlidXRlcyk7Ci0JCXRyeSB7Ci0JCQlzdGF0ZS52YWxpZGF0ZSgpOwotICAgICAgICAgICAgZmFpbCgiU3RhdGUgdmFsaWRhdGUgc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NFbmRTdGF0ZTEoKSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoIm15RW5kU3RhdGUiLCBhdHRyaWJ1dGVzKTsKLQkJc3RhdGUudmFsaWRhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1ZpZXdTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc0FjdGlvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzRGVjaXNpb25TdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXRlLmlzRW5kU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNTdWJmbG93U3RhdGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzRW5kU3RhdGUyKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dHJpYnV0ZXMucHV0KCJ2aWV3IiwgInNvbWVWaWV3Iik7Ci0JCWF0dHJpYnV0ZXMucHV0KCJlbmQiLCBCb29sZWFuLlRSVUUpOwotCQlTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgibXlFbmRTdGF0ZSIsIGF0dHJpYnV0ZXMpOwotCQlzdGF0ZS52YWxpZGF0ZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzVmlld1N0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN0YXRlLmlzQWN0aW9uU3RhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3RhdGUuaXNEZWNpc2lvblN0YXRlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhdGUuaXNFbmRTdGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdGF0ZS5pc1N1YmZsb3dTdGF0ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL2dyYWlscy91dGlsL09wZW5SaWNvQnVpbGRlclRlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL2dyYWlscy91dGlsL09wZW5SaWNvQnVpbGRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTIzZDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9ncmFpbHMvdXRpbC9PcGVuUmljb0J1aWxkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIGdyYWlscy51dGlsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDUsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIE9wZW5SaWNvQnVpbGRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE9wZW5SaWNvQnVpbGRlclRlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPcGVuUmljb0J1aWxkZXJUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoV3JpdGVyIHdyaXRlcikgewotCQlmaW5hbCBQcmludFdyaXRlciBwcmludGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0JCXJldHVybiBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKSB7Ci0JCQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQkJCXJldHVybiBwcmludGVyOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZ3Jvb3Z5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLQkJQ2xhc3MgY2xhenogPSBjbC5wYXJzZUNsYXNzKCJpbXBvcnQgZ3JhaWxzLnV0aWwuKjsgY2xhc3MgVGVzdENsYXNzIHsgTGlzdCBuYW1lcyA9IFtcIlN0ZXZlblwiLCBcIkhhbnNcIiwgXCJFcndpblwiXTsgQFByb3BlcnR5IENsb3N1cmUgdGVzdCA9IHsgcmVzcG9uc2UgLT4gbmV3IE9wZW5SaWNvQnVpbGRlcihyZXNwb25zZSkuIiArIGdyb292eSArICI7IH0gfSIpOwotCQlHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCUNsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKWdvLmdldFByb3BlcnR5KCJ0ZXN0Iik7Ci0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJY2xvc3VyZS5jYWxsKGdldFJlc3BvbnNlKHN3KSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3BlblJpY29CdWlsZGVyQWpheFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJbmV3IE9wZW5SaWNvQnVpbGRlcihnZXRSZXNwb25zZShzdykpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wZW5SaWNvQnVpbGRlckVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGFyc2UoImFqYXh7IGVsZW1lbnQoaWQ6XCJ0ZXN0XCIpIHsgfSB9Iik7Ci0JCQotCQl0cnkgewotCQkJcGFyc2UoImFqYXh7IHRlc3QoaWQ6XCJ0ZXN0XCIpIHsgfSB9Iik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQotCQl0cnkgewotCQkJcGFyc2UoImVsZW1lbnR7IHRlc3QoaWQ6XCJ0ZXN0XCIpIHsgfSB9Iik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQotCQkKLQkJcGFyc2UoImFqYXh7IGVsZW1lbnQoaWQ6XCJ0ZXN0XCIpIHsgdGVzdFRhZyB7fSB9IH0iKTsKLQkJCi0JCXBhcnNlKCJhamF4KCkgeyBlbGVtZW50KGlkOlwidGVzdFwiKSB7IHRlc3RUYWcge30gfTsgZWxlbWVudChpZDpcInRlc3QyXCIpIHt9ICB9Iik7Ci0KLQkJcGFyc2UoImFqYXggeyBvYmplY3QoaWQ6XCJ0ZXN0XCIpIHsgdGVzdFRhZyB7fSB9OyBvYmplY3QoaWQ6XCJ0ZXN0MlwiKSB7fSAgfSIpOwotCi0JCXBhcnNlKCJhamF4IHsgZWxlbWVudChpZDpcInRlc3RcIikgeyBzZWxlY3QobmFtZTpcInRlc3RcIikgeyBmb3IgKG5hbWUgaW4gbmFtZXMpIHsgc3BhbihuYW1lKSB9IH0gfSB9Iik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0Fic3RyYWN0R3JhaWxzQ2xhc3NUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0Fic3RyYWN0R3JhaWxzQ2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTIxODhlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEdyYWlsc0NsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0R3JhaWxzQ2xhc3NUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBYnN0cmFjdEdyYWlsc0NsYXNzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0R3JhaWxzQ2xhc3NUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RHcmFpbHNDbGFzc05vUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQlDbGFzcyBjbGF6eiA9IGNsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3RTZXJ2aWNlIHsgfSIpOwotCQlHcmFpbHNDbGFzcyBncmFpbHNDbGFzcyA9IG5ldyBBYnN0cmFjdEdyYWlsc0NsYXNzKGNsYXp6LCAiU2VydmljZSIpIHt9OwotCQlhc3NlcnRFcXVhbHMoIlRlc3RTZXJ2aWNlIiwgY2xhenouZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgZ3JhaWxzQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0U2VydmljZSIsIGdyYWlsc0NsYXNzLmdldEZ1bGxOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGdyYWlsc0NsYXNzLm5ld0luc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEdyYWlsc0NsYXNzUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQlDbGFzcyBjbGF6eiA9IGNsLnBhcnNlQ2xhc3MoInBhY2thZ2UgdGVzdC5jYXNleTsgY2xhc3MgVGVzdFNlcnZpY2UgeyB9Iik7Ci0JCUdyYWlsc0NsYXNzIGdyYWlsc0NsYXNzID0gbmV3IEFic3RyYWN0R3JhaWxzQ2xhc3MoY2xhenosICJTZXJ2aWNlIikge307Ci0JCWFzc2VydEVxdWFscygidGVzdC5jYXNleS5UZXN0U2VydmljZSIsIGNsYXp6LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIGdyYWlsc0NsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBncmFpbHNDbGFzcy5nZXRGdWxsTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChncmFpbHNDbGFzcy5uZXdJbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzc1Rlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmIyNmVhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9BYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICogCi0gKiBAYXV0aG9yIFN0ZXZlbiBEZXZpanZlcgotICogQHNpbmNlIEp1bCAyLCAyMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzVGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQlDbGFzcyBjbGF6eiA9IGNsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3RTZXJ2aWNlIHsgfSIpOwotCQlJbmplY3RhYmxlR3JhaWxzQ2xhc3MgZ3JhaWxzQ2xhc3MgPSBuZXcgQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3MoY2xhenosICJTZXJ2aWNlIikge307Ci0JCWFzc2VydFRydWUoZ3JhaWxzQ2xhc3MuYnlUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShncmFpbHNDbGFzcy5ieU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzc051bGxQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQlDbGFzcyBjbGF6eiA9IGNsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3RTZXJ2aWNlIHsgQFByb3BlcnR5IGJvb2xlYW4gYnlOYW1lOyBAUHJvcGVydHkgYm9vbGVhbiBhdmFpbGFibGUgPSB0cnVlIH0iKTsKLQkJSW5qZWN0YWJsZUdyYWlsc0NsYXNzIGdyYWlsc0NsYXNzID0gbmV3IEFic3RyYWN0SW5qZWN0YWJsZUdyYWlsc0NsYXNzKGNsYXp6LCAiU2VydmljZSIpIHt9OwotCQlhc3NlcnRUcnVlKGdyYWlsc0NsYXNzLmJ5VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ3JhaWxzQ2xhc3MuYnlOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGdyYWlsc0NsYXNzLmdldEF2YWlsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3NOdWxsUHJvcGVydHlGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQlDbGFzcyBjbGF6eiA9IGNsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3RTZXJ2aWNlIHsgQFByb3BlcnR5IGJvb2xlYW4gYnlOYW1lID0gZmFsc2U7IEBQcm9wZXJ0eSBib29sZWFuIGF2YWlsYWJsZSA9IHRydWUgfSIpOwotCQlJbmplY3RhYmxlR3JhaWxzQ2xhc3MgZ3JhaWxzQ2xhc3MgPSBuZXcgQWJzdHJhY3RJbmplY3RhYmxlR3JhaWxzQ2xhc3MoY2xhenosICJTZXJ2aWNlIikge307Ci0JCWFzc2VydFRydWUoZ3JhaWxzQ2xhc3MuYnlUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShncmFpbHNDbGFzcy5ieU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoZ3JhaWxzQ2xhc3MuZ2V0QXZhaWxhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzc051bGxQcm9wZXJ0eVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLQkJQ2xhc3MgY2xhenogPSBjbC5wYXJzZUNsYXNzKCJjbGFzcyBUZXN0U2VydmljZSB7IEBQcm9wZXJ0eSBib29sZWFuIGJ5TmFtZSA9IHRydWU7IHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhdmFpbGFibGUgPSBmYWxzZSB9Iik7Ci0JCUluamVjdGFibGVHcmFpbHNDbGFzcyBncmFpbHNDbGFzcyA9IG5ldyBBYnN0cmFjdEluamVjdGFibGVHcmFpbHNDbGFzcyhjbGF6eiwgIlNlcnZpY2UiKSB7fTsKLQkJYXNzZXJ0RmFsc2UoZ3JhaWxzQ2xhc3MuYnlUeXBlKCkpOwotCQlhc3NlcnRUcnVlKGdyYWlsc0NsYXNzLmJ5TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ3JhaWxzQ2xhc3MuZ2V0QXZhaWxhYmxlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0NsYXNzUmVsb2FkaW5nVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9DbGFzc1JlbG9hZGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODMwMjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0NsYXNzUmVsb2FkaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSZXNvdXJjZUxvYWRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc1JlbG9hZGluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdFJlbG9hZGluZ0NsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0JCWNsLnNldFJlc291cmNlTG9hZGVyKCBuZXcgR3Jvb3Z5UmVzb3VyY2VMb2FkZXIoKSB7Ci0JCQlwdWJsaWMgVVJMIGxvYWRHcm9vdnlTb3VyY2UoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJCQlmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5ncm9vdnkiOwotCQkJCXJldHVybiBjbC5nZXRSZXNvdXJjZShmaWxlbmFtZSk7Ci0JCQl9CQkJCQotCQl9Ci0JKTsJCQotCQkKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2wuZ2V0UmVzb3VyY2UoIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvVGVzdFJlbG9hZC5ncm9vdnkiKS5nZXRGaWxlKCkpOwotCQkKLQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOwotCQl0cnkgewotCQkJZncud3JpdGUoICAicGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zO1xuIiArCi0JCQkJCQkiY2xhc3MgVGVzdFJlbG9hZCB7IFxuIiArCi0JCQkJCQkJIkBQcm9wZXJ0eSBoZWxsbyA9IFwiaGVsbG9cIlxuIiArCi0JCQkJCQkifSIpOwkJCi0JCQlmdy5jbG9zZSgpOwotCQkJCi0JCQlDbGFzcyBncm9vdnlDbGFzcyA9IGNsLmxvYWRDbGFzcygib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5UZXN0UmVsb2FkIix0cnVlLGZhbHNlKTsKLQotCQkJCi0JCQkKLQkJCUdyb292eU9iamVjdCBnbyA9IChHcm9vdnlPYmplY3QpZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQotCQkJYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIGdvLmdldFByb3BlcnR5KCJoZWxsbyIpKTsKLQkJCQotCQkJLy8gY2hhbmdlIGNsYXNzCi0JCQlmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOwotCQkJZncud3JpdGUoICAicGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zO1xuIiArCi0JCQkJCSJjbGFzcyBUZXN0UmVsb2FkIHsgXG4iICsKLQkJCQkJCSJAUHJvcGVydHkgaGVsbG8gPSBcImdvb2RieWVcIlxuIiArCi0JCQkJCSJ9Iik7Ci0gICAgICAgICAgICBmdy5jbG9zZSgpOwotCi0gICAgICAgICAgICAvLyByZWxvYWQKLQkJCWdyb292eUNsYXNzID0gY2wubG9hZENsYXNzKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLlRlc3RSZWxvYWQiLHRydWUsZmFsc2UpOwkJCQotCQkJZ28gPSAoR3Jvb3Z5T2JqZWN0KWdyb292eUNsYXNzLm5ld0luc3RhbmNlKCk7CQkJCi0JCQlhc3NlcnRFcXVhbHMoImdvb2RieWUiLCBnby5nZXRQcm9wZXJ0eSgiaGVsbG8iKSk7CQkJCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlmdy5jbG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3NUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjczODBmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9EZWZhdWx0R3JhaWxzQ29udHJvbGxlckNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3NUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBEZWZhdWx0R3JhaWxzQ29udHJvbGxlckNsYXNzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3NUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3NVUklzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JCUNsYXNzIGNsYXp6ID0gY2wucGFyc2VDbGFzcygiY2xhc3MgT3ZlcnZpZXdDb250cm9sbGVyIHsgfSIpOwotCQlHcmFpbHNDb250cm9sbGVyQ2xhc3MgZ3JhaWxzQ2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc0NvbnRyb2xsZXJDbGFzcyhjbGF6eik7Ci0JCWFzc2VydEVxdWFscygwLCBncmFpbHNDbGFzcy5nZXRVUklzKCkubGVuZ3RoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRHcmFpbHNDb250cm9sbGVyVmlld05hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JCUNsYXNzIGNsYXp6ID0gY2wucGFyc2VDbGFzcygiY2xhc3MgT3ZlcnZpZXdDb250cm9sbGVyIHsgQFByb3BlcnR5IFN0cmluZyBsaXN0VmlldyA9IFwibGlzdFBhZ2VcIjsgQFByb3BlcnR5IENsb3N1cmUgbGlzdCA9IHsgcmVxdWVzdCwgcmVzcG9uc2UgLT4gcmV0dXJuIG51bGwgfTsgfSAiKTsKLQkJR3JhaWxzQ29udHJvbGxlckNsYXNzIGdyYWlsc0NsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNDb250cm9sbGVyQ2xhc3MoY2xhenopOwotCQlhc3NlcnRFcXVhbHMoIk92ZXJ2aWV3IiwgZ3JhaWxzQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPdmVydmlld0NvbnRyb2xsZXIiLCBncmFpbHNDbGFzcy5nZXRGdWxsTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIvb3ZlcnZpZXcvbGlzdFBhZ2UiLCBncmFpbHNDbGFzcy5nZXRWaWV3QnlVUkkoIi9vdmVydmlldy9saXN0IikpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ3JhaWxzQ2xhc3MuZ2V0VVJJcygpLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RhdGFTb3VyY2VUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL0RlZmF1bHRHcmFpbHNEYXRhU291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiOGY3Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvRGVmYXVsdEdyYWlsc0RhdGFTb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotCi0vKioKLSAqIFVzZXI6IEdyYWVtZQotICogRGF0ZTogMTktRmViLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcmFpbHNEYXRhU291cmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhaWxzRGF0YVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBDbGFzcyBkc0NsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3REYXRhU291cmNlIHsiICsKLSAgICAgICAgICAgICAgICAiQFByb3BlcnR5IFN0cmluZyBkcml2ZXJDbGFzc05hbWUgPSAndGVzdC5kcml2ZXJDbGFzcydcbiIgKwotICAgICAgICAgICAgICAgICJAUHJvcGVydHkgU3RyaW5nIHVybCA9ICdqZGJjOi8vdGVzdHVybCdcbiIgKwotICAgICAgICAgICAgICAgICJAUHJvcGVydHkgU3RyaW5nIHVzZXJuYW1lID0nc2EnXG4iICsKLSAgICAgICAgICAgICAgICAiQFByb3BlcnR5IFN0cmluZyBwYXNzd29yZCA9ICdwYXNzJ1xuIiArCi0gICAgICAgICAgICAgICAgIkBQcm9wZXJ0eSBjb25maWdDbGFzcyA9IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuY2ZnLkRlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uLmNsYXNzIiArCi0gICAgICAgICAgICAgICAgIn0iKTsKLQotICAgICAgICBHcmFpbHNEYXRhU291cmNlIGRzID0gbmV3IERlZmF1bHRHcmFpbHNEYXRhU291cmNlKGRzQ2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRzLmdldENvbmZpZ3VyYXRpb25DbGFzcygpKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzc1V0aWxzVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9HcmFpbHNDbGFzc1V0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjYWJiMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvR3JhaWxzQ2xhc3NVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxNS1GZWItMjAwNgotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzQ2xhc3NVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYXR1cmFsTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaXJzdCBOYW1lIiwgR3JhaWxzQ2xhc3NVdGlscy5nZXROYXR1cmFsTmFtZSgiZmlyc3ROYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVUkwiLCBHcmFpbHNDbGFzc1V0aWxzLmdldE5hdHVyYWxOYW1lKCJVUkwiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxvY2FsIFVSTCIsIEdyYWlsc0NsYXNzVXRpbHMuZ2V0TmF0dXJhbE5hbWUoImxvY2FsVVJMIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVUkwgbG9jYWwiLCBHcmFpbHNDbGFzc1V0aWxzLmdldE5hdHVyYWxOYW1lKCJVUkxsb2NhbCIpKTsKLSAgICAgICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL011bHRpcGxlQ2xhc3Nlc1BlckZpbGVUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL011bHRpcGxlQ2xhc3Nlc1BlckZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQyMjk1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9NdWx0aXBsZUNsYXNzZXNQZXJGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDMsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIE11bHRpcGxlQ2xhc3Nlc1BlckZpbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBNdWx0aXBsZUNsYXNzZXNQZXJGaWxlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE11bHRpcGxlQ2xhc3Nlc1BlckZpbGVUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDbGFzc2VzUGVyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCQljbC5wYXJzZUNsYXNzKG5ldyBGaWxlKCJ0ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvY29tbW9ucy9jbGFzc2VzLmdyb292eSIpKTsKLQkJQ2xhc3MgdGVzdENsYXNzMSA9IGNsLmxvYWRDbGFzcygiVGVzdENsYXNzMSIpOwotCQlDbGFzcyB0ZXN0Q2xhc3MyID0gY2wubG9hZENsYXNzKCJUZXN0Q2xhc3MyIik7Ci0JCQotCQl0cnkgewotCQkJY2wubG9hZENsYXNzKCJUZXN0Q2xhc3MzIik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3MxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3MyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvVGVzdFJlbG9hZC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvVGVzdFJlbG9hZC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjA5NzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL1Rlc3RSZWxvYWQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnM7Ci1jbGFzcyBUZXN0UmVsb2FkIHsgCi1AUHJvcGVydHkgaGVsbG8gPSAiZ29vZGJ5ZSIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvY2xhc3Nlcy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9jb21tb25zL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2NvbW1vbnMvY2xhc3Nlcy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzJhNTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9jb21tb25zL2NsYXNzZXMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1jbGFzcyBUZXN0Q2xhc3MxIHsKLQotfQotCi1jbGFzcyBUZXN0Q2xhc3MyIHsKLQlzdGF0aWMgYm9vbGVhbiBhdmFpbGFibGUgPSB0cnVlCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHlUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvY29tbW9ucy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy92YWxpZGF0aW9uL0NvbnN0cmFpbmVkUHJvcGVydHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI1ZjM4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L2NvbW1vbnMvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvdmFsaWRhdGlvbi9Db25zdHJhaW5lZFByb3BlcnR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb247Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuSW50UmFuZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uQmluZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uRXJyb3JzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudmFsaWRhdGlvbi5GaWVsZEVycm9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWluZWRQcm9wZXJ0eVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGVzdEVtYWlsID0gInJ1YmJpc2hfZW1haWwiOwotCXByaXZhdGUgU3RyaW5nIHRlc3RVUkwgPSAicnViYmlzaF91cmwiOwotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdEVtYWlsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdEVtYWlsKCkgewotCQlyZXR1cm4gdGVzdEVtYWlsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0RW1haWwgVGhlIHRlc3RFbWFpbCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdEVtYWlsKFN0cmluZyB0ZXN0RW1haWwpIHsKLQkJdGhpcy50ZXN0RW1haWwgPSB0ZXN0RW1haWw7Ci0JfQotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRlc3RVUkwoKSB7Ci0JCXJldHVybiB0ZXN0VVJMOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0VVJMIFRoZSB0ZXN0VVJMIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0VVJMKFN0cmluZyB0ZXN0VVJMKSB7Ci0JCXRoaXMudGVzdFVSTCA9IHRlc3RVUkw7Ci0JfQotCi0JLyoKLQkgKiBUZXN0IG1ldGhvZCBmb3IgJ29yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eS5zdXBwb3J0c0NvbnRyYWludChTdHJpbmcpJwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0NvbnRyYWludCgpIHsKLQkJQ29uc3RyYWluZWRQcm9wZXJ0eSBjcCA9IG5ldyBDb25zdHJhaW5lZFByb3BlcnR5KENvbnN0cmFpbmVkUHJvcGVydHlUZXN0cy5jbGFzcywidGVzdFByb3BlcnR5IiwgU3RyaW5nLmNsYXNzKTsKLQkJCi0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuQkxBTktfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5FTUFJTF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1BVENIRVNfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5JTl9MSVNUX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTEVOR1RIX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFYX0xFTkdUSF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9MRU5HVEhfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVhfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NSU5fQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OT1RfRVFVQUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlJBTkdFX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuVVJMX0NPTlNUUkFJTlQgKSk7Ci0JCi0JCQotCQljcCA9IG5ldyBDb25zdHJhaW5lZFByb3BlcnR5KENvbnN0cmFpbmVkUHJvcGVydHlUZXN0cy5jbGFzcywidGVzdFByb3BlcnR5IiwgQ29sbGVjdGlvbi5jbGFzcyk7Ci0KLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVhfU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9TSVpFX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LklOX0xJU1RfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OT1RfRVFVQUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5UICkpOwkJCi0JCQotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5CTEFOS19DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5FTUFJTF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVRDSEVTX0NPTlNUUkFJTlQgKSk7CQkKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFYX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5SQU5HRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5VUkxfQ09OU1RSQUlOVCApKTsKLQkJCi0JCWNwID0gbmV3IENvbnN0cmFpbmVkUHJvcGVydHkoQ29uc3RyYWluZWRQcm9wZXJ0eVRlc3RzLmNsYXNzLCJ0ZXN0UHJvcGVydHkiLCBOdW1iZXIuY2xhc3MpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVhfU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9TSVpFX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LklOX0xJU1RfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OT1RfRVFVQUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5UICkpOwkJCi0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFYX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUlOX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuUkFOR0VfQ09OU1RSQUlOVCApKTsJCQotCQkKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuQkxBTktfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuRU1BSUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFUQ0hFU19DT05TVFJBSU5UICkpOwkJCi0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlVSTF9DT05TVFJBSU5UICkpOwotCQkKLQkJY3AgPSBuZXcgQ29uc3RyYWluZWRQcm9wZXJ0eShDb25zdHJhaW5lZFByb3BlcnR5VGVzdHMuY2xhc3MsInRlc3RQcm9wZXJ0eSIsIERhdGUuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1BWF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlJBTkdFX0NPTlNUUkFJTlQgKSk7CQotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LklOX0xJU1RfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OT1RfRVFVQUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5UICkpOwkKLQkJCi0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LkJMQU5LX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LkVNQUlMX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1BVENIRVNfQ09OU1RSQUlOVCApKTsJCQotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5VUkxfQ09OU1RSQUlOVCApKTsJCi0JCQotCQkKLQkJY3AgPSBuZXcgQ29uc3RyYWluZWRQcm9wZXJ0eShDb25zdHJhaW5lZFByb3BlcnR5VGVzdHMuY2xhc3MsInRlc3RQcm9wZXJ0eSIsIE9iamVjdC5jbGFzcyk7Ci0JCQotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LklOX0xJU1RfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OT1RfRVFVQUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5UICkpOwkKLQkJCi0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1BWF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NSU5fQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuUkFOR0VfQ09OU1RSQUlOVCApKTsJCQkKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuQkxBTktfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuRU1BSUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFUQ0hFU19DT05TVFJBSU5UICkpOwkJCi0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LkxFTkdUSF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVhfTEVOR1RIX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk1JTl9MRU5HVEhfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuVVJMX0NPTlNUUkFJTlQgKSk7CQotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NQVhfU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5NSU5fU0laRV9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRGYWxzZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5TSVpFX0NPTlNUUkFJTlQgKSk7CQkKLQkJCi0JCWNwID0gbmV3IENvbnN0cmFpbmVkUHJvcGVydHkoQ29uc3RyYWluZWRQcm9wZXJ0eVRlc3RzLmNsYXNzLCJ0ZXN0UHJvcGVydHkiLCBDb21wYXJhYmxlLmNsYXNzKTsKLQkJCi0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuSU5fTElTVF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk5PVF9FUVVBTF9DT05TVFJBSU5UICkpOwotCQlhc3NlcnRUcnVlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5Lk5VTExBQkxFX0NPTlNUUkFJTlQgKSk7CQkJCi0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFYX0NPTlNUUkFJTlQgKSk7Ci0JCWFzc2VydFRydWUoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUlOX0NPTlNUUkFJTlQgKSk7CQkKLQkJYXNzZXJ0VHJ1ZShjcC5zdXBwb3J0c0NvbnRyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5SQU5HRV9DT05TVFJBSU5UICkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuQkxBTktfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuRU1BSUxfQ09OU1RSQUlOVCApKTsKLQkJYXNzZXJ0RmFsc2UoY3Auc3VwcG9ydHNDb250cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTUFUQ0hFU19DT05TVFJBSU5UICkpOwkJCi0JCWFzc2VydEZhbHNlKGNwLnN1cHBvcnRzQ29udHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlVSTF9DT05TVFJBSU5UICkpOwkKLQkJCi0JfQotCi0JLyoKLQkgKiBUZXN0IG1ldGhvZCBmb3IgJ29yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnZhbGlkYXRpb24uQ29uc3RyYWluZWRQcm9wZXJ0eS5hcHBseUNvbnN0cmFpbnQoU3RyaW5nLCBPYmplY3QpJwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBcHBseUNvbnN0cmFpbnQoKSB7Ci0JCQotCQkvLyB0ZXN0IHZhbGlkYXRlIGVtYWlsCi0JCUNvbnN0cmFpbmVkUHJvcGVydHkgY3AgPSBuZXcgQ29uc3RyYWluZWRQcm9wZXJ0eShDb25zdHJhaW5lZFByb3BlcnR5VGVzdHMuY2xhc3MsInRlc3RFbWFpbCIsIFN0cmluZy5jbGFzcyk7Ci0JCQotCQljcC5hcHBseUNvbnN0cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuRU1BSUxfQ09OU1RSQUlOVCwgbmV3IEJvb2xlYW4odHJ1ZSkgKTsKLQkJYXNzZXJ0VHJ1ZShjcC5nZXRBcHBsaWVkQ29uc3RyYWludHMoKS5zaXplKCkgPT0gMSk7Ci0JCUVycm9ycyBlcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0aGlzLCJ0ZXN0T2JqZWN0Iik7Ci0JCUNvbnN0cmFpbnQgYyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNwLmdldEFwcGxpZWRDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJYyA9IChDb25zdHJhaW50KSBpLm5leHQoKTsJCQkKLQkJCWMudmFsaWRhdGUodGhpcy50ZXN0RW1haWwsIGVycm9ycyk7CQkJCi0JCX0KLQkJYXNzZXJ0VHJ1ZShlcnJvcnMuaGFzRXJyb3JzKCkpOwotCQlGaWVsZEVycm9yIGVycm9yID0gZXJyb3JzLmdldEZpZWxkRXJyb3IoInRlc3RFbWFpbCIpOwotCQlhc3NlcnROb3ROdWxsKGVycm9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJydWJiaXNoX2VtYWlsIixlcnJvci5nZXRSZWplY3RlZFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0RW1haWwgPSAiYXZhbGlkZW1haWxAaG90bWFpbC5jb20iOwotCQllcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0aGlzLCJ0ZXN0T2JqZWN0Iik7Ci0JCWMudmFsaWRhdGUodGhpcy50ZXN0RW1haWwsZXJyb3JzKTsKLQkJYXNzZXJ0RmFsc2UoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQkJCi0JCS8vIHRlc3QgdmFsaWRhdGUgdXJsCi0JCWNwID0gbmV3IENvbnN0cmFpbmVkUHJvcGVydHkoQ29uc3RyYWluZWRQcm9wZXJ0eVRlc3RzLmNsYXNzLCJ0ZXN0VVJMIiwgU3RyaW5nLmNsYXNzKTsKLQkJY3AuYXBwbHlDb25zdHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlVSTF9DT05TVFJBSU5ULCBuZXcgQm9vbGVhbih0cnVlKSApOwotCQkKLQkJYXNzZXJ0VHJ1ZShjcC5nZXRBcHBsaWVkQ29uc3RyYWludHMoKS5zaXplKCkgPT0gMSk7Ci0JCWVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKHRoaXMsInRlc3RPYmplY3QiKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaSA9IGNwLmdldEFwcGxpZWRDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJYyA9IChDb25zdHJhaW50KSBpLm5leHQoKTsJCQkKLQkJCWMudmFsaWRhdGUodGhpcy50ZXN0VVJMLCBlcnJvcnMpOwkJCQotCQl9Ci0JCWFzc2VydFRydWUoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQkJZXJyb3IgPSBlcnJvcnMuZ2V0RmllbGRFcnJvcigidGVzdFVSTCIpOwotCQlhc3NlcnROb3ROdWxsKGVycm9yKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdFVSTCxlcnJvci5nZXRSZWplY3RlZFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0VVJMID0gImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSI7Ci0JCWVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKHRoaXMsInRlc3RPYmplY3QiKTsKLQkJYy52YWxpZGF0ZSh0aGlzLnRlc3RVUkwsZXJyb3JzKTsKLQkJYXNzZXJ0RmFsc2UoZXJyb3JzLmhhc0Vycm9ycygpKTsJCi0JCQotCQkvLyB0ZXN0IGJsYW5rIGNvbnN0cmFpbnQKLQkJY3AuYXBwbHlDb25zdHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LlVSTF9DT05TVFJBSU5ULCBudWxsICk7Ci0JCWNwLmFwcGx5Q29uc3RyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5CTEFOS19DT05TVFJBSU5ULCBuZXcgQm9vbGVhbihmYWxzZSkgKTsKLQkJCi0JCWFzc2VydFRydWUoY3AuZ2V0QXBwbGllZENvbnN0cmFpbnRzKCkuc2l6ZSgpID09IDEpOwotCQllcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0aGlzLCJ0ZXN0T2JqZWN0Iik7Ci0JCXRoaXMudGVzdFVSTCA9ICIiOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjcC5nZXRBcHBsaWVkQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCWMgPSAoQ29uc3RyYWludCkgaS5uZXh0KCk7CQkJCi0JCQljLnZhbGlkYXRlKHRoaXMudGVzdFVSTCwgZXJyb3JzKTsJCQkKLQkJfQkKLQkJYXNzZXJ0VHJ1ZShlcnJvcnMuaGFzRXJyb3JzKCkpOwotCQllcnJvciA9IGVycm9ycy5nZXRGaWVsZEVycm9yKCJ0ZXN0VVJMIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihlcnJvcik7Ci0JCWFzc2VydE5vdE51bGwoZXJyb3IpOwkJCi0JCQotCQkvLyB0ZXN0IG51bGxhYmxlIGNvbnN0cmFpbnQKLQkJY3AuYXBwbHlDb25zdHJhaW50KCBDb25zdHJhaW5lZFByb3BlcnR5LkJMQU5LX0NPTlNUUkFJTlQsIG5ldyBCb29sZWFuKHRydWUpICk7Ci0JCWNwLmFwcGx5Q29uc3RyYWludCggQ29uc3RyYWluZWRQcm9wZXJ0eS5OVUxMQUJMRV9DT05TVFJBSU5ULCBuZXcgQm9vbGVhbihmYWxzZSkgKTsKLQkJCi0JCWVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKHRoaXMsInRlc3RPYmplY3QiKTsKLQkJdGhpcy50ZXN0VVJMID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gY3AuZ2V0QXBwbGllZENvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQljID0gKENvbnN0cmFpbnQpIGkubmV4dCgpOwkJCQotCQkJYy52YWxpZGF0ZSh0aGlzLnRlc3RVUkwsIGVycm9ycyk7CQkJCi0JCX0JCi0JCWFzc2VydFRydWUoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQkJZXJyb3IgPSBlcnJvcnMuZ2V0RmllbGRFcnJvcigidGVzdFVSTCIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3IpOwotCQlhc3NlcnROb3ROdWxsKGVycm9yKTsJCQotCQkKLQkJLy8gdGVzdCBpbkxpc3QgY29uc3RyYWludAotCQljcC5hcHBseUNvbnN0cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTlVMTEFCTEVfQ09OU1RSQUlOVCwgbmV3IEJvb2xlYW4odHJ1ZSkgKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZCgib25lIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInRocmVlIik7Ci0JCXRoaXMudGVzdFVSTCA9ICJzb21ldGhpbmciOwotCQljcC5hcHBseUNvbnN0cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuSU5fTElTVF9DT05TVFJBSU5ULCBsaXN0ICk7Ci0JCQotCQllcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0aGlzLCJ0ZXN0T2JqZWN0Iik7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNwLmdldEFwcGxpZWRDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJYyA9IChDb25zdHJhaW50KSBpLm5leHQoKTsJCQkKLQkJCWMudmFsaWRhdGUodGhpcy50ZXN0VVJMLCBlcnJvcnMpOwkJCQotCQl9CQotCQlhc3NlcnRUcnVlKGVycm9ycy5oYXNFcnJvcnMoKSk7Ci0JCWVycm9yID0gZXJyb3JzLmdldEZpZWxkRXJyb3IoInRlc3RVUkwiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVycm9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlcnJvcik7CQotCQkKLQkJdGhpcy50ZXN0VVJMID0gInR3byI7Ci0JCWVycm9ycyA9IG5ldyBCaW5kRXhjZXB0aW9uKHRoaXMsInRlc3RPYmplY3QiKTsKLQkJYy52YWxpZGF0ZSh0aGlzLnRlc3RVUkwsZXJyb3JzKTsKLQkJYXNzZXJ0RmFsc2UoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQkJCi0JCS8vIHRlc3QgbGVuZ3RoIGNvbnN0cmFpbnQKLQkJY3AgPSBuZXcgQ29uc3RyYWluZWRQcm9wZXJ0eShDb25zdHJhaW5lZFByb3BlcnR5VGVzdHMuY2xhc3MsInRlc3RVUkwiLCBTdHJpbmcuY2xhc3MpOwotCQljcC5hcHBseUNvbnN0cmFpbnQoIENvbnN0cmFpbmVkUHJvcGVydHkuTEVOR1RIX0NPTlNUUkFJTlQsIG5ldyBJbnRSYW5nZSg1LDE1KSApOwotCQkKLQkJZXJyb3JzID0gbmV3IEJpbmRFeGNlcHRpb24odGhpcywidGVzdE9iamVjdCIpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjcC5nZXRBcHBsaWVkQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCWMgPSAoQ29uc3RyYWludCkgaS5uZXh0KCk7CQkJCi0JCQljLnZhbGlkYXRlKHRoaXMudGVzdFVSTCwgZXJyb3JzKTsJCQkKLQkJfQkJCi0JCQotCQlhc3NlcnRUcnVlKGVycm9ycy5oYXNFcnJvcnMoKSk7Ci0JCWVycm9yID0gZXJyb3JzLmdldEZpZWxkRXJyb3IoInRlc3RVUkwiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVycm9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlcnJvcik7CQkKLQkJCi0JCXRoaXMudGVzdFVSTCA9ICJhYnNvbHV0ZWx5dG90YWxseXRvb2xvbmciOwotCQllcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbih0aGlzLCJ0ZXN0T2JqZWN0Iik7Ci0JCWMudmFsaWRhdGUodGhpcy50ZXN0VVJMLGVycm9ycyk7Ci0JCWFzc2VydFRydWUoZXJyb3JzLmhhc0Vycm9ycygpKTsJCQotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW50QnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLQkJCi0JCUNsYXNzIGdyb292eUNsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBUZXN0Q2xhc3Mge1xuIiArCi0JCQkJCQkiQFByb3BlcnR5IExvbmcgaWRcbiIgKwotCQkJCQkJIkBQcm9wZXJ0eSBMb25nIHZlcnNpb25cbiIgKwotCQkJCQkJIkBQcm9wZXJ0eSBTdHJpbmcgbG9naW5cbiIgKwotCQkJCQkJIkBQcm9wZXJ0eSBTdHJpbmcgZW1haWxcbiIgKwotCQkJCQkJIkBQcm9wZXJ0eSBjb25zdHJhaW50cyA9IHtcbiIgKwotCQkJCQkJCSJsb2dpbihsZW5ndGg6NS4uMTUsbnVsbGFibGU6ZmFsc2UsYmxhbms6ZmFsc2UpXG4iICsKLQkJCQkJCQkiZW1haWwoZW1haWw6dHJ1ZSlcbiIgKwotCQkJCQkJIn1cbiIgKwotCQkJCQkJIn0iICk7Ci0JCQotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IG5ldyBEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3MoZ3Jvb3Z5Q2xhc3MpOwotCQkKLQkJTWFwIGNvbnN0cmFpbmVkUHJvcGVydGllcyA9IGRvbWFpbkNsYXNzLmdldENvbnN0cmFpbmVkUHJvcGVydGllcygpOwotCQlhc3NlcnRUcnVlKGNvbnN0cmFpbmVkUHJvcGVydGllcy5zaXplKCkgPT0gMik7Ci0JCUNvbnN0cmFpbmVkUHJvcGVydHkgbG9naW5Db25zdHJhaW50ID0gKENvbnN0cmFpbmVkUHJvcGVydHkpY29uc3RyYWluZWRQcm9wZXJ0aWVzLmdldCgibG9naW4iKTsKLQkJYXNzZXJ0VHJ1ZShsb2dpbkNvbnN0cmFpbnQuZ2V0QXBwbGllZENvbnN0cmFpbnRzKCkuc2l6ZSgpID09IDMpOwotCQkKLQkJQ29uc3RyYWluZWRQcm9wZXJ0eSBlbWFpbENvbnN0cmFpbnQgPSAoQ29uc3RyYWluZWRQcm9wZXJ0eSljb25zdHJhaW5lZFByb3BlcnRpZXMuZ2V0KCJlbWFpbCIpOwotCQlhc3NlcnRUcnVlKGVtYWlsQ29uc3RyYWludC5nZXRBcHBsaWVkQ29uc3RyYWludHMoKS5zaXplKCkgPT0gMSk7Ci0JCQotCQlHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KWdyb292eUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCWdvLnNldFByb3BlcnR5KCJlbWFpbCIsICJydWJiaXNoX2VtYWlsIik7Ci0JCUVycm9ycyBlcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbihnbywgIlRlc3RDbGFzcyIpOwotCQllbWFpbENvbnN0cmFpbnQudmFsaWRhdGUoIGdvLmdldFByb3BlcnR5KCJlbWFpbCIpLCBlcnJvcnMgKTsKLQkJCi0JCWFzc2VydFRydWUoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQkJZ28uc2V0UHJvcGVydHkoImVtYWlsIiwgInZhbGlkQGVtYWlsLmNvbSIpOwotCQllcnJvcnMgPSBuZXcgQmluZEV4Y2VwdGlvbihnbywgIlRlc3RDbGFzcyIpOwotCQllbWFpbENvbnN0cmFpbnQudmFsaWRhdGUoIGdvLmdldFByb3BlcnR5KCJlbWFpbCIpLCBlcnJvcnMgKTsKLQkJYXNzZXJ0RmFsc2UoZXJyb3JzLmhhc0Vycm9ycygpKTsKLQl9Ci19Ci0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24tMi4wLmR0ZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL2hpYmVybmF0ZS1jb25maWd1cmF0aW9uLTIuMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmNhNDkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24tMi4wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0gSGliZXJuYXRlIGZpbGUtYmFzZWQgY29uZmlndXJhdGlvbiBkb2N1bWVudC4KLQotPCFET0NUWVBFIGhpYmVybmF0ZS1jb25maWd1cmF0aW9uIFBVQkxJQyAKLQkiLS8vSGliZXJuYXRlL0hpYmVybmF0ZSBDb25maWd1cmF0aW9uIERURCAyLjAvL0VOIgotCSJodHRwOi8vaGliZXJuYXRlLnNvdXJjZWZvcmdlLm5ldC9oaWJlcm5hdGUtY29uZmlndXJhdGlvbi0yLjAuZHRkIj4KLQotQW4gaW5zdGFuY2Ugb2YgdGhpcyBkb2N1bWVudCBjb250YWlucyBwcm9wZXJ0eSBzZXR0aW5ncyBhbmQgcmVmZXJlbmNlcyAKLXRvIG1hcHBpbmcgZmlsZXMgZm9yIGEgbnVtYmVyIG9mIFNlc3Npb25GYWN0b3J5IGluc3RhbmNlcyB0byBiZSBsaXN0ZWQgCi1pbiBKTkRJLgotCi0tLT4KLQotPCFFTEVNRU5UIGhpYmVybmF0ZS1jb25maWd1cmF0aW9uIChzZXNzaW9uLWZhY3RvcnkpPgotCi08IUVMRU1FTlQgcHJvcGVydHkgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHByb3BlcnR5IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgbWFwcGluZyBFTVBUWT4gPCEtLSByZWZlcmVuY2UgdG8gYSBtYXBwaW5nIGZpbGUgLS0+Ci08IUFUVExJU1QgbWFwcGluZyByZXNvdXJjZSBDREFUQSAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXBwaW5nIGZpbGUgQ0RBVEEgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFwcGluZyBqYXIgQ0RBVEEgI0lNUExJRUQ+Ci0KLTwhRUxFTUVOVCBqY3MtY2xhc3MtY2FjaGUgRU1QVFk+IDwhLS0gZGVwcmVjYXRlZCAtLT4KLTwhQVRUTElTVCBqY3MtY2xhc3MtY2FjaGUgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEPgotPCFBVFRMSVNUIGpjcy1jbGFzcy1jYWNoZSByZWdpb24gQ0RBVEEgI0lNUExJRUQ+Ci08IUFUVExJU1QgamNzLWNsYXNzLWNhY2hlIHVzYWdlIChyZWFkLW9ubHl8cmVhZC13cml0ZXxub25zdHJpY3QtcmVhZC13cml0ZSkgI1JFUVVJUkVEPgotCi08IUVMRU1FTlQgamNzLWNvbGxlY3Rpb24tY2FjaGUgRU1QVFk+IDwhLS0gZGVwcmVjYXRlZCAtLT4KLTwhQVRUTElTVCBqY3MtY29sbGVjdGlvbi1jYWNoZSBjb2xsZWN0aW9uIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBqY3MtY29sbGVjdGlvbi1jYWNoZSByZWdpb24gQ0RBVEEgI0lNUExJRUQ+Ci08IUFUVExJU1QgamNzLWNvbGxlY3Rpb24tY2FjaGUgdXNhZ2UgKHJlYWQtb25seXxyZWFkLXdyaXRlfG5vbnN0cmljdC1yZWFkLXdyaXRlfHRyYW5zYWN0aW9uYWwpICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIGNsYXNzLWNhY2hlIEVNUFRZPgotPCFBVFRMSVNUIGNsYXNzLWNhY2hlIGNsYXNzIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBjbGFzcy1jYWNoZSByZWdpb24gQ0RBVEEgI0lNUExJRUQ+Ci08IUFUVExJU1QgY2xhc3MtY2FjaGUgdXNhZ2UgKHJlYWQtb25seXxyZWFkLXdyaXRlfG5vbnN0cmljdC1yZWFkLXdyaXRlfHRyYW5zYWN0aW9uYWwpICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIGNvbGxlY3Rpb24tY2FjaGUgRU1QVFk+Ci08IUFUVExJU1QgY29sbGVjdGlvbi1jYWNoZSBjb2xsZWN0aW9uIENEQVRBICNSRVFVSVJFRD4KLTwhQVRUTElTVCBjb2xsZWN0aW9uLWNhY2hlIHJlZ2lvbiBDREFUQSAjSU1QTElFRD4KLTwhQVRUTElTVCBjb2xsZWN0aW9uLWNhY2hlIHVzYWdlIChyZWFkLW9ubHl8cmVhZC13cml0ZXxub25zdHJpY3QtcmVhZC13cml0ZXx0cmFuc2FjdGlvbmFsKSAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCBzZXNzaW9uLWZhY3RvcnkgKHByb3BlcnR5KiwgbWFwcGluZyssIChjbGFzcy1jYWNoZXxjb2xsZWN0aW9uLWNhY2hlfGpjcy1jbGFzcy1jYWNoZXxqY3MtY29sbGVjdGlvbi1jYWNoZSkqKT4KLTwhQVRUTElTVCBzZXNzaW9uLWZhY3RvcnkgbmFtZSBDREFUQSAjSU1QTElFRD4gPCEtLSB0aGUgSk5ESSBuYW1lIC0tPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLW1hcHBpbmctMi4wLmR0ZCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL2hpYmVybmF0ZS1tYXBwaW5nLTIuMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWZmYTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLW1hcHBpbmctMi4wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi08IS0tIEhpYmVybmF0ZSBNYXBwaW5nIERURC4KLQotPCFET0NUWVBFIGhpYmVybmF0ZS1tYXBwaW5nIFBVQkxJQyAKLQkiLS8vSGliZXJuYXRlL0hpYmVybmF0ZSBNYXBwaW5nIERURCAyLjAvL0VOIgotCSJodHRwOi8vaGliZXJuYXRlLnNvdXJjZWZvcmdlLm5ldC9oaWJlcm5hdGUtbWFwcGluZy0yLjAuZHRkIj4KLQotQW4gaW5zdGFuY2Ugb2YgdGhpcyBYTUwgZG9jdW1lbnQgbWF5IGNvbnRhaW4gbWFwcGluZ3MgZm9yIGFuIGFyYml0cmFyeSAKLW51bWJlciBvZiBjbGFzc2VzLiBUaGUgY2xhc3MgbWFwcGluZ3MgbWF5IGNvbnRhaW4gYXNzb2NpYXRpb25zIHRvIGNsYXNzZXMKLW1hcHBlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBpbiBhbm90aGVyIGRvY3VtZW50LiBObyBjbGFzcyBtYXkgYmUgCi1tYXBwZWQgbW9yZSB0aGFuIG9uY2UuIEVhY2ggZG9jdW1lbnQgbWF5IGFsc28gY29udGFpbiBkZWZpbml0aW9ucyBvZiBhbgotYXJiaXRyYXJ5IG51bWJlciBvZiBxdWVyaWVzLCBhbmQgaW1wb3J0IGRlY2xhcmF0aW9ucyBvZiBhcmJpdHJhcnkgY2xhc3Nlcy4gCi0KLS0tPgotCi08IS0tIFRoZSBkb2N1bWVudCByb290LiAtLT4KLQotPCFFTEVNRU5UIGhpYmVybmF0ZS1tYXBwaW5nIChtZXRhKiwgaW1wb3J0KiwgKGNsYXNzfHN1YmNsYXNzfGpvaW5lZC1zdWJjbGFzcykqLCBxdWVyeSosIHNxbC1xdWVyeSopPgotICA8IUFUVExJU1QgaGliZXJuYXRlLW1hcHBpbmcgc2NoZW1hIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBoaWJlcm5hdGUtbWFwcGluZyBkZWZhdWx0LWNhc2NhZGUgKG5vbmV8c2F2ZS11cGRhdGV8YWxsKSAibm9uZSI+Ci0gIDwhQVRUTElTVCBoaWJlcm5hdGUtbWFwcGluZyBkZWZhdWx0LWFjY2VzcyBDREFUQSAicHJvcGVydHkiPgotICA8IUFUVExJU1QgaGliZXJuYXRlLW1hcHBpbmcgYXV0by1pbXBvcnQgKHRydWV8ZmFsc2UpICJ0cnVlIj4KLSAgPCFBVFRMSVNUIGhpYmVybmF0ZS1tYXBwaW5nIHBhY2thZ2UgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICAKLTwhLS0gQW4gZXhwbGljaXQgcXVlcnkgbGFuZ3VhZ2UgImltcG9ydCIgLS0+Ci0KLTwhRUxFTUVOVCBpbXBvcnQgRU1QVFk+Ci0gIDwhQVRUTElTVCBpbXBvcnQgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgaW1wb3J0IHJlbmFtZSBDREFUQSAjSU1QTElFRD4gIDwhLS0gZGVmYXVsdDogdW5xdWFsaWZpZWQgY2xhc3MgbmFtZSAtLT4KLQotPCEtLSBSb290IG9mIGFuIGVudGl0eSBjbGFzcyBoaWVyYXJjaHkuIEVudGl0aWVzIGhhdmUgdGhlaXIgb3duIHRhYmxlcy4gLS0+Ci0KLTwhRUxFTUVOVCBjbGFzcyAoIAotICBtZXRhKiwKLSAgKGNhY2hlfGpjcy1jYWNoZSk/LAotICAoaWR8Y29tcG9zaXRlLWlkKSwKLSAgZGlzY3JpbWluYXRvcj8sCi0gICh2ZXJzaW9ufHRpbWVzdGFtcCk/LAotICAocHJvcGVydHl8bWFueS10by1vbmV8b25lLXRvLW9uZXxjb21wb25lbnR8ZHluYW1pYy1jb21wb25lbnR8YW55fG1hcHxzZXR8bGlzdHxiYWd8aWRiYWd8YXJyYXl8cHJpbWl0aXZlLWFycmF5KSosIAotICAoKHN1YmNsYXNzKil8KGpvaW5lZC1zdWJjbGFzcyopKQotKT4KLSAgPCFBVFRMSVNUIGNsYXNzIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgY2xhc3MgdGFibGUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiB1bnF1YWxpZmllZCBjbGFzc25hbWUgLS0+Ci0gIDwhQVRUTElTVCBjbGFzcyBzY2hlbWEgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBjbGFzcyBwcm94eSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vIHByb3h5IGludGVyZmFjZSAtLT4KLSAgPCFBVFRMSVNUIGNsYXNzIGRpc2NyaW1pbmF0b3ItdmFsdWUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgIDwhLS0gZGVmYXVsdDogdW5xdWFsaWZpZWQgY2xhc3MgbmFtZSB8IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBjbGFzcyBtdXRhYmxlICh0cnVlfGZhbHNlKSAidHJ1ZSI+Ci0gIDwhQVRUTElTVCBjbGFzcyBwb2x5bW9ycGhpc20gKGltcGxpY2l0fGV4cGxpY2l0KSAiaW1wbGljaXQiPgotICA8IUFUVExJU1QgY2xhc3Mgd2hlcmUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgY2xhc3MgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgY2xhc3MgZHluYW1pYy11cGRhdGUgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBjbGFzcyBkeW5hbWljLWluc2VydCAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGNsYXNzIGJhdGNoLXNpemUgQ0RBVEEgIjEiPgotICA8IUFUVExJU1QgY2xhc3Mgc2VsZWN0LWJlZm9yZS11cGRhdGUgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBjbGFzcyBvcHRpbWlzdGljLWxvY2sgKG5vbmV8dmVyc2lvbnxkaXJ0eXxhbGwpICJ2ZXJzaW9uIj4KLSAgPCFBVFRMSVNUIGNsYXNzIGxhenkgKHRydWV8ZmFsc2UpICNJTVBMSUVEPgotICA8IUFUVExJU1QgY2xhc3MgY2hlY2sgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotCi08IS0tIERlY2xhcmVzIHRoZSBpZCB0eXBlLCBjb2x1bW4gYW5kIGdlbmVyYXRpb24gYWxnb3JpdGhtIGZvciBhbiBlbnRpdHkgY2xhc3MuCi1JZiBhIG5hbWUgYXR0cmlidXQgaXMgZ2l2ZW4sIHRoZSBpZCBpcyBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSAKLW5hbWVkIHByb3BlcnR5IG9mIHRoZSBjbGFzcy4gSWYgbm90LCB0aGUgaWQgaXMgb25seSBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiAKLXZpYSBTZXNzaW9uLmdldElkZW50aWZpZXIoKSAtLT4KLQotPCFFTEVNRU5UIGlkIChtZXRhKiwgY29sdW1uKiwgZ2VuZXJhdG9yKT4KLSAgPCFBVFRMSVNUIGlkIG5hbWUgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBpZCBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBpZCBjb2x1bW4gQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBpZCB0eXBlIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgaWQgbGVuZ3RoIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgaWQgdW5zYXZlZC12YWx1ZSBDREFUQSAibnVsbCI+ICAgICAgICAgIDwhLS0gYW55fG5vbmV8bnVsbHwwfC0xfC4uLiAtLT4KLQotPCEtLSBBIGNvbXBvc2l0ZSBrZXkgbWF5IGJlIG1vZGVsbGVkIGJ5IGEgamF2YSBjbGFzcyB3aXRoIGEgcHJvcGVydHkgZm9yIGVhY2ggCi1rZXkgY29sdW1uLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YS5pby5TZXJpYWxpemFibGUgYW5kIHJlaW1wbGVtZW50IGVxdWFscygpIAotYW5kIGhhc2hDb2RlKCkuIC0tPgotCi08IUVMRU1FTlQgY29tcG9zaXRlLWlkICggbWV0YSosIChrZXktcHJvcGVydHl8a2V5LW1hbnktdG8tb25lKSsgKT4KLSAgPCFBVFRMSVNUIGNvbXBvc2l0ZS1pZCBjbGFzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGNvbXBvc2l0ZS1pZCBuYW1lIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgY29tcG9zaXRlLWlkIGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGNvbXBvc2l0ZS1pZCB1bnNhdmVkLXZhbHVlIChhbnl8bm9uZSkgIm5vbmUiPiAKLQotPCEtLSBQb2x5bW9ycGhpYyBkYXRhIHJlcXVpcmVzIGEgY29sdW1uIGhvbGRpbmcgYSBjbGFzcyBkaXNjcmltaW5hdG9yIHZhbHVlLiBUaGlzCi12YWx1ZSBpcyBub3QgZGlyZWN0bHkgZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24uIC0tPgotCi08IUVMRU1FTlQgZGlzY3JpbWluYXRvciAoY29sdW1uPyk+Ci0gIDwhQVRUTElTVCBkaXNjcmltaW5hdG9yIGNvbHVtbiBDREFUQSAjSU1QTElFRD4gICA8IS0tIGRlZmF1bHQ6ICJjbGFzcyJ8bm9uZSAtLT4KLSAgPCFBVFRMSVNUIGRpc2NyaW1pbmF0b3IgdHlwZSBDREFUQSAic3RyaW5nIj4KLSAgPCFBVFRMSVNUIGRpc2NyaW1pbmF0b3Igbm90LW51bGwgKHRydWV8ZmFsc2UpICJ0cnVlIj4KLSAgPCFBVFRMSVNUIGRpc2NyaW1pbmF0b3IgbGVuZ3RoIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgZGlzY3JpbWluYXRvciBmb3JjZSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGRpc2NyaW1pbmF0b3IgaW5zZXJ0ICh0cnVlfGZhbHNlKSAidHJ1ZSI+Ci0gIAotPCEtLSBWZXJzaW9uZWQgZGF0YSByZXF1aXJlcyBhIGNvbHVtbiBob2xkaW5nIGEgdmVyc2lvbiBudW1iZXIuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUKLWFwcGxpY2F0aW9uIHRocm91Z2ggYSBwcm9wZXJ0eSBvZiB0aGUgSmF2YSBjbGFzcy4gLS0+Ci0KLTwhRUxFTUVOVCB2ZXJzaW9uIChtZXRhKik+Ci0gIDwhQVRUTElTVCB2ZXJzaW9uIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgdmVyc2lvbiBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCB2ZXJzaW9uIGNvbHVtbiBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIHZlcnNpb24gdHlwZSBDREFUQSAiaW50ZWdlciI+Ci0gIDwhQVRUTElTVCB2ZXJzaW9uIHVuc2F2ZWQtdmFsdWUgKG51bGx8bmVnYXRpdmV8dW5kZWZpbmVkKSAidW5kZWZpbmVkIj4KLQotPCFFTEVNRU5UIHRpbWVzdGFtcCAobWV0YSopPgotICA8IUFUVExJU1QgdGltZXN0YW1wIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgdGltZXN0YW1wIGNvbHVtbiBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIHRpbWVzdGFtcCBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCB0aW1lc3RhbXAgdW5zYXZlZC12YWx1ZSAobnVsbHx1bmRlZmluZWQpICJudWxsIj4KLQotPCEtLSBTdWJjbGFzcyBkZWNsYXJhdGlvbnMgYXJlIG5lc3RlZCBiZW5lYXRoIHRoZSByb290IGNsYXNzIGRlY2xhcmF0aW9uIHRvIGFjaGlldmUKLXBvbHltb3JwaGljIHBlcnNpc3RlbmNlLiAtLT4KLQotPCFFTEVNRU5UIHN1YmNsYXNzICggCi0JbWV0YSosCi0JKHByb3BlcnR5fG1hbnktdG8tb25lfG9uZS10by1vbmV8Y29tcG9uZW50fGR5bmFtaWMtY29tcG9uZW50fGFueXxtYXB8c2V0fGxpc3R8YmFnfGlkYmFnfGFycmF5fHByaW1pdGl2ZS1hcnJheSkqLCAKLQlzdWJjbGFzcyoKLSk+Ci0gIDwhQVRUTElTVCBzdWJjbGFzcyBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIHN1YmNsYXNzIHByb3h5IENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vIHByb3h5IGludGVyZmFjZSAtLT4KLSAgPCFBVFRMSVNUIHN1YmNsYXNzIGRpc2NyaW1pbmF0b3ItdmFsdWUgQ0RBVEEgI0lNUExJRUQ+ICA8IS0tIGRlZmF1bHQ6IHVucXVhbGlmaWVkIGNsYXNzIG5hbWUgfCBub25lIC0tPgotICA8IUFUVExJU1Qgc3ViY2xhc3MgZHluYW1pYy11cGRhdGUgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBzdWJjbGFzcyBkeW5hbWljLWluc2VydCAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIHN1YmNsYXNzIHNlbGVjdC1iZWZvcmUtdXBkYXRlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1Qgc3ViY2xhc3MgZXh0ZW5kcyBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogZW1wdHkgd2hlbiBhIHRvcGxldmVsLCBvdGhlcndpc2UgdGhlIG5lYXJlc3QgY2xhc3MgZGVmaW5pdGlvbiAtLT4KLSAgPCFBVFRMSVNUIHN1YmNsYXNzIGxhenkgKHRydWV8ZmFsc2UpICNJTVBMSUVEPgotICA8IUFUVExJU1Qgc3ViY2xhc3MgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPgotCi08IS0tIEpvaW5lZCBzdWJjbGFzc2VzIGFyZSB1c2VkIGZvciB0aGUgbm9ybWFsaXplZCB0YWJsZS1wZXItc3ViY2xhc3MgbWFwcGluZyBzdHJhdGVneSAtLT4KLQotPCFFTEVNRU5UIGpvaW5lZC1zdWJjbGFzcyAoIAotCW1ldGEqLAotCWtleSwKLQkocHJvcGVydHl8bWFueS10by1vbmV8b25lLXRvLW9uZXxjb21wb25lbnR8ZHluYW1pYy1jb21wb25lbnR8YW55fG1hcHxzZXR8bGlzdHxiYWd8aWRiYWd8YXJyYXl8cHJpbWl0aXZlLWFycmF5KSosIAotCWpvaW5lZC1zdWJjbGFzcyoKLSk+Ci0gIDwhQVRUTElTVCBqb2luZWQtc3ViY2xhc3MgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBqb2luZWQtc3ViY2xhc3MgcHJveHkgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgPCEtLSBkZWZhdWx0OiBubyBwcm94eSBpbnRlcmZhY2UgLS0+Ci0gIDwhQVRUTElTVCBqb2luZWQtc3ViY2xhc3MgdGFibGUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgPCEtLSBkZWZhdWx0OiB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIC0tPgotICA8IUFUVExJU1Qgam9pbmVkLXN1YmNsYXNzIHNjaGVtYSBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGpvaW5lZC1zdWJjbGFzcyBkeW5hbWljLXVwZGF0ZSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGpvaW5lZC1zdWJjbGFzcyBkeW5hbWljLWluc2VydCAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGpvaW5lZC1zdWJjbGFzcyBzZWxlY3QtYmVmb3JlLXVwZGF0ZSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGpvaW5lZC1zdWJjbGFzcyBleHRlbmRzIENEQVRBICNJTVBMSUVEPiAgICAgICA8IS0tIGRlZmF1bHQ6IGVtcHR5IHdoZW4gYSB0b3BsZXZlbCwgb3RoZXJ3aXNlIHRoZSBuZWFyZXN0IGNsYXNzIGRlZmluaXRpb24gLS0+Ci0gIDwhQVRUTElTVCBqb2luZWQtc3ViY2xhc3MgbGF6eSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBqb2luZWQtc3ViY2xhc3MgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1Qgam9pbmVkLXN1YmNsYXNzIGNoZWNrIENEQVRBICNJTVBMSUVEPiAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgCi08IS0tIFByb3BlcnR5IG9mIGFuIGVudGl0eSBjbGFzcyBvciBjb21wb25lbnQsIGNvbXBvbmVudC1lbGVtZW50LCBjb21wb3NpdGUtaWQsIGV0Yy4gCi1KYXZhQmVhbnMgc3R5bGUgcHJvcGVydGllcyBhcmUgbWFwcGVkIHRvIHRhYmxlIGNvbHVtbnMuIC0tPgotCi08IUVMRU1FTlQgcHJvcGVydHkgKG1ldGEqLGNvbHVtbiopPgotICA8IUFUVExJU1QgcHJvcGVydHkgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBwcm9wZXJ0eSBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBwcm9wZXJ0eSB0eXBlIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgcHJvcGVydHkgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgcHJvcGVydHkgbGVuZ3RoIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgcHJvcGVydHkgbm90LW51bGwgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBwcm9wZXJ0eSB1bmlxdWUgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBwcm9wZXJ0eSB1cGRhdGUgKHRydWV8ZmFsc2UpICJ0cnVlIj4gICA8IS0tIG9ubHkgc3VwcG9ydGVkIGZvciBwcm9wZXJ0aWVzIG9mIGEgY2xhc3MgKG5vdCBjb21wb25lbnQpIC0tPgotICA8IUFUVExJU1QgcHJvcGVydHkgaW5zZXJ0ICh0cnVlfGZhbHNlKSAidHJ1ZSI+ICAgPCEtLSBvbmx5IHN1cHBvcnRlZCBmb3IgcHJvcGVydGllcyBvZiBhIGNsYXNzIChub3QgY29tcG9uZW50KSAtLT4KLSAgPCFBVFRMSVNUIHByb3BlcnR5IGZvcm11bGEgQ0RBVEEgI0lNUExJRUQ+ICAgICAgIDwhLS0gb25seSBzdXBwb3J0ZWQgZm9yIHByb3BlcnRpZXMgb2YgYSBjbGFzcyAobm90IGNvbXBvbmVudCkgLS0+Ci0gIDwhQVRUTElTVCBwcm9wZXJ0eSBpbmRleCBDREFUQSAjSU1QTElFRD4gICAgICAgICA8IS0tIGluY2x1ZGUgdGhlIGNvbHVtbnMgc3Bhbm5lZCBieSB0aGlzIHByb3BlcnR5IGluIGFuIGluZGV4IC0tPgotCi08IS0tIERlY2xhcmVzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIGVudGl0aWVzIChPciBmcm9tIGEgY29tcG9uZW50LCBjb21wb25lbnQgZWxlbWVudCwKLWV0Yy4gdG8gYW4gZW50aXR5KS4gLS0+Ci0KLTwhRUxFTUVOVCBtYW55LXRvLW9uZSAobWV0YSosY29sdW1uKik+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW9uZSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIG1hbnktdG8tb25lIGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIG1hbnktdG8tb25lIGNsYXNzIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgbWFueS10by1vbmUgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgbWFueS10by1vbmUgbm90LW51bGwgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW9uZSB1bmlxdWUgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW9uZSBjYXNjYWRlIChub25lfGFsbHxzYXZlLXVwZGF0ZXxkZWxldGUpICNJTVBMSUVEPiAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW9uZSBvdXRlci1qb2luICh0cnVlfGZhbHNlfGF1dG8pICJhdXRvIj4KLSAgPCFBVFRMSVNUIG1hbnktdG8tb25lIHVwZGF0ZSAodHJ1ZXxmYWxzZSkgInRydWUiPiAgIDwhLS0gb25seSBzdXBwb3J0ZWQgZm9yIG1hbnktdG8tb25lIG9mIGEgY2xhc3MgKG5vdCBjb21wb25lbnQpIC0tPgotICA8IUFUVExJU1QgbWFueS10by1vbmUgaW5zZXJ0ICh0cnVlfGZhbHNlKSAidHJ1ZSI+ICAgPCEtLSBvbmx5IHN1cHBvcnRlZCBmb3IgbWFueS10by1vbmUgb2YgYSBjbGFzcyAobm90IGNvbXBvbmVudCkgLS0+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW9uZSBmb3JlaWduLWtleSBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIG1hbnktdG8tb25lIHByb3BlcnR5LXJlZiBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIG1hbnktdG8tb25lIGluZGV4IENEQVRBICNJTVBMSUVEPiAgICAgICAgIDwhLS0gaW5jbHVkZSB0aGUgY29sdW1ucyBzcGFubmVkIGJ5IHRoaXMgYXNzb2NpYXRpb24gaW4gYW4gaW5kZXggLS0+Ci0gICAgCi08IS0tIERlY2xhcmVzIGEgb25lLXRvLW9uZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcyAoT3IgZnJvbSBhIGNvbXBvbmVudCwgCi1jb21wb25lbnQgZWxlbWVudCwgZXRjLiB0byBhbiBlbnRpdHkpLiAtLT4KLQotPCFFTEVNRU5UIG9uZS10by1vbmUgKG1ldGEqKT4KLSAgPCFBVFRMSVNUIG9uZS10by1vbmUgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBvbmUtdG8tb25lIGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIG9uZS10by1vbmUgY2xhc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBvbmUtdG8tb25lIGNhc2NhZGUgKG5vbmV8YWxsfHNhdmUtdXBkYXRlfGRlbGV0ZSkgI0lNUExJRUQ+ICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBvbmUtdG8tb25lIG91dGVyLWpvaW4gKHRydWV8ZmFsc2V8YXV0bykgImF1dG8iPgotICA8IUFUVExJU1Qgb25lLXRvLW9uZSBjb25zdHJhaW5lZCAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIG9uZS10by1vbmUgZm9yZWlnbi1rZXkgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBvbmUtdG8tb25lIHByb3BlcnR5LXJlZiBDREFUQSAjSU1QTElFRD4KLQotPCEtLSBBIHByb3BlcnR5IGVtYmVkZGVkIGluIGEgY29tcG9zaXRlIGlkZW50aWZpZXIgb3IgbWFwIGluZGV4IChhbHdheXMgbm90LW51bGwpLiAtLT4KLQotPCFFTEVNRU5UIGtleS1wcm9wZXJ0eSAobWV0YSosY29sdW1uKik+Ci0gIDwhQVRUTElTVCBrZXktcHJvcGVydHkgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBrZXktcHJvcGVydHkgYWNjZXNzIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1Qga2V5LXByb3BlcnR5IHR5cGUgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBrZXktcHJvcGVydHkgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1Qga2V5LXByb3BlcnR5IGxlbmd0aCBDREFUQSAjSU1QTElFRD4KLQotPCEtLSBBIG1hbnktdG8tb25lIGFzc29jaWF0aW9uIGVtYmVkZGVkIGluIGEgY29tcG9zaXRlIGlkZW50aWZpZXIgb3IgbWFwIGluZGV4IAotKGFsd2F5cyBub3QtbnVsbCwgbmV2ZXIgY2FzY2FkZSkuIC0tPgotCi08IUVMRU1FTlQga2V5LW1hbnktdG8tb25lIChtZXRhKixjb2x1bW4qKT4KLSAgPCFBVFRMSVNUIGtleS1tYW55LXRvLW9uZSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGtleS1tYW55LXRvLW9uZSBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBrZXktbWFueS10by1vbmUgY2xhc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBrZXktbWFueS10by1vbmUgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1Qga2V5LW1hbnktdG8tb25lIGZvcmVpZ24ta2V5IENEQVRBICNJTVBMSUVEPgotCi08IS0tIEFuICJhbnkiIGFzc29jaWF0aW9uIGlzIGEgcG9seW1vcnBoaWMgYXNzb2NpYXRpb24gdG8gYW55IHRhYmxlIHdpdGgKLXRoZSBnaXZlbiBpZGVudGlmaWVyIHR5cGUuIFRoZSBmaXJzdCBsaXN0ZWQgY29sdW1uIGlzIGEgVkFSQ0hBUiBjb2x1bW4gCi1ob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyAoZm9yIHRoYXQgcm93KS4gLS0+Ci0KLTwhRUxFTUVOVCBhbnkgKG1ldGEqLG1ldGEtdmFsdWUqLGNvbHVtbixjb2x1bW4rKT4KLSAgPCFBVFRMSVNUIGFueSBpZC10eXBlIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGFueSBtZXRhLXR5cGUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgIDwhLS0tIGRlZmF1bHQ6IEhpYmVybmF0ZS5DTEFTUyAtLT4KLSAgPCFBVFRMSVNUIGFueSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGFueSBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBhbnkgaW5zZXJ0ICh0cnVlfGZhbHNlKSAidHJ1ZSI+CQkJPCEtLSBvbmx5IHN1cHBvcnRlZCBmb3IgbWFueS10by1vbmUgb2YgYSBjbGFzcyAobm90IGNvbXBvbmVudCkgLS0+Ci0gIDwhQVRUTElTVCBhbnkgdXBkYXRlICh0cnVlfGZhbHNlKSAidHJ1ZSI+CQkJPCEtLSBvbmx5IHN1cHBvcnRlZCBmb3IgbWFueS10by1vbmUgb2YgYSBjbGFzcyAobm90IGNvbXBvbmVudCkgLS0+Ci0gIDwhQVRUTElTVCBhbnkgY2FzY2FkZSAobm9uZXxzYXZlLXVwZGF0ZXxhbGwpICJub25lIj4KLSAgPCFBVFRMSVNUIGFueSBpbmRleCBDREFUQSAjSU1QTElFRD4gICAgICAgICAgPCEtLSBpbmNsdWRlIHRoZSBjb2x1bW5zIHNwYW5uZWQgYnkgdGhpcyBhc3NvY2lhdGlvbiBpbiBhbiBpbmRleCAtLT4KLQotPCFFTEVNRU5UIG1ldGEtdmFsdWUgRU1QVFk+Ci0gIDwhQVRUTElTVCBtZXRhLXZhbHVlIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIG1ldGEtdmFsdWUgY2xhc3MgQ0RBVEEgI1JFUVVJUkVEPgotCi08IS0tIEEgY29tcG9uZW50IGlzIGEgdXNlci1kZWZpbmVkIGNsYXNzLCBwZXJzaXN0ZWQgYWxvbmcgd2l0aCBpdHMgY29udGFpbmluZyBlbnRpdHkKLXRvIHRoZSB0YWJsZSBvZiB0aGUgZW50aXR5IGNsYXNzLiBKYXZhQmVhbnMgc3R5bGUgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IGFyZQotbWFwcGVkIHRvIGNvbHVtbnMgb2YgdGhlIHRhYmxlIG9mIHRoZSBjb250YWluaW5nIGVudGl0eS4gQSBudWxsIGNvbXBvbmVudCByZWZlcmVuY2UKLWlzIG1hcHBlZCB0byBudWxsIHZhbHVlcyBpbiBhbGwgY29sdW1ucyBhbmQgdmljZSB2ZXJzYS4gQ29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydAotc2hhcmVkIHJlZmVyZW5jZSBzZW1hbnRpY3MuIC0tPgotCi08IUVMRU1FTlQgY29tcG9uZW50ICgKLSAgbWV0YSosCi0gIHBhcmVudD8sCi0gIChwcm9wZXJ0eXxtYW55LXRvLW9uZXxvbmUtdG8tb25lfGNvbXBvbmVudHxkeW5hbWljLWNvbXBvbmVudHxhbnl8bWFwfHNldHxsaXN0fGJhZ3xhcnJheXxwcmltaXRpdmUtYXJyYXkpKgotKT4KLSAgPCFBVFRMSVNUIGNvbXBvbmVudCBjbGFzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGNvbXBvbmVudCBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGNvbXBvbmVudCBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBjb21wb25lbnQgdXBkYXRlICh0cnVlfGZhbHNlKSAidHJ1ZSI+Ci0gIDwhQVRUTElTVCBjb21wb25lbnQgaW5zZXJ0ICh0cnVlfGZhbHNlKSAidHJ1ZSI+Ci0KLTwhRUxFTUVOVCBkeW5hbWljLWNvbXBvbmVudCAoCi0gIChwcm9wZXJ0eXxtYW55LXRvLW9uZXxvbmUtdG8tb25lfGNvbXBvbmVudHxkeW5hbWljLWNvbXBvbmVudHxhbnl8bWFwfHNldHxsaXN0fGJhZ3xhcnJheXxwcmltaXRpdmUtYXJyYXkpKgotKT4KLSAgPCFBVFRMSVNUIGR5bmFtaWMtY29tcG9uZW50IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgZHluYW1pYy1jb21wb25lbnQgYWNjZXNzIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgZHluYW1pYy1jb21wb25lbnQgdXBkYXRlICh0cnVlfGZhbHNlKSAidHJ1ZSI+Ci0gIDwhQVRUTElTVCBkeW5hbWljLWNvbXBvbmVudCBpbnNlcnQgKHRydWV8ZmFsc2UpICJ0cnVlIj4KLQotPCEtLSBUaGUgcGFyZW50IGVsZW1lbnQgbWFwcyBhIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgY2xhc3MgYXMgYSBwb2ludGVyIGJhY2sgdG8KLXRoZSBvd25pbmcgZW50aXR5LiAtLT4KLQotPCFFTEVNRU5UIHBhcmVudCBFTVBUWT4KLSAgPCFBVFRMSVNUIHBhcmVudCBuYW1lIENEQVRBICNSRVFVSVJFRD4KLQotPCEtLSBDb2xsZWN0aW9uIGRlY2xhcmF0aW9ucyBuZXN0ZWQgaW5zaWRlIGEgY2xhc3MgZGVjbGFyYXRpb24gaW5kaWNhdGUgYSBmb3JlaWduIGtleSAKLXJlbGF0aW9uc2hpcCBmcm9tIHRoZSBjb2xsZWN0aW9uIHRhYmxlIHRvIHRoZSBlbmNsb3NpbmcgY2xhc3MuIC0tPgotCi08IUVMRU1FTlQgbWFwICgKLQltZXRhKiwKLQkoY2FjaGV8amNzLWNhY2hlKT8sCi0Ja2V5LCAKLQkoaW5kZXh8Y29tcG9zaXRlLWluZGV4fGluZGV4LW1hbnktdG8tbWFueXxpbmRleC1tYW55LXRvLWFueSksIAotCShlbGVtZW50fG9uZS10by1tYW55fG1hbnktdG8tbWFueXxjb21wb3NpdGUtZWxlbWVudHxtYW55LXRvLWFueSkKLSk+Ci0gIDwhQVRUTElTVCBtYXAgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBtYXAgYWNjZXNzIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgbWFwIHRhYmxlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbmFtZSAtLT4KLSAgPCFBVFRMSVNUIG1hcCBzY2hlbWEgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBtYXAgbGF6eSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIG1hcCBpbnZlcnNlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1QgbWFwIHNvcnQgQ0RBVEEgInVuc29ydGVkIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdW5zb3J0ZWR8bmF0dXJhbHwiY29tcGFyYXRvciBjbGFzcyIsIGRlZmF1bHQ6IHVuc29ydGVkIC0tPgotICA8IUFUVExJU1QgbWFwIGNhc2NhZGUgKG5vbmV8YWxsfHNhdmUtdXBkYXRlfGRlbGV0ZXxhbGwtZGVsZXRlLW9ycGhhbnxkZWxldGUtb3JwaGFuKSAjSU1QTElFRD4gICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgbWFwIG9yZGVyLWJ5IENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIG1hcCB3aGVyZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBtYXAgYmF0Y2gtc2l6ZSBDREFUQSAiMSI+Ci0gIDwhQVRUTElTVCBtYXAgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBtYXAgY2hlY2sgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPiAgCi0gIDwhQVRUTElTVCBtYXAgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi08IUVMRU1FTlQgc2V0ICgKLQltZXRhKiwKLQkoY2FjaGV8amNzLWNhY2hlKT8sCi0Ja2V5LCAKLQkoZWxlbWVudHxvbmUtdG8tbWFueXxtYW55LXRvLW1hbnl8Y29tcG9zaXRlLWVsZW1lbnR8bWFueS10by1hbnkpCi0pPgotICA8IUFUVExJU1Qgc2V0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1Qgc2V0IGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIHNldCB0YWJsZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5hbWUgLS0+Ci0gIDwhQVRUTElTVCBzZXQgc2NoZW1hIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1Qgc2V0IGxhenkgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBzZXQgc29ydCBDREFUQSAidW5zb3J0ZWQiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB1bnNvcnRlZHxuYXR1cmFsfCJjb21wYXJhdG9yIGNsYXNzIiAtLT4KLSAgPCFBVFRMSVNUIHNldCBpbnZlcnNlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1Qgc2V0IGNhc2NhZGUgKG5vbmV8YWxsfHNhdmUtdXBkYXRlfGRlbGV0ZXxhbGwtZGVsZXRlLW9ycGhhbnxkZWxldGUtb3JwaGFuKSAjSU1QTElFRD4gICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1Qgc2V0IG9yZGVyLWJ5IENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIHNldCB3aGVyZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBzZXQgYmF0Y2gtc2l6ZSBDREFUQSAiMSI+Ci0gIDwhQVRUTElTVCBzZXQgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBzZXQgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgPCFBVFRMSVNUIHNldCBjaGVjayBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0KLTwhRUxFTUVOVCBiYWcgKAotCW1ldGEqLAotCShjYWNoZXxqY3MtY2FjaGUpPywKLQlrZXksIAotCShlbGVtZW50fG9uZS10by1tYW55fG1hbnktdG8tbWFueXxjb21wb3NpdGUtZWxlbWVudHxtYW55LXRvLWFueSkKLSk+Ci0gIDwhQVRUTElTVCBiYWcgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBiYWcgYWNjZXNzIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgYmFnIHRhYmxlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbmFtZSAtLT4KLSAgPCFBVFRMSVNUIGJhZyBzY2hlbWEgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBiYWcgbGF6eSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGJhZyBpbnZlcnNlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1QgYmFnIGNhc2NhZGUgKG5vbmV8YWxsfHNhdmUtdXBkYXRlfGRlbGV0ZXxhbGwtZGVsZXRlLW9ycGhhbnxkZWxldGUtb3JwaGFuKSAjSU1QTElFRD4gICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgYmFnIG9yZGVyLWJ5IENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGJhZyB3aGVyZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBiYWcgYmF0Y2gtc2l6ZSBDREFUQSAiMSI+Ci0gIDwhQVRUTElTVCBiYWcgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBiYWcgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICA8IUFUVExJU1QgYmFnIGNoZWNrIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLQotPCFFTEVNRU5UIGlkYmFnICgKLQltZXRhKiwKLQkoY2FjaGV8amNzLWNhY2hlKT8sCi0JY29sbGVjdGlvbi1pZCwKLQlrZXksIAotCShlbGVtZW50fG1hbnktdG8tbWFueXxjb21wb3NpdGUtZWxlbWVudHxtYW55LXRvLWFueSkKLSk+Ci0gIDwhQVRUTElTVCBpZGJhZyBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGlkYmFnIGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGlkYmFnIHRhYmxlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbmFtZSAtLT4KLSAgPCFBVFRMSVNUIGlkYmFnIHNjaGVtYSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGlkYmFnIGxhenkgKHRydWV8ZmFsc2UpICJmYWxzZSI+Ci0gIDwhQVRUTElTVCBpZGJhZyBjYXNjYWRlIChub25lfGFsbHxzYXZlLXVwZGF0ZXxkZWxldGV8YWxsLWRlbGV0ZS1vcnBoYW58ZGVsZXRlLW9ycGhhbikgI0lNUExJRUQ+ICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGlkYmFnIG9yZGVyLWJ5IENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGlkYmFnIHdoZXJlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGlkYmFnIGJhdGNoLXNpemUgQ0RBVEEgIjEiPgotICA8IUFUVExJU1QgaWRiYWcgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBpZGJhZyBwZXJzaXN0ZXIgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIDwhQVRUTElTVCBpZGJhZyBjaGVjayBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0KLTwhRUxFTUVOVCBsaXN0ICgKLQltZXRhKiwKLQkoY2FjaGV8amNzLWNhY2hlKT8sCi0Ja2V5LCAKLQlpbmRleCwgCi0JKGVsZW1lbnR8b25lLXRvLW1hbnl8bWFueS10by1tYW55fGNvbXBvc2l0ZS1lbGVtZW50fG1hbnktdG8tYW55KQotKT4KLSAgPCFBVFRMSVNUIGxpc3QgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBsaXN0IGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGxpc3QgdGFibGUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5hbWUgLS0+Ci0gIDwhQVRUTElTVCBsaXN0IHNjaGVtYSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgbGlzdCBsYXp5ICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1QgbGlzdCBpbnZlcnNlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotICA8IUFUVExJU1QgbGlzdCBjYXNjYWRlIChub25lfGFsbHxzYXZlLXVwZGF0ZXxkZWxldGV8YWxsLWRlbGV0ZS1vcnBoYW58ZGVsZXRlLW9ycGhhbikgI0lNUExJRUQ+ICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgbGlzdCB3aGVyZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGxpc3QgYmF0Y2gtc2l6ZSBDREFUQSAiMSI+Ci0gIDwhQVRUTElTVCBsaXN0IG91dGVyLWpvaW4gKHRydWV8ZmFsc2V8YXV0bykgImF1dG8iPgotICA8IUFUVExJU1QgbGlzdCBwZXJzaXN0ZXIgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgPCFBVFRMSVNUIGxpc3QgY2hlY2sgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0KLTwhRUxFTUVOVCBhcnJheSAoCi0JbWV0YSosCi0JKGNhY2hlfGpjcy1jYWNoZSk/LAotCWtleSwgCi0JaW5kZXgsIAotCShlbGVtZW50fG9uZS10by1tYW55fG1hbnktdG8tbWFueXxjb21wb3NpdGUtZWxlbWVudHxtYW55LXRvLWFueSkKLSk+Ci0gIDwhQVRUTElTVCBhcnJheSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGFycmF5IGFjY2VzcyBDREFUQSAjSU1QTElFRD4KLSAgPCFBVFRMSVNUIGFycmF5IHRhYmxlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5hbWUgLS0+Ci0gIDwhQVRUTElTVCBhcnJheSBzY2hlbWEgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgYXJyYXkgaW52ZXJzZSAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGFycmF5IGVsZW1lbnQtY2xhc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBhcnJheSBjYXNjYWRlIChub25lfGFsbHxzYXZlLXVwZGF0ZXxkZWxldGUpICNJTVBMSUVEPiAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotICA8IUFUVExJU1QgYXJyYXkgd2hlcmUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIGFycmF5IGJhdGNoLXNpemUgQ0RBVEEgIjEiPgotICA8IUFUVExJU1QgYXJyYXkgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBhcnJheSBwZXJzaXN0ZXIgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIDwhQVRUTElTVCBhcnJheSBjaGVjayBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotCi08IUVMRU1FTlQgcHJpbWl0aXZlLWFycmF5IChtZXRhKiwgKGNhY2hlfGpjcy1jYWNoZSk/LCBrZXksIGluZGV4LCBlbGVtZW50KT4KLSAgPCFBVFRMSVNUIHByaW1pdGl2ZS1hcnJheSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIHByaW1pdGl2ZS1hcnJheSBhY2Nlc3MgQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBwcmltaXRpdmUtYXJyYXkgdGFibGUgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBuYW1lIC0tPgotICA8IUFUVExJU1QgcHJpbWl0aXZlLWFycmF5IHNjaGVtYSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdDogbm9uZSAtLT4KLSAgPCFBVFRMSVNUIHByaW1pdGl2ZS1hcnJheSB3aGVyZSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IG5vbmUgLS0+Ci0gIDwhQVRUTElTVCBwcmltaXRpdmUtYXJyYXkgYmF0Y2gtc2l6ZSBDREFUQSAiMSI+Ci0gIDwhQVRUTElTVCBwcmltaXRpdmUtYXJyYXkgb3V0ZXItam9pbiAodHJ1ZXxmYWxzZXxhdXRvKSAiYXV0byI+Ci0gIDwhQVRUTElTVCBwcmltaXRpdmUtYXJyYXkgcGVyc2lzdGVyIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIDwhQVRUTElTVCBwcmltaXRpdmUtYXJyYXkgY2hlY2sgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotCi08IS0tIERlY2xhcmVzIHRoZSBlbGVtZW50IHR5cGUgb2YgYSBjb2xsZWN0aW9uIG9mIGJhc2ljIHR5cGUgLS0+Ci0KLTwhRUxFTUVOVCBlbGVtZW50IChjb2x1bW4qKT4KLSAgPCFBVFRMSVNUIGVsZW1lbnQgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgZWxlbWVudCB0eXBlIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGVsZW1lbnQgbGVuZ3RoIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgZWxlbWVudCBub3QtbnVsbCAodHJ1ZXxmYWxzZSkgImZhbHNlIj4KLSAgPCFBVFRMSVNUIGVsZW1lbnQgdW5pcXVlICh0cnVlfGZhbHNlKSAiZmFsc2UiPgotCi08IS0tIE9uZSB0byBtYW55IGFzc29jaWF0aW9uLiBUaGlzIHRhZyBkZWNsYXJlcyB0aGUgZW50aXR5LWNsYXNzCi1lbGVtZW50IHR5cGUgb2YgYSBjb2xsZWN0aW9uIGFuZCBzcGVjaWZpZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbmFsIG1vZGVsIC0tPgotCi08IUVMRU1FTlQgb25lLXRvLW1hbnkgRU1QVFk+Ci0gIDwhQVRUTElTVCBvbmUtdG8tbWFueSBjbGFzcyBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhLS0gTm8gY29sdW1uIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLiBUaGUgcHJpbWFyeQotICBrZXkgY29sdW1uIG9mIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIGFscmVhZHkgbWFwcGVkIGVsc2V3aGVyZS4tLT4KLQotPCEtLSBNYW55IHRvIG1hbnkgYXNzb2NpYXRpb24uIFRoaXMgdGFnIGRlY2xhcmVzIHRoZSBlbnRpdHktY2xhc3MKLWVsZW1lbnQgdHlwZSBvZiBhIGNvbGxlY3Rpb24gYW5kIHNwZWNpZmllcyBhIG1hbnktdG8tbWFueSByZWxhdGlvbmFsIG1vZGVsIC0tPgotCi08IUVMRU1FTlQgbWFueS10by1tYW55IChtZXRhKixjb2x1bW4qKT4KLSAgPCFBVFRMSVNUIG1hbnktdG8tbWFueSBjbGFzcyBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBtYW55LXRvLW1hbnkgY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgbWFueS10by1tYW55IG91dGVyLWpvaW4gKHRydWV8ZmFsc2V8YXV0bykgImF1dG8iPgotICA8IUFUVExJU1QgbWFueS10by1tYW55IGZvcmVpZ24ta2V5IENEQVRBICNJTVBMSUVEPgotICA8IS0tIHVuaXF1ZSBtYWtlcyBubyBzZW5zZSBoZXJlIHNpbmNlIGl0IHdvdWxkIG1ha2UgdGhlIGFzc29jaWF0aW9uIG9uZS10by1tYW55IC0tPgotCi08IS0tIEEgY29tcG9zaXRlIGVsZW1lbnQgYWxsb3dzIGEgY29sbGVjdGlvbiB0byBob2xkIGluc3RhbmNlcyBvZiBhbiBhcmJpdHJhcnkgCi1jbGFzcywgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnQgb2Ygam9pbmluZyB0byBhbiBlbnRpdHkgdGFibGUuIENvbXBvc2l0ZSBlbGVtZW50cwotaGF2ZSBjb21wb25lbnQgc2VtYW50aWNzIC0gbm8gc2hhcmVkIHJlZmVyZW5jZXMgYW5kIGFkIGhvYyBudWxsIHZhbHVlIHNlbWFudGljcy4gCi1Db21wb3NpdGUgZWxlbWVudHMgbWF5IG5vdCBob2xkIG5lc3RlZCBjb2xsZWN0aW9ucy4gLS0+Ci0KLTwhRUxFTUVOVCBjb21wb3NpdGUtZWxlbWVudCAoIAotICAobWV0YSopLAotICBwYXJlbnQ/LAotICAocHJvcGVydHl8bWFueS10by1vbmV8YW55fG5lc3RlZC1jb21wb3NpdGUtZWxlbWVudCkqIAotKT4KLSAgPCFBVFRMSVNUIGNvbXBvc2l0ZS1lbGVtZW50IGNsYXNzIENEQVRBICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIG5lc3RlZC1jb21wb3NpdGUtZWxlbWVudCAoIAotICAobWV0YSopLAotICBwYXJlbnQ/LAotICAocHJvcGVydHl8bWFueS10by1vbmV8YW55fG5lc3RlZC1jb21wb3NpdGUtZWxlbWVudCkqIAotKT4KLSAgPCFBVFRMSVNUIG5lc3RlZC1jb21wb3NpdGUtZWxlbWVudCBjbGFzcyBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBuZXN0ZWQtY29tcG9zaXRlLWVsZW1lbnQgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBuZXN0ZWQtY29tcG9zaXRlLWVsZW1lbnQgYWNjZXNzIENEQVRBICNJTVBMSUVEPgotICAKLTwhLS0gRGVjbGFyZXMgdGhlIGNvbHVtbiBuYW1lIG9mIGEgZm9yZWlnbiBrZXkuIC0tPgotCi08IUVMRU1FTlQga2V5IChjb2x1bW4qKT4KLSAgPCFBVFRMSVNUIGtleSBjb2x1bW4gQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBrZXkgZm9yZWlnbi1rZXkgQ0RBVEEgI0lNUExJRUQ+Ci0gIAotPCEtLSBEZWNsYXJlcyB0aGUgdHlwZSBhbmQgY29sdW1uIG1hcHBpbmcgZm9yIGEgY29sbGVjdGlvbiBpbmRleCAoYXJyYXkgb3IKLWxpc3QgaW5kZXgsIG9yIGtleSBvZiBhIG1hcCkuIC0tPgotCi08IUVMRU1FTlQgaW5kZXggKGNvbHVtbiopPgotICA8IUFUVExJU1QgaW5kZXggY29sdW1uIENEQVRBICNJTVBMSUVEPgotICA8IUFUVExJU1QgaW5kZXggdHlwZSBDREFUQSAjSU1QTElFRD4gICAgICA8IS0tIHJlcXVpcmVkIGZvciBtYXBzIC0tPgotICA8IUFUVExJU1QgaW5kZXggbGVuZ3RoIENEQVRBICNJTVBMSUVEPgotCi08IS0tIE1hbnkgdG8gbWFueSBhc3NvY2lhdGlvbiBtYXBwZWQgdG8gdGhlIGtleSBvZiBhIG1hcC4gaWUuIGEgbWFwIGtleWVkCi1vbiBlbnRpdGllcy4gLS0+Ci0KLTwhRUxFTUVOVCBpbmRleC1tYW55LXRvLW1hbnkgKGNvbHVtbiopPgotICA8IUFUVExJU1QgaW5kZXgtbWFueS10by1tYW55IGNsYXNzIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGluZGV4LW1hbnktdG8tbWFueSBjb2x1bW4gQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBpbmRleC1tYW55LXRvLW1hbnkgZm9yZWlnbi1rZXkgQ0RBVEEgI0lNUExJRUQ+Ci0KLTwhLS0gQ29tcG9zaXRlIGluZGV4IG9mIGEgbWFwIGllLiBhIG1hcCBrZXllZCBvbiBjb21wb25lbnRzLiAtLT4KLQotPCFFTEVNRU5UIGNvbXBvc2l0ZS1pbmRleCAoIChrZXktcHJvcGVydHl8a2V5LW1hbnktdG8tb25lKSsgKT4KLSAgPCFBVFRMSVNUIGNvbXBvc2l0ZS1pbmRleCBjbGFzcyBDREFUQSAjUkVRVUlSRUQ+Ci0KLTwhLS0gQSAibWFueSB0byBhbnkiIGRlZmluZXMgYSBwb2x5bW9ycGhpYyBhc3NvY2lhdGlvbiB0byBhbnkgdGFibGUgCi13aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyIHR5cGUuIFRoZSBmaXJzdCBsaXN0ZWQgY29sdW1uIGlzIGEgVkFSQ0hBUiBjb2x1bW4gCi1ob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyAoZm9yIHRoYXQgcm93KS4gLS0+Ci0KLTwhRUxFTUVOVCBtYW55LXRvLWFueSAobWV0YS12YWx1ZSosY29sdW1uLCBjb2x1bW4rKT4KLSAgPCFBVFRMSVNUIG1hbnktdG8tYW55IGlkLXR5cGUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgbWFueS10by1hbnkgbWV0YS10eXBlIENEQVRBICNJTVBMSUVEPiAgICAgICA8IS0tLSBkZWZhdWx0OiBIaWJlcm5hdGUuQ0xBU1MgLS0+Ci0KLTwhRUxFTUVOVCBpbmRleC1tYW55LXRvLWFueSAoY29sdW1uLCBjb2x1bW4rKT4KLSAgPCFBVFRMSVNUIGluZGV4LW1hbnktdG8tYW55IGlkLXR5cGUgQ0RBVEEgI1JFUVVJUkVEPgotICA8IUFUVExJU1QgaW5kZXgtbWFueS10by1hbnkgbWV0YS10eXBlIENEQVRBICNJTVBMSUVEPiAgICAgICA8IS0tLSBkZWZhdWx0OiBIaWJlcm5hdGUuQ0xBU1MgLS0+Ci0KLTwhRUxFTUVOVCBjb2xsZWN0aW9uLWlkIChtZXRhKiwgY29sdW1uKiwgZ2VuZXJhdG9yKT4KLSAgPCFBVFRMSVNUIGNvbGxlY3Rpb24taWQgY29sdW1uIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGNvbGxlY3Rpb24taWQgdHlwZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBjb2xsZWN0aW9uLWlkIGxlbmd0aCBDREFUQSAjSU1QTElFRD4KLSAgCi08IS0tIEdlbmVyYXRvcnMgZ2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXJzLiBUaGUgY2xhc3MgYXR0cmlidXRlIHNwZWNpZmllcyBhIEphdmEgCi1jbGFzcyBpbXBsZW1lbnRpbmcgYW4gaWQgZ2VuZXJhdGlvbiBhbGdvcml0aG0uIC0tPgotCi08IUVMRU1FTlQgZ2VuZXJhdG9yIChwYXJhbSopPgotICA8IUFUVExJU1QgZ2VuZXJhdG9yIGNsYXNzIENEQVRBICNSRVFVSVJFRD4KLTwhRUxFTUVOVCBwYXJhbSAoI1BDREFUQSk+Ci0gIDwhQVRUTElTVCBwYXJhbSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLQotPCEtLSBUaGUgY29sdW1uIGVsZW1lbnQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gY29sdW1uIGF0dHJpYnV0ZXMgYW5kIHJlcXVpcmVkIGZvciAKLW1hcHBpbmcgYXNzb2NpYXRpb25zIHRvIGNsYXNzZXMgd2l0aCBjb21wb3NpdGUgaWRzLiAtLT4KLQotPCFFTEVNRU5UIGNvbHVtbiBFTVBUWT4KLSAgPCFBVFRMSVNUIGNvbHVtbiBuYW1lIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIGNvbHVtbiBsZW5ndGggQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICA8IS0tIGRlZmF1bHQ6IDI1NSAtLT4KLSAgPCFBVFRMSVNUIGNvbHVtbiBub3QtbnVsbCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQ+ICAgICA8IS0tIGRlZmF1bHQ6IGZhbHNlIChleGNlcHQgZm9yIGlkIHByb3BlcnRpZXMpIC0tPgotICA8IUFUVExJU1QgY29sdW1uIHVuaXF1ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQ+ICAgICAgIDwhLS0gZGVmYXVsdDogZmFsc2UgKGV4Y2VwdCBmb3IgaWQgcHJvcGVydGllcykgLS0+Ci0gIDwhQVRUTElTVCBjb2x1bW4gdW5pcXVlLWtleSBDREFUQSAjSU1QTElFRD4gICAgICAgICAgPCEtLSBkZWZhdWx0OiBubyB1bmlxdWUga2V5IC0tPgotICA8IUFUVExJU1QgY29sdW1uIHNxbC10eXBlIENEQVRBICNJTVBMSUVEPiAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgZGVmYXVsdCBjb2x1bW4gdHlwZSBmb3IgaGliZXJuYXRlIHR5cGUgLS0+Ci0gIDwhQVRUTElTVCBjb2x1bW4gaW5kZXggQ0RBVEEgI0lNUExJRUQ+Ci0gIDwhQVRUTElTVCBjb2x1bW4gY2hlY2sgQ0RBVEEgI0lNUExJRUQ+ICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0OiBub25lIC0tPgotCi08IS0tIFRoZSBjYWNoZSBvciBqY3MtY2FjaGUgZWxlbWVudCBlbmFibGVzIGNhY2hpbmcgb2YgYW4gZW50aXR5IGNsYXNzLiAtLT4KLTwhRUxFTUVOVCBjYWNoZSBFTVBUWT4KLSAgPCFBVFRMSVNUIGNhY2hlIHVzYWdlIChyZWFkLW9ubHl8cmVhZC13cml0ZXxub25zdHJpY3QtcmVhZC13cml0ZXx0cmFuc2FjdGlvbmFsKSAjUkVRVUlSRUQ+ICAgICAgICAKLTwhRUxFTUVOVCBqY3MtY2FjaGUgRU1QVFk+Ci0gIDwhQVRUTElTVCBqY3MtY2FjaGUgdXNhZ2UgKHJlYWQtb25seXxyZWFkLXdyaXRlfG5vbnN0cmljdC1yZWFkLXdyaXRlfHRyYW5zYWN0aW9uYWwpICNSRVFVSVJFRD4gICAgICA8IS0tIGRlcHJlY2F0ZWQgLS0+ICAKLQotPCEtLSBUaGUgcXVlcnkgZWxlbWVudCBkZWNsYXJlcyBhIG5hbWVkIEhpYmVybmF0ZSBxdWVyeSBzdHJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBxdWVyeSAoI1BDREFUQSk+Ci0gIDwhQVRUTElTVCBxdWVyeSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLQotPCEtLSBUaGUgc3FsLXF1ZXJ5IGVsZW1lbnQgZGVjbGFyZXMgYSBuYW1lZCBTUUwgcXVlcnkgc3RyaW5nIC0tPgotCi08IUVMRU1FTlQgcmV0dXJuIEVNUFRZPgotICA8IUFUVExJU1QgcmV0dXJuIGFsaWFzIENEQVRBICNSRVFVSVJFRD4KLSAgPCFBVFRMSVNUIHJldHVybiBjbGFzcyBDREFUQSAjUkVRVUlSRUQ+Ci0KLTwhRUxFTUVOVCBzeW5jaHJvbml6ZSBFTVBUWT4KLSAgPCFBVFRMSVNUIHN5bmNocm9uaXplIHRhYmxlIENEQVRBICNSRVFVSVJFRD4KLQotPCFFTEVNRU5UIHNxbC1xdWVyeSAoI1BDREFUQXxyZXR1cm58c3luY2hyb25pemUpKj4KLSAgPCFBVFRMSVNUIHNxbC1xdWVyeSBuYW1lIENEQVRBICNSRVFVSVJFRD4KLQotICAKLTwhLS0gVGhlIG1ldGEgZWxlbWVudCBpcyB1c2VkIHRvIGFzc2lnbiBtZXRhLWxldmVsIGF0dHJpYnV0ZXMgdG8gYSBjbGFzcyBvciBwcm9wZXJ0eS4KLSBJcyBjdXJyZW50bHkgdXNlZCBieSBjb2RlZ2VuZXJhdG9yIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHZhbHVlcyB0aGF0IGlzIG5vdCBkaXJlY3RseQotIHJlbGF0ZWQgdG8gT1IgbWFwcGluZ3MuIC0tPgotCi08IUVMRU1FTlQgbWV0YSAoI1BDREFUQSk+Ci0gIDwhQVRUTElTVCBtZXRhIGF0dHJpYnV0ZSBDREFUQSAjUkVRVUlSRUQ+Ci0gIDwhQVRUTElTVCBtZXRhIGluaGVyaXQgKHRydWV8ZmFsc2UpICJ0cnVlIj4KLSAKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL2hpYmVybmF0ZS5jZmcueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLmNmZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGQxZjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvaGliZXJuYXRlLmNmZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGhpYmVybmF0ZS1jb25maWd1cmF0aW9uIFBVQkxJQyAiLS8vSGliZXJuYXRlL0hpYmVybmF0ZSBDb25maWd1cmF0aW9uIERURCAyLjAvL0VOIiAiaHR0cDovL2hpYmVybmF0ZS5zb3VyY2Vmb3JnZS5uZXQvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24tMi4wLmR0ZCI+Ci08aGliZXJuYXRlLWNvbmZpZ3VyYXRpb24+Ci0KLQk8IS0tIGEgU2Vzc2lvbkZhY3RvcnkgaW5zdGFuY2UgbGlzdGVkIGFzIC9qbmRpL25hbWUgLS0+Ci0JPHNlc3Npb24tZmFjdG9yeT4KLQkJPCEtLSBtYXBwaW5nIGZpbGVzIC0tPgotCQk8bWFwcGluZyByZXNvdXJjZT0ib3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9IaWJlcm5hdGVNYXBwZWRDbGFzcy5oYm0ueG1sIi8+Ci0JPC9zZXNzaW9uLWZhY3Rvcnk+Ci0KLTwvaGliZXJuYXRlLWNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9sb2c0ai5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2UvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxOWM1Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1sb2c0ai5yb290TG9nZ2VyPXRyYWNlLCBzdGRvdXQKLQotbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9EZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3NUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA1ODI4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9EZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW47Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkRlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkRlZmF1bHRHcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmV4Y2VwdGlvbnMuSW52YWxpZFByb3BlcnR5RXhjZXB0aW9uOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA2LUp1bC0yMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JcHJpdmF0ZSBDbGFzcyByZWxDbGFzczsKLQlwcml2YXRlIENsYXNzIG1hbnlUb01hbnlDbGFzczsKLQlwcml2YXRlIENsYXNzIG9uZVRvTWFueUNsYXNzOwotCXByaXZhdGUgQ2xhc3Mgb25lVG9PbmVDbGFzczsKLQkKLQkKLQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKLQkJCi0JCXJlbENsYXNzID0gY2wubG9hZENsYXNzKCAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlJlbGF0aW9uc2hpcHNUZXN0IiApOwotCQkKLQkJQ2xhc3NbXSBsb2FkZWRDbGFzc2VzID0gY2wuZ2V0TG9hZGVkQ2xhc3NlcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2FkZWRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihsb2FkZWRDbGFzc2VzW2ldLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5NYW55VG9NYW55VGVzdCIpICkgewotCQkJCW1hbnlUb01hbnlDbGFzcyA9IGxvYWRlZENsYXNzZXNbaV07Ci0JCQl9Ci0JCQllbHNlIGlmKGxvYWRlZENsYXNzZXNbaV0uZ2V0TmFtZSgpLmVxdWFscygib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLk9uZVRvTWFueVRlc3QyIikgKSB7Ci0JCQkJb25lVG9NYW55Q2xhc3MgPSBsb2FkZWRDbGFzc2VzW2ldOwotCQkJfQotCQkJZWxzZSBpZihsb2FkZWRDbGFzc2VzW2ldLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5PbmVUb09uZVRlc3QiKSApIHsKLQkJCQlvbmVUb09uZUNsYXNzID0gbG9hZGVkQ2xhc3Nlc1tpXTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzKCkKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCUNsYXNzIGNsYXp6ID0gY2wucGFyc2VDbGFzcygiY2xhc3MgVXNlclRlc3QgeyBAUHJvcGVydHkgaW50IGlkOyBAUHJvcGVydHkgaW50IHZlcnNpb247IEBQcm9wZXJ0eSBMaXN0IHRyYW5zaWVudHMgPSBbIFwiYWdlXCIgXTsgQFByb3BlcnR5IExpc3Qgb3B0aW9uYWxzICA9IFsgXCJsYXN0TmFtZVwiIF07IEBQcm9wZXJ0eSBTdHJpbmcgZmlyc3ROYW1lOyBAUHJvcGVydHkgU3RyaW5nIGxhc3ROYW1lOyBAUHJvcGVydHkgamF2YS51dGlsLkRhdGUgYWdlOyB9Iik7Ci0JCQkJCi0JCQotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IG5ldyBEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3MoY2xhenopOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIlVzZXJUZXN0Iixkb21haW5DbGFzcy5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChkb21haW5DbGFzcy5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnROb3ROdWxsKGRvbWFpbkNsYXNzLmdldFZlcnNpb24oKSk7Ci0JCWFzc2VydFRydWUoZG9tYWluQ2xhc3MuZ2V0SWRlbnRpZmllcigpLmlzSWRlbnRpdHkoKSk7Ci0JCQotCQl0cnkgewotCQkJZG9tYWluQ2xhc3MuZ2V0UHJvcGVydHlCeU5hbWUoInJ1YmJpc2giKTsKLQkJCWZhaWwoInNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKLQkJfQotCQljYXRjaChJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24gaXBlKSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JCQotCQlHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGFnZSA9IGRvbWFpbkNsYXNzLmdldFByb3BlcnR5QnlOYW1lKCAiYWdlIiApOwotCQlhc3NlcnROb3ROdWxsKGFnZSk7Ci0JCWFzc2VydEZhbHNlKGFnZS5pc1BlcnNpc3RhbnQoKSk7Ci0JCQotCQlHcmFpbHNEb21haW5DbGFzc1Byb3BlcnR5IGxhc3ROYW1lID0gZG9tYWluQ2xhc3MuZ2V0UHJvcGVydHlCeU5hbWUoICJsYXN0TmFtZSIgKTsKLQkJYXNzZXJ0Tm90TnVsbChsYXN0TmFtZSk7Ci0JCWFzc2VydFRydWUobGFzdE5hbWUuaXNPcHRpb25hbCgpKTsKLQkJCi0JCUdyYWlsc0RvbWFpbkNsYXNzUHJvcGVydHkgZmlyc3ROYW1lID0gZG9tYWluQ2xhc3MuZ2V0UHJvcGVydHlCeU5hbWUoICJmaXJzdE5hbWUiICk7Ci0JCWFzc2VydE5vdE51bGwoZmlyc3ROYW1lKTsKLQkJYXNzZXJ0RmFsc2UoZmlyc3ROYW1lLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydFRydWUoZmlyc3ROYW1lLmlzUGVyc2lzdGFudCgpKTsKLQkJCi0KLQkJR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIHBlcnNpc3RhbnRQcm9wZXJ0aWVzID0gZG9tYWluQ2xhc3MuZ2V0UGVyc2lzdGFudFByb3BlcnRpZXMoKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IHBlcnNpc3RhbnRQcm9wZXJ0aWVzLmxlbmd0aDtpKyspIHsKLQkJCWFzc2VydFRydWUocGVyc2lzdGFudFByb3BlcnRpZXNbaV0uaXNQZXJzaXN0YW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueVJlbGF0aW9uc2hpcHMoKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQkJCQkJCi0JCQkJCQkJCQkJCi0JCUdyYWlsc0FwcGxpY2F0aW9uIGdyYWlsc0FwcGxpY2F0aW9uID0gbmV3IERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbihuZXcgQ2xhc3NbXXsgcmVsQ2xhc3Msb25lVG9NYW55Q2xhc3Msb25lVG9PbmVDbGFzcyxtYW55VG9NYW55Q2xhc3MgfSxjbCk7Ci0JCQotCQlHcmFpbHNEb21haW5DbGFzcyBjMWRjID0gZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MocmVsQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJR3JhaWxzRG9tYWluQ2xhc3MgYzJkYyA9IGdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKG9uZVRvTWFueUNsYXNzLmdldE5hbWUoKSk7Ci0JCQotCQkvLyB0ZXN0IHJlbGF0aW9uc2hpcCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIGMxZGMuZ2V0UHJvcGVydHlCeU5hbWUoIm9uZXMiKS5nZXRPdGhlclNpZGUoKSwgYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSgib3RoZXIiKSApOwotCQlhc3NlcnRUcnVlKCBjMWRjLmdldFByb3BlcnR5QnlOYW1lKCAib25lcyIgKS5pc09uZVRvTWFueSgpICk7Ci0JCWFzc2VydFRydWUoIGMxZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvbmVzIiApLmlzUGVyc2lzdGFudCgpICk7Ci0JCWFzc2VydEZhbHNlKCBjMWRjLmdldFByb3BlcnR5QnlOYW1lKCAib25lcyIgKS5pc01hbnlUb01hbnkoKSApOwotCQlhc3NlcnRGYWxzZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm9uZXMiICkuaXNNYW55VG9PbmUoKSApOwotCQlhc3NlcnRGYWxzZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm9uZXMiICkuaXNPbmVUb09uZSgpICk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSgib3RoZXIiKS5nZXRPdGhlclNpZGUoKSwgYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSgib25lcyIpICk7Ci0JCWFzc2VydFRydWUoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc1BlcnNpc3RhbnQoKSApOwotCQlhc3NlcnRUcnVlKCBjMmRjLmdldFByb3BlcnR5QnlOYW1lKCAib3RoZXIiICkuaXNNYW55VG9PbmUoKSApOwkKLQkJYXNzZXJ0RmFsc2UoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc01hbnlUb01hbnkoKSApOwotCQlhc3NlcnRGYWxzZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm90aGVyIiApLmlzT25lVG9PbmUoKSApOwotCQlhc3NlcnRGYWxzZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm90aGVyIiApLmlzT25lVG9NYW55KCkgKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55UmVsYXRpb25zaGlwcygpCi0JCXRocm93cyBFeGNlcHRpb24gewotCQkKLQotCQkKLQkJR3JhaWxzRG9tYWluQ2xhc3MgYzFkYyA9IG5ldyBEZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3MocmVsQ2xhc3MpOwotCQlHcmFpbHNEb21haW5DbGFzcyBjMmRjID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5DbGFzcyhtYW55VG9NYW55Q2xhc3MpOwotCQkKLQkJLy8gdGVzdCByZWxhdGlvbnNoaXBzCi0JCWFzc2VydFRydWUoIGMxZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJtYW55cyIgKS5pc1BlcnNpc3RhbnQoKSApOwotCQlhc3NlcnRUcnVlKCBjMWRjLmdldFByb3BlcnR5QnlOYW1lKCAibWFueXMiICkuaXNNYW55VG9NYW55KCkgKTsJCQotCQlhc3NlcnRGYWxzZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm1hbnlzIiApLmlzT25lVG9NYW55KCkgKTsKLQkJYXNzZXJ0RmFsc2UoIGMxZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJtYW55cyIgKS5pc01hbnlUb09uZSgpICk7Ci0JCWFzc2VydEZhbHNlKCBjMWRjLmdldFByb3BlcnR5QnlOYW1lKCAibWFueXMiICkuaXNPbmVUb09uZSgpICk7CQkJCi0JCQotCQlhc3NlcnRUcnVlKCBjMmRjLmdldFByb3BlcnR5QnlOYW1lKCAibWFueXMiICkuaXNQZXJzaXN0YW50KCkgKTsKLQkJYXNzZXJ0VHJ1ZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm1hbnlzIiApLmlzTWFueVRvTWFueSgpICk7Ci0JCWFzc2VydEZhbHNlKCBjMmRjLmdldFByb3BlcnR5QnlOYW1lKCAibWFueXMiICkuaXNNYW55VG9PbmUoKSApOwotCQlhc3NlcnRGYWxzZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm1hbnlzIiApLmlzT25lVG9PbmUoKSApOwotCQlhc3NlcnRGYWxzZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm1hbnlzIiApLmlzT25lVG9NYW55KCkgKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVSZWxhdGlvbnNoaXBzKCkgCi0JCXRocm93cyBFeGNlcHRpb24gewotCQlHcmFpbHNEb21haW5DbGFzcyBjMWRjID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5DbGFzcyhyZWxDbGFzcyk7Ci0JCUdyYWlsc0RvbWFpbkNsYXNzIGMyZGMgPSBuZXcgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzKG9uZVRvT25lQ2xhc3MpOwkJCi0JCQotCQkvLyB0ZXN0IHJlbGF0aW9uc2hpcHMKLQkJYXNzZXJ0VHJ1ZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm9uZSIgKS5pc1BlcnNpc3RhbnQoKSApOwkJCi0JCWFzc2VydFRydWUoIGMxZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvbmUiICkuaXNPbmVUb09uZSgpICk7CQotCQlhc3NlcnRGYWxzZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm9uZSIgKS5pc01hbnlUb01hbnkoKSApOwotCQlhc3NlcnRGYWxzZSggYzFkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm9uZSIgKS5pc01hbnlUb09uZSgpICk7Ci0JCWFzc2VydEZhbHNlKCBjMWRjLmdldFByb3BlcnR5QnlOYW1lKCAib25lIiApLmlzT25lVG9NYW55KCkgKTsKLQkJCi0JCWFzc2VydFRydWUoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc1BlcnNpc3RhbnQoKSApOwkJCi0JCWFzc2VydFRydWUoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc09uZVRvT25lKCkgKTsKLQkJYXNzZXJ0RmFsc2UoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc01hbnlUb01hbnkoKSApOwotCQlhc3NlcnRGYWxzZSggYzJkYy5nZXRQcm9wZXJ0eUJ5TmFtZSggIm90aGVyIiApLmlzTWFueVRvT25lKCkgKTsKLQkJYXNzZXJ0RmFsc2UoIGMyZGMuZ2V0UHJvcGVydHlCeU5hbWUoICJvdGhlciIgKS5pc09uZVRvTWFueSgpICk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9NYW55VG9NYW55VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vTWFueVRvTWFueVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWYzMzM1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9NYW55VG9NYW55VGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluOwotCi1jbGFzcyBNYW55VG9NYW55VGVzdCB7Ci0vLyAgIEBQcm9wZXJ0eSBNYXAgcmVsYXRpb25zaGlwcyA9IFsgIm1hbnlzIiA6IFJlbGF0aW9uc2hpcHNUZXN0LmNsYXNzIF07Ci0gICBAUHJvcGVydHkgTG9uZyBpZDsKLSAgIEBQcm9wZXJ0eSBMb25nIHZlcnNpb247Ci0gICAvL0BQcm9wZXJ0eSBTZXQgbWFueXM7IAotICAgLy8gbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vT25lVG9NYW55VGVzdDIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL09uZVRvTWFueVRlc3QyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZWJlNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vT25lVG9NYW55VGVzdDIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbjsKLQotY2xhc3MgT25lVG9NYW55VGVzdDIgewotCi0gICBAUHJvcGVydHkgaW50IGlkOwotICAgQFByb3BlcnR5IGludCB2ZXJzaW9uOwotICAgQFByb3BlcnR5IFJlbGF0aW9uc2hpcHNUZXN0IG90aGVyOyAvLyBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9PbmVUb09uZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL09uZVRvT25lVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDM0MDMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL09uZVRvT25lVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluOwotCi1jbGFzcyBPbmVUb09uZVRlc3QgewotCQotICAgQFByb3BlcnR5IExvbmcgaWQ7Ci0gICBAUHJvcGVydHkgTG9uZyB2ZXJzaW9uOwotICAgCi0gICBAUHJvcGVydHkgUmVsYXRpb25zaGlwc1Rlc3Qgb3RoZXIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vUmVsYXRpb25zaGlwc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL1JlbGF0aW9uc2hpcHNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmNTExOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vUmVsYXRpb25zaGlwc1Rlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW47Ci0KLWNsYXNzIFJlbGF0aW9uc2hpcHNUZXN0IHsKLSAgQFByb3BlcnR5IHJlbGF0aW9uc2hpcHMgPSBbIAkib25lcyIgOiBPbmVUb01hbnlUZXN0Mi5jbGFzcywKLSAgCQkJCQkJCQkibWFueXMiIDogTWFueVRvTWFueVRlc3QuY2xhc3MsCi0gIAkJCQkJCQkJInVuaW9uZXMiIDogVW5pT25lVG9NYW55VGVzdC5jbGFzcyBdOwotCi0gIEBQcm9wZXJ0eSBvcHRpb25hbHMgPSBbICJvbmVzIiwidW5pb25lcyIgXQotICAgCi0gICBAUHJvcGVydHkgTG9uZyBpZDsKLSAgIEBQcm9wZXJ0eSBMb25nIHZlcnNpb247Ci0KLSAgIEBQcm9wZXJ0eSBTZXQgbWFueXM7IC8vIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAKLSAgIEBQcm9wZXJ0eSBPbmVUb09uZVRlc3Qgb25lOyAvLyB1bmktZGlyZWN0aW9uYWwgb25lLXRvLW9uZQotICAgQFByb3BlcnR5IFNldCBvbmVzOyAvLyBiaS1kaXJlY3Rpb25hbCBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgICAgCi0gICBAUHJvcGVydHkgU2V0IHVuaW9uZXM7IC8vIHVuaS1kaXJlY3Rpb25hbCBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgICAgICAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL1Rlc3QxLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9UZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2YwOWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL1Rlc3QxLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluOwotCi1jbGFzcyBUZXN0MSB7IAotCUBQcm9wZXJ0eSBMb25nIGlkOyAKLQlAUHJvcGVydHkgTG9uZyB2ZXJzaW9uOyAKLQkvL0BQcm9wZXJ0eSBMaXN0IHRyYW5zaWVudCA9IFsgImFnZSIgXTsgCi0JLy9AUHJvcGVydHkgTGlzdCBvcHRpb25hbCAgPSBbICJsYXN0TmFtZSIgXTsgCi0JQFByb3BlcnR5IFN0cmluZyBmaXJzdE5hbWU7IAotCS8vQFByb3BlcnR5IFN0cmluZyBsYXN0TmFtZTsgCi0JLy9AUHJvcGVydHkgamF2YS51dGlsLkRhdGUgYWdlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9UZXN0Mi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vVGVzdDIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU1MWZmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL2RvbWFpbi9UZXN0Mi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluOwotCi1jbGFzcyBUZXN0MiB7IAotCUBQcm9wZXJ0eSBMb25nIGlkOyAKLQlAUHJvcGVydHkgTG9uZyB2ZXJzaW9uOyAKLQlAUHJvcGVydHkgU3RyaW5nIGZpcnN0TmFtZTsgCi0JQFByb3BlcnR5IFN0cmluZyBsYXN0TmFtZTsgCi0JQFByb3BlcnR5IGphdmEudXRpbC5EYXRlIGFnZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vVW5pT25lVG9NYW55VGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9kb21haW4vVW5pT25lVG9NYW55VGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmMwNTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvZG9tYWluL1VuaU9uZVRvTWFueVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbjsKLQotY2xhc3MgVW5pT25lVG9NYW55VGVzdCB7Ci0KLSAgIEBQcm9wZXJ0eSBpbnQgaWQ7Ci0gICBAUHJvcGVydHkgaW50IHZlcnNpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9HcmFpbHNIaWJlcm5hdGVDb25maWd1cmF0aW9uVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvR3JhaWxzSGliZXJuYXRlQ29uZmlndXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDRlYTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9HcmFpbHNIaWJlcm5hdGVDb25maWd1cmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGU7Ci0KLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuY2ZnLkRlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuSGliZXJuYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5oaWJlcm5hdGUuU2Vzc2lvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuSGliZXJuYXRlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5IaWJlcm5hdGVUZW1wbGF0ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm9ybS5oaWJlcm5hdGUzLlNlc3Npb25GYWN0b3J5VXRpbHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5TZXNzaW9uSG9sZGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5BYnN0cmFjdERlcGVuZGVuY3lJbmplY3Rpb25TcHJpbmdDb250ZXh0VGVzdHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5zdXBwb3J0LlRyYW5zYWN0aW9uU3luY2hyb25pemF0aW9uTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAwOC1KdWwtMjAwNQotICovCi1wdWJsaWMgY2xhc3MgR3JhaWxzSGliZXJuYXRlQ29uZmlndXJhdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3REZXBlbmRlbmN5SW5qZWN0aW9uU3ByaW5nQ29udGV4dFRlc3RzICB7Ci0JR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLQkKLQkKLQlwcm90ZWN0ZWQgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb24gPSBudWxsOwotCXByb3RlY3RlZCBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0JCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29uZmlnTG9jYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLWhpYmVybmF0ZS1jb25maWd1cmF0aW9uLXRlc3RzLnhtbCIgfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgb25TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7Ci0JCQotCQljbC5sb2FkQ2xhc3MoICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uUmVsYXRpb25zaGlwc1Rlc3QiICk7Ci0JCWNsLmxvYWRDbGFzcyggIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5UZXN0MSIgKTsKLQkJY2wubG9hZENsYXNzKCAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlRlc3QyIiApOwotCQkKLQkJQ2xhc3NbXSBsb2FkZWRDbGFzc2VzID0gY2wuZ2V0TG9hZGVkQ2xhc3NlcygpOwotCQlncmFpbHNBcHBsaWNhdGlvbiA9IG5ldyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb24obG9hZGVkQ2xhc3NlcyxjbCk7Ci0JCQotCi0JCURlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBEZWZhdWx0R3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0R3JhaWxzQXBwbGljYXRpb24odGhpcy5ncmFpbHNBcHBsaWNhdGlvbik7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlwcm9wcy5wdXQoImhpYmVybmF0ZS5jb25uZWN0aW9uLnVzZXJuYW1lIiwic2EiKTsKLQkJcHJvcHMucHV0KCJoaWJlcm5hdGUuY29ubmVjdGlvbi5wYXNzd29yZCIsIiIpOwotCQlwcm9wcy5wdXQoImhpYmVybmF0ZS5jb25uZWN0aW9uLnVybCIsImpkYmM6aHNxbGRiOm1lbTpncmFpbHNEQiIpOwotCQlwcm9wcy5wdXQoImhpYmVybmF0ZS5jb25uZWN0aW9uLmRyaXZlcl9jbGFzcyIsIm9yZy5oc3FsZGIuamRiY0RyaXZlciIpOwotCQlwcm9wcy5wdXQoImhpYmVybmF0ZS5kaWFsZWN0Iiwib3JnLmhpYmVybmF0ZS5kaWFsZWN0LkhTUUxEaWFsZWN0Iik7Ci0JCXByb3BzLnB1dCgiaGliZXJuYXRlLmhibTJkZGwuYXV0byIsImNyZWF0ZS1kcm9wIik7Ci0JCQotCQkvL3Byb3BzLnB1dCgiaGliZXJuYXRlLmhibTJkZGwuYXV0byIsInVwZGF0ZSIpOwkJCi0JCWNvbmZpZy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQkJLy9vcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhpcy5jbCk7CQkKLQkJdGhpcy5zZXNzaW9uRmFjdG9yeSA9IGNvbmZpZy5idWlsZFNlc3Npb25GYWN0b3J5KCk7Ci0JCQotCQkKLQkJCQotCQlpZighVHJhbnNhY3Rpb25TeW5jaHJvbml6YXRpb25NYW5hZ2VyLmhhc1Jlc291cmNlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpKSB7Ci0JCQlTZXNzaW9uIGhpYlNlc3Npb24gPSB0aGlzLnNlc3Npb25GYWN0b3J5Lm9wZW5TZXNzaW9uKCk7Ci0JCSAgICBUcmFuc2FjdGlvblN5bmNocm9uaXphdGlvbk1hbmFnZXIuYmluZFJlc291cmNlKHRoaXMuc2Vzc2lvbkZhY3RvcnksIG5ldyBTZXNzaW9uSG9sZGVyKGhpYlNlc3Npb24pKTsKLQkJfQkJCi0JCQotCX0JCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5BYnN0cmFjdERlcGVuZGVuY3lJbmplY3Rpb25TcHJpbmdDb250ZXh0VGVzdHMjb25UZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb25UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZihUcmFuc2FjdGlvblN5bmNocm9uaXphdGlvbk1hbmFnZXIuaGFzUmVzb3VyY2UodGhpcy5zZXNzaW9uRmFjdG9yeSkpIHsKLQkJICAgIFNlc3Npb25Ib2xkZXIgaG9sZGVyID0gKFNlc3Npb25Ib2xkZXIpIFRyYW5zYWN0aW9uU3luY2hyb25pemF0aW9uTWFuYWdlci5nZXRSZXNvdXJjZSh0aGlzLnNlc3Npb25GYWN0b3J5KTsKLQkJICAgIFNlc3Npb24gcyA9IGhvbGRlci5nZXRTZXNzaW9uKCk7IAotCQkgICAgcy5mbHVzaCgpOwotCQkgICAgVHJhbnNhY3Rpb25TeW5jaHJvbml6YXRpb25NYW5hZ2VyLnVuYmluZFJlc291cmNlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotCQkgICAgU2Vzc2lvbkZhY3RvcnlVdGlscy5yZWxlYXNlU2Vzc2lvbihzLCB0aGlzLnNlc3Npb25GYWN0b3J5KTsJCQkJCi0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHcmFpbHNEb21haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJR3JhaWxzRG9tYWluQ2xhc3NbXSBkb21haW5DbGFzc2VzID0gZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3NlcygpOwotCQlhc3NlcnRFcXVhbHMoNyxkb21haW5DbGFzc2VzLmxlbmd0aCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaWJlcm5hdGVTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNlc3Npb25GYWN0b3J5KTsKLQkJCi0JCUhpYmVybmF0ZVRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IEhpYmVybmF0ZVRlbXBsYXRlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotCQlHcm9vdnlPYmplY3Qgb2JqID0gKEdyb292eU9iamVjdClncmFpbHNBcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcygib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlRlc3QxIikubmV3SW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChvYmopOwotCQkKLQkJb2JqLnNldFByb3BlcnR5KCJmaXJzdE5hbWUiLCAiSm9lIik7Ci0JCW9iai5zZXRQcm9wZXJ0eSgiaWQiLG5ldyBMb25nKDEpKTsKLQkJLy9vYmouc2V0UHJvcGVydHkoImxhc3ROYW1lIiwgIkJsb2dncyIpOwotCQl0ZW1wbGF0ZS5zYXZlKCBvYmogKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpYmVybmF0ZUxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCQotCQlIaWJlcm5hdGVUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBIaWJlcm5hdGVUZW1wbGF0ZSh0aGlzLnNlc3Npb25GYWN0b3J5KTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmogPSAoR3Jvb3Z5T2JqZWN0KWdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uVGVzdDEiKS5uZXdJbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKG9iaik7Ci0JCQotCQlvYmouc2V0UHJvcGVydHkoImZpcnN0TmFtZSIsICJKb2UiKTsKLQkJb2JqLnNldFByb3BlcnR5KCJpZCIsbmV3IExvbmcoMSkpOwotCQkvL29iai5zZXRQcm9wZXJ0eSgibGFzdE5hbWUiLCAiQmxvZ2dzIik7Ci0JCXRlbXBsYXRlLnNhdmUoIG9iaiApOwotCQkKLQkJb2JqID0gKEdyb292eU9iamVjdCl0ZW1wbGF0ZS5leGVjdXRlKG5ldyBIaWJlcm5hdGVDYWxsYmFjaygpIHsKLQotCQkJcHVibGljIE9iamVjdCBkb0luSGliZXJuYXRlKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEhpYmVybmF0ZUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLQkJCQkvLyBjcmVhdGUgcXVlcnkgYmFzZWQgb24gY2lkIGFuZCBsaXN0IHJlc3VsdHMKLQkJCQlMaXN0IHJlc3VsdHMgPSBzZXNzaW9uLmNyZWF0ZVF1ZXJ5KCJmcm9tIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5UZXN0MSB3aGVyZSBpZCA9ICcxJyIpLmxpc3QoKTsKLQkJCQkvLyBpZiB0aGVyZSBhcmUgcmVzdWx0cyByZXR1cm4gb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JCQkJaWYocmVzdWx0cy5zaXplKCkgPiAwKSB7Ci0JCQkJCXJldHVybiByZXN1bHRzLmdldCgwKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0KLQkJCi0JCWFzc2VydE5vdE51bGwob2JqKTsKLQkJYXNzZXJ0RXF1YWxzKCJKb2UiLG9iai5nZXRQcm9wZXJ0eSgiZmlyc3ROYW1lIikpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGliZXJuYXRlT25lVG9PbmUoKSB7Ci0KLQkJSGliZXJuYXRlVGVtcGxhdGUgdGVtcGxhdGUgPSBuZXcgSGliZXJuYXRlVGVtcGxhdGUodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JCUdyb292eU9iamVjdCBwYXJlbnQgPSAoR3Jvb3Z5T2JqZWN0KWdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlJlbGF0aW9uc2hpcHNUZXN0IiApLm5ld0luc3RhbmNlKCk7Ci0JCUdyb292eU9iamVjdCBjaGlsZCA9IChHcm9vdnlPYmplY3QpZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uT25lVG9PbmVUZXN0IiApLm5ld0luc3RhbmNlKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNoaWxkKTsKLQkJCi0JCXBhcmVudC5zZXRQcm9wZXJ0eSgib25lIiwgY2hpbGQpOwotCQkKLQkJdGVtcGxhdGUuc2F2ZShwYXJlbnQpOwkJCi0JCS8vIFRPRE8gVGVzdCBsb2FkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmFjayBmcm9tIGhpYmVybmF0ZQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGliZXJuYXRlVW5pT25lVG9NYW55KCkgewotCQlHcmFpbHNEb21haW5DbGFzcyBvbmUyTWFueURvbWFpbiA9IGdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlJlbGF0aW9uc2hpcHNUZXN0IiApOwotCQlHcm9vdnlPYmplY3Qgb25lMm1hbnkgPSAoR3Jvb3Z5T2JqZWN0KW9uZTJNYW55RG9tYWluLm5ld0luc3RhbmNlKCk7Ci0KLQkJCi0JCUdyb292eU9iamVjdCBjaGlsZCA9IChHcm9vdnlPYmplY3QpZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uVW5pT25lVG9NYW55VGVzdCIgKS5uZXdJbnN0YW5jZSgpOwotCQkKLQkJSGliZXJuYXRlVGVtcGxhdGUgdGVtcGxhdGUgPSBuZXcgSGliZXJuYXRlVGVtcGxhdGUodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JCQotCQkKLQkJYXNzZXJ0Tm90TnVsbChjaGlsZCk7Ci0JCQkJCQkJCQkKLQkJLy8gY3JlYXRlIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcAotCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsJCQotCQlvbmUybWFueS5zZXRQcm9wZXJ0eSgidW5pb25lcyIsIHNldCk7CQkKLQkJKChTZXQpb25lMm1hbnkuZ2V0UHJvcGVydHkoInVuaW9uZXMiKSkuYWRkKCBjaGlsZCApOwotCQkKLQkJLy8gcGVyc2lzdAotCQl0ZW1wbGF0ZS5zYXZlKG9uZTJtYW55KTsKLQkJdGVtcGxhdGUuZXZpY3Qob25lMm1hbnkpOwotCQkKLQkJb25lMm1hbnkgPSBudWxsOwotCQkvLyBub3cgZ2V0IGl0IGJhY2sgYW5kIGNoZWNrIGl0IHdvcmtzIGFzIGV4cGVjdGVkCi0JCW9uZTJtYW55ID0gKEdyb292eU9iamVjdCkgdGVtcGxhdGUuZ2V0KG9uZTJNYW55RG9tYWluLmdldENsYXp6KCksbmV3IExvbmcoMSkpOwotCQlhc3NlcnROb3ROdWxsKG9uZTJtYW55KTsKLQkJCi0JCXNldCA9IChTZXQpb25lMm1hbnkuZ2V0UHJvcGVydHkoInVuaW9uZXMiKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXQpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2V0LnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGliZXJuYXRlT25lVG9NYW55KCkgewotCQlHcmFpbHNEb21haW5DbGFzcyBvbmUyTWFueURvbWFpbiA9IGdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCAib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuZG9tYWluLlJlbGF0aW9uc2hpcHNUZXN0IiApOwotCQlHcm9vdnlPYmplY3Qgb25lMm1hbnkgPSAoR3Jvb3Z5T2JqZWN0KW9uZTJNYW55RG9tYWluLm5ld0luc3RhbmNlKCk7Ci0KLQkJCi0JCUdyb292eU9iamVjdCBjaGlsZCA9IChHcm9vdnlPYmplY3QpZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uT25lVG9NYW55VGVzdDIiICkubmV3SW5zdGFuY2UoKTsKLQkJCi0JCUhpYmVybmF0ZVRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IEhpYmVybmF0ZVRlbXBsYXRlKHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotCQkKLQkJCi0JCWFzc2VydE5vdE51bGwoY2hpbGQpOwotCQl0ZW1wbGF0ZS5zYXZlKG9uZTJtYW55KTsKLQkJCi0JCS8vIGNyZWF0ZSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAKLQkJY2hpbGQuc2V0UHJvcGVydHkoIm90aGVyIixvbmUybWFueSk7Ci0JCQotCQkvLyBwZXJzaXN0Ci0JCXRlbXBsYXRlLnNhdmUoY2hpbGQpOwotCQkKLQkJdGVtcGxhdGUuZXZpY3Qob25lMm1hbnkpOwkJCi0JCW9uZTJtYW55ID0gbnVsbDsKLQkJLy8gbm93IGdldCBpdCBiYWNrIGFuZCBjaGVjayBpdCB3b3JrcyBhcyBleHBlY3RlZAotCQlvbmUybWFueSA9IChHcm9vdnlPYmplY3QpIHRlbXBsYXRlLmdldChvbmUyTWFueURvbWFpbi5nZXRDbGF6eigpLG5ldyBMb25nKDEpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmUybWFueSk7Ci0JCQotCQlTZXQgc2V0ID0gKFNldClvbmUybWFueS5nZXRQcm9wZXJ0eSgib25lcyIpOwotCQlhc3NlcnROb3ROdWxsKHNldCk7Ci0JCWFzc2VydEVxdWFscygxLCBzZXQuc2l6ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaWJlcm5hdGVNYW55VG9PbmUoKSB7Ci0JCUdyYWlsc0RvbWFpbkNsYXNzIG9uZTJNYW55RG9tYWluID0gZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5kb21haW4uUmVsYXRpb25zaGlwc1Rlc3QiICk7Ci0JCUdyb292eU9iamVjdCBvbmUybWFueSA9IChHcm9vdnlPYmplY3Qpb25lMk1hbnlEb21haW4ubmV3SW5zdGFuY2UoKTsKLQotCQkKLQkJR3Jvb3Z5T2JqZWN0IG1hbnkyb25lID0gKEdyb292eU9iamVjdClncmFpbHNBcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcyggIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmRvbWFpbi5PbmVUb01hbnlUZXN0MiIgKS5uZXdJbnN0YW5jZSgpOwotCQkKLQkJSGliZXJuYXRlVGVtcGxhdGUgdGVtcGxhdGUgPSBuZXcgSGliZXJuYXRlVGVtcGxhdGUodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1hbnkyb25lKTsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9uZTJtYW55LnNldFByb3BlcnR5KCJvbmVzIiwgc2V0KTsKLQkJLy90ZW1wbGF0ZS5zYXZlKG9uZTJtYW55KTsKLQkJCQkJCQkJCQotCQkvLyBjcmVhdGUgbWFueS10by1vbmUgcmVsYXRpb25zaGlwCi0JCQkJCi0JCW1hbnkyb25lLnNldFByb3BlcnR5KCJvdGhlciIsIG9uZTJtYW55KTsKLQkJCi0JCXRlbXBsYXRlLnNhdmUobWFueTJvbmUpOwotCQkKLQkJLy8gbm93IGdldCBpdCBiYWNrIGFuZCBjaGVjayBpdCB3b3JrcyBhcyBleHBlY3RlZAotCQl0ZW1wbGF0ZS5yZWZyZXNoKG9uZTJtYW55KTsKLQkJLy9vbmUybWFueSA9IChHcm9vdnlPYmplY3QpIHRlbXBsYXRlLmdldChvbmUyTWFueURvbWFpbi5nZXRDbGF6eigpLG5ldyBMb25nKDEpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmUybWFueSk7Ci0JCQotCQlzZXQgPSAoU2V0KW9uZTJtYW55LmdldFByb3BlcnR5KCJvbmVzIik7Ci0JCWFzc2VydE5vdE51bGwoc2V0KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHNldC5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9IaWJlcm5hdGVDcml0ZXJpYUJ1aWxkZXJUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9IaWJlcm5hdGVDcml0ZXJpYUJ1aWxkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNmNWFlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGU7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS51dGlsLlByb3h5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuQXJyYXlVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuU3ByaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Db25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LkFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0czsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMueG1sLlhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcjsKLQotcHVibGljIGNsYXNzIEhpYmVybmF0ZUNyaXRlcmlhQnVpbGRlclRlc3RzIGV4dGVuZHMKLQkJQWJzdHJhY3REZXBlbmRlbmN5SW5qZWN0aW9uU3ByaW5nQ29udGV4dFRlc3RzIHsKLQkKLQlwcm90ZWN0ZWQgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb24gPSBudWxsOwotICAgIHByb3RlY3RlZCBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29uZmlnTG9jYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLXBlcnNpc3RlbnQtbWV0aG9kLXRlc3RzLnhtbCIgfTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEdyYWlsc0FwcGxpY2F0aW9uKEdyYWlsc0FwcGxpY2F0aW9uIGdyYWlsc0FwcGxpY2F0aW9uKSB7Ci0JCXRoaXMuZ3JhaWxzQXBwbGljYXRpb24gPSBncmFpbHNBcHBsaWNhdGlvbjsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uRmFjdG9yeShTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSkgewotCQl0aGlzLnNlc3Npb25GYWN0b3J5ID0gc2Vzc2lvbkZhY3Rvcnk7Ci0JfQotCi0KLQlwcml2YXRlIFByb3h5IHBhcnNlKFN0cmluZyBncm9vdnksU3RyaW5nIHRlc3RDbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQotCQkKLQkJR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wgPSB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldENsYXNzTG9hZGVyKCk7Ci0JCUNsYXNzIGNsYXp6ID0gCi0JCSBjbC5wYXJzZUNsYXNzKCAicGFja2FnZSB0ZXN0O1xuIiArCi0JCSAJCQkJImltcG9ydCBncmFpbHMub3JtLio7XG4iICsKLQkJIAkJCQkiaW1wb3J0IG9yZy5oaWJlcm5hdGUuKjtcbiIgKwotCQkgCQkJCSJjbGFzcyAiK3Rlc3RDbGFzc05hbWUrIiB7XG4iICsKLQkJIAkJCQkJIkBQcm9wZXJ0eSBTZXNzaW9uRmFjdG9yeSBzZjtcbiIgKwotCQkgCQkJCQkiQFByb3BlcnR5IENsYXNzIHRjO1xuIiArIAotCQkgCQkJCQkiQFByb3BlcnR5IENsb3N1cmUgdGVzdCA9IHtcbiIgKwotCQkgCQkJCQkJImRlZiBoY2IgPSBuZXcgSGliZXJuYXRlQ3JpdGVyaWFCdWlsZGVyKHRjLHNmKTtcbiIgKwotCQkgCQkJCQkJInJldHVybiBoY2IiICsgZ3Jvb3Z5ICsiO1xuIiArCi0JCSAJCQkJCSJ9XG4iICsKLQkJIAkJCQkifSIpOwotCQlHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCWdvLnNldFByb3BlcnR5KCJzZiIsIHRoaXMuc2Vzc2lvbkZhY3RvcnkpOwotCQkKLQkJQ2xhc3MgdGMgPSB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzZXMoKVswXS5nZXRDbGF6eigpOwotCQlnby5zZXRQcm9wZXJ0eSgidGMiLCB0Yyk7Ci0JCQotCQlDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSlnby5nZXRQcm9wZXJ0eSgidGVzdCIpOwotCQlyZXR1cm4gKFByb3h5KWNsb3N1cmUuY2FsbCgpOwotCQkKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaWJlcm5hdGVDcml0ZXJpYUJ1aWxkZXIoKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSB0aGlzLmdyYWlsc0FwcGxpY2F0aW9uLmdldEdyYWlsc0RvbWFpbkNsYXNzKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLlBlcnNpc3RlbnRNZXRob2RUZXN0Q2xhc3MiKTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmogPSAoR3Jvb3Z5T2JqZWN0KWRvbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCS8vb2JqLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygxKSApOwotCQlvYmouc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZnJlZCIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiYWdlIiwgbmV3IEludGVnZXIoNDUpKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmoyID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkvL29iajIuc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDIpICk7Ci0JCW9iajIuc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAid2lsbWEiICk7Ci0JCW9iajIuc2V0UHJvcGVydHkoICJsYXN0TmFtZSIsICJmbGludHN0b25lIiApOwotCQlvYmoyLnNldFByb3BlcnR5KCAiYWdlIiwgbmV3IEludGVnZXIoNDIpKTsKLQkJb2JqMi5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsJCi0JCQotCQlHcm9vdnlPYmplY3Qgb2JqMyA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJLy9vYmozLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygzKSApOwotCQlvYmozLnNldFByb3BlcnR5KCAiZmlyc3ROYW1lIiwgImRpbm8iICk7Ci0JCW9iajMuc2V0UHJvcGVydHkoICJsYXN0TmFtZSIsICJkaW5vc2F1ciIgKTsKLQkJb2JqMy5zZXRQcm9wZXJ0eSggImFnZSIsIG5ldyBJbnRlZ2VyKDEyKSk7Ci0JCW9iajMuaW52b2tlTWV0aG9kKCJzYXZlIiwgbnVsbCk7Ci0JCQotCQkKLQkJUHJveHkgcCA9IG51bGw7Ci0JCXAgPSBwYXJzZSgJInsgIiArCi0JCQkJCSJhbmQgeyAiICsKLQkJCQkJCSJlcSgnZmlyc3ROYW1lJywnZnJlZCcpOyIgKwotCQkJCQkJImVxKCdsYXN0TmFtZScsICdmbGludHN0b25lJykiICsKLQkJCQkJIn0iICsKLQkJCQkifSIsICJUZXN0MSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyaXRlcmlhIG91dHB1dCA9ICIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlVdGlscy50b1N0cmluZyhwLmludm9rZU1ldGhvZCgidG9BcnJheSIsbnVsbCkpKTsJCQotCQlwID0gcGFyc2UoCSJ7XG4iICsKLQkJCQkJCSJhbmQge1xuIiArCi0JCQkJCQkJImVxKFwiZmlyc3ROYW1lXCIsXCJGcmVkXCIpO1xuIiArCi0JCQkJCQkJImFuZCB7XG4iICsKLQkJCQkJCQkJImVxKFwiYWdlXCIsIDQyKVxuIiArCi0JCQkJCQkJCSJlcShcImxhc3ROYW1lXCIsIFwiZmxpbnRzdG9uZVwiKVxuIiArCi0JCQkJCQkgICAgICJ9XG4iICsKLQkJCQkJCSJ9XG4iICsKLQkJCQkJIn0iLCAiVGVzdDIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDcml0ZXJpYSBvdXRwdXQgPSAiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKEFycmF5VXRpbHMudG9TdHJpbmcocC5pbnZva2VNZXRob2QoInRvQXJyYXkiLG51bGwpKSk7Ci0JCXAgPSBwYXJzZSgJIntcbiIgKwotCQkJCQkJImVxKFwiZmlyc3ROYW1lXCIsXCJGcmVkXCIpXG4iICsKLQkJCQkJCSJvcmRlcihcImZpcnN0TmFtZVwiKVxuIiArCi0JCQkJCQkibWF4UmVzdWx0cygxMClcbiIgKwotCQkJCQkifSIsICJUZXN0MyIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyaXRlcmlhIG91dHB1dCA9ICIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlVdGlscy50b1N0cmluZyhwLmludm9rZU1ldGhvZCgidG9BcnJheSIsbnVsbCkpKTsJCQotCQkKLQkJLy8gbm93IHRlc3Qgb3V0IGlsbGVnYWwgYXJndW1lbnRzCi0JCXRyeSB7Ci0JCQkvLyBhbmQgZXhwcmVzc2lvbiB3aXRoIG9ubHkgb25lIGFyZ3VtZW50Ci0JCQlwID0gcGFyc2UoCSJ7XG4iICsKLQkJCQkJImFuZCB7XG4iICsKLQkJCQkJCSJlcShcImZpcnN0TmFtZVwiLFwiRnJlZFwiKTtcbiIgKwotCQkJCQkJImFuZCB7XG4iICsKLQkJCQkJCQkiZXEoXCJhZ2VcIiwgNDIpXG4iICsKLQkJCQkJICAgICAifVxuIiArCi0JCQkJCSJ9XG4iICsKLQkJCQkifSIsICJUZXN0NCIpOwkJCQotCQkJCi0JCQlmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24iKTsJCQkJCQotCQl9Ci0JCWNhdGNoKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGlpZSkgewotCQkJLy8gc3VjY2VzcyEKLQkJCWFzc2VydEVxdWFscyggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCBpaWUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpICk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBydWJiaXNoIGFyZ3VtZW50Ci0JCQlwID0gcGFyc2UoCSJ7XG4iICsKLQkJCQkJImFuZCB7XG4iICsKLQkJCQkJCSJlcShcImZpcnN0TmFtZVwiLFwiRnJlZFwiKTtcbiIgKwotCQkJCQkJIm5vdCB7XG4iICsKLQkJCQkJCQkiZXEoXCJhZ2VcIiwgNDIpXG4iICsKLQkJCQkJCQkicnViYmlzaCgpXG4iICsKLQkJCQkJICAgICAifVxuIiArCi0JCQkJCSJ9XG4iICsKLQkJCQkifSIsICJUZXN0NSIpOwkJCQotCQkJCi0JCQlmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24iKTsJCQkJCQotCQl9Ci0JCWNhdGNoKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGlpZSkgewotCQkJLy8gc3VjY2VzcyEKLQkJCWFzc2VydEVxdWFscyggTWlzc2luZ01ldGhvZEV4Y2VwdGlvbi5jbGFzcywgaWllLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSApOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb25TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTcHJpbmdDb25maWcgc3ByaW5nQ29uZmlnID0gbmV3IFNwcmluZ0NvbmZpZyhncmFpbHNBcHBsaWNhdGlvbik7Ci0JCUNvbmZpZ3VyYWJsZUFwcGxpY2F0aW9uQ29udGV4dCBhcHBDdHggPSAoQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0KSAKLQkJbmV3IFhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcigpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgKLQkJCQlzcHJpbmdDb25maWcuZ2V0QmVhblJlZmVyZW5jZXMoKSwgc3VwZXIuYXBwbGljYXRpb25Db250ZXh0KTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXBwQ3R4KTsKLQkJCQotCQlzdXBlci5vblNldFVwKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvSGliZXJuYXRlTWFwcGVkQ2xhc3MuaGJtLnhtbCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvSGliZXJuYXRlTWFwcGVkQ2xhc3MuaGJtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkNTk5ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0hpYmVybmF0ZU1hcHBlZENsYXNzLmhibS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IURPQ1RZUEUgaGliZXJuYXRlLW1hcHBpbmcgUFVCTElDCi0gICAgIi0vL0hpYmVybmF0ZS9IaWJlcm5hdGUgTWFwcGluZyBEVEQgMi4wLy9FTiIgCi0gICAgImh0dHA6Ly9oaWJlcm5hdGUuc291cmNlZm9yZ2UubmV0L2hpYmVybmF0ZS1tYXBwaW5nLTIuMC5kdGQiPgotPCEtLTwhRE9DVFlQRSBoaWJlcm5hdGUtbWFwcGluZyBQVUJMSUMKLSAgICAiLS8vSGliZXJuYXRlL0hpYmVybmF0ZSBNYXBwaW5nIERURCAyLjAvL0VOIiAKLSAgICAidGVzdC9wZXJzaXN0ZW5jZS9oaWJlcm5hdGUtbWFwcGluZy0yLjAuZHRkIj4KLS0tPjxoaWJlcm5hdGUtbWFwcGluZwotPgotICAgIDxjbGFzcwotICAgIAkKLSAgICAgICAgbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5IaWJlcm5hdGVNYXBwZWRDbGFzcyIKLSAgICAgICAgZHluYW1pYy11cGRhdGU9ImZhbHNlIgotICAgICAgICBkeW5hbWljLWluc2VydD0iZmFsc2UiCi0gICAgICAgIHNlbGVjdC1iZWZvcmUtdXBkYXRlPSJmYWxzZSIKLSAgICAgICAgb3B0aW1pc3RpYy1sb2NrPSJ2ZXJzaW9uIgotICAgID4KLQotICAgICAgICA8aWQKLSAgICAgICAgICAgIG5hbWU9ImlkIgotICAgICAgICAgICAgY29sdW1uPSJpZCIKLSAgICAgICAgICAgIHR5cGU9ImludCIKLSAgICAgICAgPgotICAgICAgICAgICAgPGdlbmVyYXRvciBjbGFzcz0ibmF0aXZlIj4KLSAgICAgICAgICAgICAgPCEtLSAgCi0gICAgICAgICAgICAgICAgICBUbyBhZGQgbm9uIFhEb2NsZXQgZ2VuZXJhdG9yIHBhcmFtZXRlcnMsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgCi0gICAgICAgICAgICAgICAgICBoaWJlcm5hdGUtZ2VuZXJhdG9yLXBhcmFtcy1BZG1pbmlzdHJhdG9yLnhtbCAKLSAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhbmQgcGxhY2UgaXQgaW4geW91ciBtZXJnZSBkaXIuIAotICAgICAgICAgICAgICAtLT4gCi0gICAgICAgICAgICA8L2dlbmVyYXRvcj4KLSAgICAgICAgPC9pZD4KLQotICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgIG5hbWU9Im15UHJvcCIKLSAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICB1cGRhdGU9InRydWUiCi0gICAgICAgICAgICBpbnNlcnQ9InRydWUiCi0gICAgICAgICAgICBhY2Nlc3M9InByb3BlcnR5IgotICAgICAgICAgICAgY29sdW1uPSJteV9wcm9wIgotICAgICAgICAvPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRvIGFkZCBub24gWERvY2xldCBwcm9wZXJ0eSBtYXBwaW5ncywgY3JlYXRlIGEgZmlsZSBuYW1lZAotICAgICAgICAgICAgICAgIGhpYmVybmF0ZS1wcm9wZXJ0aWVzLUFkbWluaXN0cmF0b3IueG1sCi0gICAgICAgICAgICBjb250YWluaW5nIHRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYW5kIHBsYWNlIGl0IGluIHlvdXIgbWVyZ2UgZGlyLgotICAgICAgICAtLT4KLQotICAgIDwvY2xhc3M+Ci0KLTwvaGliZXJuYXRlLW1hcHBpbmc+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0hpYmVybmF0ZU1hcHBlZENsYXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0hpYmVybmF0ZU1hcHBlZENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWZkM2EuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9IaWJlcm5hdGVNYXBwZWRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlOwotY2xhc3MgSGliZXJuYXRlTWFwcGVkQ2xhc3MgewotCQotCXByaXZhdGUgSW50ZWdlciBpZDsKLQlwcml2YXRlIFN0cmluZyBteVByb3A7Ci0JCi0JcHVibGljIHZvaWQgc2V0SWQoSW50ZWdlciBpZCkgewotCQl0aGlzLmlkID0gaWQ7CQkKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNeVByb3AoU3RyaW5nIG15UHJvcCkgewotCQl0aGlzLm15UHJvcCA9IG15UHJvcDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNeVByb3AoKSB7Ci0JCXJldHVybiB0aGlzLm15UHJvcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9IaWJlcm5hdGVNYXBwZWRDbGFzc1Rlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0hpYmVybmF0ZU1hcHBlZENsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmMjA4My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL0hpYmVybmF0ZU1hcHBlZENsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5BYnN0cmFjdERlcGVuZGVuY3lJbmplY3Rpb25TcHJpbmdDb250ZXh0VGVzdHM7Ci0KLS8qKgotCi0gKi8KLXB1YmxpYyBjbGFzcyBIaWJlcm5hdGVNYXBwZWRDbGFzc1Rlc3RzIGV4dGVuZHMKLQkJQWJzdHJhY3REZXBlbmRlbmN5SW5qZWN0aW9uU3ByaW5nQ29udGV4dFRlc3RzIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5BYnN0cmFjdERlcGVuZGVuY3lJbmplY3Rpb25TcHJpbmdDb250ZXh0VGVzdHMjZ2V0Q29uZmlnTG9jYXRpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29uZmlnTG9jYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvaGliZXJuYXRlLW1hcHBlZC1jbGFzcy10ZXN0cy54bWwiIH07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXRob2RzKCkgewotCQlIaWJlcm5hdGVNYXBwZWRDbGFzcyBobWMgPSBuZXcgSGliZXJuYXRlTWFwcGVkQ2xhc3MoKTsKLQkJaG1jLnNldE15UHJvcCgic29tZXZhbHVlIik7Ci0JCUludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGhtYywgInNhdmUiLCBuZXcgT2JqZWN0WzBdKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGhtYy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJaG1jID0gbnVsbDsKLQkJCi0JCWhtYyA9IChIaWJlcm5hdGVNYXBwZWRDbGFzcylJbnZva2VySGVscGVyLmludm9rZVN0YXRpY01ldGhvZChjbGFzc05hbWUsICJnZXQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcigxKSB9KTsKLQkJYXNzZXJ0RXF1YWxzKCJzb21ldmFsdWUiLCBobWMuZ2V0TXlQcm9wKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL1BlcnNpc3RlbnRNZXRob2RUZXN0Q2xhc3MuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNjYjAxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGU7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50TWV0aG9kVGVzdENsYXNzIHsKLQotCUBQcm9wZXJ0eSBMaXN0IG9wdGlvbmFscyA9IFsgImFnZSIgXTsKLQkKLQlAUHJvcGVydHkgTG9uZyBpZDsgCi0JQFByb3BlcnR5IExvbmcgdmVyc2lvbjsgCi0JCi0JQFByb3BlcnR5IFN0cmluZyBmaXJzdE5hbWU7IAotCUBQcm9wZXJ0eSBTdHJpbmcgbGFzdE5hbWU7IAotCUBQcm9wZXJ0eSBJbnRlZ2VyIGFnZTsKLQkKLQlAUHJvcGVydHkgY29uc3RyYWludHMgPSB7Ci0JCWZpcnN0TmFtZShsZW5ndGg6NC4uMTUpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvUGVyc2lzdGVudE1ldGhvZFRlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL1BlcnNpc3RlbnRNZXRob2RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ2MDA0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvUGVyc2lzdGVudE1ldGhvZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuU3ByaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuZXhjZXB0aW9ucy5HcmFpbHNRdWVyeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLm1ldGFjbGFzcy5GaW5kQnlQZXJzaXN0ZW50TWV0aG9kOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5Db25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LkFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0czsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMueG1sLlhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcjsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRNZXRob2RUZXN0cyBleHRlbmRzIEFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0cyB7Ci0KLQlwcm90ZWN0ZWQgR3JhaWxzQXBwbGljYXRpb24gZ3JhaWxzQXBwbGljYXRpb24gPSBudWxsOwotCi0KLQkvKioKLQkgKiBAcGFyYW0gZ3JhaWxzQXBwbGljYXRpb24gVGhlIGdyYWlsc0FwcGxpY2F0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFpbHNBcHBsaWNhdGlvbihHcmFpbHNBcHBsaWNhdGlvbiBncmFpbHNBcHBsaWNhdGlvbikgewotCQl0aGlzLmdyYWlsc0FwcGxpY2F0aW9uID0gZ3JhaWxzQXBwbGljYXRpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29uZmlnTG9jYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLXBlcnNpc3RlbnQtbWV0aG9kLXRlc3RzLnhtbCIgfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kU2lnbmF0dXJlcygpIHsKLQkJCi0JCUZpbmRCeVBlcnNpc3RlbnRNZXRob2QgZmluZEJ5ID0gbmV3IEZpbmRCeVBlcnNpc3RlbnRNZXRob2QoIGdyYWlsc0FwcGxpY2F0aW9uLG51bGwsbmV3IEdyb292eUNsYXNzTG9hZGVyKCkpOwotCQlhc3NlcnRUcnVlKGZpbmRCeS5pc01ldGhvZE1hdGNoKCJmaW5kQnlGaXJzdE5hbWUiKSk7Ci0JCWFzc2VydFRydWUoZmluZEJ5LmlzTWV0aG9kTWF0Y2goImZpbmRCeUZpcnN0TmFtZUFuZExhc3ROYW1lIikpOwotCQlhc3NlcnRGYWxzZShmaW5kQnkuaXNNZXRob2RNYXRjaCgicnViYmlzaCIpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNhdmVQZXJzaXN0ZW50TWV0aG9kKCkgewotCQkvLyBpbml0IHNwcmluZyBjb25maWcKLQkJCi0JCQotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcyIpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iaiA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygxKSApOwotCQlvYmouc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZnJlZCIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVBlcnNpc3RlbnRNZXRob2QoKSB7Ci0JCS8vIGluaXQgc3ByaW5nIGNvbmZpZwotCQkKLQkJCi0JCUdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gdGhpcy5ncmFpbHNBcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcygib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5QZXJzaXN0ZW50TWV0aG9kVGVzdENsYXNzIik7Ci0JCQotCQlHcm9vdnlPYmplY3Qgb2JqID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlvYmouc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDEpICk7Ci0JCW9iai5zZXRQcm9wZXJ0eSggImZpcnN0TmFtZSIsICJmciIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInZhbGlkYXRlIiwgbnVsbCk7Ci0JCQotCQlMaXN0IGVycm9ycyA9IChMaXN0KW9iai5nZXRQcm9wZXJ0eSgiZXJyb3JzIik7Ci0JCWFzc2VydE5vdE51bGwoZXJyb3JzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVycm9ycy5zaXplKCkpOwotCQkKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRCeVBlcnNpc3RlbnRNZXRob2RzKCkgewotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcyIpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iaiA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygxKSApOwotCQlvYmouc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZnJlZCIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiYWdlIiwgbmV3IEludGVnZXIoNDUpKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmoyID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlvYmoyLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygyKSApOwotCQlvYmoyLnNldFByb3BlcnR5KCAiZmlyc3ROYW1lIiwgIndpbG1hIiApOwotCQlvYmoyLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJb2JqMi5zZXRQcm9wZXJ0eSggImFnZSIsIG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCW9iajIuaW52b2tlTWV0aG9kKCJzYXZlIiwgbnVsbCk7CQotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iajMgPSAoR3Jvb3Z5T2JqZWN0KWRvbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCW9iajMuc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDMpICk7Ci0JCW9iajMuc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZGlubyIgKTsKLQkJb2JqMy5zZXRQcm9wZXJ0eSggImxhc3ROYW1lIiwgImRpbm9zYXVyIiApOwotCQlvYmozLnNldFByb3BlcnR5KCAiYWdlIiwgbmV3IEludGVnZXIoMTIpKTsKLQkJb2JqMy5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsJCQkKLQkJCi0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbEJ5Rmlyc3ROYW1lIiwgbmV3IE9iamVjdFtdIHsgImZyZWQiLCBuZXcgSW50ZWdlcigxMCkgfSk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVmFsdWUpOwotCQlhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTGlzdCk7Ci0JCQotCQlMaXN0IHJldHVybkxpc3QgPSAoTGlzdClyZXR1cm5WYWx1ZTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJldHVybkxpc3Quc2l6ZSgpKTsKLQkJCi0JCXJldHVyblZhbHVlID0gb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJmaW5kQWxsQnlGaXJzdE5hbWVBbmRMYXN0TmFtZSIsIG5ldyBPYmplY3RbXSB7ICJmcmVkIiwgImZsaW50c3RvbmUiIH0pOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KXJldHVyblZhbHVlOwotCQlhc3NlcnRFcXVhbHMoMSwgcmV0dXJuTGlzdC5zaXplKCkpOwotCQkKLQkJLypyZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEJ5Rmlyc3ROYW1lT3JMYXN0TmFtZSIsIG5ldyBPYmplY3RbXSB7ICJmcmVkIiwgImZsaW50c3RvbmUiIH0pOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KXJldHVyblZhbHVlOwotCQlhc3NlcnRFcXVhbHMoMiwgcmV0dXJuTGlzdC5zaXplKCkpOyovCQkJCi0JCQotCQlyZXR1cm5MaXN0ID0gKExpc3Qpb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJmaW5kQWxsQnlGaXJzdE5hbWVOb3RFcXVhbCIsIG5ldyBPYmplY3RbXSB7ICJmcmVkIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJldHVybkxpc3Quc2l6ZSgpKTsKLQkJb2JqID0gKEdyb292eU9iamVjdClyZXR1cm5MaXN0LmdldCgwKTsKLQkJb2JqMiA9IChHcm9vdnlPYmplY3QpcmV0dXJuTGlzdC5nZXQoMSk7Ci0JCWFzc2VydEZhbHNlKCJmcmVkIi5lcXVhbHMoIG9iai5nZXRQcm9wZXJ0eSgiZmlyc3ROYW1lIikpKTsKLQkJYXNzZXJ0RmFsc2UoImZyZWQiLmVxdWFscyggb2JqMi5nZXRQcm9wZXJ0eSgiZmlyc3ROYW1lIikpKTsKLQkJCi0JCXJldHVybkxpc3QgPSAoTGlzdClvYmouZ2V0TWV0YUNsYXNzKCkuaW52b2tlU3RhdGljTWV0aG9kKG9iaiwgImZpbmRBbGxCeUFnZUxlc3NUaGFuIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoMjApIH0pOwotCQlhc3NlcnRFcXVhbHMoMSwgcmV0dXJuTGlzdC5zaXplKCkpOwotCQlvYmogPSAoR3Jvb3Z5T2JqZWN0KXJldHVybkxpc3QuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoImRpbm8iLCBvYmouZ2V0UHJvcGVydHkoImZpcnN0TmFtZSIpKTsKLQkJCi0JCXJldHVybkxpc3QgPSAoTGlzdClvYmouZ2V0TWV0YUNsYXNzKCkuaW52b2tlU3RhdGljTWV0aG9kKG9iaiwgImZpbmRBbGxCeUFnZUdyZWF0ZXJUaGFuIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoMjApIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgcmV0dXJuTGlzdC5zaXplKCkpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KW9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbEJ5QWdlR3JlYXRlclRoYW5BbmRMYXN0TmFtZSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDIwKSwgImZsaW50c3RvbmUiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgcmV0dXJuTGlzdC5zaXplKCkpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KW9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbEJ5TGFzdE5hbWVMaWtlIiwgbmV3IE9iamVjdFtdIHsgImZsaW50JSIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXR1cm5MaXN0LnNpemUoKSk7Ci0JCQotCQlyZXR1cm5MaXN0ID0gKExpc3Qpb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJmaW5kQWxsQnlBZ2VCZXR3ZWVuIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoMTApLCBuZXcgSW50ZWdlcig0MykgfSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXR1cm5MaXN0LnNpemUoKSk7CQkKLQkJCi0JCU1hcCBxdWVyeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXF1ZXJ5TWFwLnB1dCgiZmlyc3ROYW1lIiwgIndpbG1hIik7Ci0JCXF1ZXJ5TWFwLnB1dCgibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIpOwotCQlyZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZFdoZXJlIiwgbmV3IE9iamVjdFtdIHsgcXVlcnlNYXAgfSk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVmFsdWUpOwotCQkvLyBub3cgbGV0cyB0ZXN0IG91dCBzb21lIGp1bmsgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgZXJyb3JzIQotCQl0cnkgewotCQkJcmV0dXJuTGlzdCA9IChMaXN0KW9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbEJ5TGFzdE5hbWVMaWtlIiwgbmV3IE9iamVjdFtdIHsgbmV3IEJvb2xlYW4oZmFsc2UpIH0pOwotCQkJZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBhcmd1bWVudHMiKTsKLQkJfQotCQljYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotCQkJLy9ncmVhdCEKLQkJfQotCQkvLyBhbmQgdGhlIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMhCi0JCXRyeSB7Ci0JCQlyZXR1cm5MaXN0ID0gKExpc3Qpb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJmaW5kQWxsQnlBZ2VCZXR3ZWVuIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoMTApIH0pOwotCQkJZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBhcmd1bWVudCBjb3VudCIpOwotCQl9Ci0JCWNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0JCQkvL2dyZWF0IQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbnRNZXRob2QoKSB7Ci0JCUdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gdGhpcy5ncmFpbHNBcHBsaWNhdGlvbi5nZXRHcmFpbHNEb21haW5DbGFzcygib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5QZXJzaXN0ZW50TWV0aG9kVGVzdENsYXNzIik7Ci0JCQotCQlHcm9vdnlPYmplY3Qgb2JqID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlvYmouc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDEpICk7Ci0JCW9iai5zZXRQcm9wZXJ0eSggImZpcnN0TmFtZSIsICJmcmVkIiApOwotCQlvYmouc2V0UHJvcGVydHkoICJsYXN0TmFtZSIsICJmbGludHN0b25lIiApOwotCQkKLQkJb2JqLmludm9rZU1ldGhvZCgic2F2ZSIsIG51bGwpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iajIgPSAoR3Jvb3Z5T2JqZWN0KWRvbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCW9iajIuc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDIpICk7Ci0JCW9iajIuc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAid2lsbWEiICk7Ci0JCW9iajIuc2V0UHJvcGVydHkoICJsYXN0TmFtZSIsICJmbGludHN0b25lIiApOwotCQkKLQkJb2JqMi5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsJCi0JCQotCQkvLyBnZXQgd2lsbWEgYnkgaWQKLQkJT2JqZWN0IHJldHVyblZhbHVlID0gb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJnZXQiLCBuZXcgT2JqZWN0W10geyBuZXcgTG9uZygyKSB9KTsKLQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhyZXR1cm5WYWx1ZS5nZXRDbGFzcygpLGRvbWFpbkNsYXNzLmdldENsYXp6KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbmRBbGxQZXJzaXN0ZW50TWV0aG9kKCkgewotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcyIpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iaiA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygxKSApOwotCQlvYmouc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZnJlZCIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmoyID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlvYmoyLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygyKSApOwotCQlvYmoyLnNldFByb3BlcnR5KCAiZmlyc3ROYW1lIiwgIndpbG1hIiApOwotCQlvYmoyLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iajIuaW52b2tlTWV0aG9kKCJzYXZlIiwgbnVsbCk7CQotCQkKLQkJLy8gdGVzdCBmaW5kIHdpdGggYSBxdWVyeQotCQlPYmplY3QgcmV0dXJuVmFsdWUgPSBvYmouZ2V0TWV0YUNsYXNzKCkuaW52b2tlU3RhdGljTWV0aG9kKG9iaiwgImZpbmRBbGwiLCBuZXcgT2JqZWN0W10geyAiZnJvbSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLlBlcnNpc3RlbnRNZXRob2RUZXN0Q2xhc3MiIH0pOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFycmF5TGlzdC5jbGFzcyxyZXR1cm5WYWx1ZS5nZXRDbGFzcygpKTsKLQkJTGlzdCBsaXN0UmVzdWx0ID0gKExpc3QpcmV0dXJuVmFsdWU7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0UmVzdWx0LnNpemUoKSk7Ci0JCQotCQkvLyB0ZXN0IGZpbmQgd2l0aCBxdWVyeSBhbmQgYXJncwotCQlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFyZ3MuYWRkKCAid2lsbWEiICk7Ci0JCXJldHVyblZhbHVlID0gb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosICJmaW5kQWxsIiwgbmV3IE9iamVjdFtdIHsgImZyb20gb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5QZXJzaXN0ZW50TWV0aG9kVGVzdENsYXNzIGFzIHAgd2hlcmUgcC5maXJzdE5hbWUgPSA/IiwgYXJncyB9KTsKLQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhBcnJheUxpc3QuY2xhc3MscmV0dXJuVmFsdWUuZ2V0Q2xhc3MoKSk7Ci0JCWxpc3RSZXN1bHQgPSAoTGlzdClyZXR1cm5WYWx1ZTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxpc3RSZXN1bHQuc2l6ZSgpKTsJCi0JCQotCQkvLyB0ZXN0IGZpbmQgYnkgZXhhbXBsZQotCQlHcm9vdnlPYmplY3QgZXhhbXBsZSA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJZXhhbXBsZS5zZXRQcm9wZXJ0eSggImZpcnN0TmFtZSIsICJmcmVkIiApOwotCQlyZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbCIsIG5ldyBPYmplY3RbXSB7IGV4YW1wbGUgfSk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoQXJyYXlMaXN0LmNsYXNzLHJldHVyblZhbHVlLmdldENsYXNzKCkpOwotCQlsaXN0UmVzdWx0ID0gKExpc3QpcmV0dXJuVmFsdWU7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0UmVzdWx0LnNpemUoKSk7CQotCQkKLQkJLy8gdGVzdCBpbnZhbGlkIHF1ZXJ5Ci0JCXRyeSB7Ci0JCQlyZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCAiZmluZEFsbCIsIG5ldyBPYmplY3RbXSB7ICJmcm9tIFJ1YmJpc2hDbGFzcyJ9KTsKLQkJCWZhaWwoIlNob3VsZCBoYXZlIHRocm93biBncmFpbHMgcXVlcnkgZXhjZXB0aW9uIik7Ci0JCX0KLQkJY2F0Y2goR3JhaWxzUXVlcnlFeGNlcHRpb24gZ3FlKSB7Ci0JCQkvL2V4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFBlcnNpc3RlbnRNZXRob2RzKCkgewotCQlHcmFpbHNEb21haW5DbGFzcyBkb21haW5DbGFzcyA9IHRoaXMuZ3JhaWxzQXBwbGljYXRpb24uZ2V0R3JhaWxzRG9tYWluQ2xhc3MoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcyIpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iaiA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJb2JqLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygxKSApOwotCQlvYmouc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZnJlZCIgKTsKLQkJb2JqLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iai5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsKLQkJCi0JCUdyb292eU9iamVjdCBvYmoyID0gKEdyb292eU9iamVjdClkb21haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlvYmoyLnNldFByb3BlcnR5KCAiaWQiLCBuZXcgTG9uZygyKSApOwotCQlvYmoyLnNldFByb3BlcnR5KCAiZmlyc3ROYW1lIiwgIndpbG1hIiApOwotCQlvYmoyLnNldFByb3BlcnR5KCAibGFzdE5hbWUiLCAiZmxpbnRzdG9uZSIgKTsKLQkJCi0JCW9iajIuaW52b2tlTWV0aG9kKCJzYXZlIiwgbnVsbCk7CQotCQkKLQkJR3Jvb3Z5T2JqZWN0IG9iajMgPSAoR3Jvb3Z5T2JqZWN0KWRvbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCW9iajMuc2V0UHJvcGVydHkoICJpZCIsIG5ldyBMb25nKDMpICk7Ci0JCW9iajMuc2V0UHJvcGVydHkoICJmaXJzdE5hbWUiLCAiZGlubyIgKTsKLQkJb2JqMy5zZXRQcm9wZXJ0eSggImxhc3ROYW1lIiwgImRpbm9zYXVyIiApOwotCQkKLQkJb2JqMy5pbnZva2VNZXRob2QoInNhdmUiLCBudWxsKTsJCQotCQkKLQkJLy8gdGVzdCBwbGFpbiBsaXN0Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCJsaXN0IiwgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVmFsdWUpOwotCQlhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTGlzdCk7Ci0JCQotCQlMaXN0IHJldHVybkxpc3QgPSAoTGlzdClyZXR1cm5WYWx1ZTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJldHVybkxpc3Quc2l6ZSgpKTsKLQkJLy8gdGVzdCBsaXN0IHdpdGggbWF4IHZhbHVlCi0JCU1hcCBhcmdzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJYXJnc01hcC5wdXQoIm1heCIsbmV3IEludGVnZXIoMSkpOwotCQlyZXR1cm5WYWx1ZSA9IG9iai5nZXRNZXRhQ2xhc3MoKS5pbnZva2VTdGF0aWNNZXRob2Qob2JqLCJsaXN0IiwgbmV3IE9iamVjdFtdeyBhcmdzTWFwIH0pOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KXJldHVyblZhbHVlOwotCQlhc3NlcnRFcXVhbHMoMSwgcmV0dXJuTGlzdC5zaXplKCkpOwkKLQkJCi0JCS8vIHRlc3QgbGlzdCB3aXRoIG9yZGVyIGJ5Ci0JCXJldHVyblZhbHVlID0gb2JqLmdldE1ldGFDbGFzcygpLmludm9rZVN0YXRpY01ldGhvZChvYmosImxpc3RPcmRlckJ5Rmlyc3ROYW1lIiwgbmV3IE9iamVjdFtde30pOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotCQkKLQkJcmV0dXJuTGlzdCA9IChMaXN0KXJldHVyblZhbHVlOwotCQlvYmogPSAoR3Jvb3Z5T2JqZWN0KXJldHVybkxpc3QuZ2V0KDApOwotCQlvYmoyID0gKEdyb292eU9iamVjdClyZXR1cm5MaXN0LmdldCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZGlubyIsIG9iai5nZXRQcm9wZXJ0eSgiZmlyc3ROYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBvYmoyLmdldFByb3BlcnR5KCJmaXJzdE5hbWUiKSk7Ci0JCQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBvblNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNwcmluZ0NvbmZpZyBzcHJpbmdDb25maWcgPSBuZXcgU3ByaW5nQ29uZmlnKGdyYWlsc0FwcGxpY2F0aW9uKTsKLQkJQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eCA9IChDb25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQpCQkKLQkJbmV3IFhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcigpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgKLQkJCQlzcHJpbmdDb25maWcuZ2V0QmVhblJlZmVyZW5jZXMoKSwgc3VwZXIuYXBwbGljYXRpb25Db250ZXh0KTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkIGFwcCBjb250ZXh0OiAiICsgYXBwQ3R4LmdldERpc3BsYXlOYW1lKCkpOyAKLQkJc3VwZXIub25TZXRVcCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLWhpYmVybmF0ZS1jb25maWd1cmF0aW9uLXRlc3RzLnhtbCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLWhpYmVybmF0ZS1jb25maWd1cmF0aW9uLXRlc3RzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZWE1Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2dyYWlscy1oaWJlcm5hdGUtY29uZmlndXJhdGlvbi10ZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGJlYW5zIFBVQkxJQyAiLS8vU1BSSU5HLy9EVEQgQkVBTi8vRU4iICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvZHRkL3NwcmluZy1iZWFucy5kdGQiPgotCi08YmVhbnM+Ci0JPGJlYW4gaWQ9ImRhdGFTb3VyY2UiIGNsYXNzPSJvcmcuYXBhY2hlLmNvbW1vbnMuZGJjcC5CYXNpY0RhdGFTb3VyY2UiIGRlc3Ryb3ktbWV0aG9kPSJjbG9zZSI+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJkcml2ZXJDbGFzc05hbWUiPgotCSAgICAgICAgPHZhbHVlPm9yZy5oc3FsZGIuamRiY0RyaXZlcjwvdmFsdWU+Ci0JICAgIDwvcHJvcGVydHk+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJ1cmwiPgotCSAgICAgICAgPHZhbHVlPmpkYmM6aHNxbGRiOm1lbTpncmFpbHNEQjwvdmFsdWU+Ci0JICAgIDwvcHJvcGVydHk+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VybmFtZSI+Ci0JICAgICAgICA8dmFsdWU+c2E8L3ZhbHVlPgotCSAgICA8L3Byb3BlcnR5PgotCSAgICA8cHJvcGVydHkgbmFtZT0icGFzc3dvcmQiPgotCSAgICAgICAgPHZhbHVlPjwvdmFsdWU+Ci0JICAgIDwvcHJvcGVydHk+CQkJCQkKLQk8L2JlYW4+Ci0JCi0JCi0JPGJlYW4gaWQ9ImdyYWlsc0FwcGxpY2F0aW9uIiBjbGFzcz0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbkZhY3RvcnlCZWFuIj4KLQkJPGRlc2NyaXB0aW9uPkdyYWlscyBhcHBsaWNhdGlvbiBmYWN0b3J5IGJlYW48L2Rlc2NyaXB0aW9uPgotCQk8cHJvcGVydHkgbmFtZT0iZ3Jvb3Z5RmlsZXMiPgotCQkJPHZhbHVlPm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvUGVyc2lzdGVudE1ldGhvZFRlc3RDbGFzcy5ncm9vdnk8L3ZhbHVlPgotCQk8L3Byb3BlcnR5PgotCTwvYmVhbj4KLQkKLQkKLQkKLQk8YmVhbiBpZD0ic2Vzc2lvbkZhY3RvcnkiIGNsYXNzPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLkNvbmZpZ3VyYWJsZUxvY2FsU2Vzc2lvbkZhY3RvcnlCZWFuIj4KLQkJPHByb3BlcnR5IG5hbWU9ImdyYWlsc0FwcGxpY2F0aW9uIj4KLQkJCTxyZWYgYmVhbj0iZ3JhaWxzQXBwbGljYXRpb24iIC8+Ci0JCTwvcHJvcGVydHk+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb25maWd1cmF0aW9uQ2xhc3MiPgotCQkJPHZhbHVlPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuY2ZnLkRlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4gCi0JCTxwcm9wZXJ0eSBuYW1lPSJoaWJlcm5hdGVQcm9wZXJ0aWVzIj4KLQkJCTxwcm9wcz4KLQkJCQk8cHJvcCBrZXk9ImhpYmVybmF0ZS5kaWFsZWN0Ij5vcmcuaGliZXJuYXRlLmRpYWxlY3QuSFNRTERpYWxlY3Q8L3Byb3A+Ci0JCQkJPHByb3Aga2V5PSJoaWJlcm5hdGUuaGJtMmRkbC5hdXRvIj5jcmVhdGUtZHJvcDwvcHJvcD4JCQkJCi0JCQk8L3Byb3BzPgotCQk8L3Byb3BlcnR5PgotCQk8cHJvcGVydHkgbmFtZT0iZGF0YVNvdXJjZSI+Ci0JCQk8cmVmIGJlYW49ImRhdGFTb3VyY2UiIC8+Ci0JCTwvcHJvcGVydHk+CQkKLQk8L2JlYW4+CQkKLTwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9ncmFpbHMtcGVyc2lzdGVudC1tZXRob2QtdGVzdHMueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9ncmFpbHMtcGVyc2lzdGVudC1tZXRob2QtdGVzdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdlYTVmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3BlcnNpc3RlbmNlL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL29ybS9oaWJlcm5hdGUvZ3JhaWxzLXBlcnNpc3RlbnQtbWV0aG9kLXRlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLQk8YmVhbiBpZD0iZGF0YVNvdXJjZSIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZSIgZGVzdHJveS1tZXRob2Q9ImNsb3NlIj4KLQkgICAgPHByb3BlcnR5IG5hbWU9ImRyaXZlckNsYXNzTmFtZSI+Ci0JICAgICAgICA8dmFsdWU+b3JnLmhzcWxkYi5qZGJjRHJpdmVyPC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4KLQkgICAgPHByb3BlcnR5IG5hbWU9InVybCI+Ci0JICAgICAgICA8dmFsdWU+amRiYzpoc3FsZGI6bWVtOmdyYWlsc0RCPC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4KLQkgICAgPHByb3BlcnR5IG5hbWU9InVzZXJuYW1lIj4KLQkgICAgICAgIDx2YWx1ZT5zYTwvdmFsdWU+Ci0JICAgIDwvcHJvcGVydHk+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXNzd29yZCI+Ci0JICAgICAgICA8dmFsdWU+PC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4JCQkJCQotCTwvYmVhbj4KLQkKLQkKLQk8YmVhbiBpZD0iZ3JhaWxzQXBwbGljYXRpb24iIGNsYXNzPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0FwcGxpY2F0aW9uRmFjdG9yeUJlYW4iPgotCQk8ZGVzY3JpcHRpb24+R3JhaWxzIGFwcGxpY2F0aW9uIGZhY3RvcnkgYmVhbjwvZGVzY3JpcHRpb24+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJncm9vdnlGaWxlcyI+Ci0JCQk8dmFsdWU+b3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9QZXJzaXN0ZW50TWV0aG9kVGVzdENsYXNzLmdyb292eTwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCQotCQotCQotCTxiZWFuIGlkPSJzZXNzaW9uRmFjdG9yeSIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLm9ybS5oaWJlcm5hdGUuQ29uZmlndXJhYmxlTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4iPgotCQk8cHJvcGVydHkgbmFtZT0iZ3JhaWxzQXBwbGljYXRpb24iPgotCQkJPHJlZiBiZWFuPSJncmFpbHNBcHBsaWNhdGlvbiIgLz4KLQkJPC9wcm9wZXJ0eT4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbmZpZ3VyYXRpb25DbGFzcyI+Ci0JCQk8dmFsdWU+b3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5jZmcuRGVmYXVsdEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb248L3ZhbHVlPgotCQk8L3Byb3BlcnR5PiAKLQkJPHByb3BlcnR5IG5hbWU9ImhpYmVybmF0ZVByb3BlcnRpZXMiPgotCQkJPHByb3BzPgotCQkJCTxwcm9wIGtleT0iaGliZXJuYXRlLmRpYWxlY3QiPm9yZy5oaWJlcm5hdGUuZGlhbGVjdC5IU1FMRGlhbGVjdDwvcHJvcD4KLQkJCQk8cHJvcCBrZXk9ImhpYmVybmF0ZS5oYm0yZGRsLmF1dG8iPmNyZWF0ZS1kcm9wPC9wcm9wPgkJCQkKLQkJCTwvcHJvcHM+Ci0JCTwvcHJvcGVydHk+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkYXRhU291cmNlIj4KLQkJCTxyZWYgYmVhbj0iZGF0YVNvdXJjZSIgLz4KLQkJPC9wcm9wZXJ0eT4JCQotCTwvYmVhbj4JCQotPC9iZWFucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2hpYmVybmF0ZS1tYXBwZWQtY2xhc3MtdGVzdHMueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3QvcGVyc2lzdGVuY2Uvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvb3JtL2hpYmVybmF0ZS9oaWJlcm5hdGUtbWFwcGVkLWNsYXNzLXRlc3RzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2NWIyNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9wZXJzaXN0ZW5jZS9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL2hpYmVybmF0ZS1tYXBwZWQtY2xhc3MtdGVzdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBiZWFucyBQVUJMSUMgIi0vL1NQUklORy8vRFREIEJFQU4vL0VOIiAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL2R0ZC9zcHJpbmctYmVhbnMuZHRkIj4KLQotPGJlYW5zPgotCTxiZWFuIGlkPSJkYXRhU291cmNlIiBjbGFzcz0ib3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlIiBkZXN0cm95LW1ldGhvZD0iY2xvc2UiPgotCSAgICA8cHJvcGVydHkgbmFtZT0iZHJpdmVyQ2xhc3NOYW1lIj4KLQkgICAgICAgIDx2YWx1ZT5vcmcuaHNxbGRiLmpkYmNEcml2ZXI8L3ZhbHVlPgotCSAgICA8L3Byb3BlcnR5PgotCSAgICA8cHJvcGVydHkgbmFtZT0idXJsIj4KLQkgICAgICAgIDx2YWx1ZT5qZGJjOmhzcWxkYjptZW06Z3JhaWxzREI8L3ZhbHVlPgotCSAgICA8L3Byb3BlcnR5PgotCSAgICA8cHJvcGVydHkgbmFtZT0idXNlcm5hbWUiPgotCSAgICAgICAgPHZhbHVlPnNhPC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4KLQkgICAgPHByb3BlcnR5IG5hbWU9InBhc3N3b3JkIj4KLQkgICAgICAgIDx2YWx1ZT48L3ZhbHVlPgotCSAgICA8L3Byb3BlcnR5PgkJCQkJCi0JPC9iZWFuPgotCQotCQotCTxiZWFuIGlkPSJncmFpbHNBcHBsaWNhdGlvbiIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbiI+Ci0JCTxkZXNjcmlwdGlvbj5HcmFpbHMgYXBwbGljYXRpb24gZmFjdG9yeSBiZWFuPC9kZXNjcmlwdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9Imdyb292eUZpbGVzIj4KLQkJCTx2YWx1ZT5vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9vcm0vaGliZXJuYXRlL1BlcnNpc3RlbnRNZXRob2RUZXN0Q2xhc3MuZ3Jvb3Z5PC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0JCi0JCi0JCi0JPGJlYW4gaWQ9InNlc3Npb25GYWN0b3J5IiBjbGFzcz0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMub3JtLmhpYmVybmF0ZS5Db25maWd1cmFibGVMb2NhbFNlc3Npb25GYWN0b3J5QmVhbiI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJncmFpbHNBcHBsaWNhdGlvbiI+Ci0JCQk8cmVmIGJlYW49ImdyYWlsc0FwcGxpY2F0aW9uIiAvPgotCQk8L3Byb3BlcnR5PgotCQk8cHJvcGVydHkgbmFtZT0iY29uZmlnTG9jYXRpb24iPgotCQkJPHZhbHVlPmhpYmVybmF0ZS5jZmcueG1sPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4gCQkJCQotCQk8cHJvcGVydHkgbmFtZT0iY29uZmlndXJhdGlvbkNsYXNzIj4KLQkJCTx2YWx1ZT5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZy5EZWZhdWx0R3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbjwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+IAotCQk8cHJvcGVydHkgbmFtZT0iaGliZXJuYXRlUHJvcGVydGllcyI+Ci0JCQk8cHJvcHM+Ci0JCQkJPHByb3Aga2V5PSJoaWJlcm5hdGUuZGlhbGVjdCI+b3JnLmhpYmVybmF0ZS5kaWFsZWN0LkhTUUxEaWFsZWN0PC9wcm9wPgotCQkJCTxwcm9wIGtleT0iaGliZXJuYXRlLmhibTJkZGwuYXV0byI+Y3JlYXRlLWRyb3A8L3Byb3A+CQkJCQotCQkJPC9wcm9wcz4KLQkJPC9wcm9wZXJ0eT4KLQkJPHByb3BlcnR5IG5hbWU9ImRhdGFTb3VyY2UiPgotCQkJPHJlZiBiZWFuPSJkYXRhU291cmNlIiAvPgotCQk8L3Byb3BlcnR5PgkJCi0JPC9iZWFuPgkJCi08L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0NvbnRyb2xsZXJTY2FmZm9sZGluZ1Rlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9Db250cm9sbGVyU2NhZmZvbGRpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZlMTQxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0NvbnRyb2xsZXJTY2FmZm9sZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5sYW5nLlByb3h5TWV0YUNsYXNzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5Qcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuc3ByaW5nLlNwcmluZ0NvbmZpZzsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5vcm0uaGliZXJuYXRlLmNmZy5EZWZhdWx0R3JhaWxzRG9tYWluQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzLkNvbnRyb2xsZXJEeW5hbWljTWV0aG9kczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuR3JhaWxzQ29udHJvbGxlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMuU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlcjsKLWltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuTXV0YWJsZVByb3BlcnR5VmFsdWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuQmVhbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Db25zdHJ1Y3RvckFyZ3VtZW50VmFsdWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LlJvb3RCZWFuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5tb2NrLndlYi5Nb2NrSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5tb2NrLndlYi5Nb2NrU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LkFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0czsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lk1vZGVsQW5kVmlldzsKLWltcG9ydCBvcmcuc3ByaW5nbW9kdWxlcy5iZWFucy5mYWN0b3J5LmRyaXZlcnMueG1sLlhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcjsKLQotcHVibGljIGNsYXNzIENvbnRyb2xsZXJTY2FmZm9sZGluZ1Rlc3RzIGV4dGVuZHMKLUFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0cyB7Ci0KLQlwcml2YXRlIEdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQgbG9jYWxDb250ZXh0OwotCXByaXZhdGUgQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eDsgCi0JcHJpdmF0ZSBHcmFpbHNBcHBsaWNhdGlvbiBncmFpbHNBcHBsaWNhdGlvbjsKLQlwcml2YXRlIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5OwotCXByaXZhdGUgQ2xhc3MgZG9tYWluQ2xhc3M7Ci0JcHJpdmF0ZSBDbGFzcyBjb250cm9sbGVyQ2xhc3M7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvblNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKLQkJCi0JCQotCQlDbGFzcyB0bXBDbGFzcyA9IGNsLnBhcnNlQ2xhc3MoICJjbGFzcyBTY2FmZm9sZENvbnRyb2xsZXIge1xuIiArCi0JCQkJIkBQcm9wZXJ0eSBib29sZWFuIHNjYWZmb2xkID0gdHJ1ZSIgKwotCQkifSIgKTsKLQkJCi0JCQotCQlDbGFzcyB0bXBDbGFzczIgPSBjbC5wYXJzZUNsYXNzKCAiY2xhc3MgU2NhZmZvbGQge1xuIiArCi0JCSJAUHJvcGVydHkgTG9uZyBpZFxuIiArCi0JCSJAUHJvcGVydHkgTG9uZyB2ZXJzaW9uXG4iICsKLQkJIkBQcm9wZXJ0eSBTdHJpbmcgbmFtZVxuIiArCi0JCSJ9IiApOwkJCi0JCQotCQl0aGlzLmNvbnRyb2xsZXJDbGFzcyA9IHRtcENsYXNzOwotCQl0aGlzLmRvbWFpbkNsYXNzID0gdG1wQ2xhc3MyOwotCQkKLQkJLy9ncmFpbHNBcHBsaWNhdGlvbiA9IG5ldyBEZWZhdWx0R3JhaWxzQXBwbGljYXRpb24oLGNsKTsKLQkJdGhpcy5sb2NhbENvbnRleHQgPSBuZXcgR2VuZXJpY0FwcGxpY2F0aW9uQ29udGV4dChzdXBlci5hcHBsaWNhdGlvbkNvbnRleHQpOwotCQkKLQkJCi0JCQotCQlDb25zdHJ1Y3RvckFyZ3VtZW50VmFsdWVzIGFyZ3MgPSBuZXcgQ29uc3RydWN0b3JBcmd1bWVudFZhbHVlcygpOwotCQlhcmdzLmFkZEdlbmVyaWNBcmd1bWVudFZhbHVlKG5ldyBDbGFzc1tdeyBjb250cm9sbGVyQ2xhc3MsIGRvbWFpbkNsYXNzfSk7Ci0JCWFyZ3MuYWRkR2VuZXJpY0FyZ3VtZW50VmFsdWUoY2wpOwotCQlNdXRhYmxlUHJvcGVydHlWYWx1ZXMgcHJvcFZhbHVlcyA9IG5ldyBNdXRhYmxlUHJvcGVydHlWYWx1ZXMoKTsKLQkJCi0JCUJlYW5EZWZpbml0aW9uIGdyYWlsc0FwcGxpY2F0aW9uQmVhbiA9IG5ldyBSb290QmVhbkRlZmluaXRpb24oRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uLmNsYXNzLGFyZ3MscHJvcFZhbHVlcyk7Ci0JCQotCQlsb2NhbENvbnRleHQucmVnaXN0ZXJCZWFuRGVmaW5pdGlvbiggImdyYWlsc0FwcGxpY2F0aW9uIiwgZ3JhaWxzQXBwbGljYXRpb25CZWFuICk7Ci0JCXRoaXMubG9jYWxDb250ZXh0LnJlZnJlc2goKTsKLQkJCi0JCS8qQmVhbkRlZmluaXRpb24gYXBwbGljYXRpb25FdmVudE11bHRpY2FzdGVyID0gbmV3IFJvb3RCZWFuRGVmaW5pdGlvbihTaW1wbGVBcHBsaWNhdGlvbkV2ZW50TXVsdGljYXN0ZXIuY2xhc3MpOwotCQljb250ZXh0LnJlZ2lzdGVyQmVhbkRlZmluaXRpb24oICJhcHBsaWNhdGlvbkV2ZW50TXVsdGljYXN0ZXIgIiwgYXBwbGljYXRpb25FdmVudE11bHRpY2FzdGVyKTsqLwotCQkKLQkJdGhpcy5ncmFpbHNBcHBsaWNhdGlvbiA9IChHcmFpbHNBcHBsaWNhdGlvbilsb2NhbENvbnRleHQuZ2V0QmVhbigiZ3JhaWxzQXBwbGljYXRpb24iKTsKLQkJRGVmYXVsdEdyYWlsc0RvbWFpbkNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5Db25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXRHcmFpbHNBcHBsaWNhdGlvbih0aGlzLmdyYWlsc0FwcGxpY2F0aW9uKTsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BzLnB1dCgiaGliZXJuYXRlLmNvbm5lY3Rpb24udXNlcm5hbWUiLCJzYSIpOwotCQlwcm9wcy5wdXQoImhpYmVybmF0ZS5jb25uZWN0aW9uLnBhc3N3b3JkIiwiIik7Ci0JCXByb3BzLnB1dCgiaGliZXJuYXRlLmNvbm5lY3Rpb24udXJsIiwiamRiYzpoc3FsZGI6bWVtOmdyYWlsc0RCIik7Ci0JCXByb3BzLnB1dCgiaGliZXJuYXRlLmNvbm5lY3Rpb24uZHJpdmVyX2NsYXNzIiwib3JnLmhzcWxkYi5qZGJjRHJpdmVyIik7Ci0JCXByb3BzLnB1dCgiaGliZXJuYXRlLmRpYWxlY3QiLCJvcmcuaGliZXJuYXRlLmRpYWxlY3QuSFNRTERpYWxlY3QiKTsKLQkJcHJvcHMucHV0KCJoaWJlcm5hdGUuaGJtMmRkbC5hdXRvIiwiY3JlYXRlLWRyb3AiKTsKLQkJY29uZmlnLnNldFByb3BlcnRpZXMocHJvcHMpOwotCQkvL29yaWdpbmFsQ2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7CQkKLQkJdGhpcy5zZXNzaW9uRmFjdG9yeSA9IGNvbmZpZy5idWlsZFNlc3Npb25GYWN0b3J5KCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zZXNzaW9uRmFjdG9yeSk7Ci0JCQotCQkKLQkJCi0JCVNwcmluZ0NvbmZpZyBzcHJpbmdDb25maWcgPSBuZXcgU3ByaW5nQ29uZmlnKGdyYWlsc0FwcGxpY2F0aW9uKTsKLQkJdGhpcy5hcHBDdHggPSAoQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0KSAKLQkJbmV3IFhtbEFwcGxpY2F0aW9uQ29udGV4dERyaXZlcigpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgKLQkJCQlzcHJpbmdDb25maWcuZ2V0QmVhblJlZmVyZW5jZXMoKSwgdGhpcy5sb2NhbENvbnRleHQpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhcHBDdHgpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IGRvbWFpbk9iamVjdCA9IChHcm9vdnlPYmplY3QpZG9tYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJZG9tYWluT2JqZWN0LnNldFByb3BlcnR5KCJuYW1lIiwgImZyZWQiKTsKLQkJZG9tYWluT2JqZWN0Lmludm9rZU1ldGhvZCgic2F2ZSIsIG5ldyBPYmplY3RbMF0pOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IGRvbWFpbk9iamVjdDIgPSAoR3Jvb3Z5T2JqZWN0KWRvbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCWRvbWFpbk9iamVjdDIuc2V0UHJvcGVydHkoIm5hbWUiLCAid2lsbWEiKTsKLQkJZG9tYWluT2JqZWN0Mi5pbnZva2VNZXRob2QoInNhdmUiLCBuZXcgT2JqZWN0WzBdKTsJCQotCQkJCi0JCXN1cGVyLm9uU2V0VXAoKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2FmZm9sZExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCgpOwotCQlNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotCQlyZXF1ZXN0LnNldFJlcXVlc3RVUkkoIi9zY2FmZm9sZC9saXN0Iik7Ci0JCQotCQlHcm9vdnlPYmplY3QgZ28gPSBjb25maWd1cmVEeW5hbWljR08oY29udHJvbGxlckNsYXNzLCBncmFpbHNBcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQkJCi0JCS8vIGZpcnN0IHRlc3QgcmVkaXJlY3Rpb24gd2l0aGluIHRoZSBzYW1lIGNvbnRyb2xsZXIJCQotCQl0cnkgewotCQkJQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpZ28uZ2V0UHJvcGVydHkoImxpc3QiKTsKLQkJCU9iamVjdCByZXR1cm5WYWx1ZSA9IGNsb3N1cmUuY2FsbCgpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0JCQlhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTW9kZWxBbmRWaWV3KTsKLQkJCU1vZGVsQW5kVmlldyBtdiA9IChNb2RlbEFuZFZpZXcpcmV0dXJuVmFsdWU7Ci0JCQlhc3NlcnRFcXVhbHMoIi9zY2FmZm9sZC9saXN0Iixtdi5nZXRWaWV3TmFtZSgpKTsKLQkJCWFzc2VydFRydWUobXYuZ2V0TW9kZWwoKS5jb250YWluc0tleSgic2NhZmZvbGRMaXN0IikpOwotCQl9Ci0JCWNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0JCQlmYWlsKCJNaXNzaW5nIG1ldGhvZCBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQotCQljYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBleCkgewotCQkJZmFpbCgiTWlzc2luZyBwcm9wZXJ0eSBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNjYWZmb2xkRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLQkJTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLQkJcmVxdWVzdC5zZXRSZXF1ZXN0VVJJKCIvc2NhZmZvbGQvZGVsZXRlIik7Ci0JCXJlcXVlc3QuYWRkUGFyYW1ldGVyKCJpZCIsICIxIik7Ci0JCQotCQlHcm9vdnlPYmplY3QgZ28gPSBjb25maWd1cmVEeW5hbWljR08oY29udHJvbGxlckNsYXNzLCBncmFpbHNBcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQkJCi0JCS8vIGZpcnN0IHRlc3QgcmVkaXJlY3Rpb24gd2l0aGluIHRoZSBzYW1lIGNvbnRyb2xsZXIJCQotCQl0cnkgewotCQkJQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpZ28uZ2V0UHJvcGVydHkoImRlbGV0ZSIpOwotCQkJT2JqZWN0IHJldHVyblZhbHVlID0gY2xvc3VyZS5jYWxsKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJCWFzc2VydFRydWUocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBNb2RlbEFuZFZpZXcpOwotCQkJTW9kZWxBbmRWaWV3IG12ID0gKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZTsKLQkJCS8vIHNob3VsZCBkZWxlZ2F0ZSB0byBsaXN0IAotCQkJYXNzZXJ0RXF1YWxzKCIvc2NhZmZvbGQvbGlzdCIsbXYuZ2V0Vmlld05hbWUoKSk7Ci0JCQlhc3NlcnRUcnVlKG12LmdldE1vZGVsKCkuY29udGFpbnNLZXkoInNjYWZmb2xkTGlzdCIpKTsKLQkJCWFzc2VydE51bGwobXYuZ2V0TW9kZWwoKS5nZXQoInNjYWZmb2xkIikpOwotCQl9Ci0JCWNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0JCQlmYWlsKCJNaXNzaW5nIG1ldGhvZCBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQotCQljYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBleCkgewotCQkJZmFpbCgiTWlzc2luZyBwcm9wZXJ0eSBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQotCX0JCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2FmZm9sZFNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCgpOwotCQlNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotCQlyZXF1ZXN0LnNldFJlcXVlc3RVUkkoIi9zY2FmZm9sZC9zYXZlIik7Ci0JCXJlcXVlc3QuYWRkUGFyYW1ldGVyKCJuYW1lIiwgImRpbm8iKTsKLQkJCi0JCUdyb292eU9iamVjdCBnbyA9IGNvbmZpZ3VyZUR5bmFtaWNHTyhjb250cm9sbGVyQ2xhc3MsIGdyYWlsc0FwcGxpY2F0aW9uLHJlcXVlc3QscmVzcG9uc2UpOwotCQkKLQkJLy8gZmlyc3QgdGVzdCByZWRpcmVjdGlvbiB3aXRoaW4gdGhlIHNhbWUgY29udHJvbGxlcgkJCi0JCXRyeSB7Ci0JCQlDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSlnby5nZXRQcm9wZXJ0eSgic2F2ZSIpOwotCQkJT2JqZWN0IHJldHVyblZhbHVlID0gY2xvc3VyZS5jYWxsKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJCWFzc2VydFRydWUocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBNb2RlbEFuZFZpZXcpOwotCQkJTW9kZWxBbmRWaWV3IG12ID0gKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZTsKLQkJCS8vIHNob3VsZCBlbmQgdXAgYXQgdGhlIHNob3cgdmlldwotCQkJYXNzZXJ0RXF1YWxzKCIvc2NhZmZvbGQvc2hvdyIsbXYuZ2V0Vmlld05hbWUoKSk7Ci0JCQkvLyBhbmQgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgbW9kZWwKLQkJCWFzc2VydFRydWUobXYuZ2V0TW9kZWwoKS5jb250YWluc0tleSgic2NhZmZvbGQiKSk7Ci0JCQlHcm9vdnlPYmplY3QgZG9tYWluT2JqZWN0ID0gKEdyb292eU9iamVjdCltdi5nZXRNb2RlbCgpLmdldCgic2NhZmZvbGQiKTsKLQkJCWFzc2VydE5vdE51bGwoZG9tYWluT2JqZWN0KTsKLQkJCWFzc2VydEVxdWFscygiZGlubyIsIGRvbWFpbk9iamVjdC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKLQkJfQotCQljYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotCQkJZmFpbCgiTWlzc2luZyBtZXRob2QgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLQkJfQkKLQkJY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZXgpIHsKLQkJCWZhaWwoIk1pc3NpbmcgcHJvcGVydHkgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLQkJfQkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTY2FmZm9sZFVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCU1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KCk7Ci0JCU1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0JCXJlcXVlc3Quc2V0UmVxdWVzdFVSSSgiL3NjYWZmb2xkL3VwZGF0ZSIpOwotCQlyZXF1ZXN0LmFkZFBhcmFtZXRlcigiaWQiLCAiMSIpOwotCQlyZXF1ZXN0LmFkZFBhcmFtZXRlcigibmFtZSIsICJmcmVkam5yIik7Ci0JCQotCQlHcm9vdnlPYmplY3QgZ28gPSBjb25maWd1cmVEeW5hbWljR08oY29udHJvbGxlckNsYXNzLCBncmFpbHNBcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQkJCi0JCS8vIGZpcnN0IHRlc3QgcmVkaXJlY3Rpb24gd2l0aGluIHRoZSBzYW1lIGNvbnRyb2xsZXIJCQotCQl0cnkgewotCQkJQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpZ28uZ2V0UHJvcGVydHkoInVwZGF0ZSIpOwotCQkJT2JqZWN0IHJldHVyblZhbHVlID0gY2xvc3VyZS5jYWxsKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLQkJCWFzc2VydFRydWUocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBNb2RlbEFuZFZpZXcpOwotCQkJTW9kZWxBbmRWaWV3IG12ID0gKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZTsKLQkJCS8vIHNob3VsZCBlbmQgdXAgYXQgdGhlIHNob3cgdmlldwotCQkJYXNzZXJ0RXF1YWxzKCIvc2NhZmZvbGQvc2hvdyIsbXYuZ2V0Vmlld05hbWUoKSk7Ci0JCQkvLyBhbmQgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgbW9kZWwKLQkJCWFzc2VydFRydWUobXYuZ2V0TW9kZWwoKS5jb250YWluc0tleSgic2NhZmZvbGQiKSk7Ci0JCQlHcm9vdnlPYmplY3QgZG9tYWluT2JqZWN0ID0gKEdyb292eU9iamVjdCltdi5nZXRNb2RlbCgpLmdldCgic2NhZmZvbGQiKTsKLQkJCWFzc2VydE5vdE51bGwoZG9tYWluT2JqZWN0KTsKLQkJCWFzc2VydEVxdWFscygiZnJlZGpuciIsIGRvbWFpbk9iamVjdC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKLQkJfQotCQljYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotCQkJZmFpbCgiTWlzc2luZyBtZXRob2QgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLQkJfQkKLQkJY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZXgpIHsKLQkJCWZhaWwoIk1pc3NpbmcgcHJvcGVydHkgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLQkJfQkKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2NhZmZvbGRTaG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLQkJTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLQkJcmVxdWVzdC5zZXRSZXF1ZXN0VVJJKCIvc2NhZmZvbGQvc2hvdyIpOwotCQlyZXF1ZXN0LmFkZFBhcmFtZXRlcigiaWQiLCAiMSIpOwotCQkKLQkJR3Jvb3Z5T2JqZWN0IGdvID0gY29uZmlndXJlRHluYW1pY0dPKGNvbnRyb2xsZXJDbGFzcywgZ3JhaWxzQXBwbGljYXRpb24scmVxdWVzdCxyZXNwb25zZSk7Ci0JCQotCQkvLyBmaXJzdCB0ZXN0IHJlZGlyZWN0aW9uIHdpdGhpbiB0aGUgc2FtZSBjb250cm9sbGVyCQkKLQkJdHJ5IHsKLQkJCUNsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKWdvLmdldFByb3BlcnR5KCJzaG93Iik7Ci0JCQlPYmplY3QgcmV0dXJuVmFsdWUgPSBjbG9zdXJlLmNhbGwoKTsKLQkJCWFzc2VydE5vdE51bGwocmV0dXJuVmFsdWUpOwotCQkJYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE1vZGVsQW5kVmlldyk7Ci0JCQlNb2RlbEFuZFZpZXcgbXYgPSAoTW9kZWxBbmRWaWV3KXJldHVyblZhbHVlOwotCQkJYXNzZXJ0RXF1YWxzKCIvc2NhZmZvbGQvc2hvdyIsbXYuZ2V0Vmlld05hbWUoKSk7Ci0JCQlhc3NlcnRUcnVlKG12LmdldE1vZGVsKCkuY29udGFpbnNLZXkoInNjYWZmb2xkIikpOwotCQkJCi0JCQkvLwlub3cgdHJ5IGEgcnViaXNoIGlkCi0JCQlyZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLQkJCXJlcXVlc3Quc2V0UmVxdWVzdFVSSSgiL3NjYWZmb2xkL3Nob3ciKTsKLQkJCXJlcXVlc3QuYWRkUGFyYW1ldGVyKCJpZCIsICIxMzQyMyIpOwkJCQotCQkJZ28gPSBjb25maWd1cmVEeW5hbWljR08oY29udHJvbGxlckNsYXNzLCBncmFpbHNBcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQkJCQotCQkJY2xvc3VyZSA9IChDbG9zdXJlKWdvLmdldFByb3BlcnR5KCJzaG93Iik7Ci0JCQlyZXR1cm5WYWx1ZSA9IGNsb3N1cmUuY2FsbCgpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0JCQlhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTW9kZWxBbmRWaWV3KTsKLQkJCW12ID0gKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZTsKLQkJCWFzc2VydEVxdWFscygiL3NjYWZmb2xkL3Nob3ciLG12LmdldFZpZXdOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShtdi5nZXRNb2RlbCgpLmNvbnRhaW5zS2V5KCJzY2FmZm9sZCIpKTsKLQkJCQotCQkJLy8gbm93IHRyeSBhIGRpZmZlcmVudCBhY3Rpb24gbmFtZSB0aGF0IHVzZXMgdGhlIHNhbWUgY2xhc3MKLQkJCS8vIHRvIGltcGxlbWVudCBzY2FmZm9sZGluZwotCQkJcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KCk7Ci0JCQlyZXF1ZXN0LnNldFJlcXVlc3RVUkkoIi9zY2FmZm9sZC9lZGl0Iik7Ci0JCQlyZXF1ZXN0LmFkZFBhcmFtZXRlcigiaWQiLCAiMSIpOwkJCQotCQkJZ28gPSBjb25maWd1cmVEeW5hbWljR08oY29udHJvbGxlckNsYXNzLCBncmFpbHNBcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQkJCQotCQkJY2xvc3VyZSA9IChDbG9zdXJlKWdvLmdldFByb3BlcnR5KCJlZGl0Iik7Ci0JCQlyZXR1cm5WYWx1ZSA9IGNsb3N1cmUuY2FsbCgpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0JCQlhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTW9kZWxBbmRWaWV3KTsKLQkJCW12ID0gKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZTsKLQkJCWFzc2VydEVxdWFscygiL3NjYWZmb2xkL2VkaXQiLG12LmdldFZpZXdOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShtdi5nZXRNb2RlbCgpLmNvbnRhaW5zS2V5KCJzY2FmZm9sZCIpKTsJCQkKLQkJCQotCQl9Ci0JCWNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0JCQlmYWlsKCJNaXNzaW5nIG1ldGhvZCBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQotCQljYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBleCkgewotCQkJZmFpbCgiTWlzc2luZyBwcm9wZXJ0eSBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotCQl9CQkJCQkJCQotCX0JCQotCQotCQotCi0JcHJpdmF0ZSBHcm9vdnlPYmplY3QgY29uZmlndXJlRHluYW1pY0dPKENsYXNzIGdyb292eUNsYXNzLEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLQl0aHJvd3MgRXhjZXB0aW9uIHsKLQlQcm94eU1ldGFDbGFzcyBwbWMgPSBQcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzLmdldEluc3RhbmNlKGdyb292eUNsYXNzKTsKLQkvLyBwcm9vZiBvZiBjb25jZXB0IHRvIHRyeSBvdXQgcHJveHkgbWV0YSBjbGFzcwotCQotCUJlYW5EZWZpbml0aW9uIGJkID0gbmV3IFJvb3RCZWFuRGVmaW5pdGlvbihncm9vdnlDbGFzcyxmYWxzZSk7Ci0JbG9jYWxDb250ZXh0LnJlZ2lzdGVyQmVhbkRlZmluaXRpb24oIGdyb292eUNsYXNzLmdldE5hbWUoKSwgYmQgKTsKLQkJCQotCQotCUdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgaGVscGVyID0gbmV3IFNpbXBsZUdyYWlsc0NvbnRyb2xsZXJIZWxwZXIoYXBwbGljYXRpb24sdGhpcy5hcHBDdHgsIG5ldyBNb2NrU2VydmxldENvbnRleHQoKSk7Ci0JR3Jvb3Z5T2JqZWN0IGdvID0gKEdyb292eU9iamVjdClncm9vdnlDbGFzcy5uZXdJbnN0YW5jZSgpOwotCXBtYy5zZXRJbnRlcmNlcHRvciggbmV3IENvbnRyb2xsZXJEeW5hbWljTWV0aG9kcyhnbyxoZWxwZXIscmVxdWVzdCxyZXNwb25zZSkgKTsKLQkKLQkKLQlnby5zZXRNZXRhQ2xhc3MoIHBtYyApOwotCXJldHVybiBnbzsKLX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb25maWdMb2NhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAib3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvZ3JhaWxzLXNjYWZmb2xkaW5nLXRlc3RzLnhtbCIgfTsKLQl9CQotCQotCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3JUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQyMThhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RvbWFpbkNsYXNzUHJvcGVydHlDb21wYXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5zY2FmZm9sZGluZzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkRlZmF1bHRHcmFpbHNEb21haW5DbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLkdyYWlsc0RvbWFpbkNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5BcnJheVV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKLSAqIEBzaW5jZSAxMC1GZWItMjAwNgotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNvbXBhcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIENsYXNzIGRjID0gZ2NsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3QgeyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgTG9uZyBpZDsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgTG9uZyB2ZXJzaW9uOyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkBQcm9wZXJ0eSBTdHJpbmcgbmFtZTsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgRGF0ZSBhZ2UiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgU3RyaW5nIHppcCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkBQcm9wZXJ0eSBTdHJpbmcgZG9iIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQFByb3BlcnR5IGNvbnN0cmFpbnRzID0geyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgbmFtZShsZW5ndGg6NS4uMTUpIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICBhZ2UoKSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9ICB9Iik7Ci0gICAgICAgIEdyYWlsc0RvbWFpbkNsYXNzIGRvbWFpbkNsYXNzID0gbmV3IERlZmF1bHRHcmFpbHNEb21haW5DbGFzcyhkYyk7Ci0KLSAgICAgICAgRG9tYWluQ2xhc3NQcm9wZXJ0eUNvbXBhcmF0b3IgY29tcCA9IG5ldyBEb21haW5DbGFzc1Byb3BlcnR5Q29tcGFyYXRvcihkb21haW5DbGFzcyk7Ci0KLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3NQcm9wZXJ0eVtdIHByb3BzID1kb21haW5DbGFzcy5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KHByb3BzLGNvbXApOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlVdGlscy50b1N0cmluZyhwcm9wcykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImlkIixwcm9wc1swXS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLHByb3BzWzFdLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWdlIixwcm9wc1syXS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRvYiIscHJvcHNbM10uZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIixwcm9wc1s0XS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInppcCIscHJvcHNbNV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9HcmFpbHNUZW1wbGF0ZUdlbmVyYXRvcnNUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3JzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjZTA3Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9HcmFpbHNUZW1wbGF0ZUdlbmVyYXRvcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnNjYWZmb2xkaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzRG9tYWluQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzRG9tYWluQ2xhc3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCi0gKiBAc2luY2UgMDktRmViLTIwMDYKLSAqLwotcHVibGljIGNsYXNzIEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlQ29udHJvbGxlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIGdlbmVyYXRvciA9IChHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvcilnY2wucGFyc2VDbGFzcyhnY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvRGVmYXVsdEdyYWlsc1RlbXBsYXRlR2VuZXJhdG9yLmdyb292eSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotCi0KLSAgICAgICAgQ2xhc3MgZGMgPSBnY2wucGFyc2VDbGFzcygiY2xhc3MgVGVzdCB7IFxuQFByb3BlcnR5IExvbmcgaWQ7XG4gQFByb3BlcnR5IExvbmcgdmVyc2lvbjsgIH0iKTsKLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzKGRjKTsKLQotICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVDb250cm9sbGVyKGRvbWFpbkNsYXNzLCJ0ZXN0Iik7Ci0KLSAgICAgICAgRmlsZSBnZW5lcmF0ZWRGaWxlID0gbmV3IEZpbGUoInRlc3QvVGVzdENvbnRyb2xsZXIuZ3Jvb3Z5Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZ2VuZXJhdGVkRmlsZS5leGlzdHMoKSk7Ci0KLSAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKW5ldyBHcm9vdnlTaGVsbCgpLmV2YWx1YXRlKCJuZXcgRmlsZSgndGVzdC9UZXN0Q29udHJvbGxlci5ncm9vdnknKS50ZXh0Iik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0LmluZGV4T2YoImNsYXNzIFRlc3RDb250cm9sbGVyIikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUodGV4dC5pbmRleE9mKCJAUHJvcGVydHkgbGlzdCIpID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaW5kZXhPZigiQFByb3BlcnR5IHVwZGF0ZSIpID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaW5kZXhPZigiQFByb3BlcnR5IGNyZWF0ZSIpID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaW5kZXhPZigiQFByb3BlcnR5IHNob3ciKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0LmluZGV4T2YoIkBQcm9wZXJ0eSBlZGl0IikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUodGV4dC5pbmRleE9mKCJAUHJvcGVydHkgZGVsZXRlIikgPiAtMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlVmlld3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCi0gICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICBnZW5lcmF0b3IgPSAoR3JhaWxzVGVtcGxhdGVHZW5lcmF0b3IpZ2NsLnBhcnNlQ2xhc3MoZ2NsLmdldFJlc291cmNlQXNTdHJlYW0oIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL0RlZmF1bHRHcmFpbHNUZW1wbGF0ZUdlbmVyYXRvci5ncm9vdnkiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLQotCi0gICAgICAgIENsYXNzIGRjID0gZ2NsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3QgeyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgTG9uZyBpZDsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgTG9uZyB2ZXJzaW9uOyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkBQcm9wZXJ0eSBTdHJpbmcgbmFtZTsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgVGltZVpvbmUgdHo7IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQFByb3BlcnR5IExvY2FsZSBsb2NhbGU7IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQFByb3BlcnR5IEN1cnJlbmN5IGN1cnJlbmN5OyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkBQcm9wZXJ0eSBCb29sZWFuIGFjdGl2ZTsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5AUHJvcGVydHkgRGF0ZSBhZ2UgIH0iKTsKLSAgICAgICAgR3JhaWxzRG9tYWluQ2xhc3MgZG9tYWluQ2xhc3MgPSBuZXcgRGVmYXVsdEdyYWlsc0RvbWFpbkNsYXNzKGRjKTsKLQotICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVWaWV3cyhkb21haW5DbGFzcywidGVzdCIpOwotCi0gICAgICAgIEZpbGUgc2hvd0ZpbGUgPSBuZXcgRmlsZSgidGVzdC9ncmFpbHMtYXBwL3ZpZXdzL3Rlc3Qvc2hvdy5nc3AiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG93RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIEZpbGUgbGlzdEZpbGUgPSBuZXcgRmlsZSgidGVzdC9ncmFpbHMtYXBwL3ZpZXdzL3Rlc3QvbGlzdC5nc3AiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIEZpbGUgZWRpdEZpbGUgPSBuZXcgRmlsZSgidGVzdC9ncmFpbHMtYXBwL3ZpZXdzL3Rlc3QvZWRpdC5nc3AiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlZGl0RmlsZS5leGlzdHMoKSk7ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC9zY2FmZm9sZGluZy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy9zY2FmZm9sZGluZy9TY2FmZm9sZFRlbXBsYXRlVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkVGVtcGxhdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQ4NTFhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL1NjYWZmb2xkVGVtcGxhdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuc2NhZmZvbGRpbmc7Ci0KLWltcG9ydCBncm9vdnkudGV4dC5TaW1wbGVUZW1wbGF0ZUVuZ2luZTsKLWltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKLWltcG9ydCBncm9vdnkubGFuZy5JbnRSYW5nZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMudmFsaWRhdGlvbi5Db25zdHJhaW5lZFByb3BlcnR5OwotaW1wb3J0IG9yZy5kb200ai5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZG9tNGouRG9jdW1lbnRIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTY2FmZm9sZFRlbXBsYXRlVGVzdHMgIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1RlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpbXBsZVRlbXBsYXRlRW5naW5lIHRlbXBsYXRlRW5naW5lID0gbmV3IFNpbXBsZVRlbXBsYXRlRW5naW5lKCk7Ci0KLSAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZUVuZ2luZS5jcmVhdGVUZW1wbGF0ZShuZXcgRmlsZSgic3JjL2dyYWlscy90ZW1wbGF0ZXMvZ3JhaWxzLWFwcC92aWV3cy9zY2FmZm9sZGluZy9qYXZhLmxhbmcuU3RyaW5nLnRlbXBsYXRlIikpOwotICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgYmluZGluZy5wdXQoIm5hbWUiLCAidGVzdE5hbWUiKTsKLSAgICAgICAgYmluZGluZy5wdXQoInZhbHVlIiwgInRlc3RWYWx1ZSIpOwotICAgICAgICBiaW5kaW5nLnB1dCgiY29uc3RyYWludHMiLCBudWxsKTsKLQotICAgICAgICBEb2N1bWVudCB4bWwgPSBEb2N1bWVudEhlbHBlci5wYXJzZVRleHQodGVtcGxhdGUubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKLQotCi0gICAgICAgIGFzc2VydEVxdWFscygidGV4dGFyZWEiLHhtbC5nZXRSb290RWxlbWVudCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdE5hbWUiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RWYWx1ZSIseG1sLmdldFJvb3RFbGVtZW50KCkuZ2V0VGV4dCgpKTsKLQotICAgICAgICAvLyB0ZXN0IHdpdGggYSBsZW5ndGggcmVzdHJpY3Rpb24gaGVuY2UgYmVjb21pbmcgYW4gaW5wdXQgZmllbGQKLSAgICAgICAgQ29uc3RyYWluZWRQcm9wZXJ0eSBjcCA9IG5ldyBDb25zdHJhaW5lZFByb3BlcnR5KE9iamVjdC5jbGFzcywidGVzdE5hbWUiLFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIGNwLnNldE1heExlbmd0aCg1MCk7Ci0gICAgICAgIGNwLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgLy8gdGVzdCB3aXRoIGEgY3VzdG9tIGF0dHJpYnV0ZQotICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCkgOwotICAgICAgICBhdHRyaWJ1dGVzLnB1dCgiY2xhc3MiLCAiTXlDbGFzcyIpOwotICAgICAgICBjcC5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMgKTsKLSAgICAgICAgYmluZGluZy5wdXQoImNvbnN0cmFpbnRzIixjcCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgICAgIHhtbCA9IERvY3VtZW50SGVscGVyLnBhcnNlVGV4dCh0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiaW5wdXQiLHhtbC5nZXRSb290RWxlbWVudCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGV4dCIseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoInR5cGUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTAiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJtYXhsZW5ndGgiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdE5hbWUiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RWYWx1ZSIseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoInZhbHVlIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk15Q2xhc3MiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJjbGFzcyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWFkb25seSIseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoInJlYWRvbmx5IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFuVGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2ltcGxlVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTsKLQotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlRW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCJzcmMvZ3JhaWxzL3RlbXBsYXRlcy9ncmFpbHMtYXBwL3ZpZXdzL3NjYWZmb2xkaW5nL2phdmEubGFuZy5Cb29sZWFuLmdzcCIpKTsKLSAgICAgICAgTWFwIGJpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGJpbmRpbmcucHV0KCJuYW1lIiwgInRlc3RCb29sZWFuIik7Ci0gICAgICAgIGJpbmRpbmcucHV0KCJ2YWx1ZSIsIG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgYmluZGluZy5wdXQoImNvbnN0cmFpbnRzIiwgbnVsbCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgeG1sID0gRG9jdW1lbnRIZWxwZXIucGFyc2VUZXh0KHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnB1dCIseG1sLmdldFJvb3RFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGVja2JveCIseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoInR5cGUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdEJvb2xlYW4iLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGVja2VkIix4bWwuZ2V0Um9vdEVsZW1lbnQoKS5hdHRyaWJ1dGVWYWx1ZSgiY2hlY2tlZCIpKTsKLQotICAgICAgICBiaW5kaW5nLnB1dCgidmFsdWUiLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotICAgICAgICB4bWwgPSBEb2N1bWVudEhlbHBlci5wYXJzZVRleHQodGVtcGxhdGUubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImlucHV0Iix4bWwuZ2V0Um9vdEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoZWNrYm94Iix4bWwuZ2V0Um9vdEVsZW1lbnQoKS5hdHRyaWJ1dGVWYWx1ZSgidHlwZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Qm9vbGVhbiIseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoIm5hbWUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLHhtbC5nZXRSb290RWxlbWVudCgpLmF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwseG1sLmdldFJvb3RFbGVtZW50KCkuYXR0cmlidXRlVmFsdWUoImNoZWNrZWQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGVUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTaW1wbGVUZW1wbGF0ZUVuZ2luZSB0ZW1wbGF0ZUVuZ2luZSA9IG5ldyBTaW1wbGVUZW1wbGF0ZUVuZ2luZSgpOwotCi0gICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVFbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoInNyYy9ncmFpbHMvdGVtcGxhdGVzL2dyYWlscy1hcHAvdmlld3Mvc2NhZmZvbGRpbmcvamF2YS51dGlsLkRhdGUuZ3NwIikpOwotICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgYmluZGluZy5wdXQoIm5hbWUiLCAidGVzdERhdGUiKTsKLSAgICAgICAgYmluZGluZy5wdXQoInllYXIiLCBuZXcgSW50ZWdlcigyMDA2KSk7Ci0gICAgICAgIGJpbmRpbmcucHV0KCJtb250aCIsIG5ldyBJbnRlZ2VyKDIpKTsKLSAgICAgICAgYmluZGluZy5wdXQoImRheSIsIG5ldyBJbnRlZ2VyKDUpKTsKLSAgICAgICAgYmluZGluZy5wdXQoImhvdXIiLCAiMTIiKTsKLSAgICAgICAgYmluZGluZy5wdXQoIm1pbnV0ZSIsICI0NSIpOwotICAgICAgICBiaW5kaW5nLnB1dCgiY29uc3RyYWludHMiLCBudWxsKTsKLQotCi0gICAgICAgIERvY3VtZW50IHhtbCA9IERvY3VtZW50SGVscGVyLnBhcnNlVGV4dCh0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGVUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTaW1wbGVUZW1wbGF0ZUVuZ2luZSB0ZW1wbGF0ZUVuZ2luZSA9IG5ldyBTaW1wbGVUZW1wbGF0ZUVuZ2luZSgpOwotCi0gICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVFbmdpbmUuY3JlYXRlVGVtcGxhdGUobmV3IEZpbGUoInNyYy9ncmFpbHMvdGVtcGxhdGVzL2dyYWlscy1hcHAvdmlld3Mvc2NhZmZvbGRpbmcvamF2YS51dGlsLkxvY2FsZS5nc3AiKSk7Ci0gICAgICAgIE1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBiaW5kaW5nLnB1dCgibmFtZSIsICJ0ZXN0TG9jYWxlIik7Ci0gICAgICAgIGJpbmRpbmcucHV0KCJ2YWx1ZSIsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICBiaW5kaW5nLnB1dCgiY29uc3RyYWludHMiLCBudWxsKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVtcGxhdGUubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKLSAgICAgICAgRG9jdW1lbnQgeG1sID0gRG9jdW1lbnRIZWxwZXIucGFyc2VUZXh0KHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpbWVab25lVGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2ltcGxlVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTsKLQotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlRW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCJzcmMvZ3JhaWxzL3RlbXBsYXRlcy9ncmFpbHMtYXBwL3ZpZXdzL3NjYWZmb2xkaW5nL2phdmEudXRpbC5UaW1lWm9uZS5nc3AiKSk7Ci0gICAgICAgIE1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBiaW5kaW5nLnB1dCgibmFtZSIsICJ0ZXN0VGltZVpvbmUiKTsKLSAgICAgICAgYmluZGluZy5wdXQoInZhbHVlIiwgVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgYmluZGluZy5wdXQoImNvbnN0cmFpbnRzIiwgbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEN1cnJlbmN5VGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2ltcGxlVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTsKLQotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlRW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCJzcmMvZ3JhaWxzL3RlbXBsYXRlcy9ncmFpbHMtYXBwL3ZpZXdzL3NjYWZmb2xkaW5nL2phdmEudXRpbC5DdXJyZW5jeS5nc3AiKSk7Ci0gICAgICAgIE1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBiaW5kaW5nLnB1dCgibmFtZSIsICJ0ZXN0Q3VycmVuY3kiKTsKLSAgICAgICAgYmluZGluZy5wdXQoInZhbHVlIiwgQ3VycmVuY3kuZ2V0SW5zdGFuY2UoTG9jYWxlLmdldERlZmF1bHQoKSkpOwotICAgICAgICBiaW5kaW5nLnB1dCgiY29uc3RyYWludHMiLCBudWxsKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVtcGxhdGUubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyVGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2ltcGxlVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTsKLQotICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlRW5naW5lLmNyZWF0ZVRlbXBsYXRlKG5ldyBGaWxlKCJzcmMvZ3JhaWxzL3RlbXBsYXRlcy9ncmFpbHMtYXBwL3ZpZXdzL3NjYWZmb2xkaW5nL2phdmEubGFuZy5OdW1iZXIuZ3NwIikpOwotICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgYmluZGluZy5wdXQoIm5hbWUiLCAidGVzdE51bWJlciIpOwotICAgICAgICBiaW5kaW5nLnB1dCgidmFsdWUiLCBuZXcgSW50ZWdlcig1MCkpOwotICAgICAgICBiaW5kaW5nLnB1dCgiY29uc3RyYWludHMiLCBudWxsKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgICAgIERvY3VtZW50IHhtbCA9IERvY3VtZW50SGVscGVyLnBhcnNlVGV4dCh0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImlucHV0Iix4bWwuZ2V0Um9vdEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgICBDb25zdHJhaW5lZFByb3BlcnR5IGNwID0gbmV3IENvbnN0cmFpbmVkUHJvcGVydHkoT2JqZWN0LmNsYXNzLCAidGVzdE51bWJlciIsIEludGVnZXIuY2xhc3MpOwotICAgICAgICBjcC5zZXRSYW5nZShuZXcgSW50UmFuZ2UoMjUsMTI1KSk7Ci0gICAgICAgIGJpbmRpbmcucHV0KCJjb25zdHJhaW50cyIsIGNwKTsKLSAgICAgICAgCi0gICAgICAgIHhtbCA9IERvY3VtZW50SGVscGVyLnBhcnNlVGV4dCh0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNlbGVjdCIseG1sLmdldFJvb3RFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXBsYXRlLm1ha2UoYmluZGluZykudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvZ3JhaWxzLXNjYWZmb2xkaW5nLXRlc3RzLnhtbCBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3NjYWZmb2xkaW5nL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3NjYWZmb2xkaW5nL2dyYWlscy1zY2FmZm9sZGluZy10ZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTAzYWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvc2NhZmZvbGRpbmcvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvc2NhZmZvbGRpbmcvZ3JhaWxzLXNjYWZmb2xkaW5nLXRlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLQk8YmVhbiBpZD0iZGF0YVNvdXJjZSIgY2xhc3M9Im9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZSIgZGVzdHJveS1tZXRob2Q9ImNsb3NlIj4KLQkgICAgPHByb3BlcnR5IG5hbWU9ImRyaXZlckNsYXNzTmFtZSI+Ci0JICAgICAgICA8dmFsdWU+b3JnLmhzcWxkYi5qZGJjRHJpdmVyPC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4KLQkgICAgPHByb3BlcnR5IG5hbWU9InVybCI+Ci0JICAgICAgICA8dmFsdWU+amRiYzpoc3FsZGI6bWVtOmdyYWlsc0RCPC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4KLQkgICAgPHByb3BlcnR5IG5hbWU9InVzZXJuYW1lIj4KLQkgICAgICAgIDx2YWx1ZT5zYTwvdmFsdWU+Ci0JICAgIDwvcHJvcGVydHk+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXNzd29yZCI+Ci0JICAgICAgICA8dmFsdWU+PC92YWx1ZT4KLQkgICAgPC9wcm9wZXJ0eT4JCQkJCQotCTwvYmVhbj4KLTwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL0dyYWlsc0RhdGFCaW5kZXJUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9iaW5kaW5nL0dyYWlsc0RhdGFCaW5kZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI4NGI2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvYmluZGluZy9HcmFpbHNEYXRhQmluZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDA0LTIwMDUgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuYmluZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA1LUphbi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNEYXRhQmluZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBjbGFzcyBUZXN0QmVhbiB7Ci0gICAgICAgIHByaXZhdGUgRGF0ZSBteURhdGU7Ci0KLSAgICAgICAgcHVibGljIERhdGUgZ2V0TXlEYXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG15RGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE15RGF0ZShEYXRlIG15RGF0ZSkgewotICAgICAgICAgICAgdGhpcy5teURhdGUgPSBteURhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEJpbmRTdHJ1Y3R1cmVkRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCgpOwotICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcigibXlEYXRlIiwic3RydWN0Iik7Ci0gICAgICAgIHJlcXVlc3QuYWRkUGFyYW1ldGVyKCJteURhdGVfeWVhciIsIjIwMDYiKTsKLSAgICAgICAgcmVxdWVzdC5hZGRQYXJhbWV0ZXIoIm15RGF0ZV9tb250aCIsIjEiKTsKLSAgICAgICAgcmVxdWVzdC5hZGRQYXJhbWV0ZXIoIm15RGF0ZV9kYXkiLCIzMSIpOwotICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcigibXlEYXRlX2hvdXIiLCIxNiIpOwotICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcigibXlEYXRlX21pbnV0ZSIsIjQ1Iik7Ci0KLSAgICAgICAgVGVzdEJlYW4gdGVzdEJlYW4gPSBuZXcgVGVzdEJlYW4oKTsKLSAgICAgICAgR3JhaWxzRGF0YUJpbmRlciBiaW5kZXIgPSBuZXcgR3JhaWxzRGF0YUJpbmRlcih0ZXN0QmVhbiwidGVzdEJlYW4iKTsKLSAgICAgICAgYmluZGVyLmJpbmQocmVxdWVzdCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0QmVhbi5nZXRNeURhdGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0ZXN0QmVhbi5nZXRNeURhdGUoKSk7Ci0gICAgICAgIENhbGVuZGFyIGMgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgYy5zZXRUaW1lKHRlc3RCZWFuLmdldE15RGF0ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwNixjLmdldChDYWxlbmRhci5ZRUFSKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLGMuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzMSxjLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDE2LGMuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0NSxjLmdldChDYWxlbmRhci5NSU5VVEUpKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvbWV0YWNsYXNzL0NvbnRyb2xsZXJNZXRhQ2xhc3NUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQ29udHJvbGxlck1ldGFDbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwM2FlYWYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9tZXRhY2xhc3MvQ29udHJvbGxlck1ldGFDbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIubWV0YWNsYXNzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5EZWZhdWx0R3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5HcmFpbHNBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy5jb21tb25zLm1ldGFjbGFzcy5Qcm9wZXJ0eUFjY2Vzc1Byb3h5TWV0YUNsYXNzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5HcmFpbHNDb250cm9sbGVySGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5TaW1wbGVHcmFpbHNDb250cm9sbGVySGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0LkdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLkJlYW5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LlJvb3RCZWFuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5HZW5lcmljQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja1NlcnZsZXRDb250ZXh0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbGxlck1ldGFDbGFzc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0KLSAgICBwcml2YXRlIEdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhQ2xhc3NQcm94eSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotCi0gICAgICAgIENsYXNzIGdyb292eUNsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBUZXN0Q2xhc3Mge1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGVmIHRlc3RNZXRob2QoKSB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ9IiApOwotCi0gICAgICAgIFByb3h5TWV0YUNsYXNzIHBtYyA9IFByb3h5TWV0YUNsYXNzLmdldEluc3RhbmNlKGdyb292eUNsYXNzKTsKLSAgICAgICAgLy8gcHJvb2Ygb2YgY29uY2VwdCB0byB0cnkgb3V0IHByb3h5IG1ldGEgY2xhc3MKLSAgICAgICAgcG1jLnNldEludGVyY2VwdG9yKCBuZXcgVHJhY2luZ0ludGVyY2VwdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZG9JbnZva2UoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KWdyb292eUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgZ28uc2V0TWV0YUNsYXNzKCBwbWMgKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGludm9rZSByZWFsIG1ldGhvZAotICAgICAgICAgICAgZ28uaW52b2tlTWV0aG9kKCJ0ZXN0TWV0aG9kIiwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgLy8gaW52b2tlIGZha2UgbWV0aG9kCi0gICAgICAgICAgICBnby5pbnZva2VNZXRob2QoImZha2VNZXRob2QiLCBuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKLSAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgbWV0aG9kIGV4Y2VwdGlvbiBzaG91bGQgbm90IGhhdmUgYmVlbiB0aHJvd24hIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1zRHluYW1pY1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotICAgICAgICAgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLSAgICAgICAgIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0KLSAgICAgICAgIHJlcXVlc3QuYWRkUGFyYW1ldGVyKCJ0ZXN0UGFyYW0iLCAidGVzdFZhbHVlIik7Ci0KLSAgICAgICAgIENsYXNzIGdyb292eUNsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBUZXN0Q29udHJvbGxlciB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQFByb3BlcnR5IGxpc3QgPSB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIn0iICk7Ci0KLQotICAgICAgICAgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKG5ldyBDbGFzc1tdIHsgZ3Jvb3Z5Q2xhc3MgfSxnY2wpOwotICAgICAgICAgcmVnaXN0ZXJCZWFuRGVmaW5pdGlvbihncm9vdnlDbGFzcyxhcHBsaWNhdGlvbiwgcmVxdWVzdCxyZXNwb25zZSk7Ci0gICAgICAgICBHcmFpbHNDb250cm9sbGVySGVscGVyIGhlbHBlcjEgPSBuZXcgU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlcihhcHBsaWNhdGlvbixjb250ZXh0LG5ldyBNb2NrU2VydmxldENvbnRleHQoKSk7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIGhlbHBlcjEuaGFuZGxlVVJJKCIvdGVzdC9saXN0IixyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICAgICAgICAgICBHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KXJlcXVlc3QuZ2V0QXR0cmlidXRlKEdyYWlsc0FwcGxpY2F0aW9uQXR0cmlidXRlcy5DT05UUk9MTEVSKTsKLSAgICAgICAgICAgICBPYmplY3QgcGFyYW1zID0gZ28uZ2V0UHJvcGVydHkoICJwYXJhbXMiICk7Ci0KLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmFtcyk7Ci0gICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwYXJhbXMgaW5zdGFuY2VvZiBNYXApOwotCi0gICAgICAgICAgICAgTWFwIHBhcmFtc01hcCA9IChNYXApcGFyYW1zOwotICAgICAgICAgICAgIGFzc2VydFRydWUocGFyYW1zTWFwLmNvbnRhaW5zS2V5KCJ0ZXN0UGFyYW0iKSk7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0VmFsdWUiLHBhcmFtc01hcC5nZXQoInRlc3RQYXJhbSIpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhdGNoKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7Ci0gICAgICAgICAgICAgZmFpbCgiTWlzc2luZyBtZXRob2QgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhdGNoKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGV4KSB7Ci0gICAgICAgICAgICAgZmFpbCgiTWlzc2luZyBwcm9wZXJ0eSBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3REeW5hbWljTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0gICAgICAgIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KCk7Ci0gICAgICAgIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0KLQotICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcigidGVzdFBhcmFtIiwgInRlc3RWYWx1ZSIpOwotCi0gICAgICAgIENsYXNzIGdyb292eUNsYXNzID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBUZXN0Q29udHJvbGxlciB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJAUHJvcGVydHkgbmV4dCA9IHtcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gWydzdWNjZXNzJzp0aGlzLnBhcmFtc1sndGVzdFBhcmFtMiddXSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIkBQcm9wZXJ0eSBsaXN0ID0ge1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGlyZWN0KGFjdGlvbjpuZXh0LHBhcmFtczpbJ3Rlc3RQYXJhbTInOid0ZXN0VmFsdWUyJ10pXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ9IiApOwotICAgICAgICBDbGFzcyBzZWNvbmRDb250cm9sbGVyID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBTZWNvbmRDb250cm9sbGVyIHtcbiIgKwotICAgICAgICAgICAgICAgICJAUHJvcGVydHkgbGlzdCA9IHtcbiIgKwotICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHJlZGlyZWN0KGFjdGlvbjondGVzdC9saXN0JyxwYXJhbXM6Wyd0ZXN0UGFyYW0yJzondGVzdFZhbHVlMiddKVxuIiArCi0gICAgICAgICAgICAgICAgIn1cbiIgKwotICAgICAgICAgICAgICAgICJ9IiApOwotCi0gICAgICAgIEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbmV3IERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbihuZXcgQ2xhc3NbXSB7IGdyb292eUNsYXNzLHNlY29uZENvbnRyb2xsZXIgfSxnY2wpOwotICAgICAgICByZWdpc3RlckJlYW5EZWZpbml0aW9uKGdyb292eUNsYXNzLCBhcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRGVmaW5pdGlvbihzZWNvbmRDb250cm9sbGVyLCBhcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLQotICAgICAgICBHcmFpbHNDb250cm9sbGVySGVscGVyIGhlbHBlcjEgPSBuZXcgU2ltcGxlR3JhaWxzQ29udHJvbGxlckhlbHBlcihhcHBsaWNhdGlvbixjb250ZXh0LG5ldyBNb2NrU2VydmxldENvbnRleHQoKSk7Ci0gICAgICAgIEdyYWlsc0NvbnRyb2xsZXJIZWxwZXIgaGVscGVyMiA9IG5ldyBTaW1wbGVHcmFpbHNDb250cm9sbGVySGVscGVyKGFwcGxpY2F0aW9uLGNvbnRleHQsbmV3IE1vY2tTZXJ2bGV0Q29udGV4dCgpKTsKLQotICAgICAgICAvLyBmaXJzdCB0ZXN0IHJlZGlyZWN0aW9uIHdpdGhpbiB0aGUgc2FtZSBjb250cm9sbGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoZWxwZXIxLmhhbmRsZVVSSSgiL3Rlc3QvbGlzdCIscmVxdWVzdCxyZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKLSAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgbWV0aG9kIGV4Y2VwdGlvbiBzaG91bGQgbm90IGhhdmUgYmVlbiB0aHJvd24hIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgcHJvcGVydHkgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBub3cgcmVkaXJlY3Rpb24gdG8gYW5vdGhlciBjb250cm9sbGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0gICAgICAgICAgICBoZWxwZXIyLmhhbmRsZVVSSSgiL3NlY29uZC9saXN0IixyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotICAgICAgICAgICAgZmFpbCgiTWlzc2luZyBtZXRob2QgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBleCkgewotICAgICAgICAgICAgZmFpbCgiTWlzc2luZyBwcm9wZXJ0eSBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLypwdWJsaWMgdm9pZCB0ZXN0Q2hhaW5EeW5hbWljTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpOwotICAgICAgICAgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3QoKTsKLSAgICAgICAgIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0JCQotICAgICAgICAgcmVxdWVzdC5hZGRQYXJhbWV0ZXIoInRlc3RQYXJhbSIsICJ0ZXN0VmFsdWUiKTsKLQkJCi0gICAgICAgICBDbGFzcyBncm9vdnlDbGFzcyA9IGdjbC5wYXJzZUNsYXNzKCAiY2xhc3MgVGVzdENvbnRyb2xsZXIge1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkBQcm9wZXJ0eSBuZXh0ID0ge1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFpbihhY3Rpb246dGhpcy5uZXh0Mixtb2RlbDpbJ215bW9kZWwyJzonbXl2YWx1ZTInXSxwYXJhbXM6Wyd0ZXN0UGFyYW0yJzp0aGlzLnBhcmFtc1sndGVzdFBhcmFtMiddXSlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQFByb3BlcnR5IG5leHQyID0ge1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gWydzdWNjZXNzJzp0aGlzLnBhcmFtc1sndGVzdFBhcmFtMiddXSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQFByb3BlcnR5IGxpc3QgPSB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYWluKGFjdGlvbjp0aGlzLm5leHQsbW9kZWw6WydteW1vZGVsJzonbXl2YWx1ZSddLHBhcmFtczpbJ3Rlc3RQYXJhbTInOid0ZXN0VmFsdWUyJ10pXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIn0iICk7Ci0gICAgICAgICBDbGFzcyBzZWNvbmRDb250cm9sbGVyID0gZ2NsLnBhcnNlQ2xhc3MoICJjbGFzcyBTZWNvbmRDb250cm9sbGVyIHtcbiIgKwotICAgICAgICAgICAgICAgICAiQFByb3BlcnR5IGxpc3QgPSB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gY2hhaW4oYWN0aW9uOid0ZXN0L2xpc3QnLG1vZGVsOlsnbXltb2RlbCc6J215dmFsdWUnXSxwYXJhbXM6Wyd0ZXN0UGFyYW0yJzondGVzdFZhbHVlMiddKVxuIiArCi0gICAgICAgICAgICAgICAgICJ9XG4iICsKLSAgICAgICAgICAgICAgICAgIn0iICk7Ci0JCQotICAgICAgICAgR3JhaWxzQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKG5ldyBDbGFzc1tdIHsgZ3Jvb3Z5Q2xhc3Msc2Vjb25kQ29udHJvbGxlciB9LGdjbCk7Ci0gICAgICAgICBHcm9vdnlPYmplY3QgZ28gPSByZWdpc3RlckJlYW5EZWZpbml0aW9uKGdyb292eUNsYXNzLCBhcHBsaWNhdGlvbixyZXF1ZXN0LHJlc3BvbnNlKTsKLSAgICAgICAgIEdyb292eU9iamVjdCBnbzIgPSByZWdpc3RlckJlYW5EZWZpbml0aW9uKHNlY29uZENvbnRyb2xsZXIsIGFwcGxpY2F0aW9uLHJlcXVlc3QscmVzcG9uc2UpOwotCQkKLSAgICAgICAgIC8vIGZpcnN0IHRlc3QgcmVkaXJlY3Rpb24gd2l0aGluIHRoZSBzYW1lIGNvbnRyb2xsZXIKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpZ28uZ2V0UHJvcGVydHkoImxpc3QiKTsKLSAgICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBjbG9zdXJlLmNhbGwoKTsKLSAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVyblZhbHVlKTsKLSAgICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVyblZhbHVlIGluc3RhbmNlb2YgTW9kZWxBbmRWaWV3KTsKLSAgICAgICAgICAgICBNYXAgbW9kZWwgPSAoKE1vZGVsQW5kVmlldylyZXR1cm5WYWx1ZSkuZ2V0TW9kZWwoKTsKLQkJCQotICAgICAgICAgICAgIGFzc2VydEVxdWFscygibXl2YWx1ZSIsIG1vZGVsLmdldCgibXltb2RlbCIpKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm15dmFsdWUyIiwgbW9kZWwuZ2V0KCJteW1vZGVsMiIpKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RWYWx1ZTIiLCBtb2RlbC5nZXQoInN1Y2Nlc3MiKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgewotICAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgbWV0aG9kIGV4Y2VwdGlvbiBzaG91bGQgbm90IGhhdmUgYmVlbiB0aHJvd24hIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXRjaChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBleCkgewotICAgICAgICAgICAgIGZhaWwoIk1pc3NpbmcgcHJvcGVydHkgZXhjZXB0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRocm93biEiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8vIG5vdyByZWRpcmVjdGlvbiB0byBhbm90aGVyIGNvbnRyb2xsZXIKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpZ28yLmdldFByb3BlcnR5KCJsaXN0Iik7Ci0gICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gY2xvc3VyZS5jYWxsKCk7Ci0gICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5WYWx1ZSk7Ci0gICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE1vZGVsQW5kVmlldyk7Ci0gICAgICAgICAgICAgTWFwIG1vZGVsID0gKChNb2RlbEFuZFZpZXcpcmV0dXJuVmFsdWUpLmdldE1vZGVsKCk7Ci0JCQkKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm15dmFsdWUiLCBtb2RlbC5nZXQoIm15bW9kZWwiKSk7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0VmFsdWUyIiwgbW9kZWwuZ2V0KCJzdWNjZXNzIikpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2goTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKLSAgICAgICAgICAgICBmYWlsKCJNaXNzaW5nIG1ldGhvZCBleGNlcHRpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhyb3duISIpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2goTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZXgpIHsKLSAgICAgICAgICAgICBmYWlsKCJNaXNzaW5nIHByb3BlcnR5IGV4Y2VwdGlvbiBzaG91bGQgbm90IGhhdmUgYmVlbiB0aHJvd24hIik7Ci0gICAgICAgICB9Ci0gICAgIH0gKi8KLQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckJlYW5EZWZpbml0aW9uKENsYXNzIGdyb292eUNsYXNzLEdyYWlsc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb3h5TWV0YUNsYXNzIHBtYyA9IFByb3BlcnR5QWNjZXNzUHJveHlNZXRhQ2xhc3MuZ2V0SW5zdGFuY2UoZ3Jvb3Z5Q2xhc3MpOwotICAgICAgICAvLyBwcm9vZiBvZiBjb25jZXB0IHRvIHRyeSBvdXQgcHJveHkgbWV0YSBjbGFzcwotICAgICAgICBpZihjb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgR2VuZXJpY0FwcGxpY2F0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIEJlYW5EZWZpbml0aW9uIGJkID0gbmV3IFJvb3RCZWFuRGVmaW5pdGlvbihncm9vdnlDbGFzcyxmYWxzZSk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJCZWFuRGVmaW5pdGlvbiggZ3Jvb3Z5Q2xhc3MuZ2V0TmFtZSgpLCBiZCApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvUGFnZUZsb3dUZXN0cy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L1BhZ2VGbG93VGVzdHMuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDlmYTQ5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvUGFnZUZsb3dUZXN0cy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWltcG9ydCBncmFpbHMucGFnZWZsb3cuKjsKLQotY2xhc3MgVGVzdFBhZ2VGbG93IHsKLSAgICBAUHJvcGVydHkgRmxvdyBmbG93ID0gbmV3IFBhZ2VGbG93QnVpbGRlcigpLmZsb3cgewotICAgICAgICBmaXJzdFN0YWdlKHZpZXc6InNvbWVWaWV3IikKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9QYWdlRmxvd1Rlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L1BhZ2VGbG93VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NGEyYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3BhZ2VmbG93L1BhZ2VGbG93VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KLSAqIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlZmxvdzsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuU3ByaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5BYnN0cmFjdERlcGVuZGVuY3lJbmplY3Rpb25TcHJpbmdDb250ZXh0VGVzdHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93Lm12Yy5GbG93Q29udHJvbGxlcjsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKLSAqIEBzaW5jZSBKdWwgOSwgMjAwNQotICovCi1wdWJsaWMgY2xhc3MgUGFnZUZsb3dUZXN0cyBleHRlbmRzIEFic3RyYWN0RGVwZW5kZW5jeUluamVjdGlvblNwcmluZ0NvbnRleHRUZXN0cyB7Ci0KLQlwcm90ZWN0ZWQgRmxvd0NvbnRyb2xsZXIgdGVzdFBhZ2VGbG93Q29udHJvbGxlciA9IG51bGw7Ci0JcHJvdGVjdGVkIEdyYWlsc0FwcGxpY2F0aW9uIGdyYWlsc0FwcGxpY2F0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgUGFnZUZsb3dUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UG9wdWxhdGVQcm90ZWN0ZWRWYXJpYWJsZXModHJ1ZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29uZmlnTG9jYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9wYWdlLWZsb3ctdGVzdHMueG1sIiB9OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Rmxvd0NvbnRyb2xsZXJGaXJzdFN0YWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNwcmluZ0NvbmZpZyBzcHJpbmdDb25maWcgPSBuZXcgU3ByaW5nQ29uZmlnKGdyYWlsc0FwcGxpY2F0aW9uKTsKLQkJc3ByaW5nQ29uZmlnLmdldEJlYW5SZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9wYWdlLWZsb3ctdGVzdHMueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy9wYWdlLWZsb3ctdGVzdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI4M2Y4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvcGFnZWZsb3cvcGFnZS1mbG93LXRlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucyBkZWZhdWx0LWF1dG93aXJlPSJieVR5cGUiPgotCTxiZWFuIGlkPSJncmFpbHNBcHBsaWNhdGlvbiIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbiI+Ci0JCTxkZXNjcmlwdGlvbj5HcmFpbHMgYXBwbGljYXRpb24gZmFjdG9yeSBiZWFuPC9kZXNjcmlwdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9Imdyb292eUZpbGVzIj4KLQkJCTx2YWx1ZT5maWxlOnRlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9wYWdlZmxvdy8qLmdyb292eTwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCTxiZWFuIGlkPSJUZXN0UGFnZUZsb3dDbGFzcyIgY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuTWV0aG9kSW52b2tpbmdGYWN0b3J5QmVhbiI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXRPYmplY3QiPgotCQkJPHJlZiBiZWFuPSJncmFpbHNBcHBsaWNhdGlvbiIvPgotCQk8L3Byb3BlcnR5PgotCQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0TWV0aG9kIj4KLQkJCTx2YWx1ZT5nZXRQYWdlRmxvdzwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhcmd1bWVudHMiPgotCQkJPHZhbHVlPlRlc3RQYWdlRmxvdzwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCTxiZWFuIGlkPSJUZXN0UGFnZUZsb3ciIGZhY3RvcnktYmVhbj0iVGVzdFBhZ2VGbG93Q2xhc3MiIGZhY3RvcnktbWV0aG9kPSJuZXdJbnN0YW5jZSIvPgotCTxiZWFuIGlkPSJ0ZXN0UGFnZUZsb3dDb250cm9sbGVyIiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay53ZWJmbG93Lm12Yy5GbG93Q29udHJvbGxlciI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmbG93Ij4KLQkJCTxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYmZsb3cuY29uZmlnLkZsb3dGYWN0b3J5QmVhbiI+Ci0JCQkJPHByb3BlcnR5IG5hbWU9ImZsb3dCdWlsZGVyIj4KLQkJCQkJPGJlYW4gY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5wYWdlZmxvdy5HcmFpbHNGbG93QnVpbGRlciI+Ci0JCQkJCQk8cHJvcGVydHkgbmFtZT0icGFnZUZsb3dDbGFzcyI+Ci0JCQkJCQkJPHJlZiBiZWFuPSJUZXN0UGFnZUZsb3dDbGFzcyIvPgotCQkJCQkJPC9wcm9wZXJ0eT4KLQkJCQkJPC9iZWFuPgotCQkJCTwvcHJvcGVydHk+Ci0JCQk8L2JlYW4+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotPC9iZWFucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRmxhc2hTY29wZVRlc3RzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvR3JhaWxzRmxhc2hTY29wZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjkzODguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L0dyYWlsc0ZsYXNoU2NvcGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgotICogQHNpbmNlIDA3LUZlYi0yMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcmFpbHNGbGFzaFNjb3BlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFN0YXRlKCkgewotICAgICAgICBGbGFzaFNjb3BlIGZzID0gbmV3IEdyYWlsc0ZsYXNoU2NvcGUoKTsKLSAgICAgICAgZnMucHV0KCJ0ZXN0IiwidmFsdWUiKTsKLSAgICAgICAgZnMucHV0KCJmcmVkIiwiZmxpbnRzdG9uZSIpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGZzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsZnMuZ2V0KCJmcmVkIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmcy5jb250YWluc0tleSgidGVzdCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmcy5jb250YWluc1ZhbHVlKCJ2YWx1ZSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZnMuY29udGFpbnNLZXkoIndpbG1hIikpOwotCi0gICAgICAgIC8vIHRoZSBzdGF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBvbmUgdGhlIG1hcCBzaG91bGQgc3RpbGwgY29udGFpbiB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gZW50cmllcwotICAgICAgICBmcy5uZXh0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoZnMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIixmcy5nZXQoImZyZWQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBmcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZzLmNvbnRhaW5zS2V5KCJ0ZXN0IikpOwotICAgICAgICBhc3NlcnRUcnVlKGZzLmNvbnRhaW5zVmFsdWUoInZhbHVlIikpOwotICAgICAgICBhc3NlcnRGYWxzZShmcy5jb250YWluc0tleSgid2lsbWEiKSk7Ci0KLSAgICAgICAgLy8gdGhlIG5leHQgc3RhdGUgaXQgc2hvdWxkIGJlIGVtcHR5Ci0gICAgICAgIGZzLm5leHQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGZzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLGZzLnNpemUoKSk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL1JldHVybk1vZGVsQW5kVmlld0NvbnRyb2xsZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9SZXR1cm5Nb2RlbEFuZFZpZXdDb250cm9sbGVyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5YmFlOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL1JldHVybk1vZGVsQW5kVmlld0NvbnRyb2xsZXIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmMKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTW9kZWxBbmRWaWV3OwotCi1jbGFzcyBSZXR1cm5Nb2RlbEFuZFZpZXdDb250cm9sbGVyIHsKLQlAUHJvcGVydHkgQ2xvc3VyZSB3aXRoVmlldyA9IHsKLQkJcmV0dXJuIG5ldyBNb2RlbEFuZFZpZXcoInNvbWVWaWV3Iik7Ci0JfQotCQotCUBQcm9wZXJ0eSBDbG9zdXJlIHdpdGhvdXRWaWV3ID0gewotCQlyZXR1cm4gbmV3IE1vZGVsQW5kVmlldygpOwotCX0KLQkKLQlAUHJvcGVydHkgU3RyaW5nIHZpZXdDb25maWd1cmVkVmlldyA9ICJzb21lT3RoZXJWaWV3IjsKLQlAUHJvcGVydHkgQ2xvc3VyZSB2aWV3Q29uZmlndXJlZCA9IHsKLQkJcmV0dXJuIG5ldyBNb2RlbEFuZFZpZXcoKTsKLQl9Ci0JCi0JQFByb3BlcnR5IFN0cmluZyBkZWZhdWx0Q2xvc3VyZSA9ICJ3aXRoVmlldyI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9TaW1wbGVHcmFpbHNDb250cm9sbGVyVGVzdHMuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvU2ltcGxlR3JhaWxzQ29udHJvbGxlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMGRiNmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9TaW1wbGVHcmFpbHNDb250cm9sbGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2VydmxldC5tdmM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMuY29tbW9ucy5zcHJpbmcuU3ByaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuTXV0YWJsZVByb3BlcnR5VmFsdWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuQmVhbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Db25zdHJ1Y3RvckFyZ3VtZW50VmFsdWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LlJvb3RCZWFuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5tb2NrLndlYi5Nb2NrSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubW9jay53ZWIuTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5Nb2RlbEFuZFZpZXc7Ci1pbXBvcnQgb3JnLnNwcmluZ21vZHVsZXMuYmVhbnMuZmFjdG9yeS5kcml2ZXJzLnhtbC5YbWxBcHBsaWNhdGlvbkNvbnRleHREcml2ZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIEBhdXRob3IgU3RldmVuIERldmlqdmVyCi0gKiBAc2luY2UgSnVsIDIsIDIwMDUKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUdyYWlsc0NvbnRyb2xsZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW1wbGVHcmFpbHNDb250cm9sbGVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEdyYWlsc0FwcGxpY2F0aW9uIGdyYWlsc0FwcGxpY2F0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU2ltcGxlR3JhaWxzQ29udHJvbGxlciBjb250cm9sbGVyID0gbnVsbDsKLQlwcml2YXRlIEdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQgbG9jYWxDb250ZXh0OwotCXByaXZhdGUgQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eDsKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0JCQotCQlDbGFzcyBjMSA9IGNsLnBhcnNlQ2xhc3MoImNsYXNzIFRlc3RDb250cm9sbGVyIHtcbiIrCi0JCQkJCQkJIkBQcm9wZXJ0eSBDbG9zdXJlIHRlc3QgPSB7XG4iKwotCQkJCQkJCQkicmV0dXJuIFsgXCJ0ZXN0XCIgOiBcIjEyM1wiIF1cbiIrCi0JCQkJCQkgICAgICJ9XG4iICsKLQkJCQkJCSJ9Iik7CQotCQkKLQkJQ2xhc3MgYzIgPSBjbC5wYXJzZUNsYXNzKCJjbGFzcyBTaW1wbGVDb250cm9sbGVyIHtcbiIrCi0JCQkJIkBQcm9wZXJ0eSBDbG9zdXJlIHRlc3QgPSB7XG4iKwotCQkJICAgICAifVxuIiArCi0JCQkifSIpOwotCQkKLQkJQ2xhc3MgYzMgPSBjbC5wYXJzZUNsYXNzKCJjbGFzcyBOb1ZpZXdDb250cm9sbGVyIHtcbiIrCi0JCQkJIkBQcm9wZXJ0eSBDbG9zdXJlIHRlc3QgPSB7XG4iKwotCQkJICAgICAgInJlcXVlc3QsIHJlc3BvbnNlIC0+XG4iICsKLQkJCSAgICAgICJuZXcgZ3JhaWxzLnV0aWwuT3BlblJpY29CdWlsZGVyKHJlc3BvbnNlKS5hamF4IHsgZWxlbWVudChpZDpcInRlc3RcIikgeyB9IH07XG4iICsKLQkJCSAgICAgICJyZXR1cm4gbnVsbDtcbiIgKwkJCQkKLQkJCSAgICAgIn1cbiIgKwotCQkJIn0iKTsJCQotCQkKLS8vCQl0aGlzLmdyYWlsc0FwcGxpY2F0aW9uID0gbmV3IERlZmF1bHRHcmFpbHNBcHBsaWNhdGlvbihuZXcgQ2xhc3NbXXtjMSxjMixjM30sY2wpOwotLy8JCXRoaXMuY29udHJvbGxlciA9IG5ldyBTaW1wbGVHcmFpbHNDb250cm9sbGVyKCk7Ci0vLwkJdGhpcy5jb250cm9sbGVyLnNldEdyYWlsc0FwcGxpY2F0aW9uKGdyYWlsc0FwcGxpY2F0aW9uKTsKLQkJCi0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKLQkJCi0JCS8vZ3JhaWxzQXBwbGljYXRpb24gPSBuZXcgRGVmYXVsdEdyYWlsc0FwcGxpY2F0aW9uKCxjbCk7Ci0JCXRoaXMubG9jYWxDb250ZXh0ID0gbmV3IEdlbmVyaWNBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQkJCi0JCUNvbnN0cnVjdG9yQXJndW1lbnRWYWx1ZXMgYXJncyA9IG5ldyBDb25zdHJ1Y3RvckFyZ3VtZW50VmFsdWVzKCk7Ci0JCWFyZ3MuYWRkR2VuZXJpY0FyZ3VtZW50VmFsdWUobmV3IENsYXNzW117YzEsYzIsYzN9KTsKLQkJYXJncy5hZGRHZW5lcmljQXJndW1lbnRWYWx1ZShjbCk7Ci0JCU11dGFibGVQcm9wZXJ0eVZhbHVlcyBwcm9wVmFsdWVzID0gbmV3IE11dGFibGVQcm9wZXJ0eVZhbHVlcygpOwotCQkKLQkJQmVhbkRlZmluaXRpb24gZ3JhaWxzQXBwbGljYXRpb25CZWFuID0gbmV3IFJvb3RCZWFuRGVmaW5pdGlvbihEZWZhdWx0R3JhaWxzQXBwbGljYXRpb24uY2xhc3MsYXJncyxwcm9wVmFsdWVzKTsJCQotCQlsb2NhbENvbnRleHQucmVnaXN0ZXJCZWFuRGVmaW5pdGlvbiggImdyYWlsc0FwcGxpY2F0aW9uIiwgZ3JhaWxzQXBwbGljYXRpb25CZWFuICk7Ci0JCXRoaXMubG9jYWxDb250ZXh0LnJlZnJlc2goKTsKLQkJCi0JCXRoaXMuZ3JhaWxzQXBwbGljYXRpb24gPSAoR3JhaWxzQXBwbGljYXRpb24pbG9jYWxDb250ZXh0LmdldEJlYW4oImdyYWlsc0FwcGxpY2F0aW9uIik7Ci0JCQotCQkvKkJlYW5EZWZpbml0aW9uIGFwcGxpY2F0aW9uRXZlbnRNdWx0aWNhc3RlciA9IG5ldyBSb290QmVhbkRlZmluaXRpb24oU2ltcGxlQXBwbGljYXRpb25FdmVudE11bHRpY2FzdGVyLmNsYXNzKTsKLQkJY29udGV4dC5yZWdpc3RlckJlYW5EZWZpbml0aW9uKCAiYXBwbGljYXRpb25FdmVudE11bHRpY2FzdGVyICIsIGFwcGxpY2F0aW9uRXZlbnRNdWx0aWNhc3Rlcik7Ki8KLQkJU3ByaW5nQ29uZmlnIHNwcmluZ0NvbmZpZyA9IG5ldyBTcHJpbmdDb25maWcoZ3JhaWxzQXBwbGljYXRpb24pOwotCQl0aGlzLmFwcEN0eCA9IChDb25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQpIAotCQluZXcgWG1sQXBwbGljYXRpb25Db250ZXh0RHJpdmVyKCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KAotCQkJCXNwcmluZ0NvbmZpZy5nZXRCZWFuUmVmZXJlbmNlcygpLCB0aGlzLmxvY2FsQ29udGV4dCk7Ci0JCQotCQl0aGlzLmNvbnRyb2xsZXIgPSAoU2ltcGxlR3JhaWxzQ29udHJvbGxlcilhcHBDdHguZ2V0QmVhbigic2ltcGxlR3JhaWxzQ29udHJvbGxlciIpOwotCQkKLQkJCi0JCWFzc2VydE5vdE51bGwoYXBwQ3R4KTsJCQotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotCi0JcHJpdmF0ZSBNb2RlbEFuZFZpZXcgZXhlY3V0ZShTdHJpbmcgdXJpLCBQcm9wZXJ0aWVzIHBhcmFtZXRlcnMpIHRocm93cyBFeGNlcHRpb24gewotCQlNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCgiR0VUIiwgdXJpKTsKLQkJcmVxdWVzdC5zZXRDb250ZXh0UGF0aCgiL3NpbXBsZSIpOwotCQkKLQkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtZXRlcnMuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKLQkJCQlyZXF1ZXN0LmFkZFBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotCQkJfQotCQl9Ci0JCU1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0JCXJldHVybiBjb250cm9sbGVyLmhhbmRsZVJlcXVlc3QocmVxdWVzdCwgcmVzcG9uc2UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ29udHJvbGxlclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTW9kZWxBbmRWaWV3IG1vZGVsQW5kVmlldyA9IGV4ZWN1dGUoIi90ZXN0IiwgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwobW9kZWxBbmRWaWV3KTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9jb250cm9sbGVyMS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2NvbnRyb2xsZXIxLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhOWQzNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2NvbnRyb2xsZXIxLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi1jbGFzcyBUZXN0Q29udHJvbGxlciB7Ci0JQFByb3BlcnR5IENsb3N1cmUgdGVzdCA9IHsKLQkJcmV0dXJuIFsgInRlc3QiIDogIjEyMyIgXQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9jb250cm9sbGVyMi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2NvbnRyb2xsZXIyLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MDA2NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2NvbnRyb2xsZXIyLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotY2xhc3MgU2ltcGxlQ29udHJvbGxlciB7Ci0JQFByb3BlcnR5IENsb3N1cmUgdGVzdCA9IHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvY29udHJvbGxlcjQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9jb250cm9sbGVyNC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDVjODAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9jb250cm9sbGVyNC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1jbGFzcyBQYXJhbWV0ZXJDb250cm9sbGVyIHsKLQlAUHJvcGVydHkgU3RyaW5nIHR3b1BhcmFtZXRlcnNWaWV3ID0gInNvbWVWaWV3IgotCUBQcm9wZXJ0eSBNYXAgdHdvUGFyYW1ldGVyc1R5cGVkVmlld3MgPSBbICJyc3MiIDogInNvbWVSc3NWaWV3IiBdCi0JQFByb3BlcnR5IENsb3N1cmUgdHdvUGFyYW1ldGVycyA9IHsKLQkJcmVxdWVzdCwgcmVzcG9uc2UgLT4gcmV0dXJuIFsgInJlcXVlc3QiIDogcmVxdWVzdCwgInJlc3BvbnNlIiA6IHJlc3BvbnNlIF0KLQl9Ci0JQFByb3BlcnR5IFN0cmluZyBkZWZhdWx0Q2xvc3VyZSA9ICJ0d29QYXJhbWV0ZXJzIgotCQotCUBQcm9wZXJ0eSBTdHJpbmcgb25lUGFyYW1ldGVyVmlldyA9ICJzb21lT3RoZXJWaWV3IgotCUBQcm9wZXJ0eSBNYXAgb25lUGFyYW1ldGVyVHlwZWRWaWV3cyA9IFsgInJzcyIgOiAic29tZU90aGVyUnNzVmlldyIgXQotCUBQcm9wZXJ0eSBDbG9zdXJlIG9uZVBhcmFtZXRlciA9IHsKLQkJcmVxdWVzdCAtPiByZXR1cm4gWyAicmVxdWVzdCIgOiByZXF1ZXN0IF0KLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFpbHMvdGVzdC93ZWIvb3JnL2NvZGVoYXVzL2dyb292eS9ncmFpbHMvd2ViL3NlcnZsZXQvbXZjL2NvbnRyb2xsZXI1Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvY29udHJvbGxlcjUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhmMzNkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvY29udHJvbGxlcjUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jbGFzcyBOb1ZpZXdDb250cm9sbGVyIHsKLSAgIEBQcm9wZXJ0eSBDbG9zdXJlIGxpc3QgPSB7Ci0gICAgICByZXF1ZXN0LCByZXNwb25zZSAtPgotCi0gICAgICBuZXcgZ3JhaWxzLnV0aWwuT3BlblJpY29CdWlsZGVyKHJlc3BvbnNlKS5hamF4IHsgZWxlbWVudChpZDoidGVzdCIpIHsgfSB9OwotICAgICAgcmV0dXJuIG51bGw7Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9zaW1wbGUtZ3JhaWxzLWNvbnRyb2xsZXItdGVzdHMueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy9zaW1wbGUtZ3JhaWxzLWNvbnRyb2xsZXItdGVzdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg0NzA4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2VydmxldC9tdmMvc2ltcGxlLWdyYWlscy1jb250cm9sbGVyLXRlc3RzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucyBkZWZhdWx0LWF1dG93aXJlPSJieVR5cGUiPgotCTxiZWFuIGlkPSJncmFpbHNBcHBsaWNhdGlvbiIgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLmNvbW1vbnMuR3JhaWxzQXBwbGljYXRpb25GYWN0b3J5QmVhbiI+Ci0JCTxkZXNjcmlwdGlvbj5HcmFpbHMgYXBwbGljYXRpb24gZmFjdG9yeSBiZWFuPC9kZXNjcmlwdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9Imdyb292eUZpbGVzIj4KLQkJCTx2YWx1ZT5maWxlOnRlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zZXJ2bGV0L212Yy8qLmdyb292eTwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCTxiZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNlcnZsZXQubXZjLlNpbXBsZUdyYWlsc0NvbnRyb2xsZXIiPgotCQk8ZGVzY3JpcHRpb24+R3JhaWxzIGNvbnRyb2xsZXIgdG8gaGFuZGxlIHNpbXBsZSBvciBwbGFpbiBvbGQgY29udHJvbGxlcnM8L2Rlc2NyaXB0aW9uPgotCTwvYmVhbj4KLQk8YmVhbiBpZD0iY29udHJvbGxlckNsYXNzIiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5NZXRob2RJbnZva2luZ0ZhY3RvcnlCZWFuIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXRPYmplY3QiPgotCQkJPHJlZiBiZWFuPSJncmFpbHNBcHBsaWNhdGlvbiIvPgotCQk8L3Byb3BlcnR5PgotCQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0TWV0aG9kIj4KLQkJCTx2YWx1ZT5nZXRDb250cm9sbGVyPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0JPGJlYW4gaWQ9InRlc3RDb250cm9sbGVyQ2xhc3MiIHBhcmVudD0iY29udHJvbGxlckNsYXNzIj4KLQkJPHByb3BlcnR5IG5hbWU9ImFyZ3VtZW50cyI+Ci0JCQk8dmFsdWU+VGVzdENvbnRyb2xsZXI8L3ZhbHVlPgotCQk8L3Byb3BlcnR5PgotCTwvYmVhbj4KLQk8YmVhbiBpZD0iVGVzdENvbnRyb2xsZXIiIGZhY3RvcnktYmVhbj0idGVzdENvbnRyb2xsZXJDbGFzcyIgZmFjdG9yeS1tZXRob2Q9Im5ld0luc3RhbmNlIi8+Ci0JPGJlYW4gaWQ9InNpbXBsZUNvbnRyb2xsZXJDbGFzcyIgcGFyZW50PSJjb250cm9sbGVyQ2xhc3MiPgotCQk8cHJvcGVydHkgbmFtZT0iYXJndW1lbnRzIj4KLQkJCTx2YWx1ZT5TaW1wbGVDb250cm9sbGVyPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0JPGJlYW4gaWQ9IlNpbXBsZUNvbnRyb2xsZXIiIGZhY3RvcnktYmVhbj0ic2ltcGxlQ29udHJvbGxlckNsYXNzIiBmYWN0b3J5LW1ldGhvZD0ibmV3SW5zdGFuY2UiLz4KLQk8YmVhbiBpZD0icmV0dXJuTW9kZWxBbmRWaWV3Q29udHJvbGxlckNsYXNzIiBwYXJlbnQ9ImNvbnRyb2xsZXJDbGFzcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhcmd1bWVudHMiPgotCQkJPHZhbHVlPm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5SZXR1cm5Nb2RlbEFuZFZpZXdDb250cm9sbGVyPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0JPGJlYW4gaWQ9Im9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLndlYi5zZXJ2bGV0Lm12Yy5SZXR1cm5Nb2RlbEFuZFZpZXdDb250cm9sbGVyIiAKLQkJZmFjdG9yeS1iZWFuPSJyZXR1cm5Nb2RlbEFuZFZpZXdDb250cm9sbGVyQ2xhc3MiIGZhY3RvcnktbWV0aG9kPSJuZXdJbnN0YW5jZSIvPgotCTxiZWFuIGlkPSJwYXJhbWV0ZXJDb250cm9sbGVyQ2xhc3MiIHBhcmVudD0iY29udHJvbGxlckNsYXNzIj4KLQkJPHByb3BlcnR5IG5hbWU9ImFyZ3VtZW50cyI+Ci0JCQk8dmFsdWU+UGFyYW1ldGVyQ29udHJvbGxlcjwvdmFsdWU+Ci0JCTwvcHJvcGVydHk+Ci0JPC9iZWFuPgotCTxiZWFuIGlkPSJQYXJhbWV0ZXJDb250cm9sbGVyIiBmYWN0b3J5LWJlYW49InBhcmFtZXRlckNvbnRyb2xsZXJDbGFzcyIgZmFjdG9yeS1tZXRob2Q9Im5ld0luc3RhbmNlIi8+Ci0JPGJlYW4gaWQ9Im5vVmlld0NvbnRyb2xsZXJDbGFzcyIgcGFyZW50PSJjb250cm9sbGVyQ2xhc3MiPgotCQk8cHJvcGVydHkgbmFtZT0iYXJndW1lbnRzIj4KLQkJCTx2YWx1ZT5Ob1ZpZXdDb250cm9sbGVyPC92YWx1ZT4KLQkJPC9wcm9wZXJ0eT4KLQk8L2JlYW4+Ci0JPGJlYW4gaWQ9Ik5vVmlld0NvbnRyb2xsZXIiIGZhY3RvcnktYmVhbj0ibm9WaWV3Q29udHJvbGxlckNsYXNzIiBmYWN0b3J5LW1ldGhvZD0ibmV3SW5zdGFuY2UiLz4KLTwvYmVhbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zaXRlbWVzaC9HcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXJUZXN0cy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3Rlc3Qvd2ViL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3JhaWxzL3dlYi9zaXRlbWVzaC9HcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGNmMTI5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90ZXN0L3dlYi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyYWlscy93ZWIvc2l0ZW1lc2gvR3JhaWxzTGF5b3V0RGVjb3JhdG9yTWFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMud2ViLnNpdGVtZXNoOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBjb20ub3BlbnN5bXBob255Lm1vZHVsZS5zaXRlbWVzaC5EZWNvcmF0b3I7Ci1pbXBvcnQgY29tLm9wZW5zeW1waG9ueS5tb2R1bGUuc2l0ZW1lc2guUGFnZTsKLWltcG9ydCBjb20ub3BlbnN5bXBob255Lm1vZHVsZS5zaXRlbWVzaC5wYXJzZXIuRmFzdFBhZ2VQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBHcmFpbHNMYXlvdXREZWNvcmF0b3JNYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qCi0JICogVGVzdCBtZXRob2QgZm9yICdvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscy53ZWIuc2l0ZW1lc2guR3JhaWxzTGF5b3V0RGVjb3JhdG9yTWFwcGVyLmdldERlY29yYXRvcihIdHRwU2VydmxldFJlcXVlc3QsIFBhZ2UpJwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWNvcmF0b3JIdHRwU2VydmxldFJlcXVlc3RQYWdlKCkgewotCQlNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCgiR0VUIiwgIm9yZGVycy9saXN0Iik7Ci0JCUdyYWlsc0xheW91dERlY29yYXRvck1hcHBlciBtID0gbmV3IEdyYWlsc0xheW91dERlY29yYXRvck1hcHBlcigpOwotCQlGYXN0UGFnZVBhcnNlciBwYXJzZXIgPSBuZXcgRmFzdFBhZ2VQYXJzZXIoKTsKLQkJU3RyaW5nIGh0bWwgPSAiPGh0bWw+PGhlYWQ+PHRpdGxlPlRlc3QgdGl0bGU8L3RpdGxlPjxtZXRhIG5hbWU9XCJsYXlvdXRcIiBjb250ZW50PVwidGVzdFwiPjwvbWV0YT48L2hlYWQ+PGJvZHk+aGVyZSBpcyB0aGUgYm9keTwvYm9keT48L2h0bWw+IjsKLQkJCi0JCQotCQlQYWdlIHBhZ2UgPSBwYXJzZXIucGFyc2UoIG5ldyBTdHJpbmdSZWFkZXIoaHRtbCkgKTsgCi0JCURlY29yYXRvciBkID0gbS5nZXREZWNvcmF0b3IocmVxdWVzdCwgcGFnZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIi9XRUItSU5GL2dyYWlscy1hcHAvdmlld3MvbGF5b3V0cy90ZXN0LmpzcCIsIGQuZ2V0UGFnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgZC5nZXROYW1lKCkpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYWlscy90b21jYXQueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3RvbWNhdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzI0NjQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhaWxzL3RvbWNhdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJNeSBBcHBsaWNhdGlvbiIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiI+Ci0KLSAgPCEtLSBDb25maWd1cmUgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgYnVpbHQgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgICAgdmFsdWU9IlBBVEhfVE9fRElSX1RIQVRfQ09OVEFJTlNfV0FSIi8+ICAgICA8IS0tIE9WRVJSSURFIEZST00gT1VUU0lERSAtLT4KLQotICA8IS0tIENvbmZpZ3VyZSB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIGFwcGxpY2F0aW9uIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGF0aCIgICAgIHZhbHVlPSIvZ3JhaWxzLWFwcCIvPgotCi0gIDwhLS0gQ29uZmlndXJlIHByb3BlcnRpZXMgdG8gYWNjZXNzIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIC0tPgotICA8cHJvcGVydHkgbmFtZT0idXJsIiAgICAgIHZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlciIvPgotICA8cHJvcGVydHkgbmFtZT0idXNlcm5hbWUiIHZhbHVlPSJOT19VU0VSX05BTUUiLz4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBPVkVSUklERSBGUk9NIE9VVFNJREUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwYXNzd29yZCIgdmFsdWU9Ik5PX1BBU1NXT1JEIi8+ICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9WRVJSSURFIEZST00gT1VUU0lERSAtLT4KLQotICA8IS0tIENvbmZpZ3VyZSB0aGUgY3VzdG9tIEFudCB0YXNrcyBmb3IgdGhlIE1hbmFnZXIgYXBwbGljYXRpb24gLS0+Ci0gIDx0YXNrZGVmIG5hbWU9ImRlcGxveSIgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5EZXBsb3lUYXNrIi8+Ci0gIDx0YXNrZGVmIG5hbWU9Imxpc3QiICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5MaXN0VGFzayIvPgotICA8dGFza2RlZiBuYW1lPSJyZWxvYWQiICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuUmVsb2FkVGFzayIvPgotICA8dGFza2RlZiBuYW1lPSJyZXNvdXJjZXMiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuUmVzb3VyY2VzVGFzayIvPgotICA8dGFza2RlZiBuYW1lPSJyb2xlcyIgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuUm9sZXNUYXNrIi8+Ci0gIDx0YXNrZGVmIG5hbWU9InN0YXJ0IiAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TdGFydFRhc2siLz4KLSAgPHRhc2tkZWYgbmFtZT0ic3RvcCIgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlN0b3BUYXNrIi8+Ci0gIDx0YXNrZGVmIG5hbWU9InVuZGVwbG95IiAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5VbmRlcGxveVRhc2siLz4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVzY3JpcHRpb249Ikluc3RhbGwgd2ViIGFwcGxpY2F0aW9uIiAgPgotICAgIDxkZXBsb3kgdXJsPSIke3VybH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IgotICAgICAgICAgICAgcGF0aD0iJHtwYXRofSIgd2FyPSIke2J1aWxkfSR7cGF0aH0ud2FyIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icmVsb2FkIiBkZXNjcmlwdGlvbj0iUmVsb2FkIHdlYiBhcHBsaWNhdGlvbiI+Ci0gICAgICA8cmVsb2FkICB1cmw9IiR7dXJsfSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iCi0gICAgICAgICAgICBwYXRoPSIke3BhdGh9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idW5kZXBsb3kiIGRlc2NyaXB0aW9uPSJSZW1vdmUgd2ViIGFwcGxpY2F0aW9uIj4KLSAgICA8dW5kZXBsb3kgdXJsPSIke3VybH0iIHVzZXJuYW1lPSIke3VzZXJuYW1lfSIgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9IgotICAgICAgICAgICAgcGF0aD0iJHtwYXRofSIvPgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vLmNsYXNzcGF0aCBiL2dyb292eS9tb2R1bGVzL2dyYW0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmNWQzOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvbWFpbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy90ZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0idGFyZ2V0L2dyYW0tMS4xLVNOQVBTSE9ULmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9BcHBsaWNhdGlvbnMvZWNsaXBzZSB3ZWJ0b29sL3BsdWdpbnMvb3JnLmNvZGVoYXVzLmdyb292eS5lY2xpcHNlXzAuOS4yL2xpYi9hc20tMi4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9BcHBsaWNhdGlvbnMvZWNsaXBzZSB3ZWJ0b29sL3BsdWdpbnMvb3JnLmNvZGVoYXVzLmdyb292eS5lY2xpcHNlXzAuOS4yL2xpYi9ncm9vdnktMS4wLWpzci0wMy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvQXBwbGljYXRpb25zL2VjbGlwc2Ugd2VidG9vbC9wbHVnaW5zL29yZy5jb2RlaGF1cy5ncm9vdnkuZWNsaXBzZV8wLjkuMi9saWIvYW50bHItMi43LjUuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vZ3Jvb3Z5L2phcnMvZ3Jvb3Z5LWFsbC0xLjAtYmV0YS05LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vYW50L2phcnMvYW50LTEuNi4yLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vYW5ub2dlbi9qYXJzL2Fubm9nZW4tMC4xLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtLy5jdnNpZ25vcmUgYi9ncm9vdnkvbW9kdWxlcy9ncmFtLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2RmNjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1ncmFtLmltbAotdGFyZ2V0Ci0uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vLnByb2plY3QgYi9ncm9vdnkvbW9kdWxlcy9ncmFtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJkNjQwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5ncmFtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmNvZGVoYXVzLmdyb292eS5lY2xpcHNlLmdyb292eUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmVjbGlwc2UuZ3Jvb3Z5TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3Byb2plY3QucHJvcGVydGllcyBiL2dyb292eS9tb2R1bGVzL2dyYW0vcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U2MDViLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vcHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotbWF2ZW4uY29tcGlsZS5zb3VyY2U9MS40Ci1tYXZlbi5jb21waWxlLnRhcmdldD0xLjQKLW1hdmVuLnRlc3Quc291cmNlPTEuNAotbWF2ZW4uY29tcGlsZS5kZXByZWNhdGlvbj10cnVlCi1tYXZlbi5jb21waWxlLmRlYnVnPXRydWUKLW1hdmVuLmNvbXBpbGUub3B0aW1pemU9dHJ1ZQotCi1tYXZlbi5qYXZhZG9jLmxpbmtzPWh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS8KLW1hdmVuLmphdmFkb2Muc291cmNlPTEuNAotCi1tYXZlbi50ZXN0LnNlYXJjaC5jbGFzc2RpciA9IHRydWUKLQotbWF2ZW4uanVuaXQuZm9yaz10cnVlCi1tYXZlbi5qdW5pdC51c2VmaWxlPXRydWUKLQotZ3Jvb3Z5Lmluc3RhbGwuc3RhZ2luZy5kZXN0PSR7bWF2ZW4uYnVpbGQuZGlyfS9pbnN0YWxsLwotbWF2ZW4uaHRtbDJ4ZG9jLmRpcj0ke21hdmVuLmJ1aWxkLmRpcn0vaHRtbAotCi1tYXZlbi54ZG9jLmRhdGUgPSBsZWZ0Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNvZGVoYXVzIHRoZW1lCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbWF2ZW4ueGRvYy50aGVtZS51cmw9aHR0cDovL2NvZGVoYXVzLm9yZy9jb2RlaGF1cy1zdHlsZS5jc3MKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgV2hlcmUgdGhlIGphcnMgYXJlIHVwbG9hZGVkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbWF2ZW4ucmVwby5jZW50cmFsID0gZGlzdC5jb2RlaGF1cy5vcmcKLW1hdmVuLnJlcG8uY2VudHJhbC5kaXJlY3RvcnkgPSAvZGlzdAotCi0jbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbgotbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL2Rpc3QuY29kZWhhdXMub3JnCi0KLW1hdmVuLnJlbW90ZS5ncm91cCA9IGdyb292eQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBzd3QgcGxhdGZvcm0KLSMgcG9zc2libGUgdmFsdWVzLCB3aW4zMiwgbGludXgtZ3RrLCBtYWNvc3gKLSMgCi0jIGZvciBsaW51eC1ndGsgZW5hYmxlIGd0ayBkZXBzIGluIHByb2plY3QueG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGxhdGZvcm09d2luMzIKLSNwbGF0Zm9ybT1saW51eC1ndGsKLSNwbGF0Zm9ybT1tYWNvc3gKLQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3Byb2plY3QueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1ZWY4Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTxwcm9qZWN0PgotICA8cG9tVmVyc2lvbj4zPC9wb21WZXJzaW9uPgotICA8aWQ+Z3JhbTwvaWQ+Ci0gIDxncm91cElkPmdyb292eTwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+Z3JhbTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Z3JhbTwvbmFtZT4KLSAgPGN1cnJlbnRWZXJzaW9uPjEuMi1TTkFQU0hPVDwvY3VycmVudFZlcnNpb24+Ci0gIDxvcmdhbml6YXRpb24+Ci0gICAgPG5hbWU+VGhlIENvZGVoYXVzPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL2NvZGVoYXVzLm9yZzwvdXJsPgotICAgIDxsb2dvPmh0dHA6Ly9jb2RlaGF1cy5vcmcvY29kZWhhdXMtc21hbGwuZ2lmPC9sb2dvPgotICA8L29yZ2FuaXphdGlvbj4KLSAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLSAgPHBhY2thZ2U+b3JnLmNvZGVoYXVzLmdyYW08L3BhY2thZ2U+Ci0gIDxkZXNjcmlwdGlvbj5HcmFtIGlzIGEgbWV0YWRhdGEgcHJvY2Vzc2luZyBlbmdpbmUgZm9yIEdyb292eTwvZGVzY3JpcHRpb24+Ci0gIDx1cmw+aHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvPC91cmw+Ci0gIDxpc3N1ZVRyYWNraW5nVXJsPmh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9zZWN1cmUvQnJvd3NlUHJvamVjdC5qc3BhP2lkPTEwMjQyJmFtcDtyZXBvcnQ9cm9hZG1hcDwvaXNzdWVUcmFja2luZ1VybD4KLQotICA8c2l0ZUFkZHJlc3M+YmVhdmVyLmNvZGVoYXVzLm9yZzwvc2l0ZUFkZHJlc3M+Ci0gIDxzaXRlRGlyZWN0b3J5Pi9ob21lL3Byb2plY3RzL2dyb292eS9wdWJsaWNfaHRtbC9ncmFtL21hdmVuPC9zaXRlRGlyZWN0b3J5PgotICA8ZGlzdHJpYnV0aW9uRGlyZWN0b3J5Pi9ob21lL3Byb2plY3RzL2dyb292eS9kaXN0PC9kaXN0cmlidXRpb25EaXJlY3Rvcnk+Ci0KLSAgPHJlcG9zaXRvcnk+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOmN2czpwc2VydmVyOmFub255bW91c0BjdnMuY29kZWhhdXMub3JnOi9zY20vY3ZzcHVibGljOmdyb292eS9tb2R1bGVzL2dyYW08L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOmN2czpleHQ6JHttYXZlbi51c2VybmFtZX1AY3ZzLmNvZGVoYXVzLm9yZzovc2NtL2N2c3B1YmxpYzpncm9vdnkvbW9kdWxlcy9ncmFtPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL2N2cy5ncm9vdnkuY29kZWhhdXMub3JnL3ZpZXdjdnMuY2dpL2dyb292eS9tb2R1bGVzL2dyYW08L3VybD4KLSAgPC9yZXBvc2l0b3J5PgotICA8dmVyc2lvbnMvPgotICA8YnJhbmNoZXMvPgotICA8bWFpbGluZ0xpc3RzLz4KLSAgPGRldmVsb3BlcnM+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxpZD5qc3RyYWNoYW48L2lkPgotICAgICAgPG5hbWU+SmFtZXMgU3RyYWNoYW48L25hbWU+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgICAgPHJvbGU+Rm91bmRlcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gIDwvZGV2ZWxvcGVycz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Z3Jvb3Z5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1qc3ItMDM8L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICA8cHJvcGVydGllcy8+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8aWQ+YW5ub2dlbjwvaWQ+Ci0gICAgICA8dmVyc2lvbj4wLjEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmFudDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNi4yPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxuYWdFbWFpbEFkZHJlc3M+c2NtQGdyb292eS5jb2RlaGF1cy5vcmc8L25hZ0VtYWlsQWRkcmVzcz4KLSAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHVuaXRUZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC91bml0VGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICA8dW5pdFRlc3Q+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqLypUZXN0Lio8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPioqLypCdWcuKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8cmVzb3VyY2VzPgotICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L3Jlc291cmNlPgotICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC91bml0VGVzdD4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+Ci0gICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gIDwvYnVpbGQ+Ci0gIDxyZXBvcnRzPgotICAgIDxyZXBvcnQ+bWF2ZW4tbGljZW5zZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1wbWQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qZGVwZW5kLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlbG9nLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tZmlsZS1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWRldmVsb3Blci1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWp4ci1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWphdmFkb2MtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qdW5pdC1yZXBvcnQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1mYXEtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jbG92ZXItcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvcmVwb3J0PgotICA8L3JlcG9ydHM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS8uY3ZzaWdub3JlIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDNiMGY5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS5EU19TdG9yZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS9HcmFtLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL0dyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNWQ3OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL0dyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyYW07Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSmFtU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlUGFyYW1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBBIGhlbHBlciBzZXJ2aWNlIGZvciBpbnZva2luZyBHcm9vdnkgc2NyaXB0cyBiYXNlZCBvbiBhIEpBTSBzZXJ2aWNlCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgR3JhbSB7Ci0gICAgcHJpdmF0ZSBKYW1TZXJ2aWNlIGphbTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogc3JjRGlyIGdyb292eVNjcmlwdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzcmNEaXIgPSBhcmdzWzBdOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNpbmcgc291cmNlIGZpbGVzIGluIGRpcmVjdG9yeTogIiArIHNyY0Rpcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEphbVNlcnZpY2VGYWN0b3J5IGphbVNlcnZpY2VGYWN0b3J5ID0gSmFtU2VydmljZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgSmFtU2VydmljZVBhcmFtcyBwYXJhbXMgPSBqYW1TZXJ2aWNlRmFjdG9yeS5jcmVhdGVTZXJ2aWNlUGFyYW1zKCk7Ci0gICAgICAgICAgICBwYXJhbXMuaW5jbHVkZVNvdXJjZVBhdHRlcm4obmV3IEZpbGVbXXtuZXcgRmlsZShzcmNEaXIpfSwgIioqLyouamF2YSIpOwotICAgICAgICAgICAgSmFtU2VydmljZSBzZXJ2aWNlID0gamFtU2VydmljZUZhY3RvcnkuY3JlYXRlU2VydmljZShwYXJhbXMpOwotCi0gICAgICAgICAgICBHcmFtIGdyYW0gPSBuZXcgR3JhbShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzY3JpcHQgPSBhcmdzW2ldOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXZhbHVhdGluZyBHcm9vdnkgc2NyaXB0OiAiICsgc2NyaXB0KTsKLSAgICAgICAgICAgICAgICBncmFtLmV4ZWN1dGUoc2NyaXB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEdyYW0oSmFtU2VydmljZSBqYW0pIHsKLSAgICAgICAgdGhpcy5qYW0gPSBqYW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgc2NyaXB0KSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc2NyaXB0KTsKLSAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIGV4ZWN1dGUoZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBsZXRzIHRyeSBsb2FkIHRoZSBzY3JpcHQgb24gdGhlIGNsYXNzcGF0aAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShzY3JpcHQpOwotICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShzY3JpcHQpOwotICAgICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gc2NyaXB0IGNhbGxlZDogIiArIHNjcmlwdCArICIgY291bGQgYmUgZm91bmQgb24gdGhlIGNsYXNzcGF0aCBvciB0aGUgZmlsZSBzeXN0ZW0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0gICAgICAgICAgICBzaGVsbC5ldmFsdWF0ZShpbiwgc2NyaXB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoRmlsZSBzY3JpcHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0gICAgICAgIHNoZWxsLmV2YWx1YXRlKHNjcmlwdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEdyb292eVNoZWxsIGNyZWF0ZVNoZWxsKCkgewotICAgICAgICBHcm9vdnlTaGVsbCBhbnN3ZXIgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKLSAgICAgICAgYW5zd2VyLnNldFByb3BlcnR5KCJqYW0iLCBqYW0pOwotICAgICAgICBhbnN3ZXIuc2V0UHJvcGVydHkoImNsYXNzZXMiLCBqYW0uZ2V0QWxsQ2xhc3NlcygpKTsKLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL0dyYW1Nb2R1bGUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vR3JhbU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMzODJmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vR3JhbU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3JhbTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSmFtU2VydmljZTsKLWltcG9ydCBvcmcuY29kZWhhdXMuamFtLkpDbGFzczsKLWltcG9ydCBvcmcuY29kZWhhdXMuamFtLkpQcm9wZXJ0eTsKLWltcG9ydCBvcmcuY29kZWhhdXMuamFtLkpFbGVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSkFubm90YXRlZEVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEEgc2V0IG9mIGhlbHBlciBtZXRob2RzIGZvciB0aGUgSmFtU2VydmljZSBmb3IgdXNlIGluc2lkZSBHcmFtCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgR3JhbU1vZHVsZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRQcm9wZXJ0eU1hcChKQ2xhc3MgamNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50U2ltcGxlTmFtZU1hcChqY2xhc3MuZ2V0UHJvcGVydGllcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRGaWVsZE1hcChKQ2xhc3MgamNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50U2ltcGxlTmFtZU1hcChqY2xhc3MuZ2V0RmllbGRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldE1ldGhvZE1hcChKQ2xhc3MgamNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50U2ltcGxlTmFtZU1hcChqY2xhc3MuZ2V0TWV0aG9kcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRFbGVtZW50U2ltcGxlTmFtZU1hcChKRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIE1hcCBhbnN3ZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBKRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICBhbnN3ZXIucHV0KGVsZW1lbnQuZ2V0U2ltcGxlTmFtZSgpLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldEFubm90YXRpb25NYXAoSkFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFF1YWxpZmllZE5hbWVNYXAoZWxlbWVudC5nZXRBbm5vdGF0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRFbGVtZW50UXVhbGlmaWVkTmFtZU1hcChKRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0gICAgICAgIE1hcCBhbnN3ZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBKRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICBhbnN3ZXIucHV0KGVsZW1lbnQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vR3JhbVN1cHBvcnQuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vR3JhbVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkN2RiMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL0dyYW1TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3JhbTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuU2NyaXB0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuamFtLkpBbm5vdGF0aW9uVmFsdWU7Ci0KLS8qKgotICogQSB1c2VmdWwgYmFzZSBjbGFzcyBmb3IgR3JhbSBzY3JpcHRzCi0gKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhbVN1cHBvcnQgZXh0ZW5kcyBTY3JpcHQgewotCi0gICAgcHVibGljIEdyYW1TdXBwb3J0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBHcmFtU3VwcG9ydChCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgc3VwZXIoYmluZGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIG9yICIiIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG51bGwKLSAgICAgKiBvciB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKEpBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBuYW1lLCAiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIG9yIHRoZSBkZWZhdWx0VmFsdWUgaWYgdGhlIGFubm90YXRpb24gaXMgbnVsbAotICAgICAqIG9yIHRoZXJlIGlzIG5vIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoSkFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgSkFubm90YXRpb25WYWx1ZSB2YWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hc1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbiBvciAwIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG51bGwKLSAgICAgKiBvciB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKEpBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEpBbm5vdGF0aW9uVmFsdWUgdmFsdWUgPSBhbm5vdGF0aW9uLmdldFZhbHVlKG5hbWUpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYXNJbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uIG9yIGZhbHNlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG51bGwKLSAgICAgKiBvciB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgdGhlIGdpdmVuIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoSkFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgSkFubm90YXRpb25WYWx1ZSB2YWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hc0Jvb2xlYW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBEZWNhcHRhbGl6ZXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZ2l2ZW4gc3RyaW5nOyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB0dXJuaW5nIEpBTSBwcm9wZXJ0eSBuYW1lcwotICAgICAqIGludG8gZmllbGQgbmFtZXMgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZGVjYXBpdGFsaXplKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgdGV4dC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FwdGFsaXplcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBzdHJpbmc7IHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHR1cm5pbmcgSkFNIGZpZWxkIG5hbWVzCi0gICAgICogaW50byBwcm9wZXJ0eSBuYW1lcyBldGMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdGV4dC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBuYW1lZCBhbm5vdGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBhbm5vdGF0aW9uVmFsdWUoSkFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgdmFsdWVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uVmFsdWUoZWxlbWVudCwgYW5ub3RhdGlvbk5hbWUsIHZhbHVlTmFtZSwgIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgbmFtZWQgYW5ub3RhdGlvbiBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgZWxlbWVudCwgYW5ub3RhdGlvbiBvciB2YWx1ZQotICAgICAqIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGFubm90YXRpb25WYWx1ZShKQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyB2YWx1ZU5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSkFubm90YXRpb24gYW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgdmFsdWVOYW1lLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS9HcmFtVGFzay5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS9HcmFtVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGY3MWE4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vR3JhbVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncmFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSmFtU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlUGFyYW1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEFuIEFudCB0YXNrIGZvciBleGVjdXRpbmcgR3JhbSBzY3JpcHRzLCB3aGljaCBhcmUgR3Jvb3Z5Ci0gKiBzY3JpcHRzIGV4ZWN1dGVkIG9uIHRoZSBKQU0gY29udGV4dC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFtVGFzayBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0KLSAgICBwcml2YXRlIFBhdGggc3JjRGlyID0gbnVsbDsKLSAgICBwcml2YXRlIFBhdGggbVRvb2xwYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIFBhdGggbUNsYXNzcGF0aCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUluY2x1ZGVzID0gIioqLyouamF2YSI7Ci0gICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7Ci0gICAgcHJpdmF0ZSBGaWxlIHNjcmlwdERpcjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHNvdXJjZSBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXIoRmlsZSBkZXN0RGlyKSB7Ci0gICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NyaXB0RGlyKEZpbGUgc2NyaXB0RGlyKSB7Ci0gICAgICAgIHRoaXMuc2NyaXB0RGlyID0gc2NyaXB0RGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNyY0RpcihQYXRoIHNyY0RpcikgewotICAgICAgICB0aGlzLnNyY0RpciA9IHNyY0RpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUb29scGF0aChQYXRoIHBhdGgpIHsKLSAgICAgICAgaWYgKG1Ub29scGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVG9vbHBhdGggPSBwYXRoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbVRvb2xwYXRoLmFwcGVuZChwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRvb2xwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZVRvb2xwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVUb29scGF0aCgpIHsKLSAgICAgICAgaWYgKG1Ub29scGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVG9vbHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtVG9vbHBhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIHBhdGgpIHsKLSAgICAgICAgaWYgKG1DbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgbUNsYXNzcGF0aCA9IHBhdGg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtQ2xhc3NwYXRoLmFwcGVuZChwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgewotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKLSAgICAgICAgaWYgKG1DbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgbUNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DbGFzc3BhdGguY3JlYXRlUGF0aCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCInc3JjRGlyJyBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXN0RGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ2Rlc3REaXInIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjcmlwdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIidzY3JpcHREaXInIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgSmFtU2VydmljZUZhY3RvcnkgamFtU2VydmljZUZhY3RvcnkgPSBKYW1TZXJ2aWNlRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICBKYW1TZXJ2aWNlUGFyYW1zIHNlcnZpY2VQYXJhbXMgPSBqYW1TZXJ2aWNlRmFjdG9yeS5jcmVhdGVTZXJ2aWNlUGFyYW1zKCk7Ci0gICAgICAgIGlmIChtVG9vbHBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZVtdIHRjcCA9IHBhdGgyZmlsZXMobVRvb2xwYXRoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGNwLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZVBhcmFtcy5hZGRUb29sQ2xhc3NwYXRoKHRjcFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DbGFzc3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZVtdIGNwID0gcGF0aDJmaWxlcyhtQ2xhc3NwYXRoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUGFyYW1zLmFkZENsYXNzcGF0aChjcFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZVBhcmFtcy5pbmNsdWRlU291cmNlUGF0dGVybihwYXRoMmZpbGVzKHNyY0RpciksIG1JbmNsdWRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKYW1TZXJ2aWNlIGphbSA9IGphbVNlcnZpY2VGYWN0b3J5LmNyZWF0ZVNlcnZpY2Uoc2VydmljZVBhcmFtcyk7Ci0gICAgICAgICAgICBHcmFtIGdyYW0gPSBuZXcgR3JhbShqYW0pOwotCi0gICAgICAgICAgICBsb2coIkV4ZWN1dGluZyBHcm9vdnkgc2NyaXB0czoiKTsKLQotICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIoc2NyaXB0RGlyKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLQotICAgICAgICAgICAgICAgIGxvZygiU2NyaXB0OiAiICsgZmlsZSk7Ci0gICAgICAgICAgICAgICAgZ3JhbS5leGVjdXRlKG5ldyBGaWxlKHNjcmlwdERpciwgZmlsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nKCIuLi5kb25lLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlW10gcGF0aDJmaWxlcyhQYXRoIHBhdGgpIHsKLSAgICAgICAgU3RyaW5nW10gbGlzdCA9IHBhdGgubGlzdCgpOwotICAgICAgICBGaWxlW10gb3V0ID0gbmV3IEZpbGVbbGlzdC5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgb3V0W2ldID0gbmV3IEZpbGUobGlzdFtpXSkuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL2hpYmVybmF0ZS9Db2x1bW5JbmZvLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL2hpYmVybmF0ZS9Db2x1bW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjYwOWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3JhbS9oaWJlcm5hdGUvQ29sdW1uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyYW0uaGliZXJuYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2ltcGxlIFBPSk8gY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiBhIGNvbHVtbgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkluZm8gewotICAgIHByb3RlY3RlZCBzdGF0aWMgU2V0IHByaW1pdGl2ZVR5cGVzID0gY3JlYXRlUHJpbWl0aXZlVHlwZXMoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbHVtbk5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB0YWJsZU5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlTmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2FyZGluYWxpdHkgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBmb3JlaWduS2V5ID0gIiI7Ci0gICAgcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbm90TnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjYXJkaW5hbGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXJkaW5hbGl0eShTdHJpbmcgY2FyZGluYWxpdHkpIHsKLSAgICAgICAgdGhpcy5jYXJkaW5hbGl0eSA9IGNhcmRpbmFsaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotICAgICAgICB0aGlzLmNvbHVtbk5hbWUgPSBjb2x1bW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9yZWlnbktleSgpIHsKLSAgICAgICAgcmV0dXJuIGZvcmVpZ25LZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yZWlnbktleShTdHJpbmcgZm9yZWlnbktleSkgewotICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotICAgICAgICByZXR1cm4gdGFibGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0gICAgICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gcXVhbGlmaWVkVHlwZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVkVHlwZU5hbWUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0gICAgICAgIHRoaXMucXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZTsKLSAgICAgICAgaW50IGlkeCA9IHF1YWxpZmllZFR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpZHggPiAwKSB7Ci0gICAgICAgICAgICB0eXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZyhpZHggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHR5cGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7Ci0gICAgICAgIHJldHVybiBub3ROdWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vdE51bGwoYm9vbGVhbiBub3ROdWxsKSB7Ci0gICAgICAgIHRoaXMubm90TnVsbCA9IG5vdE51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKCkgewotICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZXMuY29udGFpbnMoZ2V0UXVhbGlmaWVkVHlwZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTZXQgY3JlYXRlUHJpbWl0aXZlVHlwZXMoKSB7Ci0gICAgICAgIFNldCBhbnN3ZXIgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBhbnN3ZXIuYWRkKCJib29sZWFuIik7Ci0gICAgICAgIGFuc3dlci5hZGQoImJ5dGUiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiY2hhciIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJzaG9ydCIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJpbnQiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgibG9uZyIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJmbG9hdCIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJkb3VibGUiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkJvb2xlYW4iKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkJ5dGUiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkNoYXJhY3RlciIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJqYXZhLmxhbmcuU2hvcnQiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkludGVnZXIiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkxvbmciKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7Ci0gICAgICAgIGFuc3dlci5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5tYXRoLkJpZ0ludGVnZXIiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5tYXRoLkJpZ0RlY2ltYWwiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJqYXZhLnV0aWwuRGF0ZSIpOwotICAgICAgICBhbnN3ZXIuYWRkKCJqYXZhLnNxbC5EYXRlIik7Ci0gICAgICAgIGFuc3dlci5hZGQoImphdmEuc3FsLlRpbWUiKTsKLSAgICAgICAgYW5zd2VyLmFkZCgiamF2YS5zcWwuVGltZXN0YW1wIik7Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vaGliZXJuYXRlL0hpYmVybmF0ZVN1cHBvcnQuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyYW0vaGliZXJuYXRlL0hpYmVybmF0ZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxYzkyMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncmFtL2hpYmVybmF0ZS9IaWJlcm5hdGVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncmFtLmhpYmVybmF0ZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyYW0uR3JhbVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuamFtLkpQcm9wZXJ0eTsKLQotLyoqCi0gKiBBIHVzZWZ1bCBiYXNlIGNsYXNzIGZvciBoaWJlcmF0ZSBiYXNlZCBHcmFtIHNjcmlwdHMKLSAqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIaWJlcm5hdGVTdXBwb3J0IGV4dGVuZHMgR3JhbVN1cHBvcnQgewotCi0gICAgcHVibGljIEhpYmVybmF0ZVN1cHBvcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEhpYmVybmF0ZVN1cHBvcnQoQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIHN1cGVyKGJpbmRpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2x1bW5JbmZvIGdldENvbHVtbkRldGFpbHMoSlByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIENvbHVtbkluZm8gYW5zd2VyID0gbmV3IENvbHVtbkluZm8oKTsKLSAgICAgICAgYW5zd2VyLnNldENhcmRpbmFsaXR5KCIwLi4xIik7Ci0gICAgICAgIEpBbm5vdGF0aW9uIGFubiA9IHByb3BlcnR5LmdldEFubm90YXRpb24oImhpYmVybmF0ZS5tYXAiKTsKLSAgICAgICAgaWYgKGFubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbnN3ZXIuc2V0VGFibGVOYW1lKHN0cmluZ1ZhbHVlKGFubiwgInRhYmxlIikpOwotICAgICAgICAgICAgYW5zd2VyLnNldFF1YWxpZmllZFR5cGVOYW1lKGFubm90YXRpb25WYWx1ZShwcm9wZXJ0eSwgImhpYmVybmF0ZS5jb2xsZWN0aW9uLWNvbXBvc2l0ZS1lbGVtZW50IiwgImNsYXNzIikpOwotICAgICAgICAgICAgYW5zd2VyLnNldENhcmRpbmFsaXR5KCIwLi5OIik7Ci0gICAgICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgICAgICB9Ci0gICAgICAgIGFubiA9IHByb3BlcnR5LmdldEFubm90YXRpb24oImhpYmVybmF0ZS5zZXQiKTsKLSAgICAgICAgaWYgKGFubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbnN3ZXIuc2V0VGFibGVOYW1lKHN0cmluZ1ZhbHVlKGFubiwgInRhYmxlIikpOwotICAgICAgICAgICAgYW5zd2VyLnNldFF1YWxpZmllZFR5cGVOYW1lKGFubm90YXRpb25WYWx1ZShwcm9wZXJ0eSwgImhpYmVybmF0ZS5jb2xsZWN0aW9uLW1hbnktdG8tbWFueSIsICJjbGFzcyIpKTsKLSAgICAgICAgICAgIGFuc3dlci5zZXRDYXJkaW5hbGl0eSgiMC4uTiIpOwotICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICAgICAgfQotICAgICAgICBhbm4gPSBwcm9wZXJ0eS5nZXRBbm5vdGF0aW9uKCJoaWJlcm5hdGUuYmFnIik7Ci0gICAgICAgIGlmIChhbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgYW5zd2VyLnNldFRhYmxlTmFtZShzdHJpbmdWYWx1ZShhbm4sICJ0YWJsZSIpKTsKLSAgICAgICAgICAgIGFuc3dlci5zZXRRdWFsaWZpZWRUeXBlTmFtZShhbm5vdGF0aW9uVmFsdWUocHJvcGVydHksICJoaWJlcm5hdGUuY29sbGVjdGlvbi1tYW55LXRvLW1hbnkiLCAiY2xhc3MiKSk7Ci0gICAgICAgICAgICBhbnN3ZXIuc2V0Q2FyZGluYWxpdHkoIjAuLk4iKTsKLSAgICAgICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgYW5uID0gcHJvcGVydHkuZ2V0QW5ub3RhdGlvbigiaGliZXJuYXRlLm1hbnktdG8tb25lIik7Ci0gICAgICAgIGlmIChhbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgYW5zd2VyLnNldFF1YWxpZmllZFR5cGVOYW1lKHN0cmluZ1ZhbHVlKGFubiwgImNsYXNzIikpOwotICAgICAgICAgICAgYW5zd2VyLnNldEZvcmVpZ25LZXkoc3RyaW5nVmFsdWUoYW5uLCAiZm9yZWlnbktleSIpKTsKLSAgICAgICAgfQotICAgICAgICBhbm4gPSBwcm9wZXJ0eS5nZXRBbm5vdGF0aW9uKCJoaWJlcm5hdGUucHJvcGVydHkiKTsKLSAgICAgICAgaWYgKGFubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbnN3ZXIuc2V0Q29sdW1uTmFtZShzdHJpbmdWYWx1ZShhbm4sICJjb2x1bW4iKSk7Ci0gICAgICAgICAgICBhbnN3ZXIuc2V0UXVhbGlmaWVkVHlwZU5hbWUoc3RyaW5nVmFsdWUoYW5uLCAidHlwZSIpKTsKLSAgICAgICAgICAgIGFuc3dlci5zZXRMZW5ndGgoaW50VmFsdWUoYW5uLCAibGVuZ3RoIikpOwotICAgICAgICAgICAgYW5zd2VyLnNldE5vdE51bGwoYm9vbGVhblZhbHVlKGFubiwgIm5vdC1udWxsIikpOwotICAgICAgICAgICAgaWYgKGFuc3dlci5pc05vdE51bGwoKSkgewotICAgICAgICAgICAgICAgIGFuc3dlci5zZXRDYXJkaW5hbGl0eSgiMS4uMSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3NjcmlwdC9EdW1wLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3NjcmlwdC9EdW1wLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwZjc0MC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy9zY3JpcHQvRHVtcC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBTVEFSVCBTTklQUEVUOiBncmFtCi0KLXBlcnNpc3RlbnRDbGFzc2VzID0gY2xhc3Nlcy5maW5kQWxsIHsgaXQuZ2V0QW5ub3RhdGlvbigiaGliZXJuYXRlLmNsYXNzIikgIT0gbnVsbCB9Ci0KLXByaW50bG4gIkZvdW5kICR7cGVyc2lzdGVudENsYXNzZXMuc2l6ZSgpfSBpbnN0YW5jZXMgb3V0IG9mICR7Y2xhc3Nlcy5zaXplKCl9IgotCi1wZXJzaXN0ZW50Q2xhc3Nlcy5lYWNoIHsgYyB8Ci0gICAgcHJpbnRsbiBjLnNpbXBsZU5hbWUKLQotICAgIGZvciAocCBpbiBjLnByb3BlcnRpZXMpIHsKLSAgICAgICAgcHJpbnRsbiAiICBwcm9wZXJ0eTogJHtwLnNpbXBsZU5hbWV9IgotICAgIH0KLX0KLQotLy8gRU5EIFNOSVBQRVQ6IGdyYW0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyYW0vSmFtVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3JhbS9KYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGYyM2IuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3JhbS9KYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncmFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KQ2xhc3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSmFtU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmphbS5KYW1TZXJ2aWNlUGFyYW1zOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qYW0uSk1ldGhvZDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3JhbS5tb2RlbC5QZXJzb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBKYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgSmFtU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEphbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYW1TZXJ2aWNlRmFjdG9yeSBqYW1TZXJ2aWNlRmFjdG9yeSA9IEphbVNlcnZpY2VGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgSmFtU2VydmljZVBhcmFtcyBwYXJhbXMgPSBqYW1TZXJ2aWNlRmFjdG9yeS5jcmVhdGVTZXJ2aWNlUGFyYW1zKCk7Ci0gICAgICAgIHBhcmFtcy5pbmNsdWRlU291cmNlUGF0dGVybihuZXcgRmlsZVtde25ldyBGaWxlKCJzcmMvdGVzdCIpfSwgIioqLyouamF2YSIpOwotICAgICAgICAvL3BhcmFtcy5pbmNsdWRlU291cmNlUGF0dGVybihuZXcgRmlsZVtde25ldyBGaWxlKCIvd29ya3NwYWNlL2luYm94L3NyYy9qYXZhIil9LCAiKiovKi5qYXZhIik7Ci0gICAgICAgIHNlcnZpY2UgPSBqYW1TZXJ2aWNlRmFjdG9yeS5jcmVhdGVTZXJ2aWNlKHBhcmFtcyk7Ci0KLSAgICAgICAgSkNsYXNzIHRoaXNDbGFzcyA9IG51bGw7Ci0gICAgICAgIEpDbGFzc1tdIGFsbENsYXNzZXMgPSBzZXJ2aWNlLmdldEFsbENsYXNzZXMoKTsKLSAgICAgICAgLy9TdHJpbmcgY2xhc3NOYW1lID0gImNvbS5yYWZ0cGxjLnJhZnRmbG93Lm1vZGVsLlJpc2tJZGVudGlmaWNhdGlvbiI7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBQZXJzb24uY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbENsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEpDbGFzcyBhQ2xhc3MgPSBhbGxDbGFzc2VzW2ldOwotICAgICAgICAgICAgaWYgKGFDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzQ2xhc3MgPSBhQ2xhc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCB0aGlzIGNsYXNzIiwgdGhpc0NsYXNzICE9IG51bGwpOwotCi0gICAgICAgIC8vIGxldHMgZ2V0IHRoZSBwcm9wZXJ0aWVzCi0KLQotICAgICAgICBNYXAgcHJvcGVydHlNYXAgPSBkdW1wQ2xhc3ModGhpc0NsYXNzKTsKLQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0aGlzQ2xhc3MgPSB0aGlzQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgaWYgKHRoaXNDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkdW1wQ2xhc3ModGhpc0NsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpQcm9wZXJ0eSBwcm9wZXJ0eSA9IChKUHJvcGVydHkpIHByb3BlcnR5TWFwLmdldCgiSWQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgcHJvcGVydHkgSWQiLCBwcm9wZXJ0eSAhPSBudWxsKTsKLQotICAgICAgICBNYXAgYW5ub3RhdGlvbnMgPSBHcmFtTW9kdWxlLmdldEFubm90YXRpb25NYXAocHJvcGVydHkpOwotICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgYW5ub3RhdGlvbiBvbiBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBidXQgd2FzOiAiICsgYW5ub3RhdGlvbnMsIGFubm90YXRpb25zLnNpemUoKSA+IDApOwotCi0gICAgICAgIEpBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoSkFubm90YXRpb24pIGFubm90YXRpb25zLmdldCgiaGliZXJuYXRlLmlkIik7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIGZvdW5kIGFubm90YXRpb24gJ2hpYmVybmF0ZS5pZCciLCBhbm5vdGF0aW9uICE9IG51bGwpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBkdW1wQ2xhc3MoSkNsYXNzIGFDbGFzcykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkR1bXBpbmcgY2xhc3M6ICIgKyBhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgTWFwIHByb3BlcnR5TWFwID0gR3JhbU1vZHVsZS5nZXRQcm9wZXJ0eU1hcChhQ2xhc3MpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0eU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBKUHJvcGVydHkgcHJvcGVydHkgPSAoSlByb3BlcnR5KSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwcm9wZXJ0eTogIiArIGVudHJ5LmdldEtleSgpICsgIiBoYXMgYW5ub2F0aW9uczogIiArIEdyYW1Nb2R1bGUuZ2V0QW5ub3RhdGlvbk1hcChwcm9wZXJ0eSkpOwotICAgICAgICB9Ci0gICAgICAgIE1hcCBtZXRob2RNYXAgPSBHcmFtTW9kdWxlLmdldE1ldGhvZE1hcChhQ2xhc3MpOwotICAgICAgICBKTWV0aG9kIG1ldGhvZCA9IChKTWV0aG9kKSBtZXRob2RNYXAuZ2V0KCJnZXRJZCIpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0SWQoKSBoYXMgYW5ub3RhdGlvbnM6ICIgKyBHcmFtTW9kdWxlLmdldEFubm90YXRpb25NYXAobWV0aG9kKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eU1hcDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3JhbS9iYXNlL0lkZW50aWZpYWJsZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3JhbS9iYXNlL0lkZW50aWZpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc2MDIwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyYW0vYmFzZS9JZGVudGlmaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyYW0uYmFzZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGludGVyZmFjZSBJZGVudGlmaWFibGUgeyAvL2V4dGVuZHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLSAgICAgKiBAaGliZXJuYXRlLmlkIGdlbmVyYXRvci1jbGFzcz0ibmF0aXZlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgY29sdW1uPSJpZCIKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoSW50ZWdlciBpZCk7Ci0KLSAgICAvL3B1YmxpYyBPYmplY3QgY2xvbmUoKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyYW0vYmFzZS9JZGVudGlmaWFibGVTdXBwb3J0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncmFtL2Jhc2UvSWRlbnRpZmlhYmxlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmViZjMxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyYW0vc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyYW0vYmFzZS9JZGVudGlmaWFibGVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncmFtLmJhc2U7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlU3VwcG9ydCBpbXBsZW1lbnRzIElkZW50aWZpYWJsZSB7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLSAgICAgKiBAaGliZXJuYXRlLmlkIGdlbmVyYXRvci1jbGFzcz0ibmF0aXZlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgY29sdW1uPSJpZCIKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlkIFRoZSBpZCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoSW50ZWdlciBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncmFtL21vZGVsL1BlcnNvbi5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3JhbS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3JhbS9tb2RlbC9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5YmViNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncmFtL3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncmFtL21vZGVsL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncmFtLmJhc2UuSWRlbnRpZmlhYmxlU3VwcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGhpYmVybmF0ZS5jbGFzcyB0YWJsZT0iUGVyc29uIgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFBlcnNvbiBleHRlbmRzIElkZW50aWZpYWJsZVN1cHBvcnQgewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTZXQgY2hpbGRyZW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgbG9jYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoaWxkcmVuLgotICAgICAqIEBoaWJlcm5hdGUuY29sbGVjdGlvbi1rZXkgY29sdW1uID0gInBhcmVudElkIgotICAgICAqIEBoaWJlcm5hdGUuY29sbGVjdGlvbi1tYW55LXRvLW1hbnkgY2xhc3M9Im9yZy5jb2RlaGF1cy5ncmFtLkphbVRlc3QiIGNvbHVtbj0iaWQiCi0gICAgICogQGhpYmVybmF0ZS5zZXQgaW52ZXJzZT0iZmFsc2UiIGNhc2NhZGU9InNhdmUtdXBkYXRlIiB0YWJsZT0iSmFtVGFibGUiIGxhenk9ImZhbHNlIgotICAgICAqLwotICAgIHB1YmxpYyBTZXQgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihTZXQgY2hpbGRyZW4pIHsKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKiBAaGliZXJuYXRlLnByb3BlcnR5IGNvbHVtbj0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgbGVuZ3RoPSIyNTUiCi0gICAgICogbm90LW51bGw9InRydWUiCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgTG9jYXRpb24uCi0gICAgICogQGhpYmVybmF0ZS5tYW55LXRvLW9uZSBjbGFzcz0iTG9jYXRpb24iCi0gICAgICogY29uc3RyYWluZWQ9InRydWUiIGZvcmVpZ24ta2V5PSJGS19Mb2NhdGlvbiIKLSAgICAgKiBvdXRlci1qb2luPSJhdXRvIiBjb2x1bW49ImxvY2F0aW9uIgotICAgICAqIG5vdC1udWxsPSJ0cnVlIgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihPYmplY3QgbG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvLmNsYXNzcGF0aCBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxZjBhNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08Y2xhc3NwYXRoPgotICA8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSIiIGtpbmQ9InNyYyIgcGF0aD0ic3JjL21haW4iPgotICA8L2NsYXNzcGF0aGVudHJ5PgotICA8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJ0YXJnZXQvdGVzdC1jbGFzc2VzIiBraW5kPSJzcmMiIHBhdGg9InNyYy90ZXN0Ij4KLSAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphciI+Ci0gIDwvY2xhc3NwYXRoZW50cnk+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0gIDwvY2xhc3NwYXRoZW50cnk+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vY29tbW9ucy1sb2dnaW5nL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMC4zLmphciI+Ci0gIDwvY2xhc3NwYXRoZW50cnk+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vZ3Jvb3Z5L2phcnMvZ3Jvb3Z5LWFsbC0xLjAtYmV0YS04LmphciI+Ci0gIDwvY2xhc3NwYXRoZW50cnk+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vc3d0L2phcnMvc3d0LXdpbjMyLTMuMW01LmphciI+Ci0gIDwvY2xhc3NwYXRoZW50cnk+Ci0gIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik1BVkVOX1JFUE8vc3d0L2phcnMvamZhY2UtMy4xbTUuamFyIj4KLSAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy9zd3QvamFycy9mb3Jtcy0zLjFtNS5qYXIiPgotICA8L2NsYXNzcGF0aGVudHJ5PgotICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNQVZFTl9SRVBPL3N3dC9qYXJzL3J1bnRpbWUtMy4xbTUuamFyIj4KLSAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTUFWRU5fUkVQTy9zd3QvamFycy9vc2dpLWNvcmUtMy4xbTUuamFyIj4KLSAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0idGFyZ2V0L2NsYXNzZXMiPgotICA8L2NsYXNzcGF0aGVudHJ5PgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC8uY3ZzaWdub3JlIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFiOTU1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5sb2cKLXRhcmdldApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC8ucHJvamVjdCBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWI1YzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0gIDxuYW1lPmdyb292eS1zd3Q8L25hbWU+Ci0gIDxjb21tZW50Pmdyb292eS1zd3Q8L2NvbW1lbnQ+Ci0gIDxwcm9qZWN0cz4KLSAgPC9wcm9qZWN0cz4KLSAgPGJ1aWxkU3BlYz4KLSAgICA8YnVpbGRDb21tYW5kPgotICAgICAgPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0gICAgICA8YXJndW1lbnRzPgotICAgICAgPC9hcmd1bWVudHM+Ci0gICAgPC9idWlsZENvbW1hbmQ+Ci0gIDwvYnVpbGRTcGVjPgotICA8bmF0dXJlcz4KLSAgICA8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLSAgPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9MSUNFTlNFLnR4dCBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmNiMjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQotCi0vKgotICRJZCQKLQotIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0gdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLSA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLSBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0gKi8KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvUkVBRE1FLnR4dCBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlMjgzMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0tIEdldHRpbmcgc3RhcnRlZAotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBpbnN0YWxsaW5nIG9uIHdpbmRvd3MKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFzIHRoZSBjdXJyZW50IHN3dCBsaWJzIGFyZSBub3Qgb24gaWJpYmxpbyB5b3UgaGF2ZSB0byBtYW51YWxseSAKLWluc3RhbGwgdGhlbS4gCi1JIGNhc2UgeW91IGFscmVhZHkgaGF2ZSBlY2xpcHNlLTMuMW01IGluc3RhbGxlZCwgYWxsIHRoZSBsaWJzIGNhbiBiZSBmb3VuZCBpbiAKLXRoZSBwbHVnaW5zIGRpcmVjdG9yeS4gCi0KLWNvcHkgCi0JZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnN3dC53aW4zMl8zLjEuMC93cy93aW4zMi9zd3QuamFyCi10byAKLQltYXZlbi9yZXBvc2l0b3J5L3N3dC9qYXJzL3N3dC13aW4zMi0zLjFtNS5qYXIKLQotCi1jb3B5IAotCWVjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZmFjZV8zLjEuMC9qZmFjZS5qYXIKLXRvIAotCW1hdmVuL3JlcG9zaXRvcnkvc3d0L2phcnMvamZhY2UtMy4xbTUuamFyCi0JCi0KLWNvcHkgCi0JZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLmZvcm1zXzMuMS4wL2Zvcm1zLmphcgotdG8gCi0JbWF2ZW4vcmVwb3NpdG9yeS9zd3QvamFycy9mb3Jtcy0zLjFtNS5qYXIJCi0KLWNvcHkgCi0JZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucnVudGltZV8zLjEuMC9ydW50aW1lLmphcgotdG8gCi0JbWF2ZW4vcmVwb3NpdG9yeS9zd3QvamFycy9ydW50aW1lLTMuMW01LmphcgkKLQotCQotY29weSAKLQllY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaV8zLjEuMC9jb3JlLmphcgotdG8gCi0JbWF2ZW4vcmVwb3NpdG9yeS9zd3QvamFycy9vc2dpLWNvcmUtMy4xbTUuamFyCQkKLQotY29weQotCWVjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5zd3Qud2luMzJfMy4wLjAvb3Mvd2luMzIveDg2L3N3dC1hd3Qtd2luMzItMzEyMy5kbGwKLQllY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uuc3d0LndpbjMyXzMuMC4wL29zL3dpbjMyL3g4Ni9zd3Qtd2luMzItMzEyMy5kbGwgCi10byAKLQlhIGRpcmVjdG9yeSBpbiB5b3VyIHN5c3RlbSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkUEFUSAkKLShBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcnVuIHRoZSBleGFtcGxlcyBieSB1c2luZyB0aGUgLURqYXZhLmxpYnJhcnkucGF0aCB2bSBhcmd1bWVudCkKLQotQWxsIHRlc3QgY2FzZXMgd2lsbCBhbHNvIGZhaWwgd2hlbiB5b3UgZG8gbm90IGhhdmUgdGhlc2UgbGlicmFyaWVzIHByb3Blcmx5IGluc3RhbGxlZC4KLSAgICAgCi1BbHRlcm5hdGl2ZWx5IHlvdSBjYW4gZG93bmxvYWQgdGhlIFJDUCBSdW50aW1lIEJpbmFyeSBmcm9tCi10aGUgd3d3LmVjbGlwc2Uub3JnIGRvd25sb2FkIHBhZ2VzLiBUaGlzIGRvd25sb2FkIAotYWxzbyBjb250YWlucyBtb3N0IGxpYnJhcmllcyBidXQgdGhlIGZvcm1zLmphciBpcyBtaXNzaW5nLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBydW5uaW5nIHRoZSBleGFtcGxlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVGhlIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc3JjL2V4YW1wbGVzIHN1YmRpcmVjdG9yeS4KLUZvciBldmVyeSBleGFtcGxlIHRoZXJlIGlzIGEgamF2YSBtYWluIGNsYXNzIHlvdSBjYW4gcnVuLgotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvbWF2ZW4ueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9tYXZlbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGZjNWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9tYXZlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJkZWZhdWx0IiB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp1PSJqZWxseTp1dGlsIiA+Ci0KLSAgPGdvYWwgbmFtZT0iZGVmYXVsdCIgcHJlcmVxcz0iY2xlYW4iPgotICA8L2dvYWw+CQotICAKLSAgPGdvYWwgbmFtZT0ic2V0Y2xhc3NwYXRoIj4KLSAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uYnVpbGQuZGVzdH0iLz4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgotICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgIDwvcGF0aD4KLSAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiLz4gCi0gIDwvZ29hbD4KLSAgCi0gIDxnb2FsIG5hbWU9Imdyb292eTpjb21waWxlIiBwcmVyZXFzPSJqYXZhOmNvbXBpbGUsIHNldGNsYXNzcGF0aCIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBtYWluIGNvZGUiPgotICAgIDxjb3B5IHRvZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zcmMvbWFpbiI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZ3Jvb3Z5Ii8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9IkNWUy8qIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxncm9vdnljIGRlc3RkaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXMiIHNyY2Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvY2xhc3NlcyIgbGlzdGZpbGVzPSJ0cnVlIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9ncm9vdnljPgotICA8L2dvYWw+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9wcm9qZWN0LnByb3BlcnRpZXMgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3Byb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0MjNkMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLW1hdmVuLmNvbXBpbGUuc291cmNlPTEuNAotbWF2ZW4uY29tcGlsZS50YXJnZXQ9MS40Ci1tYXZlbi50ZXN0LnNvdXJjZT0xLjQKLW1hdmVuLmNvbXBpbGUuZGVwcmVjYXRpb249dHJ1ZQotbWF2ZW4uY29tcGlsZS5kZWJ1Zz10cnVlCi1tYXZlbi5jb21waWxlLm9wdGltaXplPXRydWUKLQotbWF2ZW4uamF2YWRvYy5saW5rcz1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvCi1tYXZlbi5qYXZhZG9jLnNvdXJjZT0xLjQKLQotbWF2ZW4udGVzdC5zZWFyY2guY2xhc3NkaXIgPSB0cnVlCi0KLW1hdmVuLmp1bml0LmZvcms9dHJ1ZQotbWF2ZW4uanVuaXQudXNlZmlsZT10cnVlCi0KLWdyb292eS5pbnN0YWxsLnN0YWdpbmcuZGVzdD0ke21hdmVuLmJ1aWxkLmRpcn0vaW5zdGFsbC8KLW1hdmVuLmh0bWwyeGRvYy5kaXI9JHttYXZlbi5idWlsZC5kaXJ9L2h0bWwKLQotbWF2ZW4ueGRvYy5kYXRlID0gbGVmdAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjb2RlaGF1cyB0aGVtZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1hdmVuLnhkb2MudGhlbWUudXJsPWh0dHA6Ly9jb2RlaGF1cy5vcmcvY29kZWhhdXMtc3R5bGUuY3NzCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFdoZXJlIHRoZSBqYXJzIGFyZSB1cGxvYWRlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1hdmVuLnJlcG8uY2VudHJhbCA9IGRpc3QuY29kZWhhdXMub3JnCi1tYXZlbi5yZXBvLmNlbnRyYWwuZGlyZWN0b3J5ID0gL3d3dy9kaXN0LmNvZGVoYXVzLm9yZwotCi0jbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbgotbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL2Rpc3QuY29kZWhhdXMub3JnCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgc3d0IHBsYXRmb3JtCi0jIHBvc3NpYmxlIHZhbHVlcywgd2luMzIsIGxpbnV4LWd0aywgbWFjb3N4Ci0jIAotIyBmb3IgbGludXgtZ3RrIGVuYWJsZSBndGsgZGVwcyBpbiBwcm9qZWN0LnhtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsYXRmb3JtPXdpbjMyCi0jcGxhdGZvcm09bGludXgtZ3RrCi0jcGxhdGZvcm09bWFjb3N4Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9wcm9qZWN0LnhtbCBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3QvcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGNhMTkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3Q+Ci0gIDxwb21WZXJzaW9uPjM8L3BvbVZlcnNpb24+Ci0gIDxuYW1lPmdyb292eS1zd3Q8L25hbWU+Ci0gIDxncm91cElkPmdyb292eS1zd3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmdyb292eS1zd3Q8L2FydGlmYWN0SWQ+Ci0gIDxjdXJyZW50VmVyc2lvbj4wLjM8L2N1cnJlbnRWZXJzaW9uPgotICA8b3JnYW5pemF0aW9uPgotICAgIDxuYW1lPlRoZSBDb2RlaGF1czwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9jb2RlaGF1cy5vcmc8L3VybD4KLSAgICA8bG9nbz5odHRwOi8vY29kZWhhdXMub3JnL2NvZGVoYXVzLXNtYWxsLmdpZjwvbG9nbz4KLSAgPC9vcmdhbml6YXRpb24+Ci0gIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0gIDxwYWNrYWdlPmdyb292eTwvcGFja2FnZT4KLSAgPGRlc2NyaXB0aW9uPmdyb292eS1zd3Q8L2Rlc2NyaXB0aW9uPgotICA8dXJsPmh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLzwvdXJsPgotICA8aXNzdWVUcmFja2luZ1VybD5odHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvc2VjdXJlL0Jyb3dzZVByb2plY3QuanNwYT9pZD0xMDI0MiZhbXA7cmVwb3J0PXJvYWRtYXA8L2lzc3VlVHJhY2tpbmdVcmw+Ci0gIDxzaXRlQWRkcmVzcz5ncm9vdnkuY29kZWhhdXMub3JnPC9zaXRlQWRkcmVzcz4KLSAgPHNpdGVEaXJlY3Rvcnk+L3d3dy9ncm9vdnkuY29kZWhhdXMub3JnPC9zaXRlRGlyZWN0b3J5PgotICA8cmVwb3NpdG9yeT4KLSAgICA8Y29ubmVjdGlvbj5zY206Y3ZzOnBzZXJ2ZXI6YW5vbnltb3VzQGN2cy5jb2RlaGF1cy5vcmc6L3NjbS9jdnNwdWJsaWM6Z3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dDwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Y3ZzOmV4dDoke21hdmVuLnVzZXJuYW1lfUBjdnMuY29kZWhhdXMub3JnOi9zY20vY3ZzcHVibGljOmdyb292eS9tb2R1bGVzL2dyb292eS1zd3Q8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vY3ZzLmdyb292eS5jb2RlaGF1cy5vcmcvdmlld2N2cy5jZ2kvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dDwvdXJsPgotICA8L3JlcG9zaXRvcnk+Ci0gIDxkZXZlbG9wZXJzPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvbmFtZT4KLSAgICAgIDxpZD5ja2w8L2lkPgotICAgICAgPGVtYWlsPmNrbEBkYWNlbG8ubmw8L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5EYWNlbG8gV2ViRGV2ZWxvcG1lbnQ8L29yZ2FuaXphdGlvbj4KLSAgICA8L2RldmVsb3Blcj4KLSAgPC9kZXZlbG9wZXJzPgotICA8ZGVwZW5kZW5jaWVzPgotCTxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICAgICAgPHByb3BlcnRpZXMvPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5ncm9vdnk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5ncm9vdnk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj5hbGwtMS4wLWJldGEtOTwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3d0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3d0LSR7cGxhdGZvcm19PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4xbTU8L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3d0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amZhY2U8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjFtNTwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zd3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5mb3JtczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMW01PC92ZXJzaW9uPgotICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnN3dDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnJ1bnRpbWU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjFtNTwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zd3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5vc2dpLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjFtNTwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPG5hZ0VtYWlsQWRkcmVzcz5ncm9vdnktc2NtQGxpc3RzLmNvZGVoYXVzLm9yZzwvbmFnRW1haWxBZGRyZXNzPgotICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dW5pdFRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3Q8L3VuaXRUZXN0U291cmNlRGlyZWN0b3J5PgotICAgIDx1bml0VGVzdD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+KiovKkJ1Zy4qPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy90ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8L3Jlc291cmNlcz4KLSAgICA8L3VuaXRUZXN0PgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW48L2RpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgPC9yZXNvdXJjZT4KLSAgICA8L3Jlc291cmNlcz4KLSAgPC9idWlsZD4KLSAgPHJlcG9ydHM+Ci0gICAgPHJlcG9ydD5tYXZlbi1saWNlbnNlLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLXBtZC1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWpkZXBlbmQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jaGFuZ2Vsb2ctcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1maWxlLWFjdGl2aXR5LXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tZGV2ZWxvcGVyLWFjdGl2aXR5LXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tanhyLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWp1bml0LXJlcG9ydC1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWZhcS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWNsb3Zlci1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWNoYW5nZXMtcGx1Z2luPC9yZXBvcnQ+Ci0gIDwvcmVwb3J0cz4KLSAgPHByb3BlcnRpZXMgLz4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zZXR0aW5ncy5wcm9wcyBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc2V0dGluZ3MucHJvcHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOWNmNjYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zZXR0aW5ncy5wcm9wcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI0ZyaSBGZWIgMjAgMTk6NDM6MjAgQ0VUIDIwMDQNCi12YXIxPXRydWUNCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvQXBwbGljYXRpb25XaW5kb3dEZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9BcHBsaWNhdGlvbldpbmRvd0RlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUyMDk0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9BcHBsaWNhdGlvbldpbmRvd0RlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UuZXhhbXBsZXMNCi0NCi1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLkpGYWNlQnVpbGRlcg0KLQ0KLWNsYXNzIEFwcGxpY2F0aW9uV2luZG93RGVtbyB7DQotICAgIEBQcm9wZXJ0eSBtYWluYXBwDQotICAgICAgICANCi0gICAgdm9pZCBydW4oKSB7DQotICAgICAgICBkZWYgc3d0ID0gbmV3IEpGYWNlQnVpbGRlcigpDQotICAgICAgICANCi0JICAgIG1haW5hcHAgPSBzd3QuYXBwbGljYXRpb25XaW5kb3coKSB7IAkNCi0JICAgICAgICAgCQ0KLQkgICAgICAgICAJbWVudU1hbmFnZXIoIHRleHQ6IkZpbGUiICkgew0KLQkgICAgICAgICAJCWFjdGlvbiAoIHRleHQ6IlZlcnkgTmljZSIsIGNsb3N1cmU6eyBwcmludGxuICJWZXJ5IE5pY2UgISEhIiB9ICkNCi0JICAgICAgICAgCQlzZXBhcmF0b3IoKQ0KLQkgICAgICAgICAJCWFjdGlvbiAoIHRleHQ6IkNoZWNrIG1lIiwgY2hlY2tlZDp0cnVlLCBjbG9zdXJlOnsgcHJpbnRsbiAiSSd2ZSBiZWVuIGNoZWNrZWQiIH0gKQ0KLQkgICAgICAgICAJfQ0KLQkNCi0JICAgICAgICAgCW1lbnVNYW5hZ2VyKCB0ZXh0OiJFZGl0IiApIHsNCi0JICAgICAgICAgCQlhY3Rpb24gKCB0ZXh0OiJTYXkgSGkgU3RhdHVzYmFyIiwgY2xvc3VyZTp7IG1haW5hcHAuc2V0U3RhdHVzKCdIZWxsbyAuLi4nKSB9ICkNCi0JICAgICAgICAgCX0NCi0JICAgICAgIA0KLQkJCQlmaWxsTGF5b3V0ICggdHlwZToidmVydGljYWwiICkNCi0JDQotCQkJCWxhYmVsKCB0ZXh0OiJBIGJpZyByZWQgbGFiZWwiLCBiYWNrZ3JvdW5kOlsyMDQsIDAsIDBdICkgDQotCQkJCWxhYmVsKCB0ZXh0OiJJIGNhbiBiYXJlbGx5IHJlYWQgdGhpcyIsIGZvcmVncm91bmQ6WzAsMjAwLDBdICkgIA0KLQkJCQlsYWJlbCggdGV4dDoiSXQgc3VyZSBsb29rcyBsaWtlIHRoZSBkdXRjaCBmbGFnIiwgZm9yZWdyb3VuZDpbMCwwLDE1MF0sIGJhY2tncm91bmQ6WzAsIDAsIDE1M10gKQ0KLQkgDQotCQl9DQotICANCi0JCW1haW5hcHAuTWVudUJhck1hbmFnZXIudXBkYXRlQWxsKCB0cnVlICkNCi0JCW1haW5hcHAuZ2V0U2hlbGwoKS5sYXlvdXQoKQ0KLQkJbWFpbmFwcC5vcGVuKCkNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvUHJlZmVyZW5jZXNEZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9QcmVmZXJlbmNlc0RlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ViYzIyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9QcmVmZXJlbmNlc0RlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UuZXhhbXBsZXMNCi0NCi1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLkpGYWNlQnVpbGRlcg0KLQ0KLWNsYXNzIFByZWZlcmVuY2VzRGVtbyB7DQotCUBQcm9wZXJ0eSBwZA0KLQ0KLSAgICB2b2lkIHJ1bigpIHsNCi0gICAgICAgIGRlZiBqZmFjZSA9IG5ldyBKRmFjZUJ1aWxkZXIoKQ0KLQkJZGVmIG1haW5hcHAgPSBqZmFjZS5hcHBsaWNhdGlvbldpbmRvdygpIHsgCSAgICAgICAgDQotCQkNCi0JCQlwZCA9IHByZWZlcmVuY2VEaWFsb2coKSB7DQotCQkJCQ0KLQkJCQlwcmVmZXJlbmNlUGFnZSggdGl0bGU6IkdlbmVyYWwgc2V0dGluZ3MiLCBmaWxlbmFtZToic2V0dGluZ3MucHJvcHMiICkgeyANCi0JCQkJCWJvb2xlYW5GaWVsZEVkaXRvciAocHJvcGVydHlOYW1lOiJ2YXIxIiwgdGl0bGU6Ikl0J3MgYm9vbGVhbiIgKQ0KLQkJCQkJY29sb3JGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJ2YXIyIiwgdGl0bGU6Ik1haW5Db2xvciIgKQ0KLQkJCQkJZGlyZWN0b3J5RmllbGRFZGl0b3IocHJvcGVydHlOYW1lOiJ2YXIzIiwgdGl0bGU6IkRpcmVjdG9yeSIJKQ0KLQkJCQkJZmlsZUZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InZhcjQiLCB0aXRsZToiRmlsZSIgKQ0KLQkJCQkJZm9udEZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InZhcjUiLCB0aXRsZToiRm9udCIgKQ0KLQkJCQkJaW50ZWdlckZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InZhcjYiLCB0aXRsZToiSW50ZWdlciIgKQ0KLQkJCQkJc3RyaW5nRmllbGRFZGl0b3IoIHByb3BlcnR5TmFtZToidmFyNyIsIHRpdGxlOiJTdHJpbmciICkNCi0JCQkJfSANCi0JCQkJCQkJCQ0KLQkJCQlwcmVmZXJlbmNlUGFnZSggdGl0bGU6IlBlcnNvbmFsIHNldHRpbmdzIiwgZmlsZW5hbWU6InNldHRpbmdzLnByb3BzIiApIHsgDQotCQkJCQlib29sZWFuRmllbGRFZGl0b3IoIHByb3BlcnR5TmFtZToidmFyOCIsIHRpdGxlOiJJdCdzIGJvb2xlYW4iICkNCi0JCQkJCWNvbG9yRmllbGRFZGl0b3IoIHByb3BlcnR5TmFtZToidmFyMiIsIHRpdGxlOiJNYWluQ29sb3IiICkNCi0JCQkJCWRpcmVjdG9yeUZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InZhcjkiLCB0aXRsZToiRGlyZWN0b3J5IiApDQotCQkJCQlmaWxlRmllbGRFZGl0b3IoIHByb3BlcnR5TmFtZToidmFyMTAiLCB0aXRsZToiRmlsZSIgKQ0KLQkJCQkJZm9udEZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InZhcjExIiwgdGl0bGU6IkZvbnQiICkNCi0JCQkJCWludGVnZXJGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJ2YXIxMiIsIHRpdGxlOiJJbnRlZ2VyIiApDQotCQkJCQlzdHJpbmdGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJ2YXIxMyIsIHRpdGxlOiJTdHJpbmciICkNCi0JCQkJfSANCi0JCQl9DQotCQl9DQotCQkNCi0JICAJcGQub3BlbigpDQotCX0NCi0gIA0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvUnVuRGVtb0FwcGxpY2F0aW9uV2luZG93LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvUnVuRGVtb0FwcGxpY2F0aW9uV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmUxNDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L2pmYWNlL1J1bkRlbW9BcHBsaWNhdGlvbldpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2U7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RUZXN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkRlbW9BcHBsaWNhdGlvbldpbmRvdyBleHRlbmRzIFN3dFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJ1bkRlbW9BcHBsaWNhdGlvbldpbmRvdyBkZW1vID0gbmV3IFJ1bkRlbW9BcHBsaWNhdGlvbldpbmRvdygpOwotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gZGVtby5jb21waWxlKCJzcmMvZXhhbXBsZXMvZ3Jvb3Z5L2pmYWNlL0FwcGxpY2F0aW9uV2luZG93RGVtby5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgicnVuIiwgbnVsbCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L2pmYWNlL1J1bkRlbW9QcmVmZXJlbmNlcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L2pmYWNlL1J1bkRlbW9QcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmM1OTcwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9SdW5EZW1vUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotaW1wb3J0IGdyb292eS5zd3QuU3d0VGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5EZW1vUHJlZmVyZW5jZXMgZXh0ZW5kcyBTd3RUZXN0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5EZW1vUHJlZmVyZW5jZXMgZGVtbyA9IG5ldyBSdW5EZW1vUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9QcmVmZXJlbmNlc0RlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9SdW5EZW1vV2l6YXJkLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvUnVuRGVtb1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBmZDM0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9SdW5EZW1vV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5qZmFjZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFRlc3Q7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUnVuRGVtb1dpemFyZCBleHRlbmRzIFN3dFRlc3QgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5EZW1vV2l6YXJkIGRlbW8gPSBuZXcgUnVuRGVtb1dpemFyZCgpOwotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gZGVtby5jb21waWxlKCJzcmMvZXhhbXBsZXMvZ3Jvb3Z5L2pmYWNlL1dpemFyZERlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9XaXphcmREZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9qZmFjZS9XaXphcmREZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0MmMzZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvamZhY2UvV2l6YXJkRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5qZmFjZS5leGFtcGxlcw0KLQ0KLWltcG9ydCBncm9vdnkuamZhY2UuSkZhY2VCdWlsZGVyDQotDQotY2xhc3MgV2l6YXJkRGVtbyBleHRlbmRzIFNjcmlwdCB7DQotICAgIEBQcm9wZXJ0eSBtYWluYXBwDQotICAgIEBQcm9wZXJ0eSB3aXphcmRQYWdlMQ0KLSAgICBAUHJvcGVydHkgdGV4dCAgICANCi0gICAgQFByb3BlcnR5IHdpemFyZERpYWxvZzENCi0gICAgDQotICAgIGRlZiBydW4oKSB7DQotCQlqZmFjZSA9IG5ldyBKRmFjZUJ1aWxkZXIoKQ0KLQ0KLQkJbWFpbmFwcCA9IGpmYWNlLmFwcGxpY2F0aW9uV2luZG93KCkgeyAJDQotCQkNCi0gIAkJCXdpemFyZERpYWxvZzEgPSB3aXphcmREaWFsb2coKSB7DQotICAJCQkNCi0JCQkJd2l6YXJkUGFnZTEgPSB3aXphcmRQYWdlKCB0aXRsZToiU3RlcCAxIiwgZGVzY3JpcHRpb246IlN0ZXAgMSIsIGNsb3N1cmU6IHsgcGFyZW50IHwNCi0JCQkJCWpmYWNlLmNvbXBvc2l0ZSggcGFyZW50ICkgew0KLQkJCQkJCWdyaWRMYXlvdXQoIG51bUNvbHVtbnM6MiApDQotCQkJCQkJbGFiZWwoIHRleHQ6IlNvbWUgaW5wdXQiICkNCi0NCi0JCQkJCQl0ZXh0ID0gdGV4dCgpDQotCQkJCQkJbGFiZWwoIHRleHQ6IkxhYmVsIDEiICkNCi0JCQkJCQkNCi0JCQkJCQlidXR0b24oIHRleHQ6IlNldCBNZXNzYWdlIikgew0KLQkJCQkJCQlvbkV2ZW50KCB0eXBlOiJTZWxlY3Rpb24iICwgY2xvc3VyZTogeyANCi0JCQkJCQkJCXdpemFyZFBhZ2UxLnNldE1lc3NhZ2UoIHRleHQuZ2V0VGV4dCgpICkgCQkJCQkJCQkNCi0JCQkJCQkJfSkNCi0JCQkJCQl9CQ0KLQkNCi0JCQkJCQlsYWJlbCggdGV4dDoiTGFiZWwgMiIgKQ0KLQkJCQkJCWJ1dHRvbiggdGV4dDoiU2V0IEVycm9yIE1lc3NhZ2UiICkgew0KLQkJCQkJCQlvbkV2ZW50KCB0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOiB7DQotCQkJCQkJCQl3aXphcmRQYWdlMS5zZXRFcnJvck1lc3NhZ2UoJ0Vycm9yTWVzc2FnZTogVGhpcyBzdGVwIGlzIG5vdCBjb21wbGV0ZScpIA0KLQkJCQkJCQl9KQ0KLQkJCQkJCX0NCi0JCQkJCQkNCi0JCQkJCQlsYWJlbCggdGV4dDoiTGFiZWwgMyIgKQ0KLQkJCQkJCWJ1dHRvbiAoIHRleHQ6IlNldCBQYWdlIENvbXBsZXRlIiApIHsNCi0JCQkJCQkJb25FdmVudCAoIHR5cGU6IlNlbGVjdGlvbiIsIGNsb3N1cmU6IHsNCi0JCQkJCQkJCXdpemFyZFBhZ2UxLnNldFBhZ2VDb21wbGV0ZSh0cnVlKQ0KLQkJCQkJCQl9KQ0KLQkJCQkJCX0NCi0JCQkJCX0gDQotCQkNCi0JCQkJfSkNCi0JCQkJDQotCQkJCXdpemFyZFBhZ2UyID0gd2l6YXJkUGFnZSggdGl0bGU6IlN0ZXAgMiIsIGRlc2NyaXB0aW9uOiJTdGVwIDIiLCBjbG9zdXJlOiB7IHBhcmVudCB8DQotCQkJCQlqZmFjZS5jb21wb3NpdGUoIHBhcmVudCApIHsNCi0JCQkJCQlncmlkTGF5b3V0KCBudW1Db2x1bW5zOiIyIiApDQotCQkJCQkJbGFiZWwoIHRleHQ6IkxhYmVsIDMiICkNCi0JCQkJCQlidXR0b24oIHRleHQ6IkRvIG5vdGhpbmciICkNCi0JCQkJCX0NCi0JCQkJfSkNCi0JCQkJCQkJDQotCQkJCXdpemFyZFBhZ2UzID0gd2l6YXJkUGFnZSggdGl0bGU6IlN0ZXAgMyIsIGRlc2NyaXB0aW9uOiJTdGVwIDMiLCBjbG9zdXJlOiB7IHBhcmVudCB8DQotCQkJCQlqZmFjZS5jb21wb3NpdGUoIHBhcmVudCApIHsNCi0JCQkJCQlncmlkTGF5b3V0KCBudW1Db2x1bW5zOiIyIiApDQotCQkJCQkJbGFiZWwoIHRleHQ6IkxhYmVsIDQiICkNCi0JCQkJCQlidXR0b24oIHRleHQ6IkRvIG5vdGhpbmciICkNCi0JCQkJCX0NCi0JCQkJfSkJDQotCQkJfSANCi0JCQkJd2l6YXJkRGlhbG9nMS5vcGVuKCkNCi0JCQkJd2l6YXJkUGFnZTEuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKQ0KLQkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQl2b2lkIG9uUGVyZm9ybUZpbmlzaCgpIHsNCi0JCXByaW50bG4gIm9uUGVyZm9ybUZpbmlzaCBjYWxsZWQgLi4uIg0KLQl9CSANCi0NCi0Jdm9pZCBvblBlcmZvcm1DYW5jZWwoKSB7DQotCQlwcmludGxuICJvblBlcmZvcm1DYW5jZWwgY2FsbGVkIC4uLi4uLiINCi0JfQ0KLQkNCi19DQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9Bd3RTd3REZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvQXd0U3d0RGVtby5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGRlMGIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9Bd3RTd3REZW1vLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5leGFtcGxlcw0KLQ0KLWltcG9ydCBncm9vdnkuc3d0LlN3dEJ1aWxkZXINCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5DdXN0b21Td2luZ0J1aWxkZXINCi0NCi0NCi1jbGFzcyBBd3RTd3REZW1vIHsNCi0gICAgQFByb3BlcnR5IHN3dA0KLSAgICANCi0gICAgdm9pZCBydW4oKSB7DQotICAgICAgICBzd3QgPSBuZXcgU3d0QnVpbGRlcigpDQotICAgCQlkZWYgc3dpbmcgPSBuZXcgQ3VzdG9tU3dpbmdCdWlsZGVyKCkgICAgICAgIA0KLSAgIAkJDQotICAgICAgICBkZWYgc2hlbGwgPSBzd3Quc2hlbGwgKCB0ZXh0OidUaGUgQXd0U3d0IERlbW8nICkgew0KLSAgICAgICAgIAlmaWxsTGF5b3V0KCkNCi0gICAgICAgICAJDQotICAgICAgICAgCWxhYmVsKCB0ZXh0OiJ0aGlzIGlzIGEgc3d0IGxhYmVsIiApDQotICAgICAgICAgCQ0KLSAgICAgICAgIAljb21wb3NpdGUgKCBzdHlsZToiYm9yZGVyLCBlbWJlZGRlZCIgKSB7DQotICAgICAgICAgCQlmaWxsTGF5b3V0KCkNCi0gICAgICAgICAJDQotCSAgICAgICAgIAlzd2luZy5jdXJyZW50ID0gYXd0RnJhbWUoKQ0KLQkJCQlzd2luZy50cmVlKCkNCi0JCQl9DQotICAgICAgICB9DQotICAgICAgICANCi0JCXNoZWxsLm9wZW4oKQ0KLQkNCi0JCXdoaWxlKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7IA0KLQkJCWlmICghIHNoZWxsLmRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsNCi0JCQkJc2hlbGwuZGlzcGxheS5zbGVlcCgpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvQnJvd3NlckRlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9Ccm93c2VyRGVtby5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjBlNjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9Ccm93c2VyRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZXhhbXBsZXMNCi0NCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RCdWlsZGVyDQotDQotY2xhc3MgQnJvd3NlclN3dERlbW8gZXh0ZW5kcyBTY3JpcHQgew0KLSAgICBAUHJvcGVydHkgc3d0DQotICAgIEBQcm9wZXJ0IHNoZWxsDQotICAgIEBQcm9wZXJ0IGJyb3dzZXINCi0gICAgQFByb3BlcnQgbG9jYXRpb24NCi0gICAgQFByb3BlcnQgc3RhdHVzDQotICAgIEBQcm9wZXJ0IHByb2dyZXNzQmFyDQotICAgICAgICANCi0gICAgZGVmIHJ1bigpIHsNCi0gICAgICAgIHN3dCA9IG5ldyBTd3RCdWlsZGVyKCkNCi0gICAgICAgIA0KLSAgICAgICAgc2hlbGwgPSBzd3Quc2hlbGwoIHRleHQ6IlRoZSBCcm93c2VyIFRlc3QiLCBsb2NhdGlvbjpbMTAwLDEwMF0sIHNpemU6WzcwMCw2MDBdICkgew0KLSAgICAgICAgIAlncmlkTGF5b3V0KG51bUNvbHVtbnM6MykgDQotDQotICAgICAgICAJdG9vbEJhciggc3R5bGU6Im5vbmUiICkgew0KLSAgICAgICAgCQlncmlkRGF0YSggaG9yaXpvbnRhbFNwYW46MyApDQotICAgICAgICAJDQotICAgICAgICAJCXRvb2xJdGVtKHN0eWxlOiJwdXNoIiwgdGV4dDoiQmFjayIpIHsNCi0gICAgICAgIAkJCW9uRXZlbnQodHlwZToiU2VsZWN0aW9uIiwgY2xvc3VyZTp7IGJyb3dzZXIuYmFjaygpIH0pIA0KLSAgICAgICAgCQl9DQotICAgICAgICAJCQ0KLSAgICAgICAgCQl0b29sSXRlbShzdHlsZToicHVzaCIsIHRleHQ6IkZvcndhcmQiKSB7DQotICAgICAgICAJCQlvbkV2ZW50KHR5cGU6IlNlbGVjdGlvbiIsIGNsb3N1cmU6eyBicm93c2VyLmZvcndhcmQoKSB9ICkgDQotICAgICAgICAJCX0NCi0gICAgICAgIAkJDQotICAgICAgICAJCXRvb2xJdGVtKHN0eWxlOiJwdXNoIiwgdGV4dDoiU3RvcCIpIHsJDQotICAgICAgICAJCQlvbkV2ZW50KHR5cGU6IlNlbGVjdGlvbiIsIGNsb3N1cmU6eyBicm93c2VyLnN0b3AoKSB9ICkNCi0gICAgICAgIAkJfQ0KLSAgICAgICAgCQkNCi0gICAgICAgIAkJdG9vbEl0ZW0oc3R5bGU6InB1c2giLCB0ZXh0OiJSZWZyZXNoIikgeyANCi0gICAgICAgIAkJCW9uRXZlbnQodHlwZToiU2VsZWN0aW9uIiwgY2xvc3VyZTp7IGJyb3dzZXIucmVmcmVzaCgpIH0gKQ0KLSAgICAgICAgCQl9DQotICAgICAgICAJCQ0KLSAgICAgICAgCQl0b29sSXRlbShzdHlsZToicHVzaCIsIHRleHQ6IkdvIikgew0KLSAgICAgICAgCQkJb25FdmVudCh0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsgDQotICAgICAgICAJCQkJYnJvd3Nlci5zZXRVcmwoIGxvY2F0aW9uLmdldFRleHQoKSApIA0KLSAgICAgICAgCQkJfSkNCi0gICAgICAgIAkJfQ0KLSAgICAgICAgCX0NCi0NCi0gICAgICAgIAlsYWJlbCggc3R5bGU6Im5vbmUiLCB0ZXh0OiJBZGRyZXNzIiApDQotICAgICAgICAJbG9jYXRpb24gPSB0ZXh0KCBzdHlsZToiYm9yZGVyIiApIHsgIA0KLQkgICAgICAgIAlncmlkRGF0YSggc3R5bGU6ImZpbGxfaG9yaXpvbnRhbCIsIGhvcml6b250YWxTcGFuOjIsIGdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U6dHJ1ZSApDQotICAgICAgICAJfQ0KLQ0KLQ0KLQkJCWJyb3dzZXIgPSBicm93c2VyKCBzdHlsZToiYm9yZGVyIiApIHsNCi0JCQkJZ3JpZERhdGEoIGhvcml6b250YWxTcGFuOjMsIHN0eWxlOiJmaWxsX2JvdGgiLCBncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlOnRydWUgKQ0KLQ0KLSAJCQkJbG9jYXRpb25MaXN0ZW5lcih0eXBlOiJjaGFuZ2VkIiwgY2xvc3VyZTogeyBldmVudCB8DQotCQkJCQlsb2NhdGlvbi5zZXRUZXh0KCBldmVudC5sb2NhdGlvbiApDQotCQkJCX0pDQotCSAJDQotCQkJCXByb2dyZXNzTGlzdGVuZXIodHlwZToiY2hhbmdlZCIsIGNsb3N1cmU6IHsgZXZlbnQgfA0KLQkJCQkJaWYgKGV2ZW50LnRvdGFsICE9IDApIHsNCi0JCQkJCQlyYXRpbyA9IGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbA0KLQkJCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbiggDQotCQkJCQkJCUludGVnZXIucGFyc2VJbnQoIiIgKyBNYXRoLnJvdW5kKERvdWJsZS5wYXJzZURvdWJsZSgiIiArIHJhdGlvKSkpICkNCi0JCQkJCX0NCi0JCQkJfSkNCi0JCQkNCi0JCQkJcHJvZ3Jlc3NMaXN0ZW5lcih0eXBlOiJjb21wbGV0ZWQiLCBjbG9zdXJlOiB7IA0KLQkJCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDApDQotCQkJCX0pDQotCQkNCi0JCQkJc3RhdHVzVGV4dExpc3RlbmVyKCBjbG9zdXJlOiB7IGV2ZW50IHwNCi0JCQkJCXN0YXR1cy5zZXRUZXh0KGV2ZW50LnRleHQpCQ0KLQkJCQl9KQ0KLQkJCQkNCi0JCQl9DQotCQkJYnJvd3Nlci5zZXRVcmwoICJodHRwOi8vZmVlZHMuY29kZWhhdXMub3JnLyIgKQ0KLQkJCXN0YXR1cyA9IGxhYmVsKCBzdHlsZToibm9uZSIsIHRleHQ6IiIgKSB7DQotCQkJCWdyaWREYXRhKCBzdHlsZToiZmlsbF9ob3Jpem9udGFsIiwgaG9yaXpvbnRhbFNwYW46MikgDQotCQkJfQ0KLQkJDQotCQkJcHJvZ3Jlc3NCYXIgPSBwcm9ncmVzc0JhciAoKSB7DQotCQkJCWdyaWREYXRhKCBob3Jpem9udGFsQWxpZ25tZW50OiJlbmQiICkNCi0JCQl9DQotCQkJCQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotLy8JCWJyb3dzZXIuc2V0VXJsKCAiaHR0cDovL2ZlZWRzLmNvZGVoYXVzLm9yZy8iICkNCi0JCXNoZWxsLm9wZW4oKQ0KLQkNCi0JCXdoaWxlKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7IA0KLQkJCWlmICghIHNoZWxsLmRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsNCi0JCQkJc2hlbGwuZGlzcGxheS5zbGVlcCgpOw0KLQkJCX0NCi0JCX0NCi0JCQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L0Zvcm1EZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvRm9ybURlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQwOGQ0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvRm9ybURlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0LmV4YW1wbGVzDQotDQotaW1wb3J0IGdyb292eS5qZmFjZS5KRmFjZUJ1aWxkZXINCi0NCi1jbGFzcyBBcHBsaWNhdGlvbkRlbW8gew0KLSAgICBAUHJvcGVydHkgIG1haW5hcHANCi0gICAgDQotICAgIHZvaWQgcnVuKCkgew0KLSAgICAgICAgZGVmIGpmYWNlID0gbmV3IEpGYWNlQnVpbGRlcigpDQotDQotICAgICAgICBtYWluYXBwID0gamZhY2UuYXBwbGljYXRpb25XaW5kb3coIHRpdGxlOiJUaGUgZm9ybXMgZGVtbyIsIHNpemU6WzcwMCw4MDBdLCBsb2NhdGlvbjpbMCwwXSApIHsgCQ0KLSAgICAgICAgIAlncmlkTGF5b3V0ICggbnVtQ29sdW1uczoyICkNCi0JCQlmb3JtKCB0ZXh0OiJIZWxsbywgRWNsaXBzZSBGb3JtcyIgKSB7DQotCQkJCWdyaWREYXRhKCBzdHlsZToiZmlsbF9ib3RoIiApDQotCQkJCXRhYmxlV3JhcExheW91dCgpDQotDQotCQkJCWZvcm1TZWN0aW9uKCB0ZXh0OiJzZWN0aW9uMSIsIGRlc2NyaXB0aW9uOiJkZXNjcmlwdGlvbiBvZiBzZWN0aW9uMSIsIHN0eWxlOiJkZXNjcmlwdGlvbiwgdHdpc3RpZSIgKSB7DQotCQkJCQl0YWJsZVdyYXBEYXRhKCBzdHlsZToiZmlsbCIgKQ0KLQkJCQkJDQotCQkJCQlleHBhbnNpb25MaXN0ZW5lciggdHlwZToiZXhwYW5zaW9uU3RhdGVDaGFuZ2luZyIsIGNsb3N1cmU6IHsgcHJpbnRsbiAiZXhwYW5zaW9uU3RhdGVDaGFuZ2luZyAuLi4gIiArIGl0IH0gKQ0KLQkJCQkJZXhwYW5zaW9uTGlzdGVuZXIoIHR5cGU6ImV4cGFuc2lvblN0YXRlQ2hhbmdlZCIsIGNsb3N1cmU6IHsgcHJpbnRsbiAiZXhwYW5zaW9uU3RhdGVDaGFuZ2VkIC4uLiAiICsgaXQgfSApDQotCQkJCQkNCi0JCQkJCWRlZiBodG1sVGV4dCA9ICI8Zm9ybT4iDQotCQkJCQlodG1sVGV4dCArPSAiPGxpPmxpc3QgaXRlbTwvbGk+Ig0KLQkJCQkJaHRtbFRleHQgKz0gIjxwPnRoaXMgaHRtbCBjb2RlIHdpdGggYW4gdXJsOiBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZzwvcD4iDQotCQkJCQlodG1sVGV4dCArPSAiPGxpIHN0eWxlPVwidGV4dFwiIHZhbHVlPVwiMS5cIj5saXN0IGl0ZW0gMjwvbGk+Ig0KLQkJCSAgICAgICAgaHRtbFRleHQgKz0gIjxsaSBzdHlsZT1cInRleHRcIiB2YWx1ZT1cIjIuXCI+bGlzdCBpdGVtIDM8L2xpPiINCi0JCQkgICAgICAgIGh0bWxUZXh0ICs9ICI8L2Zvcm0+Ig0KLQkJCQkJDQotCQkJCQlmb3JtRm9ybWF0dGVkVGV4dCggdGV4dDpodG1sVGV4dCwgcGFyc2VUYWdzOnRydWUsIGV4cGFuZFVSTHM6dHJ1ZSApCQkJCQkNCi0JCQkJCQ0KLQkJCQkJZm9ybUJ1dHRvbiAoIHRleHQ6IlRoaXMgaXMgcmFkaW9idXR0b24xIiwgc3R5bGU6InJhZGlvIiApIA0KLQkJCQkJZm9ybUJ1dHRvbiAoIHRleHQ6IlRoaXMgaXMgcmFkaW9idXR0b24yIiwgc3R5bGU6InJhZGlvIiApIA0KLQkJCQkJDQotCQkJCQlmb3JtQnV0dG9uICggdGV4dDoiVGhpcyBpcyBhIEFSUk9XIGJ1dHRvbiIsIHN0eWxlOiJhcnJvdyIgKSB7DQotCQkJCQkJb25FdmVudCh0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsgcHJpbnRsbiAic3RvcCBzZWxlY3RpbmcgbWUgISEhIiB9KSANCi0JCQkJCX0JDQotCQkJCQlmb3JtQnV0dG9uICggdGV4dDoiVGhpcyBpcyBhIFBVU0ggYnV0dG9uIiwgc3R5bGU6InB1c2giICkgew0KLQkgICAgICAgIAkJCW9uRXZlbnQodHlwZToiU2VsZWN0aW9uIiwgY2xvc3VyZTp7IHByaW50bG4gInN0b3AgcHVzaGluZyBtZSAhISEiIH0pIA0KLQkgICAgICAgIAkJfQ0KLQkJCQkJZm9ybUJ1dHRvbiAoIHRleHQ6IlRoaXMgaXMgYSBUT0dHTEUgYnV0dG9uIiwgc3R5bGU6IlRPR0dMRSIgKSB7DQotCQkJCQkJb25FdmVudCh0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsgcHJpbnRsbiBpdC5ldmVudCB9KSANCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlmb3JtU2VjdGlvbiggdGV4dDoic2VjdGlvbjIiLCBkZXNjcmlwdGlvbjoiZGVzY3JpcHRpb24gb2Ygc2VjdGlvbjIiLCBzdHlsZToiZGVzY3JpcHRpb24sIHR3aXN0aWUiICkgew0KLQkJCQkJdGFibGVXcmFwRGF0YSggc3R5bGU6ImZpbGwiICkNCi0JCQkJCWZvcm1MYWJlbCggdGV4dDoiVGhpcyBpcyBhIGxhYmVsIGluIHNlY3Rpb24gMiIgKQ0KLQkJCQkJZm9ybUV4cGFuZGFibGVDb21wb3NpdGUoIHRleHQ6ImZvcm1FeHBhbmRhYmxlQ29tcG9zaXRlIiApDQotCQkJCX0NCi0NCi0JCQkJZm9ybVNlY3Rpb24oIHRleHQ6InNlY3Rpb24zIiwgZGVzY3JpcHRpb246ImRlc2NyaXB0aW9uIG9mIHNlY3Rpb24zIiwgc3R5bGU6ImRlc2NyaXB0aW9uLCB0d2lzdGllIiApIHsNCi0JCQkJCXRhYmxlV3JhcERhdGEoIHN0eWxlOiJmaWxsIiApDQotCQkJCQlmb3JtTGFiZWwoIHRleHQ6IkJlbG93IG1lIGlzIGEgdHJlZSIgKQ0KLQkgICAgICAgCQkJZm9ybVRyZWUoKQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlmb3JtU2VwYXJhdG9yKCBzdHlsZToic2VwYXJhdG9yLCBob3Jpem9udGFsIiApIHsNCi0JCQkJCXRhYmxlV3JhcERhdGEoIHN0eWxlOiJmaWxsIiApDQotCQkJCX0NCi0JCQkJDQotCQkJCWZvcm1CdXR0b24oIHRleHQ6IlRoaXMgaXMgYSBmb3JtQnV0dG9uIiApDQotCQkJCQ0KLSAgICAgICAJCQlmb3JtQ29tcG9zaXRlU2VwYXJhdG9yKCkNCi0JCQkJCQkJCQ0KLQkJCQlmb3JtSHlwZXJsaW5rKCB0ZXh0OiJ0aGlzIGlzIGEgaHlwZXJsaW5rIiApIHsNCi0JCQkJCWh5cGVybGlua0xpc3RlbmVyKCB0eXBlOiJoeXBlcmxpbmtVcGRhdGUiLCBjbG9zdXJlOiB7IHByaW50bG4gImh5cGVybGlua1VwZGF0ZSAuLi4gIiArIGl0IH0gKQ0KLQkJCQkJaHlwZXJsaW5rTGlzdGVuZXIoIHR5cGU6ImxpbmtFbnRlcmVkIiwgY2xvc3VyZTogeyBwcmludGxuICJsaW5rRW50ZXJlZCAuLi4gIiArIGl0IH0gKQ0KLQkJCQkJaHlwZXJsaW5rTGlzdGVuZXIoIHR5cGU6ImxpbmtFeGl0ZWQiLCBjbG9zdXJlOiB7IHByaW50bG4gImxpbmtFeGl0ZWQgLi4uICIgKyBpdCB9ICkNCi0JCQkJCWh5cGVybGlua0xpc3RlbmVyKCB0eXBlOiJsaW5rQWN0aXZhdGVkIiwgY2xvc3VyZTogeyBwcmludGxuICJsaW5rQWN0aXZhdGVkIC4uLiAiICsgaXQgfSApDQotCQkJCX0NCi0gICAgICAgCQkJDQotICAgICAgIAkJCWZvcm1MYWJlbCggdGV4dDoiVGhpcyBpcyBhIGZvcm1MYWJlbCwgZm9sb3dlZCBieSBhIGZvcm1UYWJsZSIgKQ0KLSAgICAgICAJCQlmb3JtVGFibGUoKSB7DQotCSAgICAgICAJCQl0YWJsZVdyYXBEYXRhKCBzdHlsZToiZmlsbCIgKQ0KLSAgICAgICAJCQl9DQotICAgICANCi0gICAgIAkJCQ0KLSAgICAgICAJCQkNCi0gICAgICAgCQkJLy8gTk9UIEZVTExZIElNUExFTUVOVEVEIFlFVDoNCi0gICAgICAgCQkJLy8gZm9ybUltYWdlSHlwZXJsaW5rKCB0ZXh0OiJmb3JtSW1hZ2VIeXBlcmxpbmsiICkNCi0gICAgICAgCQkJLy8gZm9ybVBhZ2VCb29rKCB0ZXh0OiJmb3JtUGFnZUJvb2siICkNCi0gICAgICAgCQkJDQotCQkJfQ0KLQkJCQ0KLQkJCWZvcm0oIHRleHQ6ImhlbGxvIGZvcm1TY3JvbGxlZEZvcm0iICkgew0KLQkJCQlncmlkRGF0YSggc3R5bGU6ImZpbGxfYm90aCIgKQ0KLQkJCQlmb3JtTGFiZWwoIHRleHQ6Im15IHBhcmVudCBpcyBhIHNjcm9sbGVkRm9ybSIgKQ0KLQkJCQlmb3JtQnV0dG9uKCB0ZXh0OiJmb3JtQnV0dG9uIiApDQotCQkJfQ0KLQkJfQ0KLQkJDQotCQltYWluYXBwLmdldFNoZWxsKCkucGFjaygpDQotCQltYWluYXBwLm9wZW4oKQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvR3VpQnVpbGRlckRlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9HdWlCdWlsZGVyRGVtby5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDUwZTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9HdWlCdWlsZGVyRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZ3VpYnVpbGRlcgotCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5ndWlidWlsZGVyLkFwcGxpY2F0aW9uR3VpQnVpbGRlcgotCi1jbGFzcyBBcHBsaWNhdGlvbkd1aURlbW8gewotICAgIEBQcm9wZXJ0eSBjb21wCi0gICAgQFByb3BlcnR5IGJ1aWxkZXIKLSAgICBAUHJvcGVydHkgbWFpbmFwcAotICAgIEBQcm9wZXJ0eSBndWlCdWlsZGVyCi0gICAgQFByb3BlcnR5IGNvbXAxCi0gICAgCi0gICAgZGVmIG1haW4oIGFyZ3MgKSB7Ci0KLSAgICAgICAgbWFpbmFwcCA9IGd1aUJ1aWxkZXIuYXBwbGljYXRpb25XaW5kb3coIHRpdGxlOiJUaGUgQXBwbGljYXRpb25HdWlEZW1vIiwgc2l6ZTpbNzAwLDQwMF0gKSB7IAotICAgICAgICAgICAgZmlsbExheW91dCggKSAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWVudU1hbmFnZXIoIHRleHQ6IlNjcmVlbnMiICkgewotICAgICAgICAgICAgICAgIGFjdGlvbiggdGV4dDoiU2NyZWVuMSIsIGNsb3N1cmU6eyAKLSAgICAgICAgICAgICAgICAgICAgZ3VpQnVpbGRlci5ydW5TY3JpcHQoIHNyYzoiU2NyZWVuMS5ncm9vdnkiLCBwYXJlbnQ6bWFpbmFwcCwgcmVidWlsZDp0cnVlICkKLSAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgIGFjdGlvbiggdGV4dDoiU2NyZWVuMiIsIGNsb3N1cmU6eyAKLSAgICAgICAgICAgICAgICAgICAgZ3VpQnVpbGRlci5ydW5TY3JpcHQoIHNyYzoiU2NyZWVuMi5ncm9vdnkiLCBwYXJlbnQ6bWFpbmFwcCwgcmVidWlsZDp0cnVlICkKLSAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdG9vbEJhciggc3R5bGU6Imhvcml6b250YWwiICl7Ci0gICAgICAgICAgICAgICAgdG9vbEl0ZW0oIHRleHQ6IkJsdWUiICkgewotICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCB0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsKLSAgICAgICAgICAgICAgICAgICAgICAgIGd1aUJ1aWxkZXIucmVidWlsZCggcGFyZW50OmNvbXAxLCBjbG9zdXJlOnsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpQnVpbGRlci5jb21wb3NpdGUoIGl0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwoIHRleHQ6IlRoaXMgaXMgZnJlc2ggbmV3IGJsdWUgbGFiZWwgLi4uIiwgYmFja2dyb3VuZDpbMCwgMCwgMjU1XSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdG9vbEl0ZW0oIHRleHQ6IlJlZCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoIHR5cGU6IlNlbGVjdGlvbiIsIGNsb3N1cmU6ewotICAgICAgICAgICAgICAgICAgICAgICAgZ3VpQnVpbGRlci5yZWJ1aWxkKCBwYXJlbnQ6Y29tcDEsIGNsb3N1cmU6eyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlCdWlsZGVyLmNvbXBvc2l0ZSggaXQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxMYXlvdXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCggdGV4dDoiVGhpcyBpcyBmcmVzaCBuZXcgcmVkIGxhYmVsIC4uLiIsIGJhY2tncm91bmQ6WzI1NSwgMCwgMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICBjb21wb3NpdGUoKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmlsbExheW91dCgpIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNvbXAxID0gY29tcG9zaXRlKCkgewotICAgICAgICAgICAgICAgICAgICBmaWxsTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwoIHRleHQ6IlRoaXMgaXMgZ3JlZW4gbGFiZWwiLCBiYWNrZ3JvdW5kOlswLCAyNTUsIDBdICApCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1haW5hcHAuTWVudUJhck1hbmFnZXIudXBkYXRlQWxsKHRydWUpCi0gICAgICAgIG1haW5hcHAub3BlbigpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5Bd3RTd3REZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1bkF3dFN3dERlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlOWU1NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1bkF3dFN3dERlbW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxOSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4gJElkJAotICovCi1wdWJsaWMgY2xhc3MgUnVuQXd0U3d0RGVtbyB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJ1bkRlbW9Ccm93c2VyIGRlbW8gPSBuZXcgUnVuRGVtb0Jyb3dzZXIoKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd3QvQXd0U3d0RGVtby5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgicnVuIiwgbnVsbCk7Ci0gICAgfQotICAgIAotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotLy8gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0vLyAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0vLyAgICAgICAgQ29tcG9zaXRlIGxvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5ERUZBVUxUKTsKLS8vICAgICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgamF2YS5hd3QuRnJhbWUgbG9jYXRpb25GcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGxvY2F0aW9uQ29tcCk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgbG9jYXRpb25GcmFtZS5hZGQobmV3IEpUcmVlKCkpOwotLy8gICAgICAgIAotLy8gICAgICAgIHNoZWxsLm9wZW4oKTsKLS8vICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotLy8gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0vLyAgICAgICAgCi0vLyAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5EZW1vQnJvd3Nlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5EZW1vQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNiODhkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuRGVtb0Jyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5EZW1vQnJvd3NlciBleHRlbmRzIFN3dFRlc3QgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5EZW1vQnJvd3NlciBkZW1vID0gbmV3IFJ1bkRlbW9Ccm93c2VyKCk7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBkZW1vLmNvbXBpbGUoInNyYy9leGFtcGxlcy9ncm9vdnkvc3d0L0Jyb3dzZXJEZW1vLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJydW4iLCBudWxsKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1bkRlbW9UYWJsZVRyZWUuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuRGVtb1RhYmxlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg0ZmE4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuRGVtb1RhYmxlVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkRlbW9UYWJsZVRyZWUgZXh0ZW5kcyBTd3RUZXN0IHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUnVuRGVtb1RhYmxlVHJlZSBkZW1vID0gbmV3IFJ1bkRlbW9UYWJsZVRyZWUoKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVGFibGVUcmVlRGVtby5ncm9vdnkiKTsKLSAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgicnVuIiwgbnVsbCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5EZW1vVHJlZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5EZW1vVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA2MzcxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuRGVtb1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5EZW1vVHJlZSBleHRlbmRzIFN3dFRlc3QgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5EZW1vVHJlZSBkZW1vID0gbmV3IFJ1bkRlbW9UcmVlKCk7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBkZW1vLmNvbXBpbGUoInNyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RyZWVEZW1vLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJydW4iLCBudWxsKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1bkZvcm1EZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1bkZvcm1EZW1vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWYyZDYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9SdW5Gb3JtRGVtby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkZvcm1EZW1vIGV4dGVuZHMgU3d0VGVzdCB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJ1bkZvcm1EZW1vIGRlbW8gPSBuZXcgUnVuRm9ybURlbW8oKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd3QvRm9ybURlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuU2FzaEZvcm1EZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1blNhc2hGb3JtRGVtby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY2YTdlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuU2FzaEZvcm1EZW1vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RUZXN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1blNhc2hGb3JtRGVtbyBleHRlbmRzIFN3dFRlc3QgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5TYXNoRm9ybURlbW8gZGVtbyA9IG5ldyBSdW5TYXNoRm9ybURlbW8oKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd3QvU2FzaEZvcm1EZW1vLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJydW4iLCBudWxsKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1blRhYkRlbW8uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuVGFiRGVtby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIyYzJjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuVGFiRGVtby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE5LCAyMDA0Ci0gKiAgCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPiAKLSAqICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFJ1blRhYkRlbW8gewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSdW5EZW1vQnJvd3NlciBkZW1vID0gbmV3IFJ1bkRlbW9Ccm93c2VyKCk7Ci0gICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBkZW1vLmNvbXBpbGUoInNyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RhYkRlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuVHJheURlbW8uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvUnVuVHJheURlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhNTUwOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1J1blRyYXlEZW1vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RUZXN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFJ1blRyYXlEZW1vIGV4dGVuZHMgU3d0VGVzdCB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJ1blRyYXlEZW1vIGRlbW8gPSBuZXcgUnVuVHJheURlbW8oKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVHJheURlbW8uZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvU2FzaEZvcm1EZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvU2FzaEZvcm1EZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZThmZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1Nhc2hGb3JtRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZXhhbXBsZXMNCi0NCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RCdWlsZGVyDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZQ0KLQ0KLS8qDQotKiBqYXZhIHZlcnNpb246IGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvcGxhdGZvcm0tc3d0LWhvbWUvc25pcHBpdHMvc25pcHBldDEwOS5odG1sDQotKi8NCi0NCi1jbGFzcyBTd3REZW1vIHsNCi0gICAgQFByb3BlcnR5IHNoZWxsICAgIA0KLSAgICBAUHJvcGVydHkgc2FzaEZvcm0xICAgIA0KLSAgICANCi0gICAgdm9pZCBydW4oKSB7DQotICAgICAgICBkZWYgYnVpbGRlciA9IG5ldyBTd3RCdWlsZGVyKCkNCi0gICAgICAgIHNoZWxsID0gYnVpbGRlci5zaGVsbCAoIHRleHQ6J1RoZSBTYXNoRm9ybSBEZW1vJyApIHsNCi0gICAgICAgIAlmaWxsTGF5b3V0KCkNCi0gICAgICAgIA0KLSAgICAgICAJCXNhc2hGb3JtMSA9IHNhc2hGb3JtKCBzdHlsZToiaG9yaXpvbnRhbCIgKSB7DQotICAgICAgIAkJCWZpbGxMYXlvdXQoKQ0KLSAgICAgICAJCQkNCi0gICAgICAgCQkJY29tcG9zaXRlKCBzdHlsZToibm9uZSIgKSB7DQotCSAgICAgICAJCQlmaWxsTGF5b3V0KCkNCi0JICAgICAgIAkJCWxhYmVsKCB0ZXh0OiJMYWJlbCBpbiBwYW5lIDEiICkNCi0gICAgICAgCQkJfQ0KLSAgICANCi0gICAgICAgCQkJY29tcG9zaXRlKCBzdHlsZToibm9uZSIgKSB7DQotCSAgICAgICAJCQlmaWxsTGF5b3V0KCkNCi0JICAgICAgIAkJCWJ1dHRvbiggdGV4dDoiQnV0dG9uIGluIHBhbmUyIiwgc3R5bGU6InB1c2giICkNCi0gICAgICAgCQkJfQ0KLSAgICANCi0gICAgICAgCQkJY29tcG9zaXRlKCBzdHlsZToibm9uZSIgKSB7DQotICAgICAgIAkJCQlmaWxsTGF5b3V0KCkNCi0JICAgICAgIAkJCWxhYmVsKCB0ZXh0OiJMYWJlbCBpbiBwYW5lMyIgKQ0KLSAgICAgICAJCQl9DQotICAgICAgIAkJfQ0KLSAgICAgICAJCQ0KLSAgICAgICAJCXNhc2hGb3JtMS53ZWlnaHRzID0gWzMwLDQwLDMwXQ0KLQ0KLSAgICAgICAJfQkNCi0JDQotDQotCQlzaGVsbC5vcGVuKCkNCi0JDQotCQl3aGlsZSghIHNoZWxsLmlzRGlzcG9zZWQoKSkgeyANCi0JCQlpZiAoISBzaGVsbC5kaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7DQotCQkJCXNoZWxsLmRpc3BsYXkuc2xlZXAoKTsNCi0JCQl9DQotCQl9DQotCQkJCQ0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvU2NyZWVuMS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1NjcmVlbjEuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNiMDM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvU2NyZWVuMS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZ3VpYnVpbGRlcgotCi1jbGFzcyBTY3JlZW4xIGV4dGVuZHMgU2NyaXB0IHsKLSAgICAgICAgCi0gICAgZGVmIHJ1bigpIHsgICAgIAotCQlndWlCdWlsZGVyLmNvbXBvc2l0ZSB7Ci0JCQlmaWxsTGF5b3V0KCkKLQkJCQotCQkJZ3JvdXAoIHRleHQ6IlRoaXMgaXMgU2NyZWVuMS5ncm9vdnkiICkgewotCQkJCWdyaWRMYXlvdXQoKQotCQkJCWJ1dHRvbiggdGV4dDoidGhlIGhhcmRlc3QiLCBiYWNrZ3JvdW5kOlswLCAyNTUsIDI1NV0gKQotCQkJCWJ1dHRvbiggdGV4dDoiYnV0dG9uIiwgYmFja2dyb3VuZDpbMCwgMjU1LCAyNTVdICkKLQkJCQlidXR0b24oIHRleHQ6InRvIGJ1dHRvbiIsIGJhY2tncm91bmQ6WzAsIDI1NSwgMjU1XSApCi0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1NjcmVlbjIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9TY3JlZW4yLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0MDdlOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1NjcmVlbjIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0Lmd1aWJ1aWxkZXIKLQotY2xhc3MgU2NyZWVuMiBleHRlbmRzIFNjcmlwdCB7Ci0gICAgICAgIAotICAgIGRlZiBydW4oKSB7Ci0JCWd1aUJ1aWxkZXIuY29tcG9zaXRlIHsKLQkJCWZpbGxMYXlvdXQoIHR5cGU6InZlcnRpY2FsIikKLQkJCWdyb3VwKCB0ZXh0OiJUaGlzIGlzIFNjcmVlbjIuZ3Jvb3Z5IiwgYmFja2dyb3VuZDpbMjU1LCAyNTUsIDI1NV0gKSB7Ci0JCQkJZmlsbExheW91dCggdHlwZToidmVydGljYWwiKQotCQkgCQlsYWJlbCggdGV4dDoiQSBiaWcgcmVkIGxhYmVsIiwgYmFja2dyb3VuZDpbMjA0LCAwLCAwXSApIAotCQkJCWxhYmVsKCB0ZXh0OiJJIGNhbiBiYXJlbGx5IHJlYWQgdGhpcyIsIGZvcmVncm91bmQ6WzAsMjAwLDBdICkgIAotCQkJCWxhYmVsKCB0ZXh0OiJJdCBzdXJlIGxvb2tzIGxpa2UgdGhlIGR1dGNoIGZsYWciLCBmb3JlZ3JvdW5kOlswLDAsMTUwXSwgYmFja2dyb3VuZDpbMCwgMCwgMTUzXSApCi0JCQl9Ci0JCX0KLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RhYkRlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9UYWJEZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2OWY1OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RhYkRlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0LmV4YW1wbGVzDQotDQotaW1wb3J0IGdyb292eS5zd3QuU3d0QnVpbGRlcg0KLQ0KLQ0KLWNsYXNzIFRhYkRlbW8gew0KLSAgICBAUHJvcGVydHkgc3d0DQotICAgIA0KLSAgICB2b2lkIHJ1bigpIHsNCi0gICAgICAgIHN3dCA9IG5ldyBTd3RCdWlsZGVyKCkNCi0gICAJCQ0KLSAgICAgICAgZGVmIHNoZWxsID0gc3d0LnNoZWxsICggdGV4dDonVGhlIFRhYiBEZW1vJywgc2l6ZTpbNTAwLDQwMF0gKSB7DQotICAgICAgICAgCWdyaWRMYXlvdXQoKQ0KLQ0KLQkJCWNUYWJGb2xkZXIoIHN0eWxlOiJmbGF0IiApIHsNCi0JCQkJZ3JpZERhdGEoIHN0eWxlOiJmaWxsX2JvdGgiICkNCi0JCQkJY1RhYkl0ZW0oIHN0eWxlOiJub25lIiwgdGV4dDoiSXRlbTEiICkgew0KLQkJCQkJdGV4dCggc3R5bGU6ImJvcmRlciwgbXVsdGkiLCB0ZXh0OiJDb250ZW50IGZvciBJdGVtMSIgKSANCi0JCQkJfQ0KLQkJCQljVGFiSXRlbSggc3R5bGU6Im5vbmUiLCB0ZXh0OiJJdGVtMiIgKSB7DQotCQkJCQl0ZXh0KCBzdHlsZToiYm9yZGVyLCBtdWx0aSIsIHRleHQ6IkNvbnRlbnQgZm9yIEl0ZW0yIiApIA0KLQkJCQl9DQotCQkJCWNUYWJJdGVtKCBzdHlsZToibm9uZSIsIHRleHQ6Ikl0ZW0zIiApIHsNCi0JCQkJCXRleHQoIHN0eWxlOiJib3JkZXIsIG11bHRpIiwgdGV4dDoiQ29udGVudCBmb3IgSXRlbTMiICkgDQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJdGFiRm9sZGVyKCBzdHlsZToibm9uZSIgKSB7DQotCQkJCWdyaWREYXRhKCBzdHlsZToiZmlsbF9ib3RoIiApDQotCQkJCXRhYkl0ZW0oIHN0eWxlOiJub25lIiwgdGV4dDoiSXRlbTQiICkgew0KLQkJCQkJdGV4dCggc3R5bGU6ImJvcmRlciwgbXVsdGkiLCB0ZXh0OiJDb250ZW50IGZvciBJdGVtNCIgKSANCi0JCQkJfQ0KLQkJCQl0YWJJdGVtKCBzdHlsZToibm9uZSIsIHRleHQ6Ikl0ZW01IiApIHsNCi0JCQkJCXRleHQoIHN0eWxlOiJib3JkZXIsIG11bHRpIiwgdGV4dDoiQ29udGVudCBmb3IgSXRlbTUiICkgDQotCQkJCX0NCi0JCQkJdGFiSXRlbSggc3R5bGU6Im5vbmUiLCB0ZXh0OiJJdGVtNiIgKSB7DQotCQkJCQl0ZXh0KCBzdHlsZToiYm9yZGVyLCBtdWx0aSIsIHRleHQ6IkNvbnRlbnQgZm9yIEl0ZW02IiApIA0KLQkJCQl9DQotCQkJfQ0KLSAgICAgICAgIAkNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQkJc2hlbGwub3BlbigpDQotCQ0KLQkJd2hpbGUoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsgDQotCQkJaWYgKCEgc2hlbGwuZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgew0KLQkJCQlzaGVsbC5kaXNwbGF5LnNsZWVwKCk7DQotCQkJfQ0KLQkJfQ0KLQkJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVGFibGVUcmVlRGVtby5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RhYmxlVHJlZURlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q0OTFjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVGFibGVUcmVlRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZXhhbXBsZXMNCi0NCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RCdWlsZGVyDQotDQotY2xhc3MgVGFibGVUcmVlRGVtbyB7DQotICAgIEBQcm9wZXJ0eSBzd3QNCi0gICAgICAgIA0KLSAgICB2b2lkIHJ1bigpIHsNCi0gICAgICAgIHN3dCA9IG5ldyBTd3RCdWlsZGVyKCkNCi0gICAgICAgIA0KLSAgICAgICAgZGVmIHNoZWxsID0gc3d0LnNoZWxsICggdGV4dDonVGhlIFRhYmxlVHJlZSBUZXN0MScsIGxvY2F0aW9uOlsxMDAsMTAwXSwgc2l6ZTpbNzAwLDYwMF0gKSB7DQotICAgICAgICAgCWdyaWRMYXlvdXQobnVtQ29sdW1uczozKSANCi0gICAgICAgICAJDQotICAgICAgICAgCXRhYmxlVHJlZSggdG9vbFRpcFRleHQ6IlRoaXMgaXMgYSB0YWJsZSB0cmVlISIsIHN0eWxlOiJtdWx0aSwgZnVsbF9zZWxlY3Rpb24iICkgeyAgDQotCQkJDQotCQkJCWdyaWREYXRhKCBzdHlsZToiZmlsbF9ib3RoIiApIA0KLQkJCQkNCi0JCQkJdGFibGVUcmVlSXRlbSAoIHRleHQ6InJvb3QxIiApICB7DQotCQkJCQkJdGFibGVUcmVlSXRlbSAoIHRleHQ6ImNoaWxkIDEtMSIgKSAgDQotCQkJCQkJdGFibGVUcmVlSXRlbSAoIHRleHQ6ImNoaWxkIDEtMiIgKSAgCQkJCQkJCQkNCi0JCQkJCQl0YWJsZVRyZWVJdGVtICggdGV4dDoiY2hpbGQgMS0zIiApICAJCQkJCQkJCQ0KLQkJCQl9DQotDQotCQkJCXRhYmxlVHJlZUl0ZW0gKCB0ZXh0OiJyb290MiIgKSAgew0KLQkJCQkJCXRhYmxlVHJlZUl0ZW0gKCB0ZXh0OiJjaGlsZCAyLTEiICkgIA0KLQkJCQkJCXRhYmxlVHJlZUl0ZW0gKCB0ZXh0OiJjaGlsZCAyLTIiICkgIAkJCQkJCQkJDQotCQkJCQkJdGFibGVUcmVlSXRlbSAoIHRleHQ6ImNoaWxkIDItMyIgKSAgCQkJCQkJCQkNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9DQotCQl9DQotICAgICAgICANCi0JCXNoZWxsLm9wZW4oKQ0KLQkNCi0JCXdoaWxlKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7IA0KLQkJCWlmICghIHNoZWxsLmRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsNCi0JCQkJc2hlbGwuZGlzcGxheS5zbGVlcCgpOw0KLQkJCX0NCi0JCX0NCi0JCQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RyYXlEZW1vLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVHJheURlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRiMWNmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvVHJheURlbW8uZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0LmV4YW1wbGVzDQotDQotaW1wb3J0IGdyb292eS5zd3QuU3d0QnVpbGRlcg0KLQ0KLWNsYXNzIFRyYXlEZW1vIHsNCi0gICAgQFByb3BlcnR5IHN3dA0KLSAgICAgICAgDQotICAgIHZvaWQgcnVuKCkgew0KLSAgICAgICAgc3d0ID0gbmV3IFN3dEJ1aWxkZXIoKQ0KLSAgICAgICAgDQotICAgICAgICBkZWYgc2hlbGwgPSBzd3Quc2hlbGwgKCB0ZXh0OidUaGUgdHJheSBEZW1vJyApIHsNCi0gICAgICAgICAJDQotICAgICAgICAgCWRlZiB0cmF5TWVudSA9IG1lbnUgew0KLSAgICAgICAgIAkJbWVudUl0ZW0oIHRleHQ6Im1lbnVJdGVtMSIgKQ0KLSAgICAgICAgIAkJbWVudUl0ZW0oIHRleHQ6Im1lbnVJdGVtMiIgKQ0KLSAgICAgICAgIAl9DQotICAgICAgICAgCQ0KLSAgICAgICAgIAl0cmF5KCkgew0KLQkgICAgICAgICAJDQotICAgICAgICAgCQl0cmF5SXRlbSggdGV4dDoidHJheUl0ZW0xIiApIHsNCi0JICAgICAgICAgCQlpbWFnZSggc3JjOiJzcmMvdGVzdC9ncm9vdnkvc3d0L2dyb292eS1sb2dvLnBuZyIgKSANCi0JICAgICAgICAgCQkNCi0JICAgICAgICAgCQlvbkV2ZW50KCB0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsNCi0JICAgICAgICAgCQkJcHJpbnRsbiAiU2VsZWN0aW9uIGV2ZW50IC4uLiINCi0JICAgICAgICAgCQl9KQ0KLQkgICAgICAgICAJCW9uRXZlbnQoIHR5cGU6IkhpZGUiLCBjbG9zdXJlOnsNCi0JICAgICAgICAgCQkJcHJpbnRsbiAiSGlkZSBldmVudCAuLi4iDQotCSAgICAgICAgIAkJfSkNCi0JICAgICAgICAgCQlvbkV2ZW50KCB0eXBlOiJEZWZhdWx0U2VsZWN0aW9uIiwgY2xvc3VyZTp7DQotCSAgICAgICAgIAkJCXByaW50bG4gIkRlZmF1bHRTZWxlY3Rpb24gZXZlbnQgLi4uIg0KLQkgICAgICAgICAJCX0pDQotCSAgICAgICAgIAkJb25FdmVudCggdHlwZToiU2hvdyIsIGNsb3N1cmU6ew0KLQkgICAgICAgICAJCQlwcmludGxuICJTaG93IGV2ZW50IC4uLiINCi0JICAgICAgICAgCQl9KQ0KLQkgICAgICAgICAJCW9uRXZlbnQoIHR5cGU6Ik1lbnVEZXRlY3QiLCBjbG9zdXJlOnsNCi0JICAgICAgICAgCQkJcHJpbnRsbiAiTWVudURldGVjdCBldmVudCAuLi4iDQotCSAgICAgICAgIAkJCXRyYXlNZW51LnZpc2libGUgPSB0cnVlDQotCSAgICAgICAgIAkJfSkNCi0gICAgICAgICAJCX0NCi0gICAgICAgICAJfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotCQlzaGVsbC5vcGVuKCkNCi0JDQotCQl3aGlsZSghIHNoZWxsLmlzRGlzcG9zZWQoKSkgeyANCi0JCQlpZiAoISBzaGVsbC5kaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7DQotCQkJCXNoZWxsLmRpc3BsYXkuc2xlZXAoKTsNCi0JCQl9DQotCQl9DQotCQkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9UcmVlRGVtby5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RyZWVEZW1vLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlYjlkMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L1RyZWVEZW1vLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5leGFtcGxlcw0KLQ0KLWltcG9ydCBncm9vdnkuc3d0LlN3dEJ1aWxkZXINCi0NCi1jbGFzcyBTd3REZW1vIHsNCi0gICAgQFByb3BlcnR5IHN3dA0KLSAgICAgICAgDQotICAgIHZvaWQgcnVuKCkgew0KLSAgICAgICAgc3d0ID0gbmV3IFN3dEJ1aWxkZXIoKQ0KLSAgICAgICAgDQotICAgICAgICBkZWYgc2hlbGwgPSBzd3Quc2hlbGwgKCB0ZXh0OidUaGUgU3d0IERlbW8gIzEnLCBsb2NhdGlvbjpbMTAwLDEwMF0sIHNpemU6WzcwMCw2MDBdICkgew0KLSAgICAgICAgIAlncmlkTGF5b3V0KG51bUNvbHVtbnM6MykgDQotIA0KLQkJCXRyZWUoIHRvb2xUaXBUZXh0OiJUaGlzIGlzIGEgdHJlZSEiLCBzdHlsZToibXVsdGkiICkgew0KLQkJCQ0KLQkJCQlncmlkRGF0YSggc3R5bGU6ImZpbGxfYm90aCIgKQ0KLQkJCQ0KLQkJCQl0cmVlSXRlbSggdGV4dDoiQSIgKSB7DQotCQkJCQl0cmVlSXRlbSggdGV4dDoiQS9BIiApDQotCQkJCQl0cmVlSXRlbSggdGV4dDoiQS9CIiApDQotCQkJCQl0cmVlSXRlbSggdGV4dDoiQS9DIiApDQotCQkJCX0NCi0JCQkJDQotCQkJCXRyZWVJdGVtKCB0ZXh0OiJCIiApIHsNCi0JCQkJCXRyZWVJdGVtKCB0ZXh0OiJCL0EiICkNCi0JCQkJCXRyZWVJdGVtKCB0ZXh0OiJCL0IiICkNCi0JCQkJCXRyZWVJdGVtKCB0ZXh0OiJCL0MiICkNCi0JCQkJfQ0KLQkJCQkJCQ0KLQkJCQltZW51KCBzdHlsZToicG9wX3VwIiApIHsNCi0JCQkJCW1lbnVJdGVtKCB0ZXh0OiJkbyBzb21ldGhpbmchIiApDQotCQkJCQltZW51SXRlbSggdGV4dDoiZG8gc29tZXRoaW5nIGVsc2UiICkNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9DQotCQkNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQkJc2hlbGwub3BlbigpDQotCQ0KLQkJd2hpbGUoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsgDQotCQkJaWYgKCEgc2hlbGwuZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgew0KLQkJCQlzaGVsbC5kaXNwbGF5LnNsZWVwKCk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvZ3VpYnVpbGRlci9HdWlCdWlsZGVyRGVtby5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvR3VpQnVpbGRlckRlbW8uZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRkZTAyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL2V4YW1wbGVzL2dyb292eS9zd3QvZ3VpYnVpbGRlci9HdWlCdWlsZGVyRGVtby5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuZ3VpYnVpbGRlcg0KLQ0KLWltcG9ydCBncm9vdnkuc3d0Lmd1aWJ1aWxkZXIuQXBwbGljYXRpb25HdWlCdWlsZGVyDQotDQotY2xhc3MgQXBwbGljYXRpb25HdWlEZW1vIHsNCi0gICAgcHJvcGVydHkgY29tcA0KLQlwcm9wZXJ0eSBidWlsZGVyDQotCXByb3BlcnR5IG1haW5hcHANCi0JcHJvcGVydHkgZ3VpQnVpbGRlcg0KLQlwcm9wZXJ0eSBjb21wMQ0KLSAgICANCi0gICAgbWFpbiggYXJncyApIHsNCi0NCi0JCW1haW5hcHAgPSBndWlCdWlsZGVyLmFwcGxpY2F0aW9uV2luZG93KCB0aXRsZToiVGhlIEFwcGxpY2F0aW9uR3VpRGVtbyIsIHNpemU6WzcwMCw0MDBdICkgeyANCi0JCQlmaWxsTGF5b3V0KCApIA0KLQkJCQ0KLQkJCW1lbnVNYW5hZ2VyKCB0ZXh0OiJTY3JlZW5zIiApIHsNCi0JCQkJYWN0aW9uKCB0ZXh0OiJTY3JlZW4xIiwgY2xvc3VyZTp7IA0KLQkJCQkJZ3VpQnVpbGRlci5ydW5TY3JpcHQoIHNyYzoiU2NyZWVuMS5ncm9vdnkiLCBwYXJlbnQ6bWFpbmFwcCwgcmVidWlsZDp0cnVlICkNCi0JCQkJfSkNCi0JCQkJYWN0aW9uKCB0ZXh0OiJTY3JlZW4yIiwgY2xvc3VyZTp7IA0KLQkJCQkJZ3VpQnVpbGRlci5ydW5TY3JpcHQoIHNyYzoiU2NyZWVuMi5ncm9vdnkiLCBwYXJlbnQ6bWFpbmFwcCwgcmVidWlsZDp0cnVlICkNCi0JCQkJfSkNCi0JCQl9DQotCQkJCQ0KLQkJCXRvb2xCYXIoIHN0eWxlOiJob3Jpem9udGFsIiApew0KLQkJCQl0b29sSXRlbSggdGV4dDoiQmx1ZSIgKSB7DQotCQkJCQlvbkV2ZW50KCB0eXBlOiJTZWxlY3Rpb24iLCBjbG9zdXJlOnsNCi0JCQkJCQlndWlCdWlsZGVyLnJlYnVpbGQoIHBhcmVudDpjb21wMSwgY2xvc3VyZTp7IA0KLQkJCQkJCQlndWlCdWlsZGVyLmNvbXBvc2l0ZSggaXQgKSB7DQotCQkJCQkJCQlmaWxsTGF5b3V0KCkNCi0JCQkJCQkJCWxhYmVsKCB0ZXh0OiJUaGlzIGlzIGZyZXNoIG5ldyBibHVlIGxhYmVsIC4uLiIsIGJhY2tncm91bmQ6WzAsIDAsIDI1NV0gKQ0KLQkJCQkJCQl9DQotCQkJCQkJfSkNCi0JCQkJCX0pDQotCQkJCX0JCQkJDQotCQkJCQ0KLQkJCQl0b29sSXRlbSggdGV4dDoiUmVkIiApIHsNCi0JCQkJCW9uRXZlbnQoIHR5cGU6IlNlbGVjdGlvbiIsIGNsb3N1cmU6ew0KLQkJCQkJCWd1aUJ1aWxkZXIucmVidWlsZCggcGFyZW50OmNvbXAxLCBjbG9zdXJlOnsgDQotCQkJCQkJCWd1aUJ1aWxkZXIuY29tcG9zaXRlKCBpdCApIHsNCi0JCQkJCQkJCWZpbGxMYXlvdXQoKQ0KLQkJCQkJCQkJbGFiZWwoIHRleHQ6IlRoaXMgaXMgZnJlc2ggbmV3IHJlZCBsYWJlbCAuLi4iLCBiYWNrZ3JvdW5kOlsyNTUsIDAsIDBdICkNCi0JCQkJCQkJfQ0KLQkJCQkJCX0pDQotCQkJCQl9KQ0KLQkJCQl9CQkJCQ0KLQkJCQkJCQ0KLQkJCX0JCQkNCi0JCQ0KLQkJCWNvbXBvc2l0ZSgpIHsNCi0JCQkJDQotCQkJCWZpbGxMYXlvdXQoKSANCi0JCQkJDQotCQkJCWNvbXAxID0gY29tcG9zaXRlKCkgew0KLQkJCQkJZmlsbExheW91dCgpDQotCQkJCQlsYWJlbCggdGV4dDoiVGhpcyBpcyBncmVlbiBsYWJlbCIsIGJhY2tncm91bmQ6WzAsIDI1NSwgMF0gICkNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCQ0KLQkJbWFpbmFwcC5NZW51QmFyTWFuYWdlci51cGRhdGVBbGwodHJ1ZSkNCi0JCW1haW5hcHAub3BlbigpDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9ndWlidWlsZGVyL1J1bkd1aUJ1aWxkZXJEZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvUnVuR3VpQnVpbGRlckRlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxYTA1ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvUnVuR3VpQnVpbGRlckRlbW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5ndWlidWlsZGVyOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlTY3JpcHRFbmdpbmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUnVuR3VpQnVpbGRlckRlbW8gewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBiYXNlUGF0aCA9ICJzcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9ndWlidWlsZGVyIjsKLSAgICAgICAgR3Jvb3Z5U2NyaXB0RW5naW5lIHNjcmlwdEVuZ2luZSA9IG5ldyBHcm9vdnlTY3JpcHRFbmdpbmUoYmFzZVBhdGgpOwotCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uR3VpQnVpbGRlciBndWlCdWlsZGVyID0gbmV3IEFwcGxpY2F0aW9uR3VpQnVpbGRlcihiYXNlUGF0aCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoImd1aUJ1aWxkZXIiLCBndWlCdWlsZGVyKTsKLQotICAgICAgICBzY3JpcHRFbmdpbmUucnVuKCJHdWlCdWlsZGVyRGVtby5ncm9vdnkiLCBiaW5kaW5nKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvU2NyZWVuMS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvU2NyZWVuMS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZmJjNDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9ndWlidWlsZGVyL1NjcmVlbjEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0Lmd1aWJ1aWxkZXINCi0NCi1jbGFzcyBTY3JlZW4xIGV4dGVuZHMgU2NyaXB0IHsNCi0gICAgICAgIA0KLSAgICBydW4oKSB7ICAgICANCi0JCWd1aUJ1aWxkZXIuY29tcG9zaXRlIHsNCi0JCQlmaWxsTGF5b3V0KCkNCi0JCQkNCi0JCQlncm91cCggdGV4dDoiVGhpcyBpcyBTY3JlZW4xLmdyb292eSIgKSB7DQotCQkJCWdyaWRMYXlvdXQoKQ0KLQkJCQlidXR0b24oIHRleHQ6InRoZSBoYXJkZXN0IiwgYmFja2dyb3VuZDpbMCwgMjU1LCAyNTVdICkNCi0JCQkJYnV0dG9uKCB0ZXh0OiJidXR0b24iLCBiYWNrZ3JvdW5kOlswLCAyNTUsIDI1NV0gKQ0KLQkJCQlidXR0b24oIHRleHQ6InRvIGJ1dHRvbiIsIGJhY2tncm91bmQ6WzAsIDI1NSwgMjU1XSApDQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvU2NyZWVuMi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9leGFtcGxlcy9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvU2NyZWVuMi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjhlZmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3dC9ndWlidWlsZGVyL1NjcmVlbjIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0Lmd1aWJ1aWxkZXINCi0NCi1jbGFzcyBTY3JlZW4yIGV4dGVuZHMgU2NyaXB0IHsNCi0gICAgICAgIA0KLSAgICBydW4oKSB7DQotCQlndWlCdWlsZGVyLmNvbXBvc2l0ZSB7DQotCQkJZmlsbExheW91dCggdHlwZToidmVydGljYWwiKQ0KLQkJCWdyb3VwKCB0ZXh0OiJUaGlzIGlzIFNjcmVlbjIuZ3Jvb3Z5IiwgYmFja2dyb3VuZDpbMjU1LCAyNTUsIDI1NV0gKSB7DQotCQkJCWZpbGxMYXlvdXQoIHR5cGU6InZlcnRpY2FsIikNCi0JCSAJCWxhYmVsKCB0ZXh0OiJBIGJpZyByZWQgbGFiZWwiLCBiYWNrZ3JvdW5kOlsyMDQsIDAsIDBdICkgDQotCQkJCWxhYmVsKCB0ZXh0OiJJIGNhbiBiYXJlbGx5IHJlYWQgdGhpcyIsIGZvcmVncm91bmQ6WzAsMjAwLDBdICkgIA0KLQkJCQlsYWJlbCggdGV4dDoiSXQgc3VyZSBsb29rcyBsaWtlIHRoZSBkdXRjaCBmbGFnIiwgZm9yZWdyb3VuZDpbMCwwLDE1MF0sIGJhY2tncm91bmQ6WzAsIDAsIDE1M10gKQ0KLQkJCX0NCi0JCX0NCi0gICAgfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvSkZhY2VCdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9KRmFjZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDM5Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9KRmFjZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZTsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5mYWN0b3J5LkNvbnRyaWJ1dGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IGdyb292eS5qZmFjZS5mYWN0b3J5LkRvdWJsZUNsaWNrTGlzdGVuZXJGYWN0b3J5OwotaW1wb3J0IGdyb292eS5qZmFjZS5mYWN0b3J5Lk1lbnVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuamZhY2UuZmFjdG9yeS5QcmVmZXJlbmNlc0RpYWxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLmZhY3RvcnkuUHJlZmVyZW5jZXNGaWVsZEVkaXRvckZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLmZhY3RvcnkuUHJlZmVyZW5jZXNQYWdlRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuamZhY2UuZmFjdG9yeS5TZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJGYWN0b3J5OwotaW1wb3J0IGdyb292eS5qZmFjZS5mYWN0b3J5LlRvb2xCYXJNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuamZhY2UuZmFjdG9yeS5WaWV3ZXJGYWN0b3J5OwotaW1wb3J0IGdyb292eS5qZmFjZS5mYWN0b3J5LldpbmRvd0ZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLmZhY3RvcnkuV2l6YXJkRGlhbG9nRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuamZhY2UuZmFjdG9yeS5XaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuamZhY2UuaW1wbC5BY3Rpb25JbXBsOwotaW1wb3J0IGdyb292eS5qZmFjZS5pbXBsLkFwcGxpY2F0aW9uV2luZG93SW1wbDsKLWltcG9ydCBncm9vdnkuc3d0LlN3dEJ1aWxkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkltYWdlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Db2xvckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRGlyZWN0b3J5RmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWxlRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Gb250RmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZUJ1aWxkZXIgZXh0ZW5kcyBTd3RCdWlsZGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyV2lkZ2V0cygpIHsKLSAgICAgICAgc3VwZXIucmVnaXN0ZXJXaWRnZXRzKCk7Ci0KLSAgICAgICAgLy8gVmlld2VyCi0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidGFibGVWaWV3ZXIiLCBuZXcgVmlld2VyRmFjdG9yeShUYWJsZVZpZXdlci5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInRhYmxlVHJlZVZpZXdlciIsIG5ldyBWaWV3ZXJGYWN0b3J5KFRhYmxlVHJlZVZpZXdlci5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInRyZWVWaWV3ZXIiLCBuZXcgVmlld2VyRmFjdG9yeShUcmVlVmlld2VyLmNsYXNzKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiY2hlY2tib3hUcmVlVmlld2VyIiwgbmV3IFZpZXdlckZhY3RvcnkoQ2hlY2tib3hUcmVlVmlld2VyLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gRXZlbnQKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJkb3VibGVDbGlja0xpc3RlbmVyIiwgbmV3IERvdWJsZUNsaWNrTGlzdGVuZXJGYWN0b3J5KCkpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciIsIG5ldyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJGYWN0b3J5KCkpOwotCi0gICAgICAgIC8vIFdpbmRvdwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImFwcGxpY2F0aW9uV2luZG93IiwgbmV3IFdpbmRvd0ZhY3RvcnkoQXBwbGljYXRpb25XaW5kb3dJbXBsLmNsYXNzKSk7Ci0gICAgICAgIC8vICAgICAgICByZWdpc3RlckZhY3RvcnkoIndpbmRvdyIsIG5ldyBXaW5kb3dGYWN0b3J5KAotICAgICAgICAvLyAgICAgICAgICAgICAgICBXaW5kb3dJbXBsLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gQ29udHJpYnV0aW9uTWFuYWdlcgotICAgICAgICByZWdpc3RlckZhY3RvcnkoIm1lbnVNYW5hZ2VyIiwgbmV3IE1lbnVNYW5hZ2VyRmFjdG9yeSgpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0b29sQmFyTWFuYWdlciIsIG5ldyBUb29sQmFyTWFuYWdlckZhY3RvcnkoKSk7Ci0KLSAgICAgICAgLy8gQWN0aW9uIHRhZ3MKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJhY3Rpb24iLCBuZXcgQ29udHJpYnV0aW9uTWFuYWdlckZhY3RvcnkoQWN0aW9uSW1wbC5jbGFzcykpOwotCi0gICAgICAgIC8vIENvbnRyaWJ1dGlvbkl0ZW0KLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJzZXBhcmF0b3IiLCBuZXcgQ29udHJpYnV0aW9uTWFuYWdlckZhY3RvcnkoU2VwYXJhdG9yLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gV2l6YXJkCi0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgid2l6YXJkRGlhbG9nIiwgbmV3IFdpemFyZERpYWxvZ0ZhY3RvcnkoKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgid2l6YXJkUGFnZSIsIG5ldyBXaXphcmRQYWdlRmFjdG9yeSgpKTsKLQotICAgICAgICAvLyBQcmVmZXJlbmNlCi0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicHJlZmVyZW5jZURpYWxvZyIsIG5ldyBQcmVmZXJlbmNlc0RpYWxvZ0ZhY3RvcnkoKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicHJlZmVyZW5jZVBhZ2UiLCBuZXcgUHJlZmVyZW5jZXNQYWdlRmFjdG9yeSgpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJib29sZWFuRmllbGRFZGl0b3IiLCBuZXcgUHJlZmVyZW5jZXNGaWVsZEVkaXRvckZhY3RvcnkoCi0gICAgICAgICAgICAgICAgQm9vbGVhbkZpZWxkRWRpdG9yLmNsYXNzKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiY29sb3JGaWVsZEVkaXRvciIsIG5ldyBQcmVmZXJlbmNlc0ZpZWxkRWRpdG9yRmFjdG9yeSgKLSAgICAgICAgICAgICAgICBDb2xvckZpZWxkRWRpdG9yLmNsYXNzKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZGlyZWN0b3J5RmllbGRFZGl0b3IiLCBuZXcgUHJlZmVyZW5jZXNGaWVsZEVkaXRvckZhY3RvcnkoCi0gICAgICAgICAgICAgICAgRGlyZWN0b3J5RmllbGRFZGl0b3IuY2xhc3MpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmaWxlRmllbGRFZGl0b3IiLCBuZXcgUHJlZmVyZW5jZXNGaWVsZEVkaXRvckZhY3RvcnkoRmlsZUZpZWxkRWRpdG9yLmNsYXNzKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZm9udEZpZWxkRWRpdG9yIiwgbmV3IFByZWZlcmVuY2VzRmllbGRFZGl0b3JGYWN0b3J5KEZvbnRGaWVsZEVkaXRvci5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImludGVnZXJGaWVsZEVkaXRvciIsIG5ldyBQcmVmZXJlbmNlc0ZpZWxkRWRpdG9yRmFjdG9yeSgKLSAgICAgICAgICAgICAgICBJbnRlZ2VyRmllbGRFZGl0b3IuY2xhc3MpKTsKLSAgICAgICAgLy9yZWdpc3RlckJlYW5GYWN0b3J5KCJyYWRpb0dyb3VwRmllbGRFZGl0b3IiLAotICAgICAgICAvLyBSYWRpb0dyb3VwRmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICAvL3JlZ2lzdGVyQmVhbkZhY3RvcnkoInN0cmluZ0J1dHRvbkZpZWxkRWRpdG9yIiwKLSAgICAgICAgLy8gU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInN0cmluZ0ZpZWxkRWRpdG9yIiwgbmV3IFByZWZlcmVuY2VzRmllbGRFZGl0b3JGYWN0b3J5KAotICAgICAgICAgICAgICAgIFN0cmluZ0ZpZWxkRWRpdG9yLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gb3RoZXIKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJpbWFnZSIsIG5ldyBJbWFnZUZhY3RvcnkoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvQWN0aW9uSW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9BY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjYwNGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9BY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjgsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5zd3QuQ2xvc3VyZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uSW1wbCBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIENsb3N1cmVTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgQ2xvc3VyZSBjbG9zdXJlOwotCi0gICAgcHJpdmF0ZSBFdmVudCBldmVudDsKLQotICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLQotICAgICAgICBjbG9zdXJlLmNhbGwoZXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gICAgfQotCi0gICAgcHVibGljIEV2ZW50IGdldEV2ZW50KCkgewotICAgICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvQ29udHJpYnV0aW9uTWFuYWdlckZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvQ29udHJpYnV0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzYzczYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L0NvbnRyaWJ1dGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIGdyb292eS5qZmFjZS5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LldpZGdldEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRpb25NYW5hZ2VyRmFjdG9yeSBleHRlbmRzIFdpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBDb250cmlidXRpb25NYW5hZ2VyRmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIoYmVhbkNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5pbXBsLlN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBjcmVhdGVXaWRnZXQocGFyZW50KTsKLQotICAgICAgICBzZXRCZWFuUHJvcGVydGllcyhiZWFuLCBwcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbk1hbmFnZXIpIHsKLSAgICAgICAgICAgIElDb250cmlidXRpb25NYW5hZ2VyIGNvbnRyaWJ1dGlvbk1hbmFnZXIgPSAoSUNvbnRyaWJ1dGlvbk1hbmFnZXIpIHBhcmVudDsKLQotICAgICAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBJQWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY29udHJpYnV0aW9uTWFuYWdlci5hZGQoKElBY3Rpb24pIGJlYW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIElDb250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICAgICAgY29udHJpYnV0aW9uTWFuYWdlci5hZGQoKElDb250cmlidXRpb25JdGVtKSBiZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9Eb3VibGVDbGlja0xpc3RlbmVyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9Eb3VibGVDbGlja0xpc3RlbmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI0MTg4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvRG91YmxlQ2xpY2tMaXN0ZW5lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNSwgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuamZhY2UuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydDsKLWltcG9ydCBncm9vdnkuc3d0LkludmFsaWRQYXJlbnRFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuU3d0RmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3VibGVDbGlja0xpc3RlbmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U3d0RmFjdG9yeSBpbXBsZW1lbnRzIFN3dEZhY3RvcnksCi0gICAgICAgIElEb3VibGVDbGlja0xpc3RlbmVyLCBDbG9zdXJlU3VwcG9ydCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmU7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLSAgICAgICAgICAgIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHBhcmVudDsKLSAgICAgICAgICAgIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oInN0cnVjdHVyZWRWaWV3ZXIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydCNnZXRDbG9zdXJlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydCNzZXRDbG9zdXJlKGdyb292eS5sYW5nLkNsb3N1cmUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZShDbG9zdXJlIGNsb3N1cmUpIHsKLSAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lciNkb3VibGVDbGljayhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBjbG9zdXJlLmNhbGwoZXZlbnQpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L01lbnVNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9NZW51TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlMjk1OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L01lbnVNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuQWJzdHJhY3RTd3RGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Td3RGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW51TWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmltcGwuU3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KQotICAgIHRocm93cyBHcm9vdnlFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgidGV4dCIpOwotICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJ0ZXh0IiwgCi0gICAgICAgICAgICBTdHJpbmcuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcih0ZXh0KTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93KSB7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbldpbmRvdyB3aW5kb3cgPSAoQXBwbGljYXRpb25XaW5kb3cpIHBhcmVudDsKLSAgICAgICAgICAgIGlmICh3aW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRNZW51QmFyTWFuYWdlcigpLmFkZChtZW51TWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtZW51TWFuYWdlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1ByZWZlcmVuY2VzRGlhbG9nRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9QcmVmZXJlbmNlc0RpYWxvZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NjRiNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1ByZWZlcmVuY2VzRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5pbXBsLlByZWZlcmVuY2VEaWFsb2dJbXBsOwotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0RpYWxvZ0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cwotICAgICAgICBTd3RGYWN0b3J5IHsKLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmltcGwuU3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNoZWxsIHBhcmVudFNoZWxsID0gU3d0VXRpbHMuZ2V0UGFyZW50U2hlbGwocGFyZW50KTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBwbSA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVmZXJlbmNlRGlhbG9nSW1wbChwYXJlbnRTaGVsbCwgcG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oImFwcGxpY2F0aW9uV2luZG93IG9yIHNoZWxsIik7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9QcmVmZXJlbmNlc0ZpZWxkRWRpdG9yRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9QcmVmZXJlbmNlc0ZpZWxkRWRpdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzM0MjljLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvUHJlZmVyZW5jZXNGaWVsZEVkaXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkuamZhY2UuaW1wbC5QcmVmZXJlbmNlUGFnZUZpZWxkRWRpdG9ySW1wbDsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5JbnZhbGlkUGFyZW50RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzRmllbGRFZGl0b3JGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMKLSAgICAgICAgU3d0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIENsYXNzIGJlYW5DbGFzczsKLQotICAgIHB1YmxpYyBQcmVmZXJlbmNlc0ZpZWxkRWRpdG9yRmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkKLSAgICAgICAgICAgIHRocm93cyBHcm9vdnlFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChiZWFuQ2xhc3MgPT0gbnVsbCkgeyB0aHJvdyBuZXcgR3Jvb3Z5RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJObyBDbGFzcyBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZSBGaWVsZEVkaXRvciIpOyB9Ci0KLSAgICAgICAgLy8gY2hlY2sgbG9jYXRpb24KLSAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgUHJlZmVyZW5jZVBhZ2UpKSB7IHRocm93IG5ldyBJbnZhbGlkUGFyZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJwcmVmZXJlbmNlUGFnZSIpOyB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldCgicHJvcGVydHlOYW1lIik7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigicHJvcGVydHlOYW1lIiwKLSAgICAgICAgICAgICAgICBGaWVsZEVkaXRvci5jbGFzcyk7IH0KLQotICAgICAgICBTdHJpbmcgbGFiZWxUZXh0ID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoInRpdGxlIik7Ci0gICAgICAgIGlmIChsYWJlbFRleHQgPT0gbnVsbCkgeyB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJ0aXRsZSIsCi0gICAgICAgICAgICAgICAgRmllbGRFZGl0b3IuY2xhc3MpOyB9Ci0KLSAgICAgICAgUHJlZmVyZW5jZVBhZ2VGaWVsZEVkaXRvckltcGwgcHJlZmVyZW5jZVBhZ2VJbXBsID0gKFByZWZlcmVuY2VQYWdlRmllbGRFZGl0b3JJbXBsKSBwYXJlbnQ7Ci0gICAgICAgIHByZWZlcmVuY2VQYWdlSW1wbC5hZGRGaWVsZENyZWF0b3IoYmVhbkNsYXNzLCBuYW1lLCBsYWJlbFRleHQpOwotCi0gICAgICAgIHJldHVybiBwcmVmZXJlbmNlUGFnZUltcGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1ByZWZlcmVuY2VzUGFnZUZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvUHJlZmVyZW5jZXNQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRjZjZmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvUHJlZmVyZW5jZXNQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5pbXBsLlByZWZlcmVuY2VEaWFsb2dJbXBsOwotaW1wb3J0IGdyb292eS5qZmFjZS5pbXBsLlByZWZlcmVuY2VQYWdlRmllbGRFZGl0b3JJbXBsOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LkludmFsaWRQYXJlbnRFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuU3d0RmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzUGFnZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cwotICAgICAgICBTd3RGYWN0b3J5IHsKLQotICAgIC8qKiBUaGUgTG9nIHRvIHdoaWNoIGxvZ2dpbmcgY2FsbHMgd2lsbCBiZSBtYWRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5Ci0gICAgICAgICAgICAuZ2V0TG9nKFByZWZlcmVuY2VzUGFnZUZhY3RvcnkuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuaW1wbC5Td3RGYWN0b3J5I25ld0luc3RhbmNlKGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkKLSAgICAgICAgICAgIHRocm93cyBHcm9vdnlFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGNoZWNrIGxvY2F0aW9uCi0gICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIFByZWZlcmVuY2VEaWFsb2cpKSB7IHRocm93IG5ldyBJbnZhbGlkUGFyZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJwcmVmZXJlbmNlRGlhbG9nIik7IH0KLQotICAgICAgICBQcmVmZXJlbmNlRGlhbG9nSW1wbCBwcmVmZXJlbmNlRGlhbG9nSW1wbCA9IChQcmVmZXJlbmNlRGlhbG9nSW1wbCkgcGFyZW50OwotCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKCJmaWxlbmFtZSIpOwotICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJmaWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgUHJlZmVyZW5jZVBhZ2UuY2xhc3MpOyB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gKFN0cmluZykgcHJvcGVydGllcy5yZW1vdmUoInRpdGxlIik7Ci0gICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7IHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oInRpdGxlIiwKLSAgICAgICAgICAgICAgICBQcmVmZXJlbmNlUGFnZS5jbGFzcyk7IH0KLQotICAgICAgICAvLyBidWlsZCBuZXcgUHJlZmVyZW5jZU5vZGUgd2l0aCBzYW1lIHRpdGxlIGFzIHRoZSBQcmVmZXJlbmNlUGFnZQotICAgICAgICBQcmVmZXJlbmNlTm9kZSBub2RlID0gbmV3IFByZWZlcmVuY2VOb2RlKHRpdGxlKTsKLQotICAgICAgICAvLyBidWlsZCBuZXcgUHJlZmVyZW5jZVBhZ2UKLSAgICAgICAgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IFByZWZlcmVuY2VQYWdlRmllbGRFZGl0b3JJbXBsKAotICAgICAgICAgICAgICAgIHRpdGxlKTsKLSAgICAgICAgUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmUoZmlsZW5hbWUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZWZlcmVuY2VTdG9yZS5sb2FkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgfQotICAgICAgICBwYWdlLnNldFByZWZlcmVuY2VTdG9yZShwcmVmZXJlbmNlU3RvcmUpOwotCi0gICAgICAgIC8vIGFkZCBub2RlIHRvIFByZWZlcmVuY2VNYW5hZ2VyCi0gICAgICAgIG5vZGUuc2V0UGFnZShwYWdlKTsKLSAgICAgICAgcHJlZmVyZW5jZURpYWxvZ0ltcGwuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5hZGRUb1Jvb3Qobm9kZSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1NlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFmMmJmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDI1LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZS5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuQWJzdHJhY3RTd3RGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Td3RGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBOT1RFOglJIGhhdmUgc2VlbiBzdHJuYWdlIGJlaGF2aW9yIGluIGNvbWJpbmF0aW9uIHdpdGggYSBDZWxsTW9kaWZpZXIKLSAqIAkJCUluIHRoaXMgY2FzZSBqdXN0IHVzZSBhbiBvbkV2ZW50IFNlbGVjdGlvbi4gIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5Ci0gICAgICAgIGltcGxlbWVudHMgU3d0RmFjdG9yeSwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgQ2xvc3VyZVN1cHBvcnQgewotCi0gICAgcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmU7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVmlld2VyKSB7Ci0gICAgICAgICAgICBWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgcGFyZW50OwotICAgICAgICAgICAgdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyZW50RXhjZXB0aW9uKCJ2aWV3ZXIiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoaXM7IAotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBjbG9zdXJlLmNhbGwoZXZlbnQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I2dldENsb3N1cmUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I3NldENsb3N1cmUoZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9Ub29sQmFyTWFuYWdlckZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvVG9vbEJhck1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNGVmMjguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9Ub29sQmFyTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkuc3d0LkludmFsaWRQYXJlbnRFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuU3d0RmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sQmFyTWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmltcGwuU3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZvcm0pIHsKLSAgICAgICAgICAgIEZvcm0gZm9ybSA9IChGb3JtKSBwYXJlbnQ7Ci0gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIgPSAoVG9vbEJhck1hbmFnZXIpIGZvcm0uZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbldpbmRvdykgewotICAgICAgICAgICAgQXBwbGljYXRpb25XaW5kb3cgYXBwbGljYXRpb25XaW5kb3cgPSAoQXBwbGljYXRpb25XaW5kb3cpIHBhcmVudDsKLSAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbldpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIgPSAoVG9vbEJhck1hbmFnZXIpIGFwcGxpY2F0aW9uV2luZG93LmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodG9vbEJhck1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oIjxmb3JtPiBvciA8YXBwbGljYXRpb25XaW5kb3c+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9vbEJhck1hbmFnZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvVmlld2VyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9WaWV3ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmY5YTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9WaWV3ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjgsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Td3RGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5XaWRnZXRGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRmFjdG9yeSBleHRlbmRzIFdpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVmlld2VyRmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihiZWFuQ2xhc3MsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhc3MxCi0gICAgICovCi0gICAgcHVibGljIFZpZXdlckZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKGJlYW5DbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBiZWFuOwotCi0gICAgICAgIFN0cmluZyBzdHlsZVByb3BlcnR5ID0gKFN0cmluZykgcHJvcGVydGllcy5yZW1vdmUoInN0eWxlIik7Ci0gICAgICAgIGlmIChzdHlsZVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0eWxlID0gU3d0VXRpbHMucGFyc2VTdHlsZShTV1QuY2xhc3MsIHN0eWxlUHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlYW5DbGFzcy5lcXVhbHMoVGFibGVWaWV3ZXIuY2xhc3MpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZSkpIHsKLSAgICAgICAgICAgIGJlYW4gPSBuZXcgVGFibGVWaWV3ZXIoKFRhYmxlKSBwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKGJlYW5DbGFzcy5lcXVhbHMoVGFibGVUcmVlVmlld2VyLmNsYXNzKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVUcmVlKSkgewotICAgICAgICAgICAgYmVhbiA9IG5ldyBUYWJsZVRyZWVWaWV3ZXIoKFRhYmxlVHJlZSkgcGFyZW50LCBzdHlsZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChiZWFuQ2xhc3MuZXF1YWxzKFRyZWVWaWV3ZXIuY2xhc3MpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBUcmVlKSkgewotICAgICAgICAgICAgYmVhbiA9IG5ldyBUcmVlVmlld2VyKChUcmVlKSBwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKGJlYW5DbGFzcy5lcXVhbHMoQ2hlY2tib3hUcmVlVmlld2VyLmNsYXNzKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVHJlZSkpIHsKLSAgICAgICAgICAgIGJlYW4gPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKChUcmVlKSBwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT2JqZWN0IHBhcmVudFdpZGdldCA9IFN3dFV0aWxzLmdldFBhcmVudFdpZGdldChwYXJlbnQsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgYmVhbiA9IGNyZWF0ZVdpZGdldChwYXJlbnRXaWRnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoYmVhbiwgcHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGJlYW4sIHBhcmVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ZhY3RvcnkvV2luZG93RmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9XaW5kb3dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmQ0NWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9XaW5kb3dGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjgsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkuc3d0LkludmFsaWRQYXJlbnRFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5jb252ZXJ0b3IuUG9pbnRDb252ZXJ0ZXI7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LldpZGdldEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFdpbmRvd0ZhY3RvcnkgZXh0ZW5kcyBXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICovCi0gICAgcHVibGljIFdpbmRvd0ZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKGJlYW5DbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCl7Ci0gICAgICAgICAgICBwYXJlbnQgPSBuZXcgU2hlbGwoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBTaGVsbCkpewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oInNoZWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFdpbmRvdyB3aW5kb3cgPSAoV2luZG93KSBjcmVhdGVXaWRnZXQocGFyZW50KTsKLSAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKXsKLSAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gKFNoZWxsKSBwYXJlbnQ7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aXRsZSBvZiBXaW5kb3cKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKCJ0aXRsZSIpOwotICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpewotICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLnNldFRleHQoKFN0cmluZykgdGl0bGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgc2l6ZSBvZiBXaW5kb3cKLSAgICAgICAgICAgIExpc3Qgc2l6ZSA9IChMaXN0KSBwcm9wZXJ0aWVzLnJlbW92ZSgic2l6ZSIpOwotICAgICAgICAgICAgaWYgKHNpemUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgUG9pbnQgcG9pbnQgPSBQb2ludENvbnZlcnRlci5nZXRJbnN0YW5jZSgpLnBhcnNlKHNpemUpOwotICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLnNldFNpemUocG9pbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgbG9jYXRpb24gb2YgV2luZG93Ci0gICAgICAgICAgICBMaXN0IGxvY2F0aW9uID0gKExpc3QpIHByb3BlcnRpZXMucmVtb3ZlKCJsb2NhdGlvbiIpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpewotICAgICAgICAgICAgICAgIFBvaW50IHBvaW50ID0gUG9pbnRDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKS5wYXJzZShsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgd2luZG93LmdldFNoZWxsKCkuc2V0TG9jYXRpb24ocG9pbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldEJlYW5Qcm9wZXJ0aWVzKHdpbmRvdywgcHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiB3aW5kb3c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9XaXphcmREaWFsb2dGYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1dpemFyZERpYWxvZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ZmVmOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1dpemFyZERpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMCwgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuamZhY2UuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5pbXBsLldpemFyZERpYWxvZ0ltcGw7Ci1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLmltcGwuV2l6YXJkSW1wbDsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZERpYWxvZ0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmZhY3RvcnkuU3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgU2hlbGwgcGFyZW50U2hlbGwgPSBTd3RVdGlscy5nZXRQYXJlbnRTaGVsbChwYXJlbnQpOwotICAgICAgICBXaXphcmQgd2l6YXJkID0gbmV3IFdpemFyZEltcGwoKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2dJbXBsKHBhcmVudFNoZWxsLCB3aXphcmQpOwotICAgICAgICByZXR1cm4gd2l6YXJkRGlhbG9nOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1dpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9mYWN0b3J5L1dpemFyZFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Njk0Y2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvZmFjdG9yeS9XaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIwLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZS5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLmltcGwuV2l6YXJkRGlhbG9nSW1wbDsKLWltcG9ydCBncm9vdnkuamZhY2UuaW1wbC5XaXphcmRQYWdlSW1wbDsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5JbnZhbGlkUGFyZW50RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZFBhZ2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkKLSAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBjaGVjayBsb2NhdGlvbgotICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBXaXphcmREaWFsb2cpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmVudEV4Y2VwdGlvbigid2l6YXJkRGlhbG9nIik7Ci0gICAgICAgIH0KLSAgICAgICAgV2l6YXJkRGlhbG9nSW1wbCB3aXphcmREaWFsb2cgPSAoV2l6YXJkRGlhbG9nSW1wbCkgcGFyZW50OwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBtaXNzaW5nIGF0dHJpYnV0ZXMKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoInRpdGxlIik7Ci0gICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJ0aXRsZSIsIAotICAgICAgICAgICAgV2l6YXJkUGFnZS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgV2l6YXJkUGFnZUltcGwKLSAgICAgICAgV2l6YXJkUGFnZUltcGwgcGFnZSA9IG5ldyBXaXphcmRQYWdlSW1wbCh0aXRsZSk7Ci0gICAgICAgIHNldEJlYW5Qcm9wZXJ0aWVzKHBhZ2UsIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIGdldCBXaXphcmQKLSAgICAgICAgV2l6YXJkRGlhbG9nSW1wbCBkaWFsb2cgPSAoV2l6YXJkRGlhbG9nSW1wbCkgcGFyZW50OwotICAgICAgICBXaXphcmQgd2l6YXJkID0gKFdpemFyZCkgZGlhbG9nLmdldFdpemFyZCgpOwotCi0gICAgICAgIC8vIGFkZCBXaXphcmRQYWdlIHRvIHRoZSBXaXphcmQKLSAgICAgICAgd2l6YXJkLmFkZFBhZ2UocGFnZSk7Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvQWN0aW9uSW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9BY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNWM4YTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9BY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjgsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmltcGw7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5zd3QuQ2xvc3VyZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uSW1wbCBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIENsb3N1cmVTdXBwb3J0IHsKLSAgICBwcml2YXRlIENsb3N1cmUgY2xvc3VyZTsKLSAgICBwcml2YXRlIEV2ZW50IGV2ZW50OwotCi0gICAgcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJObyBjbG9zdXJlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgTGlzdGVuZXIiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgIGNsb3N1cmUuY2FsbCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLQotICAgIHB1YmxpYyBFdmVudCBnZXRFdmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvQXBwbGljYXRpb25XaW5kb3dJbXBsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL0FwcGxpY2F0aW9uV2luZG93SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNkYzRhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvQXBwbGljYXRpb25XaW5kb3dJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5qZmFjZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBBcHBsaWNhdGlvbldpbmRvdwotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uV2luZG93SW1wbCBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93IHsKLQotCS8qKgotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbldpbmRvd0ltcGwoU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIobnVsbCk7Ci0KLQkJLy8gZGVmYXVsdCBhdCBhbGwKLQkJYWRkTWVudUJhcigpOwotCQlhZGRTdGF0dXNMaW5lKCk7Ci0JCWFkZFRvb2xCYXIoU1dULkZMQVQgfCBTV1QuV1JBUCk7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCS8vIGNyZWF0ZSB3aW5kb3cKLQkJY3JlYXRlKCk7Ci0JfQotCi0JLyoKLQkgKiBvdmVycmlkZSB0byBtYWtlIHB1YmxpYwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNnZXRDb250ZW50cygpCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udGVudHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50cygpOwotCX0KLQotCS8qCi0JICogb3ZlcnJpZGUgdG8gbWFrZSBwdWJsaWMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdyNnZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JICovCi0JcHVibGljIFN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1ByZWZlcmVuY2VEaWFsb2dJbXBsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1ByZWZlcmVuY2VEaWFsb2dJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NmU3Y2YuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9QcmVmZXJlbmNlRGlhbG9nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIwLCAyMDA0Ci0gKiAgCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LmpmYWNlLmltcGw7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5zd3QuQ2xvc3VyZVN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlRGlhbG9nSW1wbCBleHRlbmRzIFByZWZlcmVuY2VEaWFsb2cgaW1wbGVtZW50cwotICAgICAgICBDbG9zdXJlU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIENsb3N1cmUgY2xvc3VyZTsKLQotICAgIHB1YmxpYyBQcmVmZXJlbmNlRGlhbG9nSW1wbChTaGVsbCBzaGVsbCwgUHJlZmVyZW5jZU1hbmFnZXIgcG0pIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIHBtKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlKCkgewotICAgICAgICBzdXBlci5oYW5kbGVTYXZlKCk7Ci0gICAgICAgIGNsb3N1cmUuY2FsbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I2dldENsb3N1cmUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I3NldENsb3N1cmUoZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1ByZWZlcmVuY2VQYWdlRmllbGRFZGl0b3JJbXBsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1ByZWZlcmVuY2VQYWdlRmllbGRFZGl0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDM1ODguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9QcmVmZXJlbmNlUGFnZUZpZWxkRWRpdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIwLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZS5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVBhZ2VGaWVsZEVkaXRvckltcGwgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIHsKLQotICAgIHB1YmxpYyBjbGFzcyBGaWVsZEVkaXRvckNyZWF0b3IgewotCi0gICAgICAgIHByaXZhdGUgQ2xhc3MgYmVhbkNsYXNzOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotICAgICAgICBwdWJsaWMgRmllbGRFZGl0b3JDcmVhdG9yKENsYXNzIGJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIHRoaXMuYmVhbkNsYXNzID0gYmVhbkNsYXNzOwotICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmllbGRFZGl0b3IgY3JlYXRlRmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0gICAgICAgICAgICBGaWVsZEVkaXRvciBmaWVsZEVkaXRvciA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIENvbXBvc2l0ZS5jbGFzc307Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBiZWFuQ2xhc3MuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IHsgcHJvcGVydHlOYW1lLCB0aXRsZSwgcGFyZW50fTsKLSAgICAgICAgICAgICAgICAgICAgZmllbGRFZGl0b3IgPSAoRmllbGRFZGl0b3IpIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZpZWxkRWRpdG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGNyZWF0b3JGaWVsZHNmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgUHJlZmVyZW5jZVBhZ2VGaWVsZEVkaXRvckltcGwoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHN1cGVyKHRpdGxlLCBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlLkdSSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZpZWxkQ3JlYXRvcihDbGFzcyBiZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgY3JlYXRvckZpZWxkc2ZpZWxkcy5hZGQobmV3IEZpZWxkRWRpdG9yQ3JlYXRvcihiZWFuQ2xhc3MsIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICB0aXRsZSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGNyZWF0b3JGaWVsZHNmaWVsZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBGaWVsZEVkaXRvckNyZWF0b3IgY3JlYXRvciA9IChGaWVsZEVkaXRvckNyZWF0b3IpIGkubmV4dCgpOwotICAgICAgICAgICAgRmllbGRFZGl0b3IgZmllbGRFZGl0b3IgPSBjcmVhdG9yCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVGaWVsZChnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLSAgICAgICAgICAgIGFkZEZpZWxkKGZpZWxkRWRpdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9XaXphcmREaWFsb2dJbXBsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1dpemFyZERpYWxvZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3OGY5Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1dpemFyZERpYWxvZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMCwgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuamZhY2UuaW1wbDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvdmlkZSBhIHB1YmxpYyBtZXRob2QgZ2V0V2l6YXJkIGFuZCBwcm92aWRlIGFjY2VzcyB0byBwYXJlbnRTaGVsbAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmREaWFsb2dJbXBsIGV4dGVuZHMgV2l6YXJkRGlhbG9nIGltcGxlbWVudHMgQ2xvc3VyZVN1cHBvcnQgewotICAgIHByaXZhdGUgQ2xvc3VyZSBjbG9zdXJlOwotICAgIHByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7Ci0KLSAgICBwdWJsaWMgV2l6YXJkRGlhbG9nSW1wbChTaGVsbCBwYXJlbnRTaGVsbCwgSVdpemFyZCBuZXdXaXphcmQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIG5ld1dpemFyZCk7Ci0gICAgICAgIHRoaXMucGFyZW50U2hlbGwgPSBwYXJlbnRTaGVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVdpemFyZCBnZXRXaXphcmQoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXaXphcmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2hlbGwgZ2V0UGFyZW50U2hlbGwoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRTaGVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydCNnZXRDbG9zdXJlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydCNzZXRDbG9zdXJlKGdyb292eS5sYW5nLkNsb3N1cmUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZShDbG9zdXJlIGNsb3N1cmUpIHsKLSAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9qZmFjZS9pbXBsL1dpemFyZEltcGwuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvV2l6YXJkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGFjMWY4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvV2l6YXJkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIwLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZS5pbXBsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLQotLyoqCi0gKiBQcm92aWRlcyBhIFdpemFyZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRJbXBsIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgQ2xvc3VyZVN1cHBvcnR7Ci0gICAgcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmU7Ci0gICAgcHVibGljIFdpemFyZEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIFRPRE8gaW1wbGVtZW50cyB0aGlzCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBlcmZvcm1DYW5jZWwgLi4uIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIFRPRE8gaW1wbGVtZW50cyB0aGlzCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBlcmZvcm1GaW5pc2ggLi4uIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I2dldENsb3N1cmUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0I3NldENsb3N1cmUoZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9XaXphcmRQYWdlSW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvamZhY2UvaW1wbC9XaXphcmRQYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJlODZlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L2pmYWNlL2ltcGwvV2l6YXJkUGFnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuamZhY2UuaW1wbDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIFdpemFyZFBhZ2UgbWV0aG9kIGNyZWF0ZUNvbnRyb2wgaXMgY2FsbGVkIG9uCi0gKiBEaWFsb2cub3BlbigpCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZFBhZ2VJbXBsIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIENsb3N1cmVTdXBwb3J0IHsKLSAgICBwcml2YXRlIENsb3N1cmUgY2xvc3VyZTsKLQotICAgIHB1YmxpYyBXaXphcmRQYWdlSW1wbChTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgc3VwZXIodGl0bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiTm8gY2xvc3VyZSBoYXMgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIFdpemFyZFBhZ2UiKTsKLSAgICAgICAgfQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgY2xvc3VyZS5jYWxsKHBhcmVudCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgewotICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9DbG9zdXJlU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L0Nsb3N1cmVTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDg4NTYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L0Nsb3N1cmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTYsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xvc3VyZVN1cHBvcnQgewotICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlKTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9DdXN0b21Td2luZ0J1aWxkZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9DdXN0b21Td2luZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiNjYzZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvQ3VzdG9tU3dpbmdCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMTUsIDIwMDQKLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPiAKLSAqICRJZCQKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0OwotCi1pbXBvcnQgZ3Jvb3Z5LnN3aW5nLlN3aW5nQnVpbGRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNrbAotICoKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbVN3aW5nQnVpbGRlciBleHRlbmRzIFN3aW5nQnVpbGRlciB7Ci0KLSAgICAvKiAKLSAgICAgKiBvdmVycmlkZSB0byBtYWtlIHB1YmxpYwotICAgICAqIAotICAgICAqIEBzZWUgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQjZ2V0Q3VycmVudCgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRDdXJyZW50KCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q3VycmVudCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogb3ZlcnJpZGUgdG8gbWFrZSBwdWJsaWMKLSAgICAgKiAgCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNzZXRDdXJyZW50KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudChPYmplY3QgY3VycmVudCkgewotICAgICAgICBzdXBlci5zZXRDdXJyZW50KGN1cnJlbnQpOwotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvSW52YWxpZENoaWxkRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvSW52YWxpZENoaWxkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTNiNzYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L0ludmFsaWRDaGlsZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE2LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkQ2hpbGRFeGNlcHRpb24gZXh0ZW5kcyBHcm9vdnlFeGNlcHRpb24gewotCi0gICAgcHVibGljIEludmFsaWRDaGlsZEV4Y2VwdGlvbihTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGQpIHsKLSAgICAgICAgc3VwZXIoImZpcnN0IGNoaWxkIG9mICIgKyBwYXJlbnQgKyAiIHNob3VsZCBiZSAiICsgY2hpbGQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L0ludmFsaWRQYXJlbnRFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9JbnZhbGlkUGFyZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzk2OTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L0ludmFsaWRQYXJlbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNiwgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhcmVudEV4Y2VwdGlvbiBleHRlbmRzIEdyb292eUV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBJbnZhbGlkUGFyZW50RXhjZXB0aW9uKFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICBzdXBlcigicGFyZW50IHNob3VsZCBiZTogIiArIHByb3BlcnR5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvU3d0QnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L1N3dEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwZjUzMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvU3d0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Bd3RTd3RGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Gb250ZmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuRm9ybUZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkZvcm1MYXlvdXREYXRhRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuSW1hZ2VGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5MYXlvdXREYXRhRmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuTGF5b3V0RmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuTGlzdGVuZXJGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5Td3RGYWN0b3J5OwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5UcmF5RmFjdG9yeTsKLWltcG9ydCBncm9vdnkuc3d0LmZhY3RvcnkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0Jhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmF5SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JRXhwYW5zaW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkNvbHVtbkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIFN3dEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIE1hcCBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICBwdWJsaWMgU3d0QnVpbGRlcigpIHsKLSAgICAgICAgcmVnaXN0ZXJXaWRnZXRzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0I2NyZWF0ZU5vZGUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUobmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBAc2VlIGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0I2NyZWF0ZU5vZGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0I2NyZWF0ZU5vZGUoamF2YS5sYW5nLk9iamVjdCwKLSAgICAgKiAgICAgIGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgewotCi0gICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSBhdHRyaWJ1dGVzLmdldCgiY2xvc3VyZSIpOwotCi0gICAgICAgIE9iamVjdCB3aWRnZXQgPSBjcmVhdGVXaWRnZXQobmFtZSwgYXR0cmlidXRlcywgZ2V0Q3VycmVudCgpKTsKLQotICAgICAgICBpZiAod2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDbG9zdXJlU3VwcG9ydCkgewotICAgICAgICAgICAgICAgIGlmIChjbG9zdXJlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZVN1cHBvcnQgY2xvc3VyZVN1cHBvcnQgPSAoQ2xvc3VyZVN1cHBvcnQpIHdpZGdldDsKLSAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVN1cHBvcnQuc2V0Q2xvc3VyZShjbG9zdXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd2lkZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXaWRnZXQoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgY3VycmVudCkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHMoImRvQ2FsbCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB3aWRnZXQgPSBudWxsOwotICAgICAgICBTd3RGYWN0b3J5IGZhY3RvcnkgPSAoU3d0RmFjdG9yeSkgZmFjdG9yaWVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aWRnZXQgPSBmYWN0b3J5Lm5ld0luc3RhbmNlKGF0dHJpYnV0ZXMsIGN1cnJlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLldBUk5JTkcsICJOb2RlICIgKyBuYW1lICsgIiByZXR1cm5lZCA6ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgbWF0Y2ggZm9yIG5hbWU6ICIgKyBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2lkZ2V0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNjcmVhdGVOb2RlKGphdmEubGFuZy5PYmplY3QsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHBhcmVudCkgewotICAgICAgICByZXR1cm4gY3JlYXRlV2lkZ2V0KG5hbWUsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgcGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJlYW5GYWN0b3J5KFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KG5hbWUsIG5ldyBXaWRnZXRGYWN0b3J5KGJlYW5DbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQmVhbkZhY3RvcnkoU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzIGJlYW5DbGFzcywgZmluYWwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeShuYW1lLCBuZXcgV2lkZ2V0RmFjdG9yeShiZWFuQ2xhc3MsIHN0eWxlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJGYWN0b3J5KFN0cmluZyBuYW1lLCBTd3RGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgZmFjdG9yaWVzLnB1dChuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpZGdldHMoKSB7Ci0KLSAgICAgICAgLy8gd2lkZ2V0cwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImF3dEZyYW1lIiwgbmV3IEF3dFN3dEZhY3RvcnkoKSk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImJ1dHRvbiIsIEJ1dHRvbi5jbGFzcywgU1dULkJPUkRFUiB8IFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNhbnZhcyIsIENhbnZhcy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNhcmV0IiwgQ2FyZXQuY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJjb21ibyIsIENvbWJvLmNsYXNzLCBTV1QuRFJPUF9ET1dOKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiY29tcG9zaXRlIiwgQ29tcG9zaXRlLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2Nyb2xsZWRDb21wb3NpdGUiLCBTY3JvbGxlZENvbXBvc2l0ZS5jbGFzcywgU1dULkhfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJjb29sQmFyIiwgQ29vbEJhci5jbGFzcywgU1dULlZFUlRJQ0FMKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiY29vbEl0ZW0iLCBDb29sSXRlbS5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImRlY29yYXRpb25zIiwgRGVjb3JhdGlvbnMuY2xhc3MpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvbnQiLCBuZXcgRm9udGZhY3RvcnkoKSk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImdyb3VwIiwgR3JvdXAuY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJsYWJlbCIsIExhYmVsLmNsYXNzLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TSEFET1dfSU4pOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJsaXN0IiwgTGlzdC5jbGFzcyk7Ci0JCXJlZ2lzdGVyQmVhbkZhY3RvcnkoImxpbmsiLCBMaW5rLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgibWVudSIsIE1lbnUuY2xhc3MsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgLy8gICAgICAgIHJlZ2lzdGVyTWVudVRhZygibWVudUJhciIsIFNXVC5CQVIpOwotCi0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoIm1lbnVTZXBhcmF0b3IiLCBNZW51SXRlbS5jbGFzcywgU1dULlNFUEFSQVRPUik7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoIm1lbnVJdGVtIiwgTWVudUl0ZW0uY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJtZXNzYWdlQm94IiwgTWVzc2FnZUJveC5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInByb2dyZXNzQmFyIiwgUHJvZ3Jlc3NCYXIuY2xhc3MsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2FzaCIsIFNhc2guY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJzY2FsZSIsIFNjYWxlLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2hlbGwiLCBTaGVsbC5jbGFzcywgU1dULkJPUkRFUiB8IFNXVC5DTE9TRSB8IFNXVC5NSU4gfCBTV1QuTUFYCi0gICAgICAgICAgICAgICAgfCBTV1QuUkVTSVpFIHwgU1dULlRJVExFKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2xpZGVyIiwgU2xpZGVyLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidGFiRm9sZGVyIiwgVGFiRm9sZGVyLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidGFiSXRlbSIsIFRhYkl0ZW0uY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJ0YWJsZSIsIFRhYmxlLmNsYXNzLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidGFibGVDb2x1bW4iLCBUYWJsZUNvbHVtbi5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRhYmxlSXRlbSIsIFRhYmxlSXRlbS5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRleHQiLCBUZXh0LmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidG9vbEJhciIsIFRvb2xCYXIuY2xhc3MsIFNXVC5WRVJUSUNBTCk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRvb2xJdGVtIiwgVG9vbEl0ZW0uY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJ0cmFja2VyIiwgVHJhY2tlci5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidHJheSIsIG5ldyBUcmF5RmFjdG9yeSgpKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidHJheUl0ZW0iLCBUcmF5SXRlbS5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRyZWUiLCBUcmVlLmNsYXNzLCBTV1QuTVVMVEkpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJ0cmVlSXRlbSIsIFRyZWVJdGVtLmNsYXNzKTsKLQotICAgICAgICAvLyBjdXN0b20gd2lkZ2V0cwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJjQmFubmVyIiwgQ0Jhbm5lci5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNDb21ibyIsIENDb21iby5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNMYWJlbCIsIENMYWJlbC5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNUYWJGb2xkZXIiLCBDVGFiRm9sZGVyLmNsYXNzKTsKLSAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiY1RhYkl0ZW0iLCBDVGFiSXRlbS5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInNhc2hGb3JtIiwgU2FzaEZvcm0uY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJ0YWJsZVRyZWUiLCBUYWJsZVRyZWUuY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJ0YWJsZVRyZWVJdGVtIiwgVGFibGVUcmVlSXRlbS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gbGF5b3V0cwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZpbGxMYXlvdXQiLCBuZXcgTGF5b3V0RmFjdG9yeShGaWxsTGF5b3V0LmNsYXNzKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZ3JpZExheW91dCIsIG5ldyBMYXlvdXRGYWN0b3J5KEdyaWRMYXlvdXQuY2xhc3MpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJyb3dMYXlvdXQiLCBuZXcgTGF5b3V0RmFjdG9yeShSb3dMYXlvdXQuY2xhc3MpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtTGF5b3V0IiwgbmV3IExheW91dEZhY3RvcnkoRm9ybUxheW91dC5jbGFzcykpOwotCi0gICAgICAgIC8vIGxheW91dCBkYXRhIG9iamVjdHMKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJncmlkRGF0YSIsIG5ldyBMYXlvdXREYXRhRmFjdG9yeShHcmlkRGF0YS5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInJvd0RhdGEiLCBuZXcgTGF5b3V0RGF0YUZhY3RvcnkoUm93RGF0YS5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1EYXRhIiwgbmV3IEZvcm1MYXlvdXREYXRhRmFjdG9yeSgpKTsKLQotICAgICAgICAvLyBkaWFsb2dzCi0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNvbG9yRGlhbG9nIiwgQ29sb3JEaWFsb2cuY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJkaXJlY3RvcnlEaWFsb2ciLCBEaXJlY3RvcnlEaWFsb2cuY2xhc3MpOwotICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJmaWxlRGlhbG9nIiwgRmlsZURpYWxvZy5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImZvbnREaWFsb2ciLCBGb250RGlhbG9nLmNsYXNzKTsKLQotICAgICAgICAvLyBldmVudHMKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJvbkV2ZW50IiwgbmV3IExpc3RlbmVyRmFjdG9yeShMaXN0ZW5lci5jbGFzcykpOwotCi0gICAgICAgIC8vIG90aGVyIHRhZ3MKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJpbWFnZSIsIG5ldyBJbWFnZUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgLy8gYnJvd3NlciB0YWdzCi0gICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImJyb3dzZXIiLCBCcm93c2VyLmNsYXNzLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgibG9jYXRpb25MaXN0ZW5lciIsIG5ldyBMaXN0ZW5lckZhY3RvcnkoTG9jYXRpb25MaXN0ZW5lci5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInByb2dyZXNzTGlzdGVuZXIiLCBuZXcgTGlzdGVuZXJGYWN0b3J5KFByb2dyZXNzTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJzdGF0dXNUZXh0TGlzdGVuZXIiLCBuZXcgTGlzdGVuZXJGYWN0b3J5KFN0YXR1c1RleHRMaXN0ZW5lci5jbGFzcykpOwotCi0gICAgICAgIC8vIGZvcm1zIGFwaQotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm0iLCBuZXcgRm9ybUZhY3RvcnkoImZvcm0iKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgic2Nyb2xsZWRGb3JtIiwgbmV3IEZvcm1GYWN0b3J5KCJzY3JvbGxlZEZvcm0iKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZm9ybUJ1dHRvbiIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybUJ1dHRvbiIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtQ29sb3JzIiwgbmV3IEZvcm1GYWN0b3J5KCJmb3JtQ29sb3JzIikpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1Db21wb3NpdGUiLCBuZXcgRm9ybUZhY3RvcnkoImZvcm1Db21wb3NpdGUiKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZm9ybUNvbXBvc2l0ZVNlcGFyYXRvciIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybUNvbXBvc2l0ZVNlcGFyYXRvciIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtRXhwYW5kYWJsZUNvbXBvc2l0ZSIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybUJ1dHRvbiIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtVGV4dCIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybVRleHQiKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZm9ybUh5cGVybGluayIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybUh5cGVybGluayIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtSW1hZ2VIeXBlcmxpbmsiLCBuZXcgRm9ybUZhY3RvcnkoImZvcm1JbWFnZUh5cGVybGluayIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtTGFiZWwiLCBuZXcgRm9ybUZhY3RvcnkoImZvcm1MYWJlbCIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtUGFnZUJvb2siLCBuZXcgRm9ybUZhY3RvcnkoImZvcm1QYWdlQm9vayIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtUGFnZUJvb2tQYWdlIiwgbmV3IEZvcm1GYWN0b3J5KCJmb3JtUGFnZUJvb2tQYWdlIikpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1TZWN0aW9uIiwgbmV3IEZvcm1GYWN0b3J5KCJmb3JtU2VjdGlvbiIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtU2VwYXJhdG9yIiwgbmV3IEZvcm1GYWN0b3J5KCJmb3JtU2VwYXJhdG9yIikpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1UYWJsZSIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybVRhYmxlIikpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1Ub29sa2l0IiwgbmV3IEZvcm1GYWN0b3J5KCJmb3JtVG9vbGtpdCIpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmb3JtRm9ybWF0dGVkVGV4dCIsIG5ldyBGb3JtRmFjdG9yeSgiZm9ybUZvcm1hdHRlZFRleHQiKSk7Ci0gICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZm9ybVRyZWUiLCBuZXcgRm9ybUZhY3RvcnkoImZvcm1UcmVlIikpOwotCi0gICAgICAgIC8vIGZvcm1zIGxheW91dAotICAgICAgICByZWdpc3RlckZhY3RvcnkoInRhYmxlV3JhcExheW91dCIsIG5ldyBMYXlvdXRGYWN0b3J5KFRhYmxlV3JhcExheW91dC5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInRhYmxlV3JhcERhdGEiLCBuZXcgTGF5b3V0RGF0YUZhY3RvcnkoVGFibGVXcmFwRGF0YS5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImNvbHVtbkxheW91dCIsIG5ldyBMYXlvdXRGYWN0b3J5KENvbHVtbkxheW91dC5jbGFzcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImNvbHVtbkxheW91dERhdGEiLCBuZXcgTGF5b3V0RGF0YUZhY3RvcnkoQ29sdW1uTGF5b3V0RGF0YS5jbGFzcykpOwotCi0gICAgICAgIC8vIGZvcm1zIGxpc3RlbmVycwotICAgICAgICByZWdpc3RlckZhY3RvcnkoImh5cGVybGlua0xpc3RlbmVyIiwgbmV3IExpc3RlbmVyRmFjdG9yeShJSHlwZXJsaW5rTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJleHBhbnNpb25MaXN0ZW5lciIsIG5ldyBMaXN0ZW5lckZhY3RvcnkoSUV4cGFuc2lvbkxpc3RlbmVyLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gbm9uZSBlY2xpcHNlIHdpZGdldHMKLSAgICAgICAgLy8gcmVnaXN0ZXJCZWFuRmFjdG9yeSgidERhdGVUZXh0IiwgVERhdGVUZXh0LmNsYXNzKTsKLSAgICAgICAgLy8gcmVnaXN0ZXJCZWFuRmFjdG9yeSgidENhbGVuZGFyIiwgVENhbGVuZGFyLmNsYXNzKTsKLSAgICAgICAgLy8gcmVnaXN0ZXJCZWFuRmFjdG9yeSgidGV4dEVkaXRvciIsIFRleHRFZGl0b3IuY2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCi0gICAgICAgIC8vICBUT0RPIGltcGxlbWVudCB0aGlzCi0gICAgICAgIC8vIAotICAgICAgICAvLyAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlICYmIHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpCi0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gIAlTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgcGFyZW50OwotICAgICAgICAvLyAgICAgIHNjcm9sbGVkQ29tcG9zaXRlLnNldENvbnRlbnQoKENvbnRyb2wpIHdpZGdldCk7Ci0gICAgICAgIC8vICB9Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG92ZXJyaWRlIHRvIG1ha2UgcHVibGljCi0gICAgICogCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNzZXRDdXJyZW50KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudChPYmplY3QgY3VycmVudCkgewotICAgICAgICBzdXBlci5zZXRDdXJyZW50KGN1cnJlbnQpOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIG92ZXJyaWRlIHRvIG1ha2UgcHVibGljCi0gICAgICogCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNnZXRDdXJyZW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDdXJyZW50KCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L1N3dFV0aWxzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvU3d0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNzQ0Mi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvU3d0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkuamZhY2UuaW1wbC5BcHBsaWNhdGlvbldpbmRvd0ltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKiAKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggU1dULgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqICAKLSAqIEB2ZXJzaW9uIDEuMQotICovCi1wdWJsaWMgY2xhc3MgU3d0VXRpbHMgewotCi0gICAgLyoqIFRoZSBMb2cgdG8gd2hpY2ggbG9nZ2luZyBjYWxscyB3aWxsIGJlIG1hZGUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN3dFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZyBvZiBzdHlsZSBjb2RlcyB3aGljaCBhcmUgb3InZAotICAgICAqIHRvZ2V0aGVyLiBUaGUgZ2l2ZW4gY2xhc3MgZGVzY3JpYmVzIHRoZSBpbnRlZ2VyIHN0YXRpYyBjb25zdGFudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25zdGFudENsYXNzIGlzIHRoZSB0eXBlIHRvIGxvb2sgZm9yIHN0YXRpYyBmaWVsZHMKLSAgICAgKiBAcGFyYW0gdGV4dCBpcyBhIGNvbW1hIGRlbGltaXRlZCB0ZXh0IHZhbHVlIHN1Y2ggYXMgImJvcmRlciwgcmVzaXplIgotICAgICAqIEByZXR1cm4gdGhlIGludCBjb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcGFyc2VTdHlsZShDbGFzcyBjb25zdGFudENsYXNzLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZVN0eWxlKGNvbnN0YW50Q2xhc3MsIHRleHQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZyBvZiBzdHlsZSBjb2RlcyB3aGljaCBhcmUgb3InZAotICAgICAqIHRvZ2V0aGVyLiBUaGUgZ2l2ZW4gY2xhc3MgZGVzY3JpYmVzIHRoZSBpbnRlZ2VyIHN0YXRpYyBjb25zdGFudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25zdGFudENsYXNzIGlzIHRoZSB0eXBlIHRvIGxvb2sgZm9yIHN0YXRpYyBmaWVsZHMKLSAgICAgKiBAcGFyYW0gdGV4dCBpcyBhIGNvbW1hIGRlbGltaXRlZCB0ZXh0IHZhbHVlIHN1Y2ggYXMgImJvcmRlciwgcmVzaXplIgotICAgICAqIEBwYXJhbSB0b1VwcGVyQ2FzZSBpcyB3aGV0aGVyIHRoZSB0ZXh0IHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZQotICAgICAqIGJlZm9yZSBpdHMgY29tcGFyZWQgYWdhaW5zdCB0aGUgcmVmbGVjdGlvbiBmaWVsZHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHBhcnNlU3R5bGUoQ2xhc3MgY29uc3RhbnRDbGFzcywgU3RyaW5nIHRleHQsIGJvb2xlYW4gdG9VcHBlckNhc2UpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGFuc3dlciA9IDA7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0b1VwcGVyQ2FzZSkgewotICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZW51bSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgIiwiKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGVudW0ubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGFuc3dlciB8PSBnZXRTdHlsZUNvZGUoY29uc3RhbnRDbGFzcywgdG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY29kZSBmb3IgdGhlIGdpdmVuIHdvcmQgb3IgemVybyBpZiB0aGUgd29yZCBkb2Vzbid0IG1hdGNoIGEKLSAgICAgKiB2YWxpZCBzdHlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0eWxlQ29kZShDbGFzcyBjb25zdGFudENsYXNzLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmaWVsZCA9IGNvbnN0YW50Q2xhc3MuZ2V0RmllbGQodGV4dCk7Ci0gICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmtub3duIHN0eWxlIGNvZGU6ICIgKyB0ZXh0ICsgIiB3aWxsIGJlIGlnbm9yZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRJbnQobnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oIlRoZSB2YWx1ZTogIiArIHRleHQgKyAiIGlzIG5vdCB1bmRlcnN0b29kICIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oIlRoZSB2YWx1ZTogIiArIHRleHQgKyAiIGlzIG5vdCB1bmRlcnN0b29kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkaXNwb3NlIGFsbCBjaGlsZHJlbgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZUNoaWxkcmVuKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgY29udHJvbC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIHBhcmVudCBzaGVsbAotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTaGVsbCBnZXRQYXJlbnRTaGVsbChPYmplY3QgcGFyZW50KSB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbldpbmRvdykgewotICAgICAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25XaW5kb3dJbXBsKSBwYXJlbnQpLmdldFNoZWxsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoU2hlbGwpIHBhcmVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBwYXJlbnQgd2lkZ2V0Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQYXJlbnRXaWRnZXQoT2JqZWN0IHBhcmVudCwgTWFwIHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoInBhcmVudCIpKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXR0cmlidXRlID0gcHJvcGVydGllcy5yZW1vdmUoInBhcmVudCIpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnRXaWRnZXQgPSAoQ29tcG9zaXRlKSBhdHRyaWJ1dGU7Ci0gICAgICAgICAgICAgICAgU3d0VXRpbHMuZGlzcG9zZUNoaWxkcmVuKChDb21wb3NpdGUpIHBhcmVudFdpZGdldCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFdpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbldpbmRvdykgewotICAgICAgICAgICAgcmV0dXJuIChDb21wb3NpdGUpICgoQXBwbGljYXRpb25XaW5kb3dJbXBsKSBwYXJlbnQpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRm9ybSkgewotICAgICAgICAgICAgcmV0dXJuICgoRm9ybSkgcGFyZW50KS5nZXRCb2R5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTY3JvbGxlZEZvcm0pIHBhcmVudCkuZ2V0Qm9keSgpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNlY3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNlY3Rpb24pIHBhcmVudCkuZ2V0Q2xpZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1RhYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiAoKENUYWJJdGVtKSBwYXJlbnQpLmdldFBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiAoKFRhYkl0ZW0pIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgV2lkZ2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKFdpZGdldCkgcGFyZW50OwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYWJsZVZpZXdlcikgcGFyZW50KS5nZXRUYWJsZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9Vbktub3duU3R5bGVFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9Vbktub3duU3R5bGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjNmU2ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvVW5Lbm93blN0eWxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTUsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4gCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbktub3duU3R5bGVFeGNlcHRpb24gZXh0ZW5kcyBHcm9vdnlFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5Lbm93blN0eWxlRXhjZXB0aW9uKFN0cmluZyBzdHlsZSkgewotICAgICAgICBzdXBlcigiVW5rbm93IFNXVCBzdHlsZTogIiArIHN0eWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvY29udmVydG9yL0NvbG9yQ29udmVydGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvY29udmVydG9yL0NvbG9yQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTI2YzkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2NvbnZlcnRvci9Db2xvckNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5jb252ZXJ0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQSBDb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBTdHJpbmdzIGluIHRoZSBmb3JtICIjdXV1dXV1IiBvciAieCx5LHoiIGludG8gYQotICogUkdCIG9iamVjdAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvckNvbnZlcnRlciB7Ci0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3JDb252ZXJ0ZXIgaW5zdGFuY2UgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXNhZ2VUZXh0ID0gIkNvbG9yIHZhbHVlIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiAnI3h4eHh4eCcgb3IgJ3gseSx6JyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yQ29udmVydGVyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VycyBhIFN0cmluZyBpbiB0aGUgZm9ybSAieCwgeSwgeiIgaW50byBhbiBTV1QgUkdCIGNsYXNzCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiBSR0IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUkdCIHBhcnNlUkdCKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZW51bSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgICAgIGludCByZWQgPSAwOwotICAgICAgICBpbnQgZ3JlZW4gPSAwOwotICAgICAgICBpbnQgYmx1ZSA9IDA7Ci0gICAgICAgIGlmIChlbnVtLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgcmVkID0gcGFyc2VOdW1iZXIoZW51bS5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVudW0uaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBncmVlbiA9IHBhcnNlTnVtYmVyKGVudW0ubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbnVtLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgYmx1ZSA9IHBhcnNlTnVtYmVyKGVudW0ubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUkdCKHJlZCwgZ3JlZW4sIGJsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcnMgYSBTdHJpbmcgaW4gdGhlIGZvcm0gIiN4eHh4eHgiIGludG8gYW4gU1dUIFJHQiBjbGFzcwotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gUkdCCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJHQiBwYXJzZUh0bWwoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSA3KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHVzYWdlVGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGNvbG9yVmFsdWUgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29sb3JWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDEpLCAxNik7Ci0gICAgICAgICAgICBqYXZhLmF3dC5Db2xvciBzd2luZ0NvbG9yID0gbmV3IGphdmEuYXd0LkNvbG9yKGNvbG9yVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBSR0Ioc3dpbmdDb2xvci5nZXRSZWQoKSwgc3dpbmdDb2xvci5nZXRHcmVlbigpLCBzd2luZ0NvbG9yLmdldEJsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2YWx1ZSArICJpcyBub3QgYSB2YWxpZCBIdG1sIGNvbG9yXG4gIiArIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFJHQiBwYXJzZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpIDw9IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXNhZ2VUZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiWyIpICYmIHZhbHVlLmVuZHNXaXRoKCJdIikpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnIycpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUh0bWwodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJywnKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUkdCKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXNhZ2VUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSR0IgcGFyc2UoTGlzdCBsaXN0KSB7Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSAhPSAzKSB7Ci0gICAgICAgICAgICBsb2cubG9nKExldmVsLldBUk5JTkcsICJjb2xvciBhdHRyaWJ1dGUgbXVzdCBbeCx5LHpdIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmVkID0gcGFyc2VOdW1iZXIoIiIgKyBsaXN0LmdldCgwKSk7Ci0gICAgICAgIGludCBncmVlbiA9IHBhcnNlTnVtYmVyKCIiICsgbGlzdC5nZXQoMSkpOwotICAgICAgICBpbnQgYmx1ZSA9IHBhcnNlTnVtYmVyKCIiICsgbGlzdC5nZXQoMikpOwotICAgICAgICByZXR1cm4gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgYW5zd2VyID0gcGFyc2UodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuc3dlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHBhcnNlTnVtYmVyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2NvbnZlcnRvci9Qb2ludENvbnZlcnRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2NvbnZlcnRvci9Qb2ludENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWMyNmM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9jb252ZXJ0b3IvUG9pbnRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5jb252ZXJ0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogIEEgQ29udmVydGVyIHRoYXQgdHVybnMgYSBMaXN0IGluIHRoZSBmb3JtIFt4LCB5XSBpbnRvIGEgUG9pbnQgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZjpja2wgYXQgZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50Q29udmVydGVyIHsKLSAgICBwcml2YXRlIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludENvbnZlcnRlciBpbnN0YW5jZSA9IG5ldyBQb2ludENvbnZlcnRlcigpOwotCi0gICAgcHVibGljIHN0YXRpYyBQb2ludENvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2ludCBwYXJzZShMaXN0IGxpc3QpIHsKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuV0FSTklORywgInNpemUgYXR0cmlidXRlIG11c3QgW3gseV0iKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwkKLSAgICAgICAgfQotICAgICAgICBpbnQgeCA9IHBhcnNlTnVtYmVyKCIiICsgbGlzdC5nZXQoMCkpOwotICAgICAgICBpbnQgeSA9IHBhcnNlTnVtYmVyKCIiICsgbGlzdC5nZXQoMSkpOwotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgcGFyc2VOdW1iZXIoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGV4dC50cmltKCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9BYnN0cmFjdFN3dEZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0Fic3RyYWN0U3d0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTVlNjlhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0Fic3RyYWN0U3d0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5zd3QuY29udmVydG9yLkNvbG9yQ29udmVydGVyOwotaW1wb3J0IGdyb292eS5zd3QuY29udmVydG9yLlBvaW50Q29udmVydGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN3dEZhY3RvcnkgewotCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgcHJvcGVydGllcwotICAgICAqIAotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCZWFuUHJvcGVydGllcyhPYmplY3QgYmVhbiwgTWFwIHByb3BlcnRpZXMpIHsKLQotICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBiZWFuOwotCi0gICAgICAgICAgICAvLyBzZXQgc2l6ZSBvZiB3aWRnZXQKLSAgICAgICAgICAgIE9iamVjdCBzaXplID0gcHJvcGVydGllcy5yZW1vdmUoInNpemUiKTsKLSAgICAgICAgICAgIGlmIChzaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRTaXplKGNvbnRyb2wsIHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgYmFja2dyb3VuZCBvZiB3aWRnZXQKLSAgICAgICAgICAgIE9iamVjdCBjb2xvclZhbHVlID0gcHJvcGVydGllcy5yZW1vdmUoImJhY2tncm91bmQiKTsKLSAgICAgICAgICAgIGlmIChjb2xvclZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb2xvciBiYWNrZ3JvdW5kID0gZ2V0Q29sb3IoY29udHJvbCwgY29sb3JWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgZm9yZWdyb3VuZCBvZiB3aWRnZXQKLSAgICAgICAgICAgIGNvbG9yVmFsdWUgPSBwcm9wZXJ0aWVzLnJlbW92ZSgiZm9yZWdyb3VuZCIpOwotICAgICAgICAgICAgaWYgKGNvbG9yVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbG9yIGZvcmVncm91bmQgPSBnZXRDb2xvcihjb250cm9sLCBjb2xvclZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgRmllbGQgZmllbGQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldEJvb2xlYW4oYmVhbiwgKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldEludChiZWFuLCAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldERvdWJsZShiZWFuLCAoKERvdWJsZSkgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRGbG9hdChiZWFuLCAoKEZsb2F0KSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGJlYW4sIHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGJlYW4sIHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29sb3IgZ2V0Q29sb3IoQ29udHJvbCBjb250cm9sLCBPYmplY3QgY29sb3JWYWx1ZSkgewotICAgICAgICBDb2xvciBjb2xvciA9IG51bGw7Ci0gICAgICAgIGlmIChjb2xvclZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJHQiByZ2IgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbG9yVmFsdWUgaW5zdGFuY2VvZiBDb2xvcikgewotICAgICAgICAgICAgICAgIGNvbG9yID0gKENvbG9yKSBjb2xvclZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIHJnYiA9IENvbG9yQ29udmVydGVyLmdldEluc3RhbmNlKCkucGFyc2UoKExpc3QpIGNvbG9yVmFsdWUpOwotICAgICAgICAgICAgICAgIGNvbG9yID0gbmV3IENvbG9yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCByZ2IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZ2IgPSBDb2xvckNvbnZlcnRlci5nZXRJbnN0YW5jZSgpLnBhcnNlKGNvbG9yVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY29sb3IgPSBuZXcgQ29sb3IoY29udHJvbC5nZXREaXNwbGF5KCksIHJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29udHJvbCBjb250cm9sLCBPYmplY3Qgc2l6ZSkgewotICAgICAgICBQb2ludCBwb2ludCA9IG51bGw7Ci0gICAgICAgIGlmIChzaXplICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzaXplIGluc3RhbmNlb2YgUG9pbnQpIHsKLSAgICAgICAgICAgICAgICBwb2ludCA9IChQb2ludCkgc2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBwb2ludCA9IFBvaW50Q29udmVydGVyLmdldEluc3RhbmNlKCkucGFyc2UoKExpc3QpIHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udHJvbC5zZXRTaXplKHBvaW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9BY3Rpb25GYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9BY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjFiMTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvQWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0LmZhY3Rvcnk7Ci0KLWltcG9ydCBncm9vdnkuamZhY2UuZmFjdG9yeS5BY3Rpb25JbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuaW1wbC5Td3RGYWN0b3J5I25ld0luc3RhbmNlKGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uSW1wbCgpOwotICAgICAgICBzZXRCZWFuUHJvcGVydGllcyhhY3Rpb24sIHByb3BlcnRpZXMpOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRyaWJ1dGlvbk1hbmFnZXIpewotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbk1hbmFnZXIgY29udHJpYnV0aW9uTWFuYWdlciA9IChJQ29udHJpYnV0aW9uTWFuYWdlcikgcGFyZW50OwotICAgICAgICAgICAgY29udHJpYnV0aW9uTWFuYWdlci5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0F3dFN3dEZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0F3dFN3dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNjYzMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9Bd3RTd3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTUsIDIwMDQKLSAqICAKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0LmZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBBd3RTd3RGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5pbXBsLkZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1dUX0FXVC5uZXdfRnJhbWUoKENvbXBvc2l0ZSkgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvRm9udGZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0ZvbnRmYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGY4NTUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvRm9udGZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuVW5Lbm93blN0eWxlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4gCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250ZmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U3d0RmFjdG9yeSBpbXBsZW1lbnRzIFN3dEZhY3RvcnkgewotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT2JqZWN0IHBhcmVudFdpZGdldCA9IFN3dFV0aWxzLmdldFBhcmVudFdpZGdldChwYXJlbnQsIHByb3BlcnRpZXMpOwotICAgICAgICBpZiAoIShwYXJlbnRXaWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oImNvbnRyb2wiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRyb2wgcGFyZW50Q29udHJvbCA9IChDb250cm9sKSBwYXJlbnRXaWRnZXQ7Ci0KLSAgICAgICAgU3RyaW5nIHN0eWxlUHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgic3R5bGUiKTsKLQotICAgICAgICBpZiAoc3R5bGVQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN0eWxlID0gU3d0VXRpbHMucGFyc2VTdHlsZShTV1QuY2xhc3MsIHN0eWxlUHJvcGVydHkpOwotICAgICAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5Lbm93blN0eWxlRXhjZXB0aW9uKHN0eWxlUHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGb250IGluaXRpYWxGb250ID0gcGFyZW50Q29udHJvbC5nZXRGb250KCk7Ci0gICAgICAgICAgICBGb250RGF0YVtdIGZvbnREYXRhID0gaW5pdGlhbEZvbnQuZ2V0Rm9udERhdGEoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb250RGF0YVtpXS5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZvbnQgbmV3Rm9udCA9IG5ldyBGb250KHBhcmVudENvbnRyb2wuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7Ci0gICAgICAgICAgICBwYXJlbnRDb250cm9sLnNldEZvbnQobmV3Rm9udCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyZW50Q29udHJvbDsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9Gb3JtRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvRm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5OGJkYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9Gb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNywgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5IeXBlcmxpbmtTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRQYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEZvcm1GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICAvKiogc3RhdGljIGlzIGV2aWwsIHRvbyBtYW55IHRvb2xraXRzIGlzIGV2aWwgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRvb2xraXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb3JtVG9vbGtpdCBnZXRUb29sa2l0KCkgewotICAgICAgICBpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBGb3JtQ29sb3JzIGZvcm1Db2xvcnMgPSBuZXcgRm9ybUNvbG9ycyhEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsID8gbmV3IERpc3BsYXkoKQotICAgICAgICAgICAgICAgICAgICA6IERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLSAgICAgICAgICAgIHRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQoZm9ybUNvbG9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvb2xraXQ7Ci0gICAgfQotCi0gICAgLyoqIHR5cGUgb2YgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBGb3JtRmFjdG9yeShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmZhY3RvcnkuQWJzdHJhY3RTd3RGYWN0b3J5I25ld0luc3RhbmNlKGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpIHRocm93cyBHcm9vdnlFeGNlcHRpb24gewotICAgICAgICAvLyBib29sZWFuIHNob3VsZExheW91dCA9IHByb3BlcnRpZXMuY29udGFpbnNLZXkoInBhcmVudCIpOwotICAgICAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gKENvbXBvc2l0ZSkgU3d0VXRpbHMuZ2V0UGFyZW50V2lkZ2V0KHBhcmVudCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgU3RyaW5nIHN0eWxlUHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgic3R5bGUiKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgidGV4dCIpOwotICAgICAgICBpbnQgc3R5bGUgPSBTV1QuTlVMTDsKLSAgICAgICAgaWYgKHN0eWxlUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJmb3JtU2VjdGlvbiIpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBTd3RVdGlscy5wYXJzZVN0eWxlKFNlY3Rpb24uY2xhc3MsIHN0eWxlUHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IFN3dFV0aWxzLnBhcnNlU3R5bGUoU1dULmNsYXNzLCBzdHlsZVByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGZvcm1XaWRnZXQgPSBnZXRGb3JtV2lkZ2V0KHBhcmVudENvbXBvc2l0ZSwgcHJvcGVydGllcywgc3R5bGUsIHRleHQpOwotICAgICAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoZm9ybVdpZGdldCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vIGlmIChzaG91bGRMYXlvdXQgJiYgcGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgcGFyZW50Q29tcG9zaXRlIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAvLyAgICAoKENvbXBvc2l0ZSkgcGFyZW50Q29tcG9zaXRlKS5sYXlvdXQoKTsKLSAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICByZXR1cm4gZm9ybVdpZGdldDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oImNvbXBvc2l0ZSBpbnN0YW5jZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudENvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldEZvcm1XaWRnZXQoZmluYWwgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSwgTWFwIHByb3BlcnRpZXMsIGludCBzdHlsZSwKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCJmb3JtIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIEZvcm0gZm9ybSA9IGdldFRvb2xraXQoKS5jcmVhdGVGb3JtKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICBmb3JtLnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZm9ybTsKLSAgICAgICAgfQotICAgICAgICBpZiAoInNjcm9sbGVkRm9ybSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBTY3JvbGxlZEZvcm0gc2Nyb2xsZWRGb3JtID0gZ2V0VG9vbGtpdCgpLmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnRDb21wb3NpdGUpOwotICAgICAgICAgICAgc2Nyb2xsZWRGb3JtLnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gc2Nyb2xsZWRGb3JtOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybUJ1dHRvbiIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VG9vbGtpdCgpLmNyZWF0ZUJ1dHRvbihwYXJlbnRDb21wb3NpdGUsIHRleHQsIHN0eWxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImZvcm1Db2xvcnMiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRvb2xraXQoKS5nZXRDb2xvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImZvcm1Db21wb3NpdGUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRvb2xraXQoKS5jcmVhdGVDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBzdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJmb3JtQ29tcG9zaXRlU2VwYXJhdG9yIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUb29sa2l0KCkuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJmb3JtRXhwYW5kYWJsZUNvbXBvc2l0ZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VG9vbGtpdCgpLmNyZWF0ZUV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBzdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJmb3JtVGV4dCIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBUZXh0IHRleHQyID0gZ2V0VG9vbGtpdCgpLmNyZWF0ZVRleHQocGFyZW50Q29tcG9zaXRlLCB0ZXh0LCBzdHlsZSk7Ci0gICAgICAgICAgICBnZXRUb29sa2l0KCkucGFpbnRCb3JkZXJzRm9yKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJmb3JtSHlwZXJsaW5rIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUb29sa2l0KCkuY3JlYXRlSHlwZXJsaW5rKHBhcmVudENvbXBvc2l0ZSwgdGV4dCwgc3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybUltYWdlSHlwZXJsaW5rIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUb29sa2l0KCkuY3JlYXRlSW1hZ2VIeXBlcmxpbmsocGFyZW50Q29tcG9zaXRlLCBzdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJmb3JtTGFiZWwiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRvb2xraXQoKS5jcmVhdGVMYWJlbChwYXJlbnRDb21wb3NpdGUsIHRleHQsIHN0eWxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImZvcm1QYWdlQm9vayIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VG9vbGtpdCgpLmNyZWF0ZVBhZ2VCb29rKHBhcmVudENvbXBvc2l0ZSwgc3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybVBhZ2VCb29rUGFnZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50Q29tcG9zaXRlIGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQm9vaykgewotICAgICAgICAgICAgICAgIFNjcm9sbGVkUGFnZUJvb2sgcGFnZUJvb2sgPSAoU2Nyb2xsZWRQYWdlQm9vaykgcGFyZW50Q29tcG9zaXRlOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgia2V5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYWdlID0gcGFnZUJvb2suY3JlYXRlUGFnZShrZXkpOwotICAgICAgICAgICAgICAgICAgICBwYWdlQm9vay5yZWdpc3RlclBhZ2Uoa2V5LCBwYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCQkJIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oImF0dHJpYnV0ZSBcImtleVwiIGlzICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJlbnRFeGNlcHRpb24oImZvcm1QYWdlQm9vayIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybVNlY3Rpb24iLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0VG9vbGtpdCgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50Q29tcG9zaXRlLCBzdHlsZSk7Ci0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VjdGlvbi5zZXRUZXh0KHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VjdGlvbi5zZXRTZXBhcmF0b3JDb250cm9sKGdldFRvb2xraXQoKS5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbikpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gKFN0cmluZykgcHJvcGVydGllcy5yZW1vdmUoImRlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tcG9zaXRlIGNsaWVudCA9IGdldFRvb2xraXQoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0gICAgICAgICAgICBjbGllbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY2xpZW50KTsKLSAgICAgICAgICAgIHJldHVybiBzZWN0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybVNlcGFyYXRvciIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VG9vbGtpdCgpLmNyZWF0ZVNlcGFyYXRvcihwYXJlbnRDb21wb3NpdGUsIHN0eWxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImZvcm1UYWJsZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VG9vbGtpdCgpLmNyZWF0ZVRhYmxlKHBhcmVudENvbXBvc2l0ZSwgc3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybVRvb2xraXQiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRvb2xraXQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImZvcm1Gb3JtYXR0ZWRUZXh0Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFyc2VUYWdzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGV4cGFuZFVSTHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdldCgicGFyc2VUYWdzIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnNlVGFncyA9ICgoQm9vbGVhbikgcHJvcGVydGllcy5yZW1vdmUoInBhcnNlVGFncyIpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdldCgiZXhwYW5kVVJMcyIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleHBhbmRVUkxzID0gKChCb29sZWFuKSBwcm9wZXJ0aWVzLnJlbW92ZSgiZXhwYW5kVVJMcyIpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRm9ybVRleHQgZm9ybVRleHQgPSBnZXRUb29sa2l0KCkuY3JlYXRlRm9ybVRleHQocGFyZW50Q29tcG9zaXRlLCB0cnVlKTsKLSAgICAgICAgICAgIEh5cGVybGlua1NldHRpbmdzIGh5cGVybGlua1NldHRpbmdzID0gbmV3IEh5cGVybGlua1NldHRpbmdzKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLSAgICAgICAgICAgIGh5cGVybGlua1NldHRpbmdzLnNldEJhY2tncm91bmQoZ2V0VG9vbGtpdCgpLmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICBoeXBlcmxpbmtTZXR0aW5ncy5zZXRBY3RpdmVCYWNrZ3JvdW5kKGdldFRvb2xraXQoKS5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgaHlwZXJsaW5rU2V0dGluZ3Muc2V0Rm9yZWdyb3VuZChnZXRUb29sa2l0KCkuZ2V0Q29sb3JzKCkuZ2V0Rm9yZWdyb3VuZCgpKTsKLSAgICAgICAgICAgIGh5cGVybGlua1NldHRpbmdzLnNldEFjdGl2ZUZvcmVncm91bmQoZ2V0VG9vbGtpdCgpLmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICBmb3JtVGV4dC5zZXRIeXBlcmxpbmtTZXR0aW5ncyhoeXBlcmxpbmtTZXR0aW5ncyk7Ci0KLSAgICAgICAgICAgIGZvcm1UZXh0LnNldFRleHQodGV4dCwgcGFyc2VUYWdzLCBleHBhbmRVUkxzKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZvcm1UZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZm9ybVRyZWUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRvb2xraXQoKS5jcmVhdGVUcmVlKHBhcmVudENvbXBvc2l0ZSwgc3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9Gb3JtTGF5b3V0RGF0YUZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0Zvcm1MYXlvdXREYXRhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODY2Zjc0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0Zvcm1MYXlvdXREYXRhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNiwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4gJElkCi0gKiAgICAgICAgIExheW91dERhdGFGYWN0b3J5LmphdmEsdiAxLjIgMjAwNC8wMy8xOCAwODo1MTo0NyBja2wgRXhwICQKLSAqLwotcHVibGljIGNsYXNzIEZvcm1MYXlvdXREYXRhRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U3d0RmFjdG9yeSBpbXBsZW1lbnRzCi0gICAgICAgIFN3dEZhY3RvcnkgewotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuaW1wbC5Td3RGYWN0b3J5I25ld0luc3RhbmNlKGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2V0IGF0dGFjaG1lbnQgcHJvcGVydGllcwotICAgICAgICBMaXN0IGxlZnQgPSAoTGlzdCkgcHJvcGVydGllcy5yZW1vdmUoImxlZnQiKTsKLSAgICAgICAgTGlzdCByaWdodCA9IChMaXN0KSBwcm9wZXJ0aWVzLnJlbW92ZSgicmlnaHQiKTsKLSAgICAgICAgTGlzdCB0b3AgPSAoTGlzdCkgcHJvcGVydGllcy5yZW1vdmUoInRvcCIpOwotICAgICAgICBMaXN0IGJvdHRvbSA9IChMaXN0KSBwcm9wZXJ0aWVzLnJlbW92ZSgiYm90dG9tIik7Ci0KLSAgICAgICAgLy8gYnVpbGQgbmV3IGZvcm1kYXRhCi0gICAgICAgIEZvcm1EYXRhIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgICAgIGlmIChsZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm1EYXRhLmxlZnQgPSBnZXRGb3JtQXR0YWNobWVudChsZWZ0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybURhdGEucmlnaHQgPSBnZXRGb3JtQXR0YWNobWVudChyaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3JtRGF0YS50b3AgPSBnZXRGb3JtQXR0YWNobWVudCh0b3ApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChib3R0b20gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybURhdGEuYm90dG9tID0gZ2V0Rm9ybUF0dGFjaG1lbnQoYm90dG9tKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBsYXlvdXQgZGF0YQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udHJvbCkgewotICAgICAgICAgICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHBhcmVudDsKLSAgICAgICAgICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShmb3JtRGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgcmVtYWluaW5nIHByb3BlcnRpZXMKLSAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoZm9ybURhdGEsIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHJldHVybiBmb3JtZGF0YQotICAgICAgICByZXR1cm4gZm9ybURhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiBAcmV0dXJuIEB0aHJvd3MKLSAgICAgKiAgICAgICAgIEdyb292eUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRm9ybUF0dGFjaG1lbnQgZ2V0Rm9ybUF0dGFjaG1lbnQoTGlzdCBsaXN0KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgRm9ybUF0dGFjaG1lbnQgZm9ybUF0dGFjaG1lbnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChsaXN0LmdldChpKS5nZXRDbGFzcygpID09IEludGVnZXIuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSBpbnQuY2xhc3M7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0LmdldChpKSBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSBDb250cm9sLmNsYXNzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgJ2ludCcgb3IgJ0NvbnRyb2wnOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IEZvcm1BdHRhY2htZW50LmNsYXNzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdHJ1Y3Rvcih0eXBlcyk7Ci0KLSAgICAgICAgICAgIC8vIGludm9rZSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcm1BdHRhY2htZW50ID0gKEZvcm1BdHRhY2htZW50KSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm9ybUF0dGFjaG1lbnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0ltYWdlRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvSW1hZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTY3NWEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvSW1hZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTUsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5pbXBsLkZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNyYyA9IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKCJzcmMiKTsKLSAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKCJzcmMiLCBJbWFnZS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyZW50RXhjZXB0aW9uKCJXaWRnZXQgb3IgYSBXaW5kb3ciKTsKLSAgICAgICAgfQotCi0gICAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgICAgRmlsZSBpbWFnZUZpbGUgPSBuZXcgRmlsZShzcmMpOwotICAgICAgICBpZiAoaW1hZ2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc3JjKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBJbWFnZUZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbShzcmMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEltYWdlKHBhcmVudCwgaW1hZ2UpOwotCi0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgaW1hZ2UgdG8gYSB3aWRnZXQgb3Igd2luZG93Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqIEB0aHJvd3MgSmVsbHlUYWdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbWFnZShPYmplY3QgcGFyZW50LCBJbWFnZSBpbWFnZSkgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBMYWJlbCkgewotICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSAoTGFiZWwpIHBhcmVudDsKLSAgICAgICAgICAgIGxhYmVsLnNldEltYWdlKGltYWdlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJ1dHRvbikgewotICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIHBhcmVudDsKLSAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0gICAgICAgICAgICBJdGVtIGl0ZW0gPSAoSXRlbSkgcGFyZW50OwotICAgICAgICAgICAgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEZWNvcmF0aW9ucykgewotICAgICAgICAgICAgRGVjb3JhdGlvbnMgaXRlbSA9IChEZWNvcmF0aW9ucykgcGFyZW50OwotICAgICAgICAgICAgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGb3JtKSB7Ci0gICAgICAgICAgICBGb3JtIGZvcm0gPSAoRm9ybSkgcGFyZW50OwotICAgICAgICAgICAgZm9ybS5zZXRCYWNrZ3JvdW5kSW1hZ2UoaW1hZ2UpOwotCi0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7Ci0gICAgICAgICAgICBTY3JvbGxlZEZvcm0gZm9ybSA9IChTY3JvbGxlZEZvcm0pIHBhcmVudDsKLSAgICAgICAgICAgIGZvcm0uc2V0QmFja2dyb3VuZEltYWdlKGltYWdlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFdpbmRvdykgewotICAgICAgICAgICAgV2luZG93IHdpbmRvdyA9IChXaW5kb3cpIHBhcmVudDsKLSAgICAgICAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLnNldEltYWdlKGltYWdlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoaXMgdGFnIG11c3QgYmUgbmVzdGVkIGluc2lkZSBhIDxsYWJlbD4sIDxidXR0b24+IG9yIDxpdGVtPiB0YWciKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0xheW91dERhdGFGYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9MYXlvdXREYXRhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdjYmQ0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0xheW91dERhdGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTYsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RVdGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L2E+Ci0gKiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXREYXRhRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U3d0RmFjdG9yeSBpbXBsZW1lbnRzIFN3dEZhY3Rvcnl7Ci0KLSAgICBwcml2YXRlIENsYXNzIGJlYW5DbGFzczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGFzczEKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0RGF0YUZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMuYmVhbkNsYXNzID0gYmVhbkNsYXNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmltcGwuU3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgYmVhbiA9IGNyZWF0ZVdpZGdldChwcm9wZXJ0aWVzLCBwYXJlbnQpOwotCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEJlYW5Qcm9wZXJ0aWVzKGJlYW4sIHByb3BlcnRpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLSAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBwYXJlbnQ7Ci0gICAgICAgICAgICBjb250cm9sLnNldExheW91dERhdGEoYmVhbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVXaWRnZXQoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGJlYW4gPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBzdHlsZVRleHQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgic3R5bGUiKTsKLSAgICAgICAgaWYgKHN0eWxlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSBTd3RVdGlscy5wYXJzZVN0eWxlKGJlYW5DbGFzcywgc3R5bGVUZXh0KTsKLQotICAgICAgICAgICAgLy8gbm93IGxldHMgdHJ5IGludm9rZSBhIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0geyBpbnQuY2xhc3N9OwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gYmVhbkNsYXNzLmdldENvbnN0cnVjdG9yKHR5cGVzKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSB7IG5ldyBJbnRlZ2VyKHN0eWxlKX07Ci0gICAgICAgICAgICAgICAgICAgIGJlYW4gPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJlYW4gPSBiZWFuQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRCZWFuUHJvcGVydGllcyhiZWFuLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0xheW91dEZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0xheW91dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4YjFkYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9MYXlvdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTUsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIENsYXNzIGJlYW5DbGFzczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgTGF5b3V0RmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGdyb292eS5zd3QuaW1wbC5Td3RGYWN0b3J5I25ld0luc3RhbmNlKGphdmEudXRpbC5NYXAsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICBMYXlvdXQgbGF5b3V0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGF5b3V0ID0gKExheW91dCkgYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGF5b3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEJlYW5Qcm9wZXJ0aWVzKGxheW91dCwgcHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBXaWRnZXQgcGFyZW50Q29tcG9zaXRlID0gKFdpZGdldCkgU3d0VXRpbHMuZ2V0UGFyZW50V2lkZ2V0KHBhcmVudCwgcHJvcGVydGllcyk7Ci0gICAgICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgKChDb21wb3NpdGUpIHBhcmVudENvbXBvc2l0ZSkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGF5b3V0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L0xpc3RlbmVyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvTGlzdGVuZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGY0YWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvTGlzdGVuZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE1LCAyMDA0Ci0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgZ3Jvb3Z5LnN3dC5Td3RVdGlsczsKLWltcG9ydCBncm9vdnkuc3d0LmltcGwuRXhwYW5zaW9uTGlzdGVuZXJJbXBsOwotaW1wb3J0IGdyb292eS5zd3QuaW1wbC5IeXBlckxpbmtMaXN0ZW5lckltcGw7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5pbXBsLkxpc3RlbmVySW1wbDsKLWltcG9ydCBncm9vdnkuc3d0LmltcGwuTG9jYXRpb25MaXN0ZW5lckltcGw7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5pbXBsLlByb2dyZXNzTGlzdGVuZXJJbXBsOwotaW1wb3J0IGdyb292eS5zd3QuaW1wbC5TdGF0dXNUZXh0TGlzdGVuZXJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUV4cGFuc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5BYnN0cmFjdEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIENsYXNzIGJlYW5DbGFzczsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGFzczEKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdGVuZXJGYWN0b3J5KENsYXNzIGJlYW5DbGFzcykgewotICAgICAgICB0aGlzLmJlYW5DbGFzcyA9IGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5pbXBsLlN3dEZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShNYXAgcHJvcGVydGllcywgT2JqZWN0IHBhcmVudCkKLSAgICAgICAgICAgIHRocm93cyBHcm9vdnlFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKCJ0eXBlIik7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcm93c2VyKSB7Ci0gICAgICAgICAgICBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcikgcGFyZW50OwotICAgICAgICAgICAgaWYgKGJlYW5DbGFzcy5lcXVhbHMoTG9jYXRpb25MaXN0ZW5lci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBMb2NhdGlvbkxpc3RlbmVyIGxvY2F0aW9uTGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lckltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgICAgICAgICAgICBicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobG9jYXRpb25MaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uTGlzdGVuZXI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJlYW5DbGFzcy5lcXVhbHMoUHJvZ3Jlc3NMaXN0ZW5lci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIgPSBuZXcgUHJvZ3Jlc3NMaXN0ZW5lckltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgICAgICAgICAgICBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIocHJvZ3Jlc3NMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzTGlzdGVuZXI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJlYW5DbGFzcy5lcXVhbHMoU3RhdHVzVGV4dExpc3RlbmVyLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIFN0YXR1c1RleHRMaXN0ZW5lciBzdGF0dXNUZXh0TGlzdGVuZXIgPSBuZXcgU3RhdHVzVGV4dExpc3RlbmVySW1wbCgpOwotICAgICAgICAgICAgICAgIGJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKHN0YXR1c1RleHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1c1RleHRMaXN0ZW5lcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEh5cGVybGluaykgewotICAgICAgICAgICAgQWJzdHJhY3RIeXBlcmxpbmsgaHlwZXJsaW5rID0gKEFic3RyYWN0SHlwZXJsaW5rKSBwYXJlbnQ7Ci0gICAgICAgICAgICBJSHlwZXJsaW5rTGlzdGVuZXIgaHlwZXJMaW5rTGlzdGVuZXJJbXBsID0gbmV3IEh5cGVyTGlua0xpc3RlbmVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgdHlwZSk7Ci0gICAgICAgICAgICBoeXBlcmxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIoaHlwZXJMaW5rTGlzdGVuZXJJbXBsKTsKLSAgICAgICAgICAgIHJldHVybiBoeXBlckxpbmtMaXN0ZW5lckltcGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRXhwYW5kYWJsZUNvbXBvc2l0ZSkgewotICAgICAgICAgICAgRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlQ29tcG9zaXRlID0gKEV4cGFuZGFibGVDb21wb3NpdGUpIHBhcmVudDsKLSAgICAgICAgICAgIElFeHBhbnNpb25MaXN0ZW5lciBleHBhbnNpb25MaXN0ZW5lciA9IG5ldyBFeHBhbnNpb25MaXN0ZW5lckltcGwoCi0gICAgICAgICAgICAgICAgICAgIHR5cGUpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihleHBhbnNpb25MaXN0ZW5lcik7Ci0gICAgICAgICAgICByZXR1cm4gZXhwYW5zaW9uTGlzdGVuZXI7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBXaWRnZXQgfHwgcGFyZW50IGluc3RhbmNlb2YgVmlld2VyKSB7Ci0gICAgICAgICAgICBXaWRnZXQgd2lkZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3ZXIpIHsKLSAgICAgICAgICAgICAgICB3aWRnZXQgPSAoKFZpZXdlcikgcGFyZW50KS5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZGdldCA9IChXaWRnZXQpIHBhcmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBldmVudFR5cGUgPSBnZXRFdmVudFR5cGUodHlwZSk7Ci0gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IDApIHsgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk5vIGV2ZW50IHR5cGUgc3BlY2lmaWVkLCBjb3VsZCBub3QgdW5kZXJzdGFuZDogIiArIHR5cGUpOyB9Ci0gICAgICAgICAgICBMaXN0ZW5lckltcGwgbGlzdGVuZXJJbXBsID0gbmV3IExpc3RlbmVySW1wbCgpOwotICAgICAgICAgICAgd2lkZ2V0LmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXJJbXBsKTsKLSAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckltcGw7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbigiTm8gZmFjdG9yeSBmb3VuZCBmb3IgY2xhc3M6ICIgKyBiZWFuQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gZXZlbnQgdHlwZSBTdHJpbmcgYW5kIHJldHVybnMgdGhlIFNXVCBldmVudCB0eXBlIGNvZGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgaXMgdGhlIFN0cmluZyBldmVudCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgU1dUIGludGVnZXIgZXZlbnQgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0RXZlbnRUeXBlKFN0cmluZyB0eXBlKSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFN3dFV0aWxzLnBhcnNlU3R5bGUoU1dULmNsYXNzLCB0eXBlLCBmYWxzZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L1N3dEZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9mYWN0b3J5L1N3dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0MzI4Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9Td3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTUsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNrbEBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGludGVyZmFjZSBTd3RGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9UcmF5RmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvVHJheUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYzliMC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9UcmF5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE1LCAyMDA0Ci0gKiAgCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5mYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgVHJheUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFN3dEZhY3RvcnkgaW1wbGVtZW50cyBTd3RGYWN0b3J5IHsKLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LmltcGwuRmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoTWFwIHByb3BlcnRpZXMsIE9iamVjdCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbVRyYXkoKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9XaWRnZXRGYWN0b3J5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZmFjdG9yeS9XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjZkZjMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ZhY3RvcnkvV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZmFjdG9yeTsKLQotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZENoaWxkRXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5zd3QuU3d0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBXaWRnZXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgYmVhbkNsYXNzOwotCi0gICAgcHJvdGVjdGVkIGludCBzdHlsZSA9IFNXVC5OT05FOwotCi0gICAgcHVibGljIFdpZGdldEZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMuYmVhbkNsYXNzID0gYmVhbkNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MyCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICovCi0gICAgcHVibGljIFdpZGdldEZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzLCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5pbXBsLkZhY3RvcnkjbmV3SW5zdGFuY2UoamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlUHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgic3R5bGUiKTsKLSAgICAgICAgaWYgKHN0eWxlUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgc3R5bGUgPSBTd3RVdGlscy5wYXJzZVN0eWxlKFNXVC5jbGFzcywgc3R5bGVQcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgcGFyZW50V2lkZ2V0ID0gU3d0VXRpbHMuZ2V0UGFyZW50V2lkZ2V0KHBhcmVudCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBjcmVhdGVXaWRnZXQocGFyZW50V2lkZ2V0KTsKLSAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0QmVhblByb3BlcnRpZXMoYmVhbiwgcHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGJlYW4sIHBhcmVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICogQHJldHVybiBAdGhyb3dzCi0gICAgICogICAgICAgICBHcm9vdnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdpZGdldChPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJlYW5DbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5RXhjZXB0aW9uKCJObyBDbGFzcyBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZSBuZXcgd2lkZ2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGxldHMgdHJ5IGNhbGwgYSBjb25zdHJ1Y3RvciB3aXRoIGEgc2luZ2xlIHN0eWxlCi0gICAgICAgICAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IHsgaW50LmNsYXNzIH07Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBiZWFuQ2xhc3MuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IHsgbmV3IEludGVnZXIoc3R5bGUpIH07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbGV0cyB0cnkgdG8gZmluZCB0aGUgY29uc3RydWN0b3Igd2l0aCAyIGFyZ3VtZW50cyB3aXRoIHRoZQotICAgICAgICAgICAgICAgIC8vIDJuZCBhcmd1bWVudCBiZWluZyBhbiBpbnQKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGJlYW5DbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gdHlwZXMgPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PSAyICYmIHR5cGVzWzFdLmlzQXNzaWduYWJsZUZyb20oaW50LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlc1swXS5pc0Fzc2lnbmFibGVGcm9tKHBhcmVudC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMgPSB7IHBhcmVudCwgbmV3IEludGVnZXIoc3R5bGUpIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHRyeSB0byBmaW5kIHRoZSBjb25zdHJ1Y3RvciB3aXRoIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmd1bWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZXMubGVuZ3RoID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZXNbMF0uaXNBc3NpZ25hYmxlRnJvbShwYXJlbnQuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMgPSB7IHBhcmVudCB9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJlYW5DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sKE9iamVjdCBiZWFuLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgSW52YWxpZENoaWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENUYWJJdGVtKSB7Ci0gICAgICAgICAgICBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoaWxkRXhjZXB0aW9uKCJjVGFiSXRlbSIsIENvbnRyb2wuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENUYWJJdGVtIHRhYkl0ZW0gPSAoQ1RhYkl0ZW0pIHBhcmVudDsKLSAgICAgICAgICAgIHRhYkl0ZW0uc2V0Q29udHJvbCgoQ29udHJvbCkgYmVhbik7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFiSXRlbSkgewotICAgICAgICAgICAgaWYgKCEoYmVhbiBpbnN0YW5jZW9mIENvbnRyb2wpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGlsZEV4Y2VwdGlvbigidGFiSXRlbSIsIENvbnRyb2wuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRhYkl0ZW0gdGFiSXRlbSA9IChUYWJJdGVtKSBwYXJlbnQ7Ci0gICAgICAgICAgICB0YWJJdGVtLnNldENvbnRyb2woKENvbnRyb2wpIGJlYW4pOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoaWxkRXhjZXB0aW9uKCJzY3JvbGxlZENvbXBvc2l0ZSIsIENvbnRyb2wuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNjcm9sbGVkQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBwYXJlbnQ7Ci0gICAgICAgICAgICBzY3JvbGxlZENvbXBvc2l0ZS5zZXRDb250ZW50KChDb250cm9sKSBiZWFuKTsKLSAgICAgICAgfSBlbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgTWVudSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgICAgICAgICAgTWVudSBtZW51ID0gKE1lbnUpIGJlYW47Ci0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IChTaGVsbCkgcGFyZW50OwotICAgICAgICAgICAgaWYgKHN0eWxlID09IFNXVC5CQVIpIHsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRNZW51KG1lbnUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvQXBwbGljYXRpb25HdWlCdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZ3VpYnVpbGRlci9BcHBsaWNhdGlvbkd1aUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4MzM5YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZ3VpYnVpbGRlci9BcHBsaWNhdGlvbkd1aUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZ3VpYnVpbGRlcjsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5KRmFjZUJ1aWxkZXI7Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5U2NyaXB0RW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogV09SSyBJTiBQUk9HUkVTUywgZG9uJ3QgdXNlIHRoaXMgb25lIHlldAotICogCi0gKiBUaGlzIHdpbGwgYmUgdGhlIG1haW4gZ3VpYnVpbGRlcgotICogCi0gKiBUT0RPIHByb3ZpZGUgZW50cnkgcG9pbnQgZm9yIHB1bGwgdG9vbHMgKGUuZy4gaTE4biwgc2VjdXJpdHkpIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25HdWlCdWlsZGVyIGV4dGVuZHMgSkZhY2VCdWlsZGVyIHsKLSAgICAvKiogdGhlIGxvZ2dlciAqLwotICAgIHByaXZhdGUgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgLyoqIHRoZSBjYWNoaW5nIHNjcmlwdCBlbmdpbmUgKi8KLSAgICBwcml2YXRlIEdyb292eVNjcmlwdEVuZ2luZSBzY3JpcHRFbmdpbmU7Ci0KLSAgICAvKioKLSAgICAgKiB0aGEgY29uc3RydWN0b3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdFVybAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25HdWlCdWlsZGVyKFN0cmluZyByb290VXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzY3JpcHRFbmdpbmUgPSBuZXcgR3Jvb3Z5U2NyaXB0RW5naW5lKHJvb3RVcmwpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBncm9vdnkuc3d0LlN3dEJ1aWxkZXIjcmVnaXN0ZXJXaWRnZXRzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldpZGdldHMoKSB7Ci0gICAgICAgIHN1cGVyLnJlZ2lzdGVyV2lkZ2V0cygpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInJlYnVpbGQiLCBuZXcgUmVidWlsZEZhY3RvcnkodGhpcykpOwotICAgICAgICByZWdpc3RlckZhY3RvcnkoInJ1blNjcmlwdCIsIG5ldyBSdW5TY3JpcHRGYWN0b3J5KHRoaXMpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzY3JpcHRFbmdpbmUuCi0gICAgICovCi0gICAgcHVibGljIEdyb292eVNjcmlwdEVuZ2luZSBnZXRTY3JpcHRFbmdpbmUoKSB7Ci0gICAgICAgIHJldHVybiBzY3JpcHRFbmdpbmU7Ci0gICAgfQotCi0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZ3VpYnVpbGRlci9SZWJ1aWxkRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvUmVidWlsZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNTdmOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvZ3VpYnVpbGRlci9SZWJ1aWxkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE3LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5zd3QuZ3VpYnVpbGRlcjsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGdyb292eS5zd3QuSW52YWxpZFBhcmVudEV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUmVidWlsZCBhIHN3dCB3aWRnZXQgYnkgZmlyc3QgZGlzcG9zaW5nIGFsbCBjaGlsZHJlbgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPiAKLSAqICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFJlYnVpbGRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTd3RGYWN0b3J5IGltcGxlbWVudHMgU3d0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uR3VpQnVpbGRlciBndWlCdWlsZGVyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJ1aWxkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVidWlsZEZhY3RvcnkoQXBwbGljYXRpb25HdWlCdWlsZGVyIGd1aUJ1aWxkZXIpIHsKLSAgICAgICAgdGhpcy5ndWlCdWlsZGVyID0gZ3VpQnVpbGRlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2V0IHBhcmVudAotICAgICAgICBpZiggcHJvcGVydGllcy5jb250YWluc0tleSgicGFyZW50IikgKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSBwcm9wZXJ0aWVzLnJlbW92ZSgicGFyZW50Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmVudEV4Y2VwdGlvbigibm90IG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIFN3dFV0aWxzLmdldFBhcmVudFdpZGdldChwYXJlbnQsIHByb3BlcnRpZXMpOwotICAgICAgICBpZiAocGFyZW50Q29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oInBhcmVudCIsIFJlYnVpbGRGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBndWlCdWlsZGVyLnNldEN1cnJlbnQocGFyZW50Q29tcG9zaXRlKTsKLQotICAgICAgICAvLyBnZXQgY2xvc3VyZQotICAgICAgICBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSkgcHJvcGVydGllcy5yZW1vdmUoImNsb3N1cmUiKTsKLSAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiY2xvc3VyZSIsIFJlYnVpbGRGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYnVpbGQgJiBwYWNrIHdpZGdldHMKLSAgICAgICAgU3d0VXRpbHMuZGlzcG9zZUNoaWxkcmVuKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3Qgb2JqID0gY2xvc3VyZS5jYWxsKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAgICAgICAgICgoQ29tcG9zaXRlKSBvYmopLmxheW91dCgpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudENvbXBvc2l0ZS5sYXlvdXQoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvUnVuU2NyaXB0RmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2d1aWJ1aWxkZXIvUnVuU2NyaXB0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzYyNDEyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9ndWlidWlsZGVyL1J1blNjcmlwdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDQKLSAqICAKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0Lmd1aWJ1aWxkZXI7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFV0aWxzOwotaW1wb3J0IGdyb292eS5zd3QuZmFjdG9yeS5BYnN0cmFjdFN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5mYWN0b3J5LlN3dEZhY3Rvcnk7Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgZ3Jvb3Z5LnV0aWwuU2NyaXB0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUnVuIGFub3RoZXIgc2NyaXB0Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZjpja2wgYXQgZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+IAotICogJElkJAotICovCi1wdWJsaWMgY2xhc3MgUnVuU2NyaXB0RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U3d0RmFjdG9yeSBpbXBsZW1lbnRzIFN3dEZhY3RvcnkgewotCi0gICAgLyoqIHRoZSBsb2dnZXIgKi8KLSAgICBwcml2YXRlIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIC8qKiB0aGUgYnVpbGRlciAqLwotICAgIHByaXZhdGUgQXBwbGljYXRpb25HdWlCdWlsZGVyIGd1aUJ1aWxkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2NyaXB0RW5naW5lCi0gICAgICovCi0gICAgcHVibGljIFJ1blNjcmlwdEZhY3RvcnkoQXBwbGljYXRpb25HdWlCdWlsZGVyIGd1aUJ1aWxkZXIpIHsKLSAgICAgICAgdGhpcy5ndWlCdWlsZGVyID0gZ3VpQnVpbGRlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnN3dC5mYWN0b3J5LkFic3RyYWN0U3d0RmFjdG9yeSNuZXdJbnN0YW5jZShqYXZhLnV0aWwuTWFwLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKE1hcCBwcm9wZXJ0aWVzLCBPYmplY3QgcGFyZW50KSB0aHJvd3MgR3Jvb3Z5RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBnZXQgc3JjCi0gICAgICAgIFN0cmluZyBzcmMgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZSgic3JjIik7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigic3JjIiwgUnVuU2NyaXB0RmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYmluZGluZwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgcHJvcGVydGllcy5yZW1vdmUoImJpbmRpbmciKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgcGFyZW50IGNvbXBvc2l0ZQotICAgICAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMucmVtb3ZlKCJwYXJlbnQiKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBTd3RVdGlscy5nZXRQYXJlbnRXaWRnZXQob2JqLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRDb21wb3NpdGUgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBTd3RVdGlscy5nZXRQYXJlbnRXaWRnZXQoZ3VpQnVpbGRlci5nZXRDdXJyZW50KCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOwotICAgICAgICB9Ci0gICAgICAgIGd1aUJ1aWxkZXIuc2V0Q3VycmVudChwYXJlbnRDb21wb3NpdGUpOwotCi0gICAgICAgIC8vIGRpc3Bvc2UgY2hpbGRyZW4KLSAgICAgICAgQm9vbGVhbiByZWJ1aWxkID0gKEJvb2xlYW4pIHByb3BlcnRpZXMucmVtb3ZlKCJyZWJ1aWxkIik7Ci0gICAgICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiByZWJ1aWxkICE9IG51bGwgJiYgcmVidWlsZC5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgU3d0VXRpbHMuZGlzcG9zZUNoaWxkcmVuKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBydW4gc2NyaXB0Ci0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBydW5TY3JpcHQoc3JjLCBwYXJlbnRDb21wb3NpdGUsIGJpbmRpbmcpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJTY3JpcHQgcmV0dXJucyBudWxsOiAiICsgc3JjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aWRnZXQKLSAgICAgKiBAcGFyYW0gc2NyaXB0Ci0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBydW5TY3JpcHQoU3RyaW5nIHNjcmlwdCwgQ29tcG9zaXRlIHBhcmVudCwgQmluZGluZyBiaW5kaW5nKQotICAgICAgICAgICAgdGhyb3dzIEdyb292eUV4Y2VwdGlvbiwgUmVzb3VyY2VFeGNlcHRpb24sIFNjcmlwdEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gc2NyaXB0IGJpbmRpbmcKLSAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgiZ3VpQnVpbGRlciIsIGd1aUJ1aWxkZXIpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoInBhcmVudCIsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3Qgb2JqID0gZ3VpQnVpbGRlci5nZXRTY3JpcHRFbmdpbmUoKS5ydW4oc2NyaXB0LCBiaW5kaW5nKTsKLQotICAgICAgICAvLyBsYXlvdXQgd2lkZ2V0Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50LmxheW91dCgpOwotICAgICAgICB9IGVsc2UgaWYgKG9iaiAhPSBudWxsICYmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICAoKENvbXBvc2l0ZSkgb2JqKS5sYXlvdXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0V4cGFuc2lvbkxpc3RlbmVySW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvRXhwYW5zaW9uTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDdhNmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvRXhwYW5zaW9uTGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjgsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5pbXBsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JRXhwYW5zaW9uTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEV4cGFuc2lvbkxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIElFeHBhbnNpb25MaXN0ZW5lciwgQ2xvc3VyZVN1cHBvcnR7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICBwcml2YXRlIENsb3N1cmUgY2xvc3VyZTsKLQotICAgIHB1YmxpYyBFeHBhbnNpb25MaXN0ZW5lckltcGwoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbG9zdXJlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlKQotICAgIHsKLSAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkxpc3RlbmVyI2V4cGFuc2lvblN0YXRlQ2hhbmdpbmcob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdpbmcoRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiTm8gY2xvc3VyZSBoYXMgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIExpc3RlbmVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJleHBhbnNpb25TdGF0ZUNoYW5naW5nIi5lcXVhbHModHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsb3N1cmUuY2FsbChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkxpc3RlbmVyI2V4cGFuc2lvblN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgiZXhwYW5zaW9uU3RhdGVDaGFuZ2VkIi5lcXVhbHModHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsb3N1cmUuY2FsbChldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvaW1wbC9IeXBlckxpbmtMaXN0ZW5lckltcGwuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0h5cGVyTGlua0xpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ3OThmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0h5cGVyTGlua0xpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDI4LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5zd3QuaW1wbDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotCi0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEh5cGVyTGlua0xpc3RlbmVySW1wbCBpbXBsZW1lbnRzIElIeXBlcmxpbmtMaXN0ZW5lciwgQ2xvc3VyZVN1cHBvcnQgewotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmU7Ci0KLSAgICBwdWJsaWMgSHlwZXJMaW5rTGlzdGVuZXJJbXBsKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50Lkh5cGVybGlua0xpc3RlbmVyI2h5cGVybGlua1VwZGF0ZShqYXZheC5zd2luZy5ldmVudC5IeXBlcmxpbmtFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoeXBlcmxpbmtVcGRhdGUoSHlwZXJsaW5rRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiTm8gY2xvc3VyZSBoYXMgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIExpc3RlbmVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJoeXBlcmxpbmtVcGRhdGUiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rTGlzdGVuZXIjbGlua0VudGVyZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgibGlua0VudGVyZWQiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rTGlzdGVuZXIjbGlua0V4aXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJObyBjbG9zdXJlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgTGlzdGVuZXIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImxpbmtFeGl0ZWQiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rTGlzdGVuZXIjbGlua0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJObyBjbG9zdXJlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgTGlzdGVuZXIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImxpbmtBY3RpdmF0ZWQiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmQyZWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvTGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTYsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5pbXBsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBMaXN0ZW5lciwgQ2xvc3VyZVN1cHBvcnQgewotICAgIHByaXZhdGUgQ2xvc3VyZSBjbG9zdXJlOwotCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsb3N1cmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZShDbG9zdXJlIGNsb3N1cmUpIHsKLSAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJObyBjbG9zdXJlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgTGlzdGVuZXIiKTsKLSAgICAgICAgfQotICAgICAgICBjbG9zdXJlLmNhbGwoZXZlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0xvY2F0aW9uTGlzdGVuZXJJbXBsLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy9tYWluL2dyb292eS9zd3QvaW1wbC9Mb2NhdGlvbkxpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVjYWFlLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL0xvY2F0aW9uTGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIGdyb292eS5zd3QuaW1wbDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LnN3dC5DbG9zdXJlU3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgYSBMb2NhdGlvbkxpc3RlbmVyIHRvIGEgYnJvd3NlciB3aWRnZXQKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2tsQGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25MaXN0ZW5lckltcGwgaW1wbGVtZW50cyBMb2NhdGlvbkxpc3RlbmVyLCBDbG9zdXJlU3VwcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgcHJpdmF0ZSBDbG9zdXJlIGNsb3N1cmU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBMb2NhdGlvbkxpc3RlbmVySW1wbChTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIjY2hhbmdpbmcob3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25FdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOyAKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgiY2hhbmdpbmciLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5zZXRQcm9wZXJ0eSgiZXZlbnQiLCBuZXcgQ3VzdG9tTG9jYXRpb25FdmVudChldmVudCkpOwotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIjY2hhbmdlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBBY3Rpb24iKTsgCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoImNoYW5nZWQiLmVxdWFscyh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2xvc3VyZS5zZXRQcm9wZXJ0eSgiZXZlbnQiLCBuZXcgQ3VzdG9tTG9jYXRpb25FdmVudChldmVudCkpOwotICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBDdXN0b21Mb2NhdGlvbkV2ZW50IHsKLQotICAgICAgICBwcml2YXRlIExvY2F0aW9uRXZlbnQgZXZlbnQ7Ci0KLSAgICAgICAgcHVibGljIEN1c3RvbUxvY2F0aW9uRXZlbnQoTG9jYXRpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudC5sb2NhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvUHJvZ3Jlc3NMaXN0ZW5lckltcGwuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL1Byb2dyZXNzTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NWEwNWIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvUHJvZ3Jlc3NMaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5pbXBsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBhIFByb2dyZXNzTGlzdGVuZXIgdG8gYSBicm93c2VyIHdpZGdldAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc0xpc3RlbmVySW1wbCBpbXBsZW1lbnRzIFByb2dyZXNzTGlzdGVuZXIsIENsb3N1cmVTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgQ2xvc3VyZSBjbG9zdXJlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFByb2dyZXNzTGlzdGVuZXJJbXBsKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsb3N1cmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZShDbG9zdXJlIGNsb3N1cmUpIHsKLSAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lciNjaGFuZ2VkKG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCkgeyAKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiTm8gY2xvc3VyZSBoYXMgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIExpc3RlbmVyIik7IAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCJjaGFuZ2VkIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIGNsb3N1cmUuc2V0UHJvcGVydHkoImV2ZW50IiwgbmV3IEN1c3RvbVByb2dyZXNzRXZlbnQoZXZlbnQpKTsKLSAgICAgICAgICAgIGNsb3N1cmUuY2FsbChldmVudCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyI2NvbXBsZXRlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOyAKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgiY29tcGxldGVkIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIGNsb3N1cmUuc2V0UHJvcGVydHkoImV2ZW50IiwgbmV3IEN1c3RvbVByb2dyZXNzRXZlbnQoZXZlbnQpKTsKLSAgICAgICAgICAgIGNsb3N1cmUuY2FsbChldmVudCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBDdXN0b21Qcm9ncmVzc0V2ZW50IHsKLQotICAgICAgICBwcml2YXRlIFByb2dyZXNzRXZlbnQgZXZlbnQ7Ci0KLSAgICAgICAgcHVibGljIEN1c3RvbVByb2dyZXNzRXZlbnQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotICAgICAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDdXJyZW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmN1cnJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFRvdGFsKCkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnRvdGFsOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvU3RhdHVzVGV4dExpc3RlbmVySW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvbWFpbi9ncm9vdnkvc3d0L2ltcGwvU3RhdHVzVGV4dExpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhjZWFiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL21haW4vZ3Jvb3Z5L3N3dC9pbXBsL1N0YXR1c1RleHRMaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5pbXBsOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkuc3d0LkNsb3N1cmVTdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgYSBTdGF0dXNUZXh0TGlzdGVuZXIgdG8gYSBicm93c2VyIHdpZGdldAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c1RleHRMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBTdGF0dXNUZXh0TGlzdGVuZXIsIENsb3N1cmVTdXBwb3J0IHsKLQotICAgIHByaXZhdGUgQ2xvc3VyZSBjbG9zdXJlOwotCi0gICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lciNjaGFuZ2VkKG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIGlmIChjbG9zdXJlID09IG51bGwpIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBMaXN0ZW5lciIpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2xvc3VyZS5zZXRQcm9wZXJ0eSgiZXZlbnQiLCBuZXcgQ3VzdG9tU3RhdHVzVGV4dEV2ZW50KGV2ZW50KSk7Ci0gICAgICAgIGNsb3N1cmUuY2FsbChldmVudCk7Ci0gICAgfQotCi0JcHVibGljIGNsYXNzIEN1c3RvbVN0YXR1c1RleHRFdmVudAotCXsKLQkJcHJpdmF0ZSBTdGF0dXNUZXh0RXZlbnQgZXZlbnQ7Ci0JCQotCQlwdWJsaWMgQ3VzdG9tU3RhdHVzVGV4dEV2ZW50KFN0YXR1c1RleHRFdmVudCBldmVudCkKLQkJewotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotCQl7Ci0JCQlyZXR1cm4gZXZlbnQudGV4dDsKLQkJfQotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvamZhY2UvSkZhY2VCdWlsZGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvamZhY2UvSkZhY2VCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQwODBkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L2pmYWNlL0pGYWNlQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA2LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5qZmFjZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBncm9vdnkuc3d0LlN3dFRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZjpja2wgYXQgZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+IAotICogJElkJAotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3d0VGVzdCBkZW1vID0gbmV3IFN3dFRlc3QoKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2pmYWNlL0pGYWNlQnVpbGRlclRlc3QxLmdyb292eSIpOwotICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJydW4iLCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9qZmFjZS9KRmFjZUJ1aWxkZXJUZXN0MS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9qZmFjZS9KRmFjZUJ1aWxkZXJUZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZjUyZDkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvamZhY2UvSkZhY2VCdWlsZGVyVGVzdDEuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuamZhY2UNCi0NCi1pbXBvcnQgZ3Jvb3Z5LmpmYWNlLkpGYWNlQnVpbGRlcg0KLQ0KLWNsYXNzIEpGYWNlQnVpbGRlclRlc3QxIHsNCi0gICAgcHJvcGVydHkgamZhY2UgICAgDQotICAgIHZvaWQgcnVuKCkgew0KLSAgICAgICAgamZhY2UgPSBuZXcgSkZhY2VCdWlsZGVyKCkNCi0gICAgICAgICAgICAgICANCi0gICAgICAgIGpmYWNlLmFwcGxpY2F0aW9uV2luZG93KCkgew0KLSAgICAgICAgCXRvb2xCYXJNYW5hZ2VyKCkNCi0gICAgICAgIA0KLSAgICAgICAgCS8vIFZpZXdlcnMNCi0gICAgICAgIAl0YWJsZVZpZXdlcigpIHsNCi0gICAgICAgIAkJZG91YmxlQ2xpY2tMaXN0ZW5lcigpDQotICAgICAgIAkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpDQotICAgICAgICAJfQ0KLSAgICAgICAgCQ0KLSAgICAgICAgCXRhYmxlIHsNCi0JCQkJdGFibGVWaWV3ZXIoKQ0KLSAgICAgICAgCX0NCi0gICAgICAgIAkNCi0gICAgICAgIAl0YWJsZVRyZWVWaWV3ZXIoKQ0KLSAgICAgICAgCXRhYmxldHJlZSB7DQotICAgICAgICAJCXRhYmxlVHJlZVZpZXdlcigpDQotICAgICAgICAJfQ0KLSAgICAgICAgCQ0KLSAgICAgICAgCXRyZWVWaWV3ZXIoKQ0KLSAgICAgICAgCXRyZWUgew0KLSAgICAgICAgCQl0cmVlVmlld2VyKCkNCi0gICAgICAgIAl9CQ0KLSAgICAgICAgCQ0KLSAgICAgICAgCWNoZWNrYm94VHJlZVZpZXdlcigpDQotICAgICAgICAJdHJlZSB7DQotCSAgICAgICAgCWNoZWNrYm94VHJlZVZpZXdlcigpCQ0KLSAgICAgICAgCX0NCi0NCi0gICAgICAgIAkvLyBDb250cmlidXRpb25NYW5hZ2VyIA0KLSAgICAgICAgCW1lbnVNYW5hZ2VyKCB0ZXh0OiJtZW51TWFuYWdlciIgKQ0KLSAgICAgICAgCQ0KLSAgICAgICAgCS8vIEFjdGlvbiB0YWdzDQotICAgICAgICAJYWN0aW9uKCkNCi0NCi0gICAgICAgIAkvLyBDb250cmlidXRpb25JdGVtIA0KLSAgICAgICAgCXNlcGFyYXRvcigpDQotDQotICAgICAgICAJLy8gV2l6YXJkIA0KLSAgICAgICAgCXdpemFyZERpYWxvZygpew0KLSAgICAgICAgCQl3aXphcmRQYWdlKCB0aXRsZToidGl0bGUiICkNCi0gICAgICAgIAl9DQotDQotICAgICAgICAJLy8gUHJlZmVyZW5jZXMNCi0gICAgICAgIAlwcmVmZXJlbmNlRGlhbG9nKCAgKSB7DQotICAgICAgICAJCXByZWZlcmVuY2VQYWdlKCBmaWxlbmFtZToic3JjL3Rlc3QvZ3Jvb3Z5L2pmYWNlL3Rlc3QucHJvcGVydGllcyIsIHRpdGxlOiJteXByZWZzIiApIHsNCi0JICAgICAgICAJCWJvb2xlYW5GaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJwcm9wIiwgdGl0bGU6Im5vbmUiICkNCi0gICAgCSAgICAJCWNvbG9yRmllbGRFZGl0b3IoIHByb3BlcnR5TmFtZToicHJvcCIsIHRpdGxlOiJub25lIiApDQotICAgCQkJCQlkaXJlY3RvcnlGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJwcm9wIiwgdGl0bGU6Im5vbmUiICkNCi0JICAgICAgICAJCWZpbGVGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJwcm9wIiwgdGl0bGU6Im5vbmUiICkNCi0JICAgICAgICAJCWZvbnRGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJwcm9wIiwgdGl0bGU6Im5vbmUiICkNCi0gICAgCSAgICAJCWludGVnZXJGaWVsZEVkaXRvciggcHJvcGVydHlOYW1lOiJwcm9wIiwgdGl0bGU6Im5vbmUiICkNCi0gICAgCSAgICAJCXN0cmluZ0ZpZWxkRWRpdG9yKCBwcm9wZXJ0eU5hbWU6InByb3AiLCB0aXRsZToibm9uZSIgKQ0KLSAgICAJICAgIAl9DQotICAgIAkgICAgfQ0KLQ0KLSAgICAgICAgCWltYWdlKCBzcmM6InNyYy90ZXN0L2dyb292eS9zd3QvZ3Jvb3Z5LWxvZ28ucG5nIiApDQotICAgICAgICB9DQotCX0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvamZhY2UvdGVzdC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvamZhY2UvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L2pmYWNlL3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3QvU3d0QnVpbGRlclRlc3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9Td3RCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDllNTJjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9Td3RCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDYsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5LnN3dDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmOmNrbCBhdCBkYWNlbG8ubmwiPkNocmlzdGlhYW4gdGVuIEtsb29zdGVyIDwvYT4gCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBTd3RCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3d0VGVzdCBkZW1vID0gbmV3IFN3dFRlc3QoKTsKLSAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9Td3RCdWlsZGVyVGVzdDEuZ3Jvb3Z5Iik7Ci0gICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9Td3RCdWlsZGVyVGVzdDEuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L1N3dEJ1aWxkZXJUZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDZmNjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L1N3dEJ1aWxkZXJUZXN0MS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkuc3d0DQotDQotaW1wb3J0IGdyb292eS5zd3QuU3d0QnVpbGRlcg0KLQ0KLWNsYXNzIFN3dEJ1aWxkZXJUZXN0MSB7DQotICAgIHByb3BlcnR5IHN3dCAgICANCi0gICAgdm9pZCBydW4oKSB7DQotICAgICAgICBzd3QgPSBuZXcgU3d0QnVpbGRlcigpDQotICAgICAgICBzd3Quc2hlbGwoKXsgICAgICAgIAkNCi0gICAgICAgCQlidXR0b24oKQ0KLSAgICAgICAgCWNhbnZhcygpDQotICAgICAgICAJY2FyZXQoKQ0KLQkgICAgICAgIGNvbWJvKCkNCi0gICAgICAgIAljb21wb3NpdGUoKQ0KLSAgICAgICAgCXNjcm9sbGVkQ29tcG9zaXRlKCkNCi0gICAgICAgIAljb29sQmFyKCkgew0KLQkgICAgICAgIAljb29sSXRlbSgpDQotCSAgICAgICAgfQ0KLSAgICAgICAgCWRlY29yYXRpb25zKCkNCi0gICAgICAgIAlncm91cCgpDQotICAgICAgICAJbGFiZWwoKQ0KLSAgICAgICAgCWxpc3QoKQ0KLSAgICAgICAgCWxpbmsoKQ0KLSAgICAgICAgCW1lbnUoKSB7DQotCQkJCW1lbnVTZXBhcmF0b3IoKQ0KLQkJCQltZW51SXRlbSgpDQotCQkJfQ0KLQkJCW1lc3NhZ2VCb3goKQ0KLQkJCXByb2dyZXNzQmFyKCkNCi0JCQlzYXNoKCkNCi0JCQlzY2FsZSgpDQotCQkJc2xpZGVyKCkNCi0JCQl0YWJGb2xkZXIoKSB7DQotCQkJCXRhYkl0ZW0oKQ0KLQkJCX0NCi0JCQl0YWJsZSgpIHsNCi0JCQkJdGFibGVDb2x1bW4oKQ0KLQkJCQl0YWJsZUl0ZW0oKQ0KLQkJCX0NCi0JCQl0ZXh0KCkNCi0JCQl0b29sQmFyKCl7DQotCQkJCXRvb2xJdGVtKCkNCi0JCQl9DQotCQkJdHJhY2tlcigpDQotCQkJdHJheSgpIHsNCi0JCQkJdHJheUl0ZW0oKQ0KLQkJCX0NCi0JCQl0cmVlKCl7DQotCQkJCXRyZWVJdGVtKCkNCi0JCQl9DQotCQkJY0Jhbm5lcigpDQotICAgICAgICAJY0NvbWJvKCkNCi0JCQljTGFiZWwoKQ0KLQkJCWNUYWJGb2xkZXIoKSB7DQotCQkJCWNUYWJJdGVtKCkNCi0JCQl9DQotCQkJdGFibGVUcmVlKCkgew0KLQkJCQl0YWJsZVRyZWVJdGVtKCkNCi0JCQl9DQotCQkJZmlsbExheW91dCgpDQotCQkJZ3JpZExheW91dCgpDQotCQkJcm93TGF5b3V0KCkNCi0JCQlncmlkRGF0YSgpDQotCQkJcm93RGF0YSgpDQotCQkJY29sb3JEaWFsb2coKQ0KLQkJCWRpcmVjdG9yeURpYWxvZygpDQotCQkJZmlsZURpYWxvZygpDQotCQkJZm9udERpYWxvZygpDQotCQkJb25FdmVudCggdHlwZToiU2VsZWN0aW9uIiApDQotCQkJb25FdmVudCggdHlwZToiUGFpbnQiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJEZWZhdWx0U2VsZWN0aW9uIiApDQotCQkJb25FdmVudCggdHlwZToiRGlzcG9zZSIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6IkZvY3VzSW4iICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJGb2N1c091dCIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6IkhpZGUiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJTaG93IiApDQotCQkJb25FdmVudCggdHlwZToiS2V5RG93biIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6IktleVVwIiApDQotCQkJb25FdmVudCggdHlwZToiTW91c2VEb3duIiApDQotCQkJb25FdmVudCggdHlwZToiTW91c2VVcCIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6Ik1vdXNlRG91YmxlQ2xpY2siICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJNb3VzZU1vdmUiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJSZXNpemUiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJNb3ZlIiApDQotCQkJb25FdmVudCggdHlwZToiQ2xvc2UiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJBY3RpdmF0ZSIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6Ikljb25pZnkiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJEZWljb25pZnkiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJEZWFjdGl2YXRlIiApDQotCQkJb25FdmVudCggdHlwZToiRXhwYW5kIiApDQotCQkJb25FdmVudCggdHlwZToiQ29sbGFwc2UiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJNb2RpZnkiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJWZXJpZnkiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJIZWxwIiApDQotCQkJb25FdmVudCggdHlwZToiQXJtIiApDQotCQkJb25FdmVudCggdHlwZToiTW91c2VFeGl0IiApDQotCQkJb25FdmVudCggdHlwZToiTW91c2VFbnRlciIgKQ0KLQkJCW9uRXZlbnQoIHR5cGU6Ik1vdXNlSG92ZXIiICkNCi0JCQlvbkV2ZW50KCB0eXBlOiJUcmF2ZXJzZSIgKQ0KLQkJCWltYWdlKCBzcmM6InNyYy90ZXN0L2dyb292eS9zd3QvZ3Jvb3Z5LWxvZ28ucG5nIiApDQotCQkJYnJvd3NlcigpIHsNCi0JCQkJbG9jYXRpb25MaXN0ZW5lcigpDQotCQkJCXByb2dyZXNzTGlzdGVuZXIoKQ0KLQkJCQlzdGF0dXNUZXh0TGlzdGVuZXIoKQ0KLQkJCX0JDQotCQkJZm9ybSgpew0KLQkJCQl0b29sQmFyTWFuYWdlcigpDQotCQkJCQ0KLQkJCQlmb3JtQnV0dG9uKCkNCi0JCQkJZm9ybUNvbXBvc2l0ZSgpDQotCQkJCWZvcm1Db21wb3NpdGVTZXBhcmF0b3IoKQ0KLQkJCQlmb3JtRXhwYW5kYWJsZUNvbXBvc2l0ZSgpDQotCQkJCWZvcm1UZXh0KCkNCi0JCQkJZm9ybUh5cGVybGluaygpew0KLQkJCQkJaHlwZXJsaW5rTGlzdGVuZXIoKQ0KLQkJCQl9DQotCQkJCWZvcm1JbWFnZUh5cGVybGluaygpDQotCQkJCWZvcm1MYWJlbCgpDQotCQkJCWZvcm1QYWdlQm9vaygpDQotCQkJCWZvcm1TZWN0aW9uKCl7DQotCQkJCQlleHBhbnNpb25MaXN0ZW5lcigpDQotCQkJCX0NCi0JCQkJZm9ybVNlcGFyYXRvcigpDQotCQkJCWZvcm1UYWJsZSgpDQotCQkJCWZvcm1Gb3JtYXR0ZWRUZXh0KCkNCi0JCQkJZm9ybVRyZWUoKQ0KLQkJCQl0YWJsZVdyYXBMYXlvdXQoKQ0KLQkJCQl0YWJsZVdyYXBEYXRhKCkNCi0JCQl9DQotCQkJc2Nyb2xsZWRGb3JtKCkNCi0gICAgICAgIH0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3QvU3d0VGVzdC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L1N3dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNTU2Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3QvU3d0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDI1LCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIGdyb292eS5zd3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBTd3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBHcm9vdnlPYmplY3QgY29tcGlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhuZXcgRmlsZShmaWxlTmFtZSkpOwotICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gKEdyb292eU9iamVjdCkgZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3QgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTd3QoKSB7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0gICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEpGYWNlKCkgewotICAgICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotICAgICAgICBBcHBsaWNhdGlvbldpbmRvdyB3aW5kb3cgPSBuZXcgQXBwbGljYXRpb25XaW5kb3coc2hlbGwpOwotICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L2dyb292eS1sb2dvLnBuZyBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9ncm9vdnktbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWY0YzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L2dyb292eS1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9zY3JhcGJvb2svRHluYW1pY1VJQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L3NjcmFwYm9vay9EeW5hbWljVUlCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTAzYTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L3NjcmFwYm9vay9EeW5hbWljVUlCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNywgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0LnNjcmFwYm9vazsKLQotaW1wb3J0IGdyb292eS5qZmFjZS5KRmFjZUJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZjpja2wgYXQgZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlcjwvYT4gCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljVUlCdWlsZGVyIGV4dGVuZHMgSkZhY2VCdWlsZGVyIHsKLSAgICBwdWJsaWMgRHluYW1pY1VJQnVpbGRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQjY3JlYXRlTm9kZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSkgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlTm9kZTogIiArIG5hbWUpOwotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlTm9kZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBAc2VlIGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0I2NyZWF0ZU5vZGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlTm9kZTogIiArIG5hbWUgKyAiIFthdHRyaWJ1dGVzOl0gICIgKyBhdHRyaWJ1dGVzKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZU5vZGUobmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNjcmVhdGVOb2RlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgcGFyZW50KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlTm9kZTogIiArIG5hbWUgKyAiIFtwYXJlbnQ6XSAiICsgcGFyZW50KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZU5vZGUobmFtZSwgcGFyZW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9zY3JhcGJvb2svTmFtZWRPYmplY3QuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eS1zd3Qvc3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9zY3JhcGJvb2svTmFtZWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwMmM1My4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3Qvc2NyYXBib29rL05hbWVkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNywgMjAwNAotICoKLSAqLwotcGFja2FnZSBncm9vdnkuc3d0LnNjcmFwYm9vazsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY6Y2tsIGF0IGRhY2Vsby5ubCI+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXIgPC9hPiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE9iamVjdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICJlbXB0eSBuYW1lIjsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9ICJlbXB0eSBkZXNjIjsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9ICJlbXB0eSB2YWx1ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3Qvc2NyYXBib29rL05hbWVkT2JqZWN0VUkuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L3NjcmFwYm9vay9OYW1lZE9iamVjdFVJLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4M2YxZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3Qvc2NyYXBib29rL05hbWVkT2JqZWN0VUkuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotDQotYnVpbGRlci5jb21wb3NpdGUoIHBhcmVudCApIHsNCi0NCi0JZ3JpZExheW91dCggbnVtQ29sdW1uczoyICkNCi0JDQotCWdyaWREYXRhKCBzdHlsZToiZmlsbF9ib3RoIiApDQotCWxhYmVsKCBzdHlsZToibm9uZSIsIHRleHQ6b2JqLmRlc2NyaXB0aW9uICkgew0KLQkJZ3JpZERhdGEoIHN0eWxlOiJmaWxsX2JvdGgiICkNCi0JfQ0KLSAgICAgICAgCQ0KLQl0ZXh0KCBzdHlsZToiQm9yZGVyIiwgdGV4dDpvYmoudmFsdWUgKSANCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXN3dC9zcmMvdGVzdC9ncm9vdnkvc3d0L3NjcmFwYm9vay9SdW5EeW5hbWljVUlEZW1vLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3Qvc2NyYXBib29rL1J1bkR5bmFtaWNVSURlbW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxOWM2Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnktc3d0L3NyYy90ZXN0L2dyb292eS9zd3Qvc2NyYXBib29rL1J1bkR5bmFtaWNVSURlbW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5LnN3dC5zY3JhcGJvb2s7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotaW1wb3J0IGdyb292eS5zd3QuU3d0VGVzdDsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlTY3JpcHRFbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpja2xAZGFjZWxvLm5sIj5DaHJpc3RpYWFuIHRlbiBLbG9vc3RlciA8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5EeW5hbWljVUlEZW1vIGV4dGVuZHMgU3d0VGVzdCB7Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVkT2JqZWN0IG5hbWVkT2JqZWN0ID0gbmV3IE5hbWVkT2JqZWN0KCk7Ci0gICAgICAgIAotLy8gICAgICAgIFNoZWxsIHBhcmVudCA9IG5ldyBTaGVsbCgpOwotICAgICAgICBEeW5hbWljVUlCdWlsZGVyIGJ1aWxkZXIgID0gbmV3IER5bmFtaWNVSUJ1aWxkZXIoKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSAoU2hlbGwpIGJ1aWxkZXIuY3JlYXRlTm9kZSgic2hlbGwiKTsKLSAgICAgICAgCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoIm9iaiIsIG5hbWVkT2JqZWN0KTsKLSAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgiYnVpbGRlciIsIGJ1aWxkZXIpOwotICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJwYXJlbnQiLCBzaGVsbCk7Ci0gICAgICAgIAotICAgICAgICBHcm9vdnlTY3JpcHRFbmdpbmUgc2NyaXB0RW5naW5lID0gbmV3IEdyb292eVNjcmlwdEVuZ2luZSgic3JjL3Rlc3QvZ3Jvb3Z5L3N3dC9keW5hbXZjLyIpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc2NyaXB0RW5naW5lLnJ1bigiTmFtZWRPYmplY3RVSS5ncm9vdnkiLCBiaW5kaW5nKTsKLQotICAgICAgICBzaGVsbC5vcGVuKCk7Ci0gICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXNoZWxsLmdldERpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkgewotICAgICAgICAgICAgICAgIHNoZWxsLmdldERpc3BsYXkoKS5zbGVlcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9DaGFuZ2VMb2cgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiY2FjMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVHVlIEZlYiAyMSAyMDo1ODoxMyBDRVQgMjAwNiBHdWlsbGF1bWUgQWxsZW9uIDxndWlsbGF1bWUuYWxsZW9uQGdtYWlsLmNvbT4KLQotCSogQ3JlYXRpb24gb2YgdGhlIG5ldyBnc29hcCBtb2R1bGUKLQotU3VuIEFwciAyMyAxMDo0OToyNiBDRVQgMjAwNiBHdWlsbGF1bWUgQWxsZW9uIDxndWlsbGF1bWUuYWxsZW9uQGdtYWlsLmNvbT4KLQotCSogUmVuYW1lIG1vZHVsZSBnc29hcCBpbiBncm9vdnkubmV0Lmdyb292eXNvYXAKLSAgICAgICAgKiBBZGQgY2FwYWJpbGl0eSB0byBkZWZpbmUgV2ViU2VydmljZSBmcm9tIFBsYWluIEdyb292eSBTY3JpcHQKLSAgICAgICAgKiBVcGdyYWRlIHRvIFhGaXJlLTEuMS1TTkFQU05PVCB0byBjb3JyZWN0IHNvbWUgYnVncyAoWEZJUkUtMzMxLCBYRklSRS0zNDMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL1JFQURNRS50eHQgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzU3OWQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotR0VUVElORyBTVEFSVEVECi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09IEluc3RhbGxpbmcgZ3NvYXAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIGJ1aWxkIHByb2Nlc3MgaXMgaGFuZGxlZCB0aHJvdWcgQW50LgotCi1JbiBvcmRlciB0byBidWlsZCBhbmQgdGVzdCBnc29hcHggcnVuCi0gID4gYW50IHJ1biAKLQotQSB0ZXN0IGlzIGxvY2F0ZWQgaW4gc3JjL3Rlc3QvVGVzdDEuZ3Jvb3Z5Ci1UZXN0IHJlc3VsdHMgYXJlIGxvY2F0ZWQgaW4gYnVpbGQvdGVzdC1yZXBvcnRzLwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSBVc2luZyBnc29hcAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DdXJyZW50bHkgdGhlcmUgaXMgbm8gZGVwbG95bWVudCBwcm9jZWR1cmUgOy0oCi1UaGUgZ3NvYXAgIGphcmZpbGUgaXMgbG9jYXRlZCBpbiBidWlsZC9qYXIgYW5kIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZCAKLWluIGxpYi8KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9UT0RPLnR4dCBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvVE9ETy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGUxOWUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9UT0RPLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKiBIYW5kbGUgcHJvcGVybHkgdGhlIG5hbWVzcGFjZXMKLQotKiBIYXZlIHlvdSBhbnkgc3VnZ2VzdGlvbiA/CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2J1aWxkLnByb3BlcnRpZXMgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3M2RkOTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBTYW1wbGUgUmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyBmaWxlCi1hY3RpdmF0aW9uLmphcj1saWIvYWN0aXZhdGlvbi0xLjAuMi5qYXIKLWFudGxyLmphcj1saWIvYW50bHItMi43LjUuamFyCi1hc20uamFyPWxpYi9hc20tMi4yLmphcgotYXNtLWFuYWx5c2lzLmphcj1saWIvYXNtLWFuYWx5c2lzLTIuMi5qYXIKLWFzbS1hdHRycy5qYXI9bGliL2FzbS1hdHRycy0yLjIuamFyCi1hc20tdHJlZS5qYXI9bGliL2FzbS10cmVlLTIuMi5qYXIKLWFzbS11dGlsLmphcj1saWIvYXNtLXV0aWwtMi4yLmphcgotY29tbW9ucy1jb2RlYy5qYXI9bGliL2NvbW1vbnMtY29kZWMtMS4zLmphcgotY29tbW9ucy1odHRwY2xpZW50Lmphcj1saWIvY29tbW9ucy1odHRwY2xpZW50LTMuMC5qYXIKLWNvbW1vbnMtbG9nZ2luZy5qYXI9bGliL2NvbW1vbnMtbG9nZ2luZy0xLjAuNC5qYXIKLWdyb292eS1hbGwuamFyPWxpYi9ncm9vdnktYWxsLTEuMC1SQy0wMS1TTkFQU0hPVC5qYXIKLWphcmphci5qYXI9bGliL2phcmphci0wLjcuamFyCi1qYXZhbWFpbC5qYXI9bGliL2phdmFtYWlsLTEuMy4yLmphcgotamF4ZW4uamFyPWxpYi9qYXhlbi0xLjEtYmV0YS04LmphcgotamRvbS5qYXI9bGliL2pkb20tMS4wLmphcgotbG9nNGouamFyPWxpYi9sb2c0ai0xLjIuOC5qYXIKLW9yZy5tb3J0YmF5LmpldHR5Lmphcj1saWIvb3JnLm1vcnRiYXkuamV0dHktNS4xLjMuamFyCi1zZXJ2bGV0YXBpLmphcj1saWIvc2VydmxldGFwaS0yLjMuamFyCi1zdGF4LWFwaS5qYXI9bGliL3N0YXgtYXBpLTEuMC5qYXIKLXdzZGw0ai5qYXI9bGliL3dzZGw0ai0xLjUuMi5qYXIKLXdzdHgtYXNsLmphcj1saWIvd3N0eC1hc2wtMi45LmphcgoteGZpcmUtYWVnaXMuamFyPWxpYi94ZmlyZS1hZWdpcy0xLjEuamFyCi14ZmlyZS1jb3JlLmphcj1saWIveGZpcmUtY29yZS0xLjEuamFyCi14ZmlyZS1qYXZhNS5qYXI9bGliL3hmaXJlLWphdmE1LTEuMS5qYXIKLXhmaXJlLXhtbGJlYW5zLmphcj1saWIveGZpcmUteG1sYmVhbnMtMS4xLmphcgotWG1sU2NoZW1hLmphcj1saWIvWG1sU2NoZW1hLTEuMC4yLmphcgotIwotamFyLmNvbXByZXNzPWZhbHNlCi0jCi14ZmlyZS5jbGFzc3BhdGg9XAotICAgICR7b3JnLm1vcnRiYXkuamV0dHkuamFyfTpcCi0gICAgJHtsb2c0ai5qYXJ9OlwKLSAgICAke3dzZGw0ai5qYXJ9OlwKLSAgICAke3hmaXJlLWNvcmUuamFyfTpcCi0gICAgJHt4ZmlyZS1qYXZhNS5qYXJ9OlwKLSAgICAke1htbFNjaGVtYS5qYXJ9OlwKLSAgICAke2NvbW1vbnMtbG9nZ2luZy5qYXJ9OlwKLSAgICAke3NlcnZsZXRhcGkuamFyfTpcCi0gICAgJHtzdGF4LWFwaS5qYXJ9OlwKLSAgICAke3dzdHgtYXNsLmphcn06XAotICAgICR7YWN0aXZhdGlvbi5qYXJ9OlwKLSAgICAke2phdmFtYWlsLmphcn06XAotICAgICR7amF4ZW4uamFyfTpcCi0gICAgJHtqZG9tLmphcn06XAotICAgICR7eGZpcmUtYWVnaXMuamFyfTpcCi0gICAgJHt4ZmlyZS14bWxiZWFucy5qYXJ9OlwKLSAgICAke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9OlwKLSAgICAke2NvbW1vbnMtY29kZWMuamFyfQotIwotZ3Jvb3Z5LmNsYXNzcGF0aD1cCi0gICAgJHtncm9vdnktYWxsLmphcn06XAotICAgICR7YXNtLmphcn06XAotICAgICR7YXNtLWFuYWx5c2lzLmphcn06XAotICAgICR7YXNtLWF0dHJzLmphcn06XAotICAgICR7YXNtLXRyZWUuamFyfTpcCi0gICAgJHthc20tdXRpbC5qYXJ9OlwKLSAgICAke2FudGxyLmphcn0KLSMKLWphdmFjLmNsYXNzcGF0aD1cCi0gICAke3hmaXJlLmNsYXNzcGF0aH06XAotICAgJHtncm9vdnkuY2xhc3NwYXRofQotIwotc3JjLmRpcj1zcmMvbWFpbi8KLXNyYy50ZXN0LmRpcj1zcmMvdGVzdC8KLWNsYXNzZXMuZGlyPSR7YnVpbGQuZGlyfS9jbGFzc2VzCi10ZXN0LmNsYXNzZXMuZGlyPSR7Y2xhc3Nlcy5kaXJ9L3Rlc3QKLWJ1aWxkLmRpcj1idWlsZAotamFyLmRpcj0ke2J1aWxkLmRpcn0vamFyCi1qYXZhZG9jLmRpcj1kb2MKLWphdmFkb2MucGFja2FnZXM9Imdyb292eS5uZXQuc29hcC4qIgotdGVzdC5yZXBvcnRzPWJ1aWxkL3Rlc3QtcmVwb3J0cwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9idWlsZC54bWwgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwOTFiYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iZ3Jvb3Z5c29hcCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0gICAgPCEtLQotICAgIDx0YXNrZGVmIG5hbWU9Imdyb292eSIgIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5IiAvPgotICAgIC0tPgotICAgIAotICAgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIiAvPgotICAgIDwhLS0KLSAgICA8ZWNobyBtZXNzYWdlPSJqYXZhYy1jbGFzc3BhdGg6ICR7amF2YWMuY2xhc3NwYXRofSIgLz4KLSAgICAtLT4KLSAgICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YWMuY2xhc3NwYXRofSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5jbGFzc2VzLmRpcn0iLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aD0iJHtqYXZhYy5jbGFzc3BhdGh9Ii8+Ci0gICAgPHRhc2tkZWYgbmFtZT0iZ3Jvb3Z5IiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eSIgY2xhc3NwYXRoPSIke2phdmFjLmNsYXNzcGF0aH0iLz4KLSAKLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgotICAgICAgICA8dHN0YW1wLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke0RTVEFNUH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2MuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aCBwYXRoPSIke2phdmFjLmNsYXNzcGF0aH0iLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0IiBkZXBlbmRzPSJpbml0LGNvbXBpbGUiPgotICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy50ZXN0LmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGggcGF0aD0iJHtqYXZhYy5jbGFzc3BhdGh9Ii8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhYz4KLSAgICAgICAgPGdyb292eWMgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iID4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmMudGVzdC5kaXJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YWMuY2xhc3NwYXRofSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7Y2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9ncm9vdnljPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0tJHt2ZXJzaW9ufS5qYXIiPgotICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9IiR7bWFpbi1jbGFzc30iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBpbmNsdWRlcz0iZ3Jvb3Z5LyoqIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJsb2c0ai5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDwvamFyPgotCTx0YXNrZGVmIG5hbWU9ImphcmphciIgY2xhc3NuYW1lPSJjb20udG9uaWNzeXN0ZW1zLmphcmphci5KYXJKYXJUYXNrIiBjbGFzc3BhdGg9IiR7amFyamFyLmphcn0iLz4KLSAgICAgICAgPGphcmphciBqYXJmaWxlPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0tYWxsLSR7dmVyc2lvbn0uamFyIj4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSIke21haW4tY2xhc3N9Ii8+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSIgaW5jbHVkZXM9Imdyb292eS8qKiIvPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke29yZy5tb3J0YmF5LmpldHR5Lmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtsb2c0ai5qYXJ9Ii8+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBzcmM9IiR7d3NkbDRqLmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt4ZmlyZS1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt4ZmlyZS1qYXZhNS5qYXJ9Ii8+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBzcmM9IiR7WG1sU2NoZW1hLmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3NlcnZsZXRhcGkuamFyfSIvPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3N0YXgtYXBpLmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt3c3R4LWFzbC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBzcmM9IiR7amF4ZW4uamFyfSIvPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2pkb20uamFyfSIvPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3hmaXJlLWFlZ2lzLmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt4ZmlyZS14bWxiZWFucy5qYXJ9Ii8+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBzcmM9IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtjb21tb25zLWNvZGVjLmphcn0iLz4KLSAgICAgICAgPC9qYXJqYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotICAgICAgICA8amF2YWRvYyBkZXN0ZGlyPSIke2phdmFkb2MuZGlyfSIgIHBhY2thZ2VuYW1lcz0iZ3Jvb3Z5Lm5ldC5zb2FwLioiPgotICAgICAgICAgICAgPCEtLWRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IgotICAgICAgICAgICAgcGFja2FnZW5hbWVzPSIke2phdmFkb2MucGFja2FnZXN9IgotICAgICAgICAgICAgdXNlPSJ0cnVlIgotICAgICAgICAgICAgd2luZG93dGl0bGU9Imdzb2FwIgotICAgICAgICAgICAgcHJpdmF0ZT0idHJ1ZSIgLS0+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YWMuY2xhc3NwYXRofSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7Y2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDxzb3VyY2VwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzcmMuZGlyfSIvPgotICAgICAgICAgICAgPC9zb3VyY2VwYXRoPgotICAgICAgICA8L2phdmFkb2M+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iamFyLGNvbXBpbGUtdGVzdCI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3Rlc3QucmVwb3J0c30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LnJlcG9ydHN9Ii8+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPHBhcmFsbGVsPgotICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0LlNvYXBTZXJ2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EbG9nNGouY29uZmlndXJhdGlvbj0ke3NyYy50ZXN0LmRpcn1sb2c0ai5wcm9wZXJ0aWVzIiAvPgotICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YWMuY2xhc3NwYXRofSIvPgotICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8c2VxdWVudGlhbD4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgPHdhaXRmb3IgbWF4d2FpdD0iMTAiIG1heHdhaXR1bml0PSJzZWNvbmQiID4KLSAgICAgICAgICAgICAgICAgICAgPGh0dHAgdXJsPSJodHRwOi8vbG9jYWxob3N0OjY5NjkvUGVyc29uU2VydmljZT93c2RsIi8+Ci0gICAgICAgICAgICAgICAgPC93YWl0Zm9yPgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxqdW5pdD4KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YWMuY2xhc3NwYXRofSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iYnJpZWYiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXBvcnRzfSIgZm9yaz0ieWVzIiBmYWlsdXJlcHJvcGVydHk9InRlc3QuZmFpbHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBpbmNsdWRlcz0iKiovVGVzdCouY2xhc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICAgICAgICAgICAgPC9qdW5pdD4KLSAgICAgICAgICAgICAgICA8ZmFpbCBpZj0idGVzdC5mYWlsdXJlIj5UaGUgdGVzdHMgZmFpbGVkLiBIYXZlIGEgbG9vayBhdCAke3Rlc3QucmVwb3J0c308L2ZhaWw+Ci0gICAgICAgICAgICA8L3NlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICA8Z3Jvb3Z5IHNyYz0iJHtzcmMudGVzdC5zY3JpcHRzfWNsaWVudDEuZ3Jvb3Z5Ii8+Ci0gICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLQotICAgICAgICA8L3BhcmFsbGVsPgotICAgICAgICAtLT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuLWJ1aWxkIiBkZXBlbmRzPSJjbGVhbixqYXIiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iY2xlYW4scnVuIi8+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL1htbFNjaGVtYS0xLjAuMi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9YbWxTY2hlbWEtMS4wLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWZjM2IzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL1htbFNjaGVtYS0xLjAuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hY3RpdmF0aW9uLTEuMC4yLmphciBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FjdGl2YXRpb24tMS4wLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYjM4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FjdGl2YXRpb24tMS4wLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYW50bHItMi43LjUuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYW50bHItMi43LjUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1ZTNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FudGxyLTIuNy41LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FzbS0yLjIuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYXNtLTIuMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZGUwZWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYXNtLTIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tYW5hbHlzaXMtMi4yLmphciBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FzbS1hbmFseXNpcy0yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE4YzUzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FzbS1hbmFseXNpcy0yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYXNtLWF0dHJzLTIuMi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tYXR0cnMtMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxMmFkNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tYXR0cnMtMi4yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FzbS10cmVlLTIuMi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tdHJlZS0yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y5NTY0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2FzbS10cmVlLTIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tdXRpbC0yLjIuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvYXNtLXV0aWwtMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MTI1ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9hc20tdXRpbC0yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvY29tbW9ucy1jb2RlYy0xLjMuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvY29tbW9ucy1jb2RlYy0xLjMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdiNjc1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2NvbW1vbnMtY29kZWMtMS4zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2NvbW1vbnMtaHR0cGNsaWVudC0zLjAuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvY29tbW9ucy1odHRwY2xpZW50LTMuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTkzMDAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvY29tbW9ucy1odHRwY2xpZW50LTMuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9jb21tb25zLWxvZ2dpbmctMS4wLjQuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvY29tbW9ucy1sb2dnaW5nLTEuMC40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczYTgwZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9jb21tb25zLWxvZ2dpbmctMS4wLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvZ3Jvb3Z5LWFsbC0xLjAtUkMtMDEtU05BUFNIT1QuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvZ3Jvb3Z5LWFsbC0xLjAtUkMtMDEtU05BUFNIT1QuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2EzMzE5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2dyb292eS1hbGwtMS4wLVJDLTAxLVNOQVBTSE9ULmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2phcmphci0wLjcuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvamFyamFyLTAuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjM3N2EuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvamFyamFyLTAuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9qYXZhbWFpbC0xLjMuMi5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9qYXZhbWFpbC0xLjMuMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmNlMTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvamF2YW1haWwtMS4zLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvamF4ZW4tMS4xLWJldGEtOC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9qYXhlbi0xLjEtYmV0YS04LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMDdkOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9qYXhlbi0xLjEtYmV0YS04LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2pkb20tMS4wLmphciBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL2pkb20tMS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4ZTY0Yy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9qZG9tLTEuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9sb2c0ai0xLjIuOC5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9sb2c0ai0xLjIuOC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2EzY2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvbG9nNGotMS4yLjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvb3JnLm1vcnRiYXkuamV0dHktNS4xLjMuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvb3JnLm1vcnRiYXkuamV0dHktNS4xLjMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWMyZjJhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL29yZy5tb3J0YmF5LmpldHR5LTUuMS4zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3NlcnZsZXRhcGktMi4zLmphciBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3NlcnZsZXRhcGktMi4zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YjM1MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9zZXJ2bGV0YXBpLTIuMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9zdGF4LWFwaS0xLjAuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvc3RheC1hcGktMS4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4N2JkMy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi9zdGF4LWFwaS0xLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvd3NkbDRqLTEuNS4yLmphciBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3dzZGw0ai0xLjUuMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzcyNzEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIvd3NkbDRqLTEuNS4yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3dzdHgtYXNsLTIuOS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi93c3R4LWFzbC0yLjkuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ5NmM2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3dzdHgtYXNsLTIuOS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi94ZmlyZS1hZWdpcy0xLjEuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIveGZpcmUtYWVnaXMtMS4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q0OGVlMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi94ZmlyZS1hZWdpcy0xLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIveGZpcmUtY29yZS0xLjEuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIveGZpcmUtY29yZS0xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODE4NjI3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3hmaXJlLWNvcmUtMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3hmaXJlLWphdmE1LTEuMS5qYXIgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi94ZmlyZS1qYXZhNS0xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZTQyYWY4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvbGliL3hmaXJlLWphdmE1LTEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi94ZmlyZS14bWxiZWFucy0xLjEuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9saWIveGZpcmUteG1sYmVhbnMtMS4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDIxZTRhYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL2xpYi94ZmlyZS14bWxiZWFucy0xLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvbWFpbi9ncm9vdnkvbmV0L3NvYXAvUHVibGljTWV0aG9kTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL21haW4vZ3Jvb3Z5L25ldC9zb2FwL1B1YmxpY01ldGhvZE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2FkNmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvbWFpbi9ncm9vdnkvbmV0L3NvYXAvUHVibGljTWV0aG9kTm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC5zb2FwOwotLyoKLSAqIFB1YmxpY01ldGhvZE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKLSAqCi0gKiBDcmVhdGVkIG9uIDIzIGF2cmlsIDIwMDYsIDA4OjI5Ci0gKgotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUsIGNob29zZSBUb29scyB8IFRlbXBsYXRlIE1hbmFnZXIKLSAqIGFuZCBvcGVuIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgZWRpdG9yLgotICovCi0KLS8qKgotICoKLSAqIEBhdXRob3IgU1UxNjc2NgotICovCi1wdWJsaWMgY2xhc3MgUHVibGljTWV0aG9kTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAKLSAgICAvKiogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBQdWJsaWNNZXRob2ROb3RGb3VuZEV4Y2VwdGlvbiAqLwotICAgIHB1YmxpYyBQdWJsaWNNZXRob2ROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFB1YmxpY01ldGhvZE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCkgKyBnZXRMb2NhdGlvblRleHQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhdGlvblRleHQoKSB7Ci0gICAgICAgIFN0cmluZyBhbnN3ZXIgPSAiLiAiOwotICAgICAgICAKLSAgICAgICAgaWYgKGFuc3dlci5lcXVhbHMoIi4gIikpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL21haW4vZ3Jvb3Z5L25ldC9zb2FwL1NvYXBDbGllbnQuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL21haW4vZ3Jvb3Z5L25ldC9zb2FwL1NvYXBDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkYmY4Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy9tYWluL2dyb292eS9uZXQvc29hcC9Tb2FwQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotcGFja2FnZSBncm9vdnkubmV0LnNvYXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMueGZpcmUuY2xpZW50LkNsaWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS51dGlsLkRPTVV0aWxzOwotLyoqCi0gKiA8cD5EeW5hbWljIEdyb292eSBwcm94eSBhcm91bmQgWGZpcmUgc3RhY2suPC9wPgotICoKLSAqIEBhdXRob3IgR3VpbGxhdW1lIEFsbGVvbgotICoKLSAqLwotcHVibGljIGNsYXNzIFNvYXBDbGllbnQgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKLSAgICAKLSAgICBwcml2YXRlIENsaWVudCBjbGllbnQ7Ci0gICAgc3RhdGljIHByaXZhdGUgTG9nZ2VyIGxvZ2dlcj1Mb2dnZXIuZ2V0TG9nZ2VyKFNvYXBDbGllbnQuY2xhc3MpOwotICAgIC8qKgotICAgICAqIDxwPlRyYW5zZm9ybSBhIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGluIGEgR3Jvb3Z5Ci0gICAgICogYmVhbi4gV2hpdGVzcGFjZSBhcmUgcmVtb3ZlZCBhbmQgIHRoZSBmaXJzdCBsZXR0ZXIgaXMKLSAgICAgKiByZXBsYWNlZCBieSBpdHMgbG93ZXIgY2FzZSBjb3VudGVycGFydC48L3A+Ci0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGJlIHVuY2FwaXRhbGl6ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuY2FwaXRhbGl6ZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJzonKSBidWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIDxwPkdlbmVyYXRlIGEgTWFwIHJlcHJlc2VudGluZyB0aGUgZGF0YSB0eXBlcyBjb3JyZXNwb25kaW5nCi0gICAgICogdG8gdGhlIFhNTCBkb2N1bWVudDwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSBhIE5vZGUgb2YgdGhhIFhNTCBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gdHlwZSBhIE1hcCByZXByZXNlbnRpbmcgdGhlIGRhdGF0eXBlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVR5cGUoTm9kZSBub2RlLCBNYXAgdHlwZSkgewotICAgICAgICAvLyBUT0RPIHJham91dGVyIGxlIHRlc3QgZCdleGlzdGVuY2UKLSAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpICYmICF0eXBlLmNvbnRhaW5zS2V5KG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLSAgICAgICAgICAgIE1hcCBtZW1iZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspewotICAgICAgICAgICAgICAgIE5vZGUgbiA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKT09Tm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICAgIEludGVnZXIgdmFsZW5jZSA9IChJbnRlZ2VyKW1lbWJlcnMuZ2V0KG4uZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICBpZiAodmFsZW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGVuY2UgPSBuZXcgSW50ZWdlcigxKTsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGVuY2UgKys7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBtZW1iZXJzLnB1dChuLmdldE5vZGVOYW1lKCksIHZhbGVuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZW5lcmF0ZVR5cGUobiwgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihtZW1iZXJzLnNpemUoKSE9MCkKLSAgICAgICAgICAgICAgICB0eXBlLnB1dChub2RlLmdldE5vZGVOYW1lKCksIG1lbWJlcnMpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIDxwPlRyYW5zZm9ybSB0aGUgeGZpcmUgcmVzcG9uc2UgdG8gYSBqYXZhL2dyb292eSB0eXBlCi0gICAgICogYnkgZ2VuZXJhdGluZyBhbmQgaW50ZXJwcmV0aW5nIGEgR3Jvb3Z5IHNjcmlwdCB3aGVuIGEKLSAgICAgKiBYTUwgZG9jdW1lbnQ8L3A+Ci0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiB0aGUgeGZpcmUgcmVzcG9uc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgdG9SZXR1cm4oT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQotICAgICAgICAgICAgTWFwIHR5cGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNsYXNzU291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSByb290IG5vZGUgZnJvbSB0aGUgRG9jdW1lbnQKLSAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9ICgoRG9jdW1lbnQpIG9iaikuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFuIHRoZSBYTUwgZG9jdW1lbnQKLSAgICAgICAgICAgIGNsZWFuTm9kZShyb290KTsKLQotLy8gICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0vLyAgICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgICAgRE9NVXRpbHMud3JpdGVYbWwoKE5vZGUpIHJvb3QsIFN5c3RlbS5vdXQpOwotLy8gICAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4KSB7Ci0vLyAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYSBtYXAgdGhhdCBhc3NvY2lhdGVzIHRvIGVhY2ggdHlwZSBpdHMgbWVtYmVycwotICAgICAgICAgICAgZ2VuZXJhdGVUeXBlKHJvb3QsIHR5cGUpOwotCi0gICAgICAgICAgICAvLyBUZXN0IGlmIHdlIGhhdmUgYSBjb21wbGV4IHR5cGUKLSAgICAgICAgICAgIGlmICgodHlwZS5rZXlTZXQoKS5zaXplKCkgIT0gMSkgfHwgKCgoTWFwKXR5cGUuZ2V0KHJvb3QuZ2V0Tm9kZU5hbWUoKSkpLmtleVNldCgpLnNpemUoKSAhPSAxKSkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFUeXBlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotLy8gICAgICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoImNsYXNzICIpCi0vLyAgICAgICAgICAgICAgICAgIC5hcHBlbmQodW5jYXBpdGFsaXplKGFUeXBlKSkKLS8vICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIHtcbiIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHQgPSBuZXcgU3RyaW5nKHVuY2FwaXRhbGl6ZShhVHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoInJldHVybiIuZXF1YWxzKHR0KSkgdHQgPSAib3V0IjsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NTb3VyY2UuYXBwZW5kKCJjbGFzcyAiKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHR0KQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIge1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBtZW1iZXJzID0gKE1hcCkgdHlwZS5nZXQoYVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MSA9IG1lbWJlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQxLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZW1iZXIgPSAoU3RyaW5nKWl0MS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIiAgQFByb3BlcnR5ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChJbnRlZ2VyKW1lbWJlcnMuZ2V0KG1lbWJlcikgPiAxKSBjbGFzc1NvdXJjZS5hcHBlbmQoIkxpc3QgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQodW5jYXBpdGFsaXplKG1lbWJlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgifVxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUZXN0IGlmIHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSB2b2lkCi0gICAgICAgICAgICBpZiAodHlwZS5nZXQocm9vdC5nZXROb2RlTmFtZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgicmVzdWx0ID0gIik7Ci0gICAgICAgICAgICAgIGNyZWF0ZUNvZGUocm9vdCwgdHlwZSwgY2xhc3NTb3VyY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIGxvZ2dlci5kZWJ1ZyhjbGFzc1NvdXJjZSk7Ci0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGJhY2sgPSBuZXcgR3Jvb3Z5U2hlbGwoYmluZGluZykuZXZhbHVhdGUoY2xhc3NTb3VyY2UudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSBsb2dnZXIuZGVidWcoYmFjay50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFjazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIGxvZ2dlci5kZWJ1ZygicmV0dXJuZWQgb2JqZWN0IGlzIG9mIHR5cGUgIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJlbW92ZSBkZWFkIHRleHQgaW4gYW4gWE1MIHRyZWUuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb25zaWRlcmVkIGVsZW1lbnQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYW5Ob2RlKEVsZW1lbnQgZWxlbWVudCl7Ci0gICAgICAgIC8vIFRPRE8gcmFqb3V0ZXIgbGUgdGVzdCBkJ2V4aXN0ZW5jZQotICAgICAgICBOb2RlIGNoaWxkOwotICAgICAgICBOb2RlIG5leHQgPSAoTm9kZSllbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICgoY2hpbGQgPSBuZXh0KSAhPSBudWxsKXsKLSAgICAgICAgICAgIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICAgICAgY2xlYW5Ob2RlKChFbGVtZW50KWNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5DcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBkYXRhIHR5cGVzIHByZXZpb3VzbHkgZ2VuZXJhdGVkCi0gICAgICogZnJvbSB0aGUgWE1MIGRvY3VtZW50LjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50ICAgICBFbGVtZW50IG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGNsYXNzU291cmNlIFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29kZShFbGVtZW50IHJvb3QsIE1hcCB0eXBlLCBTdHJpbmdCdWZmZXIgY2xhc3NTb3VyY2UpewotICAgICAgICBpZiAoKHR5cGUua2V5U2V0KCkuc2l6ZSgpID09IDEpICYmICgoKE1hcCl0eXBlLmdldChyb290LmdldE5vZGVOYW1lKCkpKS5rZXlTZXQoKS5zaXplKCkgPT0gMSkpIHsKLSAgICAgICAgICAgIGNyZWF0ZUNvZGVTVChyb290LCBjbGFzc1NvdXJjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjcmVhdGVDb2RlQ1Qocm9vdCwgdHlwZSwgY2xhc3NTb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Q3JlYXRlIENvbXBsZXggdHlwZXMgaW5zdGFuY2VzIG9mIHRoZSBkYXRhIHR5cGVzIHByZXZpb3VzbHkgZ2VuZXJhdGVkCi0gICAgICogZnJvbSB0aGUgWE1MIGRvY3VtZW50LjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50ICAgICBFbGVtZW50IG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGNsYXNzU291cmNlIFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29kZUNUKEVsZW1lbnQgZWxlbWVudCwgTWFwIHR5cGUsIFN0cmluZ0J1ZmZlciBjbGFzc1NvdXJjZSl7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBudWxsOwotICAgICAgICBOb2RlIGZub2RlID0gKE5vZGUpZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIE5vZGUgbG5vZGUgPSAoTm9kZSllbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgICAgICAKLSAgICAgICAgTm9kZSBuZXh0ID0gZm5vZGU7Ci0gICAgICAgIE5vZGUgcHJldiA9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBvcGVuZWQgPSBmYWxzZTsKLQotICAgICAgICBNYXAgIG1lbWJlcnMgPSAoTWFwKXR5cGUuZ2V0KGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIGxvZ2dlci5kZWJ1ZygiRW50ZXJpbmcgY3JlYXRlQ29kZSIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHR0ID0gbmV3IFN0cmluZyh1bmNhcGl0YWxpemUoZWxlbWVudC5nZXROb2RlTmFtZSgpKSk7Ci0gICAgICAgIGlmICgicmV0dXJuIi5lcXVhbHModHQpKSB0dCA9ICJvdXQiOwotCi0gICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgiXCJcIiIpOwotICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgY2xhc3NTb3VyY2UuYXBwZW5kKCJuZXcgIiArIHVuY2FwaXRhbGl6ZShlbGVtZW50LmdldE5vZGVOYW1lKCkpICsgIigiKTsKLSAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgibmV3ICIgKyB0dCArICIoIik7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoY2hpbGQgPSBuZXh0KSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAKLSAgICAgICAgICAgICAgICBpZiAoIW9wZW5lZCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQodW5jYXBpdGFsaXplKGNoaWxkLmdldE5vZGVOYW1lKCkpICsgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChJbnRlZ2VyKW1lbWJlcnMuZ2V0KGNoaWxkLmdldE5vZGVOYW1lKCkpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgiWyIpOwotICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpICYmIChjaGlsZC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMSkgJiYgKGNoaWxkLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IGZvciB0aGUgZGVwdGggCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzU291cmNlLmFwcGVuZCgiXCIiK2NoaWxkLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSsiXCIiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb2RlQ1QoKEVsZW1lbnQpY2hpbGQsIHR5cGUsIGNsYXNzU291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSBsbm9kZSkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvcGVuZWQpIGNsYXNzU291cmNlLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgY2xhc3NTb3VyY2UuYXBwZW5kKCIpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5DcmVhdGUgU2ltcGxlIHR5cGVzIGluc3RhbmNlcyBvZiB0aGUgZGF0YSB0eXBlcyBwcmV2aW91c2x5IGdlbmVyYXRlZAotICAgICAqIGZyb20gdGhlIFhNTCBkb2N1bWVudC48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAgICAgRWxlbWVudCBvZiB0aGUgWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBjbGFzc1NvdXJjZSBTdHJpbmdCdWZmZXIgY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvZGVTVChFbGVtZW50IGVsZW1lbnQsIFN0cmluZ0J1ZmZlciBjbGFzc1NvdXJjZSl7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBudWxsOwotICAgICAgICBOb2RlIGZub2RlID0gKE5vZGUpZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIE5vZGUgbG5vZGUgPSAoTm9kZSllbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgICAgICAKLSAgICAgICAgTm9kZSBuZXh0ID0gZm5vZGU7Ci0gICAgICAgIE5vZGUgcHJldiA9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBvcGVuZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIGxvZ2dlci5kZWJ1ZygiRW50ZXJpbmcgY3JlYXRlQ29kZVNUIik7Ci0gICAgICAgIAotICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIlsiKTsKLQotICAgICAgICB3aGlsZSAoKGNoaWxkID0gbmV4dCkgIT0gbnVsbCl7Ci0gICAgICAgICAgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLSAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIlwiIitjaGlsZC5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkrIlwiIik7Ci0gICAgICAgICAgIAotICAgICAgICAgIGlmIChjaGlsZCAhPSBsbm9kZSkgewotICAgICAgICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIiwiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICBwcmV2ID0gY2hpbGQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjbGFzc1NvdXJjZS5hcHBlbmQoIl0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgYSBtZXRob2Qgb24gYSBnc29hcCBjb21wb25lbnQgdXNpbmcgdGhlIHhmaXJlCi0gICAgICogZHluYW1pYyBjbGllbnQgPC9wPgotICAgICAqIDxwPkV4YW1wbGUgb2YgR3Jvb3Z5IGNvZGU6PC9wPgotICAgICAqIDxjb2RlPgotICAgICAqIGNsaWVudCA9IG5ldyBTb2FwQ2xpZW50KCJodHRwOi8vd3d3LndlYnNlcnZpY2V4Lm5ldC9XZWF0aGVyRm9yZWNhc3QuYXNteD9XU0RMIikKLSAgICAgKiBkZWYgYW5zd2VyID0gY2xpZW50LkdldFdlYXRoZXJCeVBsYWNlTmFtZSgiU2VhdHRsZSIpCi0gICAgICogPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKLSAgICAgKiBAcGFyYW0gYXJncyBwYXJhbWV0ZXJzIG9mIHRoZSBtZXRob2QgY2FsbAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgewotICAgICAgICBPYmplY3RbXSBvYmpzID0gSW52b2tlckhlbHBlci5nZXRJbnN0YW5jZSgpLmFzQXJyYXkoYXJncyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gY2xpZW50Lmludm9rZShuYW1lLCBvYmpzKTsKLQotICAgICAgICAgICAgLy8gVE9ETyBQYXJzZSB0aGUgYW5zd2VyCi0gICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm4ocmVzcG9uc2VbMF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIE9iamVjdCB0ZXN0R29vZ2xlKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuKERPTVV0aWxzLnJlYWRYbWwobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSkpKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNvYXBDbGllbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgU29hcENsaWVudCB1c2luZyBhIFVSTAotICAgICAqIDxwPkV4YW1wbGUgb2YgR3Jvb3Z5IGNvZGU6PC9wPgotICAgICAqIDxjb2RlPgotICAgICAqIGNsaWVudCA9IG5ldyBTb2FwQ2xpZW50KCJodHRwOi8vd3d3LndlYnNlcnZpY2V4Lm5ldC9XZWF0aGVyRm9yZWNhc3QuYXNteD9XU0RMIikKLSAgICAgKiA8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gVVJMTG9jYXRpb24gdGhlIFVSTCBwb2ludGluZyB0byB0aGUgV1NETAotICAgICAqLwotICAgIHB1YmxpYyBTb2FwQ2xpZW50KFN0cmluZyBVUkxMb2NhdGlvbil7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2xpZW50KG5ldyBVUkwoVVJMTG9jYXRpb24pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy9tYWluL2dyb292eS9uZXQvc29hcC9Tb2FwU2VydmVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy9tYWluL2dyb292eS9uZXQvc29hcC9Tb2FwU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmVjNTIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvbWFpbi9ncm9vdnkvbmV0L3NvYXAvU29hcFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC5zb2FwOwotLyoKLSAqIFNvYXBTZXJ2ZXIuamF2YQotICoKLSAqIENyZWF0ZWQgb24gMjIgYXZyaWwgMjAwNiwgMDA6MTAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSwgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGUgTWFuYWdlcgotICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCi0gKi8KLS8vaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBvcmcuY29kZWhhdXMueGZpcmUuWEZpcmU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLlhGaXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMueGZpcmUuc2VydmVyLmh0dHAuWEZpcmVIdHRwU2VydmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5zZXJ2aWNlLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLnNlcnZpY2UuaW52b2tlci5PYmplY3RJbnZva2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5zZXJ2aWNlLmJpbmRpbmcuT2JqZWN0U2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLnhtbGJlYW5zLlhtbEJlYW5zU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLnhtbGJlYW5zLlhtbEJlYW5zVHlwZTsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgR3VpbGxhdW1lIEFsbGVvbgotICovCi1wdWJsaWMgY2xhc3MgU29hcFNlcnZlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBYRmlyZSB4ZmlyZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBYRmlyZUh0dHBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQotICAgIHN0YXRpYyBwcml2YXRlIExvZ2dlciBsb2dnZXI9TG9nZ2VyLmdldExvZ2dlcihTb2FwU2VydmVyLmNsYXNzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNvYXBTZXJ2ZXIuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTb2FwU2VydmVyKCkgewotICAgICAgICB0aGlzKCJsb2NhbGhvc3QiLCA4MDgwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Q3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBTb2FwU2VydmVyLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCB0aGUgd2ViIGNvbnRhaW5lciBpcyBydW5uaW5nIG9uLgotICAgICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHVzZWQgYnkgdGhlIHdlYiBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIFNvYXBTZXJ2ZXIoU3RyaW5nIGhvc3QsIEludGVnZXIgcG9ydCkgewotICAgICAgICB4ZmlyZSA9IFhGaXJlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmdldFhGaXJlKCk7Ci0gICAgICAgIHNlcnZlciA9IG5ldyBYRmlyZUh0dHBTZXJ2ZXIoKTsKLSAgICAgICAgc2VydmVyLnNldFBvcnQocG9ydCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPkluc3RhbnRpYXRlIHRoZSB3ZWIgc2VydmljZSB1c2luZyBhIFBsYWluIE9sZAotICAgICAqIEdyb292eSBPYmplY3QuIEJvdGgsIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgICAqIGNsYXNzZXMgYXJlIGdlbmVyYXRlZCB1c2luZyBpbnRyb3NwZWN0aW9uLgotICAgICAqIFRoZW4gdGhlIGltcGxlbWVudGF0aW9uIGlzIGRlbGVnYXRpbmcgdGhlIGNhbGwgdG8gdGhlCi0gICAgICogR3Jvb3Z5IGNsYXNzLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgcHJlZml4IG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGdyb292eSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gVVJMIHRoZSBVUkwgaG9zdGluZyB0aGUgc2VydmljZW9uIHRoZSBzZXJ2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZShTdHJpbmcgdGV4dCwgU3RyaW5nIFVSTCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7Ci0gICAgICAgIC8vIHRyeSB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gZ2NsLmxvYWRDbGFzcyh0ZXh0KTsKLSAgICAgICAgLy99IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KXsKLSAgICAgICAgLy8gICAgU3lzdGVtLmVyci5wcmludGxuKCJHcm9vdnkgZmlsZSAiKyB0ZXh0ICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgLy8gICAgdGhyb3cgZXg7Ci0gICAgICAgIC8vfQotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgc0ludGVyZmFjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNJbXBsICAgICAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAotICAgICAgICBzSW50ZXJmYWNlLmFwcGVuZCgiaW50ZXJmYWNlICIpCi0gICAgICAgIC5hcHBlbmQoY2xhenouZ2V0TmFtZSgpKQotICAgICAgICAuYXBwZW5kKCJJbnRlcmZhY2Uge1xuIik7Ci0gICAgICAgIAotICAgICAgICBzSW1wbC5hcHBlbmQoImNsYXNzICIpCi0gICAgICAgIC5hcHBlbmQoY2xhenouZ2V0TmFtZSgpKQotICAgICAgICAuYXBwZW5kKCJJbXBsIGltcGxlbWVudHMgIikKLSAgICAgICAgLmFwcGVuZChjbGF6ei5nZXROYW1lKCkpCi0gICAgICAgIC5hcHBlbmQoIkludGVyZmFjZSB7XG4gIGRlZiBzZXJ2aWNlID0gbmV3ICIpCi0gICAgICAgIC5hcHBlbmQoY2xhenouZ2V0TmFtZSgpKQotICAgICAgICAuYXBwZW5kKCIoKVxuIik7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGhhc01ldGhvZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWV0aG9kcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKCAiZ2V0TWV0YUNsYXNzIi5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICJnZXRQcm9wZXJ0eSIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAiZ2V0Q2xhc3MiLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgInNldE1ldGFDbGFzcyIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAic2V0UHJvcGVydHkiLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgImludm9rZU1ldGhvZCIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAiaGFzaENvZGUiLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgImVxdWFscyIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAibm90aWZ5Ii5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICJub3RpZnlBbGwiLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgInRvU3RyaW5nIi5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICJydW4iLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIm1haW4iLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzJCIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAid2FpdCIuZXF1YWxzKG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSApIHsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kc1tpXS5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICBoYXNNZXRob2QgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyByZXR1cm5UeXBlID0gbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuc3RhcnRzV2l0aCgiW0wiKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IHJldHVyblR5cGUuc3Vic3RyaW5nKDIsIHJldHVyblR5cGUubGVuZ3RoKCktMSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5jb25jYXQoIltdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc0ludGVyZmFjZS5hcHBlbmQoIiAgIiArIHJldHVyblR5cGUpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiICIgKyBtZXRob2RzW2ldLmdldE5hbWUoKSsiKCIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNJbXBsLmFwcGVuZCgiXG4gICIgKyByZXR1cm5UeXBlKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiICsgbWV0aG9kc1tpXS5nZXROYW1lKCkrIigiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDbGFzc1tdIHBhcmFtcyA9IG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBwYXJhbXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNJbnRlcmZhY2UuYXBwZW5kKHBhcmFtc1tqXS5nZXROYW1lKCkgKyAiIGFyZyIgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgc0ltcGwuYXBwZW5kKHBhcmFtc1tqXS5nZXROYW1lKCkgKyAiIGFyZyIgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsraiA8IHBhcmFtcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNJbnRlcmZhY2UuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc0ltcGwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNJbnRlcmZhY2UuYXBwZW5kKCIpO1xuIik7Ci0gICAgICAgICAgICAgICAgc0ltcGwuYXBwZW5kKCIpIHtcbiAgICAiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldFJldHVyblR5cGUoKSAhPSB2b2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICBzSW1wbC5hcHBlbmQoInJldHVybiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc0ltcGwuYXBwZW5kKCJzZXJ2aWNlLiIgKyBtZXRob2RzW2ldLmdldE5hbWUoKSArICIoIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGogPCBwYXJhbXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNJbXBsLmFwcGVuZCgiYXJnIiArIGopOwotICAgICAgICAgICAgICAgICAgICBpZiAoKytqIDwgcGFyYW1zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0ltcGwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNJbXBsLmFwcGVuZCgiKVxuICB9XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzSW1wbC5hcHBlbmQoIn0iKTsKLSAgICAgICAgc0ludGVyZmFjZS5hcHBlbmQoIn0iKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChoYXNNZXRob2QgPT0gZmFsc2UpIHRocm93IG5ldyBQdWJsaWNNZXRob2ROb3RGb3VuZEV4Y2VwdGlvbigiR3Jvb3Z5IHNjcmlwdCBzaG91bGQgaGF2ZSBwdWJsaWMgbWV0aG9kIik7Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSBsb2dnZXIuZGVidWcoc0ltcGwudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nZ2VyLmRlYnVnKHNJbnRlcmZhY2UudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgQ2xhc3MgaW50ZXJmYWNlQ2xhc3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50ZXJmYWNlQ2xhc3MgPSBnY2wucGFyc2VDbGFzcyhzSW50ZXJmYWNlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IHBhcnNlIEludGVyZmFjZSBjbGFzczpcbiIrc0ludGVyZmFjZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDbGFzcyBpbXBsQ2xhc3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW1wbENsYXNzID0gZ2NsLnBhcnNlQ2xhc3Moc0ltcGwudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcGFyc2UgSW1wbGVtZW50YXRpb24gY2xhc3M6XG4iK3NJbXBsLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgT2JqZWN0U2VydmljZUZhY3Rvcnkgc2VydmljZUZhY3RvcnkgPSBuZXcgT2JqZWN0U2VydmljZUZhY3RvcnkoeGZpcmUuZ2V0VHJhbnNwb3J0TWFuYWdlcigpKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUZhY3RvcnkuY3JlYXRlKGludGVyZmFjZUNsYXNzKTsKLSAgICAgICAgc2VydmljZS5zZXRQcm9wZXJ0eShPYmplY3RJbnZva2VyLlNFUlZJQ0VfSU1QTF9DTEFTUywgaW1wbENsYXNzKTsKLS8qCi0gICAgICAgIFhtbEJlYW5zU2VydmljZUZhY3Rvcnkgc2VydmljZUZhY3RvcnkgPSBuZXcgWG1sQmVhbnNTZXJ2aWNlRmFjdG9yeSh4ZmlyZS5nZXRUcmFuc3BvcnRNYW5hZ2VyKCkpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlRmFjdG9yeS5jcmVhdGUoaW1wbENsYXNzKTsKLSAgICAgICAgc2VydmljZS5zZXRQcm9wZXJ0eShYbWxCZWFuc1R5cGUuWE1MQkVBTlNfTkFNRVNQQUNFX0hBQ0ssICJ0cnVlIik7Ci0qLwotICAgICAgICAKLSAgICAgICAgeGZpcmUuZ2V0U2VydmljZVJlZ2lzdHJ5KCkucmVnaXN0ZXIoc2VydmljZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIHRleHQpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXROb2RlKHRleHQsICIiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+U3RhcnQgdGhlIFNvYXBTZXJ2ZXIuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqLyAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IHN0YXJ0IHNlcnZlciIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5TdG9wIHRoZSBTb2FwU2VydmVyLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKi8gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgc3RvcCBzZXJ2ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvTWF0aFNlcnZpY2UuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9NYXRoU2VydmljZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjdkYjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9NYXRoU2VydmljZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vL3B1YmxpYyBjbGFzcyBNYXRoU2VydmljZSB7Ci0KLSAgZG91YmxlIGFkZChkb3VibGUgb3AxLCBkb3VibGUgb3AyKSB7Ci0gICAgcmV0dXJuIChvcDEgKyBvcDIpCi0gIH0KLQotICBkb3VibGUgc3F1YXJlKGRvdWJsZSBvcDEpIHsKLSAgICByZXR1cm4gKG9wMSAqIG9wMSkKLSAgfQotCi0vL30KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvUGVyc29uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy90ZXN0L1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdiN2JiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogUGVyc29uLmphdmEKLSAqCi0gKiBDcmVhdGVkIG9uIDEzIGbpdnJpZXIgMjAwNiwgMTM6MjkKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSwgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGUgTWFuYWdlcgotICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCi0gKi8KLQotcGFja2FnZSB0ZXN0OwotCi0vKioKLSAqCi0gKiBAYXV0aG9yIEd1aWxsYXVtZSBBbGxlb24KLSAqLwotcHVibGljIGNsYXNzIFBlcnNvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotICAgIHByaXZhdGUgSW50ZWdlciBpZDsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldElkKEludGVnZXIgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiK2lkKyJdICIrZmlyc3ROYW1lKyIgIitsYXN0TmFtZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy90ZXN0L1BlcnNvblNlcnZpY2UuamF2YSBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvUGVyc29uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmIwMmNmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvUGVyc29uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIE5ld0ludGVyZmFjZS5qYXZhCi0gKgotICogQ3JlYXRlZCBvbiAxMyBm6XZyaWVyIDIwMDYsIDE2OjI0Ci0gKgotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUsIGNob29zZSBUb29scyB8IFRlbXBsYXRlIE1hbmFnZXIKLSAqIGFuZCBvcGVuIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgZWRpdG9yLgotICovCi0KLXBhY2thZ2UgdGVzdDsKLQotLyoqCi0gKgotICogQGF1dGhvciBHdWlsbGF1bWUgQWxsZW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc29uU2VydmljZSB7Ci0gICAgUGVyc29uIGZpbmRQZXJzb24oSW50ZWdlciBpZCk7Ci0gICAgUGVyc29uW10gZ2V0UGVyc29ucygpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9QZXJzb25TZXJ2aWNlSW1wbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9QZXJzb25TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZjMzVmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvUGVyc29uU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBQZXJzb25TZXJ2aWNlLmphdmEKLSAqCi0gKiBDcmVhdGVkIG9uIDEzIGbpdnJpZXIgMjAwNiwgMTQ6MzgKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSwgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGUgTWFuYWdlcgotICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCi0gKi8KLQotcGFja2FnZSB0ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci0KLS8qKgotICoKLSAqIEBhdXRob3IgR3VpbGxhdW1lIEFsbGVvbgotICovCi1wdWJsaWMgY2xhc3MgUGVyc29uU2VydmljZUltcGwgaW1wbGVtZW50cyBQZXJzb25TZXJ2aWNlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyPUxvZ2dlci5nZXRMb2dnZXIoUGVyc29uU2VydmljZUltcGwuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgTGlzdCBkaXJlY3Rvcnk7Ci0gICAgCi0gICAgcHVibGljIFBlcnNvblNlcnZpY2VJbXBsKCkgewotICAgICAgICBkaXJlY3RvcnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBQZXJzb24gcGVyc29uMSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgUGVyc29uIHBlcnNvbjIgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIFBlcnNvbiBwZXJzb24zID0gbmV3IFBlcnNvbigpOwotICAgICAgICAKLSAgICAgICAgcGVyc29uMS5zZXRGaXJzdE5hbWUoIkd1aWxsYXVtZSIpOwotICAgICAgICBwZXJzb24xLnNldExhc3ROYW1lKCJMYWZvcmdlIik7Ci0gICAgICAgIHBlcnNvbjEuc2V0SWQobmV3IEludGVnZXIoMSkpOwotICAgICAgICAKLSAgICAgICAgcGVyc29uMi5zZXRGaXJzdE5hbWUoIkRhbiIpOwotICAgICAgICBwZXJzb24yLnNldExhc3ROYW1lKCJEaWVwaG91c2UiKTsKLSAgICAgICAgcGVyc29uMi5zZXRJZChuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIAotICAgICAgICBwZXJzb24zLnNldEZpcnN0TmFtZSgiSm9jaGVuIik7Ci0gICAgICAgIHBlcnNvbjMuc2V0TGFzdE5hbWUoIlRoZW9kb3JvdSIpOwotICAgICAgICBwZXJzb24zLnNldElkKG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgCi0gICAgICAgIGRpcmVjdG9yeS5hZGQocGVyc29uMSk7Ci0gICAgICAgIGRpcmVjdG9yeS5hZGQocGVyc29uMik7Ci0gICAgICAgIGRpcmVjdG9yeS5hZGQocGVyc29uMyk7Ci0gICAgICAgIAotICAgICAgICBsb2dnZXIuZGVidWcoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3NvYXAudGVzdC5QZXJzb25TZXJ2aWNlSW1wbDogIitwZXJzb24xLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGVyc29uW10gZ2V0UGVyc29ucygpewotICAgICAgICByZXR1cm4gKFBlcnNvbltdKWRpcmVjdG9yeS50b0FycmF5KG5ldyBQZXJzb25bZGlyZWN0b3J5LnNpemUoKV0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGVyc29uIGZpbmRQZXJzb24oSW50ZWdlciBpZCl7Ci0gICAgICAgCi0gICAgICAgIFBlcnNvbiBtb2EgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIG1vYS5zZXRGaXJzdE5hbWUoIkd1aWxsYXVtZSIpOwotICAgICAgICBtb2Euc2V0TGFzdE5hbWUoIkFsbGVvbiIpOwotICAgICAgICBtb2Euc2V0SWQobmV3IEludGVnZXIoNykpOwotICAgICAgICBsb2dnZXIuZGVidWcoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3NvYXAudGVzdC5maW5kUGVyc29uOiAiK21vYS50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIFBlcnNvbiBwID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGRpcmVjdG9yeS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHAgPSAoUGVyc29uKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoIm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3NvYXAudGVzdC5maW5kUGVyc29uOiAiK3AudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAocC5nZXRJZCgpID09IGlkKSByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1vYTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvVGVzdDEuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9UZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjMxZWMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9UZXN0MS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1pbXBvcnQgZ3Jvb3Z5Lm5ldC5zb2FwLlNvYXBDbGllbnQKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5YRmlyZQotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5YRmlyZUZhY3RvcnkKLWltcG9ydCBvcmcuY29kZWhhdXMueGZpcmUuc2VydmVyLmh0dHAuWEZpcmVIdHRwU2VydmVyCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnhmaXJlLnNlcnZpY2UuU2VydmljZQotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5zZXJ2aWNlLmludm9rZXIuT2JqZWN0SW52b2tlcgotaW1wb3J0IG9yZy5jb2RlaGF1cy54ZmlyZS5zZXJ2aWNlLmJpbmRpbmcuT2JqZWN0U2VydmljZUZhY3RvcnkKLQotaW1wb3J0IHRlc3QuUGVyc29uU2VydmljZUltcGwKLWltcG9ydCB0ZXN0LlBlcnNvblNlcnZpY2UKLQotLy8KLS8vIENyZWF0ZSBhIFNvYXBDbGllbnQgdXNpbmcgaHR0cDovL2xvY2FsaG9zdDo4MDkwL1BlcnNvblNlcnZpY2U/d3NkbCBhcyBXU0RMCi0vLyB0aGVuIGl0IHF1ZXJpZXMgdGhlIG1ldGhvZCBmaW5kUGVyc29uIHdoaWNoIHJldHVybnMgb25lIFBlcnNvbiBvYmplY3QKLS8vIAotY2xhc3MgVGVzdDEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICB2b2lkIHRlc3RTb2FwQ2xpZW50KCkgewotICAgICAgICBkZWYgc2VydmljZUZhY3RvcnkgPSBuZXcgT2JqZWN0U2VydmljZUZhY3RvcnkoKQotICAgICAgICBkZWYgc2VydmljZSA9IHNlcnZpY2VGYWN0b3J5LmNyZWF0ZShQZXJzb25TZXJ2aWNlLmNsYXNzKQotICAgICAgICAvLyBTZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgIHNlcnZpY2Uuc2V0UHJvcGVydHkoT2JqZWN0SW52b2tlci5TRVJWSUNFX0lNUExfQ0xBU1MsIFBlcnNvblNlcnZpY2VJbXBsLmNsYXNzKQotICAgICAgICAKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2UgaW4gdGhlIFNlcnZpY2VSZWdpc3RyeQotICAgICAgICBkZWYgeGZpcmUgPSBYRmlyZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5nZXRYRmlyZSgpCi0gICAgICAgIHhmaXJlLmdldFNlcnZpY2VSZWdpc3RyeSgpLnJlZ2lzdGVyKHNlcnZpY2UpCi0gICAgICAgIAotICAgICAgICAvLyBTdGFydCB0aGUgSFRUUCBzZXJ2ZXIKLSAgICAgICAgZGVmIHNlcnZlciA9IG5ldyBYRmlyZUh0dHBTZXJ2ZXIoKQotICAgICAgICBzZXJ2ZXIuc2V0UG9ydCg2OTY5KQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0IFNlcnZlciAmIHJ1biB0ZXN0cyIpCi0gICAgICAgIHNlcnZlci5zdGFydCgpCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlZiBwcm94eSA9IG5ldyBTb2FwQ2xpZW50KCJodHRwOi8vbG9jYWxob3N0OjY5NjkvUGVyc29uU2VydmljZT93c2RsIikKLSAgICAgICAgICAgIGRlZiByZXN1bHQgPSBwcm94eS5maW5kUGVyc29uKDEpCi0gICAgICAgICAgICBhc3NlcnQgKHJlc3VsdC5maXJzdE5hbWUgPT0gIkd1aWxsYXVtZSIpCi0KLSAgICAgICAgICAgIHJlc3VsdCA9IHByb3h5LmdldFBlcnNvbnMoKQotICAgICAgICAgICAgYXNzZXJ0IChyZXN1bHQuUGVyc29uLnNpemUoKSA9PSAzKQotICAgICAgICAgICAgYXNzZXJ0IChyZXN1bHQuUGVyc29uWzBdLmZpcnN0TmFtZSA9PSAiR3VpbGxhdW1lIikKLSAgICAgICAgICAgIGFzc2VydCAocmVzdWx0LlBlcnNvblsyXS5maXJzdE5hbWUgPT0gIkpvY2hlbiIpCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy90ZXN0L1Rlc3QyLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvVGVzdDIuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc5MTZhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dyb292eXNvYXAvc3JjL3Rlc3QvVGVzdDIuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotaW1wb3J0IGdyb292eS5uZXQuc29hcC5Tb2FwU2VydmVyCi1pbXBvcnQgZ3Jvb3Z5Lm5ldC5zb2FwLlNvYXBDbGllbnQKLQotLy8KLS8vIENyZWF0ZSBhIFNvYXBTZXJ2ZXIgb24gbG9jYWxob3N0IHVzaW5nIHBvcnQgNjk2OS4KLS8vIFJlZ2lzdGVyIHNlcmljZSByZXByZXNlbnRlZCBieSBieSB0aGUgR3Jvb3Z5IHNjcmlwdCBNYXRoU2VydmljZS5ncm9vdnkKLS8vCi1jbGFzcyBUZXN0MiBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLQotICAgIHZvaWQgdGVzdFNvYXBDbGllbnQoKSB7Ci0gICAgICAgIGRlZiBzZXJ2ZXIgPSBuZXcgU29hcFNlcnZlcigibG9jYWxob3N0IiwgNjk4MCkKLSAgICAgICAgc2VydmVyLnNldE5vZGUoIk1hdGhTZXJ2aWNlIikKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydCBTZXJ2ZXIgJiBydW4gdGVzdHMiKQotICAgICAgICBzZXJ2ZXIuc3RhcnQoKQotCi0gICAgICAgIHNsZWVwIDIwMDAKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVmIHByb3h5ID0gbmV3IFNvYXBDbGllbnQoImh0dHA6Ly9sb2NhbGhvc3Q6Njk4MC9NYXRoU2VydmljZUludGVyZmFjZT93c2RsIikKLSAgICAgICAgICAgIGRlZiByZXN1bHQgPSBwcm94eS5hZGQoMS4wLCAyLjApCi0gICAgICAgICAgICBhc3NlcnQgKHJlc3VsdCA9PSAzLjApCi0KLSAgICAgICAgICAgIHJlc3VsdCA9IHByb3h5LnNxdWFyZSgzLjApCi0gICAgICAgICAgICBhc3NlcnQgKHJlc3VsdCA9PSA5LjApCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy90ZXN0L2xvZzRqLnByb3BlcnRpZXMgYi9ncm9vdnkvbW9kdWxlcy9ncm9vdnlzb2FwL3NyYy90ZXN0L2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzRjZGMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5c29hcC9zcmMvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBTZXQgcm9vdCBsb2dnZXIgbGV2ZWwgdG8gREVCVUcgYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIEExLgotbG9nNGoucm9vdExvZ2dlcj1BTEwsIFRYVCwgSFRNTCwgU1RET1VUCi0KLSMgZGV2ZWxvcHBlcnMgbWF5IGNoYW5nZSB0aGUgbG9nZ2luZyBsZXZlbCBvZiBhIHNwZWNpZmljIGxvZ2dlcgotI2xvZzRqLmxvZ2dlci5teWNsYXNzPU9GRiwgU1RET1VUCi0KLSMgU1RET1VUIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlci4KLWxvZzRqLmFwcGVuZGVyLlNURE9VVD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuU1RET1VULmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlNURE9VVC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyVwXVslZF0gJW0lbgotbG9nNGouYXBwZW5kZXIuU1RET1VULnRhcmdldD1TeXN0ZW0uZXJyCi0KLSNEZXZlbG9wZXIgdXNlIHRoaXMgb25lCi0jbG9nNGouYXBwZW5kZXIuU1RET1VULmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJXBdWyVkLSV0LSVsXSAlbSVuCi0KLSMgVFhUIGlzIHNldCB0byBiZSBhIEZpbGVBcHBlbmRlci4KLWxvZzRqLmFwcGVuZGVyLlRYVD1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuVFhULkZpbGU9Z3NvYXAtbG9nLnR4dAotbG9nNGouYXBwZW5kZXIuVFhULmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlRYVC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyVwXVslZC0ldC0lbF0gJW0lbgotCi0jIEhUTUwKLWxvZzRqLmFwcGVuZGVyLkhUTUw9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkhUTUwuRmlsZT1nc29hcC1sb2cuaHRtbAotbG9nNGouYXBwZW5kZXIuSFRNTC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5IVE1MTGF5b3V0Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dzcWwvYnVpbGQueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzdhNDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJnc3FsIiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICAgY29tcGlsZSBzZXR0aW5ncyAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGVidWciIHZhbHVlPSJvbiIvPgotICAKLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8IS0tICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSIuLi8uLi9ncm9vdnktY29yZS90YXJnZXQvaW5zdGFsbC9saWIiLz4KLSAgCQkKLSAgPCEtLSBqYXZhZG9jIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmRpciIgdmFsdWU9ImRvYyIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5wYWNrYWdlcyIgdmFsdWU9Im9yZy5qYXZhbmljdXMuKiIvPgotCi0gIDwhLS0ganVuaXQgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIJdmFsdWU9InRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5yZXBvcnRzLmRpciIgdmFsdWU9InJlcG9ydHMiLz4KLSAgCi0gIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KLSAgPCEtLSAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlcyAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgotICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouemlwIiAvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAKLSAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5jbGFzc2VzLmRpcn0iLz4gIAotICA8L3BhdGg+Ci0gIAotICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiLz4KLQotICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+Ci0gIDwhLS0gICAgICAgICAgICAgICAgICB0YXJnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgotICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIAotICAgICAgICAgIGRlcGVuZHM9InJ1biIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImRlZmF1bHQ6IHJ1biB0aGlzIGdyb292eSBzdHVmZiIKLSAgLz4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iYWxsIiAKLSAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LGRpc3QiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJidWlsZCBhbmQgdGVzdCBldmVyeXRoaW5nIgotICAvPgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJyZW1vdmUgYWxsIGJ1aWx0IGZpbGVzIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhZG9jLmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0iIC8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgCi0gICAgICAgICAgZGVwZW5kcz0iY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBkaXN0cmlidXRhYmxlcyAoamFycyBldGMpIj4KLSAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIgLz4KLSAgICA8amFyIGphcmZpbGU9IiR7ZGlzdC5kaXJ9L2dzcWwuamFyIiAKLSAgICAgICAgIG1hbmlmZXN0PSIke3NyYy5kaXJ9L21hbmlmZXN0LnR4dCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImdlbmVyYXRlIGRvY3VtZW50YXRpb24iPgotICAgIDxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9IiAvPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICAgIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IiAKLSAgICAgICAgICAgICBwYWNrYWdlbmFtZXM9IiR7amF2YWRvYy5wYWNrYWdlc30iCi0gICAgICAgICAgICAgdXNlPSJ0cnVlIgotICAgICAgICAgICAgIHdpbmRvd3RpdGxlPSJnc3FsIgotICAgICAgICAgICAgIHByaXZhdGU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIGFuZCBydW4iPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmphdmFuaWN1cy5nc3FsLkNvbHVtbiIgCi0gICAgICAgICAgZm9yaz0ieWVzIiAKLSAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iYmVhdXRpZnkiIAotICAgICAgICAgIGRlcGVuZHM9ImluaXQiIAotICAgICAgICAgIGRlc2NyaXB0aW9uPSJhcHBseSBqYWNvYmUgYmVhdXRpZmllciB0byB0aGUgamF2YSBzb3VyY2VzIj4KLSAgICA8YXBwbHkgZXhlY3V0YWJsZT0iamFjb2JlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1ub2JhY2t1cCIvPgotICAgICAgPGFyZyB2YWx1ZT0iLW92ZXJ3cml0ZSIvPgotICAgICAgPHNyY2ZpbGUvPgotICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcyA9ICIqKi8qLmphdmEiLz4KLSAgICA8L2FwcGx5PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QiIAotICAgICAgICAgIGRlcGVuZHM9InRlc3QtY29tcGlsZSIgCi0gICAgICAgICAgZGVzY3JpcHRpb249InJ1biBhbGwgdGVzdCBjYXNlcyI+Ci0gICAgPGp1bml0IGhhbHRvbmZhaWx1cmU9InRydWUiIGZvcms9InllcyI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiLz4KLSAgICAgIDxiYXRjaHRlc3Q+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKlRlc3QuY2xhc3MiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gIDwvdGFyZ2V0PgotICAgICAgICAKLSAgPHRhcmdldCBuYW1lPSJwcmV0dHktdGVzdCIgCi0gICAgICAgICAgZGVwZW5kcz0idGVzdC1jb21waWxlIiAKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iSFRNTCBvdXRwdXQgb2YgdGVzdCBjYXNlcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSIvPgotICAgIDxqdW5pdCBoYWx0b25mYWlsdXJlPSJ0cnVlIiBmb3JrPSJ5ZXMiPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB1c2VmaWxlPSJ0cnVlIi8+Ci0KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLQotICAgIDwvanVuaXQ+Ci0KLSAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPHJlcG9ydCBmb3JtYXQ9ImZyYW1lcyIgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iLz4KLSAgICA8L2p1bml0cmVwb3J0PgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImNvbXBpbGUgamF2YSBhbmQgZ3Jvb3Z5IHNvdXJjZXMiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgIDxncm9vdnljIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiAKLSAgICAgICAgICAgICBzcmNkaXI9IiR7c3JjLmRpcn0iCi0gICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4gICAgICAgICAgCi0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9ncm9vdnljPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIAotICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIgCi0gICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5jbGFzc3BhdGgiIAotICAgICAgICAgICBkZWJ1Zz0iJHtidWlsZC5kZWJ1Z30iIAotICAgICAgICAgICBkZXByZWNhdGlvbj0ib24iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InRlc3QtY29tcGlsZSIgZGVwZW5kcz0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGVzdHMiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgPGdyb292eWMgZGVzdGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIgCi0gICAgICAgICAgICAgc3JjZGlyPSIke3Rlc3Quc3JjLmRpcn0iCi0gICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4gICAgICAgICAgCi0gICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgPC9ncm9vdnljPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7dGVzdC5zcmMuZGlyfSIgCi0gICAgICAgICAgIGRlc3RkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iIAotICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAKLSAgICAgICAgICAgZGVidWc9IiR7YnVpbGQuZGVidWd9IiAKLSAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcCAvPgotICA8L3RhcmdldD4KLSAgICAgICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL21hbmlmZXN0LnR4dCBiL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiNDUxMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotTWFpbi1DbGFzczogb3JnLmphdmFuaWN1cy5nc3FsLkNvbHVtbgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL0NvbHVtbi5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvQ29sdW1uLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5OGMzOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvQ29sdW1uLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioKLSAqIHBvcnRlZCBmcm9tIGNvbW1vbnMtc3FsCi0gKiBAYXV0aG9yIEplcmVteSBSYXluZXIKLSAqIEBhdXRob3IgRGllcmsgS29lbmlnLCBhZGFwdGVkIHRvIGpzci0wNAotICovCi1wYWNrYWdlIG9yZy5qYXZhbmljdXMuZ3NxbAotCi1wdWJsaWMgY2xhc3MgQ29sdW1uIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICBAUHJvcGVydHkgbmFtZQotICAgIEBQcm9wZXJ0eSBncm9vdnlOYW1lCi0gICAgQFByb3BlcnR5IGJvb2xlYW4gcHJpbWFyeUtleQotICAgIEBQcm9wZXJ0eSByZXF1aXJlZAotICAgIEBQcm9wZXJ0eSBhdXRvSW5jcmVtZW50Ci0gICAgQFByb3BlcnR5IHR5cGVDb2RlCi0gICAgQFByb3BlcnR5IHR5cGUKLSAgICBAUHJvcGVydHkgc2l6ZQotICAgIEBQcm9wZXJ0eSBkZWZhdWx0VmFsdWUKLSAgICBAUHJvcGVydHkgc2NhbGUKLSAgICBAUHJvcGVydHkgcHJlY2lzaW9uUmFkaXgKLSAgICBAUHJvcGVydHkgb3JkaW5hbFBvc2l0aW9uCi0gICAgcHJpdmF0ZSB0eXBlTWFwCi0KLSAgICBwdWJsaWMgQ29sdW1uKHR5cGVNYXApIHsKLSAgICAgICAgdGhpcy50eXBlTWFwID0gdHlwZU1hcAotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHByaW1hcnlLZXkgPSBmYWxzZQotICAgICAgICByZXF1aXJlZCA9IGZhbHNlCi0gICAgICAgIGF1dG9JbmNyZW1lbnQgPSBmYWxzZQotICAgICAgICBzaXplID0gbnVsbAotICAgICAgICBkZWZhdWx0VmFsdWUgPSBudWxsCi0gICAgICAgIHNjYWxlID0gMAotICAgICAgICBwcmVjaXNpb25SYWRpeCA9IDEwCi0gICAgICAgIG9yZGluYWxQb3NpdGlvbiA9IDAKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvL3RvZG86IHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlZiByZXN1bHQgPSBuZXcgQ29sdW1uKHR5cGVNYXApCi0gICAgICAgIAotICAgICAgICByZXN1bHQubmFtZSAgICAgICAgICAgID0gbmFtZQotICAgICAgICByZXN1bHQuZ3Jvb3Z5TmFtZSAgICAgID0gZ3Jvb3Z5TmFtZQotICAgICAgICByZXN1bHQucHJpbWFyeUtleSAgICAgID0gcHJpbWFyeUtleQotICAgICAgICByZXN1bHQucmVxdWlyZWQgICAgICAgID0gcmVxdWlyZWQKLSAgICAgICAgcmVzdWx0LmF1dG9JbmNyZW1lbnQgICA9IGF1dG9JbmNyZW1lbnQKLSAgICAgICAgcmVzdWx0LnR5cGVDb2RlICAgICAgICA9IHR5cGVDb2RlCi0gICAgICAgIHJlc3VsdC50eXBlICAgICAgICAgICAgPSB0eXBlCi0gICAgICAgIHJlc3VsdC5zaXplICAgICAgICAgICAgPSBzaXplCi0gICAgICAgIHJlc3VsdC5kZWZhdWx0VmFsdWUgICAgPSBkZWZhdWx0VmFsdWUKLSAgICAgICAgcmVzdWx0LnNjYWxlICAgICAgICAgICA9IHNjYWxlCi0gICAgICAgIHJlc3VsdC5wcmVjaXNpb25SYWRpeCAgPSBwcmVjaXNpb25SYWRpeAotICAgICAgICByZXN1bHQub3JkaW5hbFBvc2l0aW9uID0gb3JkaW5hbFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotICAgIH0KLQotICAgIHB1YmxpYyBDb2x1bW4oVHlwZU1hcCB0eXBlTWFwLCBuYW1lLCBncm9vdnlOYW1lLCBpbnQgdHlwZUNvZGUsIHNpemUsIHJlcXVpcmVkLCBwcmltYXJ5S2V5LCBhdXRvSW5jcmVtZW50LCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgLy9idWc/ICAgICAgICB0aGlzKHR5cGVNYXApCi0gICAgICAgIHRoaXMudHlwZU1hcCA9IHR5cGVNYXAKLSAgICAgICAgdGhpcy5zZXROYW1lKG5hbWUpCi0gICAgICAgIHRoaXMuc2V0R3Jvb3Z5TmFtZShncm9vdnlOYW1lKQotICAgICAgICB0aGlzLnNldFR5cGVDb2RlKHR5cGVDb2RlKQotICAgICAgICB0aGlzLnNldFNpemUoc2l6ZSkKLSAgICAgICAgdGhpcy5zZXRSZXF1aXJlZChyZXF1aXJlZCkKLSAgICAgICAgdGhpcy5zZXRQcmltYXJ5S2V5KHByaW1hcnlLZXkpCi0gICAgICAgIHRoaXMuc2V0QXV0b0luY3JlbWVudChhdXRvSW5jcmVtZW50KQotICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb2x1bW4odHlwZU1hcCwgbmFtZSwgZ3Jvb3Z5TmFtZSwgU3RyaW5nIHR5cGUsIHNpemUsIHJlcXVpcmVkLCBwcmltYXJ5S2V5LCBhdXRvSW5jcmVtZW50LCBkZWZhdWx0VmFsdWUgKSB7Ci0gICAgICAgIHRoaXModHlwZU1hcCwgbmFtZSwgZ3Jvb3Z5TmFtZSwgdHlwZU1hcC5nZXRKZGJjVHlwZUNvZGUodHlwZSksIHNpemUsIHJlcXVpcmVkLCBwcmltYXJ5S2V5LCBhdXRvSW5jcmVtZW50LCBkZWZhdWx0VmFsdWUpCi0gICAgfQotCi0gICAgcHVibGljIENvbHVtbih0eXBlTWFwLCBuYW1lLCBncm9vdnlOYW1lLCB0eXBlQ29kZSwgc2l6ZSwgcmVxdWlyZWQsIHByaW1hcnlLZXksIGF1dG9JbmNyZW1lbnQsIGRlZmF1bHRWYWx1ZSwgc2NhbGUpIHsKLSAgICAgICAgLy9idWc/ICAgICAgICB0aGlzKHR5cGVNYXApCi0gICAgICAgIHRoaXMudHlwZU1hcCA9IHR5cGVNYXAKLSAgICAgICAgdGhpcy5zZXROYW1lKG5hbWUpCi0gICAgICAgIHRoaXMuc2V0R3Jvb3Z5TmFtZShncm9vdnlOYW1lKQotICAgICAgICB0aGlzLnNldFR5cGVDb2RlKHR5cGVDb2RlKQotICAgICAgICB0aGlzLnNldFNpemUoc2l6ZSkKLSAgICAgICAgdGhpcy5zZXRSZXF1aXJlZChyZXF1aXJlZCkKLSAgICAgICAgdGhpcy5zZXRQcmltYXJ5S2V5KHByaW1hcnlLZXkpCi0gICAgICAgIHRoaXMuc2V0QXV0b0luY3JlbWVudChhdXRvSW5jcmVtZW50KQotICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpCi0gICAgICAgIHRoaXMuc2V0U2NhbGUoc2NhbGUpCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJDb2x1bW5bbmFtZT0ke25hbWV9O3R5cGU9JHt0eXBlfV0iCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZUNvZGUoaW50IHR5cGVDb2RlKSB7Ci0gICAgICAgIHRoaXMudHlwZUNvZGUgPSB0eXBlQ29kZQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlTWFwLmdldEpkYmNUeXBlTmFtZSh0eXBlQ29kZSkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGUKLSAgICAgICAgdGhpcy50eXBlQ29kZSA9IHR5cGVNYXAuZ2V0SmRiY1R5cGVDb2RlKHR5cGUpCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotICAgICAgICBpbnQgcG9zID0gc2l6ZS5pbmRleE9mKCIsIikKLQotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZS5zdWJzdHJpbmcoMCwgcG9zKQotICAgICAgICAgICAgc2NhbGUgICAgID0gSW50ZWdlci5wYXJzZUludChzaXplLnN1YnN0cmluZyhwb3MgKyAxKSkKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9EYXRhYmFzZS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvRGF0YWJhc2UuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE2NThhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9EYXRhYmFzZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5qYXZhbmljdXMuZ3NxbAotCi0vL0B0b2RvIHNob3VsZCBleHRlbmQgRXhwYW5kbywgc3VwZXIuZ2V0UHJvcGVydHkoKSB3aWxsIGN1cnJlbnRseSBhbHdheXMgcmV0dXJuCi0vLyAgICAgICAgc29tZXRoaW5nLCBldmVuIGlmIGl0J3MgbnVsbC4gRXhwYW5kbyBjb3VsZCBlaXRoZXIgdGhyb3cgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbgotLy8gICAgICAgIG9yIHRoaXMgY2xhc3MgY291bGQgY2hlY2sgZm9yIG51bGwgcmV0dXJuLCBhbmQgZmluZFRhYmxlKCkgaW5zdGVhZAotcHVibGljIGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7Ci0gICAgQFByb3BlcnR5IG5hbWUKLSAgICBAUHJvcGVydHkgdmVyc2lvbgotICAgIEBQcm9wZXJ0eSBMaXN0IHRhYmxlcwotCi0gICAgcHVibGljIERhdGFiYXNlKGFOYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IGFOYW1lCi0gICAgICAgIHRhYmxlcyA9IFtdCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVyZ2VXaXRoKERhdGFiYXNlIG90aGVyRGIpIHsgLy90aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgb3RoZXJEYi50YWJsZXMuZWFjaCgpIHsKLSAgICAgICAgICAgIGlmIChmaW5kVGFibGUoaXQubmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vQHRvZG8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFibGUgJHt0YWJsZS5uYW1lfSBhbHJlYWR5IGRlZmluZWQgaW4gdGhpcyBkYXRhYmFzZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWJsZXMgPDwgaXQuY2xvbmUoKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRUYWJsZShwcm9wZXJ0eU5hbWUpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIFRhYmxlIGZpbmRUYWJsZShTdHJpbmcgYU5hbWUpIHsKLSAgICAgICAgdGFibGVzLmZpbmQoKSB7aXQubmFtZS5lcXVhbHNJZ25vcmVDYXNlKGFOYW1lKX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAiRGF0YWJhc2VbbmFtZT0ke25hbWV9O3RhYmxlQ291bnQ9JHt0YWJsZXMuc2l6ZSgpfV0iCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL0ZvcmVpZ25LZXkuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL0ZvcmVpZ25LZXkuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQyNjcwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9Gb3JlaWduS2V5Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsCi0KLXB1YmxpYyBjbGFzcyBGb3JlaWduS2V5IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICBAUHJvcGVydHkgZm9yZWlnblRhYmxlCi0gICAgQFByb3BlcnR5IExpc3QgcmVmZXJlbmNlcwotICAgIAotICAgIHB1YmxpYyBGb3JlaWduS2V5KCkgewotICAgICAgICByZWZlcmVuY2VzID0gW10KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsgLy8gQHRvZG8gdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZGVmIHJlc3VsdCA9IG5ldyBGb3JlaWduS2V5KCkKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdC5mb3JlaWduVGFibGUgPSBmb3JlaWduVGFibGUKLSAgICAgICAgcmVzdWx0LnJlZmVyZW5jZXMgICA9IHJlZmVyZW5jZXMuY2xvbmUoKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvSW5kZXguZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL0luZGV4Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4MjYwOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvSW5kZXguZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuamF2YW5pY3VzLmdzcWwKLQotcHVibGljIGNsYXNzIEluZGV4IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICBAUHJvcGVydHkgbmFtZQotICAgIEBQcm9wZXJ0eSBMaXN0IGluZGV4Q29sdW1ucwotICAgICAgICAKLSAgICBwdWJsaWMgSW5kZXgoKSB7Ci0gICAgICAgIGluZGV4Q29sdW1ucyA9IFtdCi0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvL0B0b2RvIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlZiByZXN1bHQgPSBuZXcgSW5kZXgoKQotICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdC5uYW1lICAgICAgICAgPSBuYW1lCi0gICAgICAgIHJlc3VsdC5pbmRleENvbHVtbnMgPSBpbmRleENvbHVtbnMuY2xvbmUoKQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvUmVmZXJlbmNlLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9SZWZlcmVuY2UuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJiYWUyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9SZWZlcmVuY2UuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuamF2YW5pY3VzLmdzcWwKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0gICAgQFByb3BlcnR5IGxvY2FsCi0gICAgQFByb3BlcnR5IGZvcmVpZ24KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvLyBAdG9kbyB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICBkZWYgcmVzdWx0ID0gbmV3IFJlZmVyZW5jZSgpCi0gICAgICAgIAotICAgICAgICByZXN1bHQubG9jYWwgICA9IGxvY2FsCi0gICAgICAgIHJlc3VsdC5mb3JlaWduID0gZm9yZWlnbgotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL1JlbGF0aW9uYWxCdWlsZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvUmVsYXRpb25hbEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NTc2Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvUmVsYXRpb25hbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgcmVsYXRpb25hbCBkYXRhYmFzZSBzY2hlbWFzCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8KLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotcHVibGljIGNsYXNzIFJlbGF0aW9uYWxCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgewotICAgIHByaXZhdGUgVHlwZU1hcCB0eXBlTWFwOwotICAgIHByaXZhdGUgTWFwIGZhY3RvcmllczsKLSAgICAvLyAgICBwcml2YXRlIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICBwdWJsaWMgUmVsYXRpb25hbEJ1aWxkZXIoVHlwZU1hcCB0eXBlTWFwKSB7Ci0gICAgICAgIHRoaXMudHlwZU1hcCA9IHR5cGVNYXA7Ci0gICAgICAgIGZhY3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZhY3Rvcmllcy5wdXQoImRhdGFiYXNlIixuZXcgRGF0YWJhc2VGYWN0b3J5KCkpOwotICAgICAgICBmYWN0b3JpZXMucHV0KCJ0YWJsZSIsbmV3IFRhYmxlRmFjdG9yeSgpKTsKLSAgICAgICAgZmFjdG9yaWVzLnB1dCgiY29sdW1uIixuZXcgQ29sdW1uRmFjdG9yeSgpKTsKLSAgICAgICAgZmFjdG9yaWVzLnB1dCgiZm9yZWlnbktleSIsbmV3IEZvcmVpZ25LZXlGYWN0b3J5KCkpOwotICAgICAgICBmYWN0b3JpZXMucHV0KCJyZWZlcmVuY2UiLG5ldyBSZWZlcmVuY2VGYWN0b3J5KCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1hcCBwYXNzVGhyb3VnaE5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRQYXJlbnQoIiArIHBhcmVudCArICIsIiArIGNoaWxkICsgIikiKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZvcmVpZ25LZXkpIHsKLSAgICAgICAgICAgICAgICBGb3JlaWduS2V5IGZvcmVpZ25LZXkgPSAoRm9yZWlnbktleSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgZm9yZWlnbktleS5nZXRSZWZlcmVuY2VzKCkuYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb2x1bW4pIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZSkgewotICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gKFRhYmxlKXBhcmVudDsKLSAgICAgICAgICAgICAgICB0YWJsZS5nZXRDb2x1bW5zKCkuYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBGb3JlaWduS2V5KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGUpIHsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgdGFibGUuZ2V0Rm9yZWlnbktleXMoKS5hZGQoY2hpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRhYmxlKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRGF0YWJhc2UpIHsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBkYXRhYmFzZSA9IChEYXRhYmFzZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgZGF0YWJhc2UuZ2V0VGFibGVzKCkuYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG5vZGVDb21wbGV0ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5vZGUpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGVDb21wbGV0ZWQoIiArIHBhcmVudCArICIsIiArIG5vZGUgKyAiKSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSkgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlTm9kZShuYW1lOiIgKyBuYW1lICsgIikiKTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZU5vZGUobmFtZToiICsgbmFtZSArICIsdmFsdWU6IiArIHZhbHVlICsgIikiKTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVOb2RlKG5hbWU6IiArIG5hbWUgKyAiLGF0dHJpYnV0ZXM6IiArIGF0dHJpYnV0ZXMgKyAiLHZhbHVlOiIgKyB2YWx1ZSArICIpIik7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIC8vQHRvZG8gLSBpcyB0aGlzIGEgc3VpdGFibGUgcmV0dXJuIGZvciB1bnJlY29nbmlzZWQgbm9kZSB0eXBlcz8KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG5hbWU7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVOb2RlKG5hbWU6IiArIG5hbWUgKyAiLGF0dHJpYnV0ZXM6IiArIGF0dHJpYnV0ZXMgKyAiKSIpOwotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSAoU3RyaW5nKWF0dHJpYnV0ZXMuZ2V0KCJuYW1lIik7Ci0gICAgICAgIEZhY3RvcnkgZmFjdG9yeSA9IChGYWN0b3J5KWZhY3Rvcmllcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkubWFrZShub2RlTmFtZSxhdHRyaWJ1dGVzLG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRBdHRyaWJ1dGVzKE9iamVjdCByZXN1bHQsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdHIubmV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHJlc3VsdCwgKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL2lnbm9yZSB1bmtub3duIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgICAgIAotICAgIAotICAgIHByaXZhdGUgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgICAgICBPYmplY3QgbWFrZShTdHJpbmcgbm9kZU5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpOwotICAgIH0KLSAgICBwcml2YXRlIGNsYXNzIERhdGFiYXNlRmFjdG9yeSBpbXBsZW1lbnRzIEZhY3RvcnkgewotICAgICAgICBwdWJsaWMgT2JqZWN0IG1ha2UoU3RyaW5nIG5vZGVOYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBEYXRhYmFzZSBkYXRhYmFzZSA9IG5ldyBEYXRhYmFzZShub2RlTmFtZSk7Ci0gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzKGRhdGFiYXNlLGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgY2xhc3MgVGFibGVGYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeSB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgbWFrZShTdHJpbmcgbm9kZU5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKG5vZGVOYW1lKTsKLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZXModGFibGUsYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGFibGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBjbGFzcyBDb2x1bW5GYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeSB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgbWFrZShTdHJpbmcgbm9kZU5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIENvbHVtbiBjb2x1bW4gPSBuZXcgQ29sdW1uKHR5cGVNYXApOwotICAgICAgICAgICAgc2V0QXR0cmlidXRlcyhjb2x1bW4sYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29sdW1uOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgY2xhc3MgRm9yZWlnbktleUZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5IHsKLSAgICAgICAgcHVibGljIE9iamVjdCBtYWtlKFN0cmluZyBub2RlTmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgRm9yZWlnbktleSBmb3JlaWduS2V5ID0gbmV3IEZvcmVpZ25LZXkoKTsKLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZXMoZm9yZWlnbktleSxhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIHJldHVybiBmb3JlaWduS2V5OwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgY2xhc3MgUmVmZXJlbmNlRmFjdG9yeSBpbXBsZW1lbnRzIEZhY3RvcnkgewotICAgICAgICBwdWJsaWMgT2JqZWN0IG1ha2UoU3RyaW5nIG5vZGVOYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgc2V0QXR0cmlidXRlcyhyZWZlcmVuY2UsYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL1NxbEdlbmVyYXRvci5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvU3FsR2VuZXJhdG9yLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyNzNkOS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvU3FsR2VuZXJhdG9yLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKioKLSAqIEdlbmVyYXRlcyBnZW5lcmljIFNRTCBmb3IgUmVsYXRpb25hbCBTdHJ1Y3R1cmVzCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+Ci0gKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKiAKLSAqIHBvcnRlZCBmcm9tICJjb21tb25zLXNxbCIgW1NxbEJ1aWxkZXIuamF2YV0gLSByZXZpc2lvbiAxLjE0Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+Ci0gKiBAYXV0aG9yIEpvaG4gTWFyc2hhbGwvQ29ubmVjdHJpYQotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsCi0KLXB1YmxpYyBjbGFzcyBTcWxHZW5lcmF0b3IgewotICAgIEBQcm9wZXJ0eSBsaW5lU2VwYXJhdG9yCi0gICAgICAgICAgICAgIAotICAgIC8qKiBUaGUgY3VycmVudCBXcml0ZXIgdXNlZCB0byBvdXRwdXQgdGhlIFNRTCB0byAqLwotICAgIEBQcm9wZXJ0eSB3cml0ZXIKLSAgICAKLSAgICAvKiogVGhlIGluZGVudGF0aW9uIHVzZWQgdG8gaW5kZW50IGNvbW1hbmRzICovCi0gICAgQFByb3BlcnR5IGluZGVudAotICAgIAotICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBwcmltYXJ5IGtleSBjb25zdHJhaW50cyBhcmUgZW1iZWRkZWQgaW5zaWRlIHRoZSBjcmVhdGUgdGFibGUgc3RhdGVtZW50LCB0aGUgZGVmYXVsdCBpcyB0cnVlICovCi0gICAgQFByb3BlcnR5IHByaW1hcnlLZXlFbWJlZGRlZAotICAgIAotICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBhcmUgZW1iZWRkZWQgaW5zaWRlIHRoZSBjcmVhdGUgdGFibGUgc3RhdGVtZW50ICovCi0gICAgQFByb3BlcnR5IGZvcmVpZ25LZXlzRW1iZWRkZWQKLSAgICAgICAgICAgICAgCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IGluZGV4ZXMgYXJlIGVtYmVkZGVkIGluc2lkZSB0aGUgY3JlYXRlIHRhYmxlIHN0YXRlbWVudCAqLwotICAgIEBQcm9wZXJ0eSBpbmRleGVzRW1iZWRkZWQKLSAgICAKLSAgICAvKiogU2hvdWxkIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGJlIGV4cGxpY2l0bHkgbmFtZWQgKi8KLSAgICBAUHJvcGVydHkgZm9yZWlnbktleUNvbnN0cmFpbnRzTmFtZWQKLSAgICAKLSAgICAvKiogSXMgYW4gQUxURVIgVEFCTEUgbmVlZGVkIHRvIGRyb3AgaW5kZXhlcz8gKi8KLSAgICBAUHJvcGVydHkgYWx0ZXJUYWJsZUZvckRyb3AKLSAgICAKLSAgICAvKiogQSBjb3VudGVyIHVzZWQgdG8gY291bnQgdGhlIGNvbnN0cmFpbnRzICovCi0gICAgcHJpdmF0ZSBjb3VudGVyCi0gICAgICAgICAgICAgIAotICAgIC8qKiB0eXBlIG1hcHBpbmdzICovCi0gICAgcHJpdmF0ZSB0eXBlTWFwCi0gICAgICAgICAgICAgIAotLy9AdG9kbyBqcnIKLS8vICAgIHB1YmxpYyBTcWxHZW5lcmF0b3IoKSB7Ci0vLyAgICAgICAgdGhpcyhuZXcgVHlwZU1hcCgpLFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiwgIlxuIiApKQotLy8gICAgfQotICAgIAotICAgIHB1YmxpYyBTcWxHZW5lcmF0b3IoVHlwZU1hcCB0eXBlTWFwLFN0cmluZyBsaW5lU2VwYXJhdG9yKSB7Ci0gICAgICAgIHRoaXMudHlwZU1hcCA9IHR5cGVNYXAKLSAgICAgICAgdGhpcy5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcgotICAgICAgICBpbmRlbnQgPSAiICAgICIKLSAgICAgICAgcHJpbWFyeUtleUVtYmVkZGVkID0gdHJ1ZSAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3V0cHV0cyB0aGUgRERMIHJlcXVpcmVkIHRvIGRyb3AgYW5kIHJlY3JlYXRlIHRoZSBkYXRhYmFzZSAKLSAgICAgKi8KLS8vQHRvZG8ganJyIHJlbW92ZQotLy8gICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YWJhc2UoRGF0YWJhc2UgZGF0YWJhc2UpIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gICAgICAgIGNyZWF0ZURhdGFiYXNlKGRhdGFiYXNlLCB0cnVlKQotLy8gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE91dHB1dHMgdGhlIERETCByZXF1aXJlZCB0byBkcm9wIGFuZCByZWNyZWF0ZSB0aGUgZGF0YWJhc2UgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRGF0YWJhc2UoZGF0YWJhc2UsIHNob3VsZERyb3BUYWJsZSkgeyAvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGxldHMgZHJvcCB0aGUgdGFibGVzIGluIHJldmVyc2Ugb3JkZXIgYXMgaXRzIGxlc3MgbGlrZWx5IHRvIGNhdXNlCi0gICAgICAgIC8vIHByb2JsZW1zIHdpdGggcmVmZXJlbnRpYWwgY29uc3RyYWludHMKLSAgICAgICAgaWYgKHNob3VsZERyb3BUYWJsZSkgewotICAgICAgICAgICAgZGF0YWJhc2UudGFibGVzLnJldmVyc2VFYWNoIHsKLSAgICAgICAgICAgICAgICBkcm9wVGFibGUoaXQpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh0YWJsZSBpbiBkYXRhYmFzZS50YWJsZXMpIHsKLSAgICAgICAgICAgIHRhYmxlQ29tbWVudCh0YWJsZSkKLSAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHRhYmxlKQotICAgICAgICB9Ci0vL0B0b2RvIDwtLSBidWcgY2Fubm90IHNlZSBjcmVhdGVUYWJsZShpdCkgaW5zaWRlIGNsb3N1cmU/Pz8/ICAgICAgICAKLS8vICAgICAgICBkYXRhYmFzZS50YWJsZXMuZWFjaCB7Ci0vLyAgICAgICAgICAgIHRhYmxlQ29tbWVudChpdCkKLS8vICAgICAgICAgICAgY3JlYXRlVGFibGUoaXQpCi0vLyAgICAgICAgfQotICAgICAgICAvLyB3ZSdyZSB3cml0aW5nIHRoZSBmb3JlaWdua2V5cyBsYXN0IHRvIGVuc3VyZSB0aGF0IGFsbCByZWZlcmVuY2VkIHRhYmxlcyBhcmUgYWxyZWFkeSBkZWZpbmVkCi0gICAgICAgIGZvciAodGFibGUgaW4gZGF0YWJhc2UudGFibGVzKSB7Ci0gICAgICAgICAgICBjcmVhdGVFeHRlcm5hbEZvcmVpZ25LZXkodGFibGUpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIE91dHB1dHMgdGhlIERETCByZXF1aXJlZCB0byBkcm9wIHRoZSBkYXRhYmFzZSAKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZHJvcERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbGV0cyBkcm9wIHRoZSB0YWJsZXMgaW4gcmV2ZXJzZSBvcmRlcgotICAgICAgICBkYXRhYmFzZS50YWJsZXMucmV2ZXJzZUVhY2ggewotICAgICAgICAgICAgdGFibGVDb21tZW50KGl0KQotICAgICAgICAgICAgZHJvcFRhYmxlKGl0KQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgICogT3V0cHV0cyBhIGNvbW1lbnQgZm9yIHRoZSB0YWJsZQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUNvbW1lbnQodGFibGUpIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cHJpbnRDb21tZW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCi0gICAgICAgIHdwcmludENvbW1lbnQodGFibGUubmFtZSkKLSAgICAgICAgd3ByaW50Q29tbWVudCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQotICAgICAgICB3cHJpbnRsbigpCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAgKiBPdXRwdXRzIHRoZSBEREwgdG8gZHJvcCB0aGUgdGFibGUKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZHJvcFRhYmxlKFRhYmxlIHRhYmxlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3ByaW50KCJkcm9wIHRhYmxlICR7dGFibGUubmFtZX0iKQotICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgICogT3V0cHV0cyB0aGUgRERMIHRvIGNyZWF0ZSB0aGUgdGFibGUgYWxvbmcgd2l0aCBhbnkgbm9uLWV4dGVybmFsIGNvbnN0cmFpbnRzCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRhYmxlKHRhYmxlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3ByaW50bG4oImNyZWF0ZSB0YWJsZSAke3RhYmxlLm5hbWV9ICgiKQotICAgICAgICAKLSAgICAgICAgd3JpdGVDb2x1bW5UeXBlcyh0YWJsZSkKLSAgICAgICAgCi0gICAgICAgIGlmIChwcmltYXJ5S2V5RW1iZWRkZWQpIHsKLSAgICAgICAgICAgIHdyaXRlUHJpbWFyeUtleXModGFibGUpCi0gICAgICAgIH0KLS8vQHRvZG8ganJyICAgICAgICBpZiAoZm9yZWlnbktleXNFbWJlZGRlZCkgewotLy8gICAgICAgICAgICB3cml0ZUZvcmVpZ25LZXlzKHRhYmxlKQotLy8gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4ZXNFbWJlZGRlZCkgewotICAgICAgICAgICAgd3JpdGVFbWJlZGRlZEluZGV4ZXModGFibGUpCi0gICAgICAgIH0KLSAgICAgICAgd3ByaW50bG4oKQotICAgICAgICB3cHJpbnQoIikiKQotICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0gICAgICAgIAotICAgICAgICBpZiAocHJpbWFyeUtleUVtYmVkZGVkKSB7Ci0gICAgICAgICAgICB3cml0ZVByaW1hcnlLZXlzQWx0ZXJUYWJsZSh0YWJsZSkKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluZGV4ZXNFbWJlZGRlZCkgewotICAgICAgICAgICAgd3JpdGVJbmRleGVzKHRhYmxlKQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKiAKLSAgICAgICogQ3JlYXRlcyBhbiBleHRlcm5hbCBmb3JlaWdua2V5IGRlZmluaXRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUV4dGVybmFsRm9yZWlnbktleShUYWJsZSB0YWJsZSkgeyAvLyBAdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWZvcmVpZ25LZXlzRW1iZWRkZWQpIHsKLSAgICAgICAgICAgIHdyaXRlRm9yZWlnbktleXNBbHRlclRhYmxlKHRhYmxlKQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHR3byBjb2x1bW4gc3BlY2lmaWNhdGlvbnMgcmVwcmVzZW50Ci0gICAgICogZGlmZmVyZW50IHR5cGVzLiAgVHlwZSwgbnVsbGFiaWxpdHksIHNpemUsIHNjYWxlLCBkZWZhdWx0IHZhbHVlLAotICAgICAqIGFuZCBwcmVjaXNpb24gcmFkaXggYXJlIHRoZSBhdHRyaWJ1dGVzIGNoZWNrZWQuICBDdXJyZW50bHkgZGVmYXVsdAotICAgICAqIHZhbHVlcyBhcmUgY29tcGFyZWQgd2hlcmUgbnVsbCBhbmQgZW1wdHkgc3RyaW5nIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotICAgICAqIFNlZSBjb21tZW50cyBpbiB0aGUgbWV0aG9kIGJvZHkgZm9yIGV4cGxhbmF0aW9uLgotICAgICAqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlyc3QgRmlyc3QgY29sdW1uIHRvIGNvbXBhcmUKLSAgICAgKiBAcGFyYW0gc2Vjb25kIFNlY29uZCBjb2x1bW4gdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sdW1ucyBkaWZmZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb2x1bW5zRGlmZmVyKGRlc2lyZWQsY3VycmVudCkgewotICAgICAgICBkZWYgcmVzdWx0ID0gZmFsc2UKLQotICAgICAgICAvL1RoZSBjcmVhdGVDb2x1bW4gbWV0aG9kIGxlYXZlcyBvZmYgdGhlIGRlZmF1bHQgY2xhdXNlIGlmIGNvbHVtbi5nZXREZWZhdWx0VmFsdWUoKQotICAgICAgICAvL2lzIG51bGwuICBteVNRTCBpbnRlcnByZXRzIHRoaXMgYXMgYSBkZWZhdWx0IG9mICIiIG9yIDAsIGFuZCB0aHVzIHRoZSBjb2x1bW5zCi0gICAgICAgIC8vYXJlIGFsd2F5cyBkaWZmZXJlbnQgYWNjb3JkaW5nIHRvIHRoaXMgbWV0aG9kLiAgYWx0ZXJEYXRhYmFzZSB3aWxsIGdlbmVyYXRlCi0gICAgICAgIC8vYW4gYWx0ZXIgc3RhdGVtZW50IGZvciB0aGUgY29sdW1uLCBidXQgaXQgd2lsbCBiZSB0aGUgZXhhY3Qgc2FtZSBkZWZpbml0aW9uCi0gICAgICAgIC8vYXMgYmVmb3JlLiAgSW4gb3JkZXIgdG8gYXZvaWQgdGhpcyBzaXR1YXRpb24gSSBhbSBpZ25vcmluZyB0aGUgY29tcGFyaXNvbgotICAgICAgICAvL2lmIHRoZSBkZXNpcmVkIGRlZmF1bHQgaXMgbnVsbC4gIEluIG9yZGVyIHRvICJ1bi1kZWZhdWx0IiBhIGNvbHVtbiB5b3UnbGwKLSAgICAgICAgLy9oYXZlIHRvIGhhdmUgYSBkZWZhdWx0PSIiIG9yIGRlZmF1bHQ9IjAiIGluIHRoZSBzY2hlbWEgeG1sLgotICAgICAgICAvL0lmIHRoaXMgaXMgYmFkIGZvciBvdGhlciBkYXRhYmFzZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGNyZWF0ZUNvbHVtbgotICAgICAgICAvL21ldGhvZCB1c2UgYSAiREVGQVVMVCBOVUxMIiBzdGF0ZW1lbnQgaWYgdGhhdCBpcyB3aGF0IGlzIG5lZWRlZC4KLSAgICAgICAgLy9BIGdvb2Qgd2F5IHRvIGdldCB0aGlzIHdvdWxkIGJlIHRvIHJlcXVpcmUgYSBkZWZhdWx0VmFsdWU9IjxOVUxMPiIgaW4gdGhlCi0gICAgICAgIC8vc2NoZW1hIHhtbCBpZiB5b3UgcmVhbGx5IHdhbnQgbnVsbCBhbmQgbm90IGp1c3QgdW5zcGVjaWZpZWQuCi0gICAgICAgIGRlZiBkZXNpcmVkRGVmYXVsdCA9IGRlc2lyZWQuZGVmYXVsdFZhbHVlCi0gICAgICAgIGRlZiBjdXJyZW50RGVmYXVsdCA9IGN1cnJlbnQuZGVmYXVsdFZhbHVlCi0gICAgICAgIGRlZiBkZWZhdWx0c0VxdWFsID0gKGRlc2lyZWREZWZhdWx0ID09IG51bGwgfHwgZGVzaXJlZERlZmF1bHQuZXF1YWxzKGN1cnJlbnREZWZhdWx0KSkKLSAgICAgICAgZGVmIHNpemVNYXR0ZXJzID0gKGRlc2lyZWQuc2l6ZSAhPSBudWxsKQotICAgICAgICBpZiAoIGRlc2lyZWQudHlwZUNvZGUgIT0gY3VycmVudC50eXBlQ29kZSB8fAotICAgICAgICAgICAgICAgIGRlc2lyZWQucmVxdWlyZWQgIT0gY3VycmVudC5yZXF1aXJlZCB8fAotICAgICAgICAgICAgICAgIChzaXplTWF0dGVycyAmJiBkZXNpcmVkLnNpemUgIT0gY3VycmVudC5zaXplKSB8fAotICAgICAgICAgICAgICAgIGRlc2lyZWQuc2NhbGUgIT0gY3VycmVudC5zY2FsZSB8fAotICAgICAgICAgICAgICAgICFkZWZhdWx0c0VxdWFsIHx8Ci0gICAgICAgICAgICAgICAgZGVzaXJlZC5wcmVjaXNpb25SYWRpeCAhPSBjdXJyZW50LnByZWNpc2lvblJhZGl4ICkgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICB9Ci0gICAgLyoqCi0gICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIGRhdGFiYXNlIHJlcXVpcmVzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIE5VTEwgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAqICAKLSAgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkYXRhYmFzZSByZXF1aXJlcyBOVUxMIGZvciB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgKi8KLSAgICBib29sZWFuIHJlcXVpcmVzTnVsbEFzRGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlCi0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgICogT3V0cHV0cyB0aGUgRERMIHRvIGFkZCBhIGNvbHVtbiB0byBhIHRhYmxlLgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb2x1bW4oVGFibGUgdGFibGUsIENvbHVtbiBjb2x1bW4pIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvL3NlZSBjb21tZW50cyBpbiBjb2x1bW5zRGlmZmVyIGFib3V0IG51bGwvIiIgZGVmYXVsdHMKLSAgICAgICAgd3ByaW50KCIke2NvbHVtbi5uYW1lfSAke2dldFNxbFR5cGUoY29sdW1uKX0gIikKLSAgICAgICAgCi0gICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdwcmludCgiREVGQVVMVCAnJHtjb2x1bW4uZGVmYXVsdFZhbHVlfScgIikKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sdW1uLnJlcXVpcmVkKSB7Ci0gICAgICAgICAgICB3cHJpbnROb3ROdWxsYWJsZSgpCi0gICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZXNOdWxsQXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHdwcmludE51bGxhYmxlKCkKLSAgICAgICAgfQotICAgICAgICB3cHJpbnQoIiAiKQotICAgICAgICBpZiAoY29sdW1uLmF1dG9JbmNyZW1lbnQpIHsKLSAgICAgICAgICAgIHdwcmludEF1dG9JbmNyZW1lbnRDb2x1bW4odGFibGUsIGNvbHVtbikKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIAotICAgIAotICAgIC8qKgotICAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgcHJpbWFyeSBrZXkgY29uc3RyYWludCBmb3IgdGhlIGdpdmVuCi0gICAgICAqICBwcmltYXJ5IGtleSBjb2x1bW5zLiBCeSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBwcmltYXJ5IGtleXMgb3IgdGhlIGNvbHVtbihzKSBhcmUgCi0gICAgICAqICBhbGwgYXV0byBpbmNyZW1lbnQgKGlkZW50aXR5KSBjb2x1bW5zIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBnZW5lcmF0ZSBhIHByaW1hcnkga2V5IAotICAgICAgKiAgY29uc3RyYWludC4KLSAgICAgICovCi0gICAgYm9vbGVhbiBzaG91bGRHZW5lcmF0ZVByaW1hcnlLZXlzKExpc3QgcHJpbWFyeUtleUNvbHVtbnMpIHsKLSAgICAgICAgcmV0dXJuIHByaW1hcnlLZXlDb2x1bW5zLmFueSB7ICFpdC5hdXRvSW5jcmVtZW50IH0KLSAgICB9Ci0gIC8qKgotICAgICogV3JpdGVzIHRoZSBjb2x1bW4gdHlwZXMgZm9yIGEgdGFibGUgCi0gICAqLwotICAgIHZvaWQgd3JpdGVDb2x1bW5UeXBlcyhUYWJsZSB0YWJsZSkgeyAvLyBAdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBkZWYgZmlyc3QgPSB0cnVlCi0gICAgICAgIGZvciAoY29sdW1uIGluIHRhYmxlLmNvbHVtbnMpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlIH0gZWxzZSB7IHdwcmludGxuKCIsICIpfQotICAgICAgICAgICAgd3ByaW50SW5kZW50KCkKLSAgICAgICAgICAgIGNyZWF0ZUNvbHVtbih0YWJsZSwgY29sdW1uKQotICAgICAgICB9Ci0gICAgfQotICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZnVsbCBTUUwgdHlwZSBzdHJpbmcgaW5jbHVkaW5nIHRoZSBzaXplCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNxbFR5cGUoQ29sdW1uIGNvbHVtbikgewotICAgICAgICBuYXRpdmVUeXBlID0gZ2V0TmF0aXZlVHlwZShjb2x1bW4pCi0gICAgICAgIHNxbFR5cGUgPSBuZXcgU3RyaW5nQnVmZmVyKCkgICAgICAgICAgCi0gICAgICAgIGlmIChuYXRpdmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNxbFR5cGUuYXBwZW5kKG5hdGl2ZVR5cGUpCi0gICAgICAgICAgICBpZiAoIGNvbHVtbi5zaXplICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgc3FsVHlwZS5hcHBlbmQoIiAoJHtjb2x1bW4uc2l6ZX0iKQotICAgICAgICAgICAgICAgIGlmICggdHlwZU1hcC5pc0RlY2ltYWxUeXBlKGNvbHVtbi50eXBlKSApewotICAgICAgICAgICAgICAgICAgICBzcWxUeXBlLmFwcGVuZCgiLCR7Y29sdW1uLnNjYWxlfSIpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNxbFR5cGUuYXBwZW5kKCIpIikKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3FsVHlwZS50b1N0cmluZygpCi0gICAgfQotICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBwcmltYXJ5IGtleSBjb25zdHJhaW50cyBpbnNpZGUgYSBjcmVhdGUgdGFibGUgKCkgY2xhdXNlLgotICAgICovCi0gICAgdm9pZCB3cml0ZVByaW1hcnlLZXlzKFRhYmxlIHRhYmxlKSB7Ly8gQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvL0B0b2RvIHByb3RlY3RlZAotICAgICAgICAKLSAgICAgICAgaWYgKHRhYmxlLnByaW1hcnlLZXlDb2x1bW5zLnNpemUoKSA+IDAgJiYgc2hvdWxkR2VuZXJhdGVQcmltYXJ5S2V5cyh0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucykpIHsKLSAgICAgICAgICAgIHdwcmludGxuKCIsIikKLSAgICAgICAgICAgIHdwcmludEluZGVudCgpCi0gICAgICAgICAgICB3cml0ZVByaW1hcnlLZXlTdGF0ZW1lbnQodGFibGUucHJpbWFyeUtleUNvbHVtbnMpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICAqIFdyaXRlcyB0aGUgcHJpbWFyeSBrZXkgY29uc3RyYWludHMgYXMgYW4gQWx0ZXJUYWJsZSBjbGF1c2UuCi0gICAgICAqLwotICAgIHZvaWQgd3JpdGVQcmltYXJ5S2V5c0FsdGVyVGFibGUodGFibGUpIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vQHRvZG8gcHJvdGVjdGVkCi0gICAgICAgIGlmICh0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucy5zaXplKCkgPiAwICYmIHNob3VsZEdlbmVyYXRlUHJpbWFyeUtleXModGFibGUucHJpbWFyeUtleUNvbHVtbnMpKSB7Ci0gICAgICAgICAgICB3cHJpbnRsbigiQUxURVIgVEFCTEUgJHt0YWJsZS5uYW1lfSIpCi0gICAgICAgICAgICB3cHJpbnRJbmRlbnQoKQotICAgICAgICAgICAgd3ByaW50bG4oIkFERCBDT05TVFJBSU5UICR7dGFibGUubmFtZX1fUEsiKQotICAgICAgICAgICAgd3JpdGVQcmltYXJ5S2V5U3RhdGVtZW50KHRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKTsKLSAgICAgICAgICAgIHdwcmludEVuZE9mU3RhdGVtZW50KCkKLSAgICAgICAgICAgIHdwcmludGxuKCkKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgICogV3JpdGVzIHRoZSAnUFJJTUFSWSBLRVkoQSxCLC4uLixOKScgc3RhdGVtZW50Ci0gICAgICAqLwotICAgICAgICAKLSAgICAgdm9pZCB3cml0ZVByaW1hcnlLZXlTdGF0ZW1lbnQocHJpbWFyeUtleUNvbHVtbnMpIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgIC8vQHRvZG8gcHJvdGVjdGVkCi0gICAgICAgIHdwcmludCgiUFJJTUFSWSBLRVkgKCIpCi0gICAgICAgIGRlZiBmaXJzdCA9IHRydWUKLSAgICAgICAgZm9yIChjb2x1bW4gaW4gcHJpbWFyeUtleUNvbHVtbnMpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlIH0gZWxzZSB7IHdwcmludCgiLCAiKX0KLSAgICAgICAgICAgIHdwcmludChjb2x1bW4ubmFtZSkKLSAgICAgICAgfQotICAgICAgICAgd3ByaW50KCIpIikKLSAgICB9Ci0gICAgICAgIAotICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbnNpZGUgYSBjcmVhdGUgdGFibGUgKCkgY2xhdXNlLgotICAgICovCi0gICAgLy8gQHRvZG8ganJyIHRoaXMgd2hvbGUgbWV0aG9kLi4uCi0gICAgLyogICAgdm9pZCB3cml0ZUZvcmVpZ25LZXlzKHRhYmxlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvL0B0b2RvIHByb3RlY3RlZAotICAgICAgICBmb3IgKGtleSBpbiB0YWJsZS5mb3JlaWduS2V5cykgewotICAgICAgICAgICAgaWYgKGtleS5mb3JlaWduVGFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vdG9kbyBsb2cud2FybiggIkZvcmVpZ24ga2V5IHRhYmxlIGlzIG51bGwgZm9yIGtleTogJHtrZXl9IikKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3ByaW50bG4oIiwiKQotICAgICAgICAgICAgICAgIHdwcmludEluZGVudCgpCi0gICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXlDb25zdHJhaW50c05hbWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdwcmludCgiQ09OU1RSQUlOVCAke3RhYmxlLm5hbWV9X0ZLXyR7Kytjb3VudGVyfSAiKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cHJpbnQoIkZPUkVJR04gS0VZICgiKQotICAgICAgICAgICAgICAgIHdyaXRlTG9jYWxSZWZlcmVuY2VzKGtleSkKLSAgICAgICAgICAgICAgICB3cHJpbnRsbigiKSIpCi0gICAgICAgICAgICAgICAgd3ByaW50SW5kZW50KCkKLSAgICAgICAgICAgICAgICB3cHJpbnQoIlJFRkVSRU5DRVMgJHtrZXkuZm9yZWlnblRhYmxlfSAoIikKLSAgICAgICAgICAgICAgICB3cml0ZUZvcmVpZ25SZWZlcmVuY2VzKGtleSkKLSAgICAgICAgICAgICAgICB3cHJpbnRsbigiKSIpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ki8KLSAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgYXMgYW4gQWx0ZXJUYWJsZSBjbGF1c2UuCi0gICAgICovCi0gICB2b2lkIHdyaXRlRm9yZWlnbktleXNBbHRlclRhYmxlKFRhYmxlIHRhYmxlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgIC8vQHRvZG8gcHJvdGVjdGVkICAgICAKLSAgICAgICAgY291bnRlciA9IDAKLSAgICAgICAgZm9yIChrZXkgaW4gdGFibGUuZm9yZWlnbktleXMpIHsKLS8vQHRvZG8ganJyICAgICAgICAgICAgd3JpdGVGb3JlaWduS2V5QWx0ZXJUYWJsZSh0YWJsZSxrZXkpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotLy8gICAgdm9pZCB3cml0ZUZvcmVpZ25LZXlBbHRlclRhYmxlKCBUYWJsZSB0YWJsZSwgRm9yZWlnbktleSBrZXkgKSB7Ly9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gICAgLy9AdG9kbyBwcm90ZWN0ZWQKLS8vICAgICAgICBpZiAoa2V5LmZvcmVpZ25UYWJsZSA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIC8vQHRvZG8gbG9nLndhcm4oICJGb3JlaWduIGtleSB0YWJsZSBpcyBudWxsIGZvciBrZXk6ICR7a2V5fSIpCi0vLyAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgd3ByaW50bG4oIkFMVEVSIFRBQkxFICR7dGFibGUubmFtZX0iKQotLy8gICAgICAgICAgICB3cHJpbnRJbmRlbnQoKQotLy8gICAgICAgICAgICB3cHJpbnQoIkFERCBDT05TVFJBSU5UICR7dGFibGUubmFtZX1fRktfJHsrK2NvdW50ZXJ9ICBGT1JFSUdOIEtFWSAoIikKLS8vICAgICAgICAgICAgd3JpdGVMb2NhbFJlZmVyZW5jZXMoa2V5KQotLy8gICAgICAgICAgICB3cHJpbnRsbigiKSIpCi0vLyAgICAgICAgICAgIHdwcmludEluZGVudCgpCi0vLyAgICAgICAgICAgIHdwcmludCgiUkVGRVJFTkNFUyAke2tleS5mb3JlaWduVGFibGV9ICgiKQotLy8gICAgICAgICAgICB3cml0ZUZvcmVpZ25SZWZlcmVuY2VzKGtleSkKLS8vICAgICAgICAgICAgd3ByaW50bG4oIikiKQotLy8gICAgICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0vLyAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgIH0KLS8vICAgIH0KLSAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgaW5kZXhlcy4KLSAgICAgKi8KLSAgIHZvaWQgd3JpdGVJbmRleGVzKFRhYmxlIHRhYmxlKSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uewotICAgLy9AdG9kbyBwcm90ZWN0ZWQgICAgIAotICAgICAgIGZvciAoaW5kZXggaW4gdGFibGUuaW5kZXhlcykgewotICAgICAgICAgICB3cml0ZUluZGV4KHRhYmxlLGluZGV4KQotICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAvKioKLSAgICAgKiBXcml0ZXMgb25lIGluZGV4IGZvciBhIHRhYmxlCi0gICAgKi8KLSAgICB2b2lkIHdyaXRlSW5kZXgoIHRhYmxlLCBpbmRleCApIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vQHRvZG8gcHJvdGVjdGVkCi0gICAgICAgIGlmIChpbmRleC5uYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vQHRvZG8gbG9nLndhcm4oICJJbmRleCBOYW1lIGlzIG51bGwgZm9yIGluZGV4OiAke2luZGV4fSIpCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cHJpbnQoIkNSRUFURSIpCi0gICAgICAgICAgICBpZiAoIGluZGV4LnVuaXF1ZSApIHsKLSAgICAgICAgICAgICAgICB3cHJpbnQoICIgVU5JUVVFIiApCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cHJpbnQoIiBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGUubmFtZX0gKCIpCi0gICAgICAgICAgICBkZWYgZmlyc3QgPSB0cnVlICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChjb2x1bW4gaW4gaW5kZXguaW5kZXhDb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2UgfSBlbHNlIHsgd3ByaW50KCIsICIpfQotICAgICAgICAgICAgICAgIHdwcmludChjb2x1bW4ubmFtZSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdwcmludCgiKSIpCi0gICAgICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgfQotICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBpbmRleGVzIGVtYmVkZGVkIHdpdGhpbiB0aGUgY3JlYXRlIHRhYmxlIHN0YXRlbWVudC4gbm90Ci0gICAgICogeWV0IGltcGxlbWVudGVkCi0gICAgKi8KLSAgICB2b2lkIHdyaXRlRW1iZWRkZWRJbmRleGVzKHRhYmxlKSB7IC8vIEB0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICAgICAgLy9AdG9kbyBwcm90ZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAvKioKLSAgICAgKiBXcml0ZXMgYSBsaXN0IG9mIGxvY2FsIHJlZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBrZXkKLSAgICAgKi8KLSAgIHZvaWQgd3JpdGVMb2NhbFJlZmVyZW5jZXMoRm9yZWlnbktleSBrZXkpIHsgLy9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgLy9AdG9kbyBwcm90ZWN0ZWQgICAgIAotICAgICAgICBkZWYgZmlyc3QgPSB0cnVlCi0gICAgICAgIGZvciAocmVmZXJlbmNlIGluIGtleS5yZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZSB9IGVsc2UgeyB3cHJpbnQoIiwgIil9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHdwcmludChyZWZlcmVuY2UubG9jYWwpCi0gICAgICAgIH0KLSAgICB9Ci0gICAvKioKLSAgICAgKiBXcml0ZXMgYSBsaXN0IG9mIGZvcmVpZ24gcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIGtleQotICAgICovCi0gICAgdm9pZCB3cml0ZUZvcmVpZ25SZWZlcmVuY2VzKEZvcmVpZ25LZXkga2V5KSB7IC8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvL0B0b2RvIHByb3RlY3RlZAotICAgICAgICBkZWYgZmlyc3QgPSB0cnVlCi0gICAgICAgIGZvciAocmVmZXJlbmNlIGluIGtleS5yZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZSB9IGVsc2UgeyB3cHJpbnQoIiwgIil9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHdwcmludChyZWZlcmVuY2UuZm9yZWlnbikKLSAgICAgICAgfQotICAgIH0KLSAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB0aGF0IGRlbm90ZXMgYSBjb21tZW50IGlmIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBUaGUgY29tbWVudCBwcmVmaXgKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29tbWVudFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuICItLSIKLSAgICB9Ci0gICAgCi0gICAvKioKLSAgICAgKiBQcmludHMgYW4gU1FMIGNvbW1lbnQgdG8gdGhlIGN1cnJlbnQgc3RyZWFtCi0gICAgICovCi0gICAgdm9pZCB3cHJpbnRDb21tZW50KFN0cmluZyB0ZXh0KSB7Ly9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24geyAKLSAgICAvL0B0b2RvIHByb3RlY3RlZCAgICAKLSAgICAgICAgd3ByaW50KGdldENvbW1lbnRQcmVmaXgoKSkKLSAgICAgICAgCi0gICAgICAgIC8vIE15U3FsIGluc2lzdHMgb24gYSBzcGFjZSBhZnRlciB0aGUgZmlyc3QgMiBkYXNoZXMuCi0gICAgICAgIC8vIGh0dHA6Ly93d3cubXlzcWwuY29tL2RvY3VtZW50YXRpb24vbXlzcWwvYnljaGFwdGVyL21hbnVhbF9SZWZlcmVuY2UuaHRtbCNDb21tZW50cwotICAgICAgICAvLyBkdW5ubyBpZiB0aGlzIGlzIGEgY29tbW9uIHRoaW5nCi0gICAgICAgIHdwcmludCgiICIpCi0gICAgICAgIHdwcmludGxuKCB0ZXh0ICkKLSAgICB9Ci0gICAgCi0gICAvKioKLSAgICAgKiBQcmludHMgdGhhdCBhIGNvbHVtbiBpcyBudWxsYWJsZSAKLSAgICAqLwotICAgIHZvaWQgd3ByaW50TnVsbGFibGUoKSB7Ly9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vQHRvZG8gcHJvdGVjdGVkCi0gICAgICAgIHdwcmludCgiTlVMTCIpCi0gICAgfQotICAgIAotICAgLyoqCi0gICAgICogUHJpbnRzIHRoYXQgYSBjb2x1bW4gaXMgbm90IG51bGxhYmxlCi0gICAgICovCi0gICAgdm9pZCB3cHJpbnROb3ROdWxsYWJsZSgpIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy9AdG9kbyBwcm90ZWN0ZWQgICAgCi0gICAgICAgIHdwcmludCgiTk9UIE5VTEwiKTsKLSAgICB9Ci0KLSAgIC8qKiAKLSAgICAgKiBQcmludHMgdGhlIGVuZCBvZiBzdGF0ZW1lbnQgdGV4dCwgd2hpY2ggaXMgdHlwaWNhbGx5IGEgc2VtaSBjb2xvbiBmb2xsb3dlZCBieSAKLSAgICAgKiBhIGNhcnJpYWdlIHJldHVybgotICAgICovCi0gICAgdm9pZCB3cHJpbnRFbmRPZlN0YXRlbWVudCgpIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy9AdG9kbyBwcm90ZWN0ZWQKLSAgICAgICAgd3ByaW50bG4oIjsiKQotICAgICAgICB3cHJpbnRsbigpCi0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFByaW50cyBhIG5ldyBsaW5lCi0gICAgICovCi0gICAgdm9pZCB3cHJpbnRsbigpIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy9AdG9kbyBwcm90ZWN0ZWQKLSAgICAgICAgd3ByaW50KCBsaW5lU2VwYXJhdG9yICkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgc29tZSB0ZXh0Ci0gICAgICovCi0gICAgdm9pZCB3cHJpbnQodGV4dCkgey8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvL0B0b2RvIHByb3RlY3RlZCAgICAKLSAgICAgICAgd3JpdGVyLndyaXRlKHRleHQpCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByaW50cyBzb21lIHRleHQgdGhlbiBhIG5ld2xpbmUKLSAgICAgKi8KLSAgICB2b2lkIHdwcmludGxuKHRleHQpIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy9AdG9kbyBwcm90ZWN0ZWQKLSAgICAgICAgd3ByaW50KHRleHQpCi0gICAgICAgIHdwcmludGxuKCkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgdGhlIGluZGVudGF0aW9uIHVzZWQgdG8gaW5kZW50IFNRTAotICAgICAqLwotICAgIHZvaWQgd3ByaW50SW5kZW50KCkgey8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvL0B0b2RvIHByb3RlY3RlZCAgICAKLSAgICAgICAgd3ByaW50KGdldEluZGVudCgpKQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dHMgdGhlIGZhY3QgdGhhdCB0aGlzIGNvbHVtbiBpcyBhbiBhdXRvIGluY3JlbWVudCBjb2x1bW4uCi0gICAgICovIAotICAgIHZvaWQgd3ByaW50QXV0b0luY3JlbWVudENvbHVtbih0YWJsZSwgY29sdW1uKSB7Ly9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vQHRvZG8gcHJvdGVjdGVkCi0gICAgICAgIHdwcmludCggIklERU5USVRZIiApCi0gICAgfQotCi0gICAgU3RyaW5nIGdldE5hdGl2ZVR5cGUoQ29sdW1uIGNvbHVtbil7Ci0gICAgICAgIHJldHVybiBjb2x1bW4udHlwZQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBEREwgdG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGRhdGFiYXNlIHNvIHRoZSBzY2hlbWEgbWF0Y2hlcwotICAgICAqIHRoZSBjdXJyZW50IHNwZWNpZmllZCBkYXRhYmFzZSBzY2hlbWEuICBEcm9wcyBhbmQgbW9kaWZpY2F0aW9ucyB3aWxsCi0gICAgICogbm90IGJlIG1hZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzaXJlZERiIFRoZSBkZXNpcmVkIGRhdGFiYXNlIHNjaGVtYQotICAgICAqIEBwYXJhbSBjbiBBIGNvbm5lY3Rpb24gdG8gdGhlIGV4aXN0aW5nIGRhdGFiYXNlIHRoYXQgc2hvdWxkIGJlIG1vZGlmaWVkCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBkZGwgY2Fubm90IGJlIG91dHB1dAotICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgc2NoZW1hCi0gICAgICovCi0gICAgdm9pZCBhbHRlckRhdGFiYXNlKERhdGFiYXNlIGRlc2lyZWREYiwgY24pIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgYWx0ZXJEYXRhYmFzZSggZGVzaXJlZERiLCBjbiwgZmFsc2UsIGZhbHNlICkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIERETCB0byBtb2RpZnkgYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc28gdGhlIHNjaGVtYSBtYXRjaGVzCi0gICAgICogdGhlIGN1cnJlbnQgc3BlY2lmaWVkIGRhdGFiYXNlIHNjaGVtYS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNpcmVkRGIgVGhlIGRlc2lyZWQgZGF0YWJhc2Ugc2NoZW1hCi0gICAgICogQHBhcmFtIGNuIEEgY29ubmVjdGlvbiB0byB0aGUgZXhpc3RpbmcgZGF0YWJhc2UgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gZG9Ecm9wcyB0cnVlIGlmIGNvbHVtbnMgYW5kIGluZGV4ZXMgc2hvdWxkIGJlIGRyb3BwZWQsIGZhbHNlIGlmCi0gICAgICogICAgICBqdXN0IGEgbWVzc2FnZSBzaG91bGQgYmUgb3V0cHV0Ci0gICAgICogQHBhcmFtIG1vZGlmeUNvbHVtbnMgdHJ1ZSBpZiBjb2x1bW5zIHNob3VsZCBiZSBhbHRlcmVkIGZvciBkYXRhdHlwZSwgc2l6ZSwgZXRjLiwKLSAgICAgKiAgICAgIGZhbHNlIGlmIGp1c3QgYSBtZXNzYWdlIHNob3VsZCBiZSBvdXRwdXQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGRkbCBjYW5ub3QgYmUgb3V0cHV0Ci0gICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgY3VycmVudCBzY2hlbWEKLSAgICAgKi8KLSAgICB2b2lkIGFsdGVyRGF0YWJhc2UoZGVzaXJlZERiLCBjbixkb0Ryb3BzLCBtb2RpZnlDb2x1bW5zKSB7Ly9AdG9kbyB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vICAgICAgICBjdXJyZW50RGIgICAgICA9IG5ldyBKZGJjTW9kZWxSZWFkZXIoY24pLmRhdGFiYXNlCi0gICAgICAgIC8vQHRvZG8gbGluZSBiZWxvdyBpcyBqdXN0IHRlc3QKLSAgICAgICAgZGVmIGN1cnJlbnREYiA9IG5ldyBEYXRhYmFzZSgid2liYmxlIikKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBkZWYgZGVmZXJyZWRUYWJsZXMgPSBbXQotICAgICAgICBmb3IgKGRlc2lyZWRUYWJsZSBpbiBkZXNpcmVkRGIudGFibGVzKSB7Ci0gICAgICAgICAgICBkZWYgY3VycmVudFRhYmxlID0gY3VycmVudERiLmZpbmRUYWJsZShkZXNpcmVkVGFibGUubmFtZSk7Ci0vL3Rvb2sgb3V0IGJlY2F1c2UgaWYgdGhlcmUgd2VyZSBubyBjaGFuZ2VzIHRvIGJlIG1hZGUgdGhlIGV4ZWN1dGlvbiBoYWQKLS8vZXJyb3JzIGJlY2F1c2UgaXQgdHJpZXMgdG8gZXhlY3V0ZSB0aGUgY29tbWVudHMgYXMgYSBzdGF0ZW1lbnQKLS8vICAgICAgICAgICAgdGFibGVDb21tZW50KGRlc2lyZWRUYWJsZSkKLSAgICAgICAgICAgIGlmICggY3VycmVudFRhYmxlID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgLy9AdG9kbyBsb2cuaW5mbyggImNyZWF0aW5nIHRhYmxlICR7ZGVzaXJlZFRhYmxlLm5hbWV9Iik7Ci0gICAgICAgICAgICAgICAgY3JlYXRlVGFibGUoIGRlc2lyZWRUYWJsZSApCi0gICAgICAgICAgICAgICAgLy8gd2UncmUgZGVmZXJyaW5nIGZvcmVpZ25rZXkgZ2VuZXJhdGlvbgotICAgICAgICAgICAgICAgIGRlZmVycmVkVGFibGVzIDw8IGRlc2lyZWRUYWJsZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL2FkZCBhbnkgY29sdW1ucywgaW5kaWNlcywgb3IgY29uc3RyYWludHMKLSAgICAgICAgICAgICAgICBmb3IgKGRlc2lyZWRDb2x1bW4gaW4gZGVzaXJlZFRhYmxlLmNvbHVtbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gPz8/IGNhbiB3ZSBkbyBjdXJyZW50VGFibGUuJHtkZXNpcmVkQ29sdW1uLm5hbWV9IGluc3RlYWQgPz8/PwotICAgICAgICAgICAgICAgICAgICBkZWYgY3VycmVudENvbHVtbiA9IGN1cnJlbnRUYWJsZS5maW5kQ29sdW1uKGRlc2lyZWRDb2x1bW4ubmFtZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBudWxsID09IGN1cnJlbnRDb2x1bW4gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIGxvZy5pbmZvKCAiY3JlYXRpbmcgY29sdW1uICR7ZGVzaXJlZFRhYmxlLm5hbWV9LiR7ZGVzaXJlZENvbHVtbi5nZXROYW1lKCl9IikKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyQ29sdW1uKCBkZXNpcmVkVGFibGUsIGRlc2lyZWRDb2x1bW4sIHRydWUgKQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBjb2x1bW5zRGlmZmVyKCBkZXNpcmVkQ29sdW1uLCBjdXJyZW50Q29sdW1uICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1vZGlmeUNvbHVtbnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9AdG9kbyBsb2cuaW5mbyggImFsdGVyaW5nIGNvbHVtbiAke2Rlc2lyZWRUYWJsZS5uYW1lfS4ke2Rlc2lyZWRDb2x1bW4ubmFtZX0iICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIGxvZy5pbmZvKCAiICBkZXNpcmVkQ29sdW1uPSR7ZGVzaXJlZENvbHVtbi50b1N0cmluZ0FsbCgpfSIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQHRvZG8gbG9nLmluZm8oICIgIGN1cnJlbnRDb2x1bW49JHtjdXJyZW50Q29sdW1uLnRvU3RyaW5nQWxsKCl9IiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJDb2x1bW4oIGRlc2lyZWRUYWJsZSwgZGVzaXJlZENvbHVtbiwgZmFsc2UgKQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICJDb2x1bW4gJHtjdXJyZW50Q29sdW1uLm5hbWV9IGluIHRhYmxlICR7Y3VycmVudFRhYmxlLm5hbWV9IGRpZmZlcnMgZnJvbSBjdXJyZW50IHNwZWNpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9AdG9kbyBsb2cuaW5mbyggdGV4dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3ByaW50Q29tbWVudCggdGV4dCApCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IC8vZm9yIGNvbHVtbnMKLQotICAgICAgICAgICAgICAgIC8vQHRvZG8gYWRkIGNvbnN0cmFpbnRzIGhlcmUuLi4KLQotICAgICAgICAgICAgICAgIC8vaG1tLCBtLXcuY29tIHNheXMgaW5kaWNlcyBhbmQgaW5kZXhlcyBhcmUgYm90aCBva2F5Ci0gICAgICAgICAgICAgICAgLy9AdG9kbyBzaG91bGQgd2UgY2hlY2sgdGhlIGluZGV4IGZpZWxkcyBmb3IgZGlmZmVyZW5jZXM/Ci0gICAgICAgICAgICAgICAgZm9yIChkZXNpcmVkSW5kZXggaW4gZGVzaXJlZFRhYmxlLmluZGV4ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmIGN1cnJlbnRJbmRleCA9IGN1cnJlbnRUYWJsZS5maW5kSW5kZXgoZGVzaXJlZEluZGV4Lm5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGlmICggbnVsbCA9PSBjdXJyZW50SW5kZXggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIGxvZy5pbmZvKCAiY3JlYXRpbmcgaW5kZXggJHtkZXNpcmVkVGFibGUubmFtZX0uJHtkZXNpcmVkSW5kZXgubmFtZX0iICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXgoIGRlc2lyZWRUYWJsZSwgZGVzaXJlZEluZGV4ICkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERyb3BzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAgICAgLy9AdG9kbyBkcm9wIGNvbnN0cmFpbnRzIC0gcHJvYmFibHkgbmVlZCBuYW1lcyBvbiB0aGVtIGZvciB0aGlzCi0KLSAgICAgICAgICAgICAgICAvL2RvIGFueSBkcm9wcyBvZiBjb2x1bW5zCi0gICAgICAgICAgICAgICAgZm9yIChjdXJyZW50Q29sdW1uIGluIGN1cnJlbnRUYWJsZS5jb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiBkZXNpcmVkQ29sdW1uID0gZGVzaXJlZFRhYmxlLmZpbmRDb2x1bW4oY3VycmVudENvbHVtbi5uYW1lKQotICAgICAgICAgICAgICAgICAgICBpZiAoIG51bGwgPT0gZGVzaXJlZENvbHVtbiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZG9Ecm9wcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIGxvZy5pbmZvKCAiZHJvcHBpbmcgY29sdW1uICR7Y3VycmVudFRhYmxlLm5hbWV9LiR7Y3VycmVudENvbHVtbi5uYW1lfSIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BDb2x1bW4oIGN1cnJlbnRUYWJsZSwgY3VycmVudENvbHVtbiApCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB0ZXh0ID0gIkNvbHVtbiAke2N1cnJlbnRDb2x1bW4ubmFtZX0gY2FuIGJlIGRyb3BwZWQgZnJvbSB0YWJsZSAke2N1cnJlbnRUYWJsZS5uYW1lfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIGxvZy5pbmZvKCB0ZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cHJpbnRDb21tZW50KCB0ZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLy9mb3IgY29sdW1ucwotCi0gICAgICAgICAgICAgICAgLy9kcm9wIGluZGV4ZXMKLSAgICAgICAgICAgICAgICBmb3IgKGN1cnJlbnRJbmRleCBpbiBjdXJyZW50VGFibGUuaW5kZXhlcykgewotICAgICAgICAgICAgICAgICAgICBkZWYgZGVzaXJlZEluZGV4ID0gZGVzaXJlZFRhYmxlLmZpbmRJbmRleChjdXJyZW50SW5kZXgubmFtZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBudWxsID09IGRlc2lyZWRJbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoaXMgaXNuJ3QgdGhlIHByaW1hcnkga2V5IGluZGV4IChteVNRTCByZXBvcnRzIHRoaXMgYXQgbGVhc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWYgaXNQayA9IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWMgaW4gY3VycmVudEluZGV4LmluZGV4Q29sdW1ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBjID0gY3VycmVudFRhYmxlLmZpbmRDb2x1bW4oIGljLm5hbWUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWMucHJpbWFyeUtleSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQayA9IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0vL0B0b2RvIC0gZG9lcyBncm9vdnkgYnJlYWsgb3V0IG9mICduZXcnIGZvciBsb29wcyBvciBjbG9zdXJlcz8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFpc1BrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQHRvZG8gbG9nLmluZm8oICJkcm9wcGluZyBub24tcHJpbWFyeSBpbmRleCAke2N1cnJlbnRUYWJsZS5uYW1lfS4ke2N1cnJlbnRJbmRleC5uYW1lfSIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BJbmRleCggY3VycmVudFRhYmxlLCBjdXJyZW50SW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8vdGFibGUgZXhpc3RzPwotICAgICAgICB9IC8vZm9yIHRhYmxlcyBjcmVhdGUKLQotICAgICAgICAvLyBnZW5lcmF0aW5nIGRlZmVycmVkIGZvcmVpZ25rZXlzCi0gICAgICAgIGZvciAodGFibGUgaW4gZGVmZXJyZWRUYWJsZXMpIHsKLSAgICAgICAgICAgIGNyZWF0ZUV4dGVybmFsRm9yZWlnbktleSh0YWJsZSkKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICAvL2NoZWNrIGZvciB0YWJsZSBkcm9wcwotICAgICAgICBmb3IgKGN1cnJlbnRUYWJsZSBpbiBjdXJyZW50RGIudGFibGVzKSB7Ci0gICAgICAgICAgICBkZWYgZGVzaXJlZFRhYmxlID0gZGVzaXJlZERiLmZpbmRUYWJsZShjdXJyZW50VGFibGUubmFtZSkKLQotICAgICAgICAgICAgaWYgKCBkZXNpcmVkVGFibGUgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGRvRHJvcHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vQHRvZG8gbG9nLmluZm8oICJkcm9wcGluZyB0YWJsZSAke2N1cnJlbnRUYWJsZS5uYW1lfSIgKQotICAgICAgICAgICAgICAgICAgICBkcm9wVGFibGUoIGN1cnJlbnRUYWJsZSApCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmIHRleHQgPSAiVGFibGUgJHtjdXJyZW50VGFibGUubmFtZX0gY2FuIGJlIGRyb3BwZWQiCi0gICAgICAgICAgICAgICAgICAgIC8vQHRvZG8gbG9nLmluZm8oIHRleHQgKQotICAgICAgICAgICAgICAgICAgICB3cHJpbnRDb21tZW50KCB0ZXh0ICkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvL2ZvciB0YWJsZXMgZHJvcHMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIGFsdGVyIHN0YXRlbWVudCB0byBhZGQgb3IgbW9kaWZ5IGEgc2luZ2xlIGNvbHVtbiBvbiBhIHRhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0aGUgaW5kZXggaXMgb24KLSAgICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdG8gZHJvcAotICAgICAqIEBwYXJhbSBhZGQgdHJ1ZSBpZiB0aGUgY29sdW1uIGlzIG5ldywgZmFsc2UgaWYgaXQgaXMgdG8gYmUgY2hhbmdlZAotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc3RhdGVtZW50IGNhbm5vdCBiZSB3cml0dGVuCi0gICAgICovCi0gICAgdm9pZCBhbHRlckNvbHVtbiggdGFibGUsIGNvbHVtbiwgYWRkICkgey8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBbHRlckhlYWRlciggdGFibGUgKQotICAgICAgICB3cHJpbnQoIGFkZCA/ICJBREQgIiA6ICJNT0RJRlkgIiApCi0gICAgICAgIGNyZWF0ZUNvbHVtbiggdGFibGUsIGNvbHVtbiApCi0gICAgICAgIHdwcmludEVuZE9mU3RhdGVtZW50KCkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIHN0YXRlbWVudCB0byBkcm9wIGFuIGNvbHVtbiBmcm9tIGEgdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRoZSBpbmRleCBpcyBvbgotICAgICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBkcm9wCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzdGF0ZW1lbnQgY2Fubm90IGJlIHdyaXR0ZW4KLSAgICAgKi8KLSAgICB2b2lkIGRyb3BDb2x1bW4oIFRhYmxlIHRhYmxlLCBDb2x1bW4gY29sdW1uICkgey8vQHRvZG8gdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBbHRlckhlYWRlciggdGFibGUgKQotICAgICAgICB3cHJpbnQoICJEUk9QIENPTFVNTiAke2NvbHVtbi5nZXROYW1lfSIgKQotICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0gICAgfQotCi0gICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIEFMVEVSIFRBQkxFIHN0YXRlbWVudCBpbmNsdWRpbmcgdGhlCi0gICAgICogdGFibGUgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgYmVpbmcgYWx0ZXJlZAotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc3RhdGVtZW50IGNhbm5vdCBiZSB3cml0dGVuCi0gICAgICovCi0gICAgdm9pZCB3cml0ZUFsdGVySGVhZGVyKCBUYWJsZSB0YWJsZSApIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy9AdG9kbyBwcm90ZWN0ZWQgICAgCi0gICAgICAgIHdwcmludGxuKCJBTFRFUiBUQUJMRSAke3RhYmxlLm5hbWV9IikKLSAgICAgICAgd3ByaW50SW5kZW50KCkKLSAgICB9Ci0gICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIHN0YXRlbWVudCB0byBkcm9wIGFuIGluZGV4IGZyb20gdGhlIGRhdGFiYXNlLiAgVGhlCi0gICAgICogPGNvZGU+YWx0ZXJUYWJsZUZvckRyb3A8L2NvZGU+IHByb3BlcnR5IGlzIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBzdHlsZSBvZiBkcm9wIGlzIGdlbmVyYXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGhlIGluZGV4IGlzIG9uCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBkcm9wCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzdGF0ZW1lbnQgY2Fubm90IGJlIHdyaXR0ZW4KLSAgICAgKgotICAgICAqIEBzZWUgU3FsR2VuZXJhdG9yI3VzZUFsdGVyVGFibGVGb3JEcm9wCi0gICAgICovCi0gICAgdm9pZCBkcm9wSW5kZXgoIFRhYmxlIHRhYmxlLCBJbmRleCBpbmRleCApIHsvL0B0b2RvIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICggZ2V0QWx0ZXJUYWJsZUZvckRyb3AoKSApIHsKLSAgICAgICAgICAgIHdyaXRlQWx0ZXJIZWFkZXIoIHRhYmxlICkKLSAgICAgICAgfQotICAgICAgICB3cHJpbnQoICJEUk9QIElOREVYICR7aW5kZXgubmFtZX0iKQotICAgICAgICBpZiAoICFnZXRBbHRlclRhYmxlRm9yRHJvcCgpICkgewotICAgICAgICAgICAgd3ByaW50KCAiIE9OICR7dGFibGUubmFtZX0iICkKLSAgICAgICAgfQotICAgICAgICB3cHJpbnRFbmRPZlN0YXRlbWVudCgpCi0gICAgfQotCi0vL3VzZWQgdG8gY2hlY2sgZm9yIGNvZGUgdG8gYmUgY2hhbmdlZCB3aGVuIGNoYW5naW5nIHNpZ25hdHVyZXMKLS8vcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3ByaW50QXV0b0luY3JlbWVudENvbHVtbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7fTsKLS8vcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQ29sdW1uKENvbHVtbiBjb2x1bW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7fTsKLSAgICAgICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvVGFibGUuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC9zcmMvb3JnL2phdmFuaWN1cy9nc3FsL1RhYmxlLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjNDc5OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvVGFibGUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuamF2YW5pY3VzLmdzcWwKLQotcHVibGljIGNsYXNzIFRhYmxlIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0gICAgQFByb3BlcnR5IGNhdGFsb2cKLSAgICBAUHJvcGVydHkgbmFtZQotICAgIEBQcm9wZXJ0eSBncm9vdnlOYW1lCi0gICAgQFByb3BlcnR5IHNjaGVtYQotICAgIEBQcm9wZXJ0eSByZW1hcmtzCi0gICAgQFByb3BlcnR5IHR5cGUKLSAgICBAUHJvcGVydHkgTGlzdCBjb2x1bW5zCi0gICAgQFByb3BlcnR5IExpc3QgZm9yZWlnbktleXMKLSAgICBAUHJvcGVydHkgTGlzdCBpbmRleGVzCi0gICAgCi0gICAgcHVibGljIFRhYmxlKGFOYW1lKSB7Ci0gICAgICAgIGNhdGFsb2cgPSBudWxsCi0gICAgICAgIG5hbWUgPSBhTmFtZQotICAgICAgICBncm9vdnlOYW1lID0gbnVsbAotICAgICAgICBzY2hlbWEgPSBudWxsCi0gICAgICAgIHJlbWFya3MgPSBudWxsCi0gICAgICAgIHR5cGUgPSBudWxsCi0gICAgICAgIGNvbHVtbnMgPSBbXQotICAgICAgICBmb3JlaWduS2V5cyA9IFtdCi0gICAgICAgIGluZGV4ZXMgPSBbXQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7IC8vIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlZiByZXN1bHQgPSBuZXcgVGFibGUobmFtZSkKLQotICAgICAgICByZXN1bHQuY2F0YWxvZyAgICAgPSBjYXRhbG9nCi0gICAgICAgIHJlc3VsdC5uYW1lICAgICAgICA9IG5hbWUKLSAgICAgICAgcmVzdWx0Lmdyb292eU5hbWUgID0gZ3Jvb3Z5TmFtZQotICAgICAgICByZXN1bHQuc2NoZW1hICAgICAgPSBzY2hlbWEKLSAgICAgICAgcmVzdWx0LnJlbWFya3MgICAgID0gcmVtYXJrcwotICAgICAgICByZXN1bHQudHlwZSAgICAgICAgPSB0eXBlCi0gICAgICAgIHJlc3VsdC5jb2x1bW5zICAgICA9IGNvbHVtbnMuY2xvbmUoKQotICAgICAgICByZXN1bHQuZm9yZWlnbktleXMgPSBmb3JlaWduS2V5cy5jbG9uZSgpCi0gICAgICAgIHJlc3VsdC5pbmRleGVzICAgICA9IGluZGV4ZXMuY2xvbmUoKQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotICAgIH0KLQotLy8gQHRvZG8gLSBjYW5ub3Qgb3ZlcnJpZGUgcHJvcGVydHkgZ2V0dGVyIHN1Y2Nlc2Z1bGx5Ci0vLyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0vLyAgICAgICAgcmV0dXJuICh0eXBlID09IG51bGwpID8gIihudWxsKSIgOiB0eXBlCi0vLyAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRVbmlxdWVzKCkgewotICAgICAgICBpbmRleGVzLmZpbmRBbGwoKSB7aXQuaXNVbmlxdWUoKX0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUtleSgpIHsKLSAgICAgICAgZGVmIGFQcmltYXJ5S2V5Q29sdW1uID0gZ2V0Q29sdW1ucygpLmZpbmQoKSB7aXQuaXNQcmltYXJ5S2V5KCl9Ci0gICAgICAgIHJldHVybiBhUHJpbWFyeUtleUNvbHVtbiAhPSBudWxsCi0gICAgfSAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmluZENvbHVtbihwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBDb2x1bW4gZmluZENvbHVtbihhTmFtZSkgewotICAgICAgICAvLyBAdG9kbwotICAgICAgICAvLyB3YXJuaW5nICduYW1lJyBpbnNpZGUgY2xvc3VyZSByZWZlcnMgdG8gJ3RoaXMubmFtZScsIG5vdCBtZXRob2QgcGFyYW1ldGVyIGNhbGxlZCAnbmFtZScgKGluIGdyb292eSAxLjBiNikgISEhCi0gICAgICAgIGdldENvbHVtbnMoKS5maW5kKCkge2l0Lm5hbWUuZXF1YWxzSWdub3JlQ2FzZShhTmFtZSl9Ci0gICAgfQotCi0gICAgcHVibGljIEluZGV4IGZpbmRJbmRleChhTmFtZSkgewotICAgICAgICBnZXRJbmRleGVzKCkuZmluZCgpIHtpdC5uYW1lLmVxdWFsc0lnbm9yZUNhc2UoYU5hbWUpfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFByaW1hcnlLZXlDb2x1bW5zKCkgewotICAgICAgICBnZXRDb2x1bW5zKCkuZmluZEFsbCgpIHtpdC5pc1ByaW1hcnlLZXkoKX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sdW1uIGdldEF1dG9JbmNyZW1lbnRDb2x1bW4oKSB7Ci0gICAgICAgIGdldENvbHVtbnMoKS5maW5kKCkge2l0LmlzQXV0b0luY3JlbWVudCgpfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAiVGFibGVbbmFtZT0ke25hbWV9O2NvbHVtbkNvdW50PSR7Y29sdW1ucy5zaXplKCl9XSIKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9UeXBlTWFwLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9UeXBlTWFwLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhYzYyNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvVHlwZU1hcC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5qYXZhbmljdXMuZ3NxbAotCi1pbXBvcnQgamF2YS5zcWwuVHlwZXMKLQotcHVibGljIGNsYXNzIFR5cGVNYXAgewotICAgIEBQcm9wZXJ0eSBuYW1lVG9Db2RlCi0gICAgQFByb3BlcnR5IGNvZGVUb05hbWUKLSAgICBAUHJvcGVydHkgZGVjaW1hbFR5cGVzCi0gICAgQFByb3BlcnR5IHRleHRUeXBlcwotICAgIEBQcm9wZXJ0eSBvdGhlclR5cGVzCi0gICAgICAgICAgICAgIAotICAgIHB1YmxpYyBUeXBlTWFwKCkgewotICAgICAgICBuYW1lVG9Db2RlID0gWzpdCi0gICAgICAgIGNvZGVUb05hbWUgPSBbOl0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBkZWNpbWFsVHlwZXMgPSBbCi0gICAgICAgICAgICAibnVtZXJpYyIgOiBUeXBlcy5OVU1FUklDLAotICAgICAgICAgICAgImRlY2ltYWwiIDogVHlwZXMuREVDSU1BTCwKLSAgICAgICAgICAgICJmbG9hdCIgOiBUeXBlcy5GTE9BVCwKLSAgICAgICAgICAgICJyZWFsIiA6IFR5cGVzLlJFQUwsCi0gICAgICAgICAgICAiZG91YmxlIiA6IFR5cGVzLkRPVUJMRQotICAgICAgICBdCi0gICAgICAgIHRleHRUeXBlcyA9IFsKLSAgICAgICAgICAgICJjaGFyIiA6IFR5cGVzLkNIQVIsCi0gICAgICAgICAgICAidmFyY2hhciIgOiBUeXBlcy5WQVJDSEFSLAotICAgICAgICAgICAgImxvbmd2YXJjaGFyIiA6IFR5cGVzLkxPTkdWQVJDSEFSLAotICAgICAgICAgICAgImNsb2IiIDogVHlwZXMuQ0xPQiwKLSAgICAgICAgICAgICJkYXRlIiA6IFR5cGVzLkRBVEUsCi0gICAgICAgICAgICAidGltZSIgOiBUeXBlcy5USU1FLAotICAgICAgICAgICAgInRpbWVzdGFtcCIgOiBUeXBlcy5USU1FU1RBTVAKLSAgICAgICAgXQotICAgICAgICBvdGhlclR5cGVzID0gWwotICAgICAgICAgICAgImJpdCIgOiBUeXBlcy5CSVQsCi0gICAgICAgICAgICAidGlueWludCIgOiBUeXBlcy5USU5ZSU5ULAotICAgICAgICAgICAgInNtYWxsaW50IiA6IFR5cGVzLlNNQUxMSU5ULAotICAgICAgICAgICAgImludGVnZXIiIDogVHlwZXMuSU5URUdFUiwKLSAgICAgICAgICAgICJiaWdpbnQiIDogVHlwZXMuQklHSU5ULAotICAgICAgICAgICAgImJpbmFyeSIgOiBUeXBlcy5CSU5BUlksCi0gICAgICAgICAgICAidmFyYmluYXJ5IiA6IFR5cGVzLlZBUkJJTkFSWSwKLSAgICAgICAgICAgICJsb25ndmFyYmluYXJ5IiA6IFR5cGVzLkxPTkdWQVJCSU5BUlksCi0gICAgICAgICAgICAibnVsbCIgOiBUeXBlcy5OVUxMLAotICAgICAgICAgICAgIm90aGVyIiA6IFR5cGVzLk9USEVSLAotICAgICAgICAgICAgImphdmFfb2JqZWN0IiA6IFR5cGVzLkpBVkFfT0JKRUNULAotICAgICAgICAgICAgImRpc3RpbmN0IiA6IFR5cGVzLkRJU1RJTkNULAotICAgICAgICAgICAgInN0cnVjdCIgOiBUeXBlcy5TVFJVQ1QsCi0gICAgICAgICAgICAiYXJyYXkiIDogVHlwZXMuQVJSQVksCi0gICAgICAgICAgICAiYmxvYiIgOiBUeXBlcy5CTE9CLAotICAgICAgICAgICAgInJlZiIgOiBUeXBlcy5SRUYsCi0gICAgICAgICAgICAiZGF0YWxpbmsiIDogVHlwZXMuREFUQUxJTkssCi0gICAgICAgICAgICAiYm9vbGVhbiIgOiBUeXBlcy5CT09MRUFOCi0gICAgICAgIF0KLSAgICAgICAgZm9yIChlbnRyaWVzIGluIGRlY2ltYWxUeXBlcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBjcm9zc1JlZihlbnRyaWVzLmtleSxlbnRyaWVzLnZhbHVlKSAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgZm9yIChlbnRyaWVzIGluIHRleHRUeXBlcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBjcm9zc1JlZihlbnRyaWVzLmtleSxlbnRyaWVzLnZhbHVlKSAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgZm9yIChlbnRyaWVzIGluIG90aGVyVHlwZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgY3Jvc3NSZWYoZW50cmllcy5rZXksZW50cmllcy52YWx1ZSkgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgCi0gIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNyb3NzUmVmKG5hbWUsY29kZSkgewotICAgICAgICBuYW1lVG9Db2RlLnB1dChuYW1lLGNvZGUpCi0gICAgICAgIGNvZGVUb05hbWUucHV0KGNvZGUsbmFtZSkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRKZGJjVHlwZUNvZGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVUb0NvZGUuZ2V0KG5hbWUsVHlwZXMuT1RIRVIpCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKZGJjVHlwZU5hbWUoaW50IGNvZGUpIHsKLSAgICAgICAgcmV0dXJuIGNvZGVUb05hbWUuZ2V0KGNvZGUsInVua25vd24iKQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0cnVlIGlmIHZhbHVlcyBmb3IgdGhlIHR5cGUgbmVlZCBoYXZlIHNpemUgYW5kIHNjYWxlIG1lYXN1cmVtZW50cwotICAgICAgKgotICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVjay4KLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNpbWFsVHlwZShpbnQgdHlwZSkgewotICAgICAgICByZXR1cm4gaXNEZWNpbWFsVHlwZShnZXRKZGJjVHlwZU5hbWUodHlwZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgICogUmV0dXJucyB0cnVlIGlmIHZhbHVlcyBmb3IgdGhlIHR5cGUgbmVlZCBoYXZlIHNpemUgYW5kIHNjYWxlIG1lYXN1cmVtZW50cwotICAgICAgKgotICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVjay4KLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNpbWFsVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICByZXR1cm4gZGVjaW1hbFR5cGVzLmtleVNldCgpLmFueSB7Ci0gICAgICAgICAgICB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoaXQpCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3NyYy9vcmcvamF2YW5pY3VzL2dzcWwvVW5pcXVlLmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9VbmlxdWUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjc3M2U2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dzcWwvc3JjL29yZy9qYXZhbmljdXMvZ3NxbC9VbmlxdWUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIG9yZy5qYXZhbmljdXMuZ3NxbAotCi1wdWJsaWMgY2xhc3MgVW5pcXVlIGV4dGVuZHMgSW5kZXggewotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9Db2x1bW5UZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL2dzcWwvdGVzdC9vcmcvamF2YW5pY3VzL2dzcWwvQ29sdW1uVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOWMyYzQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9Db2x1bW5UZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsCi0KLWNsYXNzIENvbHVtblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0gICAgQFByb3BlcnR5IGNvbHVtbgotICAgIEBQcm9wZXJ0eSBpZENvbHVtbgotICAgIEBQcm9wZXJ0eSBuYW1lQ29sdW1uCi0gICAgQFByb3BlcnR5IHllYXJPZkJpcnRoQ29sdW1uICAgICAgICAgIAotICAgICAgICAgICAgICAKLSAgICB2b2lkIHNldFVwKCkgewotICAgICAgICBUeXBlTWFwIHR5cGVNYXAgPSBuZXcgVHlwZU1hcCgpICAgICAgICAgIAotICAgICAgICBjb2x1bW4gPSBuZXcgQ29sdW1uKHR5cGVNYXApCi0gICAgICAgIGlkQ29sdW1uID0gbmV3IENvbHVtbih0eXBlTWFwLCJpZCIsImlkIiwwLCIxMCIsdHJ1ZSx0cnVlLHRydWUsbnVsbCkgICAgIAotICAgICAgICBuYW1lQ29sdW1uID0gbmV3IENvbHVtbih0eXBlTWFwLCJuYW1lIiwibmFtZSIsMCwiMjUwIix0cnVlLGZhbHNlLGZhbHNlLCI8bm8gbmFtZT4iKQotICAgICAgICB5ZWFyT2ZCaXJ0aENvbHVtbiA9IG5ldyBDb2x1bW4odHlwZU1hcCwieWVhciBvZiBiaXJ0aCIsInllYXJPZkJpcnRoIiwwLCI0IixmYWxzZSxmYWxzZSxmYWxzZSxudWxsLDApCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFByaW1hcnlLZXkoKSB7IC8vdG9kbzogdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBmYWxzZSA9PSBjb2x1bW4uaXNQcmltYXJ5S2V5KCkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0U2l6ZUFuZFNjYWxlKCkgewotICAgICAgICBjb2x1bW4uc2l6ZSA9ICIxMCwyIgotICAgICAgICBhc3NlcnQgMiA9PSBjb2x1bW4uc2NhbGUKLSAgICAgICAgLy9idWc/IGNhbid0IGluaXRpYWxpc2UgcHJvcGVybHkgKG51bGwgbm90IHplcm8pIC0gc2VlIGNvbnN0cnVjdG9yIGluIENvbHVtbi5ncm9vdnkKLSAgICAgICAgLy9hc3NlcnQgMCA9PSBuYW1lQ29sdW1uLnNjYWxlICAgICAgICAgIAotICAgICAgICBhc3NlcnQgMCA9PSB5ZWFyT2ZCaXJ0aENvbHVtbi5zY2FsZSAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0VHlwZU5hbWVIYXNCZWVuSW5pdGlhbGlzZWRXaGVuT25seUNvbHVtblR5cGVIYXNCZWVuU2V0KCkgewotICAgICAgICBhc3NlcnQgIm51bGwiID09IGlkQ29sdW1uLnR5cGUKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL0RhdGFiYXNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL0RhdGFiYXNlVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODViNDYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9EYXRhYmFzZVRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuamF2YW5pY3VzLmdzcWwKLQotY2xhc3MgRGF0YWJhc2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIEBQcm9wZXJ0eSB0YWJsZQotICAgIEBQcm9wZXJ0eSBpZENvbHVtbgotICAgIEBQcm9wZXJ0eSBmcmVkCi0gICAgQFByb3BlcnR5IGJhcm5leQotICAgIEBQcm9wZXJ0eSB3aWxtYQotICAgIEBQcm9wZXJ0eSBkYjEKLSAgICBAUHJvcGVydHkgZGIyCi0gICAgICAgICAgICAgIAotICAgIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHR5cGVNYXAgPSBuZXcgVHlwZU1hcCgpICAgICAgICAgIAotICAgICAgICBpZENvbHVtbiA9IG5ldyBDb2x1bW4odHlwZU1hcCwiaWQiLCJpZCIsMCwiMTAiLHRydWUsdHJ1ZSx0cnVlLG51bGwpICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBmcmVkID0gbmV3IFRhYmxlKCJmcmVkIikKLSAgICAgICAgZnJlZC5jb2x1bW5zIDw8IGlkQ29sdW1uCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgYmFybmV5ID0gbmV3IFRhYmxlKCJiYXJuZXkiKQotICAgICAgICBiYXJuZXkuY29sdW1ucyA8PCBpZENvbHVtbiAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICB3aWxtYSA9IG5ldyBUYWJsZSgid2lsbWEiKQotICAgICAgICB3aWxtYS5jb2x1bW5zIDw8IGlkQ29sdW1uCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgZGIxID0gbmV3IERhdGFiYXNlKCJkYjEiKQotICAgICAgICBkYjEudGFibGVzIDw8IGZyZWQKLSAgICAgICAgZGIxLnRhYmxlcyA8PCBiYXJuZXkKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBkYjIgPSBuZXcgRGF0YWJhc2UoImRiMiIpCi0gICAgICAgIGRiMi50YWJsZXMgPDwgd2lsbWEKLSAgICAgICAgZGIyLnRhYmxlcyA8PCBiYXJuZXkKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0TWVyZ2VEYXRhYmFzZXNUb2dldGhlcigpIHsKLSAgICAgICAgZGIxLm1lcmdlV2l0aChkYjIpOwotICAgICAgICBhc3NlcnQgMyA9PSBkYjEudGFibGVzLnNpemUoKQotICAgICAgICBhc3NlcnQgZGIxLnRhYmxlcy5jb250YWlucyhmcmVkKQotICAgICAgICBhc3NlcnQgZGIxLnRhYmxlcy5jb250YWlucyhiYXJuZXkpCi0gICAgICAgIGFzc2VydCBudWxsICE9IGRiMS50YWJsZXMuZmluZCgpe2l0Lm5hbWUgPT0gIndpbG1hIn0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL1JlbGF0aW9uYWxCdWlsZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL1JlbGF0aW9uYWxCdWlsZGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2VhMjkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9SZWxhdGlvbmFsQnVpbGRlclRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiBUZXN0IHRvIHZlcmlmeSB0aGF0IGJ1aWxkZXIgY29uc3RydWN0cyB2YWxpZCBSZWxhdGlvbmFsIFNjaGVtYQotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uJAotICovCi0KLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsCi0KLWNsYXNzIFJlbGF0aW9uYWxCdWlsZGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICBAUHJvcGVydHkgZGF0YWJhc2UKLSAgICBAUHJvcGVydHkgdGFibGUKLSAgICAgICAgICAgICAgCi0gICAgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGQgPSBuZXcgUmVsYXRpb25hbEJ1aWxkZXIobmV3IFR5cGVNYXAoKSkKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBkYXRhYmFzZSA9IGJ1aWxkLmRhdGFiYXNlKG5hbWU6J2ZyZWQnKSB7Ci0gICAgICAgICAgICB0YWJsZShuYW1lOid3aWxtYScpIHsKLSAgICAgICAgICAgICAgICBjb2x1bW4obmFtZToncGViYmxlcycsc2l6ZTonMTAsMicscmVxdWlyZWQ6dHJ1ZSkKLSAgICAgICAgICAgICAgICBjb2x1bW4obmFtZTonYmFtYmFtJyxzaXplOicyMCcpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRhYmxlID0gYnVpbGQudGFibGUobmFtZTonaW5kaXZpZHVhbCcpIHsKLSAgICAgICAgICAgIGNvbHVtbihuYW1lOidpbmRpdmlkdWFsX2lkJywgdHlwZTonaW50ZWdlcicsIHJlcXVpcmVkOnRydWUsIHByaW1hcnlLZXk6dHJ1ZSwgYXV0b0luY3JlbWVudDp0cnVlKQotICAgICAgICAgICAgY29sdW1uKG5hbWU6J3N1cm5hbWUnLCB0eXBlOid2YXJjaGFyJywgc2l6ZToxNSwgcmVxdWlyZWQ6dHJ1ZSkKLSAgICAgICAgICAgIGNvbHVtbihuYW1lOidldmVudF9pZCcsIHR5cGU6J2ludGVnZXInKQotICAgICAgICAgICAgZm9yZWlnbktleShmb3JlaWduVGFibGU6J2V2ZW50JykgewotICAgICAgICAgICAgICAgIHJlZmVyZW5jZShsb2NhbDonZXZlbnRfaWQnLGZvcmVpZ246J2V2ZW50X2lkJykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGV4KG5hbWU6J3N1cm5hbWVfaW5kZXgnKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXhDb2x1bW4obmFtZTonc3VybmFtZScpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICB2b2lkIHRlc3RGaW5kZXJzKCkgewotICAgICAgICBhc3NlcnQgbnVsbCAhPSBkYXRhYmFzZQotICAgICAgICBhc3NlcnQgInBlYmJsZXMiID09IGRhdGFiYXNlLndpbG1hLnBlYmJsZXMubmFtZQotICAgICAgICBhc3NlcnQgMTAgPT0gZGF0YWJhc2Uud2lsbWEucGViYmxlcy5zaXplCi0gICAgICAgIGFzc2VydCAyID09IGRhdGFiYXNlLndpbG1hLnBlYmJsZXMuc2NhbGUKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0Rm9yZWlnbktleXMoKSB7Ci0gICAgICAgIGFzc2VydCAiZXZlbnQiID09IHRhYmxlLmZvcmVpZ25LZXlzWzBdLmZvcmVpZ25UYWJsZQotICAgICAgICBhc3NlcnQgImV2ZW50X2lkIiA9PSB0YWJsZS5mb3JlaWduS2V5c1swXS5yZWZlcmVuY2VzWzBdLmxvY2FsCi0gICAgICAgIGFzc2VydCAiZXZlbnRfaWQiID09IHRhYmxlLmZvcmVpZ25LZXlzWzBdLnJlZmVyZW5jZXNbMF0uZm9yZWlnbgotICAgIH0gICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL1NxbEdlbmVyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9TcWxHZW5lcmF0b3JUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkZmRkNi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9nc3FsL3Rlc3Qvb3JnL2phdmFuaWN1cy9nc3FsL1NxbEdlbmVyYXRvclRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiBUZXN0IHRvIHZlcmlmeSB2YWxpZCBjb25zdHJ1Y3Rpb24gb2YgZGVmYXVsdCBEREwKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcGFja2FnZSBvcmcuamF2YW5pY3VzLmdzcWwKLQotaW1wb3J0IGphdmEuaW8uKgotCi1jbGFzcyBTcWxHZW5lcmF0b3JUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgewotICAgIEBQcm9wZXJ0eSBkYXRhYmFzZQotICAgIEBQcm9wZXJ0eSBzcWxHZW5lcmF0b3IKLSAgICAgICAgICAgICAgCi0gICAgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgdHlwZU1hcCA9IG5ldyBUeXBlTWFwKCkgICAgICAgICAgCi0gICAgICAgIGJ1aWxkID0gbmV3IFJlbGF0aW9uYWxCdWlsZGVyKHR5cGVNYXApCi0gICAgICAgIHNxbEdlbmVyYXRvciA9IG5ldyBTcWxHZW5lcmF0b3IodHlwZU1hcCxTeXN0ZW0uZ2V0UHJvcGVydHkoICJsaW5lLnNlcGFyYXRvciIsICJcbiIgKSkKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBkYXRhYmFzZSA9IGJ1aWxkLmRhdGFiYXNlKG5hbWU6J2dlbmVhbG9neScpIHsKLSAgICAgICAgICB0YWJsZShuYW1lOidldmVudCcpIHsKLSAgICAgICAgICAgICAgY29sdW1uKG5hbWU6J2V2ZW50X2lkJywgdHlwZTonaW50ZWdlcicsIHNpemU6MTAsIHByaW1hcnlLZXk6dHJ1ZSwgcmVxdWlyZWQ6dHJ1ZSkKLSAgICAgICAgICAgICAgY29sdW1uKG5hbWU6J2Rlc2NyaXB0aW9uJywgdHlwZTondmFyY2hhcicsIHNpemU6MzApICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICB0YWJsZShuYW1lOidpbmRpdmlkdWFsJykgewotICAgICAgICAgICAgY29sdW1uKG5hbWU6J2luZGl2aWR1YWxfaWQnLCB0eXBlOidpbnRlZ2VyJywgc2l6ZToxMCwgcmVxdWlyZWQ6dHJ1ZSwgcHJpbWFyeUtleTp0cnVlLCBhdXRvSW5jcmVtZW50OnRydWUpCi0gICAgICAgICAgICBjb2x1bW4obmFtZTonc3VybmFtZScsIHR5cGU6J3ZhcmNoYXInLCBzaXplOjE1LCByZXF1aXJlZDp0cnVlKQotICAgICAgICAgICAgY29sdW1uKG5hbWU6J2V2ZW50X2lkJywgdHlwZTonaW50ZWdlcicsIHNpemU6MTApCi0gICAgICAgICAgICBmb3JlaWduS2V5KGZvcmVpZ25UYWJsZTonZXZlbnQnKSB7Ci0gICAgICAgICAgICAgICAgcmVmZXJlbmNlKGxvY2FsOidldmVudF9pZCcsZm9yZWlnbjonZXZlbnRfaWQnKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXgobmFtZTonc3VybmFtZV9pbmRleCcpIHsKLSAgICAgICAgICAgICAgICBpbmRleENvbHVtbihuYW1lOidzdXJuYW1lJykKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0R2VuZXJhdGVEREwoKSB7Ci0gICAgICAgIHRlc3RXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oIlNxbEdlbmVyYXRvclRlc3Quc3FsIikpCi0gICAgICAgIHNxbEdlbmVyYXRvci53cml0ZXIgPSB0ZXN0V3JpdGVyCi0gICAgICAgIHNxbEdlbmVyYXRvci5jcmVhdGVEYXRhYmFzZShkYXRhYmFzZSx0cnVlKQotICAgICAgICB0ZXN0V3JpdGVyLmZsdXNoKCkKLSAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9UYWJsZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvZ3NxbC90ZXN0L29yZy9qYXZhbmljdXMvZ3NxbC9UYWJsZVRlc3QuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjgyMGMyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL2dzcWwvdGVzdC9vcmcvamF2YW5pY3VzL2dzcWwvVGFibGVUZXN0Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmphdmFuaWN1cy5nc3FsCi0KLWNsYXNzIFRhYmxlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKLSAgICBAUHJvcGVydHkgdGFibGUKLSAgICBAUHJvcGVydHkgaWRDb2x1bW4KLSAgICBAUHJvcGVydHkgbmFtZUNvbHVtbgotICAgICAgICAgICAgICAKLSAgICB2b2lkIHNldFVwKCkgewotICAgICAgICB0eXBlTWFwID0gbmV3IFR5cGVNYXAoKSAgICAgICAgICAKLSAgICAgICAgaWRDb2x1bW4gPSBuZXcgQ29sdW1uKHR5cGVNYXAsImlkIiwiaWQiLDAsIjEwIix0cnVlLHRydWUsdHJ1ZSxudWxsKSAgICAgCi0gICAgICAgIG5hbWVDb2x1bW4gPSBuZXcgQ29sdW1uKHR5cGVNYXAsIm5hbWUiLCJuYW1lIiwwLCIyNTAiLHRydWUsZmFsc2UsZmFsc2UsIjxubyBuYW1lPiIpCi0gICAgICAgIHRhYmxlID0gbmV3IFRhYmxlKCJ3aGVlbGJhcnJvdyIpCi0gICAgICAgIHRhYmxlLmNvbHVtbnMgPDwgaWRDb2x1bW4gICAgICAgICAgCi0gICAgICAgIHRhYmxlLmNvbHVtbnMgPDwgbmFtZUNvbHVtbiAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgdGVzdFByaW1hcnlLZXkoKSB7IC8vdG9kbzogdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBAdG9kbyB3b3VsZG4ndCBpdCBiZSBncm9vdnkgdG8gaGF2ZSB0aGUgaW52ZXJzZSBvZgotICAgICAgICAvLyB0aGUgY29udGFpbnMoKSBtZXRob2QsIG9uIE9iamVjdCwgc3VjaCB0aGF0IHlvdQotICAgICAgICAvLyBjb3VsZCBleHByZXNzICJpZiBpZENvbHVtbi5pc0luKHRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKSB7IgotICAgICAgICAvLyBpLmUuIGFkZCB0byBEZWZhdWx0R3Jvb3Z5TWV0aG9kcyBzb21ldGhpbmcgYWxvbmcgdGhlCi0gICAgICAgIC8vIGxpbmVzIG9mIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luKE9iamVjdCBvYmosQ29sbGVjdGlvbiBjbHRuKSAuLi4KLSAgICAgICAgCi0gICAgICAgIGFzc2VydCB0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucy5jb250YWlucyhpZENvbHVtbikKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB0ZXN0RmluZENvbHVtblVzaW5nQ2FzZUluc2Vuc2l0aXZlTmFtZSgpIHsKLSAgICAgICAgYXNzZXJ0IG5hbWVDb2x1bW4gPT0gdGFibGUuZmluZENvbHVtbigiTmFNZSIpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvR3Jvb3Z5UGFnZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvR3Jvb3Z5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc1M2I4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1wYWNrYWdlIGdyb292eS5tb2R1bGVzLnBhZ2VzOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuU2NyaXB0OwotaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogQXV0aG9yOiBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTAsIDIwMDQKLSAqIERlZmF1bHQgYmFzZSBjbGFzcyBvZiBwYWdlcy4gIFByb3ZpZGVzIGFjY2VzcyB0byBtYW55IHVzZWZ1bCBmdW5jdGlvbnMgZm9yIHdlYiBwYWdlIHdyaXRlcnMuCi0gKiBOb3RlOiBDdXJyZW50bHkgdW51c2VkIGR1ZSB0byBhIGJ1ZyBpbiBHcm9vdnkgbm90IGFsbG93aW5nIGNsYXNzZXMgZGVyaXZlZCBpbmRpcmVjdGx5IGZyb20gU2NyaXB0Ci0gKiB0byByZWNlaXZlIHRoZWlyIEJpbmRpbmcgZGF0YS4gIEFsc28sIG1hbnkgZnVuY3Rpb25zIHRvIGJlIGFkZGVkIHNvb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcm9vdnlQYWdlIGV4dGVuZHMgU2NyaXB0IHsKLQotLyoJcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbCBiaW5kaW5ncyA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCi0JcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZygpIHsKLQkgICAgcmV0dXJuIChCaW5kaW5nKWJpbmRpbmdzLmdldCgpOwotCX0gLy8gZ2V0QmluZGluZygpCi0KLQlwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgewotCSAgICBiaW5kaW5ncy5zZXQoYmluZGluZyk7Ci0JfSAvLyBzZXRCaW5kaW5nKCkKLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0JICAgIHJldHVybiBnZXRCaW5kaW5nKCkuZ2V0VmFyaWFibGUocHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JICAgIGdldEJpbmRpbmcoKS5zZXRWYXJpYWJsZShwcm9wZXJ0eSwgbmV3VmFsdWUpOwotCX0KLSovCi0JLyoqCi0JICogRGVmYXVsdHMgdG8gZGVmbHQgaWYgdmFsdWUgaXMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVuc3VyZShPYmplY3QgdmFsdWUsIE9iamVjdCBkZWZsdCkgewotCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGRlZmx0IDogdmFsdWU7Ci0JfSAvLyBlbnN1cmUoKQotCi0JLyoqCi0JICogQ29udmVydCBmcm9tIEhUTUwgdG8gVW5pY29kZSB0ZXh0LiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBtYW55IG9mIHRoZSBlbmNvZGVkIEhUTUwKLQkgKiBjaGFyYWN0ZXJzIHRvIG5vcm1hbCBVbmljb2RlIHRleHQuICBFeGFtcGxlOiAmYW1wO2x0JnNlbWk7IHRvICZsdDsuICBUaGlzIGlzIHRoZSBvcHBvc2l0ZQotCSAqIG9mIHNob3dIdG1sKCkuCi0JICogQHNlZSBzaG93SHRtbChTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbUh0bWwoU3RyaW5nIHRleHQpCi0JewotCQlpbnQgaXh6OwotCQlpZiAodGV4dCA9PSBudWxsIHx8IChpeHogPSB0ZXh0Lmxlbmd0aCgpKSA9PSAwKSByZXR1cm4gdGV4dDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoaXh6KTsKLQkJU3RyaW5nIHJlcCA9IG51bGw7Ci0JCWZvciAoaW50IGl4ID0gMDsgaXggPCBpeHo7IGl4KyspCi0JCXsKLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGl4KTsKLQkJCWlmIChjID09ICcmJyk7Ci0JCQl7Ci0JCQkJU3RyaW5nIHN1YiA9IHRleHQuc3Vic3RyaW5nKGl4ICsgMSkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoc3ViLnN0YXJ0c1dpdGgoImx0OyIpKQotCQkJCXsKLQkJCQkJYyA9ICc8JzsKLQkJCQkJaXggKz0gMzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCWlmIChzdWIuc3RhcnRzV2l0aCgiZ3Q7IikpCi0JCQkJewotCQkJCQljID0gJz4nOwotCQkJCQlpeCArPSAzOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJaWYgKHN1Yi5zdGFydHNXaXRoKCJhbXA7IikpCi0JCQkJewotCQkJCQljID0gJyYnOwotCQkJCQlpeCArPSA0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJaWYgKHN1Yi5zdGFydHNXaXRoKCJuYnNwOyIpKQotCQkJCXsKLQkJCQkJYyA9ICcgJzsKLQkJCQkJaXggKz0gNTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCWlmIChzdWIuc3RhcnRzV2l0aCgic2VtaTsiKSkKLQkJCQl7Ci0JCQkJCWMgPSAnOyc7Ci0JCQkJCWl4ICs9IDU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQlpZiAoc3ViLnN0YXJ0c1dpdGgoIiMiKSkKLQkJCQl7Ci0JCQkJCWNoYXIgYzIgPSAwOwotCQkJCQlmb3IgKGludCBpeSA9IGl4ICsgMTsgaXkgPCBpeHo7IGl5KyspCi0JCQkJCXsKLQkJCQkJCWNoYXIgYzEgPSB0ZXh0LmNoYXJBdChpeSk7Ci0JCQkJCQlpZiAoYzEgPj0gJzAnICYmIGMxIDw9ICc5JykKLQkJCQkJCXsKLQkJCQkJCQljMiA9IChjaGFyKShjMiAqIDEwICsgYzEpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJaWYgKGMxID09ICc7JykKLQkJCQkJCXsKLQkJCQkJCQljID0gYzI7Ci0JCQkJCQkJaXggPSBpeTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlcCAhPSBudWxsKQotCQkJewotCQkJCWJ1Zi5hcHBlbmQocmVwKTsKLQkJCQlyZXAgPSBudWxsOwotCQkJfQotCQkJZWxzZSBidWYuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9IC8vIGZyb21IdG1sKCkKLQotCS8qKgotCSAqIFN1YnN0cmluZyBSZXBsYWNlci4gRm9yIGVhY2ggaW5zdGFuY2Ugb2YgPGI+c3ViPC9iPiBmb3VuZCBpbiA8Yj5zdHI8L2I+LCBpdCBpcyByZXBsYWNlZAotCSAqIGJ5IDxiPnJlcDwvYj4uICBUaGUgcmVzdWx0aW5nIFN0cmluZyBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBzdHIsIFN0cmluZyBzdWIsIFN0cmluZyByZXApCi0JewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLQkJaW50IGxlblMgPSBzdWIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGxhc3QgPSAwOzspCi0JCXsKLQkJCWludCBpeCA9IHN0ci5pbmRleE9mKHN1YiwgbGFzdCk7Ci0JCQlpZiAoaXggPCAwKQotCQkJewotCQkJCWlmIChidWYgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWJ1Zi5hcHBlbmQoc3RyLnN1YnN0cmluZyhsYXN0KSk7Ci0JCQkJCXN0ciA9IGJ1Zi50b1N0cmluZygpOwkvLyByZXR1cm4gc3RyIGFzIHJlc3VsdAotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChidWYgPT0gbnVsbCkgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCkgKiAzIC8gMik7Ci0JCQlidWYuYXBwZW5kKHN0ci5zdWJzdHJpbmcobGFzdCwgaXgpKTsKLQkJCWJ1Zi5hcHBlbmQocmVwKTsKLQkJCWxhc3QgPSBpeCArIGxlblM7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9IC8vIHJlcGxhY2UoKQotCi0JLyoqCi0JICogU3Vic3RyaW5nIFJlcGxhY2VyLiBGb3IgZWFjaCBpbnN0YW5jZSBvZiA8Yj5zdWI8L2I+IGZvdW5kIGluIDxiPnN0cjwvYj4sIGl0IGlzIHJlcGxhY2VkCi0JICogYnkgPGI+cmVwPC9iPi4gIFRoZSBidWZmZXIgYXJndW1lbnQgaXRzZWxmIGlzIG1vZGlmZWQgYW5kIHJldHVybmVkLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbgotCSAqIHJlcGxhY2UoKSwgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHZhcmlvdXMgcmVwbGFjZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIHJlcGxhY2VCdWYoU3RyaW5nQnVmZmVyIGJ1ZiwgU3RyaW5nIHN1YiwgU3RyaW5nIHJlcCkKLQl7Ci0JCVN0cmluZyBzdHIgPSBidWYudG9TdHJpbmcoKTsKLQkJaW50IGxlblMgPSBzdWIubGVuZ3RoKCk7Ci0JCWludCBkaWZmID0gcmVwLmxlbmd0aCgpIC0gbGVuUzsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGxhc3QgPSAwOzspCi0JCXsKLQkJCWludCBpeCA9IHN0ci5pbmRleE9mKHN1YiwgbGFzdCk7Ci0JCQlpZiAoaXggPCAwKSBicmVhazsKLQkJCWJ1Zi5yZXBsYWNlKGl4ICsgb2Zmc2V0LCBpeCArIG9mZnNldCArIGxlblMsIHJlcCk7Ci0JCQlsYXN0ID0gaXggKyBsZW5TOwotCQkJb2Zmc2V0ICs9IGRpZmY7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9IC8vIHJlcGxhY2VCdWYoKQotCi19IC8vIEdyb292eVBhZ2UKLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvR3Jvb3Z5UGFnZXMuamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVBhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDE4ZDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvR3Jvb3Z5UGFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgKEMpIFRyb3kgSGVuaW5nZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluCi0gKiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weQotICogb2YgdGhpcyBkb2N1bWVudC4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIDMuCi0gKiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiBGb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuIDQuIFByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbgotICogdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhCi0gKiByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZQotICogQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLXBhY2thZ2UgZ3Jvb3Z5Lm1vZHVsZXMucGFnZXM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOwotaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5tb2R1bGVzLnBhZ2VzLkxvYWRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lm1vZHVsZXMucGFnZXMuUGFyc2U7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBBdXRob3I6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICogTWFpbiBzZXJ2bGV0IGNsYXNzLiAgRXhhbXBsZSB1c2FnZSBpbiB3ZWIueG1sOgotICogCTxzZXJ2bGV0PgotICogICAgICAgPHNlcnZsZXQtbmFtZT5Hcm9vdnlQYWdlczwvc2VydmxldC1uYW1lPgotICogICAgICAgPHNlcnZsZXQtY2xhc3M+Z3Jvb3Z5Lm1vZHVsZXMucGFnZXMuR3Jvb3Z5UGFnZXM8L3NlcnZsZXQtY2xhc3M+Ci0gKgkJPGluaXQtcGFyYW0+Ci0gKgkJCTxwYXJhbS1uYW1lPmFsbG93U3BpbGxpbmc8L3BhcmFtLW5hbWU+Ci0gKgkJCTxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KLSAqCQkJPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgQWxsb3dzIGRldmVsb3BlcnMgdG8gdmlldyB0aGUgaW50ZXJtZWRpYWRlIHNvdXJjZSBjb2RlLCB3aGVuIHRoZXkgcGFzcwotICoJCQkJYSBzcGlsbEdyb292eSBhcmd1bWVudCBpbiB0aGUgVVJMLgotICogICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqCQk8L2luaXQtcGFyYW0+Ci0gKiAgICA8L3NlcnZsZXQ+Ci0gKi8KLQotcHVibGljIGNsYXNzIEdyb292eVBhZ2VzIGV4dGVuZHMgSHR0cFNlcnZsZXQgLyppbXBsZW1lbnRzIEdyb292eU9iamVjdCovIHsKLQlPYmplY3QgeDsKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbG93U3BpbGxpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBwYWdlQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgcGFyZW50OwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2VydmxldCBjb250ZXh0Ci0JICovCi0JcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeyByZXR1cm4gY29udGV4dDsgfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFnZU1ldGEgewotCQlwcml2YXRlIENsYXNzIHNlcnZsZXRTY3JpcHRDbGFzczsKLQkJcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsKLQkJcHJpdmF0ZSBNYXAgZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJpdmF0ZSBJbnB1dFN0cmVhbSBncm9vdnlTb3VyY2U7Ci0JfSAvLyBQYWdlTWV0YQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgc2VydmxldCwgc2V0IGl0J3MgcGFyYW1ldGVycy4KLQkgKiBAcGFyYW0gY29uZmlnIHNlcnZsZXQgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB7Ci0JCS8vIEdldCB0aGUgc2VydmxldCBjb250ZXh0Ci0JCWNvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLQkJY29udGV4dC5sb2coIkdyb292eSBzZXJ2bGV0IGluaXRpYWxpemVkIik7Ci0KLQkJLy8gRW5zdXJlIHRoYXQgd2UgdXNlIHRoZSBjb3JyZWN0IGNsYXNzbG9hZGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQKLQkJLy8gY2xhc3NlcyBpbiBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIuCi0JCXBhcmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgcGFyZW50ID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCi0JCWFsbG93U3BpbGxpbmcgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiYWxsb3dTcGlsbGluZyIpICE9IG51bGw7Ci0JfSAvLyBpbml0KCkKLQotCS8qKgotCSAqIEhhbmRsZSBIVFRQIEdFVCByZXF1ZXN0cy4KLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSByZXNwb25zZQotCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZG9QYWdlKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQl9IC8vIGRvR2V0KCkKLQotCS8qKgotCSAqIEhhbmRsZSBIVFRQIFBPU1QgcmVxdWVzdHMuCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlkb1BhZ2UocmVxdWVzdCwgcmVzcG9uc2UpOwotCX0gLy8gZG9Qb3N0KCkKLQotCS8qKgotCSAqIEV4ZWN1dGUgcGFnZSBhbmQgcHJvZHVjZSBvdXRwdXQuCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZG9QYWdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGFnZUlkID0gZ2V0UGFnZUlkKHJlcXVlc3QpOwotCQlVUkwgcGFnZVVybCA9IGdldFBhZ2VVcmwocGFnZUlkKTsKLQkJaWYgKHBhZ2VVcmwgPT0gbnVsbCkgewotCQkJY29udGV4dC5sb2coIkdyb292eVBhZ2VzOiAgXCIiICsgcGFnZVVybCArICJcIiBub3QgZm91bmQiKTsKLQkJCXJlc3BvbnNlLnNlbmRFcnJvcig0MDQsICJcIiIgKyBwYWdlVXJsICsgIlwiIG5vdCBmb3VuZC4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gc3BpbGxHcm9vdnkgPSBhbGxvd1NwaWxsaW5nICYmIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzcGlsbEdyb292eSIpICE9IG51bGw7Ci0JCVBhZ2VNZXRhIHBhZ2VNZXRhID0gZ2V0UGFnZShwYWdlSWQsIHBhZ2VVcmwsIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSwgc3BpbGxHcm9vdnkpOwotCQlXcml0ZXIgb3V0ID0gR3Jvb3Z5V3JpdGVyLmdldEluc3RhbmNlKHJlc3BvbnNlLCA4MTkyKTsKLQkJdHJ5IHsKLQkJCWlmIChzcGlsbEdyb292eSkgewotCQkJCQkvLyBTZXQgaXQgdG8gVEVYVAotCQkJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7IC8vIG11c3QgY29tZSBiZWZvcmUgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkKLQkJCQlzZW5kKHBhZ2VNZXRhLmdyb292eVNvdXJjZSwgb3V0KTsKLQkJCQlwYWdlTWV0YS5ncm9vdnlTb3VyY2UgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCIpOwotCQkJCQkvLyBTZXQgaXQgdG8gSFRNTCBieSBkZWZhdWx0Ci0JCQkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOyAvLyBtdXN0IGNvbWUgYmVmb3JlIHJlc3BvbnNlLmdldFdyaXRlcigpCi0JCQkJQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZyhyZXF1ZXN0LCByZXNwb25zZSwgb3V0KTsKLQkJCQlTY3JpcHQgcGFnZSA9IEludm9rZXJIZWxwZXIuY3JlYXRlU2NyaXB0KHBhZ2VNZXRhLnNlcnZsZXRTY3JpcHRDbGFzcywgYmluZGluZyk7Ci0vLwkJCQlwYWdlLnNldEJpbmRpbmcoYmluZGluZyk7Ci0JCQkJcGFnZS5ydW4oKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkgb3V0LmNsb3NlKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJEb25lIik7Ci0JCX0KLQl9IC8vIGRvUGFnZSgpCi0KLQkvKioKLQkgKiBQcmVwYXJlIEJpbmRpbmdzIGJlZm9yZSBpbnN0YW50aWF0aW5nIHBhZ2UuCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAcGFyYW0gb3V0Ci0JICogQHJldHVybiB0aGUgQmluZGluZ3MKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIEJpbmRpbmcgZ2V0QmluZGluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgV3JpdGVyIG91dCkKLQkgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNldCB1cCB0aGUgc2NyaXB0IGNvbnRleHQKLQkJQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoKTsKLQkJYmluZGluZy5zZXRWYXJpYWJsZSgicmVxdWVzdCIsIG5ldyBHcm9vdnlSZXF1ZXN0KHJlcXVlc3QpKTsKLQkJYmluZGluZy5zZXRWYXJpYWJsZSgicmVzcG9uc2UiLCByZXNwb25zZSk7Ci0JCWJpbmRpbmcuc2V0VmFyaWFibGUoImFwcGxpY2F0aW9uIiwgY29udGV4dCk7Ci0JCWJpbmRpbmcuc2V0VmFyaWFibGUoInNlc3Npb24iLCBuZXcgR3Jvb3Z5U2Vzc2lvbihyZXF1ZXN0KSk7Ci0JCWJpbmRpbmcuc2V0VmFyaWFibGUoIm91dCIsIG91dCk7Ci0KLQkJLy8gRm9ybSBwYXJhbWV0ZXJzLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaXRzIHBhc3NlZCBhcyBhIGxpc3QuCi0JCWZvciAoRW51bWVyYXRpb24gcGFyYW1FbnVtID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOyBwYXJhbUVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgcGFyYW1FbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoYmluZGluZy5nZXRWYXJpYWJsZShrZXkpID09IG51bGwpIHsKLQkJCQlTdHJpbmdbXSB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhrZXkpOwotCQkJCWlmICh2YWx1ZXMubGVuZ3RoID09IDEpIHsKLQkJCQkJYmluZGluZy5zZXRWYXJpYWJsZShrZXksIHZhbHVlc1swXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmluZGluZy5zZXRWYXJpYWJsZShrZXksIHZhbHVlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiaW5kaW5nOwotCX0gLy8gZ2V0QmluZGluZygpCi0KLQkvKioKLQkgKiBMb29rdXAgcGFnZSBjbGFzcyBvciBsb2FkIG5ldyBvbmUgaWYgbmVlZGVkLgotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiBAcGFyYW0gcGFnZVVybAotCSAqIEBwYXJhbSBzZXJ2bGV0UGF0aAotCSAqIEBwYXJhbSBzcGlsbEdyb292eQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhZ2VNZXRhIGdldFBhZ2UoU3RyaW5nIHBhZ2VJZCwgVVJMIHBhZ2VVcmwsIFN0cmluZyBzZXJ2bGV0UGF0aCwgYm9vbGVhbiBzcGlsbEdyb292eSkKLQkgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiAgewotCQkJLy8gTG9jayBvbiB0aGUgcGFnZUlkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNvbXBpbGUgb2NjdXJzIGZvciBhbnkgc2NyaXB0Ci0JCXN5bmNocm9uaXplZCAocGFnZUlkKSB7Ci0JCQkJLy8gR2V0IHRoZSBVUkxDb25uZWN0aW9uCi0JCQlVUkxDb25uZWN0aW9uIGdyb292eVNjcmlwdENvbm4gPSBwYWdlVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJLy8gVVJMIGxhc3QgbW9kaWZpZWQKLQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gZ3Jvb3Z5U2NyaXB0Q29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQkvLyBDaGVjayB0aGUgY2FjaGUgZm9yIHRoZSBzY3JpcHQKLQkJCVBhZ2VNZXRhIHBhZ2VNZXRhID0gKFBhZ2VNZXRhKXBhZ2VDYWNoZS5nZXQocGFnZUlkKTsKLQkJCQkvLyBJZiB0aGUgcGFnZU1ldGEgaXNuJ3QgbnVsbCBjaGVjayBhbGwgdGhlIGRlcGVuZGVuY2llcwotCQkJYm9vbGVhbiBkZXBlbmRlbmN5T3V0T2ZEYXRlID0gZmFsc2U7Ci0JCQlpZiAocGFnZU1ldGEgIT0gbnVsbCAmJiAhc3BpbGxHcm9vdnkpIHsKLQkJCQlpc1BhZ2VOZXcocGFnZU1ldGEpOwotCQkJfQotCQkJaWYgKHBhZ2VNZXRhID09IG51bGwgfHwgcGFnZU1ldGEubGFzdE1vZGlmaWVkIDwgbGFzdE1vZGlmaWVkIHx8IGRlcGVuZGVuY3lPdXRPZkRhdGUgfHwgc3BpbGxHcm9vdnkpIHsKLQkJCQlwYWdlTWV0YSA9IG5ld1BhZ2UocGFnZUlkLCBzZXJ2bGV0UGF0aCwgZ3Jvb3Z5U2NyaXB0Q29ubiwgbGFzdE1vZGlmaWVkLCBzcGlsbEdyb292eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFnZU1ldGE7Ci0JCX0KLQl9IC8vIGdldFBhZ2UoKQotCi0JLyoqCi0JICogSXMgcGFnZSBuZXcgb3IgY2hhbmdlZD8KLQkgKiBAcGFyYW0gcGFnZU1ldGEgcGFnZSBkYXRhCi0JICogQHJldHVybiB0cnVlIGlmIGNvbXBpbGUgbmVlZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFnZU5ldyhQYWdlTWV0YSBwYWdlTWV0YSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBwYWdlTWV0YS5kZXBlbmRlbmNpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJVVJMQ29ubmVjdGlvbiB1cmxjID0gbnVsbDsKLQkJCVVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQl1cmxjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJdXJsYy5zZXREb0lucHV0KGZhbHNlKTsKLQkJCQl1cmxjLnNldERvT3V0cHV0KGZhbHNlKTsKLQkJCQlsb25nIGRlcGVuZGVudExhc3RNb2RpZmllZCA9IHVybGMuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJaWYgKGRlcGVuZGVudExhc3RNb2RpZmllZCA+ICgoTG9uZylwYWdlTWV0YS5kZXBlbmRlbmNpZXMuZ2V0KHVybCkpLmxvbmdWYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9IC8vIGlzUGFnZU5ldygpCi0KLQkvKioKLQkgKiBMb2FkIGFuZCBjb21waWxlIG5ldyBwYWdlLgotCSAqIEBwYXJhbSBwYWdlSWQKLQkgKiBAcGFyYW0gc2VydmxldFBhdGgKLQkgKiBAcGFyYW0gZ3Jvb3Z5U2NyaXB0Q29ubgotCSAqIEBwYXJhbSBsYXN0TW9kaWZpZWQKLQkgKiBAcGFyYW0gc3BpbGxHcm9vdnkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgUGFnZU1ldGEgbmV3UGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgc2VydmxldFBhdGgsIFVSTENvbm5lY3Rpb24gZ3Jvb3Z5U2NyaXB0Q29ubiwgbG9uZyBsYXN0TW9kaWZpZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3BpbGxHcm9vdnkpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0JCVBhcnNlIHBhcnNlID0gbmV3IFBhcnNlKHBhZ2VJZCwgZ3Jvb3Z5U2NyaXB0Q29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBwYXJzZS5wYXJzZSgpOwotCi0JCQkvLyBNYWtlIGEgbmV3IHBhZ2VNZXRhCi0JCVBhZ2VNZXRhIHBhZ2VNZXRhID0gbmV3IFBhZ2VNZXRhKCk7Ci0KLQkJCS8vIGp1c3QgcmV0dXJuIGdyb292eSBhbmQgZG9uJ3QgY29tcGlsZSBpZiBhc2tlZAotCQlpZiAoc3BpbGxHcm9vdnkpIHsKLQkJCXBhZ2VNZXRhLmdyb292eVNvdXJjZSA9IGluOwotCQkJcmV0dXJuIHBhZ2VNZXRhOwotCQl9Ci0JCQkvLyBDb21waWxlIHRoZSBzY3JpcHQgaW50byBhbiBvYmplY3QKLQkJR3Jvb3Z5Q2xhc3NMb2FkZXIgZ3Jvb3Z5TG9hZGVyID0gbmV3IExvYWRlcihwYXJlbnQsIGNvbnRleHQsIHNlcnZsZXRQYXRoLCBwYWdlTWV0YS5kZXBlbmRlbmNpZXMpOwotCQlDbGFzcyBzY3JpcHRDbGFzczsKLQkJdHJ5IHsKLQkJCXNjcmlwdENsYXNzID0KLQkJCQlncm9vdnlMb2FkZXIucGFyc2VDbGFzcyhpbiwgcGFnZUlkLnN1YnN0cmluZygxKSk7Ci0JCX0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIHNjcmlwdDogIiArIHBhZ2VJZCwgZSk7Ci0JCX0KLQkJcGFnZU1ldGEuc2VydmxldFNjcmlwdENsYXNzID0gc2NyaXB0Q2xhc3M7Ci0JCXBhZ2VNZXRhLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQkJcGFnZUNhY2hlLnB1dChwYWdlSWQsIHBhZ2VNZXRhKTsKLQkJcmV0dXJuIHBhZ2VNZXRhOwotCX0gLy8gbmV3UGFnZSgpCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhZ2UgaWRlbnRpZmllci4KLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VJZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCQkvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIEdyb292eSBzY3JpcHQgKGludGVybiB0aGUgbmFtZSBzbyB0aGF0IHdlIGNhbgotCQkvLyBsb2NrIG9uIGl0KQotCQlpbnQgY29udGV4dExlbmd0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKS5sZW5ndGgoKTsKLQkJcmV0dXJuIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpLnN1YnN0cmluZyhjb250ZXh0TGVuZ3RoKS5pbnRlcm4oKTsKLQl9IC8vIGdldFBhZ2VJZCgpCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhZ2UgVVJMIGZyb20gdGhlIHJlcXVlc3QgcGF0aC4KLQkgKiBAcGFyYW0gcGFnZUlkCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFVSTCBnZXRQYWdlVXJsKFN0cmluZyBwYWdlSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCQlyZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZShwYWdlSWQpOwotCX0gLy8gZ2V0UGFnZVVybCgpCi0KLQkvKioKLQkgKiBDb3B5IGFsbCBvZiBpbnB1dCB0byBvdXRwdXQuCi0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIG91dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZChJbnB1dFN0cmVhbSBpbiwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzgxOTJdOwotCQkJZm9yICg7OykgewotCQkJCWludCByZWFkID0gcmVhZGVyLnJlYWQoYnVmKTsKLQkJCQlpZiAocmVhZCA8PSAwKSBicmVhazsKLQkJCQlvdXQud3JpdGUoYnVmLCAwLCByZWFkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwotCQkJaW4uY2xvc2UoKTsKLQkJfQotCX0gLy8gc2VuZCgpCi0JCi19IC8vIEdyb292eVBhZ2VzCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Hcm9vdnlSZXF1ZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Hcm9vdnlSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDIzM2UuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvR3Jvb3Z5UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm1vZHVsZXMucGFnZXM7Ci0KLWltcG9ydCBncm9vdnkudXRpbC5Qcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBBdXRob3I6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMywgMjAwNAotICogUHJveHkgZm9yIFNlcnZsZXRSZXF1ZXN0LiAgQWxsIGNhbGxzIGdldCBmb3J3YXJkZWQgdG8gYWN0dWFsIHJlcXVlc3QsIGJ1dCBhbHNvIHByb3ZpZGVzIE1hcAotICogZnVuY3Rpb25hbGl0eSB0byByZXF1ZXN0IHBhcmFtZXRlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlSZXF1ZXN0IGV4dGVuZHMgUHJveHkgaW1wbGVtZW50cyBNYXAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJncm9vdnkudmFyLiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX0xFTiA9IFBSRUZJWC5sZW5ndGgoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE51bGwgTlVMTCA9IG5ldyBOdWxsKCk7Ci0KLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogU2luZ2xldG9uIHRvIHJlcHJlc2VudCBhIG51bGxlZCBvdXQvY2xlYXJlZCBwYXJhbWV0ZXIgYXQgcnVudGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTnVsbCB7Ci0JCU51bGwoKSB7fQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE51bGw7Ci0JCX0KLQl9IC8vIE51bGwKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLiAgQWxsIHJlcXVlc3QgYXR0cmlidXRlcywgcGFyYW1ldGVycywgYW5kIGhlYWRlcnMgYmVjb21lIG1lbWJlcnMuCi0JICogQHBhcmFtIHJlcXVlc3QgZW5jYXBzdWxhdGVkIHJlcXVlc3QKLQkgKi8KLQlHcm9vdnlSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlTdHJpbmcgbmFtZTsKLQkJRW51bWVyYXRpb24gZW4gPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJbmFtZSA9IChTdHJpbmcpZW4ubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBoZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKLQkJCWlmICghaGVhZGVyLmVxdWFscyhOVUxMKSkgewotCQkJCW1hcC5wdXQobmFtZSwgaGVhZGVyKTsKLQkJCX0KLQkJfQotCQllbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQluYW1lID0gKFN0cmluZyllbi5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7Ci0JCQlpZiAodmFsdWVzID09IG51bGwpIGNvbnRpbnVlOwotCQkJaWYgKHZhbHVlcy5sZW5ndGggPT0gMSkgbWFwLnB1dChuYW1lLCB2YWx1ZXNbMF0pOwotCQkJZWxzZSBtYXAucHV0KG5hbWUsIEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0JCX0KLQkJZW4gPSByZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJbmFtZSA9IChTdHJpbmcpZW4ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoUFJFRklYKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpOwotCQkJCWlmICghdmFsdWUuZXF1YWxzKE5VTEwpKSB7Ci0JCQkJCW1hcC5wdXQobmFtZS5zdWJzdHJpbmcoUFJFRklYX0xFTiksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IC8vIEdyb292eVJlcXVlc3QoKQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7IG1hcC5jbGVhcigpOyB9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgcGFyYW1ldGVyIGtleSBoYXMgb3IgaGFkIGEgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeyByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7IH0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBleGlzdHMuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBtYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7IH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU2V0IGVudHJ5U2V0KCkgeyByZXR1cm4gbWFwLmVudHJ5U2V0KCk7IH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciBvciBudWxsLgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeyByZXR1cm4gbWFwLmdldChrZXkpOyB9Ci0KLQkvKioKLQkgKiBMb29rdXAgcGFyYW1ldGVyIG9yIGJlYW4gcHJvcGVydHkuCi0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCU9iamVjdCByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCWlmIChyZXN1bHQuZXF1YWxzKE5VTEwpKSByZXN1bHQgPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0gLy8gZ2V0UHJvcGVydHkoKQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFJlcXVlc3QoKSB7IHJldHVybiAoU2VydmxldFJlcXVlc3QpZ2V0UmVhbE9iamVjdCgpOyB9Ci0KLQkvKioKLQkgKiBQcm9iYWJseSBuZXZlciB0cnVlLCBiZWNhdXNlIHRoZXJlJ3MgYWx3YXlzIHNvbWUgaGVhZGVycy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsgcmV0dXJuIG1hcC5pc0VtcHR5KCk7IH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBsZXRlIHNldCBvZiBrZXlzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU2V0IGtleVNldCgpIHsgcmV0dXJuIG1hcC5rZXlTZXQoKTsgfQotCi0JLyoqCi0JICogQ2hhbmdlIGEgcGFyYW1ldGVyIGZvciBsYXRlciB1c2UgaW4gdGhlIHBhZ2Ugb3IgZm9yIHNlbmRpbmcgdG8gYSBjYWxsZWQgcGFnZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSBOVUxMOwotCQlnZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKFBSRUZJWCArIGtleSwgdmFsdWUpOwotCQlpZiAodmFsdWUuZXF1YWxzKE5VTEwpKSByZXR1cm4gbWFwLnJlbW92ZShrZXkpOwotCQllbHNlIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotCX0gLy8gcHV0KCkKLQotCS8qKgotCSAqIENoYW5nZSBhbGwgaW5jbHVkZWQgcGFyYW1ldGVycy4KLQkgKiBAcGFyYW0gdAotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotCQlJdGVyYXRvciBpdCA9IHQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCXB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQncyB0aGUgcGFyYW1ldGVyIHRvIG51bGwuCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7IHJldHVybiBwdXQoa2V5LCBudWxsKTsgfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIG1hcC5zaXplKCk7IH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBsZXRlIHNldCBvZiB2YWx1ZXMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG1hcC52YWx1ZXMoKTsgfQotCi19IC8vIEdyb292eVJlcXVlc3QKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVNlc3Npb24uamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5M2FjZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Hcm9vdnlTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotcGFja2FnZSBncm9vdnkubW9kdWxlcy5wYWdlczsKLQotaW1wb3J0IGdyb292eS51dGlsLlByb3h5OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogQXV0aG9yOiBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTMsIDIwMDQKLSAqIFByb3h5IGZvciBIdHRwU2Vzc2lvbi4gIEFsbCBjYWxscyBnZXQgZm9yd2FyZGVkIHRvIGFjdHVhbCBzZXNzaW9uLCBidXQgYWxzbyBwcm92aWRlcyBNYXAKLSAqIGZ1bmN0aW9uYWxpdHkgdG8gc2Vzc2lvbiB2YXJpYWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm9vdnlTZXNzaW9uIGV4dGVuZHMgUHJveHkgaW1wbGVtZW50cyBNYXAgewotCXByaXZhdGUgTWFwIG1hcCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLCB0YWtlcyByZXF1ZXN0LCBleHRyYWN0cyBhbmQgZW5jYXBzdWxhdGVzIHRoZSBzZXNzaW9uLgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JR3Jvb3Z5U2Vzc2lvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSkpOwotCQlIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotCQlFbnVtZXJhdGlvbiBlbiA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTsKLQkJd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW4ubmV4dEVsZW1lbnQoKTsKLQkJCW1hcC5wdXQobmFtZSwgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSkpOwotCQl9Ci0JfSAvLyBHcm9vdnlTZXNzaW9uKCkKLQotCS8qKgotCSAqIENsZWFyIGFsbCB2YXJpYWJsZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCW1hcC5jbGVhcigpOwotCQlDb2xsZWN0aW9uIG5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLQkJRW51bWVyYXRpb24gZW4gPSBzZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJbmFtZXMuYWRkKGVuLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVtb3ZlKGl0Lm5leHQoKSk7Ci0JCX0KLQl9IC8vIGNsZWFyKCkKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YXJpYWJsZXMgaXMgc2V0LgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeyByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7IH0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGlzIGluIG9uZSBvZiB0aGUgdmFyaWFibGVzLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOyB9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBsZXRlIHNldCBvZiB2YXJpYWJsZXMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7IHJldHVybiBtYXAuZW50cnlTZXQoKTsgfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YXJpYWJsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsgcmV0dXJuIG1hcC5nZXQoa2V5KTsgfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFsIHNlc3Npb24gb2JqZWN0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsgcmV0dXJuIChIdHRwU2Vzc2lvbilnZXRSZWFsT2JqZWN0KCk7IH0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG5vIHZhcmlhYmxlcyBoYXZlIGJlZW4gc2V0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeyByZXR1cm4gbWFwLmlzRW1wdHkoKTsgfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21wbGV0ZSBzZXQgb2YgdmFyaWFibGUgbmFtZXMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTZXQga2V5U2V0KCkgeyByZXR1cm4gbWFwLmtleVNldCgpOyB9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhcmlhYmxlLCBvciBjbGVhciBpdCBpZiB2YWx1ZSA9IG51bGwuCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShTdHJpbmcudmFsdWVPZihrZXkpLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbWFwLnJlbW92ZShrZXkpOwotCQllbHNlIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotCX0gLy8gcHV0KCkKLQotCS8qKgotCSAqIENvcHkgYWxsIG1lbWJlcnMgb2YgdCBpbi4KLQkgKiBAcGFyYW0gdAotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotCQlJdGVyYXRvciBpdCA9IHQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCXB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHZhcmlhYmxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gcHV0KGtleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7IHJldHVybiBtYXAuc2l6ZSgpOyB9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBsZXRlIGNvbGxlY3Rpb24gb2YgdmFsdWVzLgotCSAqIEByZXR1cm4gdGhlIHZhbHVlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG1hcC52YWx1ZXMoKTsgfQotCQotfSAvLyBHcm9vdnlTZXNzaW9uCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Hcm9vdnlXcml0ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI0MDMxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL2dyb292eS9tb2R1bGVzL3BhZ2VzL0dyb292eVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm1vZHVsZXMucGFnZXM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogQXV0aG9yOiBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTMsIDIwMDQKLSAqIEEgYnVmZmVyZWQgd3JpdGVyIHRoYXQgd29uJ3QgY29tbWl0IHRoZSByZXNwb25zZSB1bnRpbCB0aGUgYnVmZmVyIGhhcyByZWFjaGVkIHRoZSBoaWdoCi0gKiB3YXRlciBtYXJrLCBvciB1bnRpbCBmbHVzaCgpIG9yIGNsb3NlKCkgaXMgY2FsbGVkLgotICovCi1wdWJsaWMgY2xhc3MgR3Jvb3Z5V3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotCXByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotCXByaXZhdGUgQ2hhckFycmF5V3JpdGVyIG91dDAgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7Ci0JcHJpdmF0ZSBXcml0ZXIgb3V0MTsKLQlwcml2YXRlIGludCBtYXg7Ci0JcHJpdmF0ZSBib29sZWFuIHRyb3VibGUgPSBmYWxzZTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IuICBVc2UgZ2V0SW5zdGFuY2UoKSBpbnN0ZWFkLgotCSAqIEBwYXJhbSByZXNwb25zZQotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gbWF4Ci0JICovCi0JcHJpdmF0ZSBHcm9vdnlXcml0ZXIoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBDaGFyQXJyYXlXcml0ZXIgb3V0LCBpbnQgbWF4KSB7Ci0JCXN1cGVyKG91dCk7Ci0JCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLQkJdGhpcy5vdXQwID0gb3V0OwotCQl0aGlzLm1heCA9IG1heDsKLQl9IC8vIEdyb292eVdyaXRlcgotCi0JLyoqCi0JICogTWFrZSBzdXJlIHN0cmVhbXMgZ2V0IGNsb3NlZCBldmVudHVhbGx5LgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJY2xvc2UoKTsKLQkJc3VwZXIuZmluYWxpemUoKTsKLQl9IC8vIGZpbmFsaXplKCkKLQotCS8qKgotCSAqIEZsdXNoIHRoZSBzdHJlYW0gaWYgaXQncyBub3QgY2xvc2VkIGFuZCBjaGVjayBpdHMgZXJyb3Igc3RhdGUuCi0JICogRXJyb3JzIGFyZSBjdW11bGF0aXZlOyBvbmNlIHRoZSBzdHJlYW0gZW5jb3VudGVycyBhbiBlcnJvciwgdGhpcwotCSAqIHJvdXRpbmUgd2lsbCByZXR1cm4gdHJ1ZSBvbiBhbGwgc3VjY2Vzc2l2ZSBjYWxscy4KLQkgKgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJpbnQgc3RyZWFtIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciwgZWl0aGVyIG9uIHRoZQotCSAqIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBvciBkdXJpbmcgYSBmb3JtYXQgY29udmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCkgewotCQlpZiAoc3VwZXIuY2hlY2tFcnJvcigpKSByZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRyb3VibGU7Ci0JfSAvLyBjaGVja0Vycm9yKCkKLQotCS8qKgotCSAqIENsb3NlIHRoZSBzdHJlYW0uCi0JICogQHNlZSAjY2hlY2tFcnJvcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJHcm9vdnlXcml0ZXIuY2xvc2UoKSIpOwotCQlpZiAoIXJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKLQkJCXJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgob3V0MC5zaXplKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRlbnQgTGVuZ3RoID0gIiArIG91dDAuc2l6ZSgpKTsKLQkJfQotCQlmbHVzaCgpOwotCQlzdXBlci5jbG9zZSgpOwotCX0gLy8gY2xvc2UoKQotCi0JLyoqCi0JICogRmx1c2ggdGhlIHN0cmVhbS4KLQkgKiBAc2VlICNjaGVja0Vycm9yKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmx1c2goKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJHcm9vdnlXcml0ZXIuZmx1c2goKSIpOwotCQlpZiAodHJvdWJsZSkgcmV0dXJuOwotCQlzdXBlci5mbHVzaCgpOwotCQlpZiAob3V0MSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW91dDEgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0cm91YmxlID0gdHJ1ZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCW91dDEud3JpdGUob3V0MC50b0NoYXJBcnJheSgpKTsKLQkJCW91dDAucmVzZXQoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdHJvdWJsZSA9IHRydWU7Ci0JCX0KLQl9IC8vIGZsdXNoKCkKLQotCS8qKgotCSAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgdGhlIHdyaXRlci4KLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAcGFyYW0gbWF4Ci0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBHcm9vdnlXcml0ZXIgZ2V0SW5zdGFuY2UoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBuZXcgR3Jvb3Z5V3JpdGVyKHJlc3BvbnNlLCBuZXcgQ2hhckFycmF5V3JpdGVyKG1heCksIG1heCk7Ci0JfSAvLyBnZXRJbnN0YW5jZSgpCi0KLQkvKioKLQkgKiBQcmludCBhbiBvYmplY3QuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT57QGxpbmsKLQkgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX08L2NvZGU+IG1ldGhvZCBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKLQkgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcwotCSAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gICAgICBvYmogICBUaGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBiZSBwcmludGVkCi0JICogQHNlZSAgICAgICAgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpIG9iaiA9ICIiOwotCQl3cml0ZShTdHJpbmcudmFsdWVPZihvYmopKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhIHN0cmluZy4gIElmIHRoZSBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSBzdHJpbmcKLQkgKiA8Y29kZT4iIjwvY29kZT4gaXMgcHJpbnRlZC4gIE90aGVyd2lzZSwgdGhlIHN0cmluZydzIGNoYXJhY3RlcnMgYXJlCi0JICogY29udmVydGVkIGludG8gYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyCi0JICogZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcyBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlCi0JICogPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgotCSAqCi0JICogQHBhcmFtICAgICAgcyAgIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKSBzID0gIiI7Ci0JCXdyaXRlKHMpOwotCX0gLy8gcHJpbnQoKQotCi0JLyoqCi0JICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgotCSAqIEBwYXJhbSBjIGludCBzcGVjaWZ5aW5nIGEgY2hhcmFjdGVyIHRvIGJlIHdyaXR0ZW4uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHsKLQkJaWYgKHRyb3VibGUpIHJldHVybjsKLQkJc3VwZXIud3JpdGUoYyk7Ci0JCWlmIChvdXQwLnNpemUoKSA+PSBtYXgpIHsKLQkJCWZsdXNoKCk7Ci0JCX0KLQl9IC8vIHdyaXRlKCkKLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqIEBwYXJhbSBidWYgQXJyYXkgb2YgY2hhcmFjdGVycwotCSAqIEBwYXJhbSBvZmYgT2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgd3JpdGluZyBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIGxlbiBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJaWYgKHRyb3VibGUgfHwgYnVmID09IG51bGwgfHwgbGVuID09IDApIHJldHVybjsKLQkJc3VwZXIud3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCWlmIChvdXQwLnNpemUoKSA+PSBtYXgpIHsKLQkJCWZsdXNoKCk7Ci0JCX0KLQl9IC8vIHdyaXRlKCkKLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KLQkgKiBAcGFyYW0gcyBBIFN0cmluZwotCSAqIEBwYXJhbSBvZmYgT2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgd3JpdGluZyBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIGxlbiBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCWlmICh0cm91YmxlIHx8IHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJc3VwZXIud3JpdGUocywgb2ZmLCBsZW4pOwotCQlpZiAob3V0MC5zaXplKCkgPj0gbWF4KSB7Ci0JCQlmbHVzaCgpOwotCQl9Ci0JfSAvLyB3cml0ZSgpCi0KLX0gLy8gR3Jvb3Z5V3JpdGVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Qcm94eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllYjg3YS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotcGFja2FnZSBncm9vdnkudXRpbDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOwotaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIFVzZXI6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAyMSwgMjAwNAotICogUHJveHkgZm9yIGFub3RoZXIgb2JqZWN0LiAgQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGFuZCBtZXRob2QgaW52b2thdGlvbnMgZ2V0IGZvcndhcmRlZCB0byBhY3R1YWwgb2JqZWN0LgotICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdCBiZWNhdXNlIGl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQsIHdpdGggbmV3IHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgcHJvdmlkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eSBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgewotCi0JcHJpdmF0ZSBPYmplY3QgcmVhbDsKLQlwcml2YXRlIE1ldGFDbGFzcyBtZXRhOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuICBUYWtlcyByZWFsIG9iamVjdCB0byBiZSBleGNhcHN1bGF0ZWQuCi0JICogQHBhcmFtIHJlYWwKLQkgKi8KLQlwdWJsaWMgUHJveHkoT2JqZWN0IHJlYWwpIHsKLQkJdGhpcy5yZWFsID0gcmVhbDsKLQkJdGhpcy5tZXRhID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MocmVhbCk7Ci0JfSAvLyBQcm94eSgpCi0KLQkvKioKLQkgKiBHZXQgdGhlIHByb3BlcnR5IG9mIHRoaXMgcHJveHksIG9yIHRoZSByZWFsIG9iamVjdCBpZiBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LgotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldE1ldGFDbGFzcygpLmdldFByb3BlcnR5KHRoaXMsIHByb3BlcnR5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBtZXRhLmdldFByb3BlcnR5KHJlYWwsIHByb3BlcnR5KTsKLQkJfQotCX0gLy8gZ2V0UHJvcGVydHkoKQotCi0JLyoqCi0JICogU2V0IHRoZSBwcm9wZXJ0eSBvZiB0aGlzIHByb3h5LCBvciB0aGUgcmVhbCBvYmplY3QgaWYgcHJvcGVydHkgZG9lc24ndCBleGlzdC4KLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0cnkgewotCQkJZ2V0TWV0YUNsYXNzKCkuc2V0UHJvcGVydHkodGhpcywgcHJvcGVydHksIG5ld1ZhbHVlKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKLQkJCW1ldGEuc2V0UHJvcGVydHkocmVhbCwgcHJvcGVydHksIG5ld1ZhbHVlKTsKLQkJfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQltZXRhLnNldFByb3BlcnR5KHJlYWwsIHByb3BlcnR5LCBuZXdWYWx1ZSk7Ci0JCX0KLQl9IC8vIHNldFByb3BlcnR5KCkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY2Fwc3VsYXRlZCBvYmplY3QuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVhbE9iamVjdCgpIHsgcmV0dXJuIHJlYWw7IH0KLQotCS8qKgotCSAqIENhbGwgYSBtZXRob2Qgb2YgdGhpcyBwcm94eSwgb3IgdGhlIHJlYWwgb2JqZWN0IGlmIG1ldGhvZCBkb2Vzbid0IGV4aXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0TWV0YUNsYXNzKCkuaW52b2tlTWV0aG9kKHRoaXMsIG5hbWUsIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBtZXRhLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmdzKTsKLQkJfQotCX0gLy8gaW52b2tlTWV0aG9kKCkKLQotfSAvLyBQcm94eQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL0xvYWRlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQwODNjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Mb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5tb2R1bGVzLnBhZ2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogQXV0aG9yOiBUcm95IEhlbmluZ2VyCi0gKiBEYXRlOiBKYW4gMTAsIDIwMDQKLSAqIENsYXNzIGxvYWRlciB0aGF0IGtub3dzIGFib3V0IGxvYWRpbmcgZnJvbSBhIHNlcnZsZXQgY29udGV4dCBhbmQgYWJvdXQgY2xhc3MgZGVwZW5kYW5jaWVzLgotICovCi1wdWJsaWMgY2xhc3MgTG9hZGVyIGV4dGVuZHMgR3Jvb3Z5Q2xhc3NMb2FkZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGg7Ci0JcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgTWFwIGRlcGVuZGVuY2llczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBzZXJ2bGV0UGF0aAotCSAqIEBwYXJhbSBkZXBlbmRlbmNpZXMKLQkgKi8KLQlwdWJsaWMgTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZsZXRQYXRoLCBNYXAgZGVwZW5kZW5jaWVzKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuc2VydmxldFBhdGggPSBzZXJ2bGV0UGF0aDsKLQkJdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7Ci0JfSAvLyBMb2FkZXIoKQotCi0JLyoqCi0JICogTG9hZCB0aGUgY2xhc3MuCi0JICogQHRvZG8gRml4IHRoaXMgdG8gd29yayB3aXRoIC5nc3AgZXh0ZW5zaW9ucwotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuZ3Jvb3Z5IjsKLQkJVVJMIGRlcGVuZGVudFNjcmlwdDsKLQkJdHJ5IHsKLQkJCWRlcGVuZGVudFNjcmlwdCA9IGNvbnRleHQuZ2V0UmVzb3VyY2UoIi9XRUItSU5GL2dyb292eS8iICsgZmlsZW5hbWUpOwotCQkJaWYgKGRlcGVuZGVudFNjcmlwdCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGN1cnJlbnQgPSBzZXJ2bGV0UGF0aC5zdWJzdHJpbmcoMCwgc2VydmxldFBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpOwotCQkJCWRlcGVuZGVudFNjcmlwdCA9IGNvbnRleHQuZ2V0UmVzb3VyY2UoY3VycmVudCArIGZpbGVuYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGNsYXNzTmFtZSArICI6ICIgKyBlKTsKLQkJfQotCQlpZiAoZGVwZW5kZW50U2NyaXB0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCAiICsgY2xhc3NOYW1lICsgIiBpbiB3ZWJhcHAiKTsKLQkJfSBlbHNlIHsKLQkJCVVSTENvbm5lY3Rpb24gZGVwZW5kZW50U2NyaXB0Q29ubjsKLQkJCXRyeSB7Ci0JCQkJZGVwZW5kZW50U2NyaXB0Q29ubiA9IGRlcGVuZGVudFNjcmlwdC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWRlcGVuZGVuY2llcy5wdXQoZGVwZW5kZW50U2NyaXB0LCBuZXcgTG9uZyhkZXBlbmRlbnRTY3JpcHRDb25uLmdldExhc3RNb2RpZmllZCgpKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCAiICsgY2xhc3NOYW1lICsgIjogIiArIGUxKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHBhcnNlQ2xhc3MoZGVwZW5kZW50U2NyaXB0Q29ubi5nZXRJbnB1dFN0cmVhbSgpLCBmaWxlbmFtZSk7Ci0JCQl9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZTIpIHsKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1BhcnNlLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvUGFyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiM2QwZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvUGFyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkubW9kdWxlcy5wYWdlczsKLQotaW1wb3J0IGdyb292eS5tb2R1bGVzLnBhZ2VzLkdyb292eVBhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBBdXRob3I6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICogUGFyc2VyIGZvciBHcm9vdnlQYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlIGltcGxlbWVudHMgVG9rZW5zIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcGFyYUJyZWFrID0gUGF0dGVybi5jb21waWxlKCIvcD5cXHMqPHBbXj5dKj4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcm93QnJlYWsgPSBQYXR0ZXJuLmNvbXBpbGUoIigoL3RkPlxccyo8L3RyPlxccyo8KT90cltePl0qPlxccyo8KT90ZFtePl0qPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0KLQlwcml2YXRlIFNjYW4gc2NhbjsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWY7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmaW5hbFBhc3MgPSBmYWxzZTsKLQotCXB1YmxpYyBQYXJzZShTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNjYW4gPSBuZXcgU2NhbihyZWFkU3RyZWFtKGluKSk7Ci0JCW1ha2VOYW1lKG5hbWUpOwotCX0gLy8gUGFyc2UoKQotCi0JcHVibGljIElucHV0U3RyZWFtIHBhcnNlKCkgewotCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXBhZ2UoKTsKLQkJZmluYWxQYXNzID0gdHJ1ZTsKLQkJc2Nhbi5yZXNldCgpOwotCQlwYWdlKCk7Ci0vLwkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oYnVmKTsKLQkJSW5wdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1Zi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQlidWYgPSBudWxsOwotCQlzY2FuID0gbnVsbDsKLQkJcmV0dXJuIG91dDsKLQl9IC8vIHBhcnNlKCkKLQotCXByaXZhdGUgdm9pZCBkZWNsYXJlKGJvb2xlYW4gZ3NwKSB7Ci0JCWlmIChmaW5hbFBhc3MpIHJldHVybjsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlOiBkZWNsYXJlIik7Ci0JCWJ1Zi5hcHBlbmQoIlxuIik7Ci0JCXdyaXRlKHNjYW4uZ2V0VG9rZW4oKS50cmltKCksIGdzcCk7Ci0JCWJ1Zi5hcHBlbmQoIlxuXG4iKTsKLQl9IC8vIGRlY2xhcmUoKQotCi0JcHJpdmF0ZSB2b2lkIGRpcmVjdCgpIHsKLQkJaWYgKGZpbmFsUGFzcykgcmV0dXJuOwotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigicGFyc2U6IGRpcmVjdCIpOwotCQlTdHJpbmcgdGV4dCA9IHNjYW4uZ2V0VG9rZW4oKTsKLQkJdGV4dCA9IHRleHQudHJpbSgpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiZGlyZWN0KCIgKyB0ZXh0ICsgJyknKTsKLQkJaWYgKHRleHQuc3RhcnRzV2l0aCgicGFnZSAiKSkgZGlyZWN0UGFnZSh0ZXh0KTsKLQl9IC8vIGRpcmVjdCgpCi0KLQlwcml2YXRlIHZvaWQgZGlyZWN0UGFnZShTdHJpbmcgdGV4dCkgewotCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoNSkudHJpbSgpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiZGlyZWN0UGFnZSgiICsgdGV4dCArICcpJyk7Ci0JCVBhdHRlcm4gcGF0ID0gUGF0dGVybi5jb21waWxlKCIoXFx3KylcXHMqPVxccypcIihbXlwiXSopXCIiKTsKLQkJTWF0Y2hlciBtYXQgPSBwYXQubWF0Y2hlcih0ZXh0KTsKLQkJZm9yIChpbnQgaXggPSAwOzspIHsKLQkJCWlmICghbWF0LmZpbmQoaXgpKSByZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IG1hdC5ncm91cCgxKTsKLQkJCVN0cmluZyB2YWx1ZSA9IG1hdC5ncm91cCgyKTsKLQkJCWlmIChuYW1lLmVxdWFscygiaW1wb3J0IikpIHBhZ2VJbXBvcnQodmFsdWUpOwotCQkJaXggPSBtYXQuZW5kKCk7Ci0JCX0KLQl9IC8vIGRpcmVjdFBhZ2UoKQotCi0JcHJpdmF0ZSB2b2lkIGV4cHIoKSB7Ci0JCWlmICghZmluYWxQYXNzKSByZXR1cm47Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZTogZXhwciIpOwotCQlidWYuYXBwZW5kKCJvdXQucHJpbnQoIik7Ci0JCVN0cmluZyB0ZXh0ID0gc2Nhbi5nZXRUb2tlbigpLnRyaW0oKTsKLQkJYnVmLmFwcGVuZChHcm9vdnlQYWdlLmZyb21IdG1sKHRleHQpKTsKLQkJYnVmLmFwcGVuZCgiKVxuIik7Ci0JfSAvLyBleHByKCkKLQotCXByaXZhdGUgdm9pZCBodG1sKCkgewotCQlpZiAoIWZpbmFsUGFzcykgcmV0dXJuOwotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigicGFyc2U6IGh0bWwiKTsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHNjYW4uZ2V0VG9rZW4oKSk7Ci0JCXdoaWxlICh0ZXh0Lmxlbmd0aCgpID4gODApIHsKLQkJCWludCBlbmQgPSA4MDsKLQkJCQkvLyBkb24ndCBlbmQgYSBsaW5lIHdpdGggYSAnXCcKLQkJCXdoaWxlICh0ZXh0LmNoYXJBdChlbmQgLSAxKSA9PSAnXFwnKSBlbmQtLTsKLQkJCXByaW50KHRleHQuc3ViU2VxdWVuY2UoMCwgZW5kKSk7Ci0JCQl0ZXh0LmRlbGV0ZSgwLCBlbmQpOwotCQl9Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJcHJpbnQodGV4dCk7Ci0JCX0KLQl9IC8vIGh0bWwoKQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWludCBzbGFzaCA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKHNsYXNoID49IDApIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhzbGFzaCArIDEpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgaXggPSAwLCBpeHogPSBuYW1lLmxlbmd0aCgpOyBpeCA8IGl4ejsgaXgrKykgewotCQkJY2hhciBjID0gbmFtZS5jaGFyQXQoaXgpOwotCQkJaWYgKGMgPCAnMCcgfHwgKGMgPiAnOScgJiYgYyA8ICdAJykgfHwgKGMgPiAnWicgJiYgYyA8ICdfJykgfHwgKGMgPiAnXycgJiYgYyA8ICdhJykgfHwgYyA+ICd6JykgYyA9ICdfJzsKLQkJCWVsc2UgaWYgKGl4ID09IDAgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpIGMgPSAnXyc7Ci0JCQlidWYuYXBwZW5kKGMpOwotCQl9Ci0JCWNsYXNzTmFtZSA9IGJ1Zi50b1N0cmluZygpOwotCX0gLy8gbWFrZU5hbWUoKQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaChDaGFyU2VxdWVuY2UgcGF0LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0KSB7Ci0JCWludCBpeCA9IHN0YXJ0LCBpeHogPSB0ZXh0Lmxlbmd0aCgpLCBpeHkgPSBzdGFydCArIHBhdC5sZW5ndGgoKTsKLQkJaWYgKGl4eiA+IGl4eSkgaXh6ID0gaXh5OwotCQlpZiAocGF0Lmxlbmd0aCgpID4gaXh6IC0gc3RhcnQpIHJldHVybiBmYWxzZTsKLQkJZm9yICg7IGl4IDwgaXh6OyBpeCsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRleHQuY2hhckF0KGl4KSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHBhdC5jaGFyQXQoaXggLSBzdGFydCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0gLy8gbWF0Y2goKQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1hdGNoKFBhdHRlcm4gcGF0LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0KSB7Ci0JCU1hdGNoZXIgbWF0ID0gcGF0Lm1hdGNoZXIodGV4dCk7Ci0JCWlmIChtYXQuZmluZChzdGFydCkgJiYgbWF0LnN0YXJ0KCkgPT0gc3RhcnQpIHsKLQkJCXJldHVybiBtYXQuZW5kKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfSAvLyBtYXRjaCgpCi0KLQlwcml2YXRlIHZvaWQgcGFnZSgpIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlOiBwYWdlIik7Ci0JCWlmIChmaW5hbFBhc3MpIHsKLQkJCWJ1Zi5hcHBlbmQoIlxuY2xhc3MgIik7Ci0JCQlidWYuYXBwZW5kKGNsYXNzTmFtZSk7Ci0vLwkJCWJ1Zi5hcHBlbmQoIiBleHRlbmRzIEdyb292eVBhZ2Uge1xuIik7Ci0JCQlidWYuYXBwZW5kKCIgZXh0ZW5kcyBTY3JpcHQge1xuIik7ICAvL2ltcGxlbWVudHMgR3Jvb3Z5UGFnZSB7XG4iKTsKLQkJCWJ1Zi5hcHBlbmQoInJ1bigpIHtcbiIpOwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgiaW1wb3J0IGdyb292eS5tb2R1bGVzLnBhZ2VzLkdyb292eVBhZ2VcbiIpOwotCQl9Ci0JCWxvb3A6IGZvciAoOzspIHsKLQkJCWludCBzdGF0ZSA9IHNjYW4ubmV4dFRva2VuKCk7Ci0JCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJY2FzZSBFT0Y6IGJyZWFrIGxvb3A7Ci0JCQkJY2FzZSBIVE1MOiBodG1sKCk7IGJyZWFrOwotCQkJCWNhc2UgSkVYUFI6IGV4cHIoKTsgYnJlYWs7Ci0JCQkJY2FzZSBKU0NSSVBUOiBzY3JpcHQoZmFsc2UpOyBicmVhazsKLQkJCQljYXNlIEpESVJFQ1Q6IGRpcmVjdCgpOyBicmVhazsKLQkJCQljYXNlIEpERUNMQVI6IGRlY2xhcmUoZmFsc2UpOyBicmVhazsKLQkJCQljYXNlIEdFWFBSOiBleHByKCk7IGJyZWFrOwotCQkJCWNhc2UgR1NDUklQVDogc2NyaXB0KHRydWUpOyBicmVhazsKLQkJCQljYXNlIEdESVJFQ1Q6IGRpcmVjdCgpOyBicmVhazsKLQkJCQljYXNlIEdERUNMQVI6IGRlY2xhcmUodHJ1ZSk7IGJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChmaW5hbFBhc3MpIHsKLQkJCWJ1Zi5hcHBlbmQoIn1cbn1cbiIpOwotLy8JCQlidWYuYXBwZW5kKCJ9IC8vIHJ1bigpXG4iKTsKLQkJfQotCX0gLy8gcGFnZSgpCi0KLQlwcml2YXRlIHZvaWQgcGFnZUltcG9ydChTdHJpbmcgdmFsdWUpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhZ2VJbXBvcnQoIiArIHZhbHVlICsgJyknKTsKLQkJU3RyaW5nW10gaW1wb3J0cyA9IFBhdHRlcm4uY29tcGlsZSgiOyIpLnNwbGl0KHZhbHVlLnN1YlNlcXVlbmNlKDAsIHZhbHVlLmxlbmd0aCgpKSk7Ci0JCWZvciAoaW50IGl4ID0gMDsgaXggPCBpbXBvcnRzLmxlbmd0aDsgaXgrKykgewotCQkJYnVmLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJYnVmLmFwcGVuZChpbXBvcnRzW2l4XSk7Ci0JCQlidWYuYXBwZW5kKCdcbicpOwotCQl9Ci0JfSAvLyBwYWdlSW1wb3J0KCkKLQotCXByaXZhdGUgdm9pZCBwcmludChDaGFyU2VxdWVuY2UgdGV4dCkgewotCQlidWYuYXBwZW5kKCJvdXQucHJpbnQoJyIpOwotCQlmb3IgKGludCBpeCA9IDAsIGl4eiA9IHRleHQubGVuZ3RoKCk7IGl4IDwgaXh6OyBpeCsrKSB7Ci0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpeCk7Ci0JCQlTdHJpbmcgcmVwID0gbnVsbDsKLQkJCWlmIChjID09ICdcbicpIHJlcCA9ICJcXG4iOwotCQkJZWxzZSBpZiAoYyA9PSAnXHInKSByZXAgPSAiXFxyIjsKLQkJCWVsc2UgaWYgKGMgPT0gJ1x0JykgcmVwID0gIlxcdCI7Ci0JCQllbHNlIGlmIChjID09ICdcJycpIHJlcCA9ICJcXCciOwotCQkJZWxzZSBpZiAoYyA9PSAnXFwnKSByZXAgPSAiXFxcXCI7Ci0JCQlpZiAocmVwICE9IG51bGwpIGJ1Zi5hcHBlbmQocmVwKTsKLQkJCWVsc2UgYnVmLmFwcGVuZChjKTsKLQkJfQotCQlidWYuYXBwZW5kKCInKVxuIik7Ci0JfSAvLyBwcmludCgpCi0KLQlwcml2YXRlIFN0cmluZyByZWFkU3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOwotCQkJZm9yICg7OykgewotCQkJCWludCByZWFkID0gaW4ucmVhZChidWYpOwotCQkJCWlmIChyZWFkIDw9IDApIGJyZWFrOwotCQkJCW91dC53cml0ZShidWYsIDAsIHJlYWQpOwotCQkJfQotCQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQl9Ci0JfSAvLyByZWFkU3RyZWFtKCkKLQotCXByaXZhdGUgdm9pZCBzY3JpcHQoYm9vbGVhbiBnc3ApIHsKLQkJaWYgKCFmaW5hbFBhc3MpIHJldHVybjsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlOiBzY3JpcHQiKTsKLQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJd3JpdGUoc2Nhbi5nZXRUb2tlbigpLnRyaW0oKSwgZ3NwKTsKLQkJYnVmLmFwcGVuZCgiXG5cbiIpOwotCX0gLy8gc2NyaXB0KCkKLQotCXByaXZhdGUgdm9pZCB3cml0ZShDaGFyU2VxdWVuY2UgdGV4dCwgYm9vbGVhbiBnc3ApIHsKLQkJaWYgKCFnc3ApIHsKLQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaXggPSAwLCBpeHogPSB0ZXh0Lmxlbmd0aCgpOyBpeCA8IGl4ejsgaXgrKykgewotCQkJY2hhciBjID0gdGV4dC5jaGFyQXQoaXgpOwotCQkJU3RyaW5nIHJlcCA9IG51bGw7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCWZvciAoaXgrKzsgaXggPCBpeHo7IGl4KyspIHsKLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaXgpKSkgY29udGludWU7Ci0JCQkJCWl4LS07Ci0JCQkJCXJlcCA9ICIgIjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjID09ICcmJykgewotCQkJCWlmIChtYXRjaCgiJnNlbWk7IiwgdGV4dCwgaXgpKSB7Ci0JCQkJCXJlcCA9ICI7IjsKLQkJCQkJaXggKz0gNTsKLQkJCQl9IGVsc2UgaWYgKG1hdGNoKCImYW1wOyIsIHRleHQsIGl4KSkgewotCQkJCQlyZXAgPSAiJiI7Ci0JCQkJCWl4ICs9IDQ7Ci0JCQkJfSBlbHNlIGlmIChtYXRjaCgiJmx0OyIsIHRleHQsIGl4KSkgewotCQkJCQlyZXAgPSAiPCI7Ci0JCQkJCWl4ICs9IDM7Ci0JCQkJfSBlbHNlIGlmIChtYXRjaCgiJmd0OyIsIHRleHQsIGl4KSkgewotCQkJCQlyZXAgPSAiPiI7Ci0JCQkJCWl4ICs9IDM7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjID09ICc8JykgewotCQkJCWlmIChtYXRjaCgiPGJyPiIsIHRleHQsIGl4KSB8fCBtYXRjaCgiPGhyPiIsIHRleHQsIGl4KSkgewotCQkJCQlyZXAgPSAiXG4iOwotCQkJCQlpeCArPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBlbmQgPSBtYXRjaChwYXJhQnJlYWssIHRleHQsIGl4KTsKLQkJCQkJaWYgKGVuZCA8PSAwKSBlbmQgPSBtYXRjaChyb3dCcmVhaywgdGV4dCwgaXgpOwotCQkJCQlpZiAoZW5kID4gMCkgewotCQkJCQkJcmVwID0gIlxuIjsKLQkJCQkJCWl4ID0gZW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlcCAhPSBudWxsKSBidWYuYXBwZW5kKHJlcCk7Ci0JCQllbHNlIGJ1Zi5hcHBlbmQoYyk7Ci0JCX0KLQl9IC8vIHdyaXRlKCkKLQotfSAvLyBQYXJzZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1JldmVyc2UuamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9SZXZlcnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjZkMDQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1JldmVyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5tb2R1bGVzLnBhZ2VzOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIEF1dGhvcjogVHJveSBIZW5pbmdlcgotICogRGF0ZTogSmFuIDE2LCAyMDA0Ci0gKiBVdGlsaXR5IGNsYXNzIHRvIHJldmVyc2UgYSBjaGFyIHNlcXVlbmNlLgotICovCi1jbGFzcyBSZXZlcnNlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKLQlwcml2YXRlIENoYXJTZXF1ZW5jZSB0ZXh0OwotCXByaXZhdGUgaW50IHN0YXJ0LCBlbmQsIGFuY2hvcjsKLQotCVJldmVyc2UoQ2hhclNlcXVlbmNlIHRleHQpIHsKLQkJdGhpcyh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpKTsKLQl9Ci0KLQlSZXZlcnNlKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQl0aGlzLmVuZCA9IGVuZDsKLQkJYW5jaG9yID0gZW5kIC0gMTsKLQl9Ci0JcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGV4dC5jaGFyQXQoYW5jaG9yIC0gaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZW5kIC0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIG5ldyBSZXZlcnNlKHRleHQsIGFuY2hvciAtIGVuZCwgYW5jaG9yIC0gc3RhcnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWludCBsZW4gPSBsZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLQkJZm9yIChpbnQgaXggPSBhbmNob3I7IGl4ID49IHN0YXJ0OyBpeC0tKSB7Ci0JCQlidWYuYXBwZW5kKHRleHQuY2hhckF0KGl4KSk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0gLy8gUmV2ZXJzZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1NjYW4uamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9TY2FuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjlmOTguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1NjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkubW9kdWxlcy5wYWdlczsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBBdXRob3I6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICogTGV4ZXIgZm9yIEdyb292eVBhZ2VzLgotICovCi1jbGFzcyBTY2FuIGltcGxlbWVudHMgVG9rZW5zIHsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IGVuZDEsIGJlZ2luMSwgZW5kMiwgYmVnaW4yLCBzdGF0ZSA9IEhUTUwsIGxlbiwgbGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIHN0cjEsIHN0cjI7Ci0KLQlTY2FuKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmlwIHN0cmlwID0gbmV3IFN0cmlwKHRleHQpOwotCQlzdHJpcC5zdHJpcCgwKTsKLQkJdGhpcy50ZXh0ID0gc3RyaXAudG9TdHJpbmcoKTsKLQkJbGVuID0gdGhpcy50ZXh0Lmxlbmd0aCgpOwotCX0gLy8gU2NhbigpCi0KLQlwcml2YXRlIGludCBmb3VuZChpbnQgbmV3U3RhdGUsIGludCBza2lwKSB7Ci0JCWJlZ2luMiA9IGJlZ2luMTsKLQkJZW5kMiA9IC0tZW5kMTsKLQkJYmVnaW4xID0gZW5kMSArPSBza2lwOwotCQlpbnQgbGFzdFN0YXRlID0gc3RhdGU7Ci0JCXN0YXRlID0gbmV3U3RhdGU7Ci0JCXJldHVybiBsYXN0U3RhdGU7Ci0JfSAvLyBmb3VuZCgpCi0KLQlTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhiZWdpbjIsIGVuZDIpOwotCX0gLy8gZ2V0VG9rZW4oKQotCi0JaW50IG5leHRUb2tlbigpIHsKLQkJZm9yICg7OykgewotCQkJaW50IGxlZnQgPSBsZW4gLSBlbmQxOwotCQkJaWYgKGxlZnQgPT0gMCkgewotCQkJCWVuZDErKzsgLy8gaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgbGFzdCBsZXR0ZXIKLQkJCQlyZXR1cm4gZm91bmQoRU9GLCAwKTsKLQkJCX0KLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGVuZDErKyk7Ci0JCQljaGFyIGMxID0gbGVmdCA+IDEgPyB0ZXh0LmNoYXJBdChlbmQxKSA6IDA7Ci0JCQljaGFyIGMyID0gbGVmdCA+IDIgPyB0ZXh0LmNoYXJBdChlbmQxICsgMSkgOiAwOwotCi0JCQlpZiAoc3RyMSkgewotCQkJCWlmIChjID09ICdcXCcpIGVuZDErKzsKLQkJCQllbHNlIGlmIChjID09ICdcJycpIHN0cjEgPSBmYWxzZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoc3RyMikgewotCQkJCWlmIChjID09ICdcXCcpIGVuZDErKzsKLQkJCQllbHNlIGlmIChjID09ICciJykgc3RyMiA9IGZhbHNlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChsZXZlbCA+IDAgJiYgKGMgPT0gJyknIHx8IGMgPT0gJ30nIHx8IGMgPT0gJ10nKSkgewotCQkJCWxldmVsLS07Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAoc3RhdGUpIHsKLQkJCQljYXNlIEhUTUw6Ci0JCQkJCWlmIChjID09ICc8JyAmJiBsZWZ0ID4gMykgewotCQkJCQkJaWYgKGMxID09ICclJykgewotCQkJCQkJCWlmIChjMiA9PSAnPScpIHsKLQkJCQkJCQkJcmV0dXJuIGZvdW5kKEpFWFBSLCAzKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGMyID09ICdAJykgewotCQkJCQkJCQlyZXR1cm4gZm91bmQoSkRJUkVDVCwgMyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChjMiA9PSAnIScpIHsKLQkJCQkJCQkJcmV0dXJuIGZvdW5kKEpERUNMQVIsIDMpOwotCQkJCQkJCX0gZWxzZSBpZiAoYzIgPT0gJy0nICYmIGxlZnQgPiAzICYmIHRleHQuY2hhckF0KGVuZDEgKyAyKSA9PSAnLScpIHsKLQkJCQkJCQkJaWYgKHNraXBKQ29tbWVudCgpKSBjb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZvdW5kKEpTQ1JJUFQsIDIpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGMgPT0gJyQnICYmIGMxID09ICd7JykgewotCQkJCQkJcmV0dXJuIGZvdW5kKEdFWFBSLCAyKTsKLQkJCQkJfSBlbHNlIGlmIChjID09ICclJyAmJiBjMSA9PSAneycpIHsKLQkJCQkJCWlmIChjMiA9PSAnLScgJiYgbGVmdCA+IDMgJiYgdGV4dC5jaGFyQXQoZW5kMSArIDIpID09ICctJykgewotCQkJCQkJCWlmIChza2lwR0NvbW1lbnQoKSkgY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZm91bmQoR1NDUklQVCwgMik7Ci0JCQkJCX0gZWxzZSBpZiAoYyA9PSAnIScgJiYgYzEgPT0gJ3snKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoR0RFQ0xBUiwgMik7Ci0JCQkJCX0gZWxzZSBpZiAoYyA9PSAnQCcgJiYgYzEgPT0gJ3snKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoR0RJUkVDVCwgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKRVhQUjoKLQkJCQljYXNlIEpTQ1JJUFQ6Ci0JCQkJY2FzZSBKRElSRUNUOgotCQkJCWNhc2UgSkRFQ0xBUjoKLQkJCQkJaWYgKGMgPT0gJyUnICYmIGMxID09ICc+JykgewotCQkJCQkJcmV0dXJuIGZvdW5kKEhUTUwsIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgR0VYUFI6Ci0JCQkJY2FzZSBHRElSRUNUOgotCQkJCQlpZiAoYyA9PSAnfScgJiYgIXN0cjEgJiYgIXN0cjIgJiYgbGV2ZWwgPT0gMCkgewotCQkJCQkJcmV0dXJuIGZvdW5kKEhUTUwsIDEpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgR1NDUklQVDoKLQkJCQkJaWYgKGMgPT0gJ30nICYmIGMxID09ICclJyAmJiAhc3RyMSAmJiAhc3RyMiAmJiBsZXZlbCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gZm91bmQoSFRNTCwgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBHREVDTEFSOgotCQkJCQlpZiAoYyA9PSAnfScgJiYgKGMxID09ICchJyB8fCBjMSA9PSAnJScpICYmICFzdHIxICYmICFzdHIyICYmIGxldmVsID09IDApIHsKLQkJCQkJCXJldHVybiBmb3VuZChIVE1MLCAyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gLy8gbmV4dFRva2VuKCkKLQotCXByaXZhdGUgYm9vbGVhbiBza2lwQ29tbWVudChjaGFyIGMzLCBjaGFyIGM0KSB7Ci0JCWludCBpeCA9IGVuZDEgKyAzOwotCQlmb3IgKGludCBpeHogPSBsZW4gLSA0OyA7IGl4KyspIHsKLQkJCWlmIChpeCA+PSBpeHopIHJldHVybiBmYWxzZTsKLQkJCWlmICh0ZXh0LmNoYXJBdChpeCkgPT0gJy0nICYmIHRleHQuY2hhckF0KGl4ICsgMSkgPT0gJy0nICYmIHRleHQuY2hhckF0KGl4ICsgMikgPT0gYzMKLQkJCSAgICAgICAgJiYgdGV4dC5jaGFyQXQoaXggKyAzKSA9PSBjNCkgYnJlYWs7Ci0JCX0KLQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIC0tZW5kMSkgKyB0ZXh0LnN1YnN0cmluZyhpeCArIDQpOwotCQlsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IC8vIHNraXBDb21tZW50KCkKLQotCXByaXZhdGUgYm9vbGVhbiBza2lwR0NvbW1lbnQoKSB7Ci0JCXJldHVybiBza2lwQ29tbWVudCgnfScsICclJyk7Ci0JfSAvLyBza2lwR0NvbW1lbnQoKQotCi0JcHJpdmF0ZSBib29sZWFuIHNraXBKQ29tbWVudCgpIHsKLQkJcmV0dXJuIHNraXBDb21tZW50KCclJywgJz4nKTsKLQl9IC8vIHNraXBKQ29tbWVudCgpCi0KLQl2b2lkIHJlc2V0KCkgewotCQllbmQxPSBiZWdpbjEgPSBlbmQyID0gYmVnaW4yID0gbGV2ZWwgPSAwOwotCQlzdGF0ZSA9IEhUTUw7Ci0JfSAvLyByZXNldCgpCi0KLX0gLy8gU2NhbgotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvU3RyaXAuamF2YSBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9TdHJpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZmMzViLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9TdHJpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lm1vZHVsZXMucGFnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBBdXRob3I6IFRyb3kgSGVuaW5nZXIKLSAqIERhdGU6IEphbiAxMCwgMjAwNAotICogVXRpbGl0eSBjbGFzcyB0byBzdHJpcCBIVE1MIGZyb20gYXJvdW5kIHRhZ3MgdGhhdCBzcGVjaWZ5IGl0LgotICovCi1jbGFzcyBTdHJpcCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBzdHJpcFRhZyA9IFBhdHRlcm4uY29tcGlsZSgiXFxeKFthLXpBLVpdKyklXFx7KFtefV18XFx9W14lXSkqXFx9JSIpOwotCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gYW55VGFnID0gUGF0dGVybi5jb21waWxlKCIoKFxcXlthLXpBLVpdKT8lXFx7KFtefV18XFx9W14lXSkqXFx9JXxbJEBdXFx7W159XSpcXH0pIik7Ci0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciB0ZXh0OwotCi0JU3RyaXAoQ2hhclNlcXVlbmNlIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCkpOwotCX0gLy8gU2NhbigpCi0KLQl2b2lkIHN0cmlwKGludCBpbmRleCkgewotCQlNYXRjaGVyIG1hdGNoID0gc3RyaXBUYWcubWF0Y2hlcih0ZXh0KTsKLQkJaWYgKG1hdGNoLmZpbmQoaW5kZXgpKSB7Ci0JCQlzdHJpcChtYXRjaC5lbmQoKSk7Ci0JCQlTdHJpbmcgdGFnID0gbWF0Y2guZ3JvdXAoMSk7Ci0JCQlpbnQgc3RhcnQgPSBtYXRjaC5zdGFydCgpICsgMSArIHRhZy5sZW5ndGgoKTsgLy8gYmVnaW4gYWZ0ZXIgJ150YWcnOyBhdCB0aGUgJyV7JwotCQkJaW50IGVuZCA9IG1hdGNoLmVuZCgpOwotCQkJUGF0dGVybiBwYXRBZnRlciA9IFBhdHRlcm4uY29tcGlsZSgiPC8iICsgdGFnICsgIig+fFtePmEtekEtWl1bXj5dKj4pXFxzKiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0JCQlNYXRjaGVyIG1hdGNoQWZ0ZXIgPSBwYXRBZnRlci5tYXRjaGVyKHRleHQpOwotCQkJaWYgKG1hdGNoQWZ0ZXIuZmluZChlbmQpKSB7Ci0JCQkJaW50IGVuZDIgPSBtYXRjaEFmdGVyLmVuZCgpOwotCQkJCU1hdGNoZXIgbWF0Y2hBbnkgPSBhbnlUYWcubWF0Y2hlcih0ZXh0LnN1YlNlcXVlbmNlKDAsIGVuZDIpKTsKLQkJCQlpZiAobWF0Y2hBbnkuZmluZChlbmQpKSBlbmQyID0gbWF0Y2hBbnkuc3RhcnQoKTsKLQkJCQlQYXR0ZXJuIG5leHRUYWdQYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIjwiICsgdGFnICsgIihcXHN8PikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCQkJCU1hdGNoZXIgbWF0Y2hOZXh0ID0gbmV4dFRhZ1BhdC5tYXRjaGVyKHRleHQuc3ViU2VxdWVuY2UoMCwgZW5kMikpOwotCQkJCWlmIChtYXRjaE5leHQuZmluZChlbmQpKSBlbmQyID0gbWF0Y2hOZXh0LnN0YXJ0KCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaXBwaW5nICIgKyB0ZXh0LnN1YlNlcXVlbmNlKGVuZCwgZW5kMikpOwotCQkJCXRleHQuZGVsZXRlKGVuZCwgZW5kMik7Ci0JCQl9Ci0JCQlQYXR0ZXJuIHBhdEJlZm9yZSA9IFBhdHRlcm4uY29tcGlsZShuZXcgUmV2ZXJzZSgiKnNcXDwiICsgdGFnKS50b1N0cmluZygpLAotCQkJCQlQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCQkJTWF0Y2hlciBtYXRjaEJlZm9yZSA9IHBhdEJlZm9yZS5tYXRjaGVyKG5ldyBSZXZlcnNlKHRleHQsIDAsIHN0YXJ0KSk7Ci0JCQlpZiAobWF0Y2hCZWZvcmUuZmluZCgpKSB7Ci0JCQkJaW50IHN0YXJ0MiA9IHN0YXJ0IC0gbWF0Y2hCZWZvcmUuZW5kKCk7Ci0JCQkJTWF0Y2hlciBtYXRjaEFueSA9IGFueVRhZy5tYXRjaGVyKHRleHQuc3ViU2VxdWVuY2UoMCwgc3RhcnQpKTsKLQkJCQlpZiAobWF0Y2hBbnkuZmluZChzdGFydDIpKSBzdGFydDIgPSBtYXRjaEFueS5lbmQoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdHJpcHBpbmcgIiArIHRleHQuc3ViU2VxdWVuY2Uoc3RhcnQyLCBzdGFydCkpOwotCQkJCXRleHQuZGVsZXRlKHN0YXJ0Miwgc3RhcnQpOwotCQkJfQotCQl9Ci0JfSAvLyBzdHJpcCgpCi0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCX0KLQotfSAvLyBTdHJpcApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1Rva2Vucy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9tb2R1bGVzL3BhZ2VzL1Rva2Vucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGJmYzU5Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvbW9kdWxlcy9wYWdlcy9Ub2tlbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5tb2R1bGVzLnBhZ2VzOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIEF1dGhvcjogVHJveSBIZW5pbmdlcgotICogRGF0ZTogSmFuIDEwLCAyMDA0Ci0gKiBUb2tlbiBjb25zdGFudHMgZm9yIGxleGVyIGFuZCBwYXJzZXIuCi0gKi8KLWludGVyZmFjZSBUb2tlbnMgewotCXN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0Jc3RhdGljIGZpbmFsIGludCBIVE1MID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEpFWFBSID0gMTsgICAvLyA8JT0gLi4uICU+Ci0Jc3RhdGljIGZpbmFsIGludCBKU0NSSVBUID0gMjsgLy8gPCUgLi4uLiAlPgotCXN0YXRpYyBmaW5hbCBpbnQgSkRJUkVDVCA9IDM7IC8vIDwlQCAuLi4gJT4KLQlzdGF0aWMgZmluYWwgaW50IEpERUNMQVIgPSA0OyAvLyA8JSEgLi4uICU+Ci0Jc3RhdGljIGZpbmFsIGludCBHRVhQUiA9IDExOyAgIC8vICR7IC4uLiB9Ci0Jc3RhdGljIGZpbmFsIGludCBHU0NSSVBUID0gMTI7IC8vICV7IC4uLiB9JQotCXN0YXRpYyBmaW5hbCBpbnQgR0RJUkVDVCA9IDEzOyAvLyBAeyAuLi4gfQotCXN0YXRpYyBmaW5hbCBpbnQgR0RFQ0xBUiA9IDE0OyAvLyAheyAuLi4gfSEKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvV0VCLUlORi93ZWIueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODQ1YzIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08d2ViLWFwcD4KLQk8ZGlzcGxheS1uYW1lPkdyb292eVBhZ2VzIFRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8ZGVzY3JpcHRpb24+R3Jvb3Z5UGFnZXMgVGVzdDwvZGVzY3JpcHRpb24+Ci0JPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+R3Jvb3Z5UGFnZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+Z3Jvb3Z5Lm1vZHVsZXMucGFnZXMuR3Jvb3Z5UGFnZXM8L3NlcnZsZXQtY2xhc3M+Ci0JCTxpbml0LXBhcmFtPgotCQkJPHBhcmFtLW5hbWU+YWxsb3dTcGlsbGluZzwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KLQkJCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICBBbGxvd3MgZGV2ZWxvcGVycyB0byB2aWV3IHRoZSBpbnRlcm1lZGlhZGUgc291cmNlIGNvZGUsIHdoZW4gdGhleSBwYXNzCi0JCQkJYSBzcGlsbEdyb292eSBhcmd1bWVudCBpbiB0aGUgVVJMLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JCTwvaW5pdC1wYXJhbT4KLSAgICA8L3NlcnZsZXQ+Ci0JPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+R3Jvb3Z5U2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5ncm9vdnkuc2VydmxldC5Hcm9vdnlTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQk8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkdyb292eVBhZ2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmdzcDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0JPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5Hcm9vdnlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmdyb292eTwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0JPHdlbGNvbWUtZmlsZS1saXN0PgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtPC93ZWxjb21lLWZpbGU+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bTwvd2VsY29tZS1maWxlPgotCTwvd2VsY29tZS1maWxlLWxpc3Q+Ci08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvd2ViL2RlZmF1bHQuaHRtIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9kZWZhdWx0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMzQ3NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvd2ViL2RlZmF1bHQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgotPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDUuMCI+Ci08bWV0YSBuYW1lPSJQcm9nSWQiIGNvbnRlbnQ9IkZyb250UGFnZS5FZGl0b3IuRG9jdW1lbnQiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTx0aXRsZT5Hcm9vdnlQYWdlcyBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDIgYWxpZ249ImNlbnRlciI+R3Jvb3Z5UGFnZXMgRXhhbXBsZXMgSG9tZTwvaDI+Ci0KLTxwPkhlcmUgYXJlIHNvbWUgcGFnZXMgdGhhdCBkZW1vbnN0cmF0ZSBHcm9vdnlQYWdlcyBpbiBhY3Rpb24uJm5ic3A7IFRoZXNlIAotZXhhbXBsZXMgYXJlIHJ1bm5pbmcgbGl2ZSBhbmQgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgYXMgd2VsbC4mbmJzcDsgTm90ZTogaWYgCi15b3Ugd2lzaCB0byB2aWV3IHRoZSBpbnRlcm1lZGlhdGUgZ3Jvb3Z5IGNvZGUsIHBhc3MgYSBzcGlsbEdyb292eSBwYXJhbWV0ZXIgaW4gCi10aGUgVVJMIHRoZW4gdmlldyB0aGUgc291cmNlIHRvIHRoZSBwYWdlLiZuYnNwOyA8YSBocmVmPSJzaW1wbGUuZ3NwP3NwaWxsR3Jvb3Z5Ij5DbGljayBoZXJlIGZvciBhbiBleGFtcGxlLjwvYT48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotICA8Y2VudGVyPgotICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBpZD0iQXV0b051bWJlcjEiPgotICAgIDx0cj4KLSAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnZlc3RvcnRlY2guY29tL2VtcC90cm95L2dyb292eXBhZ2VzLmh0bSI+R3Jvb3Z5UGFnZXM8L2E+PC90ZD4KLSAgICAgIDx0ZD5CYWNrIHRvIHRoZSBHcm9vdnlQYWdlcyBkZXZlbG9wbWVudCBzaXRlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9InNpbXBsZS5nc3AiPlNpbXBsZSBFeGFtcGxlPC9hPjwvdGQ+Ci0gICAgICA8dGQ+QSB2ZXJ5IGJhc2ljIGV4YW1wbGU8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGEgaHJlZj0ianNwLmdzcCI+SlNQIFN5bnRheDwvYT48L3RkPgotICAgICAgPHRkPlNob3dzIGhvdyBHcm9vdnlQYWdlcyBzdXBwb3J0cyB0aGUgSlNQIHN5bnRheDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgYWxpZ249InJpZ2h0Ij48YSBocmVmPSJ2aXNpYmxlLmdzcCI+VmlzaWJsZSBTeW50YXg8L2E+PC90ZD4KLSAgICAgIDx0ZD5TaG93cyBob3cgR3Jvb3Z5UGFnZXMgc3VwcG9ydHMgYW4gYWx0ZXJuYXRlIHN5bnRheDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPC9jZW50ZXI+Ci08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9qc3AuZ3NwIGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9qc3AuZ3NwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdlNTg1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvanNwLmdzcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5Hcm9vdnlQYWdlcyBUZXN0PC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyIGFsaWduPSJjZW50ZXIiPkpTUCBTeW50YXg8L2gyPg0KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjQiPg0KLSAgPHRyPg0KLSAgICA8dGQ+DQotCTxpPkxpbmtzOjwvaT48L3RkPg0KLSAgICA8dGQ+DQotCTxpPg0KLQk8YSBocmVmPSJkZWZhdWx0Lmh0bSI+RXhhbXBsZXMgSG9tZTwvYT48L2k+PC90ZD4NCi0gICAgPHRkPg0KLQk8aT4gPGEgaHJlZj0ic2ltcGxlLmdzcCI+U2ltcGxlIEV4YW1wbGU8L2E+PC9pPjwvdGQ+DQotICAgIDx0ZD4NCi0JPGk+DQotICAgIDxhIGhyZWY9InZpc2libGUuZ3NwP2FyZz1UaGlzK2lzK2ErdGVzdCthcmd1bWVudCZsYXN0Q291bnQ9JHtzZXNzaW9uLmNvdW50fSI+DQotICAgIFZpc2libGUgU3ludGF4PC9hPjwvaT48L3RkPg0KLSAgICA8dGQ+DQotCTxpPg0KLSAgICA8YSBocmVmPSJqc3AuZ3NwP2FyZz1UaGlzK2lzK2ErdGVzdCthcmd1bWVudCZsYXN0Q291bnQ9PCU9c2Vzc2lvbi5jb3VudCU+Ij4NCi0gICAgSlNQIFN5bnRheDwvYT48L2k+PC90ZD4NCi0gIDwvdHI+DQotPC90YWJsZT4NCi08cD4mbmJzcDsmbmJzcDsmbmJzcDsgVGhpcyBpcyBhbiBleGFtcGxlIG9mIEdyb292eVBhZ2VzIHNob3dpbmcgdGhlIHVzZSBvZiB0aGUgDQotSlNQIHN5bnRheC4mbmJzcDsgVGhpcyBzeW50YXggaXMgZXhhY3RseSBsaWtlIEpTUCBleGNlcHQgdGhhdCB0aGUgY29kZSBwb3J0aW9ucyANCi1hcmUgR3Jvb3Z5LCByYXRoZXIgdGhhbiBKYXZhLiZuYnNwOyBHcm9vdnlQYWdlcyBhbHNvIHN1cHBvcnQgYW4gYWx0ZXJuYXRlIA0KLWVkaXRvci12aXNpYmxlIHN5bnRheCB3aGljaCBpcyBzb21ldGltZXMgcHJlZmVyYWJsZSB3aGVuIHRoZSBwcm9ncmFtbWVyIGlzIGFsc28gdGhlIA0KLXBhZ2UgZGVzaWduZXIgb3Igd2hlbiB0aGV5IHdhbnQgdG8gc2VlIGFuZCBlZGl0IHRoZWlyIGluIHRoZSB3ZWIgZWRpdG9yJ3MgDQotZm9ybWF0dGVkLCBub3JtYWwgdmlldywgcmF0aGVyIHRoYW4gaW4gcmF3LCBub2lzeSBIVE1MIGFsbCBvZiB0aGUgdGltZS48L3A+DQotPCUgLy8gTWFrZSBzdXJlIGNvdW50IGlzIHNldA0KLWlmIChzZXNzaW9uLmNvdW50ID09IG51bGwpIHNlc3Npb24uY291bnQgPSAxIA0KLSU+DQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjEiPg0KLSAgPHRyPg0KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMiI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPjxiPlBhZ2UgQXJndW1lbnRzPC9iPjwvdGQ+DQotICAgICAgPC90cj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+QXJndW1lbnQ8L3RkPg0KLSAgICAgICAgPHRkPlZhbHVlPC90ZD4NCi0gICAgICA8L3RyPg0KLQkJPCUgLy8gRm9yIGVhY2ggcGFyYW1ldGVyDQotCQlmb3IgKGl0IGluIHJlcXVlc3QpIHsgJT4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+PCU9IGl0LmtleSAlPiZuYnNwOzwvdGQ+DQotICAgICAgICA8dGQ+PCU9IGl0LnZhbHVlICU+Jm5ic3A7PC90ZD4NCi0gICAgICA8L3RyPg0KLQkJPCUgfSAlPg0KLSAgICA8L3RhYmxlPg0KLSAgICA8L3RkPg0KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMyI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPjxiPlNlc3Npb24gVmFyaWFibGVzPC9iPjwvdGQ+DQotICAgICAgPC90cj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+VmFyaWFibGU8L3RkPg0KLSAgICAgICAgPHRkPlZhbHVlPC90ZD4NCi0gICAgICA8L3RyPg0KLQkJPCUgLy8gRm9yIGVhY2ggc2Vzc2lvbiB2YXJpYWJsZQ0KLQkJc2Vzc2lvbi5lYWNoKCkgeyAlPg0KLSAgICAgIDx0cj4NCi0gICAgICAgIDx0ZD48JT0gaXQua2V5ICU+Jm5ic3A7PC90ZD4NCi0gICAgICAgIDx0ZD48JT0gaXQudmFsdWUgJT4mbmJzcDs8L3RkPg0KLSAgICAgIDwvdHI+DQotCQk8JSB9ICU+DQotICAgIDwvdGFibGU+DQotICAgIDwvdGQ+DQotICA8L3RyPg0KLTwvdGFibGU+DQotPCUgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvbiBlYWNoIHJlZnJlc2gNCi1zZXNzaW9uLmNvdW50KysgDQotJT4NCi08aDM+VGhlIFNvdXJjZSBDb2RlPC9oMz4NCi08cHJlPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JSAvLyBNYWtlIHN1cmUgY291bnQgaXMgc2V0PGJyPmlmIChzZXNzaW9uLmNvdW50ID09IG51bGwpIHNlc3Npb24uY291bnQgPSAxPGJyPiUmZ3Q7PC9zcGFuPjxicj4mbHQ7dGFibGUgYm9yZGVyPSZxdW90OzAmcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MCZxdW90OyBjZWxsc3BhY2luZz0mcXVvdDswJnF1b3Q7IHN0eWxlPSZxdW90O2JvcmRlci1jb2xsYXBzZTogDQotY29sbGFwc2UmcXVvdDsgYm9yZGVyY29sb3I9JnF1b3Q7IzExMTExMSZxdW90OyB3aWR0aD0mcXVvdDsxMDAlJnF1b3Q7IGlkPSZxdW90O0F1dG9OdW1iZXIxJnF1b3Q7Jmd0Ozxicj4gICZsdDt0ciZndDs8YnI+ICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzUwJSZxdW90OyZndDs8YnI+ICAgICAgJmx0O3RhYmxlIGJvcmRlcj0mcXVvdDsxJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzAmcXVvdDsgY2VsbHNwYWNpbmc9JnF1b3Q7MCZxdW90OyBzdHlsZT0mcXVvdDtib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlJnF1b3Q7DQotICAgICAgICBib3JkZXJjb2xvcj0mcXVvdDsjMTExMTExJnF1b3Q7IHdpZHRoPSZxdW90OzEwMCUmcXVvdDsgaWQ9JnF1b3Q7QXV0b051bWJlcjImcXVvdDsmZ3Q7PGJyPiAgICAgICAgJmx0O3RyJmd0Ozxicj4gICAgICAgICAgJmx0O3RkIGNvbHNwYW49JnF1b3Q7MiZxdW90OyBhbGlnbj0mcXVvdDtjZW50ZXImcXVvdDsmZ3Q7Jmx0O2ImZ3Q7UGFnZSBBcmd1bWVudHMmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDs8YnI+ICAgICAgICAmbHQ7L3RyJmd0Ozxicj4gICAgICAgICZsdDt0ciZndDs8YnI+ICAgICAgICAgICZsdDt0ZCZndDtBcmd1bWVudCZsdDsvdGQmZ3Q7PGJyPiAgICAgICAgICAmbHQ7dGQmZ3Q7VmFsdWUmbHQ7L3RkJmd0Ozxicj4gICAgICAgICZsdDsvdHImZ3Q7PGJyPiAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiZsdDslIC8vIEZvciBlYWNoIHBhcmFtZXRlcjxicj4gICAgICAgIGZvciAoaXQgaW4gcmVxdWVzdCkgeyAlJmd0Ozwvc3Bhbj48YnI+ICAgICAgICAmbHQ7dHImZ3Q7PGJyPiAgICAgICAgICAmbHQ7dGQmZ3Q7PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiZsdDslPSBpdC5rZXkgJSZndDs8L3NwYW4+JmFtcDtuYnNwOyZsdDsvdGQmZ3Q7PGJyPiAgICAgICAgICAmbHQ7dGQmZ3Q7PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiZsdDslPSBpdC52YWx1ZSAlJmd0Ozwvc3Bhbj4mYW1wO25ic3A7Jmx0Oy90ZCZndDs8YnI+ICAgICAgICAmbHQ7L3RyJmd0Ozxicj4gICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JSB9ICUmZ3Q7PC9zcGFuPjxicj4gICAgICAmbHQ7L3RhYmxlJmd0Ozxicj4gICAgJmx0Oy90ZCZndDs8YnI+ICAgICZsdDt0ZCB2YWxpZ249JnF1b3Q7dG9wJnF1b3Q7IHdpZHRoPSZxdW90OzUwJSZxdW90OyZndDs8YnI+ICAgICAgJmx0O3RhYmxlIGJvcmRlcj0mcXVvdDsxJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzAmcXVvdDsgY2VsbHNwYWNpbmc9JnF1b3Q7MCZxdW90OyBzdHlsZT0mcXVvdDtib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlJnF1b3Q7DQotICAgICAgICBib3JkZXJjb2xvcj0mcXVvdDsjMTExMTExJnF1b3Q7IHdpZHRoPSZxdW90OzEwMCUmcXVvdDsgaWQ9JnF1b3Q7QXV0b051bWJlcjMmcXVvdDsmZ3Q7PGJyPiAgICAgICAgJmx0O3RyJmd0Ozxicj4gICAgICAgICAgJmx0O3RkIGNvbHNwYW49JnF1b3Q7MiZxdW90OyBhbGlnbj0iY2VudGVyIiZndDsmbHQ7YiZndDtTZXNzaW9uIFZhcmlhYmxlcyZsdDsvYiZndDsmbHQ7L3RkJmd0Ozxicj4gICAgICAgICZsdDsvdHImZ3Q7PGJyPiAgICAgICAgJmx0O3RyJmd0Ozxicj4gICAgICAgICAgJmx0O3RkJmd0O1ZhcmlhYmxlJmx0Oy90ZCZndDs8YnI+ICAgICAgICAgICZsdDt0ZCZndDtWYWx1ZSZsdDsvdGQmZ3Q7PGJyPiAgICAgICAgJmx0Oy90ciZndDs8YnI+ICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+Jmx0OyUgLy8gRm9yIGVhY2ggc2Vzc2lvbiB2YXJpYWJsZTxicj4gICAgICAgIHNlc3Npb24uZWFjaCgpIHsgJSZndDs8L3NwYW4+PGJyPiAgICAgICAgJmx0O3RyJmd0Ozxicj4gICAgICAgICAgJmx0O3RkJmd0OzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JT0gaXQua2V5ICUmZ3Q7PC9zcGFuPiZhbXA7bmJzcDsmbHQ7L3RkJmd0Ozxicj4gICAgICAgICAgJmx0O3RkJmd0OzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JT0gaXQudmFsdWUgJSZndDs8L3NwYW4+JmFtcDtuYnNwOyZsdDsvdGQmZ3Q7PGJyPiAgICAgICAgJmx0Oy90ciZndDs8YnI+ICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+Jmx0OyUgfSAlJmd0Ozwvc3Bhbj48YnI+ICAgICAgJmx0Oy90YWJsZSZndDs8YnI+ICAgICZsdDsvdGQmZ3Q7PGJyPiAgJmx0Oy90ciZndDs8YnI+Jmx0Oy90YWJsZSZndDsNCi08c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+Jmx0OyUgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvbiBlYWNoIHJlZnJlc2g8YnI+c2Vzc2lvbi5jb3VudCsrPGJyPiUmZ3Q7PC9zcGFuPjwvcHJlPg0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9zaW1wbGUuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi9zaW1wbGUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE5NjdjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvc2ltcGxlLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZQotaWYgKHNlc3Npb24uY291bnQgPT0gbnVsbCkgewotCXNlc3Npb24uY291bnQgPSAxCi19Ci1vdXQucHJpbnRsbig8PDxFT1MKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+R3Jvb3ZsZXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMiBhbGlnbj0iY2VudGVyIj5Hcm9vdmVsZXQgRXhhbXBsZTwvaDI+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiB3aWR0aD0iMTAwJSIgaWQ9IkF1dG9OdW1iZXI0Ij4KLSAgPHRyPgotICAgIDx0ZD4KLQk8aT5MaW5rczo8L2k+PC90ZD4KLSAgICA8dGQ+Ci0JPGk+Ci0JPGEgaHJlZj0iZGVmYXVsdC5odG0iPkV4YW1wbGVzIEhvbWU8L2E+PC9pPjwvdGQ+Ci0gICAgPHRkPgotCTxpPiA8YSBocmVmPSJzaW1wbGUuZ3NwIj5TaW1wbGUgRXhhbXBsZTwvYT48L2k+PC90ZD4KLSAgICA8dGQ+Ci0JPGk+Ci0gICAgPGEgaHJlZj0idmlzaWJsZS5nc3A/YXJnPVRoaXMraXMrYSt0ZXN0K2FyZ3VtZW50Jmxhc3RDb3VudD0ke3Nlc3Npb24uY291bnR9Ij4KLSAgICBWaXNpYmxlIFN5bnRheDwvYT48L2k+PC90ZD4KLSAgICA8dGQ+Ci0JPGk+Ci0gICAgPGEgaHJlZj0ianNwLmdzcD9hcmc9VGhpcytpcythK3Rlc3QrYXJndW1lbnQmbGFzdENvdW50PSR7c2Vzc2lvbi5jb3VudH0iPgotICAgIEpTUCBTeW50YXg8L2E+PC9pPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBhIEdyb292bGV0IHVzaW5nIEdyb292eVNlcnZsZXQuJm5ic3A7IFRoaXMgcGFnZQotZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgR3Jvb3Z5UGFnZXMgPGEgaHJlZj0ic2ltcGxlLmdzcCI+U2ltcGxlIEV4YW1wbGU8L2E+LiZuYnNwOwotRnJvbSB0aGUgc291cmNlIGNvZGUgYmVsb3csIHlvdSBjYW4gc2VlIHRoYXQgaXQgZG9lc24ndCB0YWtlIG11Y2ggdG8gd3JpdGUgYSBzaW1wbGUgc2VydmxldCB3aXRoCi1Hcm9vdnkuICBCdXQgZm9yIG1vcmUgY29tcGxleCBzZXJ2bGV0cywgR3Jvb3Z5UGFnZXMgY2FuIGJlIGEgZ3JlYXQgYmVuZWZpdCBiZWNhdXNlIGl0IGlzIGVtYmVkZGVkCi1pbiB5b3VyIEhUTUwsIGxpa2UgSlNQLjwvcD4KLTxwPkhlbGxvLCAke3JlcXVlc3QucmVtb3RlSG9zdH06ICR7c2Vzc2lvbi5jb3VudH0hICR7bmV3IERhdGUoKX08L3A+Ci08aDM+VGhlIFNvdXJjZSBDb2RlPC9oMz4KLTxwcmU+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPmltcG9ydCBqYXZhLnV0aWwuRGF0ZQotaWYgKHNlc3Npb24uY291bnQgPT0gbnVsbCkgewotCXNlc3Npb24uY291bnQgPSAxCi19Ci1vdXQucHJpbnRsbig8PDwmIzY5O09TPC9zcGFuPgotJmx0O2h0bWw+Ci0mbHQ7aGVhZD4KLSZsdDt0aXRsZT5Hcm9vdmxldCBFeGFtcGxlJmx0Oy90aXRsZT4KLSZsdDsvaGVhZD4KLSZsdDtib2R5PgotJmx0O3A+SGVsbG8sIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4kJiMxMjM7cmVxdWVzdC5yZW1vdGVIb3N0fTwvc3Bhbj46IDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4kJiMxMjM7c2Vzc2lvbi5jb3VudH08L3NwYW4+ISA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+JCYjMTIzO25ldyBEYXRlKCl9PC9zcGFuPiZsdDsvcD4KLSZsdDsvYm9keT4KLSZsdDsvaHRtbD4KLTxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mIzY5O09TKQotc2Vzc2lvbi5jb3VudCA9IHNlc3Npb24uY291bnQgKyAxPC9zcGFuPgotPC9wcmU+Ci08L2JvZHk+Ci08L2h0bWw+Ci1FT1MpCi1zZXNzaW9uLmNvdW50ID0gc2Vzc2lvbi5jb3VudCArIDEKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvc2ltcGxlLmdzcCBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvc2ltcGxlLmdzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3YWYxZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvd2ViL3NpbXBsZS5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+U2ltcGxlIEdyb292eVBhZ2VzIEV4YW1wbGU8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDIgYWxpZ249ImNlbnRlciI+U2ltcGxlIEV4YW1wbGU8L2gyPg0KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjQiPg0KLSAgPHRyPg0KLSAgICA8dGQ+DQotCTxpPkxpbmtzOjwvaT48L3RkPg0KLSAgICA8dGQ+DQotCTxpPg0KLQk8YSBocmVmPSJkZWZhdWx0Lmh0bSI+RXhhbXBsZXMgSG9tZTwvYT48L2k+PC90ZD4NCi0gICAgPHRkPg0KLQk8aT4gPGEgaHJlZj0ic2ltcGxlLmdzcCI+U2ltcGxlIEV4YW1wbGU8L2E+PC9pPjwvdGQ+DQotICAgIDx0ZD4NCi0JPGk+DQotICAgIDxhIGhyZWY9InZpc2libGUuZ3NwP2FyZz1UaGlzK2lzK2ErdGVzdCthcmd1bWVudCZsYXN0Q291bnQ9JHtzZXNzaW9uLmNvdW50fSI+DQotICAgIFZpc2libGUgU3ludGF4PC9hPjwvaT48L3RkPg0KLSAgICA8dGQ+DQotCTxpPg0KLSAgICA8YSBocmVmPSJqc3AuZ3NwP2FyZz1UaGlzK2lzK2ErdGVzdCthcmd1bWVudCZsYXN0Q291bnQ9PCU9c2Vzc2lvbi5jb3VudCU+Ij4NCi0gICAgSlNQIFN5bnRheDwvYT48L2k+PC90ZD4NCi0gIDwvdHI+DQotPC90YWJsZT4NCi08cD4mbmJzcDsmbmJzcDsmbmJzcDsgVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIEdyb292eVBhZ2VzLiZuYnNwOyBUaGlzIHBhZ2UgDQotZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgPGEgaHJlZj0ic2ltcGxlLmdyb292eSI+R3Jvb3ZsZXQgRXhhbXBsZTwvYT4uJm5ic3A7IA0KLUZyb20gdGhlIHNvdXJjZSBjb2RlIGJlbG93LCB5b3UgY2FuIHNlZSB0aGF0IEdyb292eVBhZ2VzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gSlNQLCANCi1leGNlcHQgbXVjaCBlYXNpZXIgdG8gdXNlIGJlY2F1c2UgR3Jvb3Z5IGlzIHVuZGVybmVhdGguPC9wPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkRhdGUiICU+DQotDQotPCUgaWYgKHNlc3Npb24uY291bnQgPT0gbnVsbCkgc2Vzc2lvbi5jb3VudCA9IDEgJT4NCi08cD5IZWxsbywgJHtyZXF1ZXN0LnJlbW90ZUhvc3R9OiAke3Nlc3Npb24uY291bnR9ISAke25ldyBEYXRlKCl9PC9wPg0KLTwlIHNlc3Npb24uY291bnQrKyAlPg0KLTxoMz5UaGUgU291cmNlIENvZGU8L2gzPg0KLTxwcmU+Jmx0O2h0bWw+DQotJmx0O2hlYWQ+DQotJmx0O3RpdGxlPlNpbXBsZSBFeGFtcGxlJmx0Oy90aXRsZT4NCi0mbHQ7L2hlYWQ+DQotJmx0O2JvZHk+DQotPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiZsdDslQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkRhdGUiICUmZ3Q7PC9zcGFuPg0KLQ0KLTxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JSBpZiBzZXNzaW9uLmNvdW50ID09IG51bGwNCi1zZXNzaW9uLmNvdW50ID0gMSAlJmd0Ozwvc3Bhbj4NCi0mbHQ7cCZndDtIZWxsbywgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiQmIzEyMztyZXF1ZXN0LnJlbW90ZUhvc3R9PC9zcGFuPjogPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiQmIzEyMztzZXNzaW9uLmNvdW50fTwvc3Bhbj4hIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4kJiMxMjM7bmV3IERhdGUoKX08L3NwYW4+Jmx0Oy9wJmd0Ow0KLTxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4mbHQ7JSBzZXNzaW9uLmNvdW50KysgJSZndDs8L3NwYW4+DQotJmx0Oy9ib2R5Pg0KLSZsdDsvaHRtbD48L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvc3FsLmdzcCBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvc3FsLmdzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2Yjc4Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wYWdlcy9zcmMvd2ViL3NxbC5nc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08aHRtbD4NCi0gPGhlYWQ+DQotIDx0aXRsZT5UZXN0IERhdGFiYXNlIEFjY2VzczwvdGl0bGU+DQotIDwvaGVhZD4NCi0gPGJvZHk+DQotIDxwPl5wQHtwYWdlIGltcG9ydD0mcXVvdDtncm9vdnkuc3FsLlNxbCwgdGVzdC5ncm9vdnkuc3FsLlRlc3RIZWxwZXImcXVvdDt9PC9wPg0KLSA8cD5ecCV7c3FsID0gVGVzdEhlbHBlci5tYWtlU3FsKCk8YnI+DQotIHR5cGUgPSAnY2hlZXNlJzxicj4NCi0gc3FsLnF1ZXJ5RWFjaCgmcXVvdDtzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZSA9ICR7dHlwZX0mcXVvdDspIA0KLSB7IH0lPC9wPg0KLSA8cD5Gb3VuZCBjaGVlc2UgJHtpdC5uYW1lfTwvcD4NCi0gPHA+XnAleyB9IH0lPC9wPg0KLSA8L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvdGVzdDEuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi90ZXN0MS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmNlMDUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi90ZXN0MS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1odG1sID0gPDw8RU9TCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkdyb292bGV0IEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5IZWxsbzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLUVPUwotb3V0LnByaW50bG4oaHRtbCkKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvdGVzdDIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi90ZXN0Mi5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWFjYjcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi90ZXN0Mi5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1vdXQucHJpbnRsbig8PDxFT1MKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+R3Jvb3ZsZXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPkhlbGxvPC9wPgotPC9ib2R5PgotPC9odG1sPgotRU9TKQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi92aXNpYmxlLmdzcCBiL2dyb292eS9tb2R1bGVzL3BhZ2VzL3NyYy93ZWIvdmlzaWJsZS5nc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDk2YzMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcGFnZXMvc3JjL3dlYi92aXNpYmxlLmdzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+R3Jvb3Z5UGFnZXMgVGVzdDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMiBhbGlnbj0iY2VudGVyIj5WaXNpYmxlIFN5bnRheDwvaDI+DQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjIiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyNCI+DQotICA8dHI+DQotICAgIDx0ZD4NCi0JPGk+TGlua3M6PC9pPjwvdGQ+DQotICAgIDx0ZD4NCi0JPGk+DQotCTxhIGhyZWY9ImRlZmF1bHQuaHRtIj5FeGFtcGxlcyBIb21lPC9hPjwvaT48L3RkPg0KLSAgICA8dGQ+DQotCTxpPiA8YSBocmVmPSJzaW1wbGUuZ3NwIj5TaW1wbGUgRXhhbXBsZTwvYT48L2k+PC90ZD4NCi0gICAgPHRkPg0KLQk8aT4NCi0gICAgPGEgaHJlZj0idmlzaWJsZS5nc3A/YXJnPVRoaXMraXMrYSt0ZXN0K2FyZ3VtZW50Jmxhc3RDb3VudD0ke3Nlc3Npb24uY291bnR9Ij4NCi0gICAgVmlzaWJsZSBTeW50YXg8L2E+PC9pPjwvdGQ+DQotICAgIDx0ZD4NCi0JPGk+DQotICAgIDxhIGhyZWY9ImpzcC5nc3A/YXJnPVRoaXMraXMrYSt0ZXN0K2FyZ3VtZW50Jmxhc3RDb3VudD08JT1zZXNzaW9uLmNvdW50JT4iPg0KLSAgICBKU1AgU3ludGF4PC9hPjwvaT48L3RkPg0KLSAgPC90cj4NCi08L3RhYmxlPg0KLTxwPiZuYnNwOyZuYnNwOyZuYnNwOyBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgR3Jvb3Z5UGFnZXMgc2hvd2luZyB0aGUgdXNlIG9mIHRoZSBlZGl0b3IgDQotdmlzaWJsZSBzeW50YXguJm5ic3A7IFRoaXMgc3ludGF4IHVzZXMgY3VybHkgYnJhY2VzIGxpa2UgJSYjMTIzOyBncm9vdmxldCB9JSBhbmQgJCYjMTIzOyANCi1leHByZXNzaW9uIH0sIGluc3RlYWQgb2YgdGhlIGxlc3MtdGhhbiBncmVhdGVyLXRoYW4gb2YgSlNQLCBsaWtlICZsdDslIGdyb292bGV0ICUmZ3Q7IA0KLWFuZCAmbHQ7JT0gZXhwcmVzc2lvbiAlJmd0Oy4mbmJzcDsgVGhvdWdoIGJvdGggc3ludGF4ZXMgYXJlIHN1cHBvcnRlZCBpbiBHcm9vdnlQYWdlcywgDQotdXNpbmcgdmlzaWJsZSBzeW50YXggaXMgc29tZXRpbWVzIHByZWZlcmFibGUgd2hlbiB0aGUgcHJvZ3JhbW1lciBpcyBhbHNvIHRoZSANCi1wYWdlIGRlc2lnbmVyIG9yIHdoZW4gdGhleSB3YW50IHRvIHNlZSBhbmQgZWRpdCB0aGVpciBpbiB0aGUgd2ViIGVkaXRvcidzIA0KLWZvcm1hdHRlZCwgbm9ybWFsIHZpZXcsIHJhdGhlciB0aGFuIGluIHJhdywgbm9pc3kgSFRNTCBhbGwgb2YgdGhlIHRpbWUuJm5ic3A7IA0KLUl0J3MgcGVyZmVjdGx5IGFjY2VwdGFibGUgdG8gbWl4IGJvdGggc3ludGF4ZXMgb24gdGhlIHNhbWUgcGFnZS48L3A+DQotPHA+PGk+PGI+TWFrZSBzdXJlIGNvdW50IGlzIHNldCBhbmQgaW5jcmVtZW50IGl0IG9uIGVhY2ggcmVmcmVzaDwvYj48L2k+PGJyPg0KLV5wJXs8YnI+DQotaWYgKHNlc3Npb24uY291bnQgPT0gbnVsbCkgc2Vzc2lvbi5jb3VudCA9IDE8YnI+DQotfSU8L3A+DQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjEiPg0KLSAgPHRyPg0KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMiI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPjxiPlBhZ2UgQXJndW1lbnRzPC9iPjwvdGQ+DQotICAgICAgPC90cj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+QXJndW1lbnQ8L3RkPg0KLSAgICAgICAgPHRkPlZhbHVlPC90ZD4NCi0gICAgICA8L3RyPg0KLSAgICAgIDx0cj4NCi0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aT48Yj5Gb3IgZWFjaCBwYXJhbWV0ZXI8L2I+PC9pPjxicj4NCi1edHIleyBmb3IgKGl0IGluIHJlcXVlc3QpIHsgfSU8L3RkPg0KLSAgICAgIDwvdHI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkPiR7IGl0LmtleSB9PC90ZD4NCi0gICAgICAgIDx0ZD4keyBpdC52YWx1ZSB9PC90ZD4NCi0gICAgICA8L3RyPg0KLSAgICAgIDx0cj4NCi0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj5edHIleyB9IH0lIDxpPjxiPkNvbW1lbnRzIGFyZSBzYWZlIGJlZm9yZSBhbmQgYWZ0ZXIgDQotICAgICAgICBzdHJpcHBpbmcgdGFnczwvYj48L2k+PC90ZD4NCi0gICAgICA8L3RyPg0KLSAgICA8L3RhYmxlPg0KLSAgICA8L3RkPg0KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMyI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPjxiPlNlc3Npb24gVmFyaWFibGVzPC9iPjwvdGQ+DQotICAgICAgPC90cj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+VmFyaWFibGU8L3RkPg0KLSAgICAgICAgPHRkPlZhbHVlPC90ZD4NCi0gICAgICA8L3RyPg0KLSAgICAgIDx0cj4NCi0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aT48Yj5Gb3IgZWFjaCBzZXNzaW9uIHZhcmlhYmxlPC9iPjwvaT48YnI+DQotXnRyJXsgc2Vzc2lvbi5lYWNoKCkgeyB9JTwvdGQ+DQotICAgICAgPC90cj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQ+JHsgaXQua2V5IH08L3RkPg0KLSAgICAgICAgPHRkPiR7IGl0LnZhbHVlIH08L3RkPg0KLSAgICAgIDwvdHI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPl50ciV7IH0gfSUgPGk+PGI+YmVjYXVzZSB0aGV5IHdpbGwgZ2V0IA0KLSAgICAgICAgc3RyaXBwZWQgb2ZmPC9iPjwvaT48L3RkPg0KLSAgICAgIDwvdHI+DQotICAgIDwvdGFibGU+DQotICAgIDwvdGQ+DQotICA8L3RyPg0KLTwvdGFibGU+DQotPHA+PGk+PGI+SW5jcmVtZW50IHRoZSBjb3VudCBvbiBlYWNoIHJlZnJlc2g8L2I+PC9pPjxicj4NCi1ecCV7DQotc2Vzc2lvbi5jb3VudCsrDQotfSU8L3A+DQotPGgzPlRoZSBTb3VyY2UgQ29kZTwvaDM+DQotPHA+Jm5ic3A7Jm5ic3A7IFlvdSB3aWxsIG5vdGUgdGhhdCB0aGUgc291cmNlIGNvZGUgYmVsb3cgYXBwZWFycyBtb3JlIG5vaXN5IHdoZW4gDQotY29tcGFyZWQgd2l0aCBKU1Agc3ludGF4LiZuYnNwOyBJdCBpcyB3aGVuIHlvdSBsb29rIGF0IHRoZSByYXcgSFRNTC4mbmJzcDsgQnV0IA0KLXdlYiBlZGl0b3JzIGhlbHAgeW91IHRvIHN0YXkgb3V0IG9mIEhUTUwgbW9kZSwgYW5kIHdoZW4geW91IGVkaXQgeW91ciBwYWdlIHRoYXQgDQotd2F5IG1vc3Qgb2YgdGhlIG5vaXNlIGdvZXMgYXdheS48L3A+DQotPHByZT4mbHQ7cCZndDsmbHQ7aSZndDsmbHQ7YiZndDtNYWtlIHN1cmUgY291bnQgaXMgc2V0Jmx0Oy9iJmd0OyZsdDsvaSZndDsmbHQ7YnImZ3Q7DQotPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPl5wJSYjMTIzOyZsdDticiZndDsNCi1pZiAoc2Vzc2lvbi5jb3VudCA9PSBudWxsKSBzZXNzaW9uLmNvdW50ID0gMSZsdDticiZndDsNCi19JTwvc3Bhbj4mbHQ7L3AmZ3Q7DQotJmx0O3RhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjEiJmd0Ow0KLSAgJmx0O3RyJmd0Ow0KLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiJmd0Ow0KLSAgICAmbHQ7dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMiImZ3Q7DQotICAgICAgJmx0O3RyJmd0Ow0KLSAgICAgICAgJmx0O3RkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiJmd0OyZsdDtiJmd0O1BhZ2UgQXJndW1lbnRzJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7DQotICAgICAgJmx0Oy90ciZndDsNCi0gICAgICAmbHQ7dHImZ3Q7DQotICAgICAgICAmbHQ7dGQmZ3Q7QXJndW1lbnQmbHQ7L3RkJmd0Ow0KLSAgICAgICAgJmx0O3RkJmd0O1ZhbHVlJmx0Oy90ZCZndDsNCi0gICAgICAmbHQ7L3RyJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCBjb2xzcGFuPSIyIiZndDs8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+Jmx0O2kmZ3Q7Jmx0O2ImZ3Q7Rm9yIGVhY2ggcGFyYW1ldGVyJmx0Oy9iJmd0OyZsdDsvaSZndDsmbHQ7YnImZ3Q7DQotICAgICAgICAgIF50ciUmIzEyMzsgZm9yIChpdCBpbiByZXF1ZXN0KSAmIzEyMzsgfSU8L3NwYW4+Jmx0Oy90ZCZndDsNCi0gICAgICAmbHQ7L3RyJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCZndDs8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+JCYjMTIzOyBpdC5rZXkgfTwvc3Bhbj4mbHQ7L3RkJmd0Ow0KLSAgICAgICAgJmx0O3RkJmd0OzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4kJiMxMjM7IGl0LnZhbHVlIH08L3NwYW4+Jmx0Oy90ZCZndDsNCi0gICAgICAmbHQ7L3RyJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCBjb2xzcGFuPSIyIiZndDs8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+XnRyJSYjMTIzOyB9IH0lICZsdDtpJmd0OyZsdDtiJmd0O0NvbW1lbnRzIGFyZSBzYWZlIGJlZm9yZSBhbmQgYWZ0ZXIgDQotICAgICAgICBzdHJpcHBpbmcgdGFncyZsdDsvYiZndDsmbHQ7L2kmZ3Q7PC9zcGFuPiZsdDsvdGQmZ3Q7DQotICAgICAgJmx0Oy90ciZndDsNCi0gICAgJmx0Oy90YWJsZSZndDsNCi0gICAgJmx0Oy90ZCZndDsNCi0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiZndDsNCi0gICAgJmx0O3RhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjMiJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIiZndDsmbHQ7YiZndDtTZXNzaW9uIFZhcmlhYmxlcyZsdDsvYiZndDsmbHQ7L3RkJmd0Ow0KLSAgICAgICZsdDsvdHImZ3Q7DQotICAgICAgJmx0O3RyJmd0Ow0KLSAgICAgICAgJmx0O3RkJmd0O1ZhcmlhYmxlJmx0Oy90ZCZndDsNCi0gICAgICAgICZsdDt0ZCZndDtWYWx1ZSZsdDsvdGQmZ3Q7DQotICAgICAgJmx0Oy90ciZndDsNCi0gICAgICAmbHQ7dHImZ3Q7DQotICAgICAgICAmbHQ7dGQgY29sc3Bhbj0iMiImZ3Q7PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM5OUZGOTkiPiZsdDtpJmd0OyZsdDtiJmd0O0ZvciBlYWNoIHNlc3Npb24gdmFyaWFibGUmbHQ7L2ImZ3Q7Jmx0Oy9pJmd0OyZsdDticiZndDsNCi0gICAgICAgICAgXnRyJSYjMTIzOyBzZXNzaW9uLmVhY2goKSAmIzEyMzsgfSU8L3NwYW4+Jmx0Oy90ZCZndDsNCi0gICAgICAmbHQ7L3RyJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCZndDs8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+JCYjMTIzOyBpdC5rZXkgfTwvc3Bhbj4mbHQ7L3RkJmd0Ow0KLSAgICAgICAgJmx0O3RkJmd0OzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij4kJiMxMjM7IGl0LnZhbHVlIH08L3NwYW4+Jmx0Oy90ZCZndDsNCi0gICAgICAmbHQ7L3RyJmd0Ow0KLSAgICAgICZsdDt0ciZndDsNCi0gICAgICAgICZsdDt0ZCBjb2xzcGFuPSIyIiZndDs8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzk5RkY5OSI+XnRyJSYjMTIzOyB9IH0lICZsdDtpJmd0OyZsdDtiJmd0O2JlY2F1c2UgdGhleSB3aWxsIGdldCANCi0gICAgICAgIHN0cmlwcGVkIG9mZiZsdDsvYiZndDsmbHQ7L2kmZ3Q7PC9zcGFuPiZsdDsvdGQmZ3Q7DQotICAgICAgJmx0Oy90ciZndDsNCi0gICAgJmx0Oy90YWJsZSZndDsNCi0gICAgJmx0Oy90ZCZndDsNCi0gICZsdDsvdHImZ3Q7DQotJmx0Oy90YWJsZSZndDsNCi0mbHQ7cCZndDsmbHQ7aSZndDsmbHQ7YiZndDtJbmNyZW1lbnQgdGhlIGNvdW50IG9uIGVhY2ggcmVmcmVzaCZsdDsvYiZndDsmbHQ7L2kmZ3Q7Jmx0O2JyJmd0Ow0KLTxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjOTlGRjk5Ij5ecCUmIzEyMzsgc2Vzc2lvbi5jb3VudCsrIH0lPC9zcGFuPiZsdDsvcCZndDsNCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3MvLmNsYXNzcGF0aCBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZTU5OS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvY29uY3VycmVudC5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvaG9tZS95dXJpL2xvY2FsL2dyb292eS9saWIvYXNtLTEuNC4xLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9ob21lL3l1cmkvbG9jYWwvZ3Jvb3Z5L2xpYi9hc20tYXR0cnMtMS40LjEuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL2hvbWUveXVyaS9sb2NhbC9ncm9vdnkvbGliL2FzbS11dGlsLTEuNC4xLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii9ob21lL3l1cmkvbG9jYWwvZ3Jvb3Z5L2xpYi9ncm9vdnktMS4wLWJldGEtMy1zbmFwc2hvdC5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvaG9tZS95dXJpL2xvY2FsL2dyb292eS9saWIvanVuaXQtMy44LjEuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYnVpbGQvY2xhc3NlcyIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzLy5wcm9qZWN0IGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4NDdjNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Z3Jvb3NoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3MvbGliL2NvbmN1cnJlbnQuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9saWIvY29uY3VycmVudC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODcyYmYuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9saWIvY29uY3VycmVudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9jb25mL2dyb292eS1jbGFzc3dvcmxkcy5jb25mIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvY29uZi9ncm9vdnktY2xhc3N3b3JsZHMuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjNTkzNC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9jb25mL2dyb292eS1jbGFzc3dvcmxkcy5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKLSMjICBHcm9vdnkgU2hlbGwgQ2xhc3N3b3JsZHMgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIwotIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMKLSMjICRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDMvMTAvMzEgMTI6MzA6NTcgJAotIyMKLQotIyBUaGUgbWFpbiBlbnRyeS1wb2ludAotbWFpbiBpcyBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbCBmcm9tIGdyb292eQotCi0jIFRoZSBjb3JlIEdyb292eSBjbGFzcy1yZWFsbQotW2dyb292eV0KLSAgICAjIEFsbG93IGFjY2VzcyB0byByZXNvdXJjZXMKLSAgICBsb2FkICR7Z3Jvb3Z5LmhvbWV9L2NvbmYKLSAgICAKLSAgICAjIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCi0gICAgbG9hZCAke2dyb292eS5ob21lfS9saWIvKi5qYXIKLSAgICBsb2FkIC9ob21lL3l1cmkvd29ya3NwYWNlL2dyb29zaC9saWIvKi5qYXIKLSAgICBsb2FkIC9ob21lL3l1cmkvd29ya3NwYWNlL2dyb29zaC9idWlsZC9jbGFzc2VzLwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvY29uZi9ncm9vdnljLWNsYXNzd29ybGRzLmNvbmYgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9jb25mL2dyb292eWMtY2xhc3N3b3JsZHMuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYmM2OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9jb25mL2dyb292eWMtY2xhc3N3b3JsZHMuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCi0jIyAgR3Jvb3Z5IENvbXBpbGVyIENsYXNzd29ybGRzIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjCi0jIyAkUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDAzLzEwLzA2IDIwOjQyOjU1ICQKLSMjCi0KLSMgVGhlIG1haW4gZW50cnktcG9pbnQKLW1haW4gaXMgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5GaWxlU3lzdGVtQ29tcGlsZXIgZnJvbSBncm9vdnkKLQotIyBUaGUgY29yZSBHcm9vdnkgY2xhc3MtcmVhbG0KLVtncm9vdnldCi0gICAgIyBBbGxvdyBhY2Nlc3MgdG8gcmVzb3VyY2VzCi0gICAgbG9hZCAke2dyb292eS5ob21lfS9jb25mCi0gICAgCi0gICAgIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwotICAgIGxvYWQgJHtncm9vdnkuaG9tZX0vbGliLyouamFyCi0gICAgbG9hZCAvaG9tZS95dXJpL3dvcmtzcGFjZS9ncm9vc2gvbGliLyouamFyCi0gICAgbG9hZCAvaG9tZS95dXJpL3dvcmtzcGFjZS9ncm9vc2gvYnVpbGQvY2xhc3Nlcy8KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL2luY2x1ZGUvbmF0aXZlcHJvY2Vzcy5oIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvaW5jbHVkZS9uYXRpdmVwcm9jZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2RiMzAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvaW5jbHVkZS9uYXRpdmVwcm9jZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBpdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCAqLwotI2luY2x1ZGUgPGpuaS5oPgotLyogSGVhZGVyIGZvciBjbGFzcyBjb21fYmF1bHN1cHBfcHJvY2Vzc19OYXRpdmVQcm9jZXNzICovCi0KLSNpZm5kZWYgX0luY2x1ZGVkX2NvbV9iYXVsc3VwcF9wcm9jZXNzX05hdGl2ZVByb2Nlc3MKLSNkZWZpbmUgX0luY2x1ZGVkX2NvbV9iYXVsc3VwcF9wcm9jZXNzX05hdGl2ZVByb2Nlc3MKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGluaXRpYWxpc2VkICovCi0vKgotICogQ2xhc3M6ICAgICBjb21fYmF1bHN1cHBfcHJvY2Vzc19OYXRpdmVQcm9jZXNzCi0gKiBNZXRob2Q6ICAgIHN0YXJ0UHJvY2VzcwotICogU2lnbmF0dXJlOiAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nO0lJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fYmF1bHN1cHBfcHJvY2Vzc19OYXRpdmVQcm9jZXNzX3N0YXJ0UHJvY2VzcwotICAoSk5JRW52ICosIGpvYmplY3QsIGpzdHJpbmcsIGpvYmplY3RBcnJheSwgamludCwgamludCwgamludCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvR3JpZENsb3N1cmVQcm9jZXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL0dyaWRDbG9zdXJlUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzc4YTg4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvR3JpZENsb3N1cmVQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5ncm9vdnkuZ3Jvb3NoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLXB1YmxpYyBjbGFzcyBHcmlkQ2xvc3VyZVByb2Nlc3MgZXh0ZW5kcyBTdHJlYW1DbG9zdXJlUHJvY2VzcyB7Ci0gIHB1YmxpYyBHcmlkQ2xvc3VyZVByb2Nlc3MoQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgc3VwZXIoY2xvc3VyZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKGZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQnVmZmVyZWRSZWFkZXIgcmlzID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgIFdyaXRlciB3b3MgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcywgIklTTy04ODU5LTEiKSk7Ci0gICAgCi0gICAgU3RyaW5nIGxpbmU7Ci0gICAgCi0gICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHdoaWxlICgobGluZSA9IHJpcy5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICBTdHJpbmdbXSBjb250ZW50ID0gbGluZS5zcGxpdCgiXFxzKyIpOwotICAgICAgTGlzdCBjb250ZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoY29udGVudCk7Ci0gICAgICAKLSAgICAgIGwuY2xlYXIoKTsKLSAgICAgIGwuYWRkKGNvbnRlbnRMaXN0KTsKLSAgICAgIGwuYWRkKHdvcyk7Ci0gICAgICBjbG9zdXJlLmNhbGwobCk7Ci0gICAgICB3b3MuZmx1c2goKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvR3Jvb3NoLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL0dyb29zaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWYwYzAyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvR3Jvb3NoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5ncm9vdnkuZ3Jvb3NoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLWltcG9ydCBFRFUub3N3ZWdvLmNzLmRsLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLWltcG9ydCBFRFUub3N3ZWdvLmNzLmRsLnV0aWwuY29uY3VycmVudC5UaHJlYWRlZEV4ZWN1dG9yOwotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKLQotcHVibGljIGNsYXNzIEdyb29zaCBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgewotICBwcml2YXRlIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IFRocmVhZGVkRXhlY3V0b3IoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgTWFwIHJlZ2lzdGVyZWRQcm9jZXNzZXMgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgc3RhdGljIHsKLSAgICByZWdpc3RlclByb2Nlc3MoImdyb292eSIsIFN0cmVhbUNsb3N1cmVQcm9jZXNzLmNsYXNzKTsKLSAgICByZWdpc3RlclByb2Nlc3MoImVhY2hfbGluZSIsIExpbmVDbG9zdXJlUHJvY2Vzcy5jbGFzcyk7Ci0gICAgcmVnaXN0ZXJQcm9jZXNzKCJncmlkIiwgR3JpZENsb3N1cmVQcm9jZXNzLmNsYXNzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclByb2Nlc3MoU3RyaW5nIG5hbWUsIENsYXNzIGNsYXp6KSB7Ci0gICAgcmVnaXN0ZXJlZFByb2Nlc3Nlcy5wdXQobmFtZSwgY2xhenopOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7IAotICAgIEdyb29zaFByb2Nlc3MgcHJvY2VzczsKLSAgICB0cnkgewotICAgICAgaWYgKHJlZ2lzdGVyZWRQcm9jZXNzZXMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgcHJvY2VzcyA9IGNyZWF0ZVByb2Nlc3MoKENsYXNzKSByZWdpc3RlcmVkUHJvY2Vzc2VzLmdldChuYW1lKSwgYXJncyk7ICAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByb2Nlc3MgPSBuZXcgU2hlbGxQcm9jZXNzKG5hbWUsIGFyZ3MpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcHJvY2VzczsKLSAgfQotCi0gIHByaXZhdGUgR3Jvb3NoUHJvY2VzcyBjcmVhdGVQcm9jZXNzKENsYXNzIGNsYXNzMSwgT2JqZWN0IGFyZykgewotICAgIEdyb29zaFByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIENvbnN0cnVjdG9yIGMgPSBjbGFzczEuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0Nsb3N1cmUuY2xhc3N9KTsKLSAgICAgIHByb2Nlc3MgPSAoR3Jvb3NoUHJvY2VzcykgYy5uZXdJbnN0YW5jZSgoT2JqZWN0W10pIGFyZyk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcHJvY2VzczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcikgewotICAgIHRyeSB7Ci0gICAgICBleGVjdXRvci5leGVjdXRlKHIpOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvZ3Jvb3Z5L2dyb29zaC9Hcm9vc2hQcm9jZXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL0dyb29zaFByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMzIyOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL0dyb29zaFByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLXBhY2thZ2UgY29tLmJhdWxzdXBwLmdyb292eS5ncm9vc2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLkZpbGVTdHJlYW1zOwotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLlNpbms7Ci1pbXBvcnQgY29tLmJhdWxzdXBwLnByb2Nlc3MuU291cmNlOwotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLlN0YW5kYXJkU3RyZWFtczsKLWltcG9ydCBjb20uYmF1bHN1cHAucHJvY2Vzcy5TdHJpbmdTdHJlYW1zOwotCi0vLyBUT0RPIGNsYXNzIHNob3VsZCBub3QgYmUgcmVlbnRyYW50IAotLy8gdGhhdCBpcyBpZiBvdXRwdXQgaXMgYWxyZWFkeSBzZXQsIGRvbid0IGxldCBpdCBiZSBkb25lIHR3aWNlLgotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyb29zaFByb2Nlc3MgeyAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTaW5rIGdldFNpbmsoKTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTb3VyY2UgZ2V0U291cmNlKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nT3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTdHJpbmdTdHJlYW1zLlN0cmluZ1Npbmsgc2luayA9IFN0cmluZ1N0cmVhbXMuc3RyaW5nU2luaygpOwotCi0gICAgZ2V0U291cmNlKCkuY29ubmVjdChzaW5rKTsKLSAgICBzdGFydCgpOwotICAgIAotICAgIHJldHVybiBzaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBUT0RPIHNob3VsZCB0aGlzIGJlIGFzeW5jaHJvbm91cywgd291bGQgYmUgbGVzcyBvYnZpb3VzIHRob3VnaCEKLSAgcHVibGljIHZvaWQgdG9GaWxlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTaW5rIHNpbmsgPSBGaWxlU3RyZWFtcy5zaW5rKGYsIGZhbHNlKTsKLSAgCi0gICAgZ2V0U291cmNlKCkuY29ubmVjdChzaW5rKTsKLSAgICBzdGFydCgpOwotICAgIAotICAgIHdhaXRGb3JFeGl0KCk7Ci0gIH0KLSAgCi0gIC8vIG5lZWRzIHRvIGJlIGFzeW5jaHJvbm91cyBzbyB0aGV5IGNhbiBjb250aW51ZSB0aGUgY2hhaW4KLSAgcHVibGljIEdyb29zaFByb2Nlc3MgcGlwZVRvKEdyb29zaFByb2Nlc3MgcHJvY2VzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBnZXRTb3VyY2UoKS5jb25uZWN0KHByb2Nlc3MuZ2V0U2luaygpKTsKLSAgICAKLSAgICBzdGFydCgpOwotICAgIAotICAgIC8vIHJldHVybiBvdGhlciBwcm9jZXNzIHNvIGNoYWluaW5nIGlzIHBvc3NpYmxlCi0gICAgcmV0dXJuIHByb2Nlc3M7Ci0gIH0KLQotICAvLyBUT0RPIHNob3VsZCB0aGlzIGJlIGFzeW5jaHJvbm91cywgd291bGQgYmUgbGVzcyBvYnZpb3VzIHRob3VnaCEKLSAgcHVibGljIHZvaWQgdG9TdGRPdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFNpbmsgc2luayA9IFN0YW5kYXJkU3RyZWFtcy5zdGRvdXQoKTsKLSAgCi0gICAgZ2V0U291cmNlKCkuY29ubmVjdChzaW5rKTsKLSAgICBzdGFydCgpOwotICAgIAotICAgIHdhaXRGb3JFeGl0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcm9vc2hQcm9jZXNzIGZyb21TdGRJbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgU291cmNlIHNvdXJjZSA9IFN0YW5kYXJkU3RyZWFtcy5zdGRpbigpOwotICAgIAotICAgIHNvdXJjZS5jb25uZWN0KGdldFNpbmsoKSk7ICAKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIEdyb29zaFByb2Nlc3MgZnJvbVN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTb3VyY2Ugc291cmNlID0gU3RyaW5nU3RyZWFtcy5zdHJpbmdTb3VyY2Uocyk7Ci0gICAgCi0gICAgc291cmNlLmNvbm5lY3QoZ2V0U2luaygpKTsgIAotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdhaXRGb3JFeGl0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvZ3Jvb3Z5L2dyb29zaC9MaW5lQ2xvc3VyZVByb2Nlc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvTGluZUNsb3N1cmVQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWVlY2QuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvZ3Jvb3Z5L2dyb29zaC9MaW5lQ2xvc3VyZVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2UgY29tLmJhdWxzdXBwLmdyb292eS5ncm9vc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lQ2xvc3VyZVByb2Nlc3MgZXh0ZW5kcyBTdHJlYW1DbG9zdXJlUHJvY2VzcyB7Ci0gIHB1YmxpYyBMaW5lQ2xvc3VyZVByb2Nlc3MoQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gICAgc3VwZXIoY2xvc3VyZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKGZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQnVmZmVyZWRSZWFkZXIgcmlzID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgIFdyaXRlciB3b3MgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcywgIklTTy04ODU5LTEiKSk7Ci0gICAgCi0gICAgU3RyaW5nIGxpbmU7Ci0gICAgCi0gICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHdoaWxlICgobGluZSA9IHJpcy5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICBsLmNsZWFyKCk7Ci0gICAgICBsLmFkZChsaW5lKTsKLSAgICAgIGwuYWRkKHdvcyk7Ci0gICAgICBjbG9zdXJlLmNhbGwobCk7Ci0gICAgICB3b3MuZmx1c2goKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvU2hlbGxQcm9jZXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL1NoZWxsUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNhODI0Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL2dyb292eS9ncm9vc2gvU2hlbGxQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5ncm9vdnkuZ3Jvb3NoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLkFwcFByb2Nlc3M7Ci1pbXBvcnQgY29tLmJhdWxzdXBwLnByb2Nlc3MuUHJvY2Vzc0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmJhdWxzdXBwLnByb2Nlc3MuU2luazsKLWltcG9ydCBjb20uYmF1bHN1cHAucHJvY2Vzcy5Tb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBTaGVsbFByb2Nlc3MgZXh0ZW5kcyBHcm9vc2hQcm9jZXNzIHsKLSAgcHJpdmF0ZSBBcHBQcm9jZXNzIHByb2Nlc3MgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFN0cmluZ1tdIGFyZ3M7Ci0gIAotICBwdWJsaWMgU2hlbGxQcm9jZXNzKFN0cmluZyBuYW1lLCBPYmplY3QgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgCi0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmFyZ3MgPSBnZXRBcmdzKGFyZzEpOwotICAgIAotICAgIHByb2Nlc3MgPSBQcm9jZXNzRmFjdG9yeS5idWlsZFByb2Nlc3MobmFtZSwgYXJncyk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIGdldEFyZ3MoT2JqZWN0IGFyZzEpIHsKLSAgICBpZiAoYXJnMSA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgZWxzZSBpZiAoYXJnMSBpbnN0YW5jZW9mIFN0cmluZ1tdKQotICAgICAgcmV0dXJuIChTdHJpbmdbXSkgYXJnMTsKLSAgICBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgIE9iamVjdFtdIGFyZ3NPID0gKE9iamVjdFtdKSBhcmcxOwotICAgICAgU3RyaW5nW10gYXJnc1MgPSBuZXcgU3RyaW5nW2FyZ3NPLmxlbmd0aF07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3NPLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGFyZ3NTW2ldID0gU3RyaW5nLnZhbHVlT2YoYXJnc09baV0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGFyZ3NTOwotICAgIH0gZWxzZSBpZiAoYXJnMSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyhTdHJpbmcpIGFyZzF9OwotICAgIGVsc2UgCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyBzdXBwb3J0IGZvciBhcmdzIG9mIHR5cGUgIiArIGFyZzEuZ2V0Q2xhc3MoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdhaXRGb3JFeGl0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCi0gICAgcHJvY2Vzcy5yZXN1bHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHByb2Nlc3Muc3RhcnQoKTsKLSAgfQotCi0gIHB1YmxpYyBTaW5rIGdldFNpbmsoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3MuZ2V0SW5wdXQoKTsKLSAgfQotCi0gIHB1YmxpYyBTb3VyY2UgZ2V0U291cmNlKCkgewotICAgIHJldHVybiBwcm9jZXNzLmdldE91dHB1dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL1N0cmVhbUNsb3N1cmVQcm9jZXNzLmphdmEgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9ncm9vdnkvZ3Jvb3NoL1N0cmVhbUNsb3N1cmVQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjM1ZDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvZ3Jvb3Z5L2dyb29zaC9TdHJlYW1DbG9zdXJlUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLXBhY2thZ2UgY29tLmJhdWxzdXBwLmdyb292eS5ncm9vc2g7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlBpcGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LkZ1dHVyZVJlc3VsdDsKLQotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLklPVXRpbDsKLWltcG9ydCBjb20uYmF1bHN1cHAucHJvY2Vzcy5TaW5rOwotaW1wb3J0IGNvbS5iYXVsc3VwcC5wcm9jZXNzLlNvdXJjZTsKLWltcG9ydCBjb20uYmF1bHN1cHAucHJvY2Vzcy5TdGFuZGFyZFN0cmVhbXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJlYW1DbG9zdXJlUHJvY2VzcyBleHRlbmRzIEdyb29zaFByb2Nlc3MgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gIHByb3RlY3RlZCBDbG9zdXJlIGNsb3N1cmU7Ci0gIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIG9zOwotICBwcml2YXRlIEZ1dHVyZVJlc3VsdCByZXN1bHQgPSBuZXcgRnV0dXJlUmVzdWx0KCk7Ci0KLSAgcHVibGljIFN0cmVhbUNsb3N1cmVQcm9jZXNzKENsb3N1cmUgY2xvc3VyZSkgewotICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoaXMgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjbG9zdXJlIHByb2Nlc3NlcyBuZWVkIGEgc291cmNlIik7ICAgIAotICAgICAgCi0gICAgaWYgKG9zID09IG51bGwpCi0gICAgICBvcyA9IFN0YW5kYXJkU3RyZWFtcy5zdGRvdXQoKS5nZXRTdHJlYW0oKTsKLSAgICAgIAotICAgIHRyeSB7Ci0gICAgICBJT1V0aWwuZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICBTdHJlYW1DbG9zdXJlUHJvY2Vzcy50aGlzLnJ1bigpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3YWl0Rm9yRXhpdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAotICAgIHRyeSB7Ci0gICAgICByZXN1bHQuZ2V0KCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRPRE8gaGFuZGxlIHRoZSBleGNlcHRpb25zCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKSB7ICAgIAotICAgIHRyeSB7Ci0gICAgICBwcm9jZXNzKGlzLCBvcyk7Ci0gICAgICByZXN1bHQuc2V0KEJvb2xlYW4uVFJVRSk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgLy8gVE9ETyByZW1vdmUgZGVidWcgb25jZSBjYWxsZXIgaGFuZGxlIGV4Y2VwdGlvbgotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBU1lOQyBFWENFUFRJT04gKFNDUC5ydW4pOiAiICsgZSk7Ci0gICAgICByZXN1bHQuc2V0RXhjZXB0aW9uKGUpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICB0cnkgewotICAgICAgICBvcy5mbHVzaCgpOwotICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICBpZiAocmVzdWx0LmdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICAvLyBUT0RPIHJlbW92ZSBkZWJ1ZyBvbmNlIGNhbGxlciBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBU1lOQyBFWENFUFRJT04gKFNDUC5ydW4pOiAiICsgZSk7Ci0gICAgICAgICAgcmVzdWx0LnNldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3MoZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbC5hZGQoaXMpOwotICAgIGwuYWRkKG9zKTsKLSAgICBjbG9zdXJlLmNhbGwobCk7Ci0gICAgb3MuZmx1c2goKTsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIENsb3N1cmVTaW5rIGV4dGVuZHMgU2luayB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgIFN0cmVhbUNsb3N1cmVQcm9jZXNzLnRoaXMuaXMgPSBpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNlaXZlc1N0cmVhbSgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTaW5rIGdldFNpbmsoKSB7Ci0gICAgcmV0dXJuIG5ldyBDbG9zdXJlU2luaygpOwotICB9Ci0gIAotICBwdWJsaWMgY2xhc3MgQ2xvc3VyZVNvdXJjZSBleHRlbmRzIFNvdXJjZSB7Ci0gICAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoc2luay5wcm92aWRlc1N0cmVhbSgpKSB7Ci0gICAgICAgIFN0cmVhbUNsb3N1cmVQcm9jZXNzLnRoaXMub3MgPSBzaW5rLmdldFN0cmVhbSgpOwotICAgICAgfSBlbHNlIGlmIChzaW5rLnJlY2VpdmVzU3RyZWFtKCkpIHsKLSAgICAgICAgUGlwZSBwaXBlID0gUGlwZS5vcGVuKCk7Ci0gICAgICAgIFN0cmVhbUNsb3N1cmVQcm9jZXNzLnRoaXMub3MgPSBDaGFubmVscy5uZXdPdXRwdXRTdHJlYW0ocGlwZS5zaW5rKCkpOwotICAgICAgICBzaW5rLnNldFN0cmVhbShDaGFubmVscy5uZXdJbnB1dFN0cmVhbShwaXBlLnNvdXJjZSgpKSk7ICAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic2luayB0eXBlIHVua25vd24iKTsgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTb3VyY2UgZ2V0U291cmNlKCkgewotICAgIHJldHVybiBuZXcgQ2xvc3VyZVNvdXJjZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0FwcFByb2Nlc3MuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvQXBwUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg3YjNhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvQXBwUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8vIFRPRE8gaG93IGRvZXMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGlucHV0L291dHB1dCBpLmUuIHRvIGEgZmlsZSBnZXQgbW9uaXRvcmVkPwotcHVibGljIGludGVyZmFjZSBBcHBQcm9jZXNzIHsKLSAgU2luayBnZXRJbnB1dCgpOwotICBTb3VyY2UgZ2V0T3V0cHV0KCk7Ci0gIFNvdXJjZSBnZXRFcnJvcigpOwotICAKLSAgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgaW50IHJlc3VsdCgpOwotICBib29sZWFuIGhhZEVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0NoYXJTZXF1ZW5jZVNvdXJjZS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9DaGFyU2VxdWVuY2VTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzZDVmYi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0NoYXJTZXF1ZW5jZVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5wcm9jZXNzOwotCi1wdWJsaWMgY2xhc3MgQ2hhclNlcXVlbmNlU291cmNlIGV4dGVuZHMgU291cmNlIHsKLSAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHsKLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0Rldk51bGwuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvRGV2TnVsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJkYmJiLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvRGV2TnVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGV2TnVsbCB7Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbFNpbmsgZXh0ZW5kcyBTaW5rIHsKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgIHJldHVybiBuZXcgT3V0cHV0U3RyZWFtKCkgewotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpcykgewotICAgICAgLy8gVE9ETyBoYW5kbGUgcmVzdWx0L2V4Y2VwdGlvbj8KLSAgICAgIElPVXRpbC5wdW1wQXN5bmMoaXMsIGdldFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1N0cmVhbSgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlY2VpdmVzU3RyZWFtKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxTb3VyY2UgZXh0ZW5kcyBTb3VyY2UgewotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoU2luayBzaW5rKSB7Ci0gICAgICBpZiAoc2luay5wcm92aWRlc1N0cmVhbSgpKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgc2luay5nZXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gIAotICAgICAgfSBlbHNlIGlmIChzaW5rLnJlY2VpdmVzU3RyZWFtKCkpIHsKLSAgICAgICAgc2luay5zZXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7ICAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic2luayB0eXBlIHVua25vd24iKTsgIAotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTaW5rIGNyZWF0ZVNpbmsoKSB7Ci0gICAgcmV0dXJuIG5ldyBOdWxsU2luaygpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFNvdXJjZSBjcmVhdGVTb3VyY2UoKSB7Ci0gICAgcmV0dXJuIG5ldyBOdWxsU291cmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvRmlsZVN0cmVhbXMuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvRmlsZVN0cmVhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmODA1Ni4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0ZpbGVTdHJlYW1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZpbGVTdHJlYW1zIHsKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlU291cmNlIGV4dGVuZHMgU291cmNlIHsKLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSBpczsKLQotICAgIHB1YmxpYyBGaWxlU291cmNlKEZpbGUgZikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmZpbGUgPSBmOyAgCi0gICAgICB0aGlzLmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHsgICAgICAKLSAgICAgIGlmIChzaW5rLnByb3ZpZGVzU3RyZWFtKCkpIHsKLSAgICAgICAgLy8gVE9ETyBoYW5kbGUgcmVzdWx0Ci0gICAgICAgIElPVXRpbC5wdW1wQXN5bmMoaXMsIHNpbmsuZ2V0U3RyZWFtKCkpOwotICAgICAgfSBlbHNlIGlmIChzaW5rLnJlY2VpdmVzU3RyZWFtKCkpIHsKLSAgICAgICAgc2luay5zZXRTdHJlYW0oaXMpOyAgCi0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNpbmsgdHlwZSB1bmtub3duIik7ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU291cmNlIHNvdXJjZShGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgRmlsZVNvdXJjZShmaWxlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlU2luayBleHRlbmRzIFNpbmsgewotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSBvczsKLQotICAgIHB1YmxpYyBGaWxlU2luayhGaWxlIGYsIGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuZmlsZSA9IGY7ICAKLSAgICAgIHRoaXMub3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmLCBhcHBlbmQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgIHJldHVybiBvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1N0cmVhbSgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTaW5rIHNpbmsoRmlsZSBmaWxlLCBib29sZWFuIGFwcGVuZCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2luayhmaWxlLCBhcHBlbmQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0lPVXRpbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9JT1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxOWVjZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL0lPVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LkZ1dHVyZVJlc3VsdDsKLWltcG9ydCBFRFUub3N3ZWdvLmNzLmRsLnV0aWwuY29uY3VycmVudC5UaHJlYWRlZEV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgSU9VdGlsIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IG5ldyBUaHJlYWRlZEV4ZWN1dG9yKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgcHVtcChJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgcHVtcGVkID0gMDsKLSAgICBieXRlW10gYnVmZnkgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgCi0gICAgaW50IHJlYWQgPSAwOwotICAgIHdoaWxlICgocmVhZCA9IGlzLnJlYWQoYnVmZnkpKSAhPSAtMSkgewotICAgICAgc3RyZWFtLndyaXRlKGJ1ZmZ5LCAwLCByZWFkKTsKLSAgICAgIHB1bXBlZCArPSByZWFkOyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiByZWFkOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBGdXR1cmVSZXN1bHQgcHVtcEFzeW5jKGZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICBmaW5hbCBGdXR1cmVSZXN1bHQgcmVzdWx0ID0gbmV3IEZ1dHVyZVJlc3VsdCgpOwotICAgIHRyeSB7Ci0gICAgICBleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgcmVhZCA9IElPVXRpbC5wdW1wKGlzLCBvcyk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0KG5ldyBJbnRlZ2VyKHJlYWQpKTsKLSAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHJlbW92ZSBkZWJ1ZyBvbmNlIGNhbGxlciBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFTWU5DIEVYQ0VQVElPTiAoSU9VLnB1bXBBc3luYyk6ICIgKyBlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIGRlYnVnIG9uY2UgY2FsbGVyIGhhbmRsZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBU1lOQyBFWENFUFRJT04gKElPVS5wdW1wQXN5bmMpOiAiICsgZSk7Ci0gICAgICAgICAgICAgIHJlc3VsdC5zZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9KYXZhUHJvY2Vzcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9KYXZhUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUzYTY3Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvSmF2YVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEphdmFQcm9jZXNzIGltcGxlbWVudHMgQXBwUHJvY2VzcyB7ICAgICAgCi0gIHByaXZhdGUgU3RyaW5nW10gY29tbWFuZDsKLSAgcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZXJySGFuZGxlZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gb3V0SGFuZGxlZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaW5IYW5kbGVkID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBKYXZhUHJvY2VzcyhTdHJpbmdbXSBjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEphdmFQcm9jZXNzIGNyZWF0ZVByb2Nlc3MoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7IAotICAgIFN0cmluZ1tdIGNvbW1hbmRBcmdzID0gY29uY2F0KGNvbW1hbmQsIGFyZ3MpOwotICAgICAgIAotICAgIHJldHVybiBuZXcgSmF2YVByb2Nlc3MoY29tbWFuZEFyZ3MpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY29uY2F0KFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgU3RyaW5nW10gY29tbWFuZEFyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoICsgMV07Ci0gICAgY29tbWFuZEFyZ3NbMF0gPSBjb21tYW5kOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY29tbWFuZEFyZ3MsIDEsIGFyZ3MubGVuZ3RoKTsKLSAgICByZXR1cm4gY29tbWFuZEFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAgIAotICAgIGlmICghaW5IYW5kbGVkKSB7Ci0gICAgICBwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIHdlIHRocm93IGF3YXksIGl0IHdvdWxkIG1ha2UgaXQgZXhwbGljaXQgdG8gZGlyZWN0IHRoZSBvdXRwdXQgc29tZXdoZXJlLgotICAgIGlmICghb3V0SGFuZGxlZCkKLSAgICAgIElPVXRpbC5wdW1wQXN5bmMocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLCBTdGFuZGFyZFN0cmVhbXMuc3RkZXJyKCkuZ2V0U3RyZWFtKCkpOwotICAgICAgCi0gICAgaWYgKCFlcnJIYW5kbGVkKQotICAgICAgSU9VdGlsLnB1bXBBc3luYyhwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksIFN0YW5kYXJkU3RyZWFtcy5zdGRlcnIoKS5nZXRTdHJlYW0oKSk7Ci0gIH0KLQotICBwdWJsaWMgU2luayBnZXRJbnB1dCgpIHsKLSAgICByZXR1cm4gbmV3IEluU2luaygpOwotICB9Ci0KLSAgcHVibGljIFNvdXJjZSBnZXRPdXRwdXQoKSB7Ci0gICAgcmV0dXJuIG5ldyBPdXRTb3VyY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTb3VyY2UgZ2V0RXJyb3IoKSB7Ci0gICAgcmV0dXJuIG5ldyBFcnJTb3VyY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVzdWx0KCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFkRXJyb3IoKSB7Ci0gICAgcmV0dXJuIHJlc3VsdCgpICE9IDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBJblNpbmsgZXh0ZW5kcyBTaW5rIHsKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgIGluSGFuZGxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gcHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1N0cmVhbSgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGNsYXNzIE91dFNvdXJjZSBleHRlbmRzIFNvdXJjZSB7Ci0gICAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHsKLSAgICAgIGlmIChzaW5rLnByb3ZpZGVzU3RyZWFtKCkpIHsKLSAgICAgICAgb3V0SGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIC8vIFRPRE8gaGFuZGxlIHJlc3VsdAotICAgICAgICBJT1V0aWwucHVtcEFzeW5jKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgc2luay5nZXRTdHJlYW0oKSk7Ci0gICAgICB9IGVsc2UgaWYgKHNpbmsucmVjZWl2ZXNTdHJlYW0oKSkgewotICAgICAgICBvdXRIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgc2luay5zZXRTdHJlYW0ocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsgIAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJzaW5rIHR5cGUgdW5rbm93biIpOyAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgY2xhc3MgRXJyU291cmNlIGV4dGVuZHMgU291cmNlIHsKLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFNpbmsgc2luaykgewotICAgICAgaWYgKHNpbmsucHJvdmlkZXNTdHJlYW0oKSkgewotICAgICAgICBlcnJIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgLy8gVE9ETyBoYW5kbGUgcmVzdWx0Ci0gICAgICAgIElPVXRpbC5wdW1wQXN5bmMocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLCBzaW5rLmdldFN0cmVhbSgpKTsKLSAgICAgIH0gZWxzZSBpZiAoc2luay5yZWNlaXZlc1N0cmVhbSgpKSB7Ci0gICAgICAgIGVyckhhbmRsZWQgPSB0cnVlOwotICAgICAgICBzaW5rLnNldFN0cmVhbShwcm9jZXNzLmdldElucHV0U3RyZWFtKCkpOyAgCi0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNpbmsgdHlwZSB1bmtub3duIik7ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvUHJvY2Vzc0ZhY3RvcnkuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvUHJvY2Vzc0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmZmYwZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL1Byb2Nlc3NGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NGYWN0b3J5IHsKLSAgcHVibGljIHN0YXRpYyBBcHBQcm9jZXNzIGJ1aWxkUHJvY2Vzc1BpcGVsaW5lKFN0cmluZyBjb21tYW5kTGluZSkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEFwcFByb2Nlc3MgYnVpbGRQcm9jZXNzKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBKYXZhUHJvY2Vzcy5jcmVhdGVQcm9jZXNzKGNvbW1hbmQsIGFyZ3MpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL1NpbmsuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvU2luay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU5ZTBhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvU2luay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8vIFRPRE8gbmVlZCBhbiBpc0ZpbmlzaGVkIG1ldGhvZAotLy8gaW4gZ2VuZXJhbCBwcm9jZXNzLndhaXRGb3JFeGl0KCkga25vd3Mgd2hlbiBpbnB1dCBoYXMgZmluaXNoZWQKLS8vIGJ1dCBub3QgYXdhcmUgb2Ygb3V0cHV0IGhhcyByZWFjaGVkIGRlc3RpbmF0aW9uIG5lY2Nlc2FyaWx5ISAKLXB1YmxpYyBjbGFzcyBTaW5rIHsgIAotICBwdWJsaWMgYm9vbGVhbiByZWNlaXZlc1N0cmVhbSgpIHsKLSAgICByZXR1cm4gZmFsc2U7ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcHJvdmlkZXNTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0U3RyZWFtKCkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0cmVhbShJbnB1dFN0cmVhbSBjaGFubmVsKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9Tb3VyY2UuamF2YSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzgwMTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2UgeyAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3QoU2luayBzaW5rKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL1N0YW5kYXJkU3RyZWFtcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9TdGFuZGFyZFN0cmVhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0OWY0OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy9tYWluL2NvbS9iYXVsc3VwcC9wcm9jZXNzL1N0YW5kYXJkU3RyZWFtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotcGFja2FnZSBjb20uYmF1bHN1cHAucHJvY2VzczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLy8gVE9ETyBkb24ndCBsZXQgc3Rkb3V0LCBzdGRlcnIgYmUgY2xvc2VkCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRTdHJlYW1zIHsKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJblNvdXJjZSBleHRlbmRzIFNvdXJjZSB7Ci0gICAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5pbik7Ci0gICAgICAKLSAgICAgIGlmIChzaW5rLnByb3ZpZGVzU3RyZWFtKCkpIHsKLSAgICAgICAgLy8gVE9ETyBmZWVscyBiZXR0ZXIgaWYgdGhpcyBpcyBsaW5lIGJhc2VkLCByYXRoZXIgdGhhbiBmaXhlZCBidWZmZXIgc2l6ZSBiYXNlZAotICAgICAgICAvLyBUT0RPIGhhbmRsZSByZXN1bHQKLSAgICAgICAgSU9VdGlsLnB1bXBBc3luYyhpcywgc2luay5nZXRTdHJlYW0oKSk7Ci0gICAgICB9IGVsc2UgaWYgKHNpbmsucmVjZWl2ZXNTdHJlYW0oKSkgewotICAgICAgICBzaW5rLnNldFN0cmVhbShpcyk7ICAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic2luayB0eXBlIHVua25vd24iKTsgIAotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTb3VyY2Ugc3RkaW4oKSB7Ci0gICAgcmV0dXJuIG5ldyBJblNvdXJjZSgpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIEVyclNpbmsgZXh0ZW5kcyBTaW5rIHsKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5lcnIpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgIC8vIGlnbm9yZSBjbG9zZQotICAgICAgICAgIGZsdXNoKCk7ICAKLSAgICAgICAgfSAgCi0gICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByb3ZpZGVzU3RyZWFtKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFNpbmsgc3RkZXJyKCkgewotICAgIHJldHVybiBuZXcgRXJyU2luaygpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dFNpbmsgZXh0ZW5kcyBTaW5rIHsKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5vdXQpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgIC8vIGlnbm9yZSBjbG9zZQotICAgICAgICAgIGZsdXNoKCk7ICAKLSAgICAgICAgfSAgCi0gICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByb3ZpZGVzU3RyZWFtKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFNpbmsgc3Rkb3V0KCkgewotICAgIHJldHVybiBuZXcgT3V0U2luaygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL21haW4vY29tL2JhdWxzdXBwL3Byb2Nlc3MvU3RyaW5nU3RyZWFtcy5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9TdHJpbmdTdHJlYW1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDY1NmIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvbWFpbi9jb20vYmF1bHN1cHAvcHJvY2Vzcy9TdHJpbmdTdHJlYW1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1wYWNrYWdlIGNvbS5iYXVsc3VwcC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IEVEVS5vc3dlZ28uY3MuZGwudXRpbC5jb25jdXJyZW50LkZ1dHVyZVJlc3VsdDsKLQotcHVibGljIGNsYXNzIFN0cmluZ1N0cmVhbXMgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1NpbmsgZXh0ZW5kcyBTaW5rIHsKLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIHByaXZhdGUgRnV0dXJlUmVzdWx0IHJlc3VsdCA9IG5ldyBGdXR1cmVSZXN1bHQoKTsKLSAgCi0gICAgcHVibGljIGJvb2xlYW4gcmVjZWl2ZXNTdHJlYW0oKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgIHJlc3VsdCA9IElPVXRpbC5wdW1wQXN5bmMoaXMsIGJhb3MpOwotICAgIH0KLSAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHJlc3VsdC5nZXQoKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFRPRE8gaGFuZGxlIGJldHRlcgotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICAKLSAgICAgIHRyeSB7Ci0gICAgICAgIHJldHVybiBiYW9zLnRvU3RyaW5nKCJJU08tODg1OS0xIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICB9IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdTaW5rIHN0cmluZ1NpbmsoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmdTaW5rKCk7ICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdTb3VyY2UgZXh0ZW5kcyBTb3VyY2UgewotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nU291cmNlKFN0cmluZyBzKSB7Ci0gICAgICBieXRlW10gYnVmZnk7Ci0gICAgICAKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1ZmZ5ID0gcy5nZXRCeXRlcygiSVNPLTg4NTktMSIpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgICAgCi0gICAgICB0aGlzLmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZ5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChTaW5rIHNpbmspIHsgICAgICAKLSAgICAgIGlmIChzaW5rLnByb3ZpZGVzU3RyZWFtKCkpIHsKLSAgICAgICAgLy8gVE9ETyBoYW5kbGUgcmVzdWx0Ci0gICAgICAgIElPVXRpbC5wdW1wQXN5bmMoaXMsIHNpbmsuZ2V0U3RyZWFtKCkpOwotICAgICAgfSBlbHNlIGlmIChzaW5rLnJlY2VpdmVzU3RyZWFtKCkpIHsKLSAgICAgICAgc2luay5zZXRTdHJlYW0oaXMpOyAgCi0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNpbmsgdHlwZSB1bmtub3duIik7ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nU291cmNlIHN0cmluZ1NvdXJjZShTdHJpbmcgcykgewotICAgIHJldHVybiBuZXcgU3RyaW5nU291cmNlKHMpOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9iYXNpY19jYXQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL2Jhc2ljX2NhdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjdiNTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL2Jhc2ljX2NhdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotYyA9IGdzaC5jYXQoJ3Rlc3Rfc2NyaXB0cy9ibGFoLnR4dCcpLnRvU3RkT3V0KCk7Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9ibGFoLnR4dCBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9ibGFoLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1MmI2NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvYmxhaC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWEKLWIKLWJhCi1jCi1kCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9jYXRfdG9fZmlsZS5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvY2F0X3RvX2ZpbGUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQxY2Y4Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9jYXRfdG9fZmlsZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotZ3NoLmNhdCgndGVzdF9zY3JpcHRzL2JsYWgudHh0JykudG9GaWxlKG5ldyBqYXZhLmlvLkZpbGUoJ2JsYWgub3V0JykpOwotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9kaWN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9kaWN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkYjY0ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvZGljdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotZ3NoLmNhdCgnL3Vzci9zaGFyZS9kaWN0L3dvcmRzJykucGlwZVRvKGdzaC5ncmVwKCdsZXhpYScpKS50b1N0ZE91dCgpOwotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9kaWN0X2FyZ3MuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL2RpY3RfYXJncy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTk3MDguLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL2RpY3RfYXJncy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLSAgU3lzdGVtLmVyci5wcmludGxuKCJwbGVhc2UgcHJvdmlkZSBhIHNlYXJjaCBwYXR0ZXJuIik7Ci0gIFN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGRpY3RfYXJncyBxdWVyeXN0cmluZyIpOwotfSBlbHNlIHsKLSAgZ3NoLmNhdCgnL3Vzci9zaGFyZS9kaWN0L3dvcmRzJykucGlwZVRvKGdzaC5ncmVwKGFyZ3NbMF0pKS50b1N0ZE91dCgpOwotfQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvZWFjaF9saW5lLmdyb292eSBiL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9lYWNoX2xpbmUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTEwNWU2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9lYWNoX2xpbmUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotZ3NoID0gbmV3IGNvbS5iYXVsc3VwcC5ncm9vdnkuZ3Jvb3NoLkdyb29zaCgpOwotCi1jYXQgPSBnc2guY2F0KCd0ZXN0X3NjcmlwdHMvYmxhaC50eHQnKTsKLWxpbmVzID0gZ3NoLmVhY2hfbGluZSB7IGxpbmUsdyB8IAotICB3LndyaXRlKCIqIik7Ci0gIHcud3JpdGUobGluZSk7Ci0gIHcud3JpdGUoIlxuIik7Ci19OwotCi1jYXQucGlwZVRvKGxpbmVzKTsKLWxpbmVzLnRvU3RkT3V0KCk7Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL2ZpbmRfZ3JpZC5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvZmluZF9ncmlkLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiNTc0MS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvZmluZF9ncmlkLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIEJVRz8/IGphdmEudXRpbC5BcnJheXMuYXNMaXN0IGZhaWxzIHdpdGggdXRpbCBvbiBudWxsIQotLy8gY2hhbmdlZCBqYXZhIGNvZGUgdG8gc2VuZCBMaXN0Ci0KLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotZiA9IGdzaC5maW5kKCcuJywgJy1uYW1lJywgJyouamF2YScsICctbHMnKTsKLXRvdGFsID0gMDsKLWxpbmVzID0gZ3NoLmdyaWQgeyB2YWx1ZXMsdyB8Ci0gIHggPSB2YWx1ZXNbMiw0LDYsMTBdOyAKLSAgcyA9IHguam9pbignCScpOwotICB3LnByaW50bG4ocyk7Ci0gIHRvdGFsICs9IEludGVnZXIucGFyc2VJbnQodmFsdWVzWzZdKTsKLX07Ci0KLWYucGlwZVRvKGxpbmVzKTsKLWxpbmVzLnRvU3RkT3V0KCk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWw6ICIgKyB0b3RhbCk7Ci0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy9zdGRpbl9jYXQuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL3N0ZGluX2NhdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmVjYjAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy9zcmMvdGVzdF9zY3JpcHRzL3N0ZGluX2NhdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotLy8gZG9lcyB0aGlzIGZhaWwgaWYgeW91IGNoYW5nZSBjIHRvIGNhdD8KLWdzaC5jYXQoKS5mcm9tU3RkSW4oKS50b1N0ZE91dCgpOwotCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy90b3N0cmluZy5ncm9vdnkgYi9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3NyYy90ZXN0X3NjcmlwdHMvdG9zdHJpbmcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY0NGY2Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3Byb2Nlc3Mvc3JjL3Rlc3Rfc2NyaXB0cy90b3N0cmluZy5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWdzaCA9IG5ldyBjb20uYmF1bHN1cHAuZ3Jvb3Z5Lmdyb29zaC5Hcm9vc2goKTsKLQotcyA9IGdzaC5jYXQoJ3Rlc3Rfc2NyaXB0cy9ibGFoLnR4dCcpLnBpcGVUbyhnc2guZ3JlcCgnYScpKS50b1N0cmluZ091dCgpOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oJy0+JyArIHMudG9TdHJpbmcoKSArICc8LScpOwotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3RvZG8udHh0IGIvZ3Jvb3Z5L21vZHVsZXMvcHJvY2Vzcy90b2RvLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkOGI3NS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9wcm9jZXNzL3RvZG8udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotSCAtIENoYW5nZSBlbmNvZGluZyBmcm9tIElTTy04ODU5LTEuICBJU08tODg1OS0xIGlzIGEgbWFya2VyIHRvIHNlYXJjaCBmb3IsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbXBsaWNpdCBtZXRob2RzLgotCi1NIC0gVmFyaW91cyBUT0RPcyBpbiB0aGUgY29kZS4KLU0gLSBMaW5lIGJhc2VkIHN0ZGluLCByYXRoZXIgdGhhbiBidWZmZXIgYmFzZWQuICBNb3JlIGludHVpdGl2ZSBmb3IgdXNlcnMuCi1NIC0gSGFuZGxlIHByb2Nlc3MgY29tcGxldGlvbiBpbmNsdWRpbmcgc2luaz8gIFNvdXJjZSBjYW4gYmUgaWdub3JlZD8KLU0gLSBHcm9vdnkgb3BlcmF0b3Igb3ZlcmxvYWRpbmcuCi1NIC0gVGhyb3cgZXJyb3IgaWYgc291cmNlL3NpbmsgcmV0cmlldmVkIHR3aWNlIGV0Yy4gIE9yIGFmdGVyIHN0YXJ0KCkgY2FsbGVkLgotCi1FIC0gUGlwZWxpbmUgcGFyc2luZyBpLmUgfCwgYC4KLUUgLSBUZWUgUHJvY2VzcyBmb3IgZHVwbGljYXRpbmcgb3V0cHV0Ci1FIC0gQ29uY2F0IGZvciBqb2luaW5nIG11bHRpcGxlIGlucHV0cy4gIFdpdGggVGhyZWFkTG9jYWwgaW5wdXQgbmFtZSEKLUUgLSBTaW5rL1NvdXJjZSBkZWFsaW5nIHdpdGggUmVhZGVyL1dyaXRlcj8KLQotR2VuZXJhbAotCi1iaW4vZ3Jvb3Z5IHRlc3Rfc2NyaXB0cy9kaWN0X2FyZ3MuZ3Jvb3Z5IDI+JjEgfCBncmVwIC12IE5hdGl2ZU1ldGhvZCB8IGdyZXAgLXYgRGVsZWdhdGluZyB8IGdyZXAgLXYgTGF1bmNoZXIgfCBncmVwIC12IE1ldGhvZC5pbnZva2UgfCBncmVwIC12IEludm9rZXIgfCBncmVwIC12IE1ldGFDbGFzcwotCi1DYXVnaHQ6IGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IDAKLWphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IDAKLSAgICAgICAgYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkRlZmF1bHRHcm9vdnlNZXRob2RzLmdldChEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5qYXZhOjc0MSkKLSAgICAgICAgYXQgZGljdF9hcmdzLnJ1bih0ZXN0X3NjcmlwdHMvZGljdF9hcmdzLmdyb292eTo3KQotICAgICAgICBhdCBkaWN0X2FyZ3MuaW52b2tlTWV0aG9kKHRlc3Rfc2NyaXB0cy9kaWN0X2FyZ3MuZ3Jvb3Z5KQotICAgICAgICBhdCBkaWN0X2FyZ3MubWFpbih0ZXN0X3NjcmlwdHMvZGljdF9hcmdzLmdyb292eSkKLSAgICAgICAgYXQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGwucnVuKEdyb292eVNoZWxsLmphdmE6MTY2KQotICAgICAgICBhdCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbC5tYWluKEdyb292eVNoZWxsLmphdmE6ODUpCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL2xpYi9qYWNvYi5kbGwgYi9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9saWIvamFjb2IuZGxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAyOWIzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL2xpYi9qYWNvYi5kbGwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9saWIvamFjb2IuamFyIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vbGliL2phY29iLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MTRkZi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9saWIvamFjb2IuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vbWF2ZW4ueG1sIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vbWF2ZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTY0N2FhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL21hdmVuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImRlZmF1bHQiIHhtbG5zOmo9ImplbGx5OmNvcmUiIHhtbG5zOnU9ImplbGx5OnV0aWwiIHhtbG5zOm1hdmVuPSJqZWxseTptYXZlbiIgeG1sbnM6YW50PSJqZWxseTphbnQiPgotCi0gICAgPGdvYWwgbmFtZT0iZGVmYXVsdCIgcHJlcmVxcz0iaW5zdGFsbC1zY3JpcHRvbSIvPgotCi0gICAgPHByZUdvYWwgbmFtZT0iamF2YTpjb21waWxlIj4KLSAgICAgICAgPGFudDpwYXRoIGlkPSJqYWNvYi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFudDpwYXRoZWxlbWVudCBwYXRoPSIke3Byb2plY3QuaG9tZX1saWIvamFjb2IuamFyIi8+Ci0gICAgICAgIDwvYW50OnBhdGg+Ci0gICAgICAgIDxtYXZlbjphZGRQYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIgcmVmaWQ9ImphY29iLmNsYXNzcGF0aCIvPgotICAgIDwvcHJlR29hbD4KLQotICAgIDxnb2FsIG5hbWU9Imluc3RhbGwtc2NyaXB0b20iIHByZXJlcXM9ImphciI+Ci0KLSAgICAgICAgPGVjaG8+SW5zdGFsbGluZyBzY3JpcHRvbTwvZWNobz4KLSAgICAgICAgPGVjaG8+Q3JlYXRpbmcgZGlyZWN0b3JpZXM8L2VjaG8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Z3Jvb3Z5Lmluc3RhbGwuc3RhZ2luZy5kZXN0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2dyb292eS5pbnN0YWxsLnN0YWdpbmcuZGVzdH0vbGliIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Z3Jvb3Z5Lmluc3RhbGwuc3RhZ2luZy5kZXN0fS9iaW4iLz4KLQotICAgICAgICA8ZWNobz4ke3Byb2plY3QuaG9tZX08L2VjaG8+Ci0KLSAgICAgICAgPGVjaG8+Q29weWluZyBzY3JpcHRvbS5qYXI8L2VjaG8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7bWF2ZW4uYnVpbGQuZGlyfS8ke21hdmVuLmZpbmFsLm5hbWV9LmphciIgdG9EaXI9IiR7Z3Jvb3Z5Lmluc3RhbGwuc3RhZ2luZy5kZXN0fS9saWIiLz4KLSAgICAgICAgPGVjaG8+Q29weWluZyBqYWNvYi5qYXI8L2VjaG8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cHJvamVjdC5ob21lfWxpYi9qYWNvYi5qYXIiIHRvRGlyPSIke2dyb292eS5pbnN0YWxsLnN0YWdpbmcuZGVzdH0vbGliIi8+Ci0gICAgICAgIDxlY2hvPkNvcHlpbmcgamFjb2IuZGxsPC9lY2hvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Byb2plY3QuaG9tZX1saWIvamFjb2IuZGxsIiB0b0Rpcj0iJHtncm9vdnkuaW5zdGFsbC5zdGFnaW5nLmRlc3R9L2JpbiIvPgotCi0gICAgPC9nb2FsPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vcHJvamVjdC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vcHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRhNjJjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLW1hdmVuLmNvbXBpbGUuc291cmNlPTEuNAotbWF2ZW4uY29tcGlsZS50YXJnZXQ9MS40Ci1tYXZlbi50ZXN0LnNvdXJjZT0xLjQKLW1hdmVuLmNvbXBpbGUuZGVwcmVjYXRpb249dHJ1ZQotbWF2ZW4uY29tcGlsZS5kZWJ1Zz10cnVlCi1tYXZlbi5jb21waWxlLm9wdGltaXplPXRydWUKLQotbWF2ZW4uamF2YWRvYy5saW5rcz1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvCi1tYXZlbi5qYXZhZG9jLnNvdXJjZT0xLjQKLQotbWF2ZW4udGVzdC5zZWFyY2guY2xhc3NkaXIgPSB0cnVlCi0KLW1hdmVuLmp1bml0LmZvcms9dHJ1ZQotbWF2ZW4uanVuaXQudXNlZmlsZT10cnVlCi0KLWdyb292eS5pbnN0YWxsLnN0YWdpbmcuZGVzdD0ke21hdmVuLmJ1aWxkLmRpcn0vaW5zdGFsbC8KLW1hdmVuLmh0bWwyeGRvYy5kaXI9JHttYXZlbi5idWlsZC5kaXJ9L2h0bWwKLQotbWF2ZW4ueGRvYy5kYXRlID0gbGVmdAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjb2RlaGF1cyB0aGVtZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1hdmVuLnhkb2MudGhlbWUudXJsPWh0dHA6Ly9jb2RlaGF1cy5vcmcvY29kZWhhdXMtc3R5bGUuY3NzCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFdoZXJlIHRoZSBqYXJzIGFyZSB1cGxvYWRlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNtYXZlbi5yZXBvLmNlbnRyYWwgPSBkaXN0LmNvZGVoYXVzLm9yZwotI21hdmVuLnJlcG8uY2VudHJhbC5kaXJlY3RvcnkgPSAvZGlzdAotCi0jbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbgotI21hdmVuLnJlcG8ucmVtb3RlPWh0dHA6Ly9kaXN0LmNvZGVoYXVzLm9yZwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHN3dCBwbGF0Zm9ybQotIyBwb3NzaWJsZSB2YWx1ZXMsIHdpbjMyLCBsaW51eC1ndGssIG1hY29zeAotIwotIyBmb3IgbGludXgtZ3RrIGVuYWJsZSBndGsgZGVwcyBpbiBwcm9qZWN0LnhtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsYXRmb3JtPXdpbjMyCi0jcGxhdGZvcm09bGludXgtZ3RrCi0jcGxhdGZvcm09bWFjb3N4Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vcHJvamVjdC54bWwgYi9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1YjVjNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTxwcm9qZWN0PgotICAgIDxwb21WZXJzaW9uPjM8L3BvbVZlcnNpb24+Ci0gICAgPGlkPnNjcmlwdG9tPC9pZD4KLSAgICA8Z3JvdXBJZD5ncm9vdnk8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+c2NyaXB0b208L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+c2NyaXB0b208L25hbWU+Ci0gICAgPGN1cnJlbnRWZXJzaW9uPjEuMS1TTkFQU0hPVDwvY3VycmVudFZlcnNpb24+Ci0gICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIENvZGVoYXVzPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly9jb2RlaGF1cy5vcmc8L3VybD4KLSAgICAgICAgPGxvZ28+aHR0cDovL2NvZGVoYXVzLm9yZy9jb2RlaGF1cy1zbWFsbC5naWY8L2xvZ28+Ci0gICAgPC9vcmdhbml6YXRpb24+Ci0gICAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLSAgICA8cGFja2FnZT5vcmcuY29kZWhhdXMuc2NyaXB0b208L3BhY2thZ2U+Ci0gICAgPGRlc2NyaXB0aW9uPnNDcmlwdE9NIGlzIGEgZHluYW1pYyBwcm94eSBhcm91bmQgQ09NIG9iamVjdHMgbGV2ZXJhZ2luZyB0aGUgSmFjb2IgbGlicmFyeTwvZGVzY3JpcHRpb24+Ci0gICAgPHVybD5odHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy88L3VybD4KLSAgICA8aXNzdWVUcmFja2luZ1VybD5odHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvc2VjdXJlL0Jyb3dzZVByb2plY3QuanNwYT9pZD0xMDI0MiZhbXA7cmVwb3J0PXJvYWRtYXA8L2lzc3VlVHJhY2tpbmdVcmw+Ci0KLSAgICA8c2l0ZUFkZHJlc3M+YmVhdmVyLmNvZGVoYXVzLm9yZzwvc2l0ZUFkZHJlc3M+Ci0gICAgPHNpdGVEaXJlY3Rvcnk+L2hvbWUvcHJvamVjdHMvZ3Jvb3Z5L3B1YmxpY19odG1sL3NjcmlwdG9tL21hdmVuPC9zaXRlRGlyZWN0b3J5PgotICAgIDxkaXN0cmlidXRpb25EaXJlY3Rvcnk+L2hvbWUvcHJvamVjdHMvZ3Jvb3Z5L2Rpc3Q8L2Rpc3RyaWJ1dGlvbkRpcmVjdG9yeT4KLQotICAgIDxyZXBvc2l0b3J5PgotICAgICAgICA8Y29ubmVjdGlvbj5zY206Y3ZzOnBzZXJ2ZXI6YW5vbnltb3VzQGN2cy5jb2RlaGF1cy5vcmc6L3NjbS9jdnNwdWJsaWM6Z3Jvb3Z5L21vZHVsZXMvc2NyaXB0b208L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpjdnM6ZXh0OiR7bWF2ZW4udXNlcm5hbWV9QGN2cy5jb2RlaGF1cy5vcmc6L3NjbS9jdnNwdWJsaWM6Z3Jvb3Z5L21vZHVsZXMvc2NyaXB0b208L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL2N2cy5ncm9vdnkuY29kZWhhdXMub3JnL3ZpZXdjdnMuY2dpL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tPC91cmw+Ci0gICAgPC9yZXBvc2l0b3J5PgotICAgIDx2ZXJzaW9ucy8+Ci0gICAgPGJyYW5jaGVzLz4KLSAgICA8bWFpbGluZ0xpc3RzLz4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5nbGFmb3JnZTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5HdWlsbGF1bWUgTGFmb3JnZTwvbmFtZT4KLSAgICAgICAgICAgIDxyb2xlcz4KLSAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICAgICAgICAgICAgPHJvbGU+Rm91bmRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgIDwvZGV2ZWxvcGVycz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Z3Jvb3Z5PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1qc3ItMDU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPG5hZ0VtYWlsQWRkcmVzcz5zY21AZ3Jvb3Z5LmNvZGVoYXVzLm9yZzwvbmFnRW1haWxBZGRyZXNzPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx1bml0VGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdW5pdFRlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx1bml0VGVzdD4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC4qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypCdWcuKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPC91bml0VGVzdD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0cz4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tbGljZW5zZS1wbHVnaW48L3JlcG9ydD4gICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L3JlcG9ydD4gICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tcG1kLXBsdWdpbjwvcmVwb3J0PiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tamRlcGVuZC1wbHVnaW48L3JlcG9ydD4gICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlbG9nLXBsdWdpbjwvcmVwb3J0PiAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tZmlsZS1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4gICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tZGV2ZWxvcGVyLWFjdGl2aXR5LXBsdWdpbjwvcmVwb3J0PiAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tanhyLXBsdWdpbjwvcmVwb3J0PiAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPHJlcG9ydD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvcmVwb3J0PgotICAgICAgICA8cmVwb3J0Pm1hdmVuLWp1bml0LXJlcG9ydC1wbHVnaW48L3JlcG9ydD4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tZmFxLXBsdWdpbjwvcmVwb3J0PiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tY2xvdmVyLXBsdWdpbjwvcmVwb3J0PiAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlcy1wbHVnaW48L3JlcG9ydD4gICAgICAgICAgICAtLT4KLSAgICA8L3JlcG9ydHM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc2NyaXB0b20uaW1sIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc2NyaXB0b20uaW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODAyZWMxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NjcmlwdG9tLmltbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bW9kdWxlIHZlcnNpb249IjQiIHJlbGF0aXZlUGF0aHM9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIj4KLSAgPGNvbXBvbmVudCBuYW1lPSJNb2R1bGVSb290TWFuYWdlciIgLz4KLSAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciI+Ci0gICAgPG91dHB1dCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L2NsYXNzZXMiIC8+Ci0gICAgPGV4Y2x1ZGUtb3V0cHV0IC8+Ci0gICAgPGV4Y2x1ZGUtZXhwbG9kZWQgLz4KLSAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+Ci0gICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KLSAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9tYWluIiBpc1Rlc3RTb3VyY2U9ImZhbHNlIiAvPgotICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3Rlc3QiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KLSAgICA8L2NvbnRlbnQ+Ci0gICAgPG9yZGVyRW50cnkgdHlwZT0iaW5oZXJpdGVkSmRrIiAvPgotICAgIDxvcmRlckVudHJ5IHR5cGU9InNvdXJjZUZvbGRlciIgZm9yVGVzdHM9ImZhbHNlIiAvPgotICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgbW9kdWxlLW5hbWU9Ikdyb292eSIgLz4KLSAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUtbGlicmFyeSI+Ci0gICAgICA8bGlicmFyeT4KLSAgICAgICAgPENMQVNTRVM+Ci0gICAgICAgICAgPHJvb3QgdXJsPSJqYXI6Ly8kTU9EVUxFX0RJUiQvbGliL2phY29iLmphciEvIiAvPgotICAgICAgICA8L0NMQVNTRVM+Ci0gICAgICAgIDxKQVZBRE9DIC8+Ci0gICAgICAgIDxTT1VSQ0VTPgotICAgICAgICAgIDxyb290IHVybD0iZmlsZTovL0Q6L2phdmEvbGliL2phY29iIiAvPgotICAgICAgICA8L1NPVVJDRVM+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgPC9vcmRlckVudHJ5PgotICAgIDxvcmRlckVudHJ5UHJvcGVydGllcyAvPgotICA8L2NvbXBvbmVudD4KLTwvbW9kdWxlPgotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3NjcmlwdG9tL0FjdGl2ZVhQcm94eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zY3JpcHRvbS9BY3RpdmVYUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3NDg0OC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3NjcmlwdG9tL0FjdGl2ZVhQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKgotICogQ29weXJpZ2h0IDIwMDUgKEMpIEd1aWxsYXVtZSBMYWZvcmdlLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZAotICogbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weSBvZiB0aGlzIGRvY3VtZW50LgotICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuCi0gKiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLSAqICA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5Ci0gKiAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlCi0gKiBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0gKiAgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2NyaXB0b207Ci0KLWltcG9ydCBjb20uamFjb2IuYWN0aXZlWC5BY3RpdmVYQ29tcG9uZW50OwotaW1wb3J0IGNvbS5qYWNvYi5jb20uVmFyaWFudDsKLWltcG9ydCBjb20uamFjb2IuY29tLkRpc3BhdGNoOwotaW1wb3J0IGNvbS5qYWNvYi5jb20uRGlzcGF0Y2hFdmVudHM7Ci1pbXBvcnQgY29tLmphY29iLmNvbS5Db21UaHJlYWQ7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKLQotLyoqCi0gKiA8cD5EeW5hbWljIEdyb292eSBwcm94eSBhcm91bmQgQWN0aXZlWCBDT00gY29tcG9uZW50cy48L3A+Ci0gKgotICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQotICogQGF1dGhvciBEaWVyayBLb2VuaWcsIGFkYXB0ZWQgdG8gSmFjb2IgMS45Ci0gKiBAYXV0aG9yIE1hcmMgR3VpbGxlbW90Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmVYUHJveHkgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0Ci17Ci0gICAgcHJpdmF0ZSBBY3RpdmVYQ29tcG9uZW50IGFjdGl2ZXg7Ci0gICAgcHJpdmF0ZSBFdmVudFN1cHBvcnQgZXZlbnRTdXBwb3J0OwotICAgIHByaXZhdGUgYm9vbGVhbiByZWxlYXNlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGQgYSBHcm9vdnlPYmplY3QgcHJveHkgZm9yIGFuIEFjdGl2ZVggY29tcG9uZW50LAotICAgICAqIGxldmVyYWdpbmcgR3Jvb3Z5J3MgbWV0YXByb2dyYW1taW5nIGZhY2lsaXRpZXM8L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwPkV4YW1wbGU6PC9wPgotICAgICAqIDxjb2RlPgotICAgICAqIGV4Y2VsID0gbmV3IEFjdGl2ZVhQcm94eSgiRXhjZWwuQXBwbGljYXRpb24iKQotICAgICAqIGV4cGxvcmVyID0gbmV3IEFjdGl2ZVhQcm94eSgiSW50ZXJuZXRFeHBsb3Jlci5BcHBsaWNhdGlvbiIpCi0gICAgICogLy8gY2FsbCB3aXRoIEludGVybmV0IEV4cGxvcmVyIGNsc2lkCi0gICAgICogZXhwbG9yZXIgPSBuZXcgQWN0aXZlWFByb3h5KCJjbHNpZDp7MDAwMkRGMDEtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSIpCi0gICAgICogPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNsc0lkIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBvciB0aGUgQ2xhc3MgSUQgb2YgdGhlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aXZlWFByb3h5KGZpbmFsIFN0cmluZyBjbHNJZCkKLSAgICB7Ci0gICAgICAgIENvbVRocmVhZC5Jbml0TVRBKCk7Ci0gICAgICAgIGFjdGl2ZXggPSBuZXcgQWN0aXZlWENvbXBvbmVudChjbHNJZCk7Ci0gICAgICAgIGV2ZW50U3VwcG9ydCA9IG5ldyBFdmVudFN1cHBvcnQoYWN0aXZleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BOYW1lKQotICAgIHsKLSAgICAJY2hlY2tSZWxlYXNlZCgpOwotCi0gICAgCWlmICgiZXZlbnRzIi5lcXVhbHMocHJvcE5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50U3VwcG9ydDsKLQotICAgICAgICByZXR1cm4gdG9SZXR1cm4oYWN0aXZleC5nZXRQcm9wZXJ0eShwcm9wTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBhIG1ldGhvZCBvbiBhbiBBY3RpdmVYIGNvbXBvbmVudAotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBwYXJhbWV0ZXJzIG9mIHRoZSBtZXRob2QgY2FsbAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgcGFyYW1ldGVycykKLSAgICB7Ci0gICAgCWNoZWNrUmVsZWFzZWQoKTsKLSAgICAJCi0gICAgCWlmICgiZ2V0RXZlbnRzIi5lcXVhbHMobWV0aG9kTmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZXZlbnRTdXBwb3J0OwotCi0gICAgICAgIE9iamVjdFtdIG9ianMgPSBJbnZva2VySGVscGVyLmdldEluc3RhbmNlKCkuYXNBcnJheShwYXJhbWV0ZXJzKTsKLSAgICAgICAgVmFyaWFudFtdIHZhcmlhbnRzID0gbmV3IFZhcmlhbnRbb2Jqcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJpYW50c1tpXSA9IG5ldyBWYXJpYW50KFZhcmlhbnRQcm94eS50b1ZhbHVlKG9ianNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9SZXR1cm4oYWN0aXZleC5pbnZva2UobWV0aG9kTmFtZSwgdmFyaWFudHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJvcGVydHkKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ci0gICAgICogQHBhcmFtIG5ld1ZhbHVlICAgICBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAJY2hlY2tSZWxlYXNlZCgpOwotCi0gICAgCWlmICgiZXZlbnRzIi5lcXVhbHMocHJvcGVydHlOYW1lKSkKLSAgICAgICAgICAgIG5ldyBEaXNwYXRjaEV2ZW50cyhhY3RpdmV4LCBuZXdWYWx1ZSk7Ci0gICAgICAgIGFjdGl2ZXguc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgVmFyaWFudChWYXJpYW50UHJveHkudG9WYWx1ZShuZXdWYWx1ZSkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCB0b1JldHVybihPYmplY3Qgb2JqKQotICAgIHsKLSAgICAJY2hlY2tSZWxlYXNlZCgpOwotCi0gICAgCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnRQcm94eSgoVmFyaWFudCkgb2JqKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNwYXRjaCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgVmFyaWFudCB2ID0gbmV3IFZhcmlhbnQoKTsKLSAgICAgICAgICAgIHYucHV0RGlzcGF0Y2goKERpc3BhdGNoKSBvYmopOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYW50UHJveHkodik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWxlYXNlZCgpIHsKLSAgICAJaWYgKHJlbGVhc2VkKSB7Ci0gICAgCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPYmplY3QgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZCIpOwotICAgIAl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZXMgdGhlIENPTSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIHByb3h5LgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgI2ZpbmFsaXplKCl9IGJ1dCBpdCBpcyBzYWZlciB0byBleHBsaWNpdGVseSByZWxlYXNlCi0gICAgICogdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2VzIGluIHBhcnRpY3VsYXIgd2hlbiB1c2VkIGluIGEgc2NyaXB0IGFzIHRoZSBKVk0gbWF5IGRlY2lkZSB0aGF0Ci0gICAgICogaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjZmluYWxpemUoKX0uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgCWlmICghcmVsZWFzZWQpIHsKLQkgICAgICAgIGFjdGl2ZXguc2FmZVJlbGVhc2UoKTsKLQkgICAgICAgIENvbVRocmVhZC5SZWxlYXNlKCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgIAlyZWxlYXNlKCk7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zY3JpcHRvbS9FdmVudFN1cHBvcnQuamF2YSBiL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc2NyaXB0b20vRXZlbnRTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjBjYmEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zY3JpcHRvbS9FdmVudFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogJElkJAotICoKLSAqIENvcHlyaWdodCAyMDA1IChDKSBHdWlsbGF1bWUgTGFmb3JnZS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKLSAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLSAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgotICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0gKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQotICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQotICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tOwotCi1pbXBvcnQgY29tLmphY29iLmFjdGl2ZVguQWN0aXZlWENvbXBvbmVudDsKLWltcG9ydCBjb20uamFjb2IuY29tLkRpc3BhdGNoRXZlbnRzOwotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKLWltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgYSBob29raW5nIG1lY2hhbmlzbSB0byB1c2UgYW4gImV2ZW50cyIgcHJvcGVydHkgYmVsb25naW5nIHRvIHRoZSBBY3RpdmVYUHJveHksCi0gKiBjb250YWluaW5nIGNsb3N1cmVzIGZvciB0aGUgZXZlbnQgaGFuZGxpbmcuCi0gKiA8cC8+Ci0gKiBUaGlzICJldmVudHMiIGlzIGJhY2tlZCBieSBhIE1hcCB0aGF0IGNvbnRhaW5zIGtleXMgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0byBzdWJzY3JpYmUgdG8sCi0gKiBhbmQgY2xvc3VyZXMgcmVwcmVzZW50aW5nIHRoZSBjb2RlIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgotICogPHAvPgotICogSmFjb2IgYWxsb3dzIG9ubHkgdG8gcGFzcyB0byB0aGUgPGNvZGU+RGlzcGF0Y2hFdmVudHM8L2NvZGU+IGNsYXNzLgotICogQnV0IFNjcmlwdG9tIHBhc3MgYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY2xhc3MgaW4gR3Jvb3Z5IHRocm91Z2ggR3Jvb3Z5U2hlbGwsCi0gKiB3aGljaCBkZWxlZ2F0ZXMgY2FsbHMgdG8gdGhlIGNsb3N1cmVzIHN0b3JlZCBpbiB0aGUgTWFwLgotICogPHAvPgotICoKLSAqIDxwPgotICogRXZlbnQgc3VwcG9ydCBjYW4gYmUgZG9uZSBieSBhZGRpbmcgY2xvc3VyZXMgdG8gdGhlIGV2ZW50IG9iamVjdCwKLSAqIHRoZW4gY2FsbGluZyBsaXN0ZW4oKSBtZXRob2Qgd2lsbCBzdWJzY3JpYmUgdG8gYWxsIGV2ZW50czoKLSAqIDxjb2RlPgotICogY29tUHJveHkuZXZlbnRzLlNvbWVFdmVudCA9IHsgLy8gZG8gc29tZXRoaW5nIH0KLSAqIGNvbVByb3h5LmV2ZW50cy5PdGhlckV2ZW50ID0geyAvLyBkbyBzb21ldGhpbmcgZWxzZSB9Ci0gKiBjb21Qcm94eS5ldmVudHMubGlzdGVuKCkKLSAqIDwvY29kZT4KLSAqIDwvcD4KLSAqCi0gKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudFN1cHBvcnQgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0Ci17Ci0gICAgLyoqCi0gICAgICogTWFwIGNvbnRhaW5pbmcgY2xvc3VyZXMgZm9yIGVhY2ggZXZlbnRzIHdoaWNoIGhhcyBiZWVuIHN1YnNjcmliZWQgdG8KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBldmVudEhhbmRsZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFVuZGVybHlpbmcgSmFjb2IgQWN0aXZlWENvbXBvbmVudAotICAgICAqLwotICAgIHByaXZhdGUgQWN0aXZlWENvbXBvbmVudCBhY3RpdmV4OwotCi0gICAgLyoqCi0gICAgICogU291cmNlIGNvZGUgb2YgdGhlIGNsYXNzIGRlYWxpbmcgd2l0aCBldmVudCBzdXBwb3J0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXZlbnRDbGFzc1NvdXJjZUNvZGUgPSAiLy8gbm8gZXZlbnQgc3VwcG9ydCBzY3JpcHQgZ2VuZXJhdGVkIjsKLQotICAgIC8qKgotICAgICAqIEluIHRoZSBjb25zdHJ1Y3Rvciwgd2UgcGFzcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSA8Y29kZT5BY3RpdmVYQ29tcG9uZW50PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3RpdmV4IHRoZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICBFdmVudFN1cHBvcnQoQWN0aXZlWENvbXBvbmVudCBhY3RpdmV4KQotICAgIHsKLSAgICAgICAgdGhpcy5hY3RpdmV4ID0gYWN0aXZleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIGRpcmVjdGx5IGEgY2xvc3VyZSBpbiB0aGUgPGNvZGU+ZXZlbnRIYW5kbGVyczwvY29kZT4gTWFwLAotICAgICAqIG9yIGNhbGwgdGhlIDxjb2RlPmxpc3RlbigpPC9jb2RlPiBwc2V1ZG8tbWV0aG9kIHRoYXQgdHJpZ2dlcnMgdGhlIGNyZWF0aW9uIG9mIHRoZSA8Y29kZT5FdmVudEhhbmRsZXI8L2NvZGU+Ci0gICAgICogYW5kIHJlZ2lzdGVycyBpdCB3aXRoIDxjb2RlPkRpc3BhdGNoRXZlbnRzPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGNsb3N1cmUgdG8gY2FsbCwgb3IgdGhlICJsaXN0ZW4iIHBzZXVkby1tZXRob2QuCi0gICAgICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgY2xvc3VyZQotICAgICAqIEByZXR1cm4gcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBjbG9zcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpCi0gICAgewotICAgICAgICBpZiAoImxpc3RlbiIuZXF1YWxzKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtZXRob2RzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBldmVudEhhbmRsZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5hcHBlbmQoIiAgICB2b2lkICIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZXZlbnROYW1lKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIoVmFyaWFudFtdIHZhcmlhbnRzKSB7XG4iKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgIGV2dEhhbmRsZXJzWyciKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGV2ZW50TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiJ10uY2FsbCggVmFyaWFudFByb3h5LmRlZmluZUFycmF5KHZhcmlhbnRzKSApXG4gICAgfVxuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGltZSB0b2tlbiB0byBhdm9pZCBkdXBsaWNhdGUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY2xhc3NTb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgY2xhc3NTb3VyY2UuYXBwZW5kKCJpbXBvcnQgY29tLmphY29iLmNvbS4qXG4iKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoImltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLlZhcmlhbnRQcm94eVxuIikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCJjbGFzcyBFdmVudEhhbmRsZXIiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQodGltZSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIge1xuIikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgZGVmIGV2dEhhbmRsZXJzXG4iKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgICBFdmVudEhhbmRsZXIiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQodGltZSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIoc2NyaXB0QmluZGluZykge1xuIikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgIGV2dEhhbmRsZXJzID0gc2NyaXB0QmluZGluZ1xuIikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgfVxuIikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGhvZHMudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCJ9XG4iKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5ldyBFdmVudEhhbmRsZXIiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQodGltZSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIoYmluZGluZylcbiIpOwotCi0gICAgICAgICAgICAgICAgTWFwIGV2ZW50SGFuZGxlcnNDb250YWluZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcnNDb250YWluZXIucHV0KCJldmVudEhhbmRsZXJzIiwgZXZlbnRIYW5kbGVycyk7Ci0gICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoZXZlbnRIYW5kbGVycyk7Ci0gICAgICAgICAgICAgICAgZXZlbnRDbGFzc1NvdXJjZUNvZGUgPSBjbGFzc1NvdXJjZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIE9iamVjdCBnZW5lcmF0ZWRJbnN0YW5jZSA9IG5ldyBHcm9vdnlTaGVsbChiaW5kaW5nKS5ldmFsdWF0ZShldmVudENsYXNzU291cmNlQ29kZSk7Ci0KLSAgICAgICAgICAgICAgICBuZXcgRGlzcGF0Y2hFdmVudHModGhpcy5hY3RpdmV4LCBnZW5lcmF0ZWRJbnN0YW5jZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjYWxsIHRoZSBjbG9zdXJlIGZyb20gdGhlIGV2ZW50SGFuZGxlcnMgTWFwCi0gICAgICAgICAgICByZXR1cm4gKChDbG9zdXJlKSBldmVudEhhbmRsZXJzLmdldChuYW1lKSkuY2FsbChhcmdzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9ubHkgaWYgYSA8Y29kZT5DbG9zdXJlPC9jb2RlPiBmb3IgZXZlbnQgaGFuZGxpbmcgaXMgcGFzc2VkIGFzIHZhbHVlLgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZSBBY3RpdmVYL0NPTSBjb21wb25lbnQuCi0gICAgICogVGhlIGNsb3N1cmUgaXMgdGhlIGNvZGUgdG8gYmUgZXhlY3V0ZWQgdXBvbiB0aGUgZXZlbnQgYmVpbmcgdHJpZ2dlcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgY2xvc3VyZSB0byBleGVjdXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKQotICAgICAgICAgICAgZXZlbnRIYW5kbGVycy5wdXQocHJvcGVydHksIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXRyaWV2ZXMgdGhlIGFjdGlvbiBldmVudCBjbG9zdXJlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGV2ZW50LjwvcD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZSwgdGhlIGdlbmVyYXRlZCBzY3JpcHRlZCBjYW4gYmUgcmV0cmlldmVkIHdpdGg6Ci0gICAgICogPGNvZGU+Ci0gICAgICogcHJpbnRsbiBjb21Qcm94eS5ldmVudHMuZXZlbnRTb3VyY2VTY3JpcHQKLSAgICAgKiA8L2NvZGU+Ci0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgICAqIEByZXR1cm4gdGhlIGNsb3N1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGluZyBvZiB0aGUgZ2l2ZW4gZXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIC8vIHVzZWQgdG8gcHJpbnQgdGhlIHNvdXJjZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGRlYWxpbmcgd2l0aCBldmVudCBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZQotICAgICAgICBpZiAoImV2ZW50U291cmNlU2NyaXB0Ii5lcXVhbHMocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnRDbGFzc1NvdXJjZUNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV2ZW50SGFuZGxlcnMuZ2V0KHByb3BlcnR5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3NjcmlwdG9tL1ZhcmlhbnRQcm94eS5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zY3JpcHRvbS9WYXJpYW50UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYTZhMi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3NjcmlwdG9tL1ZhcmlhbnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiAkSWQkCi0gKgotICogQ29weXJpZ2h0IDIwMDUgKEMpIEd1aWxsYXVtZSBMYWZvcmdlLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0gKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZAotICogbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weSBvZiB0aGlzIGRvY3VtZW50LgotICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuCi0gKiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLSAqICA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5Ci0gKiAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlCi0gKiBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0gKiAgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2NyaXB0b207Ci0KLWltcG9ydCBjb20uamFjb2IuY29tLkRpc3BhdGNoOwotaW1wb3J0IGNvbS5qYWNvYi5jb20uVmFyaWFudDsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OwotaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiA8cD5Qcm94eSBjbGFzcyBmb3IgYWxsIFZhcmlhbnQgb2JqZWN0cy48L3A+Ci0gKiA8cD5Gb3IgdGhlIEphY29iIGxpYnJhcnksIGEgVmFyaWFudCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIENPTSBjb21wb25lbnQ6Ci0gKiBpdCBjYW4gYmUgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHksIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBDT00gbWV0aG9kIGNhbGwuPC9wPgotICoKLSAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAqIEBhdXRob3IgRGllcmsgS29lbmlnLCBhZGFwdGVkIHRvIEphY29iIDEuOQotICogQGF1dGhvciBNYXJjIEd1aWxsZW1vdCwgYWRhcHRlZCB0byBKYWNvYiAxLjEwLjEKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhbnRQcm94eSBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQKLXsKLSAgICBwcml2YXRlIFZhcmlhbnQgdmFyaWFudDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBWYXJpYW50IHdyYXBwZWQgaW4gYSBHcm9vdnlPYmplY3QgcHJveHkgKEdyb292eSdzIG1ldGFwcm9ncmFtbWluZyBmYWNpbGl0aWVzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YXIgdGhlIHZhcmlhbnQgdG8gd3JhcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmFyaWFudFByb3h5KFZhcmlhbnQgdmFyKQotICAgIHsKLSAgICAgICAgdmFyaWFudCA9IHZhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIEdyb292eSBnZW5lcmF0ZWQgZXZlbnQgc3VwcG9ydCBjbGFzcwotICAgICAqIHRvIHRyYW5zZm9ybSBWYXJpYW50IGFycmF5cyB0byBWYXJpYW50UHJveHkgYXJyYXlzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiBhIFZhcmlhbnRbXSBhcnJheQotICAgICAqIEByZXR1cm4gYSBWYXJpYW50UHJveHlbXSBhcnJheQotICAgICAqLwotICAgIHN0YXRpYyBWYXJpYW50UHJveHlbXSBkZWZpbmVBcnJheShPYmplY3Qgb2JqKQotICAgIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhbnRbXSkgewotICAgICAgICAgICAgVmFyaWFudFtdIHZhcmlhbnRzID0gKFZhcmlhbnRbXSlvYmo7Ci0gICAgICAgICAgICBWYXJpYW50UHJveHlbXSBhcnJheSA9IG5ldyBWYXJpYW50UHJveHlbdmFyaWFudHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBuZXcgVmFyaWFudFByb3h5KHZhcmlhbnRzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiBhcnJheTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFyaWFudFByb3h5WzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHRvIHRoZSBwcm9wZXJ0eSBuYW1lZCBwYXNzZWQgYXMgYXJndW1lbnQuPGIvPgotICAgICAqIFRoZSBwcm9wZXJ0eSBuYW1lIDxjb2RlPnZhbHVlPC9jb2RlPiB3aWxsIHJldHVybiB0aGUgcmVhbCB2YWx1ZSBvZiB0aGUgVmFyaWFudCwgbm90IGEgcHJveHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlLgotICAgICAqIEByZXR1cm4gdGhlIFZhcmlhbnQgcHJveHksIG9yIHRoZSByZWFsIHZhbHVlIGlmIDxjb2RlPnByb3BlcnR5LmVxdWFscygidmFsdWUiKTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmICgidmFsdWUiLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICByZXR1cm4gdG9PYmplY3QodmFyaWFudCk7Ci0gICAgICAgIHJldHVybiBuZXcgVmFyaWFudFByb3h5KERpc3BhdGNoLmdldCh2YXJpYW50LnRvRGlzcGF0Y2goKSwgcHJvcGVydHkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJlYWwgdmFsdWUgd3JhcHBlZCBpbnNpZGUgdGhlIHZhcmlhbnQuPGIvPgotICAgICAqCi0gICAgICogQHBhcmFtIHYgdGhlIHZhcmlhbnQgdG8gcmV0cmlldmUgdGhlIHJlYWwgdmFsdWUgZnJvbQotICAgICAqIEByZXR1cm4gdGhlIHJlYWwgdmFsdWUgb2YgdGhlIHZhcmlhbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB0b09iamVjdChWYXJpYW50IHYpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHYuZ2V0dnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRFbXB0eToKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WYXJpYW50TnVsbDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WYXJpYW50U2hvcnQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCh2LnRvU2hvcnQoKSk7Ci0gICAgICAgICAgICBjYXNlIFZhcmlhbnQuVmFyaWFudEludDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodi50b0ludCgpKTsKLSAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WYXJpYW50RmxvYXQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdCh2LnRvRmxvYXQoKSk7Ci0gICAgICAgICAgICBjYXNlIFZhcmlhbnQuVmFyaWFudERvdWJsZToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSh2LnRvRG91YmxlKCkpOwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRDdXJyZW5jeToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcodi50b0N1cnJlbmN5KCkpOwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnREYXRlOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHYudG9EYXRlKCkpOwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRTdHJpbmc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WYXJpYW50RGlzcGF0Y2g6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgICAgICBjYXNlIFZhcmlhbnQuVmFyaWFudEVycm9yOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih2LnRvRXJyb3IoKSk7Ci0gICAgICAgICAgICBjYXNlIFZhcmlhbnQuVmFyaWFudEJvb2xlYW46Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKHYudG9Cb29sZWFuKCkpOwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRWYXJpYW50OgotICAgICAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRPYmplY3Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHYudG9PYmplY3QoKTsKLSAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WYXJpYW50Qnl0ZToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUodi50b0J5dGUoKSk7Ci0gICAgICAgICAgICBjYXNlIFZhcmlhbnQuVmFyaWFudFR5cGVNYXNrOgotICAgICAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRBcnJheToKLSAgICAgICAgICAgICAgICByZXR1cm4gdi50b1NhZmVBcnJheSgpOwotICAgICAgICAgICAgY2FzZSBWYXJpYW50LlZhcmlhbnRCeXJlZjoKLSAgICAgICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJvcGVydHkgb2YgdGhlIHVuZGVybHlpbmcgdmFyaWFudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGFuZ2UKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgIERpc3BhdGNoLnB1dCh2YXJpYW50LnRvRGlzcGF0Y2goKSwgcHJvcGVydHksIHRvVmFsdWUobmV3VmFsdWUpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgT2JqZWN0IHRvVmFsdWUoT2JqZWN0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBHcm9vdnkncyBhcml0aG1ldGljczoKLSAgICAgICAgLy8gQmlnSW50ZWdlciBhbmQgQmlnRGVjaW1hbCBhcmVuJ3QgcmVjb2duaXplZCBieSB0aGUgSmFjb2IgbGlicmFyeQotICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKQotICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXcgSW50ZWdlcigoKEJpZ0ludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKQotICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXcgRG91YmxlKCgoQmlnRGVjaW1hbCkgbmV3VmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotICAgICAgICBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEdTdHJpbmcpCi0gICAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgYSBtZXRob2Qgb24gdGhlIHZhcmlhbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAotICAgICAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgbWV0aG9kIGNhbGwKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpCi0gICAgewotICAgICAgICBPYmplY3RbXSBvYmpzID0gSW52b2tlckhlbHBlci5nZXRJbnN0YW5jZSgpLmFzQXJyYXkoYXJncyk7Ci0gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZ2V0VmFsdWUoKSB0byByZXRyaWV2ZSB0aGUgcmVhbCB2YWx1ZSB3cmFwcGVkIGluc2lkZSB0aGUgdmFyaWFudCBvYmplY3QKLSAgICAgICAgaWYgKCJnZXRWYWx1ZSIuZXF1YWxzKG5hbWUpICYmIChvYmpzID09IG51bGwgfHwgb2Jqcy5sZW5ndGggPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdG9PYmplY3QodmFyaWFudCk7Ci0gICAgICAgIFZhcmlhbnRbXSB2YXJpYW50cyA9IG5ldyBWYXJpYW50W29ianMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyaWFudHNbaV0gPSBuZXcgVmFyaWFudCh0b1ZhbHVlKG9ianNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnRQcm94eShEaXNwYXRjaC5jYWxsTih2YXJpYW50LnRvRGlzcGF0Y2goKSwgbmFtZSwgdmFyaWFudHMpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIHZhcmlhbnQuc2FmZVJlbGVhc2UoKTsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvc2NyaXB0L2V4Y2VsLmdyb292eSBiL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvZXhjZWwuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE4MDRhLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvZXhjZWwuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zY3JpcHRvbS5BY3RpdmVYUHJveHkKLQotLy8gY3JlYXRlIGEgcHJveHkgZm9yIEV4Y2VsCi14bHMgPSBuZXcgQWN0aXZlWFByb3h5KCJFeGNlbC5BcHBsaWNhdGlvbiIpCi14bHMuVmlzaWJsZSA9IHRydWUKLQotVGhyZWFkLnNsZWVwKDEwMDApCi0KLS8vIGdldCB0aGUgd29ya2Jvb2tzIG9iamVjdAotd29ya2Jvb2tzID0geGxzLldvcmtib29rcwotLy8gYWRkIGEgbmV3IHdvcmtib29rCi13b3JrYm9vayAgPSB3b3JrYm9va3MuQWRkKCkKLQotLy8gc2VsZWN0IHRoZSBhY3RpdmUgc2hlZXQKLXNoZWV0ID0gd29ya2Jvb2suQWN0aXZlU2hlZXQKLQotLy8gZ2V0IGEgaGFuZGxlIG9uIHR3byBjZWxscwotYTEgPSBzaGVldC5SYW5nZSgnQTEnKQotYTIgPSBzaGVldC5SYW5nZSgnQTInKQotCi0vLyBzZXRzIGEgdmFsdWUgZm9yIEExCi1hMS5WYWx1ZSAgID0gMTIzLjQ1NgotLy8gZGVmaW5lcyBhIGZvcm11bGEgaW4gQTIKLWEyLkZvcm11bGEgPSAnPUExKjInCi0KLXByaW50bG4gImExOiAke2ExLlZhbHVlLnZhbHVlfSIKLXByaW50bG4gImEyOiAke2EyLlZhbHVlLmdldFZhbHVlKCl9IgotCi0vLyBjbG9zZSB0aGUgd29ya2Jvb2sgd2l0aG91dCBhc2tpbmcgZm9yIHNhdmluZyB0aGUgZmlsZQotd29ya2Jvb2suQ2xvc2UoZmFsc2UsIG51bGwsIGZhbHNlKQotLy8gcXVpdHMgZXhjZWwKLXhscy5RdWl0KCkKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvaWUuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC9pZS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjhlOTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC9pZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLkFjdGl2ZVhQcm94eQotCi0vLyBpbnN0YW5jaWF0ZSBJbnRlcm5ldCBFeHBsb3JlcgotZXhwbG9yZXIgPSBuZXcgQWN0aXZlWFByb3h5KCJJbnRlcm5ldEV4cGxvcmVyLkFwcGxpY2F0aW9uIikKLQotLy8gc2V0IGl0cyBwcm9wZXJ0aWVzCi1leHBsb3Jlci5WaXNpYmxlID0gdHJ1ZQotZXhwbG9yZXIuQWRkcmVzc0JhciA9IHRydWUKLQotLy8gbmF2aWdhdGUgdG8gYSBzaXRlCi1leHBsb3Jlci5OYXZpZ2F0ZSgiaHR0cDovL2dsYWZvcmdlLmZyZWUuZnIvd2VibG9nIikKLVRocmVhZC5zbGVlcCgxMDAwKQotZXhwbG9yZXIuU3RhdHVzVGV4dCA9ICJHdWlsbGF1bWUgTGFmb3JnZSdzIHdlYmxvZyIKLVRocmVhZC5zbGVlcCgyMDAwKQotCi0vLyBxdWl0IEludGVybmV0IEV4cGxvcmVyCi1leHBsb3Jlci5RdWl0KCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvc2NyaXB0L291dGxvb2suZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC9vdXRsb29rLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkNTA2Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvc2NyaXB0L291dGxvb2suZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gRXhhbXBsZSBob3cgdG8gYWNjZXNzIE1TIE91dGxvb2sgZnJvbSBHcm9vdnkgU2NyaXB0b20gZm9yIHJlYWRpbmcKLS8vIHRhc2tzIGFuZCBhcHBvaW50bWVudHMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gLS1EaWVyayBLb2VuaWcKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc2NyaXB0b20uQWN0aXZlWFByb3h5Ci0KLW5hbWVzcGFjZSA9IG5ldyBBY3RpdmVYUHJveHkoIk91dGxvb2suQXBwbGljYXRpb24iKS5nZXROYW1lc3BhY2UoJ01BUEknKQotCi1DQUxFTkRBUl9GT0xERVIgPSAgOQotVEFTS19GT0xERVIgPSAgICAgMTMKLQotYXBwb2ludG1lbnRBdHRyaWJzID0gJycnCi0Jc3RhcnQgZW5kIGR1cmF0aW9uIHN1YmplY3QgbG9jYXRpb24gYWxsZGF5ZXZlbnQgCi0Jb3JnYW5pemVyIGltcG9ydGFuY2Ugc2Vuc2l0aXZpdHkgYm9keScnJwotCi10YXNrQXR0cmlicyA9ICcnJwotCWJvZHkgaW1wb3J0YW5jZSBsYXN0bW9kaWZpY2F0aW9udGltZSBtaWxlYWdlIG5vYWdpbmcgc2F2ZWQgc2Vuc2l0aXZpdHkgc2l6ZSAKLQlzdWJqZWN0IHVucmVhZCBhY3R1YWx3b3JrIGNvbXBsZXRlIGNvbnRhY3RuYW1lcyBkYXRlY29tcGxldGVkIGRlbGVnYXRpb25zdGF0ZSAKLQlkZWxlZ2F0b3IgZHVlZGF0ZSBpc3JlY3VycmluZyBvcmRpbmFsIG93bmVyIG93bmVyc2hpcCBwZXJjZW50Y29tcGxldGUgcmVjaXBpZW50cyAKLQlyZW1pbmRlcnRpbWUgcmVtaW5kZXJvdmVycmlkZWRlZmF1bHQgcmVzcG9uc2VzdGF0ZSByb2xlIHN0YXJ0ZGF0ZSBzdGF0dXMgCi0Jc3RhdHVzb25jb21wbGV0aW9ucmVjaXBpZW50cyBzdGF0dXN1cGRhdGVyZWNpcGllbnRzIHRlYW10YXNrIHRvdGFsd29yayAKLQlnZXRyZWN1cnJlbmNlcGF0dGVybiBzdGF0dXNyZXBvcnQnJycKLQotcHJpbnQoQ0FMRU5EQVJfRk9MREVSLCBhcHBvaW50bWVudEF0dHJpYnMpCi1wcmludChUQVNLX0ZPTERFUiwgICAgIHRhc2tBdHRyaWJzKQotCi0KLWRlZiBwcmludCAoZm9sZGVyLCBhdHRyaWJ1dGVzKSB7Ci0JZW50cmllcyA9IG5hbWVzcGFjZS5nZXREZWZhdWx0Rm9sZGVyKGZvbGRlcikKLQlhdHRyaWJ1dGVfbGlzdCA9IGF0dHJpYnV0ZXMuc3BsaXQoL1xzKy8pLmZpbmRBbGx7aXQuc2l6ZSgpPjB9Ci0JY291bnQgPSBlbnRyaWVzLkl0ZW1zLmNvdW50LnZhbHVlCi0JZm9yIChpIGluIDEuLmNvdW50KSB7Ci0JCWVudHJ5ID0gZW50cmllcy5JdGVtcy5pdGVtKGkpCi0JCWF0dHJpYnV0ZV9saXN0LmVhY2gge2F0dHIgLT4gcHJpbnRsbiBhdHRyICsiXHQ6XHQiICsgZW50cnlbYXR0cl0udmFsdWUgfQotCQlwcmludGxuICctLS0tJwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvc2hlbGwuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC9zaGVsbC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWViNGUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC9zaGVsbC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLkFjdGl2ZVhQcm94eQotCi0vLyBzaG93aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotY21kID0gbmV3IEFjdGl2ZVhQcm94eSgiU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QiKQotcHJpbnRsbiBjbWQuR2V0QWJzb2x1dGVQYXRoTmFtZSgiLiIpLnZhbHVlCi0KLXNoID0gbmV3IEFjdGl2ZVhQcm94eSgiU2hlbGwuQXBwbGljYXRpb24iKQotCi0vLyBtaW5pbWl6aW5nIGFsbCBvcGVuZWQgd2luZG93cwotc2guTWluaW1pemVBbGwoKQotCi0vLyBvcGVucyBhbiBFeHBsb3JlciBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotc2guRXhwbG9yZShjbWQuR2V0QWJzb2x1dGVQYXRoTmFtZSgiLiIpLnZhbHVlKQotCi0vLyBjaG9vc2luZyBhIGZvbGRlciBmcm9tIGEgbmF0aXZlIHdpbmRvd3MgZGlyZWN0b3J5IGNob29zZXIKLWZvbGRlciA9IHNoLkJyb3dzZUZvckZvbGRlcigwLCAiQ2hvb3NlIGEgZm9sZGVyIiwgMCkKLXByaW50bG4gZm9sZGVyLkl0ZW1zKCkuSXRlbSgpLlBhdGgudmFsdWUKLQotd3NoZWxsID0gbmV3IEFjdGl2ZVhQcm94eSgiV1NjcmlwdC5TaGVsbCIpCi0vLyBjcmVhdGUgYSBwb3B1cAotd3NoZWxsLnBvcHVwKCJHcm9vdnkgcG9wdXAiKQotCi0vLyBzaG93IHNvbWUga2V5IGZyb20gdGhlIHJlZ2lzdHJ5Ci1wcmludGxuIHdzaGVsbC5SZWdSZWFkKCJIS0VZX0NVUlJFTlRfVVNFUlxcU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEludGVybmV0IFNldHRpbmdzXFxVc2VyIEFnZW50IikudmFsdWUKLQotbmV0ID0gbmV3IEFjdGl2ZVhQcm94eSgiV1NjcmlwdC5OZXR3b3JrIikKLS8vIHByaW50cyB0aGUgY29tcHV0ZXIgbmFtZQotcHJpbnRsbiBuZXQuQ29tcHV0ZXJOYW1lLnZhbHVlCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvc2NyaXB0L3Zic2NyaXB0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvdmJzY3JpcHQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGM0OTFmLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvdmJzY3JpcHQuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLkFjdGl2ZVhQcm94eQotCi0vLyBpbnZva2Ugc29tZSBWQlNjcmlwdCBmcm9tIEdyb292eSBhbmQgZ2V0IHRoZSByZXN1bHRzIQotc2MgPSBuZXcgQWN0aXZlWFByb3h5KCJTY3JpcHRDb250cm9sIikKLXNjLkxhbmd1YWdlID0gIlZCU2NyaXB0IgotcHJpbnRsbiBzYy5FdmFsKCIxICsgMSIpLnZhbHVlCi0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvd21wbGF5ZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC93bXBsYXllci5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzYyN2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC93bXBsYXllci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLkFjdGl2ZVhQcm94eQotCi1kZWYgZm9sZGVyTmFtZSA9ICIuIgotcHJpbnRsbiAiUGxheWluZyBmaWxlcyBmcm9tOiAke2ZvbGRlck5hbWV9IgotCi0vLyBjcmVhdGUgYSBXaW5kb3dzIE1lZGlhIFBsYXllciAoZnJvbSBpdHMgQ2xhc3MgSUQpCi1kZWYgcGxheWVyID0gbmV3IEFjdGl2ZVhQcm94eSgiY2xzaWQ6ezZCRjUyQTUyLTM5NEEtMTFEMy1CMTUzLTAwQzA0Rjc5RkFBNn0iKQotCi0vLyByZWFjdCB1cG9uIGEgc3RhdGUgY2hhbmdlCi1wbGF5ZXIuZXZlbnRzLlBsYXlTdGF0ZUNoYW5nZSA9IHsgdmFyaWFudHMgLT4KLSAgICAvLyBpZiB0aGUgbWVkaWEgZW5kZWQgY2hhbmdlIHRoZSBzdGF0dXMgZmxhZwotICAgIC8vIHNvIHRoYXQgdGhlIG1haW4gdGhyZWFkIG5vdGljZXMgdGhlIGNoYW5nZQotICAgIGlmICh2YXJpYW50c1swXS52YWx1ZSA9PSAxKSBzeW5jaHJvbml6ZWQocGxheWVyKSB7IHBsYXllci5ub3RpZnkoKSB9Ci19Ci0vLyBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGV2ZW50cyB3ZSdyZSBzdWJzcmliZWQgdG8KLXBsYXllci5ldmVudHMubGlzdGVuKCkKLQotLy8gbG9vcCBvdmVyIHRoZSBhdmFpbGFibGUgZmlsZXMgYW5kIHBsYXkgdGhlbQotbmV3IEZpbGUoZm9sZGVyTmFtZSkuZWFjaEZpbGVNYXRjaCh+Ly4qKHdhdnxhdXx3bWF8bXAzKS8pIHsgc29uZyAtPgotICAgIHByaW50bG4gIkxpc3RlbmluZyB0bzogJHNvbmciCi0gICAgcGxheWVyLlVSTCA9IHNvbmcuYWJzb2x1dGVQYXRoCi0gICAgY29udHJvbCA9IHBsYXllci5jb250cm9scy5wbGF5KCkKLSAgICBzeW5jaHJvbml6ZWQocGxheWVyKSB7IHBsYXllci53YWl0KCkgfQotfQotCi0vLyBjbG9zZSB0aGUgcGxheWVyCi1wbGF5ZXIuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC93c2guZ3Jvb3Z5IGIvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3NjcmlwdC93c2guZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYyMWRjLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3NjcmlwdG9tL3NyYy9zY3JpcHQvd3NoLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNjcmlwdG9tLkFjdGl2ZVhQcm94eQotCi1BTFQgCT0gJyUnCi1TSElGVCAJPSAnKycgCi1DVFJMIAk9ICdeJyAKLQotJ2NtZCAvayBub3RlcGFkLmV4ZScuZXhlY3V0ZSgpCi0KLS8vIFdpbmRvd3MgU2NyaXB0aW5nIEhvc3Qgc2hlbGwKLWhvc3QgPSBuZXcgQWN0aXZlWFByb3h5KCJXU2NyaXB0LlNoZWxsIikKLWhvc3QuQXBwQWN0aXZhdGUoIk5vdGVwYWQiKQotCi1UaHJlYWQuc2xlZXAoMTAwMCkKLQotLy8gc29tZSBrZXlzdHJva2VzCi1ob3N0LnNlbmRLZXlzKCcwLzB7VEFCfTAvMXtFTlRFUn0xLzB7VEFCfTEvMXtFTlRFUn0nKQotCi0vLyBmdW5jdGlvbiBrZXkgdG8gaW5zZXJ0IGN1cnJlbnQgZGF0ZQotaG9zdC5zZW5kS2V5cygne0Y1fScpCi0KLS8vIHJlcGxhY2UgYWxsIDAncyBieSB4Ci1ob3N0LnNlbmRLZXlzKENUUkwrJ2gnKQotaG9zdC5zZW5kS2V5cygnMHtUQUJ9eCcpCi1ob3N0LnNlbmRLZXlzKEFMVCsnYScpCi1ob3N0LnNlbmRLZXlzKCd7RVNDfScpCi0KLQotCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvdGVzdC9TY3JpcHRUZXN0LmphdmEgYi9ncm9vdnkvbW9kdWxlcy9zY3JpcHRvbS9zcmMvdGVzdC9TY3JpcHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjQwYTQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMvc2NyaXB0b20vc3JjL3Rlc3QvU2NyaXB0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNjcmlwdCA9Ci0gICAgICAgICJpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zY3JpcHRvbS5BY3RpdmVYUHJveHlcbiIgKwotICAgICAgICAiaW1wb3J0IGNvbS5qYWNvYi5jb20uKlxuIiArCi0gICAgICAgICJkZWYgc2MgPSBuZXcgQWN0aXZlWFByb3h5KFwiU2NyaXB0Q29udHJvbFwiKVxuIiArCi0gICAgICAgICJzYy5ldmVudHMuRXJyb3IgPSB7IHByaW50bG4gXCIhISEgRVJST1IgISEhXCIgfVxuIiArCi0gICAgICAgICJzYy5ldmVudHMubGlzdGVuKClcbiIgKwotICAgICAgICAic2MuTGFuZ3VhZ2UgPSBcIlZCU2NyaXB0XCJcbiIgKwotICAgICAgICAic2MuQWxsb3dVSSA9IHRydWVcbiIgKwotICAgICAgICAic2MuRXZhbChcIitcIikiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaWVTY3JpcHQgPQotICAgICAgICAiaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc2NyaXB0b20uQWN0aXZlWFByb3h5XG4iICsKLSAgICAgICAgImRlZiBleHBsb3JlciA9IG5ldyBBY3RpdmVYUHJveHkoXCJJbnRlcm5ldEV4cGxvcmVyLkFwcGxpY2F0aW9uXCIpXG4iICsKLSAgICAgICAgImV4cGxvcmVyLmV2ZW50cy5PblF1aXQgPSAgICAgICAgICAgeyBwcmludGxuIFwicXVpdGluZ1wiIH1cbiIgKwotICAgICAgICAiZXhwbG9yZXIuZXZlbnRzLkRvY3VtZW50Q29tcGxldGUgPSB7IHByaW50bG4gXCJkb2N1bWVudCBjb21wbGV0ZVwiIH1cbiIgKwotICAgICAgICAiZXhwbG9yZXIuZXZlbnRzLlN0YXR1c1RleHRDaGFuZ2UgPSB7IHByaW50bG4gXCJzdGF0dXMgdGV4dCBjaGFuZ2VkXCIgfVxuIiArCi0gICAgICAgICJleHBsb3Jlci5ldmVudHMubGlzdGVuKClcbiIgKwotICAgICAgICAiZXhwbG9yZXIuVmlzaWJsZSA9IHRydWVcbiIgKwotICAgICAgICAiZXhwbG9yZXIuQWRkcmVzc0JhciA9IHRydWVcbiIgKwotICAgICAgICAiZXhwbG9yZXIuTmF2aWdhdGUoXCJodHRwOi8vZ2xhZm9yZ2UuZnJlZS5mci93ZWJsb2cvXCIpXG4iICsKLSAgICAgICAgIlRocmVhZC5zbGVlcCg1MDAwKVxuIiArCi0gICAgICAgICJleHBsb3Jlci5RdWl0KCkiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvblRocm93bkFuZEV2ZW50VHJpZ2dlcmVkKCkKLSAgICB7Ci0gICAgICAgIEdyb292eVNoZWxsIHNoID0gbmV3IEdyb292eVNoZWxsKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzaC5ldmFsdWF0ZShzY3JpcHQpOwotICAgICAgICAgICAgZmFpbCgiVGhlIGV4cHJlc3Npb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gZXZhbHVhdGVkIHByb3Blcmx5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvLmNsYXNzcGF0aCBiL2dyb292eS9tb2R1bGVzL3htbHJwYy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIxNzAxLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL21haW4iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvdGVzdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9zbWFjay5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvc21hY2t4LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9ncm9vdnktY29yZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvLmN2c2lnbm9yZSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTM4OGQzLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0qLmxvZwotdGFyZ2V0Ci0KLXhtbHJwYy5pbWwKLS5zZXR0aW5ncwotLmZid2FybmluZ3MKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy8ucHJvamVjdCBiL2dyb292eS9tb2R1bGVzL3htbHJwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0YmQ0Zi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT54bWxycGM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL2xpYi9zbWFjay5qYXIgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvbGliL3NtYWNrLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZmMzNS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvbGliL3NtYWNrLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9saWIvc21hY2t4LmphciBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9saWIvc21hY2t4LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhYjhiYy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvbGliL3NtYWNreC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvbWF2ZW4ueG1sIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL21hdmVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlOWY4Ny4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvbWF2ZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iamFyIiB4bWxuczpqPSJqZWxseTpjb3JlIiB4bWxuczp1PSJqZWxseTp1dGlsIiB4bWxuczptYXZlbj0iamVsbHk6bWF2ZW4iIHhtbG5zOmFudD0iamVsbHk6YW50Ij4KLQotICAgIDwhLS0gTmVlZGVkIGdvYWwgZm9yIHRoZSBtdWx0aXByb2plY3QgcmVsZWFzZSBvZiBHcm9vdnkgLS0+Ci0gICAgPGdvYWwgbmFtZT0iZGVmYXVsdCIvPgotCi0gICAgPCEtLSBOZWVkZWQgZ29hbCBmb3IgdGhlIG11bHRpcHJvamVjdCByZWxlYXNlIG9mIEdyb292eSAtLT4KLSAgICA8Z29hbCBuYW1lPSJnZW5lcmF0ZSIvPgotCi0gICAgPCEtLSBFeHBhbmQgdGhlIGNsYXNzcGF0aCB3aXRoIHRoZSBTbWFjayBqYXJzIHVudGlsIHRoZXkgYXJlIGFkZGVkIHRvIGliaWJsaW8gLS0+Ci0gICAgPHByZUdvYWwgbmFtZT0iamF2YTpjb21waWxlIj4KLSAgICAgICAgPGFudDpwYXRoIGlkPSJzbWFjay5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFudDpwYXRoZWxlbWVudCBwYXRoPSIke3Byb2plY3QuaG9tZX1saWIvc21hY2suamFyIi8+Ci0gICAgICAgICAgICA8YW50OnBhdGhlbGVtZW50IHBhdGg9IiR7cHJvamVjdC5ob21lfWxpYi9zbWFja3guamFyIi8+Ci0gICAgICAgIDwvYW50OnBhdGg+Ci0gICAgICAgIDxtYXZlbjphZGRQYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIgcmVmaWQ9InNtYWNrLmNsYXNzcGF0aCIvPgotICAgIDwvcHJlR29hbD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3Byb2plY3QucHJvcGVydGllcyBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9wcm9qZWN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDIzZDIuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3Byb2plY3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLW1hdmVuLmNvbXBpbGUuc291cmNlPTEuNAotbWF2ZW4uY29tcGlsZS50YXJnZXQ9MS40Ci1tYXZlbi50ZXN0LnNvdXJjZT0xLjQKLW1hdmVuLmNvbXBpbGUuZGVwcmVjYXRpb249dHJ1ZQotbWF2ZW4uY29tcGlsZS5kZWJ1Zz10cnVlCi1tYXZlbi5jb21waWxlLm9wdGltaXplPXRydWUKLQotbWF2ZW4uamF2YWRvYy5saW5rcz1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvCi1tYXZlbi5qYXZhZG9jLnNvdXJjZT0xLjQKLQotbWF2ZW4udGVzdC5zZWFyY2guY2xhc3NkaXIgPSB0cnVlCi0KLW1hdmVuLmp1bml0LmZvcms9dHJ1ZQotbWF2ZW4uanVuaXQudXNlZmlsZT10cnVlCi0KLWdyb292eS5pbnN0YWxsLnN0YWdpbmcuZGVzdD0ke21hdmVuLmJ1aWxkLmRpcn0vaW5zdGFsbC8KLW1hdmVuLmh0bWwyeGRvYy5kaXI9JHttYXZlbi5idWlsZC5kaXJ9L2h0bWwKLQotbWF2ZW4ueGRvYy5kYXRlID0gbGVmdAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjb2RlaGF1cyB0aGVtZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1hdmVuLnhkb2MudGhlbWUudXJsPWh0dHA6Ly9jb2RlaGF1cy5vcmcvY29kZWhhdXMtc3R5bGUuY3NzCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFdoZXJlIHRoZSBqYXJzIGFyZSB1cGxvYWRlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1hdmVuLnJlcG8uY2VudHJhbCA9IGRpc3QuY29kZWhhdXMub3JnCi1tYXZlbi5yZXBvLmNlbnRyYWwuZGlyZWN0b3J5ID0gL3d3dy9kaXN0LmNvZGVoYXVzLm9yZwotCi0jbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbgotbWF2ZW4ucmVwby5yZW1vdGU9aHR0cDovL2Rpc3QuY29kZWhhdXMub3JnCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgc3d0IHBsYXRmb3JtCi0jIHBvc3NpYmxlIHZhbHVlcywgd2luMzIsIGxpbnV4LWd0aywgbWFjb3N4Ci0jIAotIyBmb3IgbGludXgtZ3RrIGVuYWJsZSBndGsgZGVwcyBpbiBwcm9qZWN0LnhtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsYXRmb3JtPXdpbjMyCi0jcGxhdGZvcm09bGludXgtZ3RrCi0jcGxhdGZvcm09bWFjb3N4Ci0KLQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3Byb2plY3QueG1sIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI1NTE1Li4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08cHJvamVjdD4KLSAgPHBvbVZlcnNpb24+MzwvcG9tVmVyc2lvbj4KLSAgPGV4dGVuZD4ke2Jhc2VkaXJ9Ly4uLy4uL2dyb292eS1jb3JlL3Byb2plY3QueG1sPC9leHRlbmQ+Ci0gIDxpZD5ncm9vdnkteG1scnBjPC9pZD4KLSAgPGdyb3VwSWQ+Z3Jvb3Z5PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5ncm9vdnkteG1scnBjPC9hcnRpZmFjdElkPgotICA8bmFtZT5ncm9vdnkteG1scnBjPC9uYW1lPgotICA8Y3VycmVudFZlcnNpb24+MC4zPC9jdXJyZW50VmVyc2lvbj4KLSAgPG9yZ2FuaXphdGlvbj4KLSAgICA8bmFtZT5UaGUgQ29kZWhhdXM8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vY29kZWhhdXMub3JnPC91cmw+Ci0gICAgPGxvZ28+aHR0cDovL2NvZGVoYXVzLm9yZy9jb2RlaGF1cy1zbWFsbC5naWY8L2xvZ28+Ci0gIDwvb3JnYW5pemF0aW9uPgotICA8aW5jZXB0aW9uWWVhcj4yMDA0PC9pbmNlcHRpb25ZZWFyPgotICA8cGFja2FnZT5ncm9vdnkubmV0LnhtbHJwYyx1ay5jby53aWxzb24sdWsub3JnLnhtbC5zYXg8L3BhY2thZ2U+Ci0gIDxkZXNjcmlwdGlvbj5BbiBYTUwtUlBDIHBhY2thZ2UgZm9yIEdyb292eTwvZGVzY3JpcHRpb24+Ci0gIDx1cmw+aHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvPC91cmw+Ci0gIDxpc3N1ZVRyYWNraW5nVXJsPmh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9zZWN1cmUvQnJvd3NlUHJvamVjdC5qc3BhP2lkPTEwMjQyJmFtcDtyZXBvcnQ9cm9hZG1hcDwvaXNzdWVUcmFja2luZ1VybD4KLSAgPHNpdGVBZGRyZXNzPmdyb292eS5jb2RlaGF1cy5vcmc8L3NpdGVBZGRyZXNzPgotICA8c2l0ZURpcmVjdG9yeT4vd3d3L2dyb292eS5jb2RlaGF1cy5vcmc8L3NpdGVEaXJlY3Rvcnk+Ci0gIDxyZXBvc2l0b3J5PgotICAgIDxjb25uZWN0aW9uPnNjbTpjdnM6cHNlcnZlcjphbm9ueW1vdXNAY3ZzLmNvZGVoYXVzLm9yZzovc2NtL2N2c3B1YmxpYzpncm9vdnkvbW9kdWxlcy9ncm9vdnkteG1scnBjPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpjdnM6ZXh0OiR7bWF2ZW4udXNlcm5hbWV9QGN2cy5jb2RlaGF1cy5vcmc6L3NjbS9jdnNwdWJsaWM6Z3Jvb3Z5L21vZHVsZXMvZ3Jvb3Z5LXhtbHJwYzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9jdnMuZ3Jvb3Z5LmNvZGVoYXVzLm9yZy92aWV3Y3ZzLmNnaS9ncm9vdnkvbW9kdWxlcy9ncm9vdnkteG1scnBjPC91cmw+Ci0gIDwvcmVwb3NpdG9yeT4KLSAgPHZlcnNpb25zLz4KLSAgPGJyYW5jaGVzLz4KLSAgPG1haWxpbmdMaXN0cy8+Ci0gIDxkZXZlbG9wZXJzPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8aWQ+dHVnPC9pZD4KLSAgICAgIDxuYW1lPkpvaG4gV2lsc29uPC9uYW1lPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICAgIDxyb2xlPkZvdW5kZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICA8L2RldmVsb3BlcnM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmdyb292eTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmdyb292eTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1qc3ItMDU8L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICA8cHJvcGVydGllcy8+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLmIyPC92ZXJzaW9uPgotICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgPHByb3BlcnRpZXMvPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxuYWdFbWFpbEFkZHJlc3M+c2NtQGdyb292eS5jb2RlaGF1cy5vcmc8L25hZ0VtYWlsQWRkcmVzcz4KLSAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHVuaXRUZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC91bml0VGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICA8dW5pdFRlc3Q+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqLypUZXN0Lio8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPioqLypCdWcuKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8cmVzb3VyY2VzPgotICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L3Jlc291cmNlPgotICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC91bml0VGVzdD4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+Ci0gICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3ZpZGVyczwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gIDwvYnVpbGQ+Ci0gIDxyZXBvcnRzPgotICAgIDxyZXBvcnQ+bWF2ZW4tbGljZW5zZS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1wbWQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qZGVwZW5kLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tY2hhbmdlbG9nLXBsdWdpbjwvcmVwb3J0PgotICAgIDxyZXBvcnQ+bWF2ZW4tZmlsZS1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWRldmVsb3Blci1hY3Rpdml0eS1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWp4ci1wbHVnaW48L3JlcG9ydD4KLSAgICA8cmVwb3J0Pm1hdmVuLWphdmFkb2MtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1qdW5pdC1yZXBvcnQtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1mYXEtcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jbG92ZXItcGx1Z2luPC9yZXBvcnQ+Ci0gICAgPHJlcG9ydD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvcmVwb3J0PgotICA8L3JlcG9ydHM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9iaW4vZHVtbXkudHh0IGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9iaW4vZHVtbXkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2UyNTBkLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvYmluL2R1bW15LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBoZXJlIHRvIG1ha2UgQ1ZTIGNoZWNrIG91dCBjcmVhdGUgdGhlIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9jb25mL2R1bW15LnR4dCBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvY29uZi9kdW1teS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTI1MGQuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9jb25mL2R1bW15LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBoZXJlIHRvIG1ha2UgQ1ZTIGNoZWNrIG91dCBjcmVhdGUgdGhlIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL01FVEEtSU5GL3NtYWNrLnByb3ZpZGVycyBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi9NRVRBLUlORi9zbWFjay5wcm92aWRlcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Mzg5OGEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL01FVEEtSU5GL3NtYWNrLnByb3ZpZGVycworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PiANCi08IS0tIFByb3ZpZGVycyBmaWxlIGZvciBTbWFjayBleHRlbnNpb25zIC0tPg0KLTxzbWFja1Byb3ZpZGVycz4gICAgDQotICAgIDwhLS0gSmFiYmVyLVJQQyAtLT4NCi0gICAgPGlxUHJvdmlkZXI+DQotICAgICAgICA8ZWxlbWVudE5hbWU+cXVlcnk8L2VsZW1lbnROYW1lPg0KLSAgICAgICAgPG5hbWVzcGFjZT5qYWJiZXI6aXE6cnBjPC9uYW1lc3BhY2U+DQotICAgICAgICA8Y2xhc3NOYW1lPnVrLmNvLndpbHNvbi5zbWFja3gucHJvdmlkZXJzLkphYmJlclJQQ1Byb3ZpZGVyPC9jbGFzc05hbWU+DQotICAgIDwvaXFQcm92aWRlcj4NCi08L3NtYWNrUHJvdmlkZXJzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi9ncm9vdnkvbmV0L2h0dHAvSFRUUFNlcnZlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQvaHR0cC9IVFRQU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTY3Y2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQvaHR0cC9IVFRQU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC5odHRwOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLQotaW1wb3J0IHVrLmNvLndpbHNvbi5uZXQuTWluTUxTb2NrZXRTZXJ2ZXI7Ci1pbXBvcnQgdWsuY28ud2lsc29uLm5ldC5odHRwLk1pbk1MSFRUUFNlcnZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBIVFRQU2VydmVyIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIHVzZXJBZ2VudCA9ICJVc2VyLUFnZW50OiBHcm9vdnkgU2ltcGxlIFdlYiBTZXJ2ZXJcclxuIi5nZXRCeXRlcygpOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbWluV29ya2VyczsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4V29ya2VyczsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4S2VlcEFsaXZlczsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgd29ya2VySWRsZUxpZmU7Ci0gIHByaXZhdGUgZmluYWwgaW50IHNvY2tldFJlYWRUaW1lb3V0OwotICBwcml2YXRlIE1pbk1MU29ja2V0U2VydmVyIHNlcnZlciA9IG51bGw7Ci0gIHByaXZhdGUgQ2xvc3VyZSBnZXRDbG9zdXJlID0gbnVsbDsKLSAgcHJpdmF0ZSBDbG9zdXJlIGhlYWRDbG9zdXJlID0gbnVsbDsKLSAgcHJpdmF0ZSBDbG9zdXJlIHBvc3RDbG9zdXJlID0gbnVsbDsKLSAgcHJpdmF0ZSBDbG9zdXJlIHB1dENsb3N1cmUgPSBudWxsOwotICAKLSAgcHVibGljIEhUVFBTZXJ2ZXIoZmluYWwgaW50IG1pbldvcmtlcnMsIGZpbmFsIGludCBtYXhXb3JrZXJzLCBmaW5hbCBpbnQgbWF4S2VlcEFsaXZlcywgZmluYWwgaW50IHdvcmtlcklkbGVMaWZlLCBmaW5hbCBpbnQgc29ja2V0UmVhZFRpbWVvdXQpIHsKLSAgICB0aGlzLm1pbldvcmtlcnMgPSBtaW5Xb3JrZXJzOwotICAgIHRoaXMubWF4V29ya2VycyA9IG1heFdvcmtlcnM7Ci0gICAgdGhpcy5tYXhLZWVwQWxpdmVzID0gbWF4S2VlcEFsaXZlczsKLSAgICB0aGlzLndvcmtlcklkbGVMaWZlID0gd29ya2VySWRsZUxpZmU7Ci0gICAgdGhpcy5zb2NrZXRSZWFkVGltZW91dCA9IHNvY2tldFJlYWRUaW1lb3V0OwotICB9Ci0gIAotICBwdWJsaWMgSFRUUFNlcnZlcigpIHsKLSAgICB0aGlzKDIsIDEwLCA4LCA2MDAwMCwgNjAwMDApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNzZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICBpZiAoImdldCIuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eSkgJiYgbmV3VmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICB0aGlzLmdldENsb3N1cmUgPSAoQ2xvc3VyZSkoKENsb3N1cmUpbmV3VmFsdWUpLmNsb25lKCk7Ci0gICAgfSBlbHNlIGlmICgiaGVhZCIuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eSkgJiYgbmV3VmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICB0aGlzLmhlYWRDbG9zdXJlID0gKENsb3N1cmUpKChDbG9zdXJlKW5ld1ZhbHVlKS5jbG9uZSgpOwotICAgIH0gZWxzZSBpZiAoInBvc3QiLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHkpICYmIG5ld1ZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAgICAgdGhpcy5wb3N0Q2xvc3VyZSA9IChDbG9zdXJlKSgoQ2xvc3VyZSluZXdWYWx1ZSkuY2xvbmUoKTsKLSAgICB9IGVsc2UgaWYgKCJwdXQiLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHkpICYmIG5ld1ZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAgICAgdGhpcy5wdXRDbG9zdXJlID0gKENsb3N1cmUpKChDbG9zdXJlKW5ld1ZhbHVlKS5jbG9uZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdXBlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgbmV3VmFsdWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVyU29ja2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpIHN0b3BTZXJ2ZXIoKTsKLSAgICAgIAotICAgICAgZmluYWwgTWluTUxIVFRQU2VydmVyIHNlcnZlciA9IG5ldyBNaW5NTEhUVFBTZXJ2ZXIoc2VydmVyU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5Xb3JrZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4V29ya2VycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heEtlZXBBbGl2ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJJZGxlTGlmZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldFJlYWRUaW1lb3V0KSB7Ci0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgdWsuY28ud2lsc29uLm5ldC5NaW5NTFRocmVhZFBvb2wjbWFrZU5ld1dvcmtlcigpCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgV29ya2VyIG1ha2VOZXdXb3JrZXIoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBIVFRQV29ya2VyKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dldChmaW5hbCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgb3V0LndyaXRlKHZlcnNpb24uZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZShva01lc3NhZ2UpOwotICAgICAgICAgICAgICBvdXQud3JpdGUodXNlckFnZW50KTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlKGhvc3QpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKEhUVFBTZXJ2ZXIudGhpcy5nZXRDbG9zdXJlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIVFRQU2VydmVyLnRoaXMuZ2V0Q2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXXtpbiwgb3V0LCB1cmksIHZlcnNpb259KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGVhZChmaW5hbCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3V0LndyaXRlKHZlcnNpb24uZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZShva01lc3NhZ2UpOwotICAgICAgICAgICAgICBvdXQud3JpdGUodXNlckFnZW50KTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlKGhvc3QpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKEhUVFBTZXJ2ZXIudGhpcy5oZWFkQ2xvc3VyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSFRUUFNlcnZlci50aGlzLmhlYWRDbG9zdXJlLmNhbGwobmV3IE9iamVjdFtde2luLCBvdXQsIHVyaSwgdmVyc2lvbn0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQb3N0KGZpbmFsIElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXQud3JpdGUodmVyc2lvbi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlKG9rTWVzc2FnZSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZSh1c2VyQWdlbnQpOwotICAgICAgICAgICAgICBvdXQud3JpdGUoaG9zdCk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoSFRUUFNlcnZlci50aGlzLnBvc3RDbG9zdXJlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIVFRQU2VydmVyLnRoaXMucG9zdENsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117aW4sIG91dCwgdXJpLCB2ZXJzaW9ufSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1B1dChmaW5hbCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXQud3JpdGUodmVyc2lvbi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlKG9rTWVzc2FnZSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZSh1c2VyQWdlbnQpOwotICAgICAgICAgICAgICBvdXQud3JpdGUoaG9zdCk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoSFRUUFNlcnZlci50aGlzLnB1dENsb3N1cmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhUVFBTZXJ2ZXIudGhpcy5wdXRDbG9zdXJlLmNhbGwobmV3IE9iamVjdFtde2luLCBvdXQsIHVyaSwgdmVyc2lvbn0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgICAKLSAgICAgIAotICAgICAgZmluYWwgVGhyZWFkIHN0YXJ0aW5nVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgIHNlcnZlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgCi0gICAgICBzdGFydGluZ1RocmVhZC5zZXREYWVtb24oZmFsc2UpOwotICAgICAgc3RhcnRpbmdUaHJlYWQuc2V0TmFtZSgiSFRUUCBTZXJ2ZXIgbWFpbiB0aHJlYWQiKTsKLSAgICAgIHN0YXJ0aW5nVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIHNlcnZlciBzaHV0ZG93biBwcm9jZXNzCi0gICAqIFRoaXMgd2lsbCByZXR1cm4gYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHNodXQgZG93biBjb21wbGV0ZWx5Ci0gICAqIEZ1bGwgc2h1dGRvd24gbWF5IHRha2Ugc29tZSB0aW1lCi0gICAqIAotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0aGlzLnNlcnZlci5zaHV0RG93bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTc5NTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL0phYmJlclJQQ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC54bWxycGM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIEphYmJlclJQQ0V4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24gewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBKYWJiZXJSUENFeGNlcHRpb24oZmluYWwgU3RyaW5nIHJlYXNvbikgewotICAgICAgc3VwZXIocmVhc29uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDU2VydmVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjE1MTMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL0phYmJlclJQQ1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAyMDA1IChDKSBKb2huIFdpbHNvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLTQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLTUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLU5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLVRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLUlORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi1TRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLVNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLU9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotKi8KLQotcGFja2FnZSBncm9vdnkubmV0LnhtbHJwYzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckludm9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5YTVBQQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLmZpbHRlci5QYWNrZXRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5wYWNrZXQuSVE7Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5wYWNrZXQuUGFja2V0OwotaW1wb3J0IG9yZy5qaXZlc29mdHdhcmUuc21hY2sucGFja2V0LlByZXNlbmNlOwotCi1pbXBvcnQgdWsuY28ud2lsc29uLm5ldC5NaW5NTEphYmJlclBhY2tldFNlcnZlcjsKLWltcG9ydCB1ay5jby53aWxzb24ubmV0LnhtbHJwYy5YTUxSUENGYWlsRXhjZXB0aW9uOwotaW1wb3J0IHVrLmNvLndpbHNvbi5zbWFja3gucGFja2V0LkphYmJlclJQQzsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBKYWJiZXJSUENTZXJ2ZXIgZXh0ZW5kcyBSUENTZXJ2ZXIgewotICBzdGF0aWMgZmluYWwgU3RyaW5nIHN0YXJ0RXJyb3IgPSAoIjxtZXRob2RSZXNwb25zZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQ8ZmF1bHQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHQ8dmFsdWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdDxzdHJ1Y3Q+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdFx0PG1lbWJlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDxuYW1lPmZhdWx0Q29kZTwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDx2YWx1ZT48aW50PiIpOwotICBzdGF0aWMgZmluYWwgU3RyaW5nIG1pZGRsZUVycm9yID0gKCI8L2ludD48L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdDwvbWVtYmVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdDxtZW1iZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdFx0XHQ8bmFtZT5mYXVsdFN0cmluZzwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDx2YWx1ZT48c3RyaW5nPiIpOwotICBzdGF0aWMgZmluYWwgU3RyaW5nIGVuZEVycm9yID0gKCI8L3N0cmluZz48L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHQ8L21lbWJlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdDwvc3RydWN0PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHRcdDwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdDwvZmF1bHQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8L21ldGhvZFJlc3BvbnNlPlxuIik7Ci0gIAotICBwdWJsaWMgSmFiYmVyUlBDU2VydmVyKGZpbmFsIGludCBtaW5Xb3JrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhXb3JrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3b3JrZXJJZGxlTGlmZSkKLSAgewotICAgIHRoaXMubWluV29ya2VycyA9IG1pbldvcmtlcnM7Ci0gICAgdGhpcy5tYXhXb3JrZXJzID0gbWF4V29ya2VyczsKLSAgICB0aGlzLndvcmtlcklkbGVMaWZlID0gd29ya2VySWRsZUxpZmU7Ci0gIH0KLQotICBwdWJsaWMgSmFiYmVyUlBDU2VydmVyKCkgewotICAgIHRoaXMoMiwgMTAsIDYwMDAwKTsKLSAgfQotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBYTVBQQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgCi0gICAgdGhpcy5jb25uZWN0aW9uLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdGlvbkNsb3NlZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWJiZXJSUENTZXJ2ZXIudGhpcy5zZXJ2ZXIuc2h1dERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdGlvbkNsb3NlZE9uRXJyb3IoZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWJiZXJSUENTZXJ2ZXIudGhpcy5zZXJ2ZXIuc2h1dERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kUGFja2V0KG5ldyBQcmVzZW5jZShQcmVzZW5jZS5UeXBlLkFWQUlMQUJMRSwgIkphYmJlci5SUEMgU2VydmVyIiwgNSwgUHJlc2VuY2UuTW9kZS5BVkFJTEFCTEUpKTsKLSAgICAKLSAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkgc3RvcFNlcnZlcigpOwotICAgIAotICAgIHRoaXMuc2VydmVyID0gbmV3IE1pbk1MSmFiYmVyUGFja2V0U2VydmVyKGNvbm5lY3Rpb24uY3JlYXRlUGFja2V0Q29sbGVjdG9yKG5ldyBQYWNrZXRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KGZpbmFsIFBhY2tldCBwYWNrZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXQgaW5zdGFuY2VvZiBKYWJiZXJSUEMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSmFiYmVyUlBDKXBhY2tldCkuZ2V0VHlwZSgpID09IElRLlR5cGUuU0VUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldvcmtlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4V29ya2VycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJJZGxlTGlmZSkgewotICAgICAgCi0gICAgICBwcm90ZWN0ZWQgV29ya2VyIG1ha2VOZXdXb3JrZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSmFiYmVyUGFja2V0V29ya2VyKCkgewotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3MoZmluYWwgT2JqZWN0IHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICBmaW5hbCBKYWJiZXJSUEMgcmVxdWVzdCA9IChKYWJiZXJSUEMpcmVzb3VyY2U7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBYTUxSUENNZXNzYWdlUHJvY2Vzc29yIHJlcXVlc3RQYXJzZXIgPSBuZXcgWE1MUlBDTWVzc2FnZVByb2Nlc3NvcigpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmVxdWVzdFBhcnNlci5wYXJzZU1lc3NhZ2UocmVxdWVzdC5nZXRDaGlsZEVsZW1lbnRYTUwoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgPSByZXF1ZXN0UGFyc2VyLmdldE1ldGhvZG5hbWUoKTsKLSAgICAgICAgICAgICAgZmluYWwgTGlzdCBwYXJhbXMgPSByZXF1ZXN0UGFyc2VyLmdldFBhcmFtcygpOwotICAgICAgICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSlKYWJiZXJSUENTZXJ2ZXIudGhpcy5yZWdpc3RlcmVkTWV0aG9kcy5nZXQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKEphYmJlclJQQ1NlcnZlci50aGlzLnByZUNhbGxNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEphYmJlclJQQ1NlcnZlci50aGlzLnByZUNhbGxNZXRob2QuY2FsbChuZXcgT2JqZWN0W10ge21ldGhvZE5hbWUsIHBhcmFtcy50b0FycmF5KCl9KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGNsb3N1cmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChKYWJiZXJSUENTZXJ2ZXIudGhpcy5kZWZhdWx0TWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzZXJ2ZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gSmFiYmVyUlBDU2VydmVyLnRoaXMuZGVmYXVsdE1ldGhvZC5jYWxsKG5ldyBPYmplY3RbXSB7bWV0aG9kTmFtZSwgcGFyYW1zLnRvQXJyYXkoKX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNsb3N1cmUuY2FsbChwYXJhbXMudG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBuZXcgSW50ZWdlcigwKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmIChKYWJiZXJSUENTZXJ2ZXIudGhpcy5wb3N0Q2FsbE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSmFiYmVyUlBDU2VydmVyLnRoaXMucG9zdENhbGxNZXRob2QuY2FsbChuZXcgT2JqZWN0W10ge21ldGhvZE5hbWUsIHJlc3VsdH0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBYTUxSUENNZXNzYWdlUHJvY2Vzc29yLmVtaXRSZXN1bHQoYnVmZmVyLCByZXN1bHQpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QsIGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotLy8gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29kZVZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW52b2tlckludm9jYXRpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBlID0gKChJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbillKS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFhNTFJQQ0ZhaWxFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gKChYTUxSUENGYWlsRXhjZXB0aW9uKWUpLmdldEZhdWx0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgY29kZVZhbHVlID0gKChYTUxSUENGYWlsRXhjZXB0aW9uKWUpLmdldEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBjb2RlVmFsdWUgPSAwOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoSmFiYmVyUlBDU2VydmVyLnRoaXMuZmF1bHRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICBKYWJiZXJSUENTZXJ2ZXIudGhpcy5mYXVsdE1ldGhvZC5jYWxsKG5ldyBPYmplY3RbXSB7bWVzc2FnZSwgbmV3IEludGVnZXIoY29kZVZhbHVlKX0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBzd2FsbG93IHRoaXMgYW5kIHJldHVybiB0aGUgb3JnaW5hbCBmYXVsdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdGFydEVycm9yKTsKLSAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihjb2RlVmFsdWUpKTsKLSAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtaWRkbGVFcnJvcik7Ci0gICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKG1lc3NhZ2UgPT0gbnVsbCkgPyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogbWVzc2FnZSk7Ci0gICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW5kRXJyb3IpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHJlcXVlc3QsIGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRSZXNwb25zZShmaW5hbCBKYWJiZXJSUEMgcmVxdWVzdCwgZmluYWwgU3RyaW5nIHJlc3BvbnNlKSB7Ci0gICAgICAgICAgZmluYWwgSVEgcmVzcG9uc2VQYWNrZXQgPSAgbmV3IEphYmJlclJQQyhyZXNwb25zZS50b1N0cmluZygpKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3BvbnNlUGFja2V0LnNldEZyb20ocmVxdWVzdC5nZXRUbygpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlUGFja2V0LnNldFRvKHJlcXVlc3QuZ2V0RnJvbSgpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlUGFja2V0LnNldFBhY2tldElEKHJlcXVlc3QuZ2V0UGFja2V0SUQoKSk7Ci0gICAgICAgICAgICByZXNwb25zZVBhY2tldC5zZXRUeXBlKElRLlR5cGUuUkVTVUxUKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSmFiYmVyUlBDU2VydmVyLnRoaXMuY29ubmVjdGlvbi5zZW5kUGFja2V0KHJlc3BvbnNlUGFja2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICBmaW5hbCBUaHJlYWQgc3RhcnRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBKYWJiZXJSUENTZXJ2ZXIudGhpcy5zZXJ2ZXIuc3RhcnQoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIAotICAgIHN0YXJ0aW5nVGhyZWFkLnNldERhZW1vbihmYWxzZSk7Ci0gICAgc3RhcnRpbmdUaHJlYWQuc2V0TmFtZSgiSmFiYmVyLVJQQyBTZXJ2ZXIgbWFpbiB0aHJlYWQiKTsKLSAgICBzdGFydGluZ1RocmVhZC5zdGFydCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0aGlzLnNlcnZlci5zaHV0RG93bigpOwotICB9Ci0gIAotICBwcml2YXRlIFhNUFBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0gIHByaXZhdGUgTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgZmluYWwgaW50IG1pbldvcmtlcnM7Ci0gIHByaXZhdGUgZmluYWwgaW50IG1heFdvcmtlcnM7Ci0gIHByaXZhdGUgZmluYWwgaW50IHdvcmtlcklkbGVMaWZlOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL0phYmJlclJQQ1NlcnZlclByb3h5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDU2VydmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExN2ExYS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvSmFiYmVyUlBDU2VydmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgMjAwNSAoQykgSm9obiBXaWxzb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCi0oIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLXRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKLSAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCi0gICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKLSAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKLSAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi00LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgotICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgotCi01LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQotICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKLWBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCi1OT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi1USEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi1JTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi1TVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi1BUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi1PRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSovCi0KLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC54bWxycGM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLlBhY2tldENvbGxlY3RvcjsKLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLlJvc3RlcjsKLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLlhNUFBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5qaXZlc29mdHdhcmUuc21hY2suZmlsdGVyLlBhY2tldEZpbHRlcjsKLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLnBhY2tldC5JUTsKLWltcG9ydCBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLnBhY2tldC5QYWNrZXQ7Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5wYWNrZXQuUHJlc2VuY2U7Ci0KLWltcG9ydCB1ay5jby53aWxzb24ubmV0LnhtbHJwYy5YTUxSUENGYWlsRXhjZXB0aW9uOwotaW1wb3J0IHVrLmNvLndpbHNvbi5zbWFja3gucGFja2V0LkphYmJlclJQQzsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBKYWJiZXJSUENTZXJ2ZXJQcm94eSBleHRlbmRzIFJQQ1NlcnZlclByb3h5IHsKLSAgcHVibGljIEphYmJlclJQQ1NlcnZlclByb3h5KGZpbmFsIFhNUFBDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIFN0cmluZyB0bykgewotICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247ICAgIAotICAgIHRoaXMudG8gPSB0bzsKLSAgICAKLSAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZFBhY2tldChuZXcgUHJlc2VuY2UoUHJlc2VuY2UuVHlwZS5BVkFJTEFCTEUsICJKYWJiZXIuUlBDIENsaWVudCIsIDEsIFByZXNlbmNlLk1vZGUuQVZBSUxBQkxFKSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjaW52b2tlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IGFyZ3MpIHsgIAotICAgIGlmICgiaW52b2tlTWV0aG9kIi5lcXVhbHMobmFtZSkpIHJldHVybiBzdXBlci5pbnZva2VNZXRob2QobmFtZSwgYXJncyk7Ci0gICAgCi0gICAgZmluYWwgT2JqZWN0W10gcGFyYW1zID0gKGFyZ3MgaW5zdGFuY2VvZiBMaXN0KSA/ICgoTGlzdClhcmdzKS50b0FycmF5KCkgOiAoT2JqZWN0W10pYXJnczsKLSAgICBpbnQgbnVtYmVyT2ZwYXJhbXMgPSBwYXJhbXMubGVuZ3RoOwotICAgIAotICAgICAgaWYgKG51bWJlck9mcGFyYW1zICE9IDAgJiYgcGFyYW1zW251bWJlck9mcGFyYW1zIC0gMV0gaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgIG51bWJlck9mcGFyYW1zLS07IC8vIHRoZSBjbG9zdXJlIGlzIG5vdCB0byBiZSBwYXNzZWQgdG8gdGhlIHJlbW90ZSBtZXRob2QKLSAgICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgIGZpbmFsIEphYmJlclJQQyByZXF1ZXN0ID0gbmV3IEphYmJlclJQQyhYTUxSUENNZXNzYWdlUHJvY2Vzc29yLmVtaXRDYWxsKG5ldyBTdHJpbmdCdWZmZXIoKSwgbmFtZSwgcGFyYW1zLCBudW1iZXJPZnBhcmFtcykudG9TdHJpbmcoKSk7Ci0gICAgZmluYWwgUGFja2V0Q29sbGVjdG9yIHJlc3BvbnNlQ29sbGVjdG9yID0gdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVBhY2tldENvbGxlY3RvcihuZXcgUGFja2V0RmlsdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChmaW5hbCBQYWNrZXQgcGFja2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2V0IGluc3RhbmNlb2YgSmFiYmVyUlBDICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChKYWJiZXJSUEMpcGFja2V0KS5nZXRUeXBlKCkgPT0gSVEuVHlwZS5SRVNVTFQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZ2V0UGFja2V0SUQoKS5lcXVhbHMocmVxdWVzdC5nZXRQYWNrZXRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgICAgcmVxdWVzdC5zZXRUeXBlKElRLlR5cGUuU0VUKTsKLSAgICAgIHJlcXVlc3Quc2V0VG8oZ2V0SWQoY29ubmVjdGlvbi5nZXRSb3N0ZXIoKSwgdGhpcy50bykpOwotICAgICAgcmVxdWVzdC5zZXRGcm9tKHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCkpOwotICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmRQYWNrZXQocmVxdWVzdCk7Ci0gICAgICAKLSAgICAgIGZpbmFsIEphYmJlclJQQyByZXNwb25zZSA9IChKYWJiZXJSUEMpcmVzcG9uc2VDb2xsZWN0b3IubmV4dFJlc3VsdCgyMDAwMCk7ICAvLyBUT0RPOiBhbGxvdyB0aGUgdGltZW91dCB0byBiZSBzcGVjaWZpZWQKLSAgICAgIAotICAgICAgcmVzcG9uc2VDb2xsZWN0b3IuY2FuY2VsKCk7Ci0gICAgICAKLSAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB0aHJvdyBuZXcgWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24oImNhbGwgdGltZWQgb3V0IiwgbmV3IEludGVnZXIoMCkpOwotICAgICAgCi0gICAgICBmaW5hbCBYTUxSUENNZXNzYWdlUHJvY2Vzc29yIHJlc3BvbnNlUGFyc2VyID0gbmV3IFhNTFJQQ01lc3NhZ2VQcm9jZXNzb3IoKTsKLQotICAgICAgcmVzcG9uc2VQYXJzZXIucGFyc2VNZXNzYWdlKHJlc3BvbnNlLmdldENoaWxkRWxlbWVudFhNTCgpKTsKLSAgICAgIAotICAgICAgZmluYWwgTGlzdCByZXN1bHQgPSByZXNwb25zZVBhcnNlci5nZXRQYXJhbXMoKTsKLSAgICAgIAotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24oIkVtcHR5IHJlc3BvbnNlIGZyb20gc2VydmVyIiwgbmV3IEludGVnZXIoMCkpOwotICAgICAgCi0gICAgICBpZiAobnVtYmVyT2ZwYXJhbXMgPT0gcGFyYW1zLmxlbmd0aCkgewotICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgwKTsKLSAgICAgIH0gZWxzZSB7ICAKLSAgICAgICAgLy8gcGFzcyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIHRoZSBjbG9zdXJlCi0gICAgICAgIGZpbmFsIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKXBhcmFtc1tudW1iZXJPZnBhcmFtc107Ci0gICAgICAgIAotICAgICAgICBjbG9zdXJlLnNldERlbGVnYXRlKHRoaXMpOwotICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXSB7cmVzdWx0LmdldCgwKX0pOwotICAgICAgfQotICAgICAgCi0gICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFhNTFJQQ0NhbGxGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBuZXcgSW50ZWdlcigwKSk7Ci0gICAgfSBjYXRjaCAoZmluYWwgWE1MUlBDRmFpbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24oZS5nZXRGYXVsdFN0cmluZygpLCBlLmdldENhdXNlKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWQoZmluYWwgUm9zdGVyIHJvc3RlciwgZmluYWwgU3RyaW5nIHRvKSB7Ci0gICAgaW50IHByaTsKLSAgICBpbnQgcmV0cmllcyA9IDIwOwotICAgIFN0cmluZyBwb3NUbyA9IHRvOwotICAgIAotICAgIGRvIHsKLSAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gcm9zdGVyLmdldFByZXNlbmNlcyh0byk7Ci0gICAgCi0gICAgICBwcmkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgIAotICAgICAgaWYgKGl0ZXIgIT0gbnVsbCkgewotICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgewotICAgICAgICBmaW5hbCBQcmVzZW5jZSBwcmVzZW5jZSA9IChQcmVzZW5jZSlpdGVyLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgICAgaWYgKHByZXNlbmNlLmdldFByaW9yaXR5KCkgPiBwcmkpIHsKLSAgICAgICAgICAgIHBvc1RvID0gcHJlc2VuY2UuZ2V0RnJvbSgpOwotICAgICAgICAgICAgcHJpID0gcHJlc2VuY2UuZ2V0UHJpb3JpdHkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHByaSA+PSAwKSBicmVhazsKLSAgICAgIAotICAgICAgaWYgKHJldHJpZXMtLSA+IDApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IEphYmJlclJQQ0V4Y2VwdGlvbigiVXNlciAiICsgcG9zVG8gKyAiIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICh0cnVlKTsKLSAgICAKLSAgICByZXR1cm4gcG9zVG87Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgWE1QUENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG87Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvUlBDU2VydmVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvUlBDU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTIyN2MuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL1JQQ1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAyMDA0LCAyMDA1IChDKSBKb2huIFdpbHNvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLTQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLTUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLU5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLVRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLUlORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi1TRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLVNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLU9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotKi8KLQotcGFja2FnZSBncm9vdnkubmV0LnhtbHJwYzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR1N0cmluZzsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IHVrLmNvLndpbHNvbi5uZXQueG1scnBjLlhNTFJQQ0ZhaWxFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBKb2huIFdpbHNvbgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgUlBDU2VydmVyIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7Ci0gIHByb3RlY3RlZCBmaW5hbCBNYXAgcmVnaXN0ZXJlZE1ldGhvZHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0gIHByb3RlY3RlZCBDbG9zdXJlIGRlZmF1bHRNZXRob2QgPSBudWxsOwotICBwcm90ZWN0ZWQgQ2xvc3VyZSBwcmVDYWxsTWV0aG9kID0gbnVsbDsKLSAgcHJvdGVjdGVkIENsb3N1cmUgcG9zdENhbGxNZXRob2QgPSBudWxsOwotICBwcm90ZWN0ZWQgQ2xvc3VyZSBmYXVsdE1ldGhvZCA9IG51bGw7Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgCXJldHVybiBuZXcgR3Jvb3Z5T2JqZWN0U3VwcG9ydCgpIHsKLSAgCQkvKioKLSAgCQkgKiAKLSAgCQkgKiBBbGxvdyBzZXJ2ZXIuYS5iLmMgPSB7Li4uLn0KLSAgCQkgKiBUaGlzIGRlZWZpbmVzIGEgcmVtb3RlIG1ldGhvZCB3aXRoIHRoZSBuYW1lICJhLmIuYyIKLSAgCQkgKiBUaGlzIHRlY2huaXF1ZSBpcyBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSB0aGUgUHl0aG9uIFhNTC1SUEMgaW1wbGVtZW50YXRpb24KLSAgCQkgKiBUaGFua3MgYW5kIGNyZWRpdCB0byBGcmVkcmlrIEx1bmRoCi0gIAkJICogCi0gIAkJICovCi0gIAkJCQkKLSAgCQlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBwcm9wZXJ0eVByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIocHJvcGVydHkgKyAiLiIpOwotICAJCi0gIAkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgCQkJdGhpcy5wcm9wZXJ0eVByZWZpeC5hcHBlbmQocHJvcGVydHkpLmFwcGVuZCgnLicpOwotICAJCQkKLSAgCQkJcmV0dXJuIHRoaXM7Ci0gIAkJfQotICAJCQotICAJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgYXJncykgewotICAJCQlSUENTZXJ2ZXIudGhpcy5zZXRQcm9wZXJ0eSh0aGlzLnByb3BlcnR5UHJlZml4ICsgbmFtZSwgbmFtZSwgYXJncyk7Ci0gIAkJfQotICAJfTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgbWV0aG9kKSB7Ci0gIAlzZXRQcm9wZXJ0eShtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBtZXRob2QpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBTdHJpbmcgamF2YU1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBtZXRob2QpIHsKLSAgQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLSAgCi0gIAlpZiAobWV0aG9kIGluc3RhbmNlb2YgQ2xvc3VyZSkgewotICAJCS8vCi0gIAkJLy8gVGhpcyBtYWxhcmt5IHdpdGggdGhlIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlzIHRvIGtlZXAgdGhlIGJyb2tlbiBzdW4KLSAgCQkvLyBqYXZhIGNvbXBpbGVyIGZyb20gYmFyZmluZwotICAJCS8vCi0gIAkJdHJ5IHsKLSAgCQkJaWYgKGZhbHNlKSB0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgCQkJY2xvc3VyZSA9IChDbG9zdXJlKSgoKENsb3N1cmUpbWV0aG9kKS5jbG9uZSgpKTsKLSAgCQkJY2xvc3VyZS5zZXREZWxlZ2F0ZSh0aGlzKTsKLSAgCQl9Ci0gIAkJY2F0Y2ggKGZpbmFsIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgCQkJLy8gbmV2ZXIgdGhyb3duCi0gIAkJfQotICAJfSBlbHNlIGlmIChtZXRob2QgaW5zdGFuY2VvZiBDbGFzcykgewotICAJLy8KLSAgCS8vIGNhbGxpbmcgYSBzdGF0aWMgbWV0aG9kIG9uIGEgY2xhc3MKLSAgCS8vCi0gIAkJCi0gIAlmaW5hbCBpbnQgbnVtYmVyb2ZQYXJhbWV0ZXJzID0gZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQywgKChDbGFzcyltZXRob2QpLmdldE1ldGhvZHMoKSwgamF2YU1ldGhvZE5hbWUpOwkJCQotICAJCi0gIAkJaWYgKG51bWJlcm9mUGFyYW1ldGVycyAhPSAtMSkgewotICAJCQljbG9zdXJlID0gbWFrZU1ldGhvZFByb3h5KGphdmFNZXRob2ROYW1lLCBudW1iZXJvZlBhcmFtZXRlcnMsICgoQ2xhc3MpbWV0aG9kKS5nZXROYW1lKCkpOwotICAJCX0gZWxzZSB7Ci0gIAkJCXRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJObyBzdGF0aWMgbWV0aG9kICIKLSAgCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgKyBqYXZhTWV0aG9kTmFtZQotICAJCQkJCQkJCQkJICAgICsgIiBvbiBjbGFzcyAiCi0gIAkJCQkJCQkJCQkJKyAoKENsYXNzKW1ldGhvZCkuZ2V0TmFtZSgpKTsKLSAgCQl9Ci0gIAl9IGVsc2UgewotICAJLy8KLSAgCS8vIGNhbGxpbmcgYSBtZXRob2Qgb24gYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcwotICAJLy8KLSAgCQkKLSAgCWZpbmFsIGludCBudW1iZXJvZlBhcmFtZXRlcnMgPSBnZXROdW1iZXJPZlBhcmFtZXRlcnMoTW9kaWZpZXIuUFVCTElDLCBtZXRob2QuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCksIGphdmFNZXRob2ROYW1lKTsJCQkKLSAgCQotICAJCWlmIChudW1iZXJvZlBhcmFtZXRlcnMgIT0gLTEpIHsKLSAgCQkJY2xvc3VyZSA9IG1ha2VNZXRob2RQcm94eShqYXZhTWV0aG9kTmFtZSwgbnVtYmVyb2ZQYXJhbWV0ZXJzLCAiZGVsZWdhdGUiKTsKLSAgCQkJY2xvc3VyZS5zZXREZWxlZ2F0ZShtZXRob2QpOwotICAJCX0gZWxzZSB7Ci0gIAkJCXRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJObyBtZXRob2QgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBqYXZhTWV0aG9kTmFtZQotICAJCQkJICAgICsgIiBvbiBjbGFzcyAiCi0gIAkJCQkJKyBtZXRob2QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAJCX0KLSAgCX0KLSAgCQotICAJdGhpcy5yZWdpc3RlcmVkTWV0aG9kcy5wdXQobWV0aG9kTmFtZSwgY2xvc3VyZSk7Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXROdW1iZXJPZlBhcmFtZXRlcnMoZmluYWwgaW50IHR5cGUsIGZpbmFsIE1ldGhvZCBtZXRob2RzW10sIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgewotICBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLSAgaW50IG51bWJlcm9mUGFyYW1ldGVycyA9IC0xOwotICAKLSAgCWZvciAoaW50IGkgPSAwOyBpICE9IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgCQlpZiAoKG1ldGhvZHNbaV0uZ2V0TW9kaWZpZXJzKCkgJiB0eXBlKSA9PSB0eXBlKSB7Ci0gIAkJCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHkpKSB7Ci0gIAkJCQlpZiAoZm91bmRNYXRjaCkgewotICAJCQkJCWlmIChudW1iZXJvZlBhcmFtZXRlcnMgIT0gbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCkgewotICAJCQkJCQl0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiTW9yZSB0aGFuIG9uZSBtZXRob2RzICIKLSAgCQkgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5Ci0gIAkJCQkJCQkgICAgKyAiIG9uIGNsYXNzICIKLSAgCQkJCQkJCQkrIG1ldGhvZHNbaV0uZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkKLSAgCQkJCQkJCQkrICIgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzIik7Ci0gIAkJCQkJfQotICAJCQkJfSBlbHNlIHsKLSAgCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgCQkJCQludW1iZXJvZlBhcmFtZXRlcnMgPSBtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOwotICAJCQkJfQotICAJCQl9Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gbnVtYmVyb2ZQYXJhbWV0ZXJzOwotICB9Ci0KLSAgcHJpdmF0ZSBDbG9zdXJlIG1ha2VNZXRob2RQcm94eShmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgaW50IG51bWJlck9mUGFyYW1ldGVycywgZmluYWwgU3RyaW5nIHF1YWxpZmllcikgewotICBmaW5hbCBTdHJpbmcgcGFyYW1JbiwgcGFyYW1PdXQ7Ci0gIAotICAJaWYgKG51bWJlck9mUGFyYW1ldGVycyA9PSAwKSB7Ci0gIAkJcGFyYW1JbiA9IHBhcmFtT3V0ID0gIiI7Ci0gIAl9IGVsc2UgewotICAJZmluYWwgU3RyaW5nQnVmZmVyIHBhcmFtcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgCQotICAJCWZvciAoaW50IGkgPSAwOyBpICE9IG51bWJlck9mUGFyYW1ldGVyczsgaSsrKSB7Ci0gIAkJCXBhcmFtcy5hcHBlbmQoIiwgcCIgKyBpKTsKLSAgCQl9Ci0gIAkJCi0gIAkJcGFyYW1PdXQgPSBwYXJhbXMuZGVsZXRlKDAsIDIpLnRvU3RyaW5nKCk7Ci0gIAkJcGFyYW1JbiA9IHBhcmFtT3V0ICsgIiAtPiAiOwotICAJfQotICAJCi0gIGZpbmFsIFN0cmluZyBnZW5lcmF0ZWRDb2RlID0gImNsYXNzIFggeyBwdWJsaWMgZGVmIGNsb3N1cmUgPSB7IiArIHBhcmFtSW4gKyAiICIgKyBxdWFsaWZpZXIgKyAiLiIgKyBtZXRob2ROYW1lICsgIigiICsgcGFyYW1PdXQgKyAiKSB9fSI7Ci0gIC8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2VuZXJhdGVkQ29kZSk7Ci0gIAotICAJdHJ5IHsKLSAgCWZpbmFsIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdlbmVyYXRlZENvZGUuZ2V0Qnl0ZXMoKSk7Ci0gIAlmaW5hbCBHcm9vdnlPYmplY3QgZ3Jvb3Z5T2JqZWN0ID0gKEdyb292eU9iamVjdCluZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKS5wYXJzZUNsYXNzKGluLCBtZXRob2ROYW1lKS5uZXdJbnN0YW5jZSgpOwotICAJCQotICAJCXJldHVybiAoQ2xvc3VyZSkoZ3Jvb3Z5T2JqZWN0LmdldFByb3BlcnR5KCJjbG9zdXJlIikpOwotICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgCQl0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZ2VuZXJhdGUgcHJveHkgZm9yIFhNTC1SUEMgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSBjbG9zdXJlcyBleGVjdXRpbmcgcmVtb3RlIGNhbGxzCi0gICAqIENhbGxlZCB3aGVuIHRoZSBjbG9zdXJlIHdhbnRzIHRvIHJldHVybiBhIGZhdWx0Ci0gICAqIFRoZSBtZXRob2QgYWx3YXlzIHRocm93cyBhbiBleGNlcHRpb24KLSAgICogCi0gICAqIEBwYXJhbSBtc2cgRmF1bHQgbWVzc2FnZSB0byBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyCi0gICAqIEBwYXJhbSBjb2RlIEZhdWx0IGNvZGUgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlcgotICAgKi8KLSAgcHVibGljIHZvaWQgcmV0dXJuRmF1bHQoU3RyaW5nIG1zZywgaW50IGNvZGUpIHRocm93cyBYTUxSUENGYWlsRXhjZXB0aW9uIHsKLSAgCXRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKG1zZywgY29kZSk7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBiZSBjYWxsZWQgYnkgY2xvc3VyZXMgZXhlY3V0aW5nIHJlbW90ZSBjYWxscwotICAgKiBDYWxsZWQgd2hlbiB0aGUgY2xvc3VyZSB3YW50cyB0byByZXR1cm4gYSBmYXVsdAotICAgKiBUaGUgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAqIAotICAgKiBAcGFyYW0gbXNnIEZhdWx0IG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlcgotICAgKiBAcGFyYW0gY29kZSBGYXVsdCBjb2RlIHRvIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJldHVybkZhdWx0KEdTdHJpbmcgbXNnLCBpbnQgY29kZSkgdGhyb3dzIFhNTFJQQ0ZhaWxFeGNlcHRpb24gewotICAJcmV0dXJuRmF1bHQobXNnLnRvU3RyaW5nKCksIGNvZGUpOwkvLyBzb21ldGltZXMgR3Jvb3Z5IGRvZXNuJ3QgZG8gdGhlIGNjb252ZXJzaW9uIHRvIFN0cmluZyAKLSAgfQotCi0gIC8qKgotICAgKiBTdXBwbHkgYSBjbG9zdXJlIHRvIGJlIGNhbGxlZCBpZiB0aGVyZSBpcyBubyBjbG9zdXJlIHN1cHBsaWVkIHRvIGhhbmRsZSB0aGUgY2FsbAotICAgKiBUeXBpY2FsbHkgdGhpcyBsb2dzIHRoZSBiYWQgY2FsbCBhbmQgcmV0dXJucyBhIGZhdWx0IGJ5IGNhbGxpbmcgcmV0dXJuRmF1bHQKLSAgICogCi0gICAqIFRoZSBjbG9zdXJlIGlzIGNhbGxlZCB3aXRoIHR3byBwYXJhbWV0ZXJzIC0gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbWV0aG9kCi0gICAqIG5hbWUgYW5kIGFuIGFycmF5IG9mIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzCi0gICAqIAotICAgKiBAcGFyYW0gZGVmYXVsdE1ldGhvZCBUaGUgY2xvc3VyZSB0byBiZSBjYWxsZWQgLSBpZiB0aGlzIGlzIG51bGwgdGhlIHNldHRpbmcgaXMgbm90IGNoYW5nZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldHVwRGVmYXVsdE1ldGhvZChmaW5hbCBDbG9zdXJlIGRlZmF1bHRNZXRob2QpIHsKLSAgCWlmIChkZWZhdWx0TWV0aG9kICE9IG51bGwpIHRoaXMuZGVmYXVsdE1ldGhvZCA9IGRlZmF1bHRNZXRob2Q7Ci0gIH0KLQotICAvKioKLSAgICogU3VwcGx5IGEgY2xvc3VyZSB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjbG9zdXJlIHdoaWNoIGhhbmRsZXMgdGhlIHJlbW90ZSBjYWxsCi0gICAqICAob3IgdGhlIGRlZmF1bHQgY2xvc3VyZSBpZiB0aGVyZSBpcyBubyBoYW5kbGVyKSBpcyBjYWxsZWQuCi0gICAqIAotICAgKiBUaGUgY2xvc3VyZSBpcyBjYWxsZWQgd2l0aCB0d28gcGFyYW1ldGVycyAtIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1ldGhvZAotICAgKiBuYW1lIGFuZCBhbiBhcnJheSBvZiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycwotICAgKiAKLSAgICogQHBhcmFtIHByZUNhbGxNZXRob2QgVGhlIGNsb3N1cmUgdG8gYmUgY2FsbGVkIC0gaWYgdGhpcyBpcyBudWxsIHRoZSBzZXR0aW5nIGlzIG5vdCBjaGFuZ2VkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXR1cFByZUNhbGxNZXRob2QoZmluYWwgQ2xvc3VyZSBwcmVDYWxsTWV0aG9kKSB7Ci0gIAlpZiAocHJlQ2FsbE1ldGhvZCAhPSBudWxsKSB0aGlzLnByZUNhbGxNZXRob2QgPSBwcmVDYWxsTWV0aG9kOwotICB9Ci0KLSAgLyoqCi0gICAqIFN1cHBseSBhIGNsb3N1cmUgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBjbG9zdXJlIHdoaWNoIGhhbmRsZXMgdGhlIHJlbW90ZSBjYWxsCi0gICAqICAob3IgdGhlIGRlZmF1bHQgY2xvc3VyZSBpZiB0aGVyZSBpcyBubyBoYW5kbGVyKSBpcyBjYWxsZWQuCi0gICAqIAotICAgKiBUaGUgY2xvc3VyZSBpcyBjYWxsZWQgd2l0aCB0d28gcGFyYW1ldGVycyAtIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1ldGhvZAotICAgKiBuYW1lIGFuZCBhbiBPYmplY3QgY29udGFpbmluZyB0aGUgcmVzdWx0Ci0gICAqIAotICAgKiBAcGFyYW0gcG9zdENhbGxNZXRob2QgVGhlIGNsb3N1cmUgdG8gYmUgY2FsbGVkIC0gaWYgdGhpcyBpcyBudWxsIHRoZSBzZXR0aW5nIGlzIG5vdCBjaGFuZ2VkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXR1cFBvc3RDYWxsTWV0aG9kKGZpbmFsIENsb3N1cmUgcG9zdENhbGxNZXRob2QpIHsKLSAgCWlmIChwb3N0Q2FsbE1ldGhvZCAhPSBudWxsKSB0aGlzLnBvc3RDYWxsTWV0aG9kID0gcG9zdENhbGxNZXRob2Q7Ci0gIH0KLQotICAvKioKLSAgICogU3VwcGx5IGEgY2xvc3VyZSB0byBiZSBjYWxsZWQgaWYgdGhlIHByb2Nlc3Mgb2YgZXhlY3V0aW5nIHRoZSByZW1vdGUgY2FsbCB0aHJvd3MgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogVGhlIGNsb3N1cmUgaXMgY2FsbGVkIHdpdGggdHdvIHBhcmFtZXRlcnMgLSBhIFN0cmluZyBjb250YWluaW5nIHRoZSBmYXVsdCBzdHJpbmcKLSAgICogbmFtZSBhbmQgYW4gSW50ZWdlciBjb250YWluaW5nIHRoZSBmYXVsdCB2YWx1ZS4KLSAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQgaXMgbm90IHBhc3NlZCBhcyB0aGUgZmF1bHQgY291bGQgaGF2ZSBiZWVuIAotICAgKiBnZW5lcmF0ZWQgYmVmb3JlIHRoZSBtZXRob2QgbmFtZSB3YXMga25vd24uCi0gICAqIAotICAgKiBAcGFyYW0gZmF1bHRNZXRob2QgVGhlIGNsb3N1cmUgdG8gYmUgY2FsbGVkIC0gaWYgdGhpcyBpcyBudWxsIHRoZSBzZXR0aW5nIGlzIG5vdCBjaGFuZ2VkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXR1cEZhdWx0TWV0aG9kKGZpbmFsIENsb3N1cmUgZmF1bHRNZXRob2QpIHsKLSAgCWlmIChmYXVsdE1ldGhvZCAhPSBudWxsKSB0aGlzLmZhdWx0TWV0aG9kID0gZmF1bHRNZXRob2Q7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL1JQQ1NlcnZlclByb3h5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvUlBDU2VydmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkNDUzZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvUlBDU2VydmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAyMDA0LCAyMDA1IChDKSBKb2huIFdpbHNvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCi0gICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKLSAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgotICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCi0KLTQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCi0gICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKLSAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCi0KLTUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUwotYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLU5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKLVRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLUlORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi1TRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLVNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLU9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotKi8KLQotcGFja2FnZSBncm9vdnkubmV0LnhtbHJwYzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUludGVyY2VwdGFibGU7Ci1pbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBSUENTZXJ2ZXJQcm94eSBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgaW1wbGVtZW50cyBHcm9vdnlJbnRlcmNlcHRhYmxlIHsKLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgewotICAJcmV0dXJuIG5ldyBHcm9vdnlPYmplY3RTdXBwb3J0KCkgewotICAJCS8qKgotICAJCSAqIAotICAJCSAqIEFsbG93IHNlcnZlclByb3h5LmEuYi5jKC4uLikKLSAgCQkgKiBUaGlzIGludm9rZXMgYSByZW1vdGUgbWV0aG9kIHdpdGggdGhlIG5hbWUgImEuYi5jIgotICAJCSAqIFRoaXMgdGVjaG5pcXVlIGlzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHRoZSBQeXRob24gWE1MLVJQQyBpbXBsZW1lbnRhdGlvbgotICAJCSAqIFRoYW5rcyBhbmQgY3JlZGl0IHRvIEZyZWRyaWsgTHVuZGgKLSAgCQkgKiAKLSAgCQkgKi8KLSAgCQkJCQotICAJCXByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIHByb3BlcnR5UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcihwcm9wZXJ0eSArICIuIik7Ci0gIAkKLSAgCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgewotICAJCQl0aGlzLnByb3BlcnR5UHJlZml4LmFwcGVuZChwcm9wZXJ0eSkuYXBwZW5kKCcuJyk7Ci0gIAkJCQotICAJCQlyZXR1cm4gdGhpczsKLSAgCQl9Ci0gIAkJCi0gIAkJcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCBhcmdzKSB7Ci0gIAkJCXJldHVybiBSUENTZXJ2ZXJQcm94eS50aGlzLmludm9rZU1ldGhvZCh0aGlzLnByb3BlcnR5UHJlZml4ICsgbmFtZSwgYXJncyk7Ci0gIAkJfQotICAJfTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL1hNTFJQQ0NhbGxGYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiOTEzZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLXBhY2thZ2UgZ3Jvb3Z5Lm5ldC54bWxycGM7Ci0KLWltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOwotLyoKLQotQ29weXJpZ2h0IDIwMDQgKEMpIEpvaG4gV2lsc29uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi10aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi1gYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLVNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0qLwotCi1wdWJsaWMgY2xhc3MgWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gIAotICBwcml2YXRlIGZpbmFsIE9iamVjdCBmYXVsdFN0cmluZzsKLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmYXVsdENvZGU7Ci0JCi0JcHVibGljIFhNTFJQQ0NhbGxGYWlsdXJlRXhjZXB0aW9uKGZpbmFsIE9iamVjdCBmYXVsdFN0cmluZywgZmluYWwgT2JqZWN0IGZhdWx0Q29kZSkgewotCQlzdXBlcigiWE1MLVJQQyBjYWxsIEZhaWx1cmU6IGZhdWx0IHN0cmluZyA9IFwiIiArIGZhdWx0U3RyaW5nICsgIlwiLCBmYXVsdCBjb2RlID0gIiArIGZhdWx0Q29kZSk7Ci0JCQotCQl0aGlzLmZhdWx0U3RyaW5nID0gZmF1bHRTdHJpbmc7Ci0JCXRoaXMuZmF1bHRDb2RlID0gZmF1bHRDb2RlOwotCQkKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRGYXVsdENvZGUoKSB7Ci0JCXJldHVybiBmYXVsdENvZGU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RmF1bHRTdHJpbmcoKSB7Ci0JCXJldHVybiBmYXVsdFN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDTWVzc2FnZVByb2Nlc3Nvci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL1hNTFJQQ01lc3NhZ2VQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3YTc0NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDTWVzc2FnZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IDIwMDUgKEMpIEpvaG4gV2lsc29uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi10aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi1gYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLVNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0qLwotcGFja2FnZSBncm9vdnkubmV0LnhtbHJwYzsKLQotaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7Ci0KLXB1YmxpYyBjbGFzcyBYTUxSUENNZXNzYWdlUHJvY2Vzc29yIGV4dGVuZHMgdWsuY28ud2lsc29uLm5ldC54bWxycGMuWE1MUlBDTWVzc2FnZVByb2Nlc3NvciB7Ci0gIHN0YXRpYyB7Ci0gICAgZWxlbWVudHMucHV0KEdTdHJpbmcuY2xhc3MsIGVsZW1lbnRzLmdldChTdHJpbmcuY2xhc3MpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi9ncm9vdnkvbmV0L3htbHJwYy9YTUxSUENTZXJ2ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi9ncm9vdnkvbmV0L3htbHJwYy9YTUxSUENTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3ZDAwNy4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IDIwMDQsIDIwMDUgKEMpIEpvaG4gV2lsc29uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgotKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi10aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0Ci0gICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKLSAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQotICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCi0gICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KLQotNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAotICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KLSAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLwotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi1gYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAotTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLVNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0qLwotCi1wYWNrYWdlIGdyb292eS5uZXQueG1scnBjOwotCi0KLWltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOwotaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgdWsuY28ud2lsc29uLm5ldC5NaW5NTFNvY2tldFNlcnZlcjsKLWltcG9ydCB1ay5jby53aWxzb24ubmV0Lmh0dHAuTWluTUxIVFRQU2VydmVyOwotaW1wb3J0IHVrLmNvLndpbHNvbi5uZXQueG1scnBjLlhNTFJQQ0ZhaWxFeGNlcHRpb247Ci0KLS8qKgotKiBAYXV0aG9yIEpvaG4gV2lsc29uICh0dWdAd2lsc29uLmNvLnVrKQotKgotKi8KLXB1YmxpYyBjbGFzcyBYTUxSUENTZXJ2ZXIgZXh0ZW5kcyBSUENTZXJ2ZXIgewotcHJpdmF0ZSBieXRlW10gYmFzZTY0ID0gbmV3IGJ5dGVbNjAwXTsKLXsKLQlmb3IgKGludCBpID0gMDsgaSAhPSB0aGlzLmJhc2U2NC5sZW5ndGg7IGkrKykgewotCQl0aGlzLmJhc2U2NFtpXSA9IChieXRlKWk7Ci0JfQotfQotcHVibGljIGJ5dGVbXSBnZXRCYXNlNjQoKSB7IHJldHVybiB0aGlzLmJhc2U2NDt9IC8vIGJvZGdlIHRvIGFsbG93IHRlc3RpbmcgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB4bWxEZWNsYXJhdGlvbiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PlxuIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gdXNlckFnZW50ID0gIlVzZXItQWdlbnQ6IEdyb292eSBYTUwtUlBDXHJcbiIuZ2V0Qnl0ZXMoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gY29udGVudFR5cGVYTUwgPSAiQ29udGVudC1UeXBlOiB0ZXh0L3htbFxyXG4iLmdldEJ5dGVzKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnRlbnRMZW5ndGggPSAiQ29udGVudC1MZW5ndGg6ICIuZ2V0Qnl0ZXMoKTsKLSAgCi0gIHByb3RlY3RlZCBNaW5NTFNvY2tldFNlcnZlciBzZXJ2ZXIgPSBudWxsOyAKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBtaW5Xb3JrZXJzOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IG1heFdvcmtlcnM7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgbWF4S2VlcEFsaXZlczsKLSAgcHJvdGVjdGVkIGZpbmFsIGludCB3b3JrZXJJZGxlTGlmZTsKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBzb2NrZXRSZWFkVGltZW91dDsKLQotCS8qKgotCSAqIEBwYXJhbSBtaW5Xb3JrZXJzCi0JICogQHBhcmFtIG1heFdvcmtlcnMKLQkgKiBAcGFyYW0gbWF4S2VlcEFsaXZlcwotCSAqIEBwYXJhbSB3b3JrZXJJZGxlTGlmZQotCSAqIEBwYXJhbSBzb2NrZXRSZWFkVGltZW91dAotCSAqLwotCXB1YmxpYyBYTUxSUENTZXJ2ZXIoZmluYWwgaW50IG1pbldvcmtlcnMsCi0JCQkJCQlmaW5hbCBpbnQgbWF4V29ya2VycywKLQkJCQkJCWZpbmFsIGludCBtYXhLZWVwQWxpdmVzLAotCQkJCQkJZmluYWwgaW50IHdvcmtlcklkbGVMaWZlLAotCQkJCQkJZmluYWwgaW50IHNvY2tldFJlYWRUaW1lb3V0KQotCXsKLQkJdGhpcy5taW5Xb3JrZXJzID0gbWluV29ya2VyczsKLQkJdGhpcy5tYXhXb3JrZXJzID0gbWF4V29ya2VyczsKLQkJdGhpcy5tYXhLZWVwQWxpdmVzID0gbWF4S2VlcEFsaXZlczsKLQkJdGhpcy53b3JrZXJJZGxlTGlmZSA9IHdvcmtlcklkbGVMaWZlOwotCQl0aGlzLnNvY2tldFJlYWRUaW1lb3V0ID0gc29ja2V0UmVhZFRpbWVvdXQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBYTUxSUENTZXJ2ZXIoKSB7Ci0JCXRoaXMoMiwgMTAsIDgsIDYwMDAwLCA2MDAwMCk7Ci0JfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVyU29ja2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpIHN0b3BTZXJ2ZXIoKTsKLSAgICAgIAotICAgICAgZmluYWwgTWluTUxIVFRQU2VydmVyIHNlcnZlciA9IG5ldyBNaW5NTEhUVFBTZXJ2ZXIoc2VydmVyU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5Xb3JrZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4V29ya2VycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heEtlZXBBbGl2ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJJZGxlTGlmZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldFJlYWRUaW1lb3V0KSB7Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIHVrLmNvLndpbHNvbi5uZXQuTWluTUxTb2NrZXRTZXJ2ZXIjbWFrZU5ld1dvcmtlcigpCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgV29ya2VyIG1ha2VOZXdXb3JrZXIoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBIVFRQV29ya2VyKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Bvc3QoZmluYWwgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBmaW5hbCBYTUxSUENNZXNzYWdlUHJvY2Vzc29yIHJlcXVlc3RQYXJzZXIgPSBuZXcgWE1MUlBDTWVzc2FnZVByb2Nlc3NvcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG91dC53cml0ZSh2ZXJzaW9uLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShva01lc3NhZ2UpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZSh1c2VyQWdlbnQpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShob3N0KTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoY29udGVudFR5cGVYTUwpOwotICAgICAgICAgICAgICAgIHdyaXRlS2VlcEFsaXZlKG91dCk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGNvbnRlbnRMZW5ndGgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJzZXIucGFyc2VNZXNzYWdlKGluKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IHJlcXVlc3RQYXJzZXIuZ2V0TWV0aG9kbmFtZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgcGFyYW1zID0gcmVxdWVzdFBhcnNlci5nZXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSlYTUxSUENTZXJ2ZXIudGhpcy5yZWdpc3RlcmVkTWV0aG9kcy5nZXQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKFhNTFJQQ1NlcnZlci50aGlzLnByZUNhbGxNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgWE1MUlBDU2VydmVyLnRoaXMucHJlQ2FsbE1ldGhvZC5jYWxsKG5ldyBPYmplY3RbXSB7bWV0aG9kTmFtZSwgcGFyYW1zLnRvQXJyYXkoKX0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoWE1MUlBDU2VydmVyLnRoaXMuZGVmYXVsdE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzZXJ2ZXIiKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWE1MUlBDU2VydmVyLnRoaXMuZGVmYXVsdE1ldGhvZC5jYWxsKG5ldyBPYmplY3RbXSB7bWV0aG9kTmFtZSwgcGFyYW1zLnRvQXJyYXkoKX0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbG9zdXJlLmNhbGwocGFyYW1zLnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKFhNTFJQQ1NlcnZlci50aGlzLnBvc3RDYWxsTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIFhNTFJQQ1NlcnZlci50aGlzLnBvc3RDYWxsTWV0aG9kLmNhbGwobmV3IE9iamVjdFtdIHttZXRob2ROYW1lLCByZXN1bHR9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSByZXNwb25zZSA9IFhNTFJQQ01lc3NhZ2VQcm9jZXNzb3IuZW1pdFJlc3VsdChuZXcgU3RyaW5nQnVmZmVyKHhtbERlY2xhcmF0aW9uKSwgcmVzdWx0KS50b1N0cmluZygpLmdldEJ5dGVzKCJJU08tODg1OS0xIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKFN0cmluZy52YWx1ZU9mKHJlc3BvbnNlLmxlbmd0aCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGVuZE9mTGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGVuZE9mTGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgICAgICAgZmluYWwgaW50IGNvZGVWYWx1ZTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgZSA9ICgoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24pZSkuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBYTUxSUENGYWlsRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICBtZXNzYWdlID0gKChYTUxSUENGYWlsRXhjZXB0aW9uKWUpLmdldEZhdWx0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICBjb2RlVmFsdWUgPSAoKFhNTFJQQ0ZhaWxFeGNlcHRpb24pZSkuZ2V0RmF1bHRDb2RlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgIGNvZGVWYWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChYTUxSUENTZXJ2ZXIudGhpcy5mYXVsdE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBYTUxSUENTZXJ2ZXIudGhpcy5mYXVsdE1ldGhvZC5jYWxsKG5ldyBPYmplY3RbXSB7bWVzc2FnZSwgbmV3IEludGVnZXIoY29kZVZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY2F0Y2ggKGZpbmFsIFRocm93YWJsZSBlMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBzd2FsbG93IHRoaXMgYW5kIHJldHVybiB0aGUgb3JnaW5hbCBmYXVsdAotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZXJyb3IgPSBYTUxSUENNZXNzYWdlUHJvY2Vzc29yLmVtaXRFcnJvcihuZXcgU3RyaW5nQnVmZmVyKHhtbERlY2xhcmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgPT0gbnVsbCkgPyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogbWVzc2FnZSkudG9TdHJpbmcoKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKFN0cmluZy52YWx1ZU9mKGVycm9yLmxlbmd0aCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGVuZE9mTGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGVuZE9mTGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGVycm9yKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICAKLSAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOwotICAgICAgCi0gICAgICAKLSAgICAgIGZpbmFsIFRocmVhZCBzdGFydGluZ1RocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgc3RhcnRpbmdUaHJlYWQuc2V0RGFlbW9uKGZhbHNlKTsKLSAgICAgIHN0YXJ0aW5nVGhyZWFkLnNldE5hbWUoIlhNTC1SUEMgU2VydmVyIG1haW4gdGhyZWFkIik7Ci0gICAgICBzdGFydGluZ1RocmVhZC5zdGFydCgpOwotICAgIH0KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgc2h1dGRvd24gcHJvY2VzcwotICAgKiBUaGlzIHdpbGwgcmV0dXJuIGJlZm9yZSB0aGUgc2VydmVyIGhhcyBzaHV0IGRvd24gY29tcGxldGVseQotICAgKiBGdWxsIHNodXRkb3duIG1heSB0YWtlIHNvbWUgdGltZQotICAgKiAKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdGhpcy5zZXJ2ZXIuc2h1dERvd24oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL2dyb292eS9uZXQveG1scnBjL1hNTFJQQ1NlcnZlclByb3h5LmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDU2VydmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYWQ3Yi4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vZ3Jvb3Z5L25ldC94bWxycGMvWE1MUlBDU2VydmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotCi0gQ29weXJpZ2h0IDIwMDQsIDIwMDUgKEMpIEpvaG4gV2lsc29uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLSB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAotICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQotICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KLQotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKLSAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCi0gICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCi0gICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAotICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgotCi0gNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKLSAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCi0gICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KLQotIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCi0gICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCi0gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi0gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKLSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSAqLwotCi1wYWNrYWdlIGdyb292eS5uZXQueG1scnBjOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgdWsuY28ud2lsc29uLm5ldC54bWxycGMuWE1MUlBDRmFpbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gV2lsc29uICh0dWdAd2lsc29uLmNvLnVrKQotICovCi1wdWJsaWMgY2xhc3MgWE1MUlBDU2VydmVyUHJveHkgZXh0ZW5kcyBSUENTZXJ2ZXJQcm94eSB7Ci0gIHN0YXRpYyBmaW5hbCBTdHJpbmcgeG1sRGVjbGFyYXRpb24gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiSVNPLTg4NTktMVwiPz5cbiI7Ci0JcHJpdmF0ZSBVUkwgc2VydmVyVVJMOwotCQotCXB1YmxpYyBYTUxSUENTZXJ2ZXJQcm94eShmaW5hbCBTdHJpbmcgc2VydmVyVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJdGhpcy5zZXJ2ZXJVUkwgPSBuZXcgVVJMKHNlcnZlclVSTCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNpbnZva2VNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IGFyZ3MpIHsJCi0JCWlmICgiaW52b2tlTWV0aG9kIi5lcXVhbHMobmFtZSkpIHJldHVybiBzdXBlci5pbnZva2VNZXRob2QobmFtZSwgYXJncyk7Ci0gICAgCi0gICAgZmluYWwgT2JqZWN0W10gcGFyYW1zID0gKGFyZ3MgaW5zdGFuY2VvZiBMaXN0KSA/ICgoTGlzdClhcmdzKS50b0FycmF5KCkgOiAoT2JqZWN0W10pYXJnczsKLSAgICBpbnQgbnVtYmVyT2ZQYXJhbXMgPSBwYXJhbXMubGVuZ3RoOwotICAgIAotICAgICAgaWYgKG51bWJlck9mUGFyYW1zICE9IDAgJiYgcGFyYW1zW251bWJlck9mUGFyYW1zIC0gMV0gaW5zdGFuY2VvZiBDbG9zdXJlKSB7Ci0gICAgICAgIG51bWJlck9mUGFyYW1zLS07IC8vIHRoZSBjbG9zdXJlIGlzIG5vdCB0byBiZSBwYXNzZWQgdG8gdGhlIHJlbW90ZSBtZXRob2QKLSAgICAgIH0KLQkJCi0JCXRyeSB7Ci0gICAgZmluYWwgYnl0ZSBbXSByZXF1ZXN0ID0gWE1MUlBDTWVzc2FnZVByb2Nlc3Nvci5lbWl0Q2FsbChuZXcgU3RyaW5nQnVmZmVyKHhtbERlY2xhcmF0aW9uKSwgbmFtZSwgcGFyYW1zLCBudW1iZXJPZlBhcmFtcykudG9TdHJpbmcoKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOwotCQlmaW5hbCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB0aGlzLnNlcnZlclVSTC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCi0JCQljb25uZWN0aW9uLnNldERvSW5wdXQodHJ1ZSk7Ci0JCQljb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOwotCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJY29ubmVjdGlvbi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7Ci0JCQljb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1MZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKHJlcXVlc3QubGVuZ3RoKSk7Ci0JCQljb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0JCQkKLQkJCWZpbmFsIE91dHB1dFN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCXJlcXVlc3RTdHJlYW0ud3JpdGUocmVxdWVzdCk7Ci0JCQlyZXF1ZXN0U3RyZWFtLmZsdXNoKCk7Ci0JCQlyZXF1ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCQkKLQkJCWZpbmFsIFhNTFJQQ01lc3NhZ2VQcm9jZXNzb3IgcmVzcG9uc2VQYXJzZXIgPSBuZXcgWE1MUlBDTWVzc2FnZVByb2Nlc3NvcigpOwotCQkJCi0JCQl0cnkgewotCQkJCXJlc3BvbnNlUGFyc2VyLnBhcnNlTWVzc2FnZShjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpOwotCQkJfQotCQkJY2F0Y2ggKGZpbmFsIFhNTFJQQ0ZhaWxFeGNlcHRpb24gZSkgewotLy8JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyBuZXcgWE1MUlBDQ2FsbEZhaWx1cmVFeGNlcHRpb24oZS5nZXRGYXVsdFN0cmluZygpLCBuZXcgSW50ZWdlcihlLmdldEZhdWx0Q29kZSgpKSk7Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIExpc3QgcmVzcG9uc2UgPSByZXNwb25zZVBhcnNlci5nZXRQYXJhbXMoKTsKLQkJCQotCQkJaWYgKHJlc3BvbnNlID09IG51bGwpIHRocm93IG5ldyBYTUxSUENDYWxsRmFpbHVyZUV4Y2VwdGlvbigiRW1wdHkgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQkKLQkJCWlmIChudW1iZXJPZlBhcmFtcyA9PSBwYXJhbXMubGVuZ3RoKSB7Ci0JCQkJcmV0dXJuIHJlc3BvbnNlLmdldCgwKTsKLQkJCX0gZWxzZSB7CQotCQkJCS8vIHBhc3MgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCB0byB0aGUgY2xvc3VyZQotCQkJCWZpbmFsIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKXBhcmFtc1tudW1iZXJPZlBhcmFtc107Ci0JCQkJCi0JCQkJY2xvc3VyZS5zZXREZWxlZ2F0ZSh0aGlzKTsKLQkJCQlyZXR1cm4gY2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXSB7cmVzcG9uc2UuZ2V0KDApfSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFhNTFJQQ0NhbGxGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBuZXcgSW50ZWdlcigwKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIFhNTFJQQ0ZhaWxFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFhNTFJQQ0NhbGxGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0RmF1bHRTdHJpbmcoKSwgZS5nZXRDYXVzZSgpKTsKLSAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQvTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L01pbk1MSmFiYmVyUGFja2V0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNWNjZTcuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQvTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIHVrLmNvLndpbHNvbi5uZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5QYWNrZXRDb2xsZWN0b3I7Ci0KLS8qKgotICogQGF1dGhvciBKb2huIFdpbHNvbgotICoKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIgIGV4dGVuZHMgTWluTUxUaHJlYWRQb29sIHsKLSAgICBwdWJsaWMgTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIoZmluYWwgUGFja2V0Q29sbGVjdG9yIHBhY2tldENvbGxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1pbldvcmtlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhXb3JrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29ya2VySWRsZUxpZmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN1cGVyKG1pbldvcmtlcnMsIG1heFdvcmtlcnMsIHdvcmtlcklkbGVMaWZlKTsKLSAgICAgICAgICAgICAgdGhpcy5wYWNrZXRDb2xsZWN0b3IgPSBwYWNrZXRDb2xsZWN0b3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSB1ay5jby53aWxzb24ubmV0Lk1pbk1MVGhyZWFkUG9vbCNzaHV0RG93bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2h1dERvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdGhpcy5zZXJ2ZXJBY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5wYWNrZXRDb2xsZWN0b3IuY2FuY2VsKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgdWsuY28ud2lsc29uLm5ldC5NaW5NTFRocmVhZFBvb2wjc2V0VGltZW91dChpbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgewotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEphYmJlclBhY2tldFdvcmtlciBleHRlbmRzIFdvcmtlciB7Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBPYmplY3QgcmVzdWx0ID0gTWluTUxKYWJiZXJQYWNrZXRTZXJ2ZXIudGhpcy5wYWNrZXRDb2xsZWN0b3IubmV4dFJlc3VsdChNaW5NTEphYmJlclBhY2tldFNlcnZlci50aGlzLnRpbWVvdXQpOwotICAgICAgICAKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicGFja2V0IHJlYWQgdGltZWQgb3V0Iik7Ci0gICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZGlzcG9zZShPYmplY3QgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBObyBhY3Rpb24gbmVlZGVkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBQYWNrZXRDb2xsZWN0b3IgcGFja2V0Q29sbGVjdG9yOwotICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gdGhpcy53b3JrZXJJZGxlTGlmZTsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L01pbk1MU29ja2V0U2VydmVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL25ldC9NaW5NTFNvY2tldFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTExYjgwLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L01pbk1MU29ja2V0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEsIDIwMDUgSm9obiBHLiBXaWxzb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotCi1wYWNrYWdlIHVrLmNvLndpbHNvbi5uZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWluTUxTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBNaW5NTFRocmVhZFBvb2wgewotICBwdWJsaWMgTWluTUxTb2NrZXRTZXJ2ZXIoZmluYWwgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtaW5Xb3JrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heFdvcmtlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29ya2VySWRsZUxpZmUpCi0gIHsKLSAgICBzdXBlcihtaW5Xb3JrZXJzLCBtYXhXb3JrZXJzLCB3b3JrZXJJZGxlTGlmZSk7Ci0gICAgdGhpcy5zZXJ2ZXJTb2NrZXQgPSBzZXJ2ZXJTb2NrZXQ7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2h1dERvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMuc2VydmVyQWN0aXZlID0gZmFsc2U7Ci0gICAgdGhpcy5zZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0UG9ydE51bWJlcigpIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCB0aW1lb3V0KSB7Ci0gICAgdHJ5IHsKLSAgICAgIHRoaXMuc2VydmVyU29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKGZpbmFsIFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgfQotICB9Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJTb2NrZXRXb3JrZXIgZXh0ZW5kcyBXb3JrZXIgewotICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIE1pbk1MU29ja2V0U2VydmVyLnRoaXMuc2VydmVyU29ja2V0LmFjY2VwdCgpOwotICAgICAgfQotICAgICAgCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKE9iamVjdCByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAoKFNvY2tldClyZXNvdXJjZSkuY2xvc2UoKTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L01pbk1MVGhyZWFkUG9vbC5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQvTWluTUxUaHJlYWRQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGZkYTEuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQvTWluTUxUaHJlYWRQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2UgdWsuY28ud2lsc29uLm5ldDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWluTUxUaHJlYWRQb29sIHsKLSAgICBwdWJsaWMgTWluTUxUaHJlYWRQb29sKGZpbmFsIGludCBtaW5Xb3JrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heFdvcmtlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29ya2VySWRsZUxpZmUpCi0gICAgewotICAgICAgICB0aGlzLm1pbldvcmtlcnMgPSBNYXRoLm1heChtaW5Xb3JrZXJzLCAxKTsKLSAgICAgICAgdGhpcy5tYXhXb3JrZXJzID0gTWF0aC5tYXgodGhpcy5taW5Xb3JrZXJzLCBtYXhXb3JrZXJzKTsKLSAgICAgICAgdGhpcy53b3JrZXJJZGxlTGlmZSA9IHdvcmtlcklkbGVMaWZlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgZ2V0TmV3V29ya2VyKCkucnVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2h1dERvd24oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgV29ya2VyIG1ha2VOZXdXb3JrZXIoKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLQotICAgIHByaXZhdGUgV29ya2VyIGdldE5ld1dvcmtlcigpIHsKLSAgICAgIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBuZXcgdGhyZWFkOiBsaXZlV29ya2VyQ291bnQgPSAiICsgdGhpcy5saXZlV29ya2VyQ291bnQgKyAiIHdvcmtpbmdXb3JrZXJDb3VudCA9ICIgKyB0aGlzLndvcmtpbmdXb3JrZXJDb3VudCk7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzLmxpdmVXb3JrZXJDb3VudCsrID09IHRoaXMubWluV29ya2VycykKLSAgICAgICAgc2V0VGltZW91dCh0aGlzLndvcmtlcklkbGVMaWZlKTsKLQotICAgICAgcmV0dXJuIG1ha2VOZXdXb3JrZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0V29yaygpIHsKLSAgICAgIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlYWQgc3RhcnRpbmcgd29yazogbGl2ZVdvcmtlckNvdW50ID0gIiArIHRoaXMubGl2ZVdvcmtlckNvdW50ICsgIiB3b3JraW5nV29ya2VyQ291bnQgPSAiICsgdGhpcy53b3JraW5nV29ya2VyQ291bnQpOwotICAgICBpZiAoKyt0aGlzLndvcmtpbmdXb3JrZXJDb3VudCA9PSB0aGlzLmxpdmVXb3JrZXJDb3VudCAmJiB0aGlzLmxpdmVXb3JrZXJDb3VudCA8IHRoaXMubWF4V29ya2VycykgewotICAgICAgZmluYWwgVGhyZWFkIHdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQoZ2V0TmV3V29ya2VyKCkpOwotICAgICAgCi0gICAgICAgIHdvcmtlclRocmVhZC5zZXREYWVtb24oZmFsc2UpOwotICAgICAgICB3b3JrZXJUaHJlYWQuc2V0TmFtZSgiVGhyZWFkIFBvb2wgd29ya2VyIHRocmVhZCIpOwotICAgICAgICB3b3JrZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCBzdGFydGVkIHdvcms6IGxpdmVXb3JrZXJDb3VudCA9ICIgKyB0aGlzLmxpdmVXb3JrZXJDb3VudCArICIgd29ya2luZ1dvcmtlckNvdW50ID0gIiArIHRoaXMud29ya2luZ1dvcmtlckNvdW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFdvcmsoKSB7Ci0gICAgICB0aGlzLndvcmtpbmdXb3JrZXJDb3VudC0tOwotICAgICAgCi0gICAgICBpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkIGVuZGluZyB3b3JrOiBsaXZlV29ya2VyQ291bnQgPSAiICsgdGhpcy5saXZlV29ya2VyQ291bnQgKyAiIHdvcmtpbmdXb3JrZXJDb3VudCA9ICIgKyB0aGlzLndvcmtpbmdXb3JrZXJDb3VudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3b3JrZXJNdXN0RGllKCkgewotICAgICAgaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCB0aW1pbmcgb3V0IHNvY2tldCByZWFkOiBsaXZlV29ya2VyQ291bnQgPSAiICsgdGhpcy5saXZlV29ya2VyQ291bnQgKyAiIHdvcmtpbmdXb3JrZXJDb3VudCA9ICIgKyB0aGlzLndvcmtpbmdXb3JrZXJDb3VudCk7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzLmxpdmVXb3JrZXJDb3VudCA+IHRoaXMubWluV29ya2VycyAmJiB0aGlzLmxpdmVXb3JrZXJDb3VudCAhPSB0aGlzLndvcmtpbmdXb3JrZXJDb3VudCArIDEpIHsKLSAgICAgICAgaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCBjb21taXRzIHN1aWNpZGUiKTsKLSAgICAgICAgCi0gICAgICAgIHdvcmtlckRpZXMoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd29ya2VyRGllcygpIHsKLSAgICAgIGlmICgtLXRoaXMubGl2ZVdvcmtlckNvdW50ID09IHRoaXMubWluV29ya2VycykgewotICAgICAgICBzZXRUaW1lb3V0KDApOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkIGR5aW5nOiBsaXZlV29ya2VyQ291bnQgPSAiICsgdGhpcy5saXZlV29ya2VyQ291bnQgKyAiIHdvcmtpbmdXb3JrZXJDb3VudCA9ICIgKyB0aGlzLndvcmtpbmdXb3JrZXJDb3VudCk7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzLnNlcnZlckFjdGl2ZSAmJiB0aGlzLmxpdmVXb3JrZXJDb3VudCA8IHRoaXMubWluV29ya2VycykgeyAKLSAgICAgICAgbmV3IFRocmVhZChnZXROZXdXb3JrZXIoKSkuc3RhcnQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyByZXBsYWNlbWVudCB0aHJlYWQ6IGxpdmVXb3JrZXJDb3VudCA9ICIgKyB0aGlzLmxpdmVXb3JrZXJDb3VudCArICIgd29ya2luZ1dvcmtlckNvdW50ID0gIiArIHRoaXMud29ya2luZ1dvcmtlckNvdW50KTsgICAgICAgIAotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBXb3JrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzb3VyY2U7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICBNaW5NTFRocmVhZFBvb2wudGhpcy5zdGFydFdvcmsoKTsKLQotICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIGxldCBhIGJsb2NrZWQgd29ya2VyIHRocmVhZCBkbyBhbiBhY2NlcHQoKQotCi0gICAgICAgICAgICAgICAgICBwcm9jZXNzKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgZGlzcG9zZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIHdoZW4gY2xvc2luZyBzb2NrZXQ6ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgTWluTUxUaHJlYWRQb29sLnRoaXMuZW5kV29yaygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICBpZiAoTWluTUxUaHJlYWRQb29sLnRoaXMud29ya2VyTXVzdERpZSgpKSByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgIG9wZXJhdGluZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlYWQgZHlpbmcgZHVlIHRvIEV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgTWluTUxUaHJlYWRQb29sLnRoaXMud29ya2VyRGllcygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NpbmdFeGNlcHRpb24oZmluYWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgb3BlcmF0aW5nRXhjZXB0aW9uKGZpbmFsIEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uOwotICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzcG9zZShPYmplY3QgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb247Ci0gICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKE9iamVjdCByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBtaW5Xb3JrZXJzOwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbWF4V29ya2VyczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHdvcmtlcklkbGVMaWZlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHNlcnZlckFjdGl2ZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBpbnQgbGl2ZVdvcmtlckNvdW50ID0gMDsKLSAgICBwcml2YXRlIGludCB3b3JraW5nV29ya2VyQ291bnQgPSAwOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL25ldC9odHRwL01pbk1MSFRUUFNlcnZlci5qYXZhIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQvaHR0cC9NaW5NTEhUVFBTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1NmFkMS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL25ldC9odHRwL01pbk1MSFRUUFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMSwgMjAwNSBKb2huIEcuIFdpbHNvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIHVrLmNvLndpbHNvbi5uZXQuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCB1ay5jby53aWxzb24ubmV0Lk1pbk1MU29ja2V0U2VydmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWluTUxIVFRQU2VydmVyIGV4dGVuZHMgTWluTUxTb2NrZXRTZXJ2ZXIgewotCi0gIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGhvc3Q7Ci0gIHN0YXRpYyB7Ci0gICAgdHJ5IHsKLSAgICAgIGhvc3QgID0gKCJIb3N0OiAiICsgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSArIlxyXG4iKS5nZXRCeXRlcygpOwotICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgIGhvc3QgPSAiSG9zdDogdW5rbm93blxyXG4gIi5nZXRCeXRlcygpOwotICAgIH0KLSAgfQotICBwdWJsaWMgTWluTUxIVFRQU2VydmVyKGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1pbldvcmtlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heFdvcmtlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heEtlZXBBbGl2ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdvcmtlcklkbGVMaWZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzb2NrZXRSZWFkVGltZW91dCkKLSAgewotICAgIHN1cGVyKHNlcnZlclNvY2tldCwgbWluV29ya2VycywgbWF4V29ya2Vycywgd29ya2VySWRsZUxpZmUpOwotCi0gICAgdGhpcy5tYXhLZWVwQWxpdmVzID0gbWF4S2VlcEFsaXZlczsKLSAgICB0aGlzLnNvY2tldFJlYWRUaW1lb3V0ID0gc29ja2V0UmVhZFRpbWVvdXQ7Ci0gIH0KLQotICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0S2VlcEFsaXZlKCkgewotICAgaWYgKHRoaXMua2VlcEFsaXZlQ291bnQgPCB0aGlzLm1heEtlZXBBbGl2ZXMpIHsKLSAgICAgIE1pbk1MSFRUUFNlcnZlci50aGlzLmtlZXBBbGl2ZUNvdW50Kys7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5kS2VlcEFsaXZlKCkgewotICAgIHRoaXMua2VlcEFsaXZlQ291bnQtLTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIExpbWl0ZWRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLSAgICBwdWJsaWMgTGltaXRlZElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBpbnQgY29udGVudExlbmd0aCkgewotICAgICAgdGhpcy5pbiA9IGluOwotICAgICAgdGhpcy5jb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5pbi5hdmFpbGFibGUoKSwgdGhpcy5jb250ZW50TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAvLwotICAgICAgLy8gRG9uJ3QgY2xvc2UgdGhlIGlucHV0IHN0cmVhbSBhcyB0aGVyZSBpcyBtb3JlIGRhdGEKLSAgICAgIC8vIGJ1dCBza2lwIHBhc3QgYW55IHVucmVhZCBkYXRhIGluIHRoaXMgc2VjdGlvbgotICAgICAgLy8KLQotICAgICAgc2tpcCh0aGlzLmNvbnRlbnRMZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoID09IDApIHJldHVybiAtMTsKLQotICAgICAgdGhpcy5jb250ZW50TGVuZ3RoLS07Ci0KLSAgICAgIHJldHVybiB0aGlzLmluLnJlYWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiByZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7Ci0gICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZChmaW5hbCBieXRlW10gYnVmZmVyLCBmaW5hbCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKHRoaXMuY29udGVudExlbmd0aCA9PSAwKSByZXR1cm4gLTE7Ci0KLSAgICAgIGxlbmd0aCA9IHRoaXMuaW4ucmVhZChidWZmZXIsIG9mZnNldCwgTWF0aC5taW4obGVuZ3RoLCB0aGlzLmNvbnRlbnRMZW5ndGgpKTsKLQotICAgICAgaWYgKGxlbmd0aCAhPSAtMSkgdGhpcy5jb250ZW50TGVuZ3RoIC09IGxlbmd0aDsKLQotICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCB0aGlzLmNvbnRlbnRMZW5ndGgpOwotCi0gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggLT0gY291bnQ7Ci0KLSAgICAgIHJldHVybiB0aGlzLmluLnNraXAoY291bnQpOwotICAgICB9Ci0KLSAgICAgcHJpdmF0ZSBpbnQgY29udGVudExlbmd0aDsKLSAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbjsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBIVFRQV29ya2VyIGV4dGVuZHMgU2VydmVyU29ja2V0V29ya2VyIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzKGZpbmFsIE9iamVjdCByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgU29ja2V0IHNvY2tldCA9IChTb2NrZXQpcmVzb3VyY2U7Ci0gICAgCi0gICAgICB0cnkgewotICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KE1pbk1MSFRUUFNlcnZlci50aGlzLnNvY2tldFJlYWRUaW1lb3V0KTsKLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICBpbnQgY29udGVudExlbmd0aDsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgY29udGVudExlbmd0aCA9IC0xOwotCi0gICAgICAgICAgd2hpbGUgKHJlYWRMaW5lKGluKSAhPSAtMSAmJiB0aGlzLmNvdW50ID09IDApOyAgLy8gc2tpcCBhbnkgbGVhZGluZyBibGFuayBsaW5lcwotICAgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tzID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXcgU3RyaW5nKHRoaXMuYnVmLCAwLCB0aGlzLmNvdW50KSk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZCA9IHRva3MubmV4dFRva2VuKCk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHRva3MubmV4dFRva2VuKCk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gPSB0b2tzLmhhc01vcmVUb2tlbnMoKSA/IHRva3MubmV4dFRva2VuKCkgOiAiIjsKLQotICAgICAgICAgIHdoaWxlIChyZWFkTGluZShpbikgIT0gLTEgJiYgdGhpcy5jb3VudCAhPSAwKSB7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIG9wdGlvbiA9IG5ldyBTdHJpbmcodGhpcy5idWYsIDAsIHRoaXMuY291bnQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgICAgICBpZiAob3B0aW9uLnN0YXJ0c1dpdGgoImNvbm5lY3Rpb246IikpIHsKLSAgICAgICAgICAgICAgaWYgKG9wdGlvbi5lbmRzV2l0aCgia2VlcC1hbGl2ZSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmtlZXBBbGl2ZSkKLSAgICAgICAgICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gTWluTUxIVFRQU2VydmVyLnRoaXMuc3RhcnRLZWVwQWxpdmUoKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmtlZXBBbGl2ZSkgewotICAgICAgICAgICAgICAgICAgTWluTUxIVFRQU2VydmVyLnRoaXMuZW5kS2VlcEFsaXZlKCk7Ci0gICAgICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5zdGFydHNXaXRoKCJjb250ZW50LWxlbmd0aDoiKSkgewotICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChvcHRpb24uc3Vic3RyaW5nKDE1KS50cmltKCkpOwotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAvLyBUaGlzIGNhbiB0aHJvdyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLSAgICAgICAgICAgICAgLy8gSW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGFib3J0IHRoZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID09IC0xKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTWV0aG9kKGluLCBvdXQsIG1ldGhvZCwgdXJpLCB2ZXJzaW9uKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbiA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW4sIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgICAgICAgICBwcm9jZXNzTWV0aG9kKGxpbWl0ZWRJbiwgb3V0LCBtZXRob2QsIHVyaSwgdmVyc2lvbik7Ci0KLSAgICAgICAgICAgIGxpbWl0ZWRJbi5jbG9zZSgpOyAgLy8gc2tpcHMgdW5yZWFkIGJ5dGVzCi0gICAgICAgICAgfQotCi0gICAgICAgICAgb3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgfSB3aGlsZShjb250ZW50TGVuZ3RoICE9IC0xICYmIHRoaXMua2VlcEFsaXZlKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkgewotICAgICAgICBpZiAodGhpcy5rZWVwQWxpdmUgPT0gdHJ1ZSkgewotICAgICAgICAgIE1pbk1MSFRUUFNlcnZlci50aGlzLmVuZEtlZXBBbGl2ZSgpOwotICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTWV0aG9kKGZpbmFsIElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChtZXRob2QuZXF1YWxzSWdub3JlQ2FzZSgiR0VUIikpCi0gICAgICAgIHByb2Nlc3NHZXQoaW4sIG91dCwgdXJpLCB2ZXJzaW9uKTsKLSAgICAgIGVsc2UgaWYgKG1ldGhvZC5lcXVhbHNJZ25vcmVDYXNlKCJIRUFEIikpCi0gICAgICAgIHByb2Nlc3NIZWFkKGluLCBvdXQsIHVyaSwgdmVyc2lvbik7Ci0gICAgICBlbHNlIGlmIChtZXRob2QuZXF1YWxzSWdub3JlQ2FzZSgiUE9TVCIpKQotICAgICAgICBwcm9jZXNzUG9zdChpbiwgb3V0LCB1cmksIHZlcnNpb24pOwotICAgICAgZWxzZSBpZiAobWV0aG9kLmVxdWFsc0lnbm9yZUNhc2UoIlBVVCIpKQotICAgICAgICBwcm9jZXNzUHV0KGluLCBvdXQsIHVyaSwgdmVyc2lvbik7Ci0gICAgICBlbHNlCi0gICAgICAgIHByb2Nlc3NPdGhlcihpbiwgb3V0LCBtZXRob2QsIHVyaSwgdmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dldChmaW5hbCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgb3V0LndyaXRlKHZlcnNpb24uZ2V0Qnl0ZXMoKSk7Ci0gICAgICBvdXQud3JpdGUoZXJyb3JNZXNzYWdlMSk7Ci0gICAgICBvdXQud3JpdGUoZ2V0KTsKLSAgICAgIG91dC53cml0ZShlcnJvck1lc3NhZ2UyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGVhZChmaW5hbCBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24pCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgb3V0LndyaXRlKHZlcnNpb24uZ2V0Qnl0ZXMoKSk7Ci0gICAgICBvdXQud3JpdGUoZXJyb3JNZXNzYWdlMSk7Ci0gICAgICBvdXQud3JpdGUoaGVhZCk7Ci0gICAgICBvdXQud3JpdGUoZXJyb3JNZXNzYWdlMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Bvc3QoZmluYWwgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIG91dC53cml0ZSh2ZXJzaW9uLmdldEJ5dGVzKCkpOwotICAgICAgb3V0LndyaXRlKGVycm9yTWVzc2FnZTEpOwotICAgICAgb3V0LndyaXRlKHBvc3QpOwotICAgICAgb3V0LndyaXRlKGVycm9yTWVzc2FnZTIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQdXQoZmluYWwgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIG91dC53cml0ZSh2ZXJzaW9uLmdldEJ5dGVzKCkpOwotICAgICAgb3V0LndyaXRlKGVycm9yTWVzc2FnZTEpOwotICAgICAgb3V0LndyaXRlKHB1dCk7Ci0gICAgICBvdXQud3JpdGUoZXJyb3JNZXNzYWdlMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc090aGVyKGZpbmFsIElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbikKLSAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICBvdXQud3JpdGUodmVyc2lvbi5nZXRCeXRlcygpKTsKLSAgICAgIG91dC53cml0ZShlcnJvck1lc3NhZ2UxKTsKLSAgICAgIG91dC53cml0ZShtZXRob2QuZ2V0Qnl0ZXMoKSk7Ci0gICAgICBvdXQud3JpdGUoZXJyb3JNZXNzYWdlMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVLZWVwQWxpdmUoZmluYWwgT3V0cHV0U3RyZWFtIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJlcy53cml0ZSh0aGlzLmtlZXBBbGl2ZSA/IGtlZXBDb25uZWN0aW9uIDogY2xvc2VDb25uZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZWFkTGluZShmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgbmV4dEJ5dGU7Ci0KLSAgICAgIHRoaXMuY291bnQgPSAwOwotCi0gICAgICB3aGlsZSAoISgobmV4dEJ5dGUgPSBpbi5yZWFkKCkpID09ICdccicgJiYgKG5leHRCeXRlID0gaW4ucmVhZCgpKSA9PSdcbicpICYmIG5leHRCeXRlICE9IC0xKSB7Ci0gICAgICAJdGhpcy5idWZbdGhpcy5jb3VudF0gPSAoYnl0ZSluZXh0Qnl0ZTsKLQotICAgICAgICBpZiAodGhpcy5jb3VudCAhPSB0aGlzLmJ1Zi5sZW5ndGggLSAxKSB0aGlzLmNvdW50Kys7ICAgLy8gc29ydCBvZiBjcnVkZSBzaG91bGQgcHJvYmFibHkgaGFuZGxlIGxvbmcgbGluZXMgYmV0dGVyCi0gICAgICB9Ci0KLSAgICAgIHJldHVybiBuZXh0Qnl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTZdOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4ga2VlcEFsaXZlID0gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGludCBrZWVwQWxpdmVDb3VudCA9IDA7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgbWF4S2VlcEFsaXZlczsKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBzb2NrZXRSZWFkVGltZW91dDsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBva01lc3NhZ2UgPSAoIiAyMDAgT0sgXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNlcnZlcjogdWsuY28ud2lsc29uLm5ldC5odHRwLkhUVFBTZXJ2ZXJcclxuIikuZ2V0Qnl0ZXMoKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBlbmRPZkxpbmUgPSAiXHJcbiIuZ2V0Qnl0ZXMoKTsKLSAgCi0gIHN0YXRpYyBmaW5hbCBieXRlW10gZ2V0ID0gIkdFVCIuZ2V0Qnl0ZXMoKTsKLSAgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZWFkID0gIkhFQUQiLmdldEJ5dGVzKCk7Ci0gIHN0YXRpYyBmaW5hbCBieXRlW10gcG9zdCA9ICJQT1NUIi5nZXRCeXRlcygpOwotICBzdGF0aWMgZmluYWwgYnl0ZVtdIHB1dCA9ICJQVVQiLmdldEJ5dGVzKCk7Ci0gIHN0YXRpYyBmaW5hbCBieXRlW10gZXJyb3JNZXNzYWdlMSA9ICgiIDQwMCBCYWQgUmVxdWVzdFxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiU2VydmVyOiB1ay5jby53aWxzb24ubmV0Lmh0dHAuSFRUUFNlcnZlclxyXG5cclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1ldGhvZCAiKS5nZXRCeXRlcygpOwotCi0gIHN0YXRpYyBmaW5hbCBieXRlW10gZXJyb3JNZXNzYWdlMiA9ICIgbm90IGltcGxlbWVudGVkXHJcbiIuZ2V0Qnl0ZXMoKTsKLSAgc3RhdGljIGZpbmFsIGJ5dGVbXSBrZWVwQ29ubmVjdGlvbiA9ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcbiIuZ2V0Qnl0ZXMoKTsKLSAgc3RhdGljIGZpbmFsIGJ5dGVbXSBjbG9zZUNvbm5lY3Rpb24gPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIi5nZXRCeXRlcygpOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQveG1scnBjL1hNTFJQQ0ZhaWxFeGNlcHRpb24uamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L3htbHJwYy9YTUxSUENGYWlsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNGEzZTAuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9uZXQveG1scnBjL1hNTFJQQ0ZhaWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwgMjAwNSBKb2huIEcuIFdpbHNvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSB1ay5jby53aWxzb24ubmV0LnhtbHJwYzsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhNTFJQQ0ZhaWxFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZhdWx0U3RyaW5nOwotCXByaXZhdGUgZmluYWwgaW50IGZhdWx0Q29kZTsKLQkKLQlwdWJsaWMgWE1MUlBDRmFpbEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZmF1bHRTdHJpbmcsIGZpbmFsIGludCBmYXVsdENvZGUpIHsKLQkJc3VwZXIoZmF1bHRTdHJpbmcpOwotCQkKLQkJdGhpcy5mYXVsdFN0cmluZyA9IGZhdWx0U3RyaW5nOwotCQl0aGlzLmZhdWx0Q29kZSA9IGZhdWx0Q29kZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZhdWx0Q29kZSgpIHsKLQkJcmV0dXJuIGZhdWx0Q29kZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYXVsdFN0cmluZygpIHsKLQkJcmV0dXJuIGZhdWx0U3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L3htbHJwYy9YTUxSUENNZXNzYWdlUHJvY2Vzc29yLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL25ldC94bWxycGMvWE1MUlBDTWVzc2FnZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRmNDgyLi4wMDAwMDAwCi0tLSBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vbmV0L3htbHJwYy9YTUxSUENNZXNzYWdlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LCAyMDA1IEpvaG4gRy4gV2lsc29uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIHVrLmNvLndpbHNvbi5uZXQueG1scnBjOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgdWsuY28ud2lsc29uLm5ldC54bWxycGMuWE1MUlBDRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCB1ay5jby53aWxzb24ueG1sLk1pbk1MOwotCi1wdWJsaWMgY2xhc3MgWE1MUlBDTWVzc2FnZVByb2Nlc3NvciBleHRlbmRzIE1pbk1MIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzdGFydFJlc3BvbnNlID0gKCI8bWV0aG9kUmVzcG9uc2U+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0PHBhcmFtcz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdDxwYXJhbT5cbiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5kUmVzcG9uc2UgPSAoIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdDwvcGFyYW0+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdDwvcGFyYW1zPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9tZXRob2RSZXNwb25zZT4iKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHN0YXJ0RXJyb3IgPSAoIjxtZXRob2RSZXNwb25zZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQ8ZmF1bHQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHQ8dmFsdWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdDxzdHJ1Y3Q+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdFx0PG1lbWJlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDxuYW1lPmZhdWx0Q29kZTwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDx2YWx1ZT48aW50PiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWlkZGxlRXJyb3IgPSAoIjwvaW50PjwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdDwvbWVtYmVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHQ8bWVtYmVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDxuYW1lPmZhdWx0U3RyaW5nPC9uYW1lPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0XHRcdDx2YWx1ZT48c3RyaW5nPiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5kRXJyb3IgPSAoIjwvc3RyaW5nPjwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdDwvbWVtYmVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0PC9zdHJ1Y3Q+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0PC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0PC9mYXVsdD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbWV0aG9kUmVzcG9uc2U+XG4iKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gdHJhbnNsYXRlVGFibGUgPSAoCi0JCQkvLwotCQkJIlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0MiIKLQkJCS8vICAgICAgICAgICAgICAgICAgICBcdCAgICBcbiAgICAgICAgICAgICAgICBccgotCQkJKyAiXHUwMDQyXHUwMDQyXHUwMDQxXHUwMDQxXHUwMDQyXHUwMDQyXHUwMDQxXHUwMDQyIgotCQkJLy8KLQkJCSsgIlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0MiIKLQkJCS8vCi0JCQkrICJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDIiCi0JCQkvLyAgICAgICAgc3AgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJwotCQkJKyAiXHUwMDQxXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyIgotCQkJLy8gICAgICAgICAoICAgICkgICAgICogICAgICsgICAgICwgICAgIC0gICAgIC4gICAgIC8KLQkJCSsgIlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDAzRVx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDAzRiIKLQkJCS8vICAgICAgICAgMCAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3Ci0JCQkrICJcdTAwMzRcdTAwMzVcdTAwMzZcdTAwMzdcdTAwMzhcdTAwMzlcdTAwM0FcdTAwM0IiCi0JCQkvLyAgICAgICAgIDggICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPwotCQkJKyAiXHUwMDNDXHUwMDNEXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQwXHUwMDQyXHUwMDQyIgotCQkJLy8gICAgICAgICBAICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICAgIEcKLQkJCSsgIlx1MDA0Mlx1MDAwMFx1MDAwMVx1MDAwMlx1MDAwM1x1MDAwNFx1MDAwNVx1MDAwNiIKLQkJCS8vICAgICAgICAgSCAgICBJICAgSiBLICAgTCAgICAgTSAgIE4gICBPCi0JCQkrICJcdTAwMDdcdTAwMDhcdFxuXHUwMDBCXHUwMDBDXHJcdTAwMEUiCi0JCQkvLyAgICAgICAgIFAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICBXCi0JCQkrICJcdTAwMEZcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTYiCi0JCQkvLyAgICAgICAgIFggICAgWSAgICAgWiAgICAgWyAgICAgXCAgICAgXSAgICAgXiAgICBfCi0JCQkrICJcdTAwMTdcdTAwMThcdTAwMTlcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDIiCi0JCQkvLyAgICAgICAgICcgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAgZwotCQkJKyAiXHUwMDQyXHUwMDFBXHUwMDFCXHUwMDFDXHUwMDFEXHUwMDFFXHUwMDFGXHUwMDIwIgotCQkJLy8gICAgICAgIGggICBpICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAgICBwCi0JCQkrICJcdTAwMjFcIlx1MDAyM1x1MDAyNFx1MDAyNVx1MDAyNlx1MDAyN1x1MDAyOCIKLQkJCS8vICAgICAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3Ci0JCQkrICJcdTAwMjlcdTAwMkFcdTAwMkJcdTAwMkNcdTAwMkRcdTAwMkVcdTAwMkZcdTAwMzAiCi0JCQkvLyAgICAgICAgeCAgICAgeSAgICAgegotCQkJKyAiXHUwMDMxXHUwMDMyXHUwMDMzIikuZ2V0Qnl0ZXMoKTsKLQkKLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIEVtaXR0ZXIgewotCQl2b2lkIGVtaXQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgWE1MUlBDRmFpbEV4Y2VwdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBNYXAgZWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCWZpbmFsIGNoYXJbXSB0VGFibGUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLnRvQ2hhckFycmF5KCk7Ci0JCQotCQllbGVtZW50cy5wdXQoSW50ZWdlci5jbGFzcywKLQkJCQluZXcgRW1pdHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZW1pdChmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBmaW5hbCBPYmplY3QgaW50ZWdlcikgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgiPHZhbHVlPjxpND4iKS5hcHBlbmQoaW50ZWdlcikuYXBwZW5kKCI8L2k0PjwvdmFsdWU+Iik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJZWxlbWVudHMucHV0KENoYXJhY3Rlci5jbGFzcywgCi0gICAgICAgIG5ldyBFbWl0dGVyKCkgewotICAgICAgICAgIHB1YmxpYyB2b2lkIGVtaXQoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgT2JqZWN0IGNoYXJhY3RlcikgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPHZhbHVlPjxpND4iKS5hcHBlbmQoKGludCkoKENoYXJhY3RlciljaGFyYWN0ZXIpLmNoYXJWYWx1ZSgpKS5hcHBlbmQoIjwvaTQ+PC92YWx1ZT4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCQllbGVtZW50cy5wdXQoQnl0ZS5jbGFzcywgZWxlbWVudHMuZ2V0KEludGVnZXIuY2xhc3MpKTsKLSAgICBlbGVtZW50cy5wdXQoU2hvcnQuY2xhc3MsIGVsZW1lbnRzLmdldChJbnRlZ2VyLmNsYXNzKSk7Ci0gICAgZWxlbWVudHMucHV0KExvbmcuY2xhc3MsIGVsZW1lbnRzLmdldChJbnRlZ2VyLmNsYXNzKSk7Ci0gICAgZWxlbWVudHMucHV0KEJpZ0ludGVnZXIuY2xhc3MsIGVsZW1lbnRzLmdldChJbnRlZ2VyLmNsYXNzKSk7Ci0JCQotCQllbGVtZW50cy5wdXQoRG91YmxlLmNsYXNzLAotCQkJCW5ldyBFbWl0dGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlbWl0KGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGZpbmFsIE9iamVjdCBudW1iZXIpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48ZG91YmxlPiIpLmFwcGVuZChudW1iZXIpLmFwcGVuZCgiPC9kb3VibGU+PC92YWx1ZT4iKTsKLQkJCQkJfQotCQkJCX0pOwotCQllbGVtZW50cy5wdXQoRmxvYXQuY2xhc3MsIGVsZW1lbnRzLmdldChEb3VibGUuY2xhc3MpKTsKLQkJZWxlbWVudHMucHV0KEJpZ0RlY2ltYWwuY2xhc3MsIGVsZW1lbnRzLmdldChEb3VibGUuY2xhc3MpKTsKLQkJCi0JCWVsZW1lbnRzLnB1dChTdHJpbmcuY2xhc3MsCi0JCQkJbmV3IEVtaXR0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVtaXQoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgT2JqZWN0IHN0cmluZykgdGhyb3dzIFhNTFJQQ0ZhaWxFeGNlcHRpb24gewotCQkJCQkJZW5jb2RlU3RyaW5nKGJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48c3RyaW5nPiIpLCBzdHJpbmcudG9TdHJpbmcoKSkuYXBwZW5kKCI8L3N0cmluZz48L3ZhbHVlPiIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQllbGVtZW50cy5wdXQoQm9vbGVhbi5jbGFzcywKLQkJCQluZXcgRW1pdHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZW1pdChmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBmaW5hbCBPYmplY3QgYm9vbCkgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgiPHZhbHVlPjxib29sZWFuPiIpLmFwcGVuZCgoKChCb29sZWFuKWJvb2wpLmJvb2xlYW5WYWx1ZSgpKSA/ICIxIiA6ICIwIikuYXBwZW5kKCI8L2Jvb2xlYW4+PC92YWx1ZT4iKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJZWxlbWVudHMucHV0KGJ5dGVbXS5jbGFzcywKLQkJCQluZXcgRW1pdHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZW1pdChmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBmaW5hbCBPYmplY3QgYnl0ZXMpIHsKLQkJCQkJCWludCBjaGFyQ291bnQgPSAwOwotCQkJCQkJZmluYWwgYnl0ZVtdIGRhdGEgPSAoYnl0ZVtdKWJ5dGVzOwotCQkJCQkJZmluYWwgaW50IG51bUNoYXJzID0gKChkYXRhLmxlbmd0aCArIDIpIC8gMykgKiA0OwotCQkJCQkJZmluYWwgaW50IGRMaW1pdCA9IChkYXRhLmxlbmd0aCAvIDMpICogMzsKLQkJCQkJCQotCQkJCQkJYnVmZmVyLmVuc3VyZUNhcGFjaXR5KG51bUNoYXJzICsgMTI4ICsgKGRhdGEubGVuZ3RoIC8gNTQpKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48YmFzZTY0PlxuIik7Ci0KLQkJCQkJCWZvciAoaW50IGRJbmRleCA9IDA7IGRJbmRleCAhPSBkTGltaXQ7IGRJbmRleCArPSAzKSB7Ci0JCQkJCQkJaW50IGQgPSAoKGRhdGFbZEluZGV4XSAmIDBYRkYpIDw8IDE2KSB8ICAoKGRhdGFbZEluZGV4ICsgMV0gJiAwWEZGKSA8PCA4KSB8IChkYXRhW2RJbmRleCArIDJdICYgMFhGRik7Ci0KLQkJCQkJCQlidWZmZXIuYXBwZW5kKHRUYWJsZVtkID4+IDE4XSk7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCh0VGFibGVbKGQgPj4gMTIpICYgMFgzRl0pOwotCQkJCQkJCWJ1ZmZlci5hcHBlbmQodFRhYmxlWyhkID4+IDYpICYgMFgzRl0pOwotCQkJCQkJCWJ1ZmZlci5hcHBlbmQodFRhYmxlW2QgJiAwWDNGXSk7Ci0KLQkJCQkJCQlpZiAoKytjaGFyQ291bnQgPT0gMTgpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCQkJCQkJY2hhckNvdW50ID0gMDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChkTGltaXQgIT0gZGF0YS5sZW5ndGgpIHsKLQkJCQkJCQlpbnQgZCA9IChkYXRhW2RMaW1pdF0gJiAwWEZGKSA8PCAxNjsKLQotCQkJCQkJCWlmIChkTGltaXQgKyAxICE9IGRhdGEubGVuZ3RoKSB7Ci0JCQkJCQkJCWQgfD0gKGRhdGFbZExpbWl0ICsgMV0gJiAwWEZGKSA8PCA4OwotCQkJCQkJCX0KLQotCQkJCQkJCWJ1ZmZlci5hcHBlbmQodFRhYmxlW2QgPj4gMThdKTsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHRUYWJsZVsoZCA+PiAxMikgJiAwWDNGXSk7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgoZExpbWl0ICsgMSA8IGRhdGEubGVuZ3RoKSA/IHRUYWJsZVsoZCA+PiA2KSAmIDBYM0ZdIDogJz0nKTsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuPC9iYXNlNjQ+PC92YWx1ZT4iKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJZWxlbWVudHMucHV0KERhdGUuY2xhc3MsCi0JCQkJbmV3IEVtaXR0ZXIoKSB7Ci0JCQkJCXByaXZhdGUgZmluYWwgRGF0ZUZvcm1hdCBkYXRlVGltZSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgieXl5eU1NZGQnVCdISDptbTpzcyIpOwotCQkJCQkKLQkJCQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVtaXQoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgT2JqZWN0IGRhdGUpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4iKS5hcHBlbmQodGhpcy5kYXRlVGltZS5mb3JtYXQoKERhdGUpZGF0ZSkpLmFwcGVuZCgiPC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+Iik7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlbWl0Q2FsbChmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gcGFyYW1zLCBmaW5hbCBpbnQgbnVtYmVyT2ZwYXJhbXMpIHRocm93cyBYTUxSUENGYWlsRXhjZXB0aW9uIHsKLSAgICBlbmNvZGVTdHJpbmcoYnVmZmVyLmFwcGVuZCgiPG1ldGhvZENhbGw+XG5cdDxtZXRob2ROYW1lPiIpLCBtZXRob2ROYW1lKS5hcHBlbmQoIjwvbWV0aG9kTmFtZT5cblx0PHBhcmFtcz5cbiIpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbnVtYmVyT2ZwYXJhbXM7IGkrKykgewotICAgICAgZW1pdChidWZmZXIuYXBwZW5kKCJcdFx0PHBhcmFtPiIpLCBwYXJhbXNbaV0pLmFwcGVuZCgiPC9wYXJhbT5cbiIpOwotICAgIH0KLQotICAgIHJldHVybiBidWZmZXIuYXBwZW5kKCJcdDwvcGFyYW1zPlxuPC9tZXRob2RDYWxsPlxuIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGVtaXRSZXN1bHQoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgT2JqZWN0IHJlc3VsdCkgdGhyb3dzIFhNTFJQQ0ZhaWxFeGNlcHRpb24gewotICAgIGJ1ZmZlci5hcHBlbmQoc3RhcnRSZXNwb25zZSk7Ci0gICAgZW1pdChidWZmZXIsIHJlc3VsdCk7Ci0gICAgYnVmZmVyLmFwcGVuZChlbmRSZXNwb25zZSk7Ci0gICAgCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZW1pdEVycm9yKGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGZpbmFsIGludCBjb2RlVmFsdWUsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgWE1MUlBDRmFpbEV4Y2VwdGlvbiB7Ci0gICAgYnVmZmVyLmFwcGVuZChzdGFydEVycm9yKTsKLSAgICBlbWl0KGJ1ZmZlciwgU3RyaW5nLnZhbHVlT2YoY29kZVZhbHVlKSk7Ci0gICAgYnVmZmVyLmFwcGVuZChtaWRkbGVFcnJvcik7Ci0gICAgZW1pdChidWZmZXIsIG1lc3NhZ2UpOwotICAgIGJ1ZmZlci5hcHBlbmQoZW5kRXJyb3IpOwotICAgIAotICAgIHJldHVybiBidWZmZXI7Ci0gIH0KLSAgCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVmZmVyIGVtaXQoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgT2JqZWN0IHBhcmFtKSB0aHJvd3MgWE1MUlBDRmFpbEV4Y2VwdGlvbiB7Ci0JCWlmIChwYXJhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgWE1MUlBDRmFpbEV4Y2VwdGlvbigiYW4gWE1MLVJQQyBkYXRhIHZhbHVlIGNhbm5vdCBiZSBudWxsIiwgMCk7Ci0JCX0KLQkJCi0JCWZpbmFsIEVtaXR0ZXIgZW1pdHRlciA9IChFbWl0dGVyKWVsZW1lbnRzLmdldChwYXJhbS5nZXRDbGFzcygpKTsKLQkJCi0JCWlmIChlbWl0dGVyID09IG51bGwpIHsKLQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9ICgoTGlzdClwYXJhbSkuaXRlcmF0b3IoKTsKLQkJCQkKLQkJCQlidWZmZXIuYXBwZW5kKCI8dmFsdWU+PGFycmF5PjxkYXRhPiIpOwotCQkJCQotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJZW1pdChidWZmZXIsIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWJ1ZmZlci5hcHBlbmQoIjwvZGF0YT48L2FycmF5PjwvdmFsdWU+Iik7Ci0JCQkJCi0gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgZmluYWwgT2JqZWN0W10gYXJyYXkgPSAoT2JqZWN0W10pcGFyYW07Ci0gICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48YXJyYXk+PGRhdGE+Iik7Ci0gICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGVtaXQoYnVmZmVyLCBhcnJheVtpXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvZGF0YT48L2FycmF5PjwvdmFsdWU+Iik7Ci0gICAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgaW50W10pIHsKLSAgICAgICAgZmluYWwgaW50W10gYXJyYXkgPSAoaW50W10pcGFyYW07Ci0gICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48YXJyYXk+PGRhdGE+Iik7Ci0gICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGVtaXQoYnVmZmVyLCBuZXcgSW50ZWdlcihhcnJheVtpXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8L2RhdGE+PC9hcnJheT48L3ZhbHVlPiIpOwotICAgICAgICAgIAotICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIGxvbmdbXSkgewotICAgICAgICBmaW5hbCBsb25nW10gYXJyYXkgPSAobG9uZ1tdKXBhcmFtOwotICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8dmFsdWU+PGFycmF5PjxkYXRhPiIpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBlbWl0KGJ1ZmZlciwgbmV3IExvbmcoYXJyYXlbaV0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT4iKTsKLSAgICAgICAgICAKLSAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBzaG9ydFtdKSB7Ci0gICAgICAgIGZpbmFsIHNob3J0W10gYXJyYXkgPSAoc2hvcnRbXSlwYXJhbTsKLSAgICAgICAgCi0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPHZhbHVlPjxhcnJheT48ZGF0YT4iKTsKLSAgICAgICAgCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZW1pdChidWZmZXIsIG5ldyBTaG9ydChhcnJheVtpXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8L2RhdGE+PC9hcnJheT48L3ZhbHVlPiIpOwotICAgICAgICAgIAotICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIGNoYXJbXSkgewotICAgICAgICBmaW5hbCBjaGFyW10gYXJyYXkgPSAoY2hhcltdKXBhcmFtOwotICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8dmFsdWU+PGFycmF5PjxkYXRhPiIpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBlbWl0KGJ1ZmZlciwgbmV3IENoYXJhY3RlcihhcnJheVtpXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8L2RhdGE+PC9hcnJheT48L3ZhbHVlPiIpOwotICAgICAgICAgIAotICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIGZsb2F0W10pIHsKLSAgICAgICAgZmluYWwgZmxvYXRbXSBhcnJheSA9IChmbG9hdFtdKXBhcmFtOwotICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8dmFsdWU+PGFycmF5PjxkYXRhPiIpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBlbWl0KGJ1ZmZlciwgbmV3IEZsb2F0KGFycmF5W2ldKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvZGF0YT48L2FycmF5PjwvdmFsdWU+Iik7Ci0gICAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgZG91YmxlW10pIHsKLSAgICAgICAgZmluYWwgZG91YmxlW10gYXJyYXkgPSAoZG91YmxlW10pcGFyYW07Ci0gICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48YXJyYXk+PGRhdGE+Iik7Ci0gICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGVtaXQoYnVmZmVyLCBuZXcgRG91YmxlKGFycmF5W2ldKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvZGF0YT48L2FycmF5PjwvdmFsdWU+Iik7Ci0gICAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgYm9vbGVhbltdKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSBhcnJheSA9IChib29sZWFuW10pcGFyYW07Ci0gICAgICAgIAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48YXJyYXk+PGRhdGE+Iik7Ci0gICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGVtaXQoYnVmZmVyLCBuZXcgQm9vbGVhbihhcnJheVtpXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8L2RhdGE+PC9hcnJheT48L3ZhbHVlPiIpOwotICAgICAgICAgIAotICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIE1hcCkgewotCQkJCWZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0oKE1hcClwYXJhbSkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQotCQkJCWJ1ZmZlci5hcHBlbmQoIjx2YWx1ZT48c3RydWN0PiIpOwotCQkJCQotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmaW5hbCBPYmplY3QgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCQotCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgWE1MUlBDRmFpbEV4Y2VwdGlvbigidGhlIG5hbWUgb2YgYSBzdHJ1Y3QgZWxlbWVudCBjYW5ub3QgYmUgbnVsbCIsIDApOwotCQkJCQl9Ci0JCQkJCQotCQkJCQllbWl0KGVuY29kZVN0cmluZyhidWZmZXIuYXBwZW5kKCI8bWVtYmVyPjxuYW1lPiIpLCBuYW1lLnRvU3RyaW5nKCkpLmFwcGVuZCgiPC9uYW1lPiIpLCBlbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoIjwvbWVtYmVyPiIpOwotCQkJCX0KLQkJCQkKLQkJCQlidWZmZXIuYXBwZW5kKCI8L3N0cnVjdD48L3ZhbHVlPiIpOwotCQkJfSBlbHNlIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gV29yayB1cCB0aGUgY2hhaW4gb2YgY2xhc3NlcyB0byBzZWUgaWYgdGhpcyBpcwotICAgICAgICAvLyAgYSBzdWJjbGFzcyBvZiBhIGNsYXNzIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgLy8KLQkJCSAgQ2xhc3Mgc3VwZXJDbGFzcyA9IHBhcmFtLmdldENsYXNzKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBmaW5hbCBFbWl0dGVyIHN1cGVyRW1pdHRlciA9IChFbWl0dGVyKWVsZW1lbnRzLmdldChzdXBlckNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgICAgaWYgKHN1cGVyRW1pdHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBlckVtaXR0ZXIuZW1pdChidWZmZXIsIHBhcmFtKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3VwZXJDbGFzcyA9PSBPYmplY3QuY2xhc3MpIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFJQQ0ZhaWxFeGNlcHRpb24ocGFyYW0uZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgc3VwcG9ydGVkIFhNTC1SUEMgZGF0YSB0eXBlIiwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgIHsKLSAgICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCQkJfQotCQl9IGVsc2UgewotCQkJZW1pdHRlci5lbWl0KGJ1ZmZlciwgcGFyYW0pOwotCQl9Ci0JCQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlbmNvZGVTdHJpbmcoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZmluYWwgU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFJQQ0ZhaWxFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSAhPSBzdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJZmluYWwgY2hhciBjID0gc3RyaW5nLmNoYXJBdChpKTsKLQkJCQotCQkJaWYgKGMgPj0gMFgyMCB8fCBjID09IDBYMDkgfHwgYyA9PSAwWDBBIHx8IGMgPT0gMFgwRCkgewotCQkJCWlmIChjID09ICc+JykgewotCQkJCQlidWZmZXIuYXBwZW5kKCImZ3Q7Iik7Ci0JCQkJfSBlbHNlIGlmIChjID09ICc8JykgewotCQkJCQlidWZmZXIuYXBwZW5kKCImbHQ7Iik7Ci0JCQkJfSBlbHNlIGlmIChjID09ICcmJykgewotCQkJCQlidWZmZXIuYXBwZW5kKCImYW1wOyIpOwotCQkJCX0gZWxzZSBpZiAoYyA+IDB4ZmYpIHsKLQkJCQkJaWYgKGMgPiAwWEQ4MDAgJiYgIShjID49IDBYRTAwMCAmJiBjIDwgMFhGRkZFKSkgCi0JCQkJCQl0aHJvdyBuZXcgWE1MUlBDRmFpbEV4Y2VwdGlvbigiQ2FuJ3QgaW5jbHVkZSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSAweCIKLQkJCQkJCQkJCQkJICAgCQkgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpCi0JCQkJCQkJCQkJCQkJICsgIiBpbiBhIHdlbGwgZm9ybWVkIFhNTCBkb2N1bWVudCIsCi0JCQkJCQkJCQkJCQkJIDApOwotCQkJCQkKLQotCQkJCQlidWZmZXIuYXBwZW5kKCImI3giKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhjKSkuYXBwZW5kKCc7Jyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKCJDYW4ndCBpbmNsdWRlIGNoYXJhY3RlciB3aXRoIHZhbHVlIDB4IgotCQkJCQkJICAgICAgICAgICAgICAgCQkgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpCi0JCQkJCQkJCQkJCSArICIgaW4gYSB3ZWxsIGZvcm1lZCBYTUwgZG9jdW1lbnQiLAotCQkJCQkJCQkJCQkgMCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcGFyYW1zID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsKLQlwcml2YXRlIE1hcCBzdHJ1Y3QgPSBudWxsOwotCXByaXZhdGUgTGlzdCBhcnJheSA9IG51bGw7Ci0JcHJpdmF0ZSBCb29sZWFuIGluQXJyYXkgPSBCb29sZWFuLkZBTFNFOwotCXByaXZhdGUgU3RhY2sgYWdncmVnYXRlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIGJvb2xlYW4gZ290VmFsdWUgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBEYXRlRm9ybWF0IGRhdGVUaW1lID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXlNTWRkJ1QnSEg6bW06c3MiKTsKLQlwcml2YXRlIGZpbmFsIERhdGVGb3JtYXQgZGF0ZVRpbWUxID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcydaJyIpOwotCXByaXZhdGUgZmluYWwgQm9vbGVhbiBib29sc1tdID0ge0Jvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRX07Ci0gIAotICBwdWJsaWMgdm9pZCBwYXJzZU1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MUlBDRmFpbEV4Y2VwdGlvbiB7IAotICAgIHRyeSB7Ci0gICAgICBwYXJzZShuZXcgU3RyaW5nUmVhZGVyKG1lc3NhZ2UpKTsKLSAgICB9IGNhdGNoIChmaW5hbCBYTUxSUENGYWlsRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IGU7Ci0gICAgfSBjYXRjaCAoZmluYWwgU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKCJYTUwgZXJyb3IgaW4gcmVzcG9uc2UgZnJvbSByZW1vdGUgc3lzdGVtOiAiICsgZS5nZXRNZXNzYWdlKCksIDApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFyc2VNZXNzYWdlKGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFJQQ0ZhaWxFeGNlcHRpb24geyAKLQkJdHJ5IHsKLQkJCXBhcnNlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgIklTTy04ODU5LTEiKSk7Ci0JCX0gY2F0Y2ggKGZpbmFsIFhNTFJQQ0ZhaWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoZmluYWwgU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKCJYTUwgZXJyb3IgaW4gcmVzcG9uc2UgZnJvbSByZW1vdGUgc3lzdGVtOiAiICsgZS5nZXRNZXNzYWdlKCksIDApOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIChMaXN0KXRoaXMucGFyYW1zOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1ldGhvZE5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEF0dHJpYnV0ZUxpc3QgYXR0cmlidXRlcykgewotCQlpZiAoInZhbHVlIi5lcXVhbHMobmFtZSkgfHwgIm5hbWUiLmVxdWFscyhuYW1lKSB8fCAibWV0aG9kTmFtZSIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLmJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQl0aGlzLmdvdFZhbHVlID0gZmFsc2U7Ci0JCQl0aGlzLmFnZ3JlZ2F0ZVN0YWNrLnB1c2godGhpcy5pbkFycmF5KTsKLQkJCXRoaXMuaW5BcnJheSA9IEJvb2xlYW4uRkFMU0U7Ci0JCX0gZWxzZSBpZiAoInN0cnVjdCIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLmFnZ3JlZ2F0ZVN0YWNrLnB1c2godGhpcy5zdHJ1Y3QpOwotCQkJdGhpcy5hZ2dyZWdhdGVTdGFjay5wdXNoKHRoaXMubmFtZSk7Ci0JCQl0aGlzLnN0cnVjdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0gZWxzZSBpZiAoImFycmF5Ii5lcXVhbHMobmFtZSkgfHwgInBhcmFtcyIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLmFnZ3JlZ2F0ZVN0YWNrLnB1c2godGhpcy5pbkFycmF5KTsKLQkJCXRoaXMuaW5BcnJheSA9IEJvb2xlYW4uVFJVRTsKLQkJCXRoaXMuYWdncmVnYXRlU3RhY2sucHVzaCh0aGlzLmFycmF5KTsKLQkJCXRoaXMuYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuYnVmZmVyLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKCJ2YWx1ZSIuZXF1YWxzKG5hbWUpKSB7Ci0JCQlpZiAoIXRoaXMuZ290VmFsdWUpIHsKLQkJCQl0aGlzLnBhcmFtcyA9IHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJdGhpcy5nb3RWYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCXRoaXMuaW5BcnJheSA9IChCb29sZWFuKXRoaXMuYWdncmVnYXRlU3RhY2sucG9wKCk7Ci0JCQkKLQkJCWlmICh0aGlzLmluQXJyYXkuYm9vbGVhblZhbHVlKCkpCi0JCQkJdGhpcy5hcnJheS5hZGQodGhpcy5wYXJhbXMpOwotCQl9IGVsc2UgaWYgKCJzdHJpbmciLmVxdWFscyhuYW1lKSkgewotCQkJdGhpcy5wYXJhbXMgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCQkJdGhpcy5nb3RWYWx1ZSA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoImk0Ii5lcXVhbHMobmFtZSkgfHwgImludCIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLnBhcmFtcyA9IG5ldyBJbnRlZ2VyKHRoaXMuYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJdGhpcy5nb3RWYWx1ZSA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoImJvb2xlYW4iLmVxdWFscyhuYW1lKSkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnBhcmFtcyA9IHRoaXMuYm9vbHNbSW50ZWdlci5wYXJzZUludCh0aGlzLmJ1ZmZlci50b1N0cmluZygpKV07Ci0JCQl9Ci0JCQljYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFhNTFJQQ0ZhaWxFeGNlcHRpb24oImJhZCBCb29sZWFuIHZhbHVlOiAiICsgdGhpcy5idWZmZXIudG9TdHJpbmcoKSwgMCk7Ci0JCQl9Ci0JCQkKLQkJCXRoaXMuZ290VmFsdWUgPSB0cnVlOwotCQl9IGVsc2UgaWYgKCJkYXRlVGltZS5pc284NjAxIi5lcXVhbHMobmFtZSkpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXRoaXMucGFyYW1zID0gdGhpcy5kYXRlVGltZS5wYXJzZSh0aGlzLmJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCQkvLyBTb21lIGltcGxlbWVudGF0aW9ucyBwcm9kdWNlIGZ1bm55IGZvcm1hdHMgCi0JCQkJLy8gVHJ5IGFuIGFsdGVybmF0ZSBmb3JtYXQKLQkJCQkvLwotCQkJCXRyeSB7Ci0JCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJdGhpcy5wYXJhbXMgPSB0aGlzLmRhdGVUaW1lMS5wYXJzZSh0aGlzLmJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCXRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCAwKTsJLy8gdGhyb3cgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbgotCQkJCX0KLQkJCX0KLQkJCXRoaXMuZ290VmFsdWUgPSB0cnVlOwotCQl9IGVsc2UgaWYgKCJiYXNlNjQiLmVxdWFscyhuYW1lKSkgewotCQkJaW50IGJ5dGVzSW5kZXggPSAwOwotCQkJaW50IGJ5dGVTaGlmdCA9IDQ7Ci0JCQlpbnQgdG1wID0gMDsKLQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSAhPSB0aGlzLmJ1ZmZlci5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlmaW5hbCBjaGFyIGMgPSB0aGlzLmJ1ZmZlci5jaGFyQXQoaSk7Ci0JCQlmaW5hbCBpbnQgc2l4Qml0ID0gKGMgPCAxMjMpID8gdHJhbnNsYXRlVGFibGVbY10gOiA2NjsKLQotCQkJCWlmIChzaXhCaXQgPCA2NCkgewotCQkJCQlpZiAoZG9uZSkgdGhyb3cgbmV3IFhNTFJQQ0ZhaWxFeGNlcHRpb24oIj0gY2hhcmFjdGVyIG5vdCBhdCBlbmQgb2YgYmFzZTY0IHZhbHVlIiwgMCk7Ci0JCi0JCQkJCXRtcCA9ICh0bXAgPDwgNikgfCBzaXhCaXQ7Ci0JCi0JCQkJCWlmIChieXRlU2hpZnQtLSAhPSA0KSB7Ci0JCQkJCQl0aGlzLmJ1ZmZlci5zZXRDaGFyQXQoYnl0ZXNJbmRleCsrLCAoY2hhcikoKHRtcCA+PiAoYnl0ZVNoaWZ0ICogMikpICYgMFhGRikpOwotCQkJCQl9Ci0JCi0JCQkJfSBlbHNlIGlmIChzaXhCaXQgPT0gNjQpIHsKLQkKLQkJCQkJYnl0ZVNoaWZ0LS07Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQotCQkJCX0gZWxzZSBpZiAoc2l4Qml0ID09IDY2KSB7Ci0JCQkJCS8vIFJGQyAyMDQ1IHNheXMgdGhhdCBJJ20gYWxsb3dlZCB0byB0YWtlIHRoZSBwcmVzZW5jZSBvZiAKLQkJCQkJLy8gdGhlc2UgY2hhcmFjdGVycyBhcyBldmVkZW5jZSBvZiBkYXRhIGNvcnJ1cHRpb24KLQkJCQkJLy8gU28gSSB3aWxsCi0JCQkJCXRocm93IG5ldyBYTUxSUENGYWlsRXhjZXB0aW9uKCJiYWQgY2hhcmFjdGVyIGluIGJhc2U2NCB2YWx1ZSIsIDApOwotCQkJCX0KLQotCQkJCWlmIChieXRlU2hpZnQgPT0gMCkgYnl0ZVNoaWZ0ID0gNDsKLQkJCX0KLQkJCXRoaXMuYnVmZmVyLnNldExlbmd0aChieXRlc0luZGV4KTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5wYXJhbXMgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCJJU08tODg1OS0xIik7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgWE1MUlBDRmFpbEV4Y2VwdGlvbigiQmFzZSA2NCBkZWNvZGUgcHJvZHVjZWQgYnl0ZSB2YWx1ZXMgPiAyNTUiLCAwKTsKLQkJCX0KLQkJCXRoaXMuZ290VmFsdWUgPSB0cnVlOwotCQl9IGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhuYW1lKSkgewotCQkJdGhpcy5wYXJhbXMgPSBuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWwodGhpcy5idWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl0aGlzLmdvdFZhbHVlID0gdHJ1ZTsKLQkJfSBlbHNlIGlmICgibmFtZSIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCQkJdGhpcy5pbkFycmF5ID0gKEJvb2xlYW4pdGhpcy5hZ2dyZWdhdGVTdGFjay5wb3AoKTsKLQkJfSBlbHNlIGlmICgibWVtYmVyIi5lcXVhbHMobmFtZSkpIHsKLQkJCXRoaXMuc3RydWN0LnB1dCh0aGlzLm5hbWUsIHRoaXMucGFyYW1zKTsKLQkJfSBlbHNlIGlmICgic3RydWN0Ii5lcXVhbHMobmFtZSkpIHsKLQkJCXRoaXMucGFyYW1zID0gdGhpcy5zdHJ1Y3Q7Ci0JCQl0aGlzLm5hbWUgPSAoU3RyaW5nKXRoaXMuYWdncmVnYXRlU3RhY2sucG9wKCk7Ci0JCQl0aGlzLnN0cnVjdCA9IChNYXApdGhpcy5hZ2dyZWdhdGVTdGFjay5wb3AoKTsKLQkJfSBlbHNlIGlmICgiYXJyYXkiLmVxdWFscyhuYW1lKSB8fCAicGFyYW1zIi5lcXVhbHMobmFtZSkpIHsKLQkJCXRoaXMucGFyYW1zID0gdGhpcy5hcnJheTsKLQkJCXRoaXMuYXJyYXkgPSAoTGlzdCl0aGlzLmFnZ3JlZ2F0ZVN0YWNrLnBvcCgpOwotCQkJdGhpcy5pbkFycmF5ID0gKEJvb2xlYW4pdGhpcy5hZ2dyZWdhdGVTdGFjay5wb3AoKTsKLQkJfSBlbHNlIGlmICgibWV0aG9kTmFtZSIuZXF1YWxzKG5hbWUpKSB7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCQkJdGhpcy5pbkFycmF5ID0gKEJvb2xlYW4pdGhpcy5hZ2dyZWdhdGVTdGFjay5wb3AoKTsKLQkJfSBlbHNlIGlmICgiZmF1bHQiLmVxdWFscyhuYW1lKSkgewotCQkvLwotCQkvLyBTb21lIGltcGxlbWVudGF0aW9ucyByZXR1cm4gU3RyaW5nIGZhdWx0IGNvZGVzIHJhdGhlciB0aGFuIGludGVnZXIgb25lcyAKLQkJLy8gVGhpcyBjb2RlIHRyaWVzIHRvIGRlYWwgZ3JhY2VmdWxseSB3aXRoIHRoaXMKLQkJLy8KLQkJCQotCQlmaW5hbCBPYmplY3QgZmF1bHRDb2RlID0gKChNYXApdGhpcy5wYXJhbXMpLmdldCgiZmF1bHRDb2RlIik7Ci0JCWZpbmFsIE9iamVjdCBmYXVsdFN0cmluZyA9ICgoTWFwKXRoaXMucGFyYW1zKS5nZXQoImZhdWx0U3RyaW5nIik7Ci0JCWZpbmFsIGludCBmYXVsdENvZGVWYWx1ZTsKLQkJZmluYWwgU3RyaW5nIGZhdWx0U3RyaW5nVmFsdWU7Ci0JCQotCQkJaWYgKGZhdWx0Q29kZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQlmYXVsdENvZGVWYWx1ZSA9ICgoSW50ZWdlcilmYXVsdENvZGUpLmludFZhbHVlKCk7Ci0JCQkJZmF1bHRTdHJpbmdWYWx1ZSA9IGZhdWx0U3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCWZhdWx0Q29kZVZhbHVlID0gMDsKLQkJCQlmYXVsdFN0cmluZ1ZhbHVlID0gZmF1bHRTdHJpbmcudG9TdHJpbmcoKSArICIgOiAiICsgZmF1bHRDb2RlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQotCQkJdGhyb3cgbmV3IFhNTFJQQ0ZhaWxFeGNlcHRpb24oZmF1bHRTdHJpbmdWYWx1ZSwgZmF1bHRDb2RlVmFsdWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vc21hY2t4L3BhY2tldC9KYWJiZXJSUEMuamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24vc21hY2t4L3BhY2tldC9KYWJiZXJSUEMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxOTM3NC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL3NtYWNreC9wYWNrZXQvSmFiYmVyUlBDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSB1ay5jby53aWxzb24uc21hY2t4LnBhY2tldDsKLQotaW1wb3J0IG9yZy5qaXZlc29mdHdhcmUuc21hY2sucGFja2V0LklROwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIEphYmJlclJQQyBleHRlbmRzIElRIHsKLSAgcHVibGljIEphYmJlclJQQyhmaW5hbCBTdHJpbmcgeG1sKSB7Ci0gICAgdGhpcy54bWwgPSAiPHF1ZXJ5IHhtbG5zPSdqYWJiZXI6aXE6cnBjJz5cbiIgKyB4bWwgKyAiXG48L3F1ZXJ5PiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRFbGVtZW50WE1MKCkgewotICAgIHJldHVybiB0aGlzLnhtbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeG1sOwotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi9zbWFja3gvcHJvdmlkZXJzL0phYmJlclJQQ1Byb3ZpZGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL3NtYWNreC9wcm92aWRlcnMvSmFiYmVyUlBDUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3Y2U3ZS4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvY28vd2lsc29uL3NtYWNreC9wcm92aWRlcnMvSmFiYmVyUlBDUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIHVrLmNvLndpbHNvbi5zbWFja3gucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5wYWNrZXQuSVE7Ci1pbXBvcnQgb3JnLmppdmVzb2Z0d2FyZS5zbWFjay5wcm92aWRlci5JUVByb3ZpZGVyOwotaW1wb3J0IG9yZy5qaXZlc29mdHdhcmUuc21hY2sudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotCi1pbXBvcnQgdWsuY28ud2lsc29uLnNtYWNreC5wYWNrZXQuSmFiYmVyUlBDOwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBXaWxzb24KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIEphYmJlclJQQ1Byb3ZpZGVyIGltcGxlbWVudHMgSVFQcm92aWRlciB7Ci0KLSAgcHVibGljIElRIHBhcnNlSVEoZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBFeGNlcHRpb24gewotICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgLy8gc2tpcCB0aGUgPHF1ZXJ5PiB0YWcgYnkgY2FsbGluZyBwYXJzZXIubmV4dCgpCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAocGFyc2VyLm5leHQoKSkgewotICAgICAgICBjYXNlIFhtbFB1bGxQYXJzZXIuVEVYVDoKLSAgICAgICAgICAvLyBXZSBuZWVkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGxpa2UgJiBhbmQgPAotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuZXNjYXBlRm9yWE1MKHBhcnNlci5nZXRUZXh0KCkpKTsKLSAgICAgICAgICBicmVhazsKLSAgCi0gICAgICAgIGNhc2UgWG1sUHVsbFBhcnNlci5TVEFSVF9UQUc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPCcgKyBwYXJzZXIuZ2V0TmFtZSgpICsgJz4nKTsKLSAgICAgICAgICBicmVhazsKLSAgCi0gICAgICAgIGNhc2UgWG1sUHVsbFBhcnNlci5FTkRfVEFHOgotICAgICAgICAgIGlmICgicXVlcnkiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgLy8gZG9uJ3Qgc2F2ZSB0aGUgPC9xdWVyeT4gZW5kIHRhZwotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYWJiZXJSUEMoYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC8iICsgcGFyc2VyLmdldE5hbWUoKSArICc+Jyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gIAotICAgICAgICBkZWZhdWx0OgotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi94bWwvTWluTUwuamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9jby93aWxzb24veG1sL01pbk1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTA0ZmMuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL2NvL3dpbHNvbi94bWwvTWluTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgSm9obiBHLiBXaWxzb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSB1ay5jby53aWxzb24ueG1sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5EVERIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IHVrLm9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKLWltcG9ydCB1ay5vcmcueG1sLnNheC5QYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBNaW5NTCBpbXBsZW1lbnRzIFBhcnNlciwgTG9jYXRvciwgRG9jdW1lbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmRTdGFydE5hbWUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWl0U3RhcnRFbGVtZW50ID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW1pdEVuZEVsZW1lbnQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWl0Q2hhcmFjdGVycyA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhdmVBdHRyaWJ1dGVOYW1lID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2F2ZUF0dHJpYnV0ZVZhbHVlID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhcnRDb21tZW50ID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kQ29tbWVudCA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluY0xldmVsID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjTGV2ZWwgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGFydENEQVRBID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZENEQVRBID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2Nlc3NDaGFyUmVmID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdyaXRlQ2RhdGEgPSAxMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhpdFBhcnNlciA9IDE0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZUVycm9yID0gMTU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpc2NhcmRBbmRDaGFuZ2UgPSAxNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlzY2FyZFNhdmVBbmRDaGFuZ2UgPSAxNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2F2ZUFuZENoYW5nZSA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGFuZ2UgPSAxOTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpblNraXBwaW5nID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5TVGFnID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5Qb3NzaWJseUF0dHJpYnV0ZSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluTmV4dEF0dHJpYnV0ZSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluQXR0cmlidXRlID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5BdHRyaWJ1dGUxID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5BdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluQXR0cmlidXRlUXVvdGVWYWx1ZSA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluQXR0cmlidXRlUXVvdGVzVmFsdWUgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbkVUYWcgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbkVUYWcxID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluTVRUYWcgPSAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5UYWcgPSAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5QSSA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpblBJMSA9IDE0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpblBvc3NpYmx5U2tpcHBpbmcgPSAxNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5DaGFyRGF0YSA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbkNEQVRBID0gMTc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluQ0RBVEExID0gMTg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluQ29tbWVudCA9MTk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluRFREID0gMjA7Ci0KLSAgcHVibGljIE1pbk1MKGZpbmFsIGludCBpbml0aWFsQnVmZmVyU2l6ZSwgZmluYWwgaW50IGJ1ZmZlckluY3JlbWVudCkgewotICAgIHRoaXMuaW5pdGlhbEJ1ZmZlclNpemUgPSBpbml0aWFsQnVmZmVyU2l6ZTsKLSAgICB0aGlzLmJ1ZmZlckluY3JlbWVudCA9IGJ1ZmZlckluY3JlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBNaW5NTCgpIHsKLSAgICB0aGlzKDI1NiwgMTI4KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIFJlYWRlciBpbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICBmaW5hbCBWZWN0b3IgYXR0cmlidXRlTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIGZpbmFsIFZlY3RvciBhdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgZmluYWwgQXR0cmlidXRlTGlzdCBhdHRycyA9IG5ldyBBdHRyaWJ1dGVMaXN0KCkgewotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoZmluYWwgaW50IGkpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKWF0dHJpYnV0ZU5hbWVzLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoZmluYWwgaW50IGkpIHsKLSAgICAgIHJldHVybiAiQ0RBVEEiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoZmluYWwgaW50IGkpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKWF0dHJpYnV0ZVZhbHVlcy5lbGVtZW50QXQoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gIkNEQVRBIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgZmluYWwgaW50IGluZGV4ID0gYXR0cmlidXRlTmFtZXMuaW5kZXhPZihuYW1lKTsKLQotICAgICAgcmV0dXJuIChpbmRleCA9PSAtMSkgPyBudWxsIDogKFN0cmluZylhdHRyaWJ1dGVWYWx1ZXMuZWxlbWVudEF0KGluZGV4KTsKLSAgICB9Ci0gIH07Ci0KLSAgZmluYWwgTWluTUxCdWZmZXIgYnVmZmVyID0gbmV3IE1pbk1MQnVmZmVyKGluKTsKLSAgaW50IGN1cnJlbnRDaGFyID0gMCwgY2hhckNvdW50ID0gMDsKLSAgaW50IGxldmVsID0gMDsKLSAgU3RyaW5nIGVsZW1lbnROYW1lID0gbnVsbDsKLSAgU3RyaW5nIHN0YXRlID0gb3BlcmFuZHNbaW5Ta2lwcGluZ107Ci0KLSAgICB0aGlzLmxpbmVOdW1iZXIgPSAxOwotICAgIHRoaXMuY29sdW1uTnVtYmVyID0gMDsKLQotICAgIHRyeSB7Ci1tYWluOiB3aGlsZSh0cnVlKSB7Ci0gICAgICAgIGNoYXJDb3VudCsrOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIHRoaXMgaXMgdG8gdHJ5IGFuZCBtYWtlIHRoZSBsb29wIGEgYml0IGZhc3RlcgotICAgICAgICAvLyBjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCk7IGlzIHNpbXBsZXIgYnV0IGlzIGEgYml0IHNsb3dlci4KLSAgICAgICAgLy8KLSAgICAgICAgY3VycmVudENoYXIgPSAoYnVmZmVyLm5leHRJbiA9PSBidWZmZXIubGFzdEluKSA/IGJ1ZmZlci5yZWFkKCkgOiBidWZmZXIuY2hhcnNbYnVmZmVyLm5leHRJbisrXTsKLQotICAgICAgICBmaW5hbCBpbnQgdHJhbnNpdGlvbjsKLQotICAgICAgICBpZiAoY3VycmVudENoYXIgPiAnXScpIHsKLSAgICAgICAgICB0cmFuc2l0aW9uID0gc3RhdGUuY2hhckF0KDE0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmluYWwgaW50IGNoYXJDbGFzcyA9IGNoYXJDbGFzc2VzW2N1cnJlbnRDaGFyICsgMV07Ci0KLSAgICAgICAgICBpZiAoY2hhckNsYXNzID09IC0xKSBmYXRhbEVycm9yKCJEb2N1bWVudCBjb250YWlucyBpbGxlZ2FsIGNvbnRyb2wgY2hhcmFjdGVyIHdpdGggdmFsdWUgIiArIGN1cnJlbnRDaGFyLCB0aGlzLmxpbmVOdW1iZXIsIHRoaXMuY29sdW1uTnVtYmVyKTsKLQotICAgICAgICAgIGlmIChjaGFyQ2xhc3MgPT0gMTIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gJ1xuJzsKLSAgICAgICAgICAgICAgY2hhckNvdW50ID0gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgIGlmIChjaGFyQ291bnQgPT0gMCkgY29udGludWU7ICAvLyBwcmVjZWVkZWQgYnkgJ1xyJyBzbyBpZ25vcmUKLQotICAgICAgICAgICAgICBpZiAoY2hhckNvdW50ICE9IC0xKSBjaGFyQ291bnQgPSAwOwotCi0gICAgICAgICAgICAgIHRoaXMubGluZU51bWJlcisrOwotICAgICAgICAgICAgICB0aGlzLmNvbHVtbk51bWJlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgdHJhbnNpdGlvbiA9IHN0YXRlLmNoYXJBdChjaGFyQ2xhc3MpOwotICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbHVtbk51bWJlcisrOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBvcGVyYW5kID0gb3BlcmFuZHNbdHJhbnNpdGlvbiA+Pj4gOF07Ci0KLSAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uICYgMFhGRikgewotICAgICAgICAgIGNhc2UgZW5kU3RhcnROYW1lOgotICAgICAgICAgIC8vIGVuZCBvZiBzdGFydCBlbGVtZW50IG5hbWUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lID0gYnVmZmVyLmdldFN0cmluZygpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyICE9ICc+JyAmJiBjdXJyZW50Q2hhciAhPSAnLycpIGJyZWFrOyAgLy8gY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLSAgICAgICAgICAgIC8vIGRyb3AgdGhyb3VnaCB0byBlbWl0IHN0YXJ0IGVsZW1lbnQgKHdlIGhhdmUgbm8gYXR0cmlidXRlcykKLQotICAgICAgICAgIGNhc2UgZW1pdFN0YXJ0RWxlbWVudDoKLSAgICAgICAgICAvLyBlbWl0IHN0YXJ0IGVsZW1lbnQKLQotICAgICAgICAgIGZpbmFsIFdyaXRlciBuZXdXcml0ZXIgPSB0aGlzLmV4dERvY3VtZW50SGFuZGxlci5zdGFydEVsZW1lbnQoZWxlbWVudE5hbWUsIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnRhZ3MuZW1wdHkoKSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHREb2N1bWVudEhhbmRsZXIuc3RhcnREb2N1bWVudChidWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldFdyaXRlcigpKTsKLQotICAgICAgICAgICAgYnVmZmVyLnB1c2hXcml0ZXIobmV3V3JpdGVyKTsKLSAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKGVsZW1lbnROYW1lKTsKLQotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcy5yZW1vdmVBbGxFbGVtZW50cygpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudENoYXIgIT0gJy8nKSBicmVhazsgIC8vIGNoYW5nZSBzdGF0ZSB0byBvcGVyYW5kCi0KLSAgICAgICAgICAgIC8vIDxlbGVtZW50Lz4gZHJvcCB0aHJvdWdoCi0KLSAgICAgICAgICBjYXNlIGVtaXRFbmRFbGVtZW50OgotICAgICAgICAgIC8vIGVtaXQgZW5kIGVsZW1lbnQKLQotICAgICAgICAgICAgaWYgKHRoaXMudGFncy5lbXB0eSgpKQotICAgICAgICAgICAgICBmYXRhbEVycm9yKCJlbmQgdGFnIGF0IGJlZ2luaW5nIG9mIGRvY3VtZW50IiwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbk51bWJlcik7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJlZ2luID0gKFN0cmluZyl0aGlzLnRhZ3MucG9wKCk7Ci0gICAgICAgICAgICBidWZmZXIucG9wV3JpdGVyKCk7Ci0gICAgICAgICAgICBlbGVtZW50TmFtZSA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyICE9ICcvJyAmJiAhZWxlbWVudE5hbWUuZXF1YWxzKGJlZ2luKSkgewotICAgICAgICAgICAgICBmYXRhbEVycm9yKCJlbmQgdGFnIDwvIiArIGVsZW1lbnROYW1lICsgIj4gZG9lcyBub3QgbWF0Y2ggYmVnaW4gdGFnIDwiICsgYmVnaW4gKyAiPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbk51bWJlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgCXRoaXMuZG9jdW1lbnRIYW5kbGVyLmVuZEVsZW1lbnQoYmVnaW4pOwotCi0gICAgICAgICAgICAgIGlmICh0aGlzLnRhZ3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAJdGhpcy5kb2N1bWVudEhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAgLy8gY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLQotCi0gICAgICAgICAgY2FzZSBlbWl0Q2hhcmFjdGVyczoKLSAgICAgICAgICAvLyBlbWl0IGNoYXJhY3RlcnMKLQotICAgICAgICAgICAgYnVmZmVyLmZsdXNoKCk7Ci0gICAgICAgICAgICBicmVhazsgIC8vIGNoYW5nZSBzdGF0ZSB0byBvcGVyYW5kCi0KLSAgICAgICAgICBjYXNlIHNhdmVBdHRyaWJ1dGVOYW1lOgotICAgICAgICAgIC8vIHNhdmUgYXR0cmlidXRlIG5hbWUKLQotICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMuYWRkRWxlbWVudChidWZmZXIuZ2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7ICAvLyBjaGFuZ2Ugc3RhdGUgdG8gb3BlcmFuZAotCi0gICAgICAgICAgY2FzZSBzYXZlQXR0cmlidXRlVmFsdWU6Ci0gICAgICAgICAgLy8gc2F2ZSBhdHRyaWJ1dGUgdmFsdWUKLQotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLmFkZEVsZW1lbnQoYnVmZmVyLmdldFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOyAgLy8gY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLQotICAgICAgICAgIGNhc2Ugc3RhcnRDb21tZW50OgotICAgICAgICAgIC8vIGNoYW5nZSBzdGF0ZSBpZiB3ZSBoYXZlIGZvdW5kICI8IS0tIgotCi0gICAgICAgICAgICBpZiAoYnVmZmVyLnJlYWQoKSAhPSAnLScpIGNvbnRpbnVlOyAvLyBub3QgIjwhLS0iCi0KLSAgICAgICAgICAgIGJyZWFrOyAgLy8gY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLQotICAgICAgICAgIGNhc2UgZW5kQ29tbWVudDoKLSAgICAgICAgICAvLyBjaGFuZ2Ugc3RhdGUgaWYgd2UgZmluZCAiLS0+IgotCi0gICAgICAgICAgICBpZiAoKGN1cnJlbnRDaGFyID0gYnVmZmVyLnJlYWQoKSkgPT0gJy0nKSB7Ci0gICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB3ZSBtaWdodCBoYXZlICItLS0tLS0tPiIKLSAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCkpID09ICctJyk7Ci0KLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICc+JykgYnJlYWs7ICAvLyBlbmQgb2YgY29tbWVudCwgY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm90IGVuZCBvZiBjb21tZW50LCBkb24ndCBjaGFuZ2Ugc3RhdGUKLQotICAgICAgICAgIGNhc2UgaW5jTGV2ZWw6Ci0KLSAgICAgICAgICAgIGxldmVsKys7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBkZWNMZXZlbDoKLQotICAgICAgICAgICAgaWYgKGxldmVsID09IDApIGJyZWFrOyAvLyBvdXRlciBsZXZlbCA8PiBjaGFuZ2Ugc3RhdGUKLQotICAgICAgICAgICAgbGV2ZWwtLTsKLQotICAgICAgICAgICAgY29udGludWU7IC8vIGluIG5lc3RlZCA8PiwgZG9uJ3QgY2hhbmdlIHN0YXRlCi0KLSAgICAgICAgICBjYXNlIHN0YXJ0Q0RBVEE6Ci0gICAgICAgICAgLy8gY2hhbmdlIHN0YXRlIGlmIHdlIGhhdmUgZm91bmQgIjwhW0NEQVRBWyIKLQotICAgICAgICAgICAgaWYgKGJ1ZmZlci5yZWFkKCkgIT0gJ0MnKSBjb250aW51ZTsgICAvLyBkb24ndCBjaGFuZ2Ugc3RhdGUKLSAgICAgICAgICAgIGlmIChidWZmZXIucmVhZCgpICE9ICdEJykgY29udGludWU7ICAgLy8gZG9uJ3QgY2hhbmdlIHN0YXRlCi0gICAgICAgICAgICBpZiAoYnVmZmVyLnJlYWQoKSAhPSAnQScpIGNvbnRpbnVlOyAgIC8vIGRvbid0IGNoYW5nZSBzdGF0ZQotICAgICAgICAgICAgaWYgKGJ1ZmZlci5yZWFkKCkgIT0gJ1QnKSBjb250aW51ZTsgICAvLyBkb24ndCBjaGFuZ2Ugc3RhdGUKLSAgICAgICAgICAgIGlmIChidWZmZXIucmVhZCgpICE9ICdBJykgY29udGludWU7ICAgLy8gZG9uJ3QgY2hhbmdlIHN0YXRlCi0gICAgICAgICAgICBpZiAoYnVmZmVyLnJlYWQoKSAhPSAnWycpIGNvbnRpbnVlOyAgIC8vIGRvbid0IGNoYW5nZSBzdGF0ZQotICAgICAgICAgICAgYnJlYWs7ICAvLyBjaGFuZ2Ugc3RhdGUgdG8gb3BlcmFuZAotCi0gICAgICAgICAgY2FzZSBlbmRDREFUQToKLSAgICAgICAgICAvLyBjaGFuZ2Ugc3RhdGUgaWYgd2UgZmluZCAiXV0+IgotCi0gICAgICAgICAgICBpZiAoKGN1cnJlbnRDaGFyID0gYnVmZmVyLnJlYWQoKSkgPT0gJ10nKSB7Ci0gICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB3ZSBtaWdodCBoYXZlICJdXV1dXV1dPiIKLSAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCkpID09ICddJykgYnVmZmVyLndyaXRlKCddJyk7Ci0KLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICc+JykgYnJlYWs7ICAvLyBlbmQgb2YgQ0RBVEEgc2VjdGlvbiwgY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLQotICAgICAgICAgICAgICBidWZmZXIud3JpdGUoJ10nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmZmVyLndyaXRlKCddJyk7Ci0gICAgICAgICAgICBidWZmZXIud3JpdGUoY3VycmVudENoYXIpOwotICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm90IGVuZCBvZiBDREFUQSBzZWN0aW9uLCBkb24ndCBjaGFuZ2Ugc3RhdGUKLQotICAgICAgICAgIGNhc2UgcHJvY2Vzc0NoYXJSZWY6Ci0gICAgICAgICAgLy8gcHJvY2VzcyBjaGFyYWN0ZXIgZW50aXR5Ci0KLSAgICAgICAgICAgIGludCBjcmVmU3RhdGUgPSAwOwotCi0gICAgICAgICAgICBjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgIGlmICgiI2FtcDsmcG9zOydxdW90O1wiZ3Q7Pmx0OzwiLmNoYXJBdChjcmVmU3RhdGUpID09IGN1cnJlbnRDaGFyKSB7Ci0gICAgICAgICAgICAgICAgY3JlZlN0YXRlKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoIiNhbXA7JnBvczsncXVvdDtcImd0Oz5sdDs8Ii5jaGFyQXQoY3JlZlN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZSBtYWluOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFkaXg7Ci0KLSAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gYnVmZmVyLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICd4JykgewotICAgICAgICAgICAgICAgICAgICByYWRpeCA9IDE2OwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByYWRpeCA9IDEwOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBpbnQgY2hhclJlZiA9IENoYXJhY3Rlci5kaWdpdCgoY2hhciljdXJyZW50Q2hhciwgcmFkaXgpOwotCi0gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRpZ2l0ID0gQ2hhcmFjdGVyLmRpZ2l0KChjaGFyKWN1cnJlbnRDaGFyLCByYWRpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0ID09IC0xKSBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjaGFyUmVmID0gKGNoYXIpKChjaGFyUmVmICogcmFkaXgpICsgZGlnaXQpOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gJzsnICYmIGNoYXJSZWYgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLndyaXRlKGNoYXJSZWYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBtYWluOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGJhZCBjaGFyIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IGJ1ZmZlci5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNyZWZTdGF0ZSA9ICgiXHUwMDAxXHUwMDBiXHUwMDA2XHUwMGZmXHUwMGZmXHUwMGZmXHUwMGZmXHUwMGZmXHUwMGZmXHUwMGZmXHUwMGZmIiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBhICAgICBtICAgICBwICAgICA7ICAgICAmICAgICBwICAgICBvICAgICBzICAgICA7ICAgICAnCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAgICA4ICAgICA5ICAgICBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMTFcdTAwZmZcdTAwZmZcdTAwZmZcdTAwZmZcdTAwZmZcdTAwMTVcdTAwZmZcdTAwZmZcdTAwZmYiICsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgICAgIHUgICAgIG8gICAgIHQgICAgIDsgICAgICIgICAgIGcgICAgIHQgICAgIDsgICAgID4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgICAgIGIgICAgIGQgICAgIGUgICAgIGYgICAgIDEwICAgIDExICAgIDEyICAgIDEzICAgIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwZmZcdTAwZmZcdTAwZmYiKS5jaGFyQXQoY3JlZlN0YXRlKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgICAgIHQgICAgIDsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgIDE2ICAgIDE3Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3JlZlN0YXRlID09IDI1NSkgYnJlYWs7ICAvLyBiYWQgY2hhciByZWZlcmVuY2UKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAvLyBkcm9wIHRocm91Z2ggdG8gcmVwb3J0IGVycm9yIGFuZCBleGl0Ci0KLSAgICAgICAgICBjYXNlIHBhcnNlRXJyb3I6Ci0gICAgICAgICAgLy8gcmVwb3J0IGZhdGFsIGVycm9yCi0KLSAgICAgICAgICAgIGZhdGFsRXJyb3Iob3BlcmFuZCwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbk51bWJlcik7Ci0gICAgICAgICAgICAvLyBkcm9wIHRocm91Z2ggdG8gZXhpdCBwYXJzZXIKLQotICAgICAgICAgIGNhc2UgZXhpdFBhcnNlcjoKLSAgICAgICAgICAvLyBleGl0IHBhcnNlcgotCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBjYXNlIHdyaXRlQ2RhdGE6Ci0gICAgICAgICAgLy8gd3JpdGUgY2hhcmFjdGVyIGRhdGEKLSAgICAgICAgICAvLyB0aGlzIHdpbGwgYWxzbyB3cml0ZSBhbnkgc2tpcHBlZCB3aGl0ZXNwYWNlCi0KLSAgICAgICAgICAgIGJ1ZmZlci53cml0ZShjdXJyZW50Q2hhcik7Ci0gICAgICAgICAgICBicmVhazsgIC8vIGNoYW5nZSBzdGF0ZSB0byBvcGVyYW5kCi0KLSAgICAgICAgICBjYXNlIGRpc2NhcmRBbmRDaGFuZ2U6Ci0gICAgICAgICAgLy8gdGhyb3cgc2F2ZWQgY2hhcmFjdGVycyBhd2F5IGFuZCBjaGFuZ2Ugc3RhdGUKLQotICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7Ci0gICAgICAgICAgICBicmVhazsgIC8vIGNoYW5nZSBzdGF0ZSB0byBvcGVyYW5kCi0KLSAgICAgICAgICBjYXNlIGRpc2NhcmRTYXZlQW5kQ2hhbmdlOgotICAgICAgICAgIC8vIHRocm93IHNhdmVkIGNoYXJhY3RlcnMgYXdheSwgc2F2ZSBjaGFyYWN0ZXIgYW5kIGNoYW5nZSBzdGF0ZQotCi0gICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKLSAgICAgICAgICAgIC8vIGRyb3AgdGhyb3VnaCB0byBzYXZlIGNoYXJhY3RlciBhbmQgY2hhbmdlIHN0YXRlCi0KLSAgICAgICAgICBjYXNlIHNhdmVBbmRDaGFuZ2U6Ci0gICAgICAgICAgLy8gc2F2ZSBjaGFyYWN0ZXIgYW5kIGNoYW5nZSBzdGF0ZQotCi0gICAgICAgICAgICBidWZmZXIuc2F2ZUNoYXIoKGNoYXIpY3VycmVudENoYXIpOwotICAgICAgICAgICAgYnJlYWs7ICAvLyBjaGFuZ2Ugc3RhdGUgdG8gb3BlcmFuZAotCi0gICAgICAgICAgY2FzZSBjaGFuZ2U6Ci0gICAgICAgICAgLy8gY2hhbmdlIHN0YXRlIHRvIG9wZXJhbmQKLQotICAgICAgICAgICAgYnJlYWs7ICAvLyBjaGFuZ2Ugc3RhdGUgdG8gb3BlcmFuZAotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGUgPSBvcGVyYW5kOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZmF0YWxFcnJvcihuZXcgU0FYUGFyc2VFeGNlcHRpb24oZS50b1N0cmluZygpLCBudWxsLCBudWxsLCB0aGlzLmxpbmVOdW1iZXIsIHRoaXMuY29sdW1uTnVtYmVyLCBlKSk7Ci0gICAgfQotICAgIGZpbmFsbHkgewotICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSB0aGlzOwotICAgICAgdGhpcy5kb2N1bWVudEhhbmRsZXIgPSB0aGlzLmV4dERvY3VtZW50SGFuZGxlciA9IHRoaXM7Ci0gICAgICB0aGlzLnRhZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBJbnB1dFNvdXJjZSBzb3VyY2UpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoc291cmNlLmdldENoYXJhY3RlclN0cmVhbSgpICE9IG51bGwpCi0gICAgICBwYXJzZShzb3VyY2UuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkpOwotICAgIGVsc2UgaWYgKHNvdXJjZS5nZXRCeXRlU3RyZWFtKCkgIT0gbnVsbCkKLSAgICAgIHBhcnNlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0Qnl0ZVN0cmVhbSgpKSk7Ci0gICAgZWxzZQotICAgICBwYXJzZShuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IFVSTChzb3VyY2UuZ2V0U3lzdGVtSWQoKSkub3BlblN0cmVhbSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICBwYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsZShmaW5hbCBMb2NhbGUgbG9jYWxlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihmaW5hbCBFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotICAgIC8vIG5vdCBzdXBwb3J0ZWQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERUREhhbmRsZXIoZmluYWwgRFRESGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgLy8gbm90IHN1cHBvcnRlZAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRIYW5kbGVyKGZpbmFsIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0gICB0aGlzLmRvY3VtZW50SGFuZGxlciA9IChoYW5kbGVyID09IG51bGwpID8gdGhpcyA6IGhhbmRsZXI7Ci0gICB0aGlzLmV4dERvY3VtZW50SGFuZGxlciA9IHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEhhbmRsZXIoZmluYWwgRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLSAgIHRoaXMuZG9jdW1lbnRIYW5kbGVyID0gdGhpcy5leHREb2N1bWVudEhhbmRsZXIgPSAoaGFuZGxlciA9PSBudWxsKSA/IHRoaXMgOiBoYW5kbGVyOwotICAgdGhpcy5kb2N1bWVudEhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKGZpbmFsIEVycm9ySGFuZGxlciBoYW5kbGVyKSB7Ci0gICB0aGlzLmVycm9ySGFuZGxlciA9IChoYW5kbGVyID09IG51bGwpID8gdGhpcyA6IGhhbmRsZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoZmluYWwgTG9jYXRvciBsb2NhdG9yKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gIH0KLQotICBwdWJsaWMgV3JpdGVyIHN0YXJ0RG9jdW1lbnQoZmluYWwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgdGhpcy5kb2N1bWVudEhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotICAgIHJldHVybiB3cml0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotICB9Ci0KLSAgcHVibGljIFdyaXRlciBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEF0dHJpYnV0ZUxpc3QgYXR0cmlidXRlcywgZmluYWwgV3JpdGVyIHdyaXRlcikKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5kb2N1bWVudEhhbmRsZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotICAgIHJldHVybiB3cml0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoZmluYWwgY2hhciBjaFtdLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotICB9Ci0KLSAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShmaW5hbCBjaGFyIGNoW10sIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZmluYWwgU3RyaW5nIHRhcmdldCwgZmluYWwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2FybmluZyhmaW5hbCBTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVycm9yKGZpbmFsIFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICB9Ci0KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihmaW5hbCBTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICB0aHJvdyBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyICgpIHsKLSAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIgKCkgewotICAgIHJldHVybiB0aGlzLmNvbHVtbk51bWJlcjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmYXRhbEVycm9yKGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIGludCBsaW5lTnVtYmVyLCBmaW5hbCBpbnQgY29sdW1uTnVtYmVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgCWZpbmFsIFNBWFBhcnNlRXhjZXB0aW9uIGUgPSBuZXcgU0FYUGFyc2VFeGNlcHRpb24obXNnLCBudWxsLCBudWxsLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpOwotICAJCi0gICAgdGhpcy5lcnJvckhhbmRsZXIuZmF0YWxFcnJvcihlKTsKLSAgICAKLSAgICB0aHJvdyBlOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBNaW5NTEJ1ZmZlciBleHRlbmRzIFdyaXRlciB7Ci0gICAgcHVibGljIE1pbk1MQnVmZmVyKGZpbmFsIFJlYWRlciBpbikgewotICAgICAgdGhpcy5pbiA9IGluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgX2ZsdXNoKCk7Ci0gICAgICAgIGlmICh0aGlzLndyaXRlciAhPSB0aGlzKSB0aGlzLndyaXRlci5mbHVzaCgpOwotICAgICAgfQotICAgICAgZmluYWxseSB7Ci0gICAgICAgIHRoaXMuZmx1c2hlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLndyaXR0ZW4gPSB0cnVlOwotICAgICAgdGhpcy5jaGFyc1t0aGlzLmNvdW50KytdID0gKGNoYXIpYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBjaGFyW10gY2J1ZiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMud3JpdHRlbiA9IHRydWU7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGNidWYsIG9mZiwgdGhpcy5jaGFycywgdGhpcy5jb3VudCwgbGVuKTsKLSAgICAgIHRoaXMuY291bnQgKz0gbGVuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVDaGFyKGZpbmFsIGNoYXIgYykgewotICAgICAgdGhpcy53cml0dGVuID0gZmFsc2U7Ci0gICAgICB0aGlzLmNoYXJzW3RoaXMuY291bnQrK10gPSBjOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1c2hXcml0ZXIoZmluYWwgV3JpdGVyIHdyaXRlcikgewotICAgICAgTWluTUwudGhpcy50YWdzLnB1c2godGhpcy53cml0ZXIpOwotCi0gICAgICB0aGlzLndyaXRlciA9ICh3cml0ZXIgPT0gbnVsbCkgPyB0aGlzIDogd3JpdGVyOwotCi0gICAgICB0aGlzLmZsdXNoZWQgPSB0aGlzLndyaXR0ZW4gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV3JpdGVyIGdldFdyaXRlcigpIHsKLSAgICAgIHJldHVybiB0aGlzLndyaXRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3BXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKCF0aGlzLmZsdXNoZWQgJiYgdGhpcy53cml0ZXIgIT0gdGhpcykgdGhpcy53cml0ZXIuZmx1c2goKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkgewotICAgICAgICB0aGlzLndyaXRlciA9IChXcml0ZXIpTWluTUwudGhpcy50YWdzLnBvcCgpOwotICAgICAgICB0aGlzLmZsdXNoZWQgPSB0aGlzLndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLSAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyh0aGlzLmNoYXJzLCAwLCB0aGlzLmNvdW50KTsKLQotICAgICAgdGhpcy5jb3VudCA9IDA7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgdGhpcy5jb3VudCA9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh0aGlzLm5leHRJbiA9PSB0aGlzLmxhc3RJbikgewotICAgICAgICBpZiAodGhpcy5jb3VudCAhPSAwKSB7Ci0gICAgICAgICAgaWYgKHRoaXMud3JpdHRlbikgewotICAgICAgICAgICAgX2ZsdXNoKCk7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvdW50ID49ICh0aGlzLmNoYXJzLmxlbmd0aCAtIE1pbk1MLnRoaXMuYnVmZmVySW5jcmVtZW50KSkgewotICAgICAgICAgIGZpbmFsIGNoYXJbXSBuZXdDaGFycyA9IG5ldyBjaGFyW3RoaXMuY2hhcnMubGVuZ3RoICsgTWluTUwudGhpcy5idWZmZXJJbmNyZW1lbnRdOwotCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hhcnMsIDAsIG5ld0NoYXJzLCAwLCB0aGlzLmNvdW50KTsKLSAgICAgICAgICAgIHRoaXMuY2hhcnMgPSBuZXdDaGFyczsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgbnVtUmVhZCA9IHRoaXMuaW4ucmVhZCh0aGlzLmNoYXJzLCB0aGlzLmNvdW50LCB0aGlzLmNoYXJzLmxlbmd0aCAtIHRoaXMuY291bnQpOwotCi0gICAgICAgIGlmIChudW1SZWFkID09IC0xKSByZXR1cm4gLTE7Ci0KLSAgICAgICAgdGhpcy5uZXh0SW4gPSB0aGlzLmNvdW50OwotICAgICAgICB0aGlzLmxhc3RJbiA9IHRoaXMuY291bnQgKyBudW1SZWFkOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGhpcy5jaGFyc1t0aGlzLm5leHRJbisrXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgX2ZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh0aGlzLmNvdW50ICE9IDApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAodGhpcy53cml0ZXIgPT0gdGhpcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgTWluTUwudGhpcy5kb2N1bWVudEhhbmRsZXIuY2hhcmFjdGVycyh0aGlzLmNoYXJzLCAwLCB0aGlzLmNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChmaW5hbCBTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUodGhpcy5jaGFycywgMCwgdGhpcy5jb3VudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgIHRoaXMuY291bnQgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEluID0gMCwgbGFzdEluID0gMDsKLSAgICBwcml2YXRlIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW01pbk1MLnRoaXMuaW5pdGlhbEJ1ZmZlclNpemVdOwotICAgIHByaXZhdGUgZmluYWwgUmVhZGVyIGluOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKLSAgICBwcml2YXRlIFdyaXRlciB3cml0ZXIgPSB0aGlzOwotICAgIHByaXZhdGUgYm9vbGVhbiBmbHVzaGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXR0ZW4gPSBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgRG9jdW1lbnRIYW5kbGVyIGV4dERvY3VtZW50SGFuZGxlciA9IHRoaXM7Ci0gIHByaXZhdGUgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyIGRvY3VtZW50SGFuZGxlciA9IHRoaXM7Ci0gIHByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IHRoaXM7Ci0gIHByaXZhdGUgZmluYWwgU3RhY2sgdGFncyA9IG5ldyBTdGFjaygpOwotICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gMTsKLSAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gMDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbEJ1ZmZlclNpemU7Ci0gIHByaXZhdGUgZmluYWwgaW50IGJ1ZmZlckluY3JlbWVudDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gY2hhckNsYXNzZXMgPSB7Ci0gIC8vICBFT0YKLSAgICAgIDEzLAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHQgIFxuICAgICAgICAgIFxyCi0gICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMiwgMTIsIC0xLCAtMSwgMTIsIC0xLCAtMSwKLSAgLy8KLSAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAvLyAgU1AgICAhICAgIiAgICMgICAkICAgJSAgICYgICAnICAgKCAgICkgICAqICAgKyAgICwgICAtICAgLiAgIC8KLSAgICAgIDEyLCAgOCwgIDcsIDE0LCAxNCwgMTQsICAzLCAgNiwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMSwgMTQsICAyLAotICAvLyAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICA6ICAgOyAgIDwgICA9ICAgPiAgID8KLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsICAwLCAgNSwgIDEsICA0LAotICAvLwotICAgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICAgXCAgIF0KLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgIDksIDE0LCAxMAotICB9OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG9wZXJhbmRzID0gewotICAgICJcdTBjMTNcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTE1MGZcdTAwMTNcdTAwMGVcdTE1MGYiLAotICAgICJcdTE2MGZcdTBmMDBcdTBiMDBcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTAxMTJcdTAyMDBcdTE3MGZcdTAxMTIiLAotICAgICJcdTE2MGZcdTBmMDFcdTBiMDFcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTAyMTNcdTE3MGZcdTA0MTIiLAotICAgICJcdTE2MGZcdTBmMDFcdTBiMDFcdTE2MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTAzMTNcdTE3MGZcdTA0MTIiLAotICAgICJcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTA2MDRcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTA0MTJcdTA1MTNcdTE3MGZcdTA0MTIiLAotICAgICJcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTA2MDRcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTE4MGZcdTA1MTNcdTE3MGZcdTE4MGYiLAotICAgICJcdTE5MGZcdTE5MGZcdTE5MGZcdTE5MGZcdTE5MGZcdTE5MGZcdTA3MTNcdTA4MTNcdTE5MGZcdTE5MGZcdTE5MGZcdTE5MGZcdTA2MTNcdTE3MGZcdTE5MGYiLAotICAgICJcdTA3MTJcdTA3MTJcdTA3MTJcdTFhMGNcdTA3MTJcdTA3MTJcdTAzMDVcdTA3MTJcdTA3MTJcdTA3MTJcdTA3MTJcdTA3MTJcdTA3MTJcdTE3MGZcdTA3MTIiLAotICAgICJcdTA4MTJcdTA4MTJcdTA4MTJcdTFhMGNcdTA4MTJcdTA4MTJcdTA4MTJcdTAzMDVcdTA4MTJcdTA4MTJcdTA4MTJcdTA4MTJcdTA4MTJcdTE3MGZcdTA4MTIiLAotICAgICJcdTE2MGZcdTAwMDJcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTA5MTJcdTA5MTNcdTE3MGZcdTA5MTIiLAotICAgICJcdTFiMGZcdTFiMGZcdTA5MDNcdTFiMGZcdTFiMGZcdTFiMGZcdTFiMGZcdTFiMGZcdTExMTNcdTFiMGZcdTFiMGZcdTFiMGZcdTFiMGZcdTE3MGZcdTFiMGYiLAotICAgICJcdTE2MGZcdTAwMTNcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE3MGZcdTE2MGYiLAotICAgICJcdTE2MGZcdTFjMGZcdTA5MTNcdTE2MGZcdTBkMTNcdTE2MGZcdTE2MGZcdTE2MGZcdTExMTNcdTE2MGZcdTE2MGZcdTE2MGZcdTE2MGZcdTE3MGZcdTAxMTEiLAotICAgICJcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBlMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTE3MGZcdTBkMTMiLAotICAgICJcdTBkMTNcdTAwMTNcdTBkMTNcdTBkMTNcdTBlMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTBkMTNcdTE3MGZcdTBkMTMiLAotICAgICJcdTBjMTBcdTEwMGRcdTEwMGRcdTFhMGNcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTBmMTJcdTE3MGZcdTEwMGQiLAotICAgICJcdTBhMTNcdTEwMGRcdTEwMGRcdTFhMGNcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTEwMGRcdTE3MGZcdTEwMGQiLAotICAgICJcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTFkMGZcdTEyMGFcdTFkMGZcdTEzMDZcdTFkMGZcdTE3MGZcdTE0MTMiLAotICAgICJcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEyMGRcdTEwMGJcdTEyMGRcdTEyMGRcdTE3MGZcdTEyMGQiLAotICAgICJcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTEzMTNcdTAwMDdcdTEzMTNcdTE3MGZcdTEzMTMiLAotICAgICJcdTE0MDhcdTAwMDlcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE0MTNcdTE3MGZcdTE0MTMiLAotICAgICJleHBlY3RlZCBFbGVtZW50IiwKLSAgICAidW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gdGFnIiwKLSAgICAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBmb3VuZCIsCi0gICAgImF0dHJpYnV0ZSBuYW1lIG5vdCBmb2xsb3dlZCBieSAnPSciLAotICAgICJpbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSIsCi0gICAgImludmFsaWQgQ2hhcmFjdGVyIEVudGl0eSIsCi0gICAgImV4cGVjdGluZyBlbmQgdGFnIiwKLSAgICAiZW1wdHkgdGFnIiwKLSAgICAidW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgPCEiCi0gIH07Ci19CmRpZmYgLS1naXQgYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvb3JnL3htbC9zYXgvRG9jdW1lbnRIYW5kbGVyLmphdmEgYi9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvb3JnL3htbC9zYXgvRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwM2Y1ZmUuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3NyYy9tYWluL3VrL29yZy94bWwvc2F4L0RvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAwIEpvaG4gRy4gV2lsc29uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2UgdWsub3JnLnhtbC5zYXg7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50SGFuZGxlciBleHRlbmRzIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciB7Ci0gIFdyaXRlciBzdGFydERvY3VtZW50KGZpbmFsIFdyaXRlciB3cml0ZXIpIHRocm93cyBTQVhFeGNlcHRpb247Ci0gIFdyaXRlciBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEF0dHJpYnV0ZUxpc3QgYXR0cmlidXRlcywgZmluYWwgV3JpdGVyIHdyaXRlcikKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9vcmcveG1sL3NheC9QYXJzZXIuamF2YSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvbWFpbi91ay9vcmcveG1sL3NheC9QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzYjRlOC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL21haW4vdWsvb3JnL3htbC9zYXgvUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAgSm9obiBHLiBXaWxzb24KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2UgdWsub3JnLnhtbC5zYXg7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGFyc2VyIGV4dGVuZHMgb3JnLnhtbC5zYXguUGFyc2VyIHsKLSAgdm9pZCBzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvdGVzdC9ncm9vdnkvbmV0L3htbHJwYy9Hcm9vdnlYbWxycGNUZXN0Lmdyb292eSBiL2dyb292eS9tb2R1bGVzL3htbHJwYy9zcmMvdGVzdC9ncm9vdnkvbmV0L3htbHJwYy9Hcm9vdnlYbWxycGNUZXN0Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2ZTA3ZC4uMDAwMDAwMAotLS0gYS9ncm9vdnkvbW9kdWxlcy94bWxycGMvc3JjL3Rlc3QvZ3Jvb3Z5L25ldC94bWxycGMvR3Jvb3Z5WG1scnBjVGVzdC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IChDKSBKb2huIFdpbHNvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLSAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluCi0gKiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weQotICogb2YgdGhpcyBkb2N1bWVudC4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIDMuCi0gKiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiBGb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuIDQuIFByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbgotICogdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhCi0gKiByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZQotICogQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKiAgCi0gKi8KLQotcGFja2FnZSBncm9vdnkubmV0LnhtbHJwYwotCi1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXIKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbAotCi1pbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2UKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBzdHJ1Y3R1cmVkIEF0dHJpYnV0ZSB0eXBlCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnR1Z0B3aWxzb24uY28udWsiPkpvaG4gV2lsc29uL2E+Ci0KLSAqLwotcHVibGljIGNsYXNzIEdyb292eVhtbHJwY1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG1scnBjQ2FsbHMoKSB7Ci0gICAgLy8KLSAgICAvLyBjcmVhdGUgYSBuZXcgWE1MLVJQQyBzZXJ2ZXIKLSAgICAvLwotICAgIGRlZiBzZXJ2ZXIgPSBuZXcgWE1MUlBDU2VydmVyKDIsIDEwLCA4LCAxMDAwLCAxMDAwKQotICAgIAotICAgIC8vCi0gICAgLy8gYWRkIG1ldGhvZHMgdGhhdCBjYW4gYmUgY2FsbGVkIHJlbW90ZWx5Ci0gICAgLy8KLSAgICAKLSAgICBzZXJ2ZXIudmFsaWRhdG9yMS5hcnJheU9mU3RydWN0c1Rlc3QgPSB7c3RydWN0cyAtPiAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBjb3VudCA9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzdHJ1Y3QgaW4gc3RydWN0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gc3RydWN0WydjdXJseSddCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICBzZXJ2ZXIudmFsaWRhdG9yMS5jb3VudFRoZUVudGl0aWVzID0ge3RleHQgLT4gZm9vKHRleHQpIH0KLSAgICAKLSAgICBzZXJ2ZXIudmFsaWRhdG9yMS5lYXN5U3RydWN0VGVzdCA9IHtzdHJ1Y3QgLT4gcmV0dXJuIHN0cnVjdFsnbGFycnknXSArIHN0cnVjdFsnbW9lJ10gKyBzdHJ1Y3RbJ2N1cmx5J10gfQotICAgIAotICAgIHNlcnZlci52YWxpZGF0b3IxLmVjaG9TdHJ1Y3RUZXN0ID0ge3N0cnVjdCAtPiByZXR1cm4gc3RydWN0IH0gIAotICAgIAotICAgIHNlcnZlci52YWxpZGF0b3IxLm1hbnlUeXBlc1Rlc3QgPSB7cDEsIHAyLCBwMywgcDQsIHA1LCBwNiAtPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3AxLCBwMiwgcDMsIHA0LCBwNSwgcDZdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAKLSAgICBzZXJ2ZXIudmFsaWRhdG9yMS5tb2RlcmF0ZVNpemVBcnJheUNoZWNrID0ge2FycmF5IC0+IHJldHVybiBhcnJheVswXSArIGFycmF5W2FycmF5LnNpemUoKSAtIDFdIH0gCi0gICAgCi0gICAgc2VydmVyLnZhbGlkYXRvcjEubmVzdGVkU3RydWN0VGVzdCA9IHtzdHJ1Y3QgLT4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZGF5ID0gc3RydWN0WycyMDAwJ11bJzA0J11bJzAxJ10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheVsnbGFycnknXSArIGRheVsnbW9lJ10gKyBkYXlbJ2N1cmx5J10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgIHNlcnZlci52YWxpZGF0b3IxLnNpbXBsZVN0cnVjdFJldHVyblRlc3QgPSB7bnVtYmVyIC0+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsndGltZXMxMCcgOiBudW1iZXIgKiAxMCwgJ3RpbWVzMTAwJyA6IG51bWJlciAqIDEwMCwgJ3RpbWVzMTAwMCcgOiBudW1iZXIgKiAxMDAwXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHNlcnZlci5lY2hvID0ge3JldHVybiBpdH0KLSAgICAKLSAgICAvLwotICAgIC8vIHN3aXRjaCB0aGUgc2VydmVyIG9uCi0gICAgLy8KLSAgICBkZWYgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwKQotICAgIHNlcnZlci5zdGFydFNlcnZlcihzZXJ2ZXJTb2NrZXQpCi0KLSAgICB0cnkgewotICAgIAotICAgICAgLy8KLSAgICAgIC8vIGNyZWF0ZSBhIHByb3h5IG9mIHRoZSBzZXJ2ZXIgdG8gaGFuZGxlIGNhbGxzCi0gICAgICAvLwotICAgICAgZGVmIHNlcnZlclByb3h5ID0gbmV3IFhNTFJQQ1NlcnZlclByb3h5KCJodHRwOi8vMTI3LjAuMC4xOiR7c2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpfSIpCi0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LnZhbGlkYXRvcjEuYXJyYXlPZlN0cnVjdHNUZXN0KFtbJ2N1cmx5JzogOV0sIFsnY3VybHknIDogM11dKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsaWRhdG9yMS5hcnJheU9mU3RydWN0c1Rlc3QiLCByZXN1bHQsIDEyKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS52YWxpZGF0b3IxLmNvdW50VGhlRW50aXRpZXMoJzwuXCciICBsJm9pID48Pjw+PD4iIiInKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkudmFsaWRhdG9yMS5jb3VudFRoZUVudGl0aWVzIiwgcmVzdWx0WydjdExlZnRBbmdsZUJyYWNrZXRzJ10sIDQpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkudmFsaWRhdG9yMS5jb3VudFRoZUVudGl0aWVzIiwgcmVzdWx0WydjdFJpZ2h0QW5nbGVCcmFja2V0cyddLCA0KQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEuY291bnRUaGVFbnRpdGllcyIsIHJlc3VsdFsnY3RBcG9zdHJvcGhlcyddLCAxKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEuY291bnRUaGVFbnRpdGllcyIsIHJlc3VsdFsnY3RBbXBlcnNhbmRzJ10sIDEpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkudmFsaWRhdG9yMS5jb3VudFRoZUVudGl0aWVzIiwgcmVzdWx0WydjdFF1b3RlcyddLCA0KQotICAgICAgfQotICAgICAgCi0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LnZhbGlkYXRvcjEubWFueVR5cGVzVGVzdCgnYScsIDEuMjUsICdjJywgdHJ1ZSwgMiwgMykge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEubWFueVR5cGVzVGVzdCIsIHJlc3VsdFswXSwgJ2EnKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEubWFueVR5cGVzVGVzdCIsIHJlc3VsdFsxXSwgMS4yNSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS52YWxpZGF0b3IxLm1hbnlUeXBlc1Rlc3QiLCByZXN1bHRbMl0sICdjJykKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS52YWxpZGF0b3IxLm1hbnlUeXBlc1Rlc3QiLCByZXN1bHRbM10sIHRydWUpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkudmFsaWRhdG9yMS5tYW55VHlwZXNUZXN0IiwgcmVzdWx0WzRdLCAyKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEubWFueVR5cGVzVGVzdCIsIHJlc3VsdFs1XSwgMykKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkudmFsaWRhdG9yMS5tb2RlcmF0ZVNpemVBcnJheUNoZWNrKFsnYScsICdiJywgJ2MnXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LnZhbGlkYXRvcjEubW9kZXJhdGVTaXplQXJyYXlDaGVjayIsIHJlc3VsdCwgJ2FjJykKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbImhlbGxvIiwgIndvcmxkIl0pIHtyZXN1bHQgLT4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAiaGVsbG8iKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMV0sICJ3b3JsZCIpCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWyJoZWxsbyIsICJ3b3JsZCJdIGFzIFN0cmluZ1tdKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFswXSwgImhlbGxvIikKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAid29ybGQiKQotICAgICAgfQotCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsnYScsICdiJ10gYXMgY2hhcltdKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFswXSwgOTcpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgOTgpCi0gICAgICB9Ci0KLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWydhJywgJ2InXSBhcyBDaGFyYWN0ZXJbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDk3KQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMV0sIDk4KQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsxLCAyXSBhcyBJbnRlZ2VyW10pIHtyZXN1bHQgLT4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAxKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMV0sIDIpCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWzEsIDJdIGFzIGludFtdKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFswXSwgMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAyKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsxLCAyXSBhcyBMb25nW10pIHtyZXN1bHQgLT4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAxKQotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMV0sIDIpCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWzEsIDJdIGFzIGxvbmdbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMikKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbMSwgMl0gYXMgU2hvcnRbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMikKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbMSwgMl0gYXMgc2hvcnRbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMikKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbMSwgMl0gYXMgQnl0ZVtdKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFswXSwgMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAyKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsxLCAyXSBhcyBieXRlW10pIHtyZXN1bHQgLT4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgYW5kIGdldHMgdHJhbnNtaXR0ZWQgYXMgQmFzZTY0IGVuY29kZWQKLSAgICAgICAgLy8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAxIGFzIGJ5dGUpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMiBhcyBieXRlKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsxRywgMkddIGFzIEJpZ0ludGVnZXJbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMikKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbMS4wLCAyLjBdIGFzIEZsb2F0W10pIHtyZXN1bHQgLT4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAxLjApCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMi4wKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFsxLjAsIDIuMF0gYXMgZmxvYXRbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEuMCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAyLjApCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWzEuMCwgMi4wXSBhcyBkb3VibGVbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEuMCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAyLjApCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWzEuMCwgMi4wXSBhcyBEb3VibGVbXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIDEuMCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCAyLjApCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZlclByb3h5LmVjaG8oWzEuMCwgMi4wXSBhcyBCaWdEZWNpbWFsW10pIHtyZXN1bHQgLT4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzBdLCAxLjApCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgMi4wKQotICAgICAgfQotICAgICAgCi0gICAgICBzZXJ2ZXJQcm94eS5lY2hvKFt0cnVlLCBmYWxzZV0gYXMgQm9vbGVhbltdKSB7cmVzdWx0IC0+Ci0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFswXSwgdHJ1ZSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJ2ZXJQcm94eS5lY2hvIiwgcmVzdWx0WzFdLCBmYWxzZSkKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2VydmVyUHJveHkuZWNobyhbdHJ1ZSwgZmFsc2VdIGFzIGJvb2xlYW5bXSkge3Jlc3VsdCAtPgotICAgICAgICBhc3NlcnRFcXVhbHMoInNlcnZlclByb3h5LmVjaG8iLCByZXN1bHRbMF0sIHRydWUpCi0gICAgICAgIGFzc2VydEVxdWFscygic2VydmVyUHJveHkuZWNobyIsIHJlc3VsdFsxXSwgZmFsc2UpCi0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkgewotICAgICAgLy8KLSAgICAgIC8vIHN3aXRjaCB0aGUgc2VydmVyIG9mZgotICAgICAgLy8KLSAgICAgIHNlcnZlci5zdG9wU2VydmVyKCkKLSAgICB9Ci0gIH0KLSAgCi0gIGRlZiBmb28odGV4dCkgewotICAgIGRlZiBjdExlZnRBbmdsZUJyYWNrZXRzID0gMAotICAgIGRlZiBjdFJpZ2h0QW5nbGVCcmFja2V0cyA9IDAKLSAgICBkZWYgY3RBbXBlcnNhbmRzID0gMAotICAgIGRlZiBjdEFwb3N0cm9waGVzID0gMAotICAgIGRlZiBjdFF1b3RlcyA9IDAKLSAgICAgCi0gICAgZm9yIChjIGluIHRleHQpIHsKLSAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNlICc8JyA6Ci0gICAgICAgICAgY3RMZWZ0QW5nbGVCcmFja2V0cysrCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgJz4nIDoKLSAgICAgICAgICBjdFJpZ2h0QW5nbGVCcmFja2V0cysrCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgJyYnIDoKLSAgICAgICAgICBjdEFtcGVyc2FuZHMrKwotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAotICAgICAgICBjYXNlICdcJycgOgotICAgICAgICAgIGN0QXBvc3Ryb3BoZXMrKwotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAotICAgICAgICBjYXNlICciJyA6Ci0gICAgICAgICAgY3RRdW90ZXMrKwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gWydjdExlZnRBbmdsZUJyYWNrZXRzJyA6IGN0TGVmdEFuZ2xlQnJhY2tldHMsCi0gICAgICAgICAgICAnY3RSaWdodEFuZ2xlQnJhY2tldHMnIDogY3RSaWdodEFuZ2xlQnJhY2tldHMsCi0gICAgICAgICAgICAnY3RBbXBlcnNhbmRzJyA6IGN0QW1wZXJzYW5kcywKLSAgICAgICAgICAgICdjdEFwb3N0cm9waGVzJyA6IGN0QXBvc3Ryb3BoZXMsCi0gICAgICAgICAgICAnY3RRdW90ZXMnIDogY3RRdW90ZXNdCi0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2dyb292eS9tb2R1bGVzL3htbHJwYy94ZG9jcy9pbmRleC53aWtpIGIvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3hkb2NzL2luZGV4Lndpa2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZ3Jvb3Z5L21vZHVsZXMveG1scnBjL3hkb2NzL2luZGV4Lndpa2kKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0K